;
;
;
;BOOT - Data Technology Corporation CP/M 2.2 BOOT.
;
; +-----------------------+
; | |
; | B O O T |
; | |
; +-----------------------+
;
;
;
; Version number: 2.2B
; Version date: March 19, 1981
;
; Update date: March 24, 1981
;
; Update date: June 26, 1981
; No longer support boot from single-density
; diskette.
;
; Boots from logical unit number in A
; register on entry.
;
; The following code is supplied to customers who
; purchase a hard/floppy disk system from DTC.
; The following code is written onto track 0 sector 0
; of the hard disk. This routine is read into memory
; at location 0 by the user's PROM. This routine then
; loads the rest of the system into memory.
;
;
; The format of the Hard Disk Boot sectors are as follows:
;
; Logical Routine
; Sector Name
;
; 0 Boot program
;
; 1 thru 8 CCP
;
; 9 thru 22 BDOS
;
; 23 thru 32 DTC CBIOS
;
VERS: EQU 22
;Enter and exit with A = logical unit # of the boot device
ORG 100h
BOOT:
LXI SP,BOOT
LXI H,DT ;Find parameters
LXI D,DTELN
MVI B,NLUN
BOOT2:
CMP M
JZ BOOT3
DAD D
DCR B
JNZ BOOT2
LXI H,DT
XRA A
BOOT3:
INX H
STA LUN ;Set logical unit number
STA CIOAD+1
STA CIOFS+1
MOV A,M
STA CIOPB+3 ;Set starting sector
INX H
MOV A,M
STA CIOPB+4 ;Set # sectors
INX H ;Set drive type
MOV A,M
INX H
CPI 0FFh
JZ BOOT0
STA CIOAD+4
PUSH H
LXI H,CIOAD
CALL EXEC
CZ WAITF
POP H
BOOT0:
MOV A,M
CPI 0FFh
JZ BOOT1
STA CIOFS+5
LXI H,CIOFS
CALL EXEC
CZ WAITF
BOOT1:
LXI D,CCP
LXI H,CIOPB
CALL RDISK
ORA A
JNZ BOOT1
MOV A,C
ANI FERR
JNZ BOOT1
LDA LUN
JMP CBIOS
CIOAD: DB ADCMD,0,0,0,0,0
CIOFS: DB FSCMD,0,0,0,0,0
CIOPB: DB RDCMD
LUN: DB 0
DB 0,1
DB 0 ;Read two tracks less BOOT
DB 0 ;Perform not retries
DT:
IF LUN0
DB 0 SHL 5
DB 1+NF0+N48M0+N96M0
DB NH0*HBTLN+NF0*FBTLN+(N48M0+N96M0)*MBTLN
DB LUN0DAT
DB B0
ENDIF
IF LUN1
DB 1 SHL 5
DB 1+NF1+N48M1+N96M1
DB NH1*HBTLN+NF1*FBTLN+(N48M1+N96M1)*MBTLN
DB LUN1DAT
DB B1
ENDIF
IF LUN2
DB 2 SHL 5
DB 1+NF2+N48M2+N96M2
DB NH2*HBTLN+NF2*FBTLN+(N48M2+N96M2)*MBTLN
DB LUN2DAT
DB B2
ENDIF
IF LUN3
DB 3 SHL 5
DB 1+NF3+N48M3+N96M3
DB NH3*HBTLN+NF3*FBTLN+(N48M3+N96M3)*MBTLN
DB LUN3DAT
DB B3
ENDIF
DTELN: EQU 5
DTLEN: EQU ($-DT)/DTELN
; Disk I/O Routines
;
;
IF I696
; E X E C
EXEC: MVI B,BUSY ;Wait for not busy.
MVI C,BUSY and (not BUSY)
CALL WAITM
RNZ
MVI A,SLCT ;Alert controller
OUT DIO+1
EXEC1:
MOV C,B ;Wait for controller busy
CALL WAITM
RNZ
MVI A,DODTA ;Enable data in
OUT DIO+1
EXEC2: IN DIO+2 ;Get status
XRI 0FFh
JM EXEC2 ;If not requesting next byte
ANI CMND+DIROUT
JNZ EXEC3 ;If CMND or DIROUT false
MOV A,M
INX H
OUT DIO ;Send byte from command buffer
JMP EXEC2
EXEC3: CMP A ;Z:=1
RET
;
;
;
;
; RDISK - Input to memory buffer.
;
; Entry: HL = command buffer address
; DE = data buffer address
RDISK: CALL EXEC
RNZ ;Return if timeout
RDISK1: IN DIO+2 ;Read status
ORA A
JP RDISK1 ;If request is present
ANI CMND
JNZ GCMPS
IN DIO
STAX D
INX D
JMP RDISK1
;
;
;
;
; WAITF - Wait for function to complete.
WAITF: MVI B,REQ+CMND ;Wait for both REQ and CMND
MOV C,B
CALL WAITM
RNZ
;
; Get completion status.
GCMPS: IN DIO ;Get completion status
MOV C,A
GCMP1: IN DIO+2
ORA A
JP GCMP1 ;If REQ not set
MOV B,A
IN DIO ;Get message byte
RET
ENDIF
;
;
;
;
IF I796
; EXEC - Output the command
;
; Enter: HL is the command buffer address
; DE - data transfer address.
EXEC:
MOV A,E ;Output DMA address
OUT DIO+2
MOV A,D
OUT DIO+3
MOV A,L
OUT DIO+4
MOV A,H
OUT DIO+5
MVI A,0
OUT DIO+6
OUT DIO+7
OUT DIO
CMP A ;Z:=1
RET
; Disk read/write
;
; Entry: same as EXEC
;
RDISK:
WDISK: CALL EXEC
RNZ ;Return if timeout
; WAITF - Wait until transfer done
;
; Enter: none
; Exit: when transfer completed
WAITF: MVI B,CMDDON ;Wait for CMDDON
MOV C,B
CALL WAITM
RNZ ;Return if timeout
;
; GCMPS - Get completion status
;
; Enter: none
; Exit: Status in C
GCMPS: IN DIO+1
MOV C,A
RET
ENDIF
; WAITM - Wait for controller with timeout
;
; Entry: B=Status mask
; C=Status value
; Exit: Z=1 if OK, else timeout with A=C=TERR
;
WAITM:
PUSH D ;Save D
PUSH H
LXI H,138 ;Two minute timeout
LXI D,0 ;Max wait @4MHZ is 868 ms
WAITML:
IF I696
IN DIO+2
ENDIF
IF I796
IN DIO
ENDIF
ANA B ;Mask wait bits
CMP C ;Check value
JZ WAITM1
DCX D ;Not ready. Decrement time
MOV A,D
ORA E
JNZ WAITML
DCX H
MOV A,H
ORA L
JNZ WAITML
MVI B,0 ;Timeout
MVI A,TERR
ORA A
WAITM1:
POP H
POP D ;Restore D
MOV C,A ;Return status in C
RET