Added boot sector and I/O system
Added the reconstructed source code of the boot sector and I/O system (DOS BIOS).
This commit is contained in:
@@ -0,0 +1,148 @@
|
|||||||
|
;This is a disk boot routine for the 1771/1791 type disk
|
||||||
|
;controllers. It would normally reside on track 0,
|
||||||
|
;sector 1, to be loaded by the "B" command of the
|
||||||
|
;monitor at address 200H. By changing the equates
|
||||||
|
;below, it may be configured to load any size of
|
||||||
|
;program at any address. The program is assumed to
|
||||||
|
;occupy consecutive sectors starting at track 0, sector
|
||||||
|
;2, and will begin exection at its load address (which
|
||||||
|
;must be a 16-byte boundary) with the Instruction
|
||||||
|
;Pointer set to zero.
|
||||||
|
|
||||||
|
; Variations are available for the Cromemco 4FDC with
|
||||||
|
; large disks, the 4FDC with small disks, the Tarbell
|
||||||
|
; single-density controller, and the Tarbell double-
|
||||||
|
; density controller. Select one.
|
||||||
|
|
||||||
|
CROMEMCOSMALL: EQU 0
|
||||||
|
CROMEMCOLARGE: EQU 1
|
||||||
|
TARBELLSINGLE: EQU 0
|
||||||
|
TARBELLDOUBLE: EQU 0
|
||||||
|
|
||||||
|
LOAD: EQU 400H ;Address to load program
|
||||||
|
SEG: EQU 40H ;LOAD/10H
|
||||||
|
SECTOR: EQU 51 ;No. of 128-byte sectors to load
|
||||||
|
BOOTER: EQU 200H ;"B" command puts booter here
|
||||||
|
|
||||||
|
;**************************************************************
|
||||||
|
|
||||||
|
CROMEMCO: EQU CROMEMCOLARGE+CROMEMCOSMALL
|
||||||
|
TARBELL: EQU TARBELLSINGLE+TARBELLDOUBLE
|
||||||
|
|
||||||
|
WD1771: EQU CROMEMCO+TARBELLSINGLE
|
||||||
|
WD1791: EQU TARBELLDOUBLE
|
||||||
|
|
||||||
|
SMALL: EQU CROMEMCOSMALL
|
||||||
|
LARGE: EQU CROMEMCOLARGE+TARBELL
|
||||||
|
|
||||||
|
IF SMALL
|
||||||
|
MAXSECT:EQU 18
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IF LARGE
|
||||||
|
MAXSECT:EQU 26
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IF TARBELL
|
||||||
|
DISK: EQU 78H
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IF CROMEMCO
|
||||||
|
DISK: EQU 30H
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IF WD1771
|
||||||
|
READCOM:EQU 88H
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IF WD1791
|
||||||
|
READCOM:EQU 80H
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IF CROMEMCOLARGE
|
||||||
|
WAITBYTE:EQU 0B1H
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IF CROMEMCOSMALL
|
||||||
|
WAITBYTE:EQU 0A1H
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
ORG BOOTER
|
||||||
|
PUT 100H
|
||||||
|
|
||||||
|
XOR AX,AX
|
||||||
|
MOV DS,AX
|
||||||
|
MOV ES,AX
|
||||||
|
MOV SS,AX
|
||||||
|
UP
|
||||||
|
MOV DI,LOAD
|
||||||
|
MOV DX,SECTOR
|
||||||
|
MOV BL,2
|
||||||
|
SECT:
|
||||||
|
MOV AL,BL
|
||||||
|
OUTB DISK+2
|
||||||
|
MOV CX,128
|
||||||
|
INB DISK+4
|
||||||
|
TEST AL,20H
|
||||||
|
MOV AL,READCOM
|
||||||
|
JNZ OUTCOM
|
||||||
|
MOV AL,READCOM+4
|
||||||
|
OUTCOM:
|
||||||
|
OUTB DISK
|
||||||
|
|
||||||
|
IF CROMEMCO
|
||||||
|
MOV AL,WAITBYTE
|
||||||
|
OUT DISK+4 ;Turn on hardware wait
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
READ:
|
||||||
|
INB DISK+4
|
||||||
|
|
||||||
|
IF TARBELL
|
||||||
|
ROL AL
|
||||||
|
JNC DONE
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IF CROMEMCO
|
||||||
|
ROR AL
|
||||||
|
JC DONE
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
INB DISK+3
|
||||||
|
STOB
|
||||||
|
LOOP READ
|
||||||
|
GETSTAT:
|
||||||
|
INB DISK+4
|
||||||
|
|
||||||
|
IF TARBELL
|
||||||
|
ROL AL
|
||||||
|
JC GETSTAT
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IF CROMEMCO
|
||||||
|
ROR AL
|
||||||
|
JNC GETSTAT
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
DONE:
|
||||||
|
IN DISK
|
||||||
|
AND AL,9CH
|
||||||
|
JNZ SECT
|
||||||
|
DEC DX
|
||||||
|
JZ BOOT
|
||||||
|
INC BL
|
||||||
|
CMP BL,MAXSECT+1
|
||||||
|
JNZ SECT
|
||||||
|
XOR BL,BL
|
||||||
|
INC DX
|
||||||
|
MOV AL,58H ;Step in with update
|
||||||
|
OUTB DISK
|
||||||
|
JP GETSTAT
|
||||||
|
|
||||||
|
BOOT:
|
||||||
|
MOV AX,SEG
|
||||||
|
MOV SS,AX
|
||||||
|
MOV ES,AX
|
||||||
|
MOV DS,AX
|
||||||
|
JMP 0,SEG
|
||||||
|
|
||||||
@@ -0,0 +1,605 @@
|
|||||||
|
; I/O System for 86-DOS.
|
||||||
|
|
||||||
|
; Assumes a CPU Support card at F0 hex for character I/O,
|
||||||
|
; with disk drivers for Tarbell or Cromemco controllers.
|
||||||
|
|
||||||
|
; Select disk controller here
|
||||||
|
TARBELL:EQU 0
|
||||||
|
CROMEMCO:EQU 1
|
||||||
|
|
||||||
|
; For either disk controller, a custom drive table may be defined
|
||||||
|
CUSTOM: EQU 0
|
||||||
|
|
||||||
|
; If Tarbell disk controller, select one-sided or two-sided drives
|
||||||
|
; and single or double density controller
|
||||||
|
DOUB1SIDE:EQU 0
|
||||||
|
DOUB2SIDE:EQU 0
|
||||||
|
SNGL1SIDE:EQU 0
|
||||||
|
|
||||||
|
; If Cromemco disk controller, select drive configuration
|
||||||
|
SMALLCRO:EQU 0 ;3 small drives
|
||||||
|
COMBCRO:EQU 1 ;2 large drives and 1 small one
|
||||||
|
LARGECRO:EQU 0 ;4 large drives
|
||||||
|
|
||||||
|
WD1791: EQU DOUB1SIDE+DOUB2SIDE
|
||||||
|
WD1771: EQU CROMEMCO+SNGL1SIDE
|
||||||
|
|
||||||
|
IF WD1791
|
||||||
|
READCOM:EQU 80H
|
||||||
|
WRITECOM:EQU 0A0H
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IF WD1771
|
||||||
|
READCOM:EQU 88H
|
||||||
|
WRITECOM:EQU 0A8H
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IF TARBELL
|
||||||
|
DONEBIT:EQU 80H
|
||||||
|
DISK: EQU 78H
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IF CROMEMCO
|
||||||
|
DONEBIT:EQU 1
|
||||||
|
DISK: EQU 30H
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
DOSSEG: EQU 80H
|
||||||
|
|
||||||
|
ORG 0
|
||||||
|
PUT 100H
|
||||||
|
|
||||||
|
BASE: EQU 0F0H
|
||||||
|
STAT: EQU BASE+7
|
||||||
|
DAV: EQU 2
|
||||||
|
TBMT: EQU 1
|
||||||
|
DATA: EQU BASE+6
|
||||||
|
PSTAT: EQU BASE+0DH
|
||||||
|
PDATA: EQU BASE+0CH
|
||||||
|
|
||||||
|
JMP INIT
|
||||||
|
JMP STATUS
|
||||||
|
JMP INP
|
||||||
|
JMP OUTP
|
||||||
|
JMP PRINT
|
||||||
|
JMP AUXIN
|
||||||
|
JMP AUXOUT
|
||||||
|
JMP READ
|
||||||
|
JMP WRITE
|
||||||
|
JMP RETL ;Flush buffers
|
||||||
|
|
||||||
|
INIT:
|
||||||
|
MOV AX,CS
|
||||||
|
MOV DS,AX
|
||||||
|
MOV SS,AX
|
||||||
|
MOV SP,STACK
|
||||||
|
MOV SI,INITTAB
|
||||||
|
CALL 0,DOSSEG
|
||||||
|
MOV DX,100H
|
||||||
|
MOV AH,26 ;Set DMA address
|
||||||
|
INT 21H
|
||||||
|
MOV BX,DS
|
||||||
|
MOV AX,CS
|
||||||
|
MOV DS,AX
|
||||||
|
MOV DX,FCB
|
||||||
|
MOV AH,15
|
||||||
|
INT 21H
|
||||||
|
OR AL,AL
|
||||||
|
JNZ COMERR
|
||||||
|
MOV [FCB+33],0
|
||||||
|
MOV CX,200H
|
||||||
|
MOV AH,39 ;Load file
|
||||||
|
INT 21H
|
||||||
|
JCXZ COMERR
|
||||||
|
CMP AL,1
|
||||||
|
JNZ COMERR
|
||||||
|
MOV DS,BX
|
||||||
|
MOV ES,BX
|
||||||
|
MOV SS,BX
|
||||||
|
MOV SP,40H
|
||||||
|
XOR AX,AX
|
||||||
|
PUSH AX
|
||||||
|
MOV DX,80H
|
||||||
|
MOV AH,26
|
||||||
|
INT 21H
|
||||||
|
PUSH BX
|
||||||
|
MOV AX,100H
|
||||||
|
PUSH AX
|
||||||
|
RET L
|
||||||
|
COMERR:
|
||||||
|
MOV DX,BADCOM
|
||||||
|
MOV AH,9 ;Print string
|
||||||
|
INT 21H
|
||||||
|
EI
|
||||||
|
STALL: JP STALL
|
||||||
|
|
||||||
|
BADCOM: DB 13,10,"Bad or missing Command Interpreter",13,10,"$"
|
||||||
|
FCB: DB 1,"COMMAND COM"
|
||||||
|
DS 24
|
||||||
|
|
||||||
|
STATUS:
|
||||||
|
IN STAT
|
||||||
|
AND AL,DAV
|
||||||
|
RET L
|
||||||
|
|
||||||
|
AUXIN:
|
||||||
|
INP:
|
||||||
|
IN STAT
|
||||||
|
AND AL,DAV
|
||||||
|
JZ INP
|
||||||
|
IN DATA
|
||||||
|
AND AL,7FH
|
||||||
|
RET L
|
||||||
|
|
||||||
|
AUXOUT:
|
||||||
|
OUTP:
|
||||||
|
PUSH AX
|
||||||
|
OUTLP:
|
||||||
|
IN STAT
|
||||||
|
AND AL,TBMT
|
||||||
|
JZ OUTLP
|
||||||
|
POP AX
|
||||||
|
OUT DATA
|
||||||
|
RET L
|
||||||
|
|
||||||
|
PRINT:
|
||||||
|
PUSH AX
|
||||||
|
PRINLP:
|
||||||
|
IN PSTAT
|
||||||
|
AND AL,TBMT
|
||||||
|
JZ PRINLP
|
||||||
|
POP AX
|
||||||
|
OUT PDATA
|
||||||
|
RET L
|
||||||
|
|
||||||
|
READ:
|
||||||
|
CALL SEEK
|
||||||
|
RDLP:
|
||||||
|
PUSH CX
|
||||||
|
CALL READSECT
|
||||||
|
POP CX
|
||||||
|
JC ERROR
|
||||||
|
INC DH
|
||||||
|
ADD SI,128
|
||||||
|
LOOP RDLP
|
||||||
|
OR AL,AL
|
||||||
|
RETL: RET L
|
||||||
|
|
||||||
|
WRITE:
|
||||||
|
CALL SEEK
|
||||||
|
WRTLP:
|
||||||
|
PUSH CX
|
||||||
|
CALL WRITESECT
|
||||||
|
POP CX
|
||||||
|
JC ERROR
|
||||||
|
INC DH
|
||||||
|
ADD SI,128
|
||||||
|
LOOP WRTLP
|
||||||
|
OR AL,AL
|
||||||
|
RET L
|
||||||
|
|
||||||
|
ERROR:
|
||||||
|
SEG CS
|
||||||
|
MOV B,[DI],-1
|
||||||
|
RET L
|
||||||
|
|
||||||
|
SEEK:
|
||||||
|
|
||||||
|
; Inputs:
|
||||||
|
; AL = Drive number
|
||||||
|
; BX = Disk transfer address in DS
|
||||||
|
; CX = Number of sectors to transfer
|
||||||
|
; DX = Logical record number of transfer
|
||||||
|
; Function:
|
||||||
|
; Seeks to proper track.
|
||||||
|
; Outputs:
|
||||||
|
; AH = Drive select byte
|
||||||
|
; DL = Track number
|
||||||
|
; DH = Sector number
|
||||||
|
; SI = Disk transfer address in DS
|
||||||
|
; DI = pointer to drive's track counter in CS
|
||||||
|
; CX unchanged.
|
||||||
|
|
||||||
|
MOV SI,BX ; Save transfer address
|
||||||
|
CBW
|
||||||
|
MOV BX,AX ; Prepare to index on drive number
|
||||||
|
SEG CS
|
||||||
|
MOV AL,[BX+DRVTAB]
|
||||||
|
OUT DISK+4 ; Select drive
|
||||||
|
|
||||||
|
IF CROMEMCO
|
||||||
|
OR AL,80H ;Set auto-wait bit
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
MOV AH,AL ;Save for later
|
||||||
|
XCHG AX,DX
|
||||||
|
MOV DL,26 ;26 sectors per track
|
||||||
|
|
||||||
|
IF CROMEMCO
|
||||||
|
TEST DH,10H ;Check if small disk
|
||||||
|
JNZ BIGONE
|
||||||
|
MOV DL,18 ;18 sectors on small disk track
|
||||||
|
BIGONE:
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
DIV AL,DL ;Compute track and sector
|
||||||
|
XCHG AX,DX
|
||||||
|
INC DH ;First sector is 1, not zero
|
||||||
|
SEG CS
|
||||||
|
MOV BL,[BX+TRKPT] ;Get this drive's displacement into track table
|
||||||
|
ADD BX,TRKTAB ;BX now points to track counter for this drive
|
||||||
|
MOV DI,BX
|
||||||
|
MOV AL,DL
|
||||||
|
SEG CS
|
||||||
|
XCHG AL,[DI] ;Xchange current track with desired track
|
||||||
|
OUT DISK+1 ;Inform controller chip of current track
|
||||||
|
CMP AL,DL
|
||||||
|
JZ ONTRK
|
||||||
|
MOV BH,3 ;Seek retry count
|
||||||
|
CMP AL,-1 ;Head position known?
|
||||||
|
JNZ NOHOME ;If not, home head
|
||||||
|
TRYSK:
|
||||||
|
CALL HOME
|
||||||
|
NOHOME:
|
||||||
|
MOV AL,DL
|
||||||
|
OUT DISK+3
|
||||||
|
MOV AL,1CH
|
||||||
|
CALL MOVHEAD
|
||||||
|
AND AL,98H
|
||||||
|
JZ ONTRK
|
||||||
|
DEC BH
|
||||||
|
JNZ TRYSK
|
||||||
|
STC
|
||||||
|
ONTRK:
|
||||||
|
RET
|
||||||
|
|
||||||
|
SETUP:
|
||||||
|
|
||||||
|
IF CROMEMCO
|
||||||
|
TEST AH,10H ;Check for small disk
|
||||||
|
JNZ CHKSTP
|
||||||
|
CMP DH,18 ;Only 18 sectors/track on small ones
|
||||||
|
JA STEP
|
||||||
|
CHKSTP:
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
CMP DH,26 ;Check for overflow onto next track
|
||||||
|
JBE PUTSEC
|
||||||
|
STEP:
|
||||||
|
INC DL
|
||||||
|
MOV DH,1
|
||||||
|
MOV AL,58H ;Step in with update, no verify
|
||||||
|
CALL DCOM
|
||||||
|
SEG CS
|
||||||
|
INC B,[DI] ;Update track counter
|
||||||
|
PUTSEC:
|
||||||
|
MOV AL,DH
|
||||||
|
OUT DISK+2
|
||||||
|
MOV CX,80H
|
||||||
|
|
||||||
|
IF TARBELL
|
||||||
|
INB DISK ;Get head load bit
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IF CROMEMCO
|
||||||
|
INB DISK+4 ;Get head load bit
|
||||||
|
XCHG AL,AH
|
||||||
|
OUTB DISK+4 ;Turn on auto-wait
|
||||||
|
XCHG AL,AH
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
NOT AL
|
||||||
|
AND AL,20H ;Check head load status
|
||||||
|
JZ CHKDRV
|
||||||
|
MOV AL,4
|
||||||
|
CHKDRV:
|
||||||
|
; Turn on 15ms head load delay if selecting a different drive
|
||||||
|
SEG CS
|
||||||
|
CMP AH,[CURDRV]
|
||||||
|
SEG CS
|
||||||
|
MOV [CURDRV],AH
|
||||||
|
JZ RET
|
||||||
|
OR AL,4
|
||||||
|
RET
|
||||||
|
|
||||||
|
READSECT:
|
||||||
|
CALL SETUP
|
||||||
|
JC RET
|
||||||
|
MOV BL,10
|
||||||
|
RDAGN:
|
||||||
|
OR AL,READCOM
|
||||||
|
OUT DISK
|
||||||
|
PUSH SI
|
||||||
|
RLOOP:
|
||||||
|
IN DISK+4
|
||||||
|
TEST AL,DONEBIT
|
||||||
|
|
||||||
|
IF TARBELL
|
||||||
|
JZ RDONE
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IF CROMEMCO
|
||||||
|
JNZ RDONE
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IN DISK+3
|
||||||
|
MOV [SI],AL
|
||||||
|
INC SI
|
||||||
|
LOOP RLOOP
|
||||||
|
RDONE:
|
||||||
|
POP SI
|
||||||
|
CALL GETSTAT
|
||||||
|
AND AL,9CH
|
||||||
|
JZ RET
|
||||||
|
MOV AL,0
|
||||||
|
DEC BL
|
||||||
|
JNZ RDAGN
|
||||||
|
STC
|
||||||
|
RET
|
||||||
|
|
||||||
|
WRITESECT:
|
||||||
|
CALL SETUP
|
||||||
|
JC RET
|
||||||
|
MOV BL,10
|
||||||
|
WRTAGN:
|
||||||
|
OR AL,WRITECOM
|
||||||
|
OUT DISK
|
||||||
|
PUSH SI
|
||||||
|
WRLOOP:
|
||||||
|
IN DISK+4
|
||||||
|
TEST AL,DONEBIT
|
||||||
|
|
||||||
|
IF TARBELL
|
||||||
|
JZ WRDONE
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IF CROMEMCO
|
||||||
|
JNZ WRDONE
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
LODB
|
||||||
|
OUT DISK+3
|
||||||
|
LOOP WRLOOP
|
||||||
|
WRDONE:
|
||||||
|
POP SI
|
||||||
|
CALL GETSTAT
|
||||||
|
AND AL,09CH
|
||||||
|
JZ RET
|
||||||
|
MOV AL,0
|
||||||
|
DEC BL
|
||||||
|
JNZ WRTAGN
|
||||||
|
STC
|
||||||
|
RET
|
||||||
|
|
||||||
|
HOME:
|
||||||
|
IF CROMEMCO
|
||||||
|
TEST AH,10H ;Check seek speed bit
|
||||||
|
JNZ RESTORE
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
MOV BL,3
|
||||||
|
TRYHOM:
|
||||||
|
MOV AL,0CH
|
||||||
|
CALL DCOM
|
||||||
|
AND AL,98H
|
||||||
|
JZ RET
|
||||||
|
MOV AL,58H ;Step in with update
|
||||||
|
CALL DCOM
|
||||||
|
DEC BL
|
||||||
|
JNZ TRYHOM
|
||||||
|
RET
|
||||||
|
|
||||||
|
MOVHEAD:
|
||||||
|
IF CROMEMCO
|
||||||
|
TEST AH,10H ;Check seek speed bit
|
||||||
|
JNZ FASTSK
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
DCOM:
|
||||||
|
OUT DISK
|
||||||
|
MOV AL,50
|
||||||
|
DELAY:
|
||||||
|
DEC AL ;Delay 10 microseconds
|
||||||
|
JNZ DELAY
|
||||||
|
GETSTAT:
|
||||||
|
IN DISK+4
|
||||||
|
TEST AL,DONEBIT
|
||||||
|
|
||||||
|
IF TARBELL
|
||||||
|
JNZ GETSTAT
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IF CROMEMCO
|
||||||
|
JZ GETSTAT
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IN DISK
|
||||||
|
RET
|
||||||
|
|
||||||
|
IF CROMEMCO
|
||||||
|
RESTORE:
|
||||||
|
MOV AL,0C4H ;READ ADDRESS command to keep head loaded
|
||||||
|
OUT DISK
|
||||||
|
MOV AL,77H
|
||||||
|
OUT 4
|
||||||
|
CHKRES:
|
||||||
|
IN 4
|
||||||
|
AND AL,40H
|
||||||
|
JZ RESDONE
|
||||||
|
IN DISK+4
|
||||||
|
TEST AL,DONEBIT
|
||||||
|
JZ CHKRES
|
||||||
|
IN DISK
|
||||||
|
JP RESTORE ;Reload head
|
||||||
|
RESDONE:
|
||||||
|
MOV AL,7FH
|
||||||
|
OUT 4
|
||||||
|
CALL GETSTAT
|
||||||
|
MOV AL,0
|
||||||
|
OUT DISK+1 ;Tell 1771 we're now on track 0
|
||||||
|
RET
|
||||||
|
|
||||||
|
FASTSK:
|
||||||
|
MOV AL,6FH
|
||||||
|
OUT 4
|
||||||
|
MOV AL,18H
|
||||||
|
CALL DCOM
|
||||||
|
SKWAIT:
|
||||||
|
IN 4
|
||||||
|
TEST AL,40H
|
||||||
|
JNZ SKWAIT
|
||||||
|
MOV AL,7FH
|
||||||
|
OUT 4
|
||||||
|
MOV AL,0
|
||||||
|
RET
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
DS 20H
|
||||||
|
STACK:
|
||||||
|
|
||||||
|
LFAT: EQU 300H
|
||||||
|
SFAT: EQU 200H
|
||||||
|
|
||||||
|
CURDRV: DS 1
|
||||||
|
|
||||||
|
LDRIVE:
|
||||||
|
DB 1 ;Records/sector
|
||||||
|
DB 4 ;Records/cluster
|
||||||
|
DW 52 ;Reserved records
|
||||||
|
DB 6 ;FAT size (records)
|
||||||
|
DB 2 ;Number of FATs
|
||||||
|
DB 8 ;Number of directory records
|
||||||
|
DW 482 ;Number of clusters on drive
|
||||||
|
|
||||||
|
SDRIVE:
|
||||||
|
DB 1
|
||||||
|
DB 2
|
||||||
|
DW 54
|
||||||
|
DB 4
|
||||||
|
DB 2
|
||||||
|
DB 8
|
||||||
|
DW 330
|
||||||
|
|
||||||
|
IF DOUB1SIDE
|
||||||
|
DRVTAB: DB 0,10H,20H,30H
|
||||||
|
TRKPT: DB 0,1,2,3
|
||||||
|
TRKTAB: DB -1,-1,-1,-1
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IF DOUB2SIDE
|
||||||
|
DRVTAB: DB 0,40H,10H,50H
|
||||||
|
TRKPT: DB 0,0,1,1
|
||||||
|
TRKTAB: DB -1,-1
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IF SNGL1SIDE
|
||||||
|
DRVTAB: DB 0F2H,0E2H,0D2H,0C0H
|
||||||
|
TRKPT: DB 0,1,2,3
|
||||||
|
TRKTAB: DB -1,-1,-1,-1
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IF TARBELL
|
||||||
|
INITTAB:DB 4 ;Number of drives
|
||||||
|
DW LDRIVE
|
||||||
|
DW FAT0
|
||||||
|
DW LDRIVE
|
||||||
|
DW FAT1
|
||||||
|
DW LDRIVE
|
||||||
|
DW FAT2
|
||||||
|
DW LDRIVE
|
||||||
|
DW FAT3
|
||||||
|
|
||||||
|
ORG 0
|
||||||
|
FAT0: DS LFAT
|
||||||
|
FAT1: DS LFAT
|
||||||
|
FAT2: DS LFAT
|
||||||
|
FAT3: DS LFAT
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
; Cromemco drive select byte is derived as follows:
|
||||||
|
; Bit 7 = 0
|
||||||
|
; Bit 6 = 1 if fast seek (PerSci)
|
||||||
|
; Bit 5 = 1 (motor on)
|
||||||
|
; Bit 4 = 0 for 5", 1 for 8" drives
|
||||||
|
; Bit 3 = 1 for drive 3
|
||||||
|
; Bit 2 = 1 for drive 2
|
||||||
|
; Bit 1 = 1 for drive 1
|
||||||
|
; Bit 0 = 1 for drive 0
|
||||||
|
|
||||||
|
IF LARGECRO
|
||||||
|
; Table for four large drives
|
||||||
|
DRVTAB: DB 31H,32H,34H,38H
|
||||||
|
TRKPT: DB 0,0,1,1
|
||||||
|
TRKTAB: DB -1,-1
|
||||||
|
INITTAB:DB 4 ;Number of drives
|
||||||
|
DW LDRIVE
|
||||||
|
DW FAT0
|
||||||
|
DW LDRIVE
|
||||||
|
DW FAT1
|
||||||
|
DW LDRIVE
|
||||||
|
DW FAT2
|
||||||
|
DW LDRIVE
|
||||||
|
DW FAT3
|
||||||
|
|
||||||
|
ORG 0
|
||||||
|
FAT0: DS LFAT
|
||||||
|
FAT1: DS LFAT
|
||||||
|
FAT2: DS LFAT
|
||||||
|
FAT3: DS LFAT
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IF COMBCRO
|
||||||
|
; Table for two large drives and one small one
|
||||||
|
DRVTAB: DB 31H,32H,24H
|
||||||
|
TRKPT: DB 0,0,1
|
||||||
|
TRKTAB: DB -1,-1
|
||||||
|
INITTAB:DB 3 ;Number of drives
|
||||||
|
DW LDRIVE
|
||||||
|
DW FAT0
|
||||||
|
DW LDRIVE
|
||||||
|
DW FAT1
|
||||||
|
DW SDRIVE
|
||||||
|
DW FAT2
|
||||||
|
|
||||||
|
ORG 0
|
||||||
|
FAT0: DS LFAT
|
||||||
|
FAT1: DS LFAT
|
||||||
|
FAT2: DS SFAT
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IF SMALLCRO
|
||||||
|
; Table for 3 small drives
|
||||||
|
DRVTAB: DB 21H,22H,24H
|
||||||
|
TRKPT: DB 0,1,2
|
||||||
|
TRKTAB: DB -1,-1,-1
|
||||||
|
INITTAB:DB 3
|
||||||
|
DW SDRIVE
|
||||||
|
DW FAT0
|
||||||
|
DW SDRIVE
|
||||||
|
DW FAT1
|
||||||
|
DW SDRIVE
|
||||||
|
DW FAT2
|
||||||
|
|
||||||
|
ORG 0
|
||||||
|
FAT0: DS SFAT
|
||||||
|
FAT1: DS SFAT
|
||||||
|
FAT2: DS SFAT
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
IF CUSTOM
|
||||||
|
; Table for 2 large drives without fast seek
|
||||||
|
DRVTAB: DB 31H,32H
|
||||||
|
TRKPT: DB 0,1
|
||||||
|
TRKTAB: DB -1,-1
|
||||||
|
|
||||||
|
INITTAB:DB 2
|
||||||
|
DW LDRIVE
|
||||||
|
DW FAT0
|
||||||
|
DW LDRIVE
|
||||||
|
DW FAT1
|
||||||
|
|
||||||
|
ORG 0
|
||||||
|
FAT0: DS LFAT
|
||||||
|
FAT1: DS LFAT
|
||||||
|
ENDIF
|
||||||
|
|
||||||
Reference in New Issue
Block a user