SprinterFirmware/DOS/fdd_drv0.asm
2024-05-27 11:03:22 +03:00

367 lines
6.0 KiB
NASM

; 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
JR Z,INIT ;#00
DEC C
JR Z,RESE ;#01
DEC C
JR Z,STAT ;#02
DEC C
JR Z,CHEK ;#03
DEC C
JR Z,GBPB ;#04
DEC C
JR Z,READD ;#05
DEC C
JR Z,WRITED ;#06
DEC C
JP Z,REMOV_F ;#07
DEC C
JR Z,IOCTL_F ;#08
LD A,1 ; TODO: NOOP?
SCF
RET
;Commands for restart #18
INIT
LD A,2
AND A
RET
RESE
LD C,#51
RST #08
RET
STAT
XOR A
RET
CHEK
LD A,#FF
AND A
RET
;DE - ADDRESS
GBPB
LD IX,0
LD HL,0
PUSH DE
PUSH AF
LD BC,#0155
RST #08
POP DE
POP HL
RET C
LD BC,#0018
ADD HL,BC
LD E,(HL)
PUSH DE
LD A,D
LD C,#58
RST #08
LD A,H
POP HL
PUSH HL
LD H,A
POP AF
LD C,#59
RST #08
XOR A
RET
;READTR
; XOR A
; RET
READD
LD C,#55
RST #08
RET
WRITED
LD C,#56
RST #08
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
JR Z,FGETPRM
LD A,1
SCF
RET
O_CTL_F
RES 7,B
INC B
DEC B
JR Z,FSETPRM
LD A,1
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,11
SCF
RET NZ
LD A,L
AND #0F
PUSH AF
LD C,#58
RST #08
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
EX AF,AF'
XOR A
LD L,A
LD H,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,2
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 #08
POP DE
POP HL
JR C,NONEF
POP AF
LD C,#59
RST #08
RET C
AND A
RET
REMOV_F
LD A,1
AND A
RET
;==============================================