mirror of
https://github.com/Tolik-Trek/Estex-DSS.git
synced 2026-06-15 09:21:47 +03:00
453 lines
8.8 KiB
NASM
453 lines
8.8 KiB
NASM
|
||
; 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
|
||
|
||
|
||
|
||
////////////////////////////////////////////////////////////////////////
|
||
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 AF
|
||
LD C,BIOS.DRV_RESET
|
||
RST ToBIOS
|
||
POP BC
|
||
RET C
|
||
;
|
||
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>
|
||
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: 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
|
||
; !TEST
|
||
;LD A,H ; A heads
|
||
;POP HL ; H - drive, L - Sectors Per Track
|
||
;PUSH HL
|
||
;LD H,A ; H - heads, L - Sectors Per Track
|
||
;POP AF ; A - drive
|
||
;
|
||
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: LD C,BIOS.DRV_READ
|
||
RST ToBIOS
|
||
RET
|
||
; ; ;
|
||
|
||
|
||
Write: 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
|
||
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,#55AA
|
||
AND #0F
|
||
SBC HL,BC
|
||
JR Z,.next
|
||
;
|
||
LD A,BIOS.Error.Failure
|
||
SCF
|
||
RET
|
||
;
|
||
.next: PUSH AF
|
||
LD C,BIOS.DRV_GET_PAR
|
||
RST ToBIOS
|
||
JR C,.NONE_FDD
|
||
PUSH HL
|
||
PUSH DE
|
||
LD A,H
|
||
LD H,0
|
||
;
|
||
.mull_loop1: ADD HL,HL
|
||
DEC A
|
||
JR NZ,.mull_loop1
|
||
;
|
||
; HL - SECTOR PER CYLLINDER
|
||
; 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
|
||
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 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
|
||
JP ToBIOS
|
||
; ; ;
|
||
|
||
|
||
Removable: XOR A
|
||
INC A
|
||
RET
|
||
; ; ;
|
||
|
||
;==============================================
|
||
|
||
ENDMODULE ; FDD_DRV
|
||
|
||
//////////////////////////////////////////////////////////////////////// |