Estex-DSS/DSS/drivers/media/fdd-drv.asm
Tolik Trek 2835c7f34c ...
2026-04-26 20:53:06 +10:00

469 lines
9.0 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
; 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
////////////////////////////////////////////////////////////////////////
MODULE FDD_DRV
////////////////////////////////////////////////////////////////////////
;-------------------------------------------------
; <20><><EFBFBD><E0A0A1>稪 FDD (rst 18h)
;-------------------------------------------------
API_TABLE: INC C
DEC C
JP Z,Init ;#00 Init
DEC C
JP Z,Open ;#01 Open
DEC C
JP Z,Close ;#02 Close
DEC C
JP Z,MediaCheck ;#03 MediaCheck
DEC C
JP Z,GetBPB ;#04 GetBPB
DEC C
JP Z,Read ;#05 Read
DEC C
JP Z,Write ;#06 Write
DEC C
JP Z,Removable ;#07 Removable
DEC C
JP Z,GenIOCTL ;#08 GenIOCTL
DEC C
JP Z,Reserved ;#09
;
Reserved: LD A,BIOS.Error.InvalidSubFunction
SCF
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Commands for restart #18 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
Init: LD A,2 ;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⢮ FDD <20> <20><><EFBFBD><EFBFBD><EFBFBD>
AND A
RET
; ; ;
;
Open: PUSH IY
PUSH AF
LD C,BIOS.DRV_RESET
RST ToBIOS
POP BC
JR C,.error
;
LD A,B
LD C,BIOS.DRV_GET_PAR
RST ToBIOS
LD DE,-DSS_MAX_SECTOR_SIZE - 1 ; [ ] 15/04/25 <20><> <20><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E1A5AA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DSS_MAX_SECTOR_SIZE
; ZF = 0
LD A,BIOS.Error.UnknownDevice
OR A ; 㡨ࠥ<E3A1A8> ZF, <20><20><><EFBFBD><EFBFBD>
;
ADD IX,DE ; <20>᫨ ࠧ<><E0A0A7><EFBFBD><><E1A5AA><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD>
.error: POP IY
RET
; ; ;
;
Close: XOR A
RET
; ; ;
;!FIXIT <20><EFBFBD><E0AEA2><EFBFBD><EFBFBD><EFBFBD> <20><>93 <20><><EFBFBD><EFBFBD><EFBFBD> (<28>᫨) <20><><EFBFBD> <20><EFBFBD><E2A0AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MediaCheck: CALL Open
RET C
IF NON_REMOVABLE_FDD
XOR A
ELSE
LD A,#FF
OR A
ENDIF
RET
; ; ;
;DE - ADDRESS
GetBPB: PUSH IY
CALL .Start
POP IY
RET
;
.Start: LD IX,0
; fix bug 14/01/2026. <20><20><><EFBFBD> MBR, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
LD H,D
LD L,E
LD BC,BOOT_SECTOR.MBR_SIGNATURE
ADD HL,BC
LD (HL),C
;
LD HL,0
PUSH DE
PUSH AF
LD BC,1*256 + BIOS.DRV_READ
RST ToBIOS
POP DE
POP HL
RET C
;
LD BC,BOOT_SECTOR.SectorsPerTrack
ADD HL,BC
LD E,(HL)
; fix bug 14/01/2026. <20><20><><EFBFBD> MBR, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
LD BC,BOOT_SECTOR.MBR_SIGNATURE - BOOT_SECTOR.SectorsPerTrack
ADD HL,BC
LD C,(HL)
INC HL
LD B,(HL)
LD HL,#AA55
SBC HL,BC
LD A,DSS_Error.drv.UNKNOWN_FORMAT
SCF
RET NZ
;
PUSH DE ; D - drive, E - Sectors Per Track
LD A,D
LD C,BIOS.DRV_GET_PAR
RST ToBIOS
LD C,H ; C heads
POP HL ; H - drive, L - Sectors Per Track
LD A,H ; A - drive
LD H,C ; H - heads, L - Sectors Per Track
LD C,BIOS.DRV_SET_PAR
RST ToBIOS
XOR A
RET
; ; ;
; !TODO read track?
;READTR: XOR A
; RET
; ; ;
Read: PUSH IY
LD C,BIOS.DRV_READ
RST ToBIOS
POP IY
RET
; ; ;
Write: PUSH IY
LD C,BIOS.DRV_WRITE
RST ToBIOS
POP IY
RET
; ; ;
; 00 - GET DEVICE PARAMETERS
; 01 - READ TRACK
; 02 - TEST TRACK
; 80 - SET DEVICE PARAMETERS
; 81 - WRITE TRACK
; 82 - FORMAT TRACK
GenIOCTL: BIT 7,B
JR NZ,.O_CTL_F
INC B
DEC B
JP Z,.GetParams
;!TODO
;DEC B
;JP Z,.ReadTrack
;DEC B
;JP Z,.TestTRK
;
LD A,BIOS.Error.InvalidSubFunction
SCF
RET
;
.O_CTL_F: RES 7,B
INC B
DEC B
JP Z,.SetParams
;!TODO
;DEC B
;JP Z,.WriteTRK
;DEC B
;JP Z,.FormatTRK
;
LD A,BIOS.Error.InvalidSubFunction
SCF
RET
; ; ;
; <20>室: - A - Drive number
; <20><>室:
; HL:DE - SECTORS ON LOGICAL DISK
; C - PARTITION RECORD NUMBER IN DRIVE MBR. 0 for fdd ;[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
; D7 - "1" RESERVED
; D6 - ADDRESSING MODE LBA/CHS
; D5 - "1" RESERVED
; D4 - DEVICE MASTER/SLAVE
; D1..D3 - "0" RESERVED (MAY BE OTHER)
.GetParams: ;EX DE,HL
;LD BC,Dss.DRV.GenIOCTL.Enter
AND #0F
;SBC HL,BC
;JR Z,.next
;
;LD A,BIOS.Error.Failure
;SCF
;RET
;
.next: PUSH AF
PUSH IY
LD C,BIOS.DRV_GET_PAR
RST ToBIOS
POP IY
JR C,.NONE_FDD
;
PUSH HL
PUSH DE
LD A,H
LD C,L
LD HL,0
LD B,H
.mull_loop1: ADD HL,BC
DEC A
JR NZ,.mull_loop1
;
; HL - SECTORS PER CYLINDER
; A=0 ZF=0 CF=0
LD B,H
LD C,L
;LD HL,0
;XOR A
LD H,A
LD L,A
EX AF,AF'
;
.mull_loop2: EX AF,AF'
ADD HL,BC
ADC A,0
DEC DE
EX AF,AF'
LD A,D
OR E
JR NZ,.mull_loop2
;
; A=0 DE=0 ZF=0 CF=0
EX AF,AF'
LD E,A
EX DE,HL
; H=0
LD C,H ;[x] 17.12.2023 <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><E2A8A2><EFBFBD><EFBFBD><><E0A0A7><EFBFBD><EFBFBD>, <20> <20><> <20> <20><><EFBFBD><E0A2AE>
EXX
CALL DRIVES_DRIVER.CONVERT_SECTOR_SIZE
EXX
LD B,A ;[ ] 25/04/2026 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E9A5AD><><E0A0A7><EFBFBD><EFBFBD><><E1A5AA><EFBFBD><EFBFBD>
EXX
POP DE
POP HL
POP AF
EX AF,AF'
; A=0 ZF=0 CF=0
LD B,0
LD C,L
LD L,H
LD H,B
EX DE,HL
EXX
AND A
RET
;
.NONE_FDD: POP BC
LD A,BIOS.Error.BadNumber
; CF=1
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
.SetParams: PUSH IY
CALL .Start
POP IY
RET
;
.Start: 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,.NONE_FDD
POP AF
LD C,BIOS.DRV_SET_PAR
RST ToBIOS
RET
; ; ;
Removable: XOR A
INC A
RET
; ; ;
;==============================================
ENDMODULE ; FDD_DRV
////////////////////////////////////////////////////////////////////////