system/shard-z80-ruc-64180/1.5/src/EBOOT.MAC

Raw file
Back to index

TITLE	EBOOT - Eumel Bootstrap Schreibprogramm
;
;****************************************************************
;
;	E B O O T
;
;	Version 1.3 - 29.12.1986
;
;	Copyright (C) 1985 by R. Ellerbrake
;
;****************************************************************
;
	INCLUDE	HD64180.LIB
;
	.LIST
;
BDOS	EQU	5
EUMEL	EQU	6		;Volume Directory Typ
BOTLNG	EQU	3FH		; Nicht 40H
BOTPA1	EQU	10H
BOTPA2	EQU	10H
DEFFCB	EQU	5CH
;
	EXTERNAL INITS, HDIO, FDIO, SCSIIO
	GLOBAL	EBOOT
;
	CSEG
;
;****************************************************************
;
;	Meldungen
;
STARTUP:
	DEFB	0DH, 0AH
	DEFM	'**** E U M E L  Harddisk Bootstrap Installationsprogramm ****'
	DEFB	0DH, 0AH
	DEFM	'   Version 1.3 - 29.12.1986 - (C) by R. Ellerbrake (RUC)$'
;
NOBOOT:
	DEFB	0DH, 0AH, 7
	DEFM	'Datei EUMEL.COM nicht gefunden, leer oder fehlerhaft!$'
; 
ERRSTR:
	DEFB	0DH, 0AH, 7
	DEFM	'Harddisk E/A Fehler: '
ERRNR:	DEFM	'00$'
;
ENDMSG:
	DEFB	0DH, 0AH, 7
	DEFM	'Kein (weiteres) EUMEL Volume vorhanden!$'
;
QSTR:
	DEFB	0DH, 0AH
	DEFM	'EUMEL Bootstrap Lader auf Harddisk Volume '
QSTRN:
	DEFM	'                $'
;
LSTR:
	DEFB	' installieren (J/N): $'
;
ILLSTR:
	DEFB	0DH, 0AH, 7
	DEFM	'Unzulaessige Eingabe !!!$'
;
RDYSTR:
	DEFB	0DH, 0AH
	DEFM	'EUMEL Bootstraplader erfolgreich installiert.$'
;
;****************************************************************
;
EBOOT::
	LD	SP,STACK
;
	LD	DE,STARTUP
	LD	C,9
	CALL	BDOS
;
	LD	A,(DEFFCB)
	LD	DE,EUMELFI
	LD	(DE),A		;ggf. Drive aus Kommandozeile verwenden
	LD	C,15		;Open File
	CALL	BDOS
	INC	A		;Fehler ?
	JR	NZ,FIOK		;Nein ->
;
ILLFI:
	LD	DE,NOBOOT	;Bootstrap Lader Datei nicht gefunden
	LD	C,9
	CALL	BDOS
	JP	0
;
FIOK:
	LD	A,(EUMELFI+16)	;1. BLock vorhanden ?
	AND	A
	JR	Z,ILLFI		;Nein -> Fehler
;
	CALL	INITS
	CALL	INITS
;
;	Warten bis Harddisk hochgelaufen ist
;
WRTHRD:
	LD	DE,TESTRD
	LD	BC,0
	CALL	SCSIIO
	CP	4		;Drive not Ready ?
	JR	Z,WRTHRD	;Ja -> warten
;
	LD	HL,DATAR
	LD	BC,PARBLK
	LD	A,0		;Superdirectory lesen
	LD	DE,0
	CALL	HDIO
	AND	A
	JR	Z,SDOK
;
HDIOER:
	LD	DE,ERRNR	; Fehlernummer in A
	CALL	HEX1
	LD	DE,ERRSTR
	LD	C,9
	CALL	BDOS
	JP	0

HEX1:
	PUSH	AF
	RRCA
	RRCA
	RRCA
	RRCA
	CALL	HEX2
	POP	AF
HEX2:
	AND	0FH
	CP	0AH
	JR	C,HEX3
	ADD	7
HEX3:
	ADD	30H
	LD	(DE),A
	INC	DE
	RET
;
;	64180 Bootvolume mit EUMEL Kennung suchen
;
SDOK:
	LD	HL,DATAR
	LD	E,(HL)		;Byte 0 = Anfangsoffset
	LD	D,0		;DE = Volume Eintrag Laenge
	ADD	HL,DE
	LD	A,(DATAR+20H)	;Volume Anzahl
	LD	B,A
;
SRCLOP:
	PUSH	HL
	POP	IX
	LD	A,(IX+23H)	;Directory Typ
	CP	EUMEL		;EUMEL Diretory ?
	JR	Z,ISEDIR	;Ja ->
;
NXVOL:
	ADD	HL,DE
	DJNZ	SRCLOP
;
;	Alle Volumes durchsucht
;
	LD	DE,ENDMSG
	LD	C,9
	CALL	BDOS
	JP	0
;
;	EUMEL Volume gefunden
;
ISEDIR:
	PUSH	HL
	PUSH	DE
	PUSH	BC
	PUSH	IX
	LD	B,0
	LD	C,(IX+10H)	;Laenge des Volumenamens
	LD	DE,11H
	ADD	HL,DE		;auf Volumename
	LD	DE,QSTRN
	LDIR
	LD	A,'$'
	LD	(DE),A		;Stringende eintragen
;
	LD	DE,QSTR
	LD	C,9
	CALL	BDOS		;anfragen
	LD	DE,LSTR
	LD	C,9
	CALL	BDOS
;
	LD	C,1		;1 Zeichen einlesen
	CALL	BDOS
	AND	05FH
;
	CP	'Y'		;Ja ->
	JR	Z,PUTBOT
;
	CP	'J'		;Ja ->
	JR	Z,PUTBOT
;
	CP	'N'		;Nein ->
	JR	Z,NOBOT
;
;	Falsche Eingabe: nochmal anfragen
;
	LD	DE,ILLSTR
	LD	C,9
	CALL	BDOS
;
	POP	IX
	POP	BC
	POP	DE
	POP	HL
	JR	ISEDIR
;
NOBOT:
	POP	IX
	POP	BC
	POP	DE
	POP	HL
	JR	NXVOL
;
;	Bootstrap installieren
;

PUTBOT:
	XOR	A
	LD	HL,BOTBUF
	LD	(HL),A
	LD	DE,BOTBUF+1
	LD	B,BOTLNG
	LD	C,0
	LDIR			; Bereich loeschen

	LD	HL,BOTBUF	;EUMEL Bootstrap Datei einlesen
	LD	B,BOTLNG*2	;max. Recordanzahl
	LD	DE,EUMELFI
;
RDLOP:
	PUSH	BC
	PUSH	DE
	LD	C,26
	EX	DE,HL
	PUSH	DE
	CALL	BDOS		;DMA-Adresse setzen
	POP	HL
	LD	DE,128		;und hochzaehlen
	ADD	HL,DE
	POP	DE
	PUSH	HL
	PUSH	DE
	LD	C,20		;Read sequential
	CALL	BDOS		;Record lesen
	POP	DE
	POP	HL
	POP	BC
	CP	1
	JR	Z,READY
	DJNZ	RDLOP		;Nicht fertig ->
;
;	Bootstrap Lader im Speicher
;
READY:
	POP	IX
	POP	BC
	POP	DE
	POP	HL

	LD	(HL),40H	;EUMEL Bootkennung eintragen
	LD	(IX+20H),BOTPA1	;EUMEL Bootparameter eintragen
	LD	(IX+21H),BOTPA2
	LD	(IX+22H),BOTLNG
	INC	HL
	PUSH	HL		;Bootvolume
;
	LD	HL,DATAR
	LD	BC,PARBLK
	LD	A,1		;Superdirectory schreiben
	LD	DE,0
	CALL	HDIO
;
;	Bootstrap Lader schreiben
;
	LD	HL,BOTBUF	;Datenbereich
	LD	DE,0		;Blocknummer
;
WRLOP:
	POP	BC
	PUSH	BC
	PUSH	DE
	PUSH	HL
	LD	A,1
	CALL	HDIO
;
	JP	NZ,HDIOER
;
	POP	HL
	LD	DE,512		;Adresse hochzaehlen
	ADD	HL,DE
	POP	DE
	INC	DE
	LD	A,E
	CP	BOTLNG/2	;fertig ?
	JR	NZ,WRLOP	;Nein ->
;
	POP	BC
	LD	DE,RDYSTR
	LD	C,9
	CALL	BDOS
	JP	0
;
;****************************************************************
;
EUMELFI:
	DEFB	0		;auf Default Drive
	DEFM	'EUMEL   COM'
	DEFB	0,0,0,0,0
	DEFB	0,0,0,0,0,0,0,0
	DEFB	0,0,0,0,0,0,0,0,0
;
PARBLK:
	DEFB	0,0,2,0
;
TESTRD:
	DEFB	0,0,0,0,0,0	;Test Ready
;
	DEFS	200
STACK:	DEFW	0
;
DATAR:	DEFS	512
;
BOTBUF:
;
	END