
	; Programm : Sound Effect Machine
	; Modul    : Startmodul
	; by       : Dan Dark Software / Jörg Schließer
	; Version  : V1.0 / Dezember 1989
	; Assembler: Kick-Ass V1.20

	; Modul, das beim Start eines Programms von CLI oder Workbench
	; jeweils den entsprechenden übergebenen Parameter ermittelt.

	; Übergabeparameter beim Aufruf ( werden vom Betriebsystem
	; übergeben ):

	; Bei Start von CLI:
	; a0 = Zeiger auf Text hinter dem Programmnamen
	; d0 = Anzahl der Zeichen
	; Bei Start von Workbench:
	; keine direkte Parameterübergabe in den Registern

	; Rückgabeparameter:

	; d0 = 0 => keine Parameter
	; d0 = 1 => Start von CLI
	; d0 = 2 => Start von Workbench
	; d0 = $1000 => Error ! Library konnte nicht geöffnet werden
	; a0 => Zeiger auf den übergebenen Parameter

	; Betriebsystem-Routinen

FindTask	=	-294         ; Exec-Library
GetMsg	=	-372
ReplyMsg	=	-378
WaitPort	=	-384
CloseLibrary	=	-414
OpenLibrary	=	-552
CurrentDir	=	-126         ; Dos-Library
GetDiskObject	=	-78          ; Icon-Library
FreeDiskObject	=	-90

	; Konstanten:

execbase	=	$4           ; Exec Basisadresse

	; Das Modul wird direkt nach dem Start eines Programms auf-
	; gerufen und ermittelt, ob von WB oder CLI gestartet wurde
	; und welcher Parameter übergeben wurde.
	; Beim Start von der Workbench wird der erste Tool-Types-
	; Eintrag im .info-File ermittelt
	; Beim Start von CLI wird ein Parameter, der nach dem
	; Programmnamen angegeben wurde und durch ein 'Space'
	; getrennt ist ermittelt.

	even
startmodul:
	movem.l	d1-d7/a1-a6,-(sp) ; Register retten
	move.l	a0,a5             ; Zeiger auf Text bei CLI-Start
	move.l	d0,d5             ; Anzahl der Zeichen bei CLI-Start
	move.l	execbase,a6       ; Exec-Basisadresse
	move.l	#0,a1             ; Taskname = 0 => aktueller Task
	jsr	FindTask(a6)      ; Task-Structur ermitteln
	move.l	d0,a2             ; Zeiger auf Task-Structur nach a2
	tst.l	$AC(a2)           ; Auf CLI-Start prüfen
	bne	CLIstart          ; ja ... CLI-Start unten weiter

	; Start von Workbench

	lea	$5C(a2),a0        ; Zeiger auf MessagePort des Tasks
	jsr	WaitPort(a6)      ; Auf Workbench-Message warten
	lea	$5C(a2),a0        ; Zeiger auf MessagePort des Tasks
	jsr	GetMsg(a6)        ; Workbench-Message abholen
	move.l	d0,a2             ; Zeiger auf Message-Struktur nach a2
	move.l	$24(a2),a3        ; Zeiger auf Argumentenliste sichern
	lea	iconlib,a1        ; Zeiger auf Icon-Lib-Name nach a1
	moveq	#0,d0             ; Version ... ist egal
	jsr	OpenLibrary(a6)   ; Library öffnen
	move.l	d0,iconbase       ; Basisadresse der Icon-Library
	beq	starterror1       ; = 0 ... Error, keine Library !
	lea	doslib,a1         ; Zeiger auf Dos-Lib-Name nach a1
	moveq	#0,d0             ; Version ... ist egal
	jsr	OpenLibrary(a6)   ; Library öffnen
	move.l	d0,dosbase        ; Basisadresse der Dos-Library
	beq	starterror1       ; = 0 ? ... Error, keine Library !
	move.l	d0,a6             ; Dos-Basisadresse nach a6
	move.l	(a3),d1           ; Zeiger auf Dir-Lock des Programms
	jsr	CurrentDir(a6)    ; Directory zum aktuellen Directory
	move.l	iconbase,a6       ; Icon-Basisadresse nach a6
	move.l	4(a3),a0          ; Zeiger auf Namen des Programms
	jsr	GetDiskObject(a6) ; Disk-Objekt laden
	move.l	d0,a4             ; Zeiger auf Disk-Objekt-Struktur
	beq	noinfoargs        ; = 0 ? ... kein Disk-Objkt => Fertig!
	move.l	$36(a4),a1        ; Zeiger auf ToolTypes-Liste nach a0
	beq	noinfoargs        ; = 0 ? ... keine ToolTypes
	move.l	(a1),a0           ; Zeiger auf ersten Tool-Type nach a0
	lea	parameter,a1      ; Zeiger auf Speicher für Tool-Type
	moveq	#78,d0            ; maximal 79 Zeichen kopieren
copywbpara:
	move.b	(a0)+,(a1)+       ; nächstes Zeichen kopieren
	beq	wbparacopied      ; Zeichen = 0 ... Fertig kopiert !
	dbra	d0,copywbpara     ; und weiter geht's
wbparacopied:
	move.l	a4,a0             ; Disk-Objekt wieder freigeben
	jsr	FreeDiskObject(a6)
noinfoargs:
	move.l	execbase,a6       ; Exec-Basisadresse nach a6
	move.l	iconbase,a1       ; Icon-Basisadresse nach a1
	jsr	CloseLibrary(a6)  ; Icon-Library schließen
	move.l	dosbase,a1        ; Dos-Basisadresse nach a1
	jsr	CloseLibrary(a6)  ; Dos-Library schließen
	move.l	a2,a1             ; Zeiger auf Message-Struktur nach a1
	jsr	ReplyMsg(a6)      ; Message beantworten
	moveq	#2,d0             ; Rückgabeparameter für WB-Start
	bra	exitstartmodul

	; Start von CLI

CLIstart:
	tst.l	d5                ; d5 = 0 ... keine Parameter
	beq	nocliparameters   ; also Fertig !
	lea	parameter,a1      ; Zeiger auf Speicher für 1. Parameter
lookforpara:
	subq.b	#1,d5             ; Zeichenzähler vermindern
	beq	nocliparameters   ; = 0 ? ... kein Parameter
	cmp.b	#32,(a5)+         ; nächstes Zeichen = 'Space' ?
	beq	lookforpara       ; ja ! ... weitersuchen
	sub.l	#1,a5             ; Zeiger zurück auf letztes Zeichen
copypara:
	move.b	(a5)+,(a1)+       ; nächstes Zeichen kopieren
	beq	gotclipara        ; = 0 ? ... Ende des Parameters
	subq.b	#1,d5             ; Zeichenzähler vermindern
	beq	gotclipara        ; = 0 ? ... Ende des Parameters
	bra	copypara          ; Parameter weiter kopieren
gotclipara:
	clr.b	(a1)              ; zur Sicherheit Null-Byte ans Ende
	moveq	#1,d0             ; Rückgabeparameter für CLI-Start
exitstartmodul:
	lea	parameter,a0      ; Zeiger auf Parameterliste nach a0
	movem.l	(sp)+,d1-d7/a1-a6
	rts ; und Fertig !

nocliparameters:
	moveq	#0,d0             ; Rückgabeparameter für kein P.
	movem.l	(sp)+,d1-d7/a1-a6
	rts ; und Fertig !

	; Fehler: Library konnte nicht geöffnet werden

starterror1:	move.l	#$1000,d0        ; Rückgabeparameter für Error !
	movem.l	(sp)+,d1-d7/a1-a6
	rts ; und Fertig !

	; Speicher für Konstanten, Variablen und Flags...

iconlib:	dc.b	'icon.library',0
	even
doslib:	dc.b	'dos.library',0
	even
iconbase:	dc.l	0
dosbase:	dc.l	0

parameter:	blk.b	80,0   ; Tool-Type-Text oder CLI-Parameter


