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