Estex-DSS/DSS/FDD_DRV0.ASM
Anatoliy Belyanskiy 91774c8b23 Initial commit
Estex DSS
2023-06-14 19:09:19 +10:00

367 lines
6.4 KiB
NASM
Raw Blame History

; Disk Driver Specification ver. 2.00
;[]===========================================================[]
;Procedure : Initialization
;
;Function : Initialization device(s)
;
;Input : C = 00h
; IX - Environment
;Output : A = Amount drive support
; HL = Size driver
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Open
;
;Function : Open disk
;
;Input : C = 01h
; A - Drive
;Output : None
;
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Close
;
;Function : Close disk
;
;Input : C = 02h
; A - Drive
;Output : None
;
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Media check
;
;Function : Checking change line
;
;Input : C = 03h
; A - Drive
;Output : A = 00h disk no changed
; A = 0FFh disk changed
;
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Get BPB
;
;Function : Get Block Parameters BIOS
;
;Input : C = 04h
; DE - Address
;Output : None
;
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Input
;
;Function : Input from disk
;
;Input : C = 05h
; HL:IX - Logical Block (sector)
; DE - Address
; B - Sector count
;Output : None
;
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Output
;
;Function : Output to disk
;
;Input : C = 06h
; HL:IX - Logical Block (sector)
; DE - Address
; B - Sector count
;Output : None
;
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Removable
;
;Function : Checking change line
;
;Input : C = 07h
; A - Drive
;Output : A = 00h Removable
; A = FFh Nonremovable
;
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Generic IOCTL
;
;Function : Generic Input Output Control
;
;Input : C = 08h
; B - Subcommand
; DE = 55AAh Magic Number
; Subcommand
;----------------------
; 00h - Get Device Parameters
; 01h - Read track
; 02h - Test track
; 80h - Set Device Parameters
; 81h - Write track
; 82h - Format track
;Output :
;
;[]===========================================================[]
;
; Errors:
; 0 (00h) - NO ERRORS
; 1 (01h) - BAD COMMAND
; 2 (02h) - BAD DRIVE NUMBER
; 3 (03h) - UNKNOW FORMAT
; 4 (04h) - NOT READY
; 5 (05h) - SEEK ERROR
; 6 (06h) - SECTOR NOT FOUND
; 7 (07h) - CRC ERROR
; 8 (08h) - WRITE PROTECT
; 9 (09h) - READ ERROR
; 10 (0Ah) - WRITE ERROR
; 11 (0Bh) - FAILURE
; 12 (0Ch) - BUSY (DEVICE OPENED)
; 13 (0Dh) - RESERVED
R_COM EQU #0F ;Command/Status
R_TRK EQU #3F ;Track
R_SEC EQU #5F ;Sector
R_DAT EQU #7F ;Data
R_DSK EQU #FF ;Drive Control
COM_B EQU #1B
FDDRIVE:
INC C
DEC C
JP Z,.INIT ;#00
DEC C
JP Z,.RESE ;#01
DEC C
JP Z,.STAT ;#02
DEC C
JP Z,.CHEK ;#03
DEC C
JP Z,.GBPB ;#04
DEC C
JP Z,.READD ;#05
DEC C
JP Z,.WRITED ;#06
DEC C
JP Z,.REMOV_F ;#07
DEC C
JP Z,.IOCTL_F ;#08
DEC C
JP Z,.RESRV_F ;#09
.RESRV_F:
LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
;Commands for restart #18
.INIT: LD A,2 ;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⢮ FDD <20> <20><><EFBFBD><EFBFBD><EFBFBD> ;!FIXIT <20> <20><20><EFBFBD><E2AAAB><EFBFBD> <20> <20><><EFBFBD><EFBFBD>?
AND A
RET
.RESE: LD C,#51
RST ToBIOS
RET
.STAT: XOR A
RET
;!FIXIT <20><EFBFBD><E0AEA2><EFBFBD><EFBFBD><EFBFBD> <20><>93 <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><EFBFBD><E2A0AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
.CHEK: LD A,#FF
AND A
RET
;DE - ADDRESS
.GBPB: LD IX,0
LD HL,0
PUSH DE
PUSH AF
LD BC,#0155
RST ToBIOS
POP DE
POP HL
RET C
LD BC,#0018
ADD HL,BC
LD E,(HL)
PUSH DE
LD A,D
LD C,#58
RST ToBIOS
LD A,H
POP HL
PUSH HL
LD H,A
POP AF
LD C,#59
RST ToBIOS
XOR A
RET
;READTR:
XOR A
RET
.READD: LD C,#55
RST ToBIOS
RET
.WRITED:
LD C,#56
RST ToBIOS
RET
; 00 - GET DEVICE PARAMETERS
; 01 - READ TRACK
; 02 - TEST TRACK
; 80 - SET DEVICE PARAMETERS
; 81 - WRITE TRACK
; 82 - FORMAT TRACK
.IOCTL_F:
BIT 7,B
JR NZ,.O_CTL_F
INC B
DEC B
JP Z,.FGETPRM
; DEC B
; JP Z,FRDTRAC
; DEC B
; JP Z,FCHTRAC
LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
.O_CTL_F:
RES 7,B
INC B
DEC B
JP Z,.FSETPRM
; DEC B
; JP Z,FWRTRAC
; DEC B
; JP Z,FFRTRAC
LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
; HL:DE - SECTORS ON LOGICAL DISK
; HL' - CYLINDERS ON PHISICAL DISK
; DE' - HEADS ON PHISICAL DISK
; BC' - SECTORS PER TRACK ON PHISICAL DISK
; A' - PHISICAL DRIVE NUMBER
; A - EXTENDED INFORMATION
; D0...D3 - "0" RESERVED (MAY BE OTHER)
; D4 - DEVICE MASTER/SLAVE
; D5 - "1" RESERVED
; D6 - ADDRESSING MODE LBA/CHS
; D7 - "1" RESERVED
.FGETPRM:
EX DE,HL
LD BC,#55AA
AND A
SBC HL,BC
LD L,A
LD A,DSS_Error.drv.GENERAL_FAILURE
SCF
RET NZ
LD A,L
AND #0F
PUSH AF
LD C,#58
RST ToBIOS
JR C,.NONEF
PUSH HL
PUSH DE
LD A,H
LD H,0
.MULL1 ADD HL,HL
DEC A
JR NZ,.MULL1
; HL - SECTOR PER CYLLINDER
LD B,H
LD C,L
LD HL,0
EX AF,AF'
XOR A
.MULL2 EX AF,AF'
ADD HL,BC
ADC A,0
DEC DE
EX AF,AF'
LD A,D
OR E
JR NZ,.MULL2
EX AF,AF'
LD E,A
EX DE,HL
EXX
POP DE
POP HL
POP AF
EX AF,AF'
LD A,B
LD C,L
LD B,0
LD L,H
LD H,B
EX DE,HL
EXX
AND A
RET
.NONEF POP AF
LD A,DSS_Error.drv.INVALID_DRIVE
SCF
RET
; HL:DE - SECTORS ON LOGICAL DISK
; HL' - CYLINDERS ON PHISICAL DISK
; DE' - HEADS ON PHISICAL DISK
; BC' - SECTORS PER TRACK ON PHISICAL DISK
; A' - EXTENDED INFORMATION
; D0...D3 - "0" RESERVED (MAY BE OTHER)
; D4 - DEVICE MASTER/SLAVE
; D5 - "1" RESERVED
; D6 - ADDRESSING MODE LBA/CHS
; D7 - "1" RESERVED
.FSETPRM:
PUSH AF
EXX
EX DE,HL
LD H,L
LD L,C
POP AF
AND #0F
PUSH AF
PUSH HL
PUSH DE
LD C,#58
RST ToBIOS
POP DE
POP HL
JR C,.NONEF
POP AF
LD C,#59
RST ToBIOS
RET C
AND A
RET
.REMOV_F:
LD A,1
AND A
RET
;==============================================