
; Mit dieser Routine läßt sich das Laufwerk auslesen, von dem das laufende
; Programm gestartet wurde und gleichzeitig ein neuer Pfad auf diesem Lauf-
; werk setzen. Damit ist sichergestellt, daß das Programm seine Datenfiles
; immer und überall auch findet...
; Dies geht jedoch nur bei einem Workbenchstart!

; Am Ende des Listings ist ein Verwendungsbeispiel gegeben !!!!!!

; "DosBase" ist der Zeiger auf die geöffnete dos.library

;-------------------------------------------------------------------
; Startlaufwerk auslesen

; EINGABE : a0 - Zeiger auf Verzeichnis-String (ASCII+0)
;           a1 - Message, die von der Workbench beim Programmstart
;                übergeben wird. (s.Beispiel)

; AUSGABE : d0 - alter Disklock (long)
;           d1 - neuer Disklock (-1 = Fehler!) (long)

GetDrv:	movem.l	a2-a6/d2-d7,-(sp)		; Register retten

	move.l	a0,-(sp)			; Zeiger sichern

	move.l	a1,a0				; Message von der Workbench
	move.l	$24(a0),a0
	move.l	(a0),d1				; Zeiger auf Disk-Lock

	move.l	#InfoBuf,d2			; Info über Laufwerk holen
	move.l	DosBase(pc),a6
	jsr	-102(a6)			; Examine ()
	tst.l	d0
	beq.s	Error1				; Fehler ?

	lea.l	InfoBuf+8(pc),a0		; Laufwerksbezeichner auslesen

	moveq	#106,d0
scrNL:	tst.b	(a0)
	beq.s	cpNL
	cmp.b	#":",(a0)			; Ende des Bezeichners suchen
	beq.s	cpNL
	addq.l	#1,a0
	dbf	d0,scrNL			; nächstes Zeichen
	bra.s	Error1				; wenn 106 durch, dann Fehler

cpNL:	move.l	(sp)+,a1
	move.b	#":",(a0)+			; Doppelpunkt anhängen
cpPfad:	move.b	(a1),(a0)+
	tst.b	(a1)+				; Endkennung ?
	bne.s	cpPfad

	move.l	#InfoBuf+8,d1			; Verzeichnis setzen
	moveq	#-2,d2
	move.l	DosBase(pc),a6
	jsr	-84(a6)				; Lock ()
	move.l	d0,d1
	beq.s	Error2
	move.l	d0,-(sp)
	move.l	DosBase(pc),a6
	jsr	-126(a6)			; CurrentDir ()

	; in d0 ist jetzt der alte Lock !

	move.l	(sp)+,d1			; neuen Lock merken

	movem.l	(sp)+,a2-a6/d2-d7		; Register restaurieren
	rts

Error1:	move.l	(sp)+,a0
Error2:	movem.l	(sp)+,a2-a6/d2-d7		; Register restaurieren
	moveq	#-1,d1				; Fehler signalisieren
	rts

		cnop	0,4
InfoBuf:	ds.b	$104



;**********************************************************************
;**********************************************************************

Beispiel:

;------------------------------------------
; Startup für sicheren WB und CLI Start

	movem.l	a0/d0,-(sp)			; Kommandoparameter retten

	sub.l	a1,a1
	jsr	-294(a6)			; FindTask ()
	move.l	d0,a4
	tst.l	$AC(a4)
	bne.s	noWB
	lea.l	$5C(a4),a0
	jsr	-384(a6)			; WaitPort ()
	lea.l	$5C(a4),a0
	jsr	-372(a6)			; GetMsg ()
	move.l	d0,WBMsg

noWB:	movem.l	(sp)+,a0/d0
	bsr.s	Prog				; Programm aufrufen
	move.l	d0,-(sp)			; Fehlercode merken

	tst.l	WBMsg
	beq.s	exit
	move.l	4.w,a6				; EXECBASE laden
	jsr	-132(a6)			; Forbid ()
	move.l	WBMsg(pc),a1
	jsr	-378(a6)			; ReplyMsg ()

exit:	move.l	(sp)+,d0			; Fehlercode zurück
	rts

;---------------------------------------

Prog:	lea.l	DosName(pc),a1
	moveq	#0,d0
	move.l	4.w,a6
	jsr	-552(a6)			; OpenLib ()
	move.l	d0,DosBase
	beq.s	Err2

LibOk:	tst.l	WBMsg				; WorkbenchStart ?
	beq.s	Main				; nein, dann...

	lea.l	DataV(pc),a0
	move.l	WBMsg(pc),a1
;---------------------------------------
	bsr.w	GetDrv				; Pfad setzen
;---------------------------------------
	cmp.w	#-1,d1				; Fehler ?
	beq.s	Err1

Main:	; **** Hier steht das eigentliche Programm... ****

Err1:	move.l	4.w,a6
	move.l	DosBase(pc),a1
	jsr	-414(a6)			; CloseLib ()

Err2:	moveq	#20,d0				; FehlerCode
	rts

WBMsg:		dc.l	0
DosBase:	dc.l	0
DosName:	dc.b	"dos.library",0
DataV:		dc.b	"DataFiles",0
