
; Program:	SECGUIDEFRONT.XIM - CODED BY CøRTEX/TRSI
; Reassembled:	(C)1996 ADKINS/RASCALS, ALL RIGHTS RESERVED.

; Note:	Diese Door wurde ausschliesslich fuer Lehrzwecke im Umgang mit
;	der AEDoor.library reassembliert und dokumentiert.

;	Der Code ist nicht anspruchsvoll und fuer Einsteiger durch
;	optimale Kommentare sehr geeignet.

;	Um zusaetzliche Informationen ueber diese Door zu bekommem,
;	empfiehlt es sich, die beiliegenden Doc's zu lesen.

;	Da die Door keinen WBStartUpCode enthaelt, kann diese
;	eben nur unter OS2.0+ von der Workbench gestartet werden.

;	Bug diesbezueglich entfernt.

;	Adkins/Rascals

		INCDIR	"Dh0:Includes/"
		INCLUDE	"AmiExpress/Amix.i"
		INCLUDE	"Exec/Macros.i"
		INCLUDE	"Dos/Dos.i"
		INCLUDE	"LVO.i"

AbsExecBase	EQU	4

		SECTION "  0",CODE_C		; Definition

Start		Move.l	(AbsExecBase).w,a6	; ExecBase nach a6

		MoveQ	#2,d0			; LibVersion nach d0
		Lea	DosName(pc),a1		; DosLibNameAdr nach a1
		JSRLIB	OpenLibrary		; OpenLibrary anspringen
		Lea	DosBase(pc),a0		; DosBaseAdr nach a0
		Move.l	d0,(a0)			; Resultat sichern

;		Die folgende Fehlerabfrage hat der Autor nicht
;		Fuer notwendig gehalten, muss aber sein(!)

		Beq.w	Exit			; Wenn Fehler, zu Exit

		MoveQ	#2,d0			; LibVersion nach d0
		Lea	AEDoorName(pc),a1	; AEDoorLibNameAdr nach a1
		JSRLIB	OpenLibrary		; OpenLibrary anspringen
		Lea	AEDoorBase(pc),a0	; AEDoorBaseAdr nach a0
		Move.l	d0,(a0)			; Resultat sichern
		Beq.w	CloseDosLib		; Wenn Fehler, zu CloseDosLib

		Move.l	#FileName.txt,d1	; FileNameAdr nach d1
		Move.l	#MODE_OLDFILE,d2	; OeffnungsModus nach d2
		Move.l	DosBase(pc),a6		; DosBase nach a6
		JSRLIB	Open			; Open anspringen

		Move.l	d0,FileHandle		; DateiHandle sichern

		Tst.l	d0			; Testen ob Erfolgreich
		Beq.w	CloseAEDoorLib		; Wenn nicht, zu CloseAEDoorLib

		Move.l	d0,d1			; DateiHandle nach d1
		Move.l	#FileBuffer,d2		; FileBufferAdr nach d2
		Move.l	#512,d3			; LeseLaenge nach d3
		JSRLIB	Read			; Read anspringen

		Move.l	FileHandle(pc),d1	; DateiHandle nach d1
		JSRLIB	Close			; Close anspringen

		Lea	FileBuffer,a0		; FileBufferAdr nach a0
		Lea	ConfSecLevel(pc),a1	; ConfSecLevelAdr nach a1

;		An diesem Verfahren sollte man sich lieber kein
;		Beispiel nehmen(!)

Search		Cmp.b	#"#",(a0)+		; Erkennung (#) suchen
		Bne.s	Search			; Nicht gefunden, zu Search

;		Sollte im ganzen ConfigFile kein "#" zu finden sein,
;		So wird auch der gesamte, nachfolgende SpeicherBereich
;		Nach diesem Zeichen durchsucht.

		AddQ.w	#1,a0			; Adresse um 1 Word erhoehen

;		Sollte es dann an einer ungeraden Adresse gefunden worden
;		Sein, so stuerzt der Amiga an dieser Stelle ab. GURU(!)

		Move.l	(a0)+,(a1)		; Level nach ConfSecLevel
		Move.l	(a0)+,4(a1)		; Level nach AmixSecLevel

		Move.l	AEDoorBase(pc),a6	; AEDoorBase nach a6
		JSRLIB	AECreateComm		; AECreateComm anspringen
		Lea	AEPortBase(pc),a0	; AEPortBaseAdr nach a0
		Move.l	d0,(a0)			; Resultat sichern

		ClearA	a0			; Kein String
		Move.l	AEPortBase(pc),a1	; AEPortBase nach a1
		MoveQ	#DT_ACCESSLEVEL,d0	; AmixData nach d0
		JSRLIB	AEGetDT			; AEGetDT anspringen

		Move.l	AEPortBase(pc),a1	; AEPortBase nach a1
		Lea	CopyStrBuffer(pc),a0	; CopyStrBufferAdr nach a0
		JSRLIB	AECopyStr		; AECopyStr anspringen

		Lea	CopyStrBuffer(pc),a0	; CopyStrBufferAdr nach a0
		Move.b	#10,3(a0)		; ReturnCode setzen
		Move.l	(a0),a0			; LevelNummer nach a0

		Lea	ConfSecLevel(pc),a1	; ConfSecLevelAdr nach a1
		Move.l	(a1),a1			; SecLevelNummer nach a1

;		Auch hier ist keine besonders gute Moeglichkeit
;		Gefunden worden, 2 Werte miteinander zu vergleichen.

		Cmp.l	a0,a1			; Mit AmixLevel vergleichen
		Ble.s	SetLevelDown		; Kleiner o. Gleich, SetLevelDown

;		Durch ein "Bgt.s CloseAll" haette man den folgenden
;		Branch nicht gebraucht(!)

		Bra.s	CloseAll		; Door beenden (schliessen)

SetLevelDown	Lea	MainText.txt(pc),a0	; TextStringAdr nach a0
		MoveQ	#WSF_LF,d1		; LineFeed FLAG nach d1
		Move.l	AEPortBase(pc),a1	; AEPortBase nach a1
		JSRLIB	AEWriteStr		; AEWriteStr anspringen

		Lea	AmixSecLevel(pc),a0	; TextStringAdr nach a0
		Move.l	AEPortBase(pc),a1	; AEPortBase nach a1
		MoveQ	#DT_ACCESSLEVEL,d0	; AmixData nach d0
		JSRLIB	AESetDT			; AESetDT anspringen

CloseAll	Move.l	AEPortBase(pc),a1	; AEPortBase nach a1
		JSRLIB	AEDeleteComm		; AEDeleteComm anspringen

CloseAEDoorLib	Move.l	a6,a1			; AEDoorBase nach a1
		Move.l	(AbsExecBase).w,a6	; ExecBase nach a6
		JSRLIB	CloseLibrary		; CloseLibrary anspringen

CloseDosLib	Move.l	DosBase(pc),a1		; DosBase nach a1
		Move.l	(AbsExecBase).w,a6	; ExecBase nach a6
		JSRLIB	CloseLibrary		; CloseLibrary anspringen

Exit		MoveQ	#RETURN_OK,d0		; ReturnCode nach d0
		Rts				; Zurrueck zu AmiExpress

AEDoorName	Dc.b	"AEDoor.library",0
DosName		Dc.b	"dos.library",0
		Even

DosBase		Dc.l	0
FileHandle	Dc.l	0
AEDoorBase	Dc.l	0
AEPortBase	Dc.l	0

FileName.txt	Dc.b	"DOORS:SecurityGuide/SecurityGuide.cfg",0
ConfSecLevel	Dc.b	"   ",0
AmixSecLevel	Dc.b	"   ",0

CopyStrBuffer	Blk.b	30,10		; 30 * ReturnCode's

MainText.txt	Dc.b	10,13,27,"[0m",27,"[1m",27,"[36m Security Guide "
		Dc.b	27,"[0m",27,"[36mv0.1 ",27,"[33mby CøRteX/tRS¿! "
		Dc.b	27,"[31m(not registered)",10,0,"]"

		SECTION "  1",BSS_C		; Definition

FileBuffer	Ds.b	512

		END
