Estex-DSS/DSS/Media_drivers/fdd-drv.asm
Anatoliy Belyanskiy 4fd82287e9 ...
2024-03-31 05:10:52 +10:00

368 lines
6.8 KiB
NASM
Raw Blame History

; Disk Driver Specification ver. 2.00
;[]===========================================================[0]
;Procedure : Initialization
;
;Function : Initialization device(s)
;
;Input : C = 00h
; IX - Environment
;Output : A = Amount drive support
; HL = Size driver
;[]===========================================================[]
;[]===========================================================[1]
;Procedure : Open
;
;Function : Open disk
;
;Input : C = 01h
; A - Drive
;Output : None
;
;[]===========================================================[]
;[]===========================================================[2]
;Procedure : Close
;
;Function : Close disk
;
;Input : C = 02h
; A - Drive
;Output : None
;
;[]===========================================================[]
;[]===========================================================[3]
;Procedure : Media check
;
;Function : Checking change line
;
;Input : C = 03h
; A - Drive
;Output : A = 00h disk no changed
; A = 0FFh disk changed
;
;[]===========================================================[]
;[]===========================================================[4]
;Procedure : Get BPB
;
;Function : Get Block Parameters BIOS
;
;Input : C = 04h
; DE - Address
;Output : None
;
;[]===========================================================[]
;[]===========================================================[5]
;Procedure : Input
;
;Function : Input from disk
;
;Input : C = 05h
; HL:IX - Logical Block (sector)
; DE - Address
; B - Sector count
;Output : None
;
;[]===========================================================[]
;[]===========================================================[6]
;Procedure : Output
;
;Function : Output to disk
;
;Input : C = 06h
; HL:IX - Logical Block (sector)
; DE - Address
; B - Sector count
;Output : None
;
;[]===========================================================[]
;[]===========================================================[7]
;Procedure : Removable
;
;Function : Checking change line
;
;Input : C = 07h
; A - Drive
;Output : A = 00h Removable
; A = FFh Nonremovable
;
;[]===========================================================[]
;[]===========================================================[8]
;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
;-------------------------------------------------
; <20><><EFBFBD><E0A0A1>稪 FDD (rst 18h)
;-------------------------------------------------
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,BIOS.DRV_RESET
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,1*256 + BIOS.DRV_READ
RST ToBIOS
POP DE
POP HL
RET C
LD BC,#0018
ADD HL,BC
LD E,(HL)
PUSH DE
LD A,D
LD C,BIOS.DRV_GET_PAR
RST ToBIOS
LD A,H
POP HL
PUSH HL
LD H,A
POP AF
LD C,BIOS.DRV_SET_PAR
RST ToBIOS
XOR A
RET
;READTR:
XOR A
RET
.READD: LD C,BIOS.DRV_READ
RST ToBIOS
RET
.WRITED:
LD C,BIOS.DRV_WRITE
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
; C - PARTITION RECORD NUMBER IN DRIVE MBR must be 0 here ;[x] 17.12.2023 <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><E2A8A2><EFBFBD><EFBFBD><><E0A0A7><EFBFBD><EFBFBD>, <20> <20><> <20> <20><><EFBFBD><E0A2AE>
; 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,BIOS.DRV_GET_PAR
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
LD C,0 ;[x] 17.12.2023 <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><E2A8A2><EFBFBD><EFBFBD><><E0A0A7><EFBFBD><EFBFBD>, <20> <20><> <20> <20><><EFBFBD><E0A2AE>
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,BIOS.DRV_GET_PAR
RST ToBIOS
POP DE
POP HL
JR C,.NONEF
POP AF
LD C,BIOS.DRV_SET_PAR
RST ToBIOS
RET C
AND A
RET
.REMOV_F:
LD A,1
AND A
RET
;==============================================