	opt	d+,o+
; Konfiguration-Wahl-Programm
; Version 1.4
; written by Schnuckel 9,'89
; new Version in 11,'89
; ---------------------------

	incdir	"RAD:include/"
	include	"exec/exec_lib.i"
	include	"intuition/intuition.i"
	include	"intuition/intuition_lib.i"
	include	"libraries/dos_lib.i"

START
	movem.l	d0-d7/a0-a6,-(a7)
	subq.l	#2,d0
	ble	FULLEND			;wenn keine Kommandos, schon beenden
	lea	commands,a2		;Adressen der Kommandos
PARSE_IT
	cmp.b	#10,(a0)		;Kommandozeilen-Ende
	beq.s	OPEN_LIBS		;ja, also handeln
	cmp.b	#32,(a0)		;Space ?
	bne.s	TAKE_IT			;nein, also weiter
	addq.l	#1,a0			;nächstes Zeichen
	bra.s	PARSE_IT		;Schleife
TAKE_IT
	addq.w	#1,command		;Kommando-Zähler
	move.l	a0,(a2)+		;erste Adresse eintragen
PARSE_LOOP
	cmp.b	#10,(a0)		;Kommandozeile zu Ende ?
	bne.s	PARSE_AGAIN		;nein, also weiter
	bra.s	OPEN_LIBS
PARSE_AGAIN
	cmpi.b	#"\",(a0)+		;Trennzeichen zwischen Kommandos ?
	bne.s	PARSE_LOOP		;nein, also weitermachen
	subq.l	#1,a0			;einen zurück
	move.b	#0,(a0)+		;Befehl mit Null-Byte terminieren
	bra.s	PARSE_IT		;Schleife

OPEN_LIBS
	move.b	#0,(a0)			;mit Nullbyte abschließen
	lea	dosname,a1		;dos.library öffnen
	moveq	#0,d0			;Version egal
	CALLEXEC	OpenLibrary
	move.l	d0,_DosBase
	beq	FULLEND			;kommentarlos beenden
OPEN_INT
	lea	intname,a1		;intuition.library öffnen
	moveq	#0,d0			;Version egal
	jsr	_LVOOpenLibrary(a6)
	move.l	d0,_IntuitionBase
	beq	FULLEND			;kommentarlos beenden

; Berechnung der Größe des Fenster unter Berücksichtigung
; der Anzahl der vorhandenen Kommandos
; -------------------------------------------------------

OPEN_WIN
	move.w	command,d6		;Anzahl der vorhandenen Kommandos
	beq	OPEN_WINDOW		;bei 1 Kommando -> Defaultwerte
	moveq	#20,d3			;y-Offset
	move.l	d6,d5			;Anzahl Gadgets
	addq.w	#1,d5			;Position des OK_GADS berechnen
	mulu	d5,d3
	lea	ok_gad,a5
	move.w	d3,gg_TopEdge(a5)	;  und eintragen
	addi.l	#20,d3			;Höhe des Fensters errechnen
	lea	win_defs,a0
	move.w	d3,nw_Height(a0)	;und eintragen
	lea	commands,a3		;Adressen-Liste der Kommandos
	clr.l	d4			;vorbereiten
	subq.l	#1,d6			;zum Zähler machen
MAKE_GAD_LOOP
	moveq.l	#item_size,d0		;Speicher allokieren
	moveq	#1,d1
	CALLEXEC	AllocMem
	movea.l	d0,a4			;Anfangs-Adresse der Gadget-Struktur
	beq	FULLEND			;hat nicht geklappt
	movea.l	d0,a1			;zum Kopieren auch in a1
	lea	item_gad,a0		;Daten vom Muster kopieren
	moveq.l	#item_size,d0		;Anzahl Bytes
	divu	#2,d0			;in WORDS umrechnen
	subq.l	#1,d0			;zum Zähler machen
GAD_COPY_LOOP
	move.w	(a0)+,(a1)+		;ein WORD kopieren
	dbra	d0,GAD_COPY_LOOP	;Schleife

	move.l	a5,(a4)			;letztes Gadget in neues eintragen
	add.w	#20,d4			;y-Position des Gadgets errechnen
	move.w	d4,gg_TopEdge(a4)	;und eintragen
	move.l	a4,d0			;Zeiger auf Text errechnen
	addi.l	#gg_SIZEOF,d0
	move.l	d0,gg_GadgetText(a4)	;und eintragen
	move.l	d0,a5			;Zeiger auf Text eintragen
	move.l	(a3)+,it_IText(a5)
	movea.l	a4,a5			;aktuelles jetzt letztes Gadget
	dbra	d6,MAKE_GAD_LOOP	;Schleife
	move.l	a4,first_gadget		;Zeiger auf erstes Gadget in Liste
	lea	win_defs,a0		;Diesen auch in Window-Struktur
	move.l	a4,nw_FirstGadget(a0)	;  eintragen
OPEN_WINDOW
	lea	win_defs,a0
	movea.l	_IntuitionBase,a6
	jsr	_LVOOpenWindow(a6)
	move.l	d0,windowptr
	beq	FULLEND			;nicht geklappt

; auf Ereignis warten
; kann nur REFRESHWINDOW oder GADGETUP sein
; -----------------------------------------

EVENT
	movea.l	windowptr,a0
	movea.l	$56(a0),a0
	movea.l	a0,a5
	move.b	$F(a0),d1
	moveq	#0,d0
	bset	d1,d0
	movea.l	4.W,a6
	jsr	_LVOWait(a6)
	movea.l	a5,a0
	jsr	_LVOGetMsg(a6)
	movea.l	d0,a1
	move.l	$14(a1),d4
	move.w	$18(a1),d5
	movea.l	$1C(a1),a4
	jsr	_LVOReplyMsg(a6)
	cmpi.l	#GADGETUP,d4		;war Message vom Gadget ?
	bne.s	EVENT			;Schleife
	cmpi.w	#1,gg_GadgetID(a4)	;war OK_Gadget ?
	bne.s	EVENT			;nein, also Schleife

	movea.l	windowptr,a0		;ja, also Fenster schliessen
	movea.l	_IntuitionBase,a6
	jsr	_LVOCloseWindow(a6)
	move.l	#0,windowptr		;Window-Pointer löschen

; alle selektierten Kommandos ausführen
; -------------------------------------

	movea.l	first_gadget,a4		;alle Gadgets abarbeiten
	lea	ok_gad,a5		;dies wird das letzte sein
EX_ORDERS			;Kommandos ausführen
	cmpi.w	#SELECTED,gg_Flags(a4)	;Gadget angewählt ?
	bne.s	NEXT_GADGET		;nein, also nächstes
	movea.l	a4,a3			;ja, also
	movea.l	gg_GadgetText(a3),a3	;  Text holen
	move.l	it_IText(a3),d1		;  aus Text-Struktur
	moveq.l	#0,d2			;kein Input
	moveq.l	#0,d3			;kein Output
	movea.l	_DosBase,a6
	jsr	_LVOExecute(a6)		;und ausführen
NEXT_GADGET
	movea.l	(a4),a4			;nächstes Gadget
	cmpa.l	a4,a5			;schon letztes ?
	bne.s	EX_ORDERS		;nein, also Schleife

; Alles dichtmachen
; -----------------

FULLEND
	movea.l	first_gadget,a4
	lea	ok_gad,a5
	cmpa.l	#0,a4
	beq.s	CLOSEWIN
FREE_MEM_LOOP
	movea.l	a4,a1
	movea.l	(a4),a4
	moveq.l	#item_size,D0
	movea.l	4.W,a6
	jsr	_LVOFreeMem(a6)
	cmpa.l	a4,a5
	bne.s	FREE_MEM_LOOP
CLOSEWIN
	tst.l	windowptr
	beq.s	CLOSEINT
	movea.l	windowptr,a0
	movea.l	_IntuitionBase,a6
	jsr	_LVOCloseWindow(a6)
CLOSEINT
	tst.l	_IntuitionBase
	beq.s	CLOSEDOS
	movea.l	_IntuitionBase,a1
	movea.l	4.W,a6
	jsr	_LVOCloseLibrary(a6)
CLOSEDOS
	tst.l	_DosBase
	beq.s	END
	movea.l	_DosBase,a1
	movea.l	4.W,a6
	jsr	_LVOCloseLibrary(a6)
END
	movem.l	(a7)+,d0-d7/a0-a6
	clr.l	d0
	rts

; Variablen und Konstanten
; ------------------------
	cnop	0,2

win_defs
	dc.w	0,50
	dc.w	400,36
	dc.b	2,1
	dc.l	GADGETUP	;Gadget-Klick und Refresh nötig
	dc.l	ACTIVATE	;aktiv
	dc.l	0
	dc.l	0
	dc.l	win_title
	dc.l	0
	dc.l	0
	dc.w	$190,$64
	dc.w	$190,$64
	dc.w	WBENCHSCREEN

win_title
	dc.b	" Wähle Deine Konfiguration !    ",169," Schnuckel 1989",0
	cnop	0,2

ok_gad
	dc.l	0			;nächstes Gadget
	dc.w	150,20			;links/oben			
	dc.w	100,12			;Breite/Höhe
	dc.w	GADGHCOMP		;Flags
	dc.w	RELVERIFY		;Activation
	dc.w	BOOLGADGET		;Typ
	dc.l	ok_border		;Rahmen
	dc.l	0			;kein Select-Rahmen
	dc.l	ok_str			;Zeiger auf Text-Struktur
	dc.l	0			;MutualExclude
	dc.l	0			;SpecialInfo
	dc.w	1			;Gadget-ID
	dc.l	0			;UserData

ok_str
	dc.b	1,0,RP_JAM1,0
	dc.w	42,3			;links/oben
	dc.l	0			;Font
	dc.l	ok_text			;Zeiger auf Text
	dc.l	0			;kein weiterer Text

ok_text	dc.b	"OK",0
	cnop	0,2

ok_border
	dc.w	-1,-1			;links/oben
	dc.b	3,1,RP_JAM1
	dc.b	5			;Koordinatenpaare
	dc.l	ok_border_coords	;Zeiger auf Koordinaten
	dc.l	0			;kein weiterer Border

ok_border_coords
	dc.w	0,0
	dc.w	101,0
	dc.w	101,13
	dc.w	0,13
	dc.w	0,0

item_gad
	dc.l	0			;nächstes Gadget
	dc.w	350,0			;links/oben (noch unbekannt)
	dc.w	24,11			;Breite/Höhe
	dc.w	GADGHCOMP		;Flags
	dc.w	RELVERIFY!TOGGLESELECT	;Activation
	dc.w	BOOLGADGET		;Typ
	dc.l	item_border		;Rahmen
	dc.l	0			;kein Select-Rahmen
	dc.l	item_str		;Zeiger auf Text-Struktur
	dc.l	0			;MutualExclude
	dc.l	0			;SpecialInfo
	dc.w	0			;Gadget-ID (noch unbekannt)
	dc.l	0			;UserData

item_str
	dc.b	1,0,RP_JAM1,0
	dc.w	-340,3			;links/oben
	dc.l	0			;Font
	dc.l	0			;Zeiger auf Text
	dc.l	0			;weitere Text-Struktur

item_size	equ	*-item_gad

item_border
	dc.w	-1,-1			;links/oben
	dc.b	3,1,RP_JAM1
	dc.b	5			;Koordinatenpaare
	dc.l	item_coords		;Zeiger auf Koordinaten
	dc.l	0			;kein weiterer Border

item_coords
	dc.w	0,0
	dc.w	25,0
	dc.w	25,12
	dc.w	0,12
	dc.w	0,0

command		dc.w	0
commands	ds.l	10

windowptr	dc.l	0
first_gadget	dc.l	0

_IntuitionBase	dc.l	0
_DosBase	dc.l	0

intname	dc.b	"intuition.library",0
dosname	dc.b	"dos.library",0
