mirror of
https://github.com/Tolik-Trek/Estex-DSS.git
synced 2026-06-15 09:21:47 +03:00
534 lines
11 KiB
NASM
534 lines
11 KiB
NASM
|
||
|
||
; SYSPAGE EQU #FE
|
||
; SLOT1 EQU #A2
|
||
; SLOT2 EQU #C2
|
||
; SLOT3 EQU #E2
|
||
|
||
; ORG #3CDB
|
||
; Disk Driver Specification ver. 2.20
|
||
;[]===========================================================[ 0]
|
||
;Procedure : Initialization
|
||
;
|
||
;Function : Initialization device(s)
|
||
;
|
||
;Input : C = 00h
|
||
; IX - Environment
|
||
;Output : A = Amount drive support
|
||
; HL = Size driver
|
||
;[]===========================================================[ 0]
|
||
|
||
|
||
;[]===========================================================[ 1]
|
||
;Procedure : Open
|
||
;
|
||
;Function : Open disk
|
||
;
|
||
;Input : C = 01h
|
||
; A - Drive
|
||
;Output : None
|
||
;
|
||
;[]===========================================================[ 1]
|
||
|
||
|
||
;[]===========================================================[ 2]
|
||
;Procedure : Close
|
||
;
|
||
;Function : Close disk
|
||
;
|
||
;Input : C = 02h
|
||
; A - Drive
|
||
;Output : None
|
||
;
|
||
;[]===========================================================[ 2]
|
||
|
||
|
||
;[]===========================================================[ 3]
|
||
;!TODO
|
||
;Procedure : Media check
|
||
;
|
||
;Function : Checking change line
|
||
;
|
||
;Input : C = 03h
|
||
; A - Drive
|
||
;Output : A = 00h disk no changed
|
||
; A = 0FFh disk changed
|
||
;
|
||
;[]===========================================================[ 3]
|
||
|
||
|
||
;[]===========================================================[ 4]
|
||
;Procedure : Get BPB
|
||
;
|
||
;Function : Get Block Parameters BIOS
|
||
;
|
||
;Input : C = 04h
|
||
; DE - Address
|
||
;Output : None
|
||
;
|
||
;[]===========================================================[ 4]
|
||
|
||
|
||
;[]===========================================================[ 5]
|
||
;Procedure : Input
|
||
;
|
||
;Function : Input from disk
|
||
;
|
||
;Input : C = 05h
|
||
; HL:IX - Logical Block (sector)
|
||
; DE - Address
|
||
; B - Sector count
|
||
;Output : None
|
||
;
|
||
;[]===========================================================[ 5]
|
||
|
||
|
||
;[]===========================================================[ 6]
|
||
;Procedure : Output
|
||
;
|
||
;Function : Output to disk
|
||
;
|
||
;Input : C = 06h
|
||
; HL:IX - Logical Block (sector)
|
||
; DE - Address
|
||
; B - Sector count
|
||
;Output : None
|
||
;
|
||
;[]===========================================================[ 6]
|
||
|
||
|
||
;[]===========================================================[ 7]
|
||
;!TODO
|
||
;Procedure : Removable
|
||
;
|
||
;Function : Checking change line
|
||
;
|
||
;Input : C = 07h
|
||
; A - Drive
|
||
;Output : A = 00h Removable
|
||
; A = FFh Nonremovable
|
||
;
|
||
;[]===========================================================[ 7]
|
||
|
||
|
||
;[]===========================================================[ 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 :
|
||
;
|
||
;[]===========================================================[ 8]
|
||
|
||
|
||
;[]===========================================================[ 9]
|
||
; RESERVED
|
||
;[]===========================================================[ 9]
|
||
|
||
|
||
;[]===========================================================[ 10]
|
||
;!TODO
|
||
;Procedure : Read Long
|
||
;
|
||
;Function : Reading sectors from disk
|
||
;
|
||
;Input : C = 0Ah
|
||
; HL:IX - Logical Block (sector)
|
||
; DE - Address
|
||
; B - Sector count
|
||
; A'- Page
|
||
;Output : A'- Next Page
|
||
; HL:IX - Next Logical Block (sector)
|
||
; DE - Next Address
|
||
;
|
||
;[]===========================================================[ 10]
|
||
|
||
|
||
;[]===========================================================[ 11]
|
||
;!TODO
|
||
;Procedure : Write Long
|
||
;
|
||
;Function : Writing sectors to disk
|
||
;
|
||
;Input : C = 0Bh
|
||
; HL:IX - Logical Block (sector)
|
||
; DE - Address
|
||
; B - Sector count
|
||
; A'- Page
|
||
;Output : A'- Next Page
|
||
; HL:IX - Next Logical Block (sector)
|
||
; DE - Next Address
|
||
;
|
||
;[]===========================================================[ 11]
|
||
;
|
||
; Errors: ;!FIXIT <20><><EFBFBD>ࠢ<EFBFBD><E0A0A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>祭<EFBFBD><E7A5AD>
|
||
; 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
|
||
|
||
|
||
; MACRO CALL GET_RAMDRV_NUM
|
||
; LD BC,DRIVES_DRIVER.RAMDTBL
|
||
; SLA A
|
||
; ADD A,C
|
||
; LD C,A
|
||
; LD A,0
|
||
; ADC A,B
|
||
; LD B,A
|
||
; INC BC
|
||
; LD A,(BC)
|
||
; OR #60 ;!HARDCODE ᤥ<><E1A4A5><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ࠧ<><E0A0A7><EFBFBD> <20><><EFBFBD>ன<EFBFBD><E0AEA9><EFBFBD> <20><>१ <20><>⪨
|
||
; ENDM
|
||
|
||
MODULE RAMDSK_DRV
|
||
|
||
; parser
|
||
API_TABLE: INC C
|
||
DEC C
|
||
JP Z,Init ; 0
|
||
DEC C
|
||
JR Z,Open ; 1
|
||
DEC C
|
||
JR Z,Close ; 2
|
||
DEC C
|
||
JR Z,MediaCheck ; 3
|
||
DEC C
|
||
JR Z,GetBPB ; 4
|
||
DEC C
|
||
JR Z,Read ; 5
|
||
DEC C
|
||
JR Z,Write ; 6
|
||
DEC C
|
||
JR Z,Removable ; 7
|
||
DEC C
|
||
JP Z,GenIOCTL ; 8
|
||
DEC C
|
||
JP Z,.error ; 9 RESR_H
|
||
DEC C
|
||
JP Z,ReadLong ; 10
|
||
DEC C
|
||
JP Z,WriteLong ; 11
|
||
;
|
||
.error: LD A,BIOS.Error.InvalidSubFunction
|
||
SCF
|
||
RET
|
||
|
||
;
|
||
Removable:
|
||
Open:
|
||
Close: XOR A
|
||
RET
|
||
;
|
||
|
||
;!FIXIT ᤥ<><E1A4A5><EFBFBD><EFBFBD> <20> SYS_PAGE <20><><EFBFBD> ࠬ<><E0A0AC><EFBFBD> <20><>६<EFBFBD><E0A5AC><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>㤠 <20><><EFBFBD>祭<EFBFBD><E7A5AD>
|
||
;!FIXIT <20><><EFBFBD>-<2D><> <20><>।<EFBFBD><E0A5A4><EFBFBD><EFBFBD><EFBFBD> ᬥ<><E1ACA5> RMD?
|
||
; [x] 18/08/2024 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쭮 <20> <20><><EFBFBD>᭮
|
||
MediaCheck: ;LD A,#FF
|
||
;AND A
|
||
XOR A
|
||
;
|
||
RET
|
||
|
||
;DE - ADDRESS
|
||
GetBPB: LD IX,0
|
||
LD HL,0
|
||
LD B,#01
|
||
;JP READ_RD
|
||
;READ SECTORS
|
||
; HL:IX - SECTOR
|
||
; DE - ADDRESS
|
||
; B - COUNT
|
||
; A - DRIVE
|
||
Read: PUSH BC
|
||
CALL GET_RAMDRV_NUM
|
||
POP BC
|
||
LD C,BIOS.DRV_READ
|
||
JP ToBIOS
|
||
; RST ToBIOS
|
||
; XOR A
|
||
; RET
|
||
ReadLong: PUSH BC
|
||
CALL GET_RAMDRV_NUM
|
||
POP BC
|
||
LD C,BIOS.DRV_READ_LONG
|
||
JP ToBIOS
|
||
; RST ToBIOS
|
||
; XOR A
|
||
; RET
|
||
|
||
;WRITE SECTORS
|
||
; HL:IX - SECTOR
|
||
; DE - ADDRESS
|
||
; B - COUNT
|
||
; A - DRIVE
|
||
Write: PUSH BC
|
||
CALL GET_RAMDRV_NUM
|
||
POP BC
|
||
LD C,BIOS.DRV_WRITE
|
||
JP ToBIOS
|
||
; RST ToBIOS
|
||
; XOR A
|
||
; RET
|
||
|
||
WriteLong: PUSH BC
|
||
CALL GET_RAMDRV_NUM
|
||
POP BC
|
||
LD C,BIOS.DRV_WRITE_LONG
|
||
JP ToBIOS
|
||
; RST ToBIOS
|
||
; XOR A
|
||
; RET
|
||
|
||
;
|
||
;;
|
||
;;;
|
||
;----------------------------------------------------------------------;!TEST
|
||
; ;S_P_P DB #00
|
||
; INIT_RD:
|
||
; ; .SectorSize EQU 512 ;!HARDCODE
|
||
; ; LD HL,.SectorSize
|
||
; ; LD A,#80
|
||
; ; .loop: SRL A
|
||
; ; RR H
|
||
; ; JR NC,.loop
|
||
; ; LD (S_P_P),A
|
||
|
||
; LD BC,#0*256 + BIOS.GET_RAMD_ST ; <20><><EFBFBD><EFBFBD>祭<EFBFBD><E7A5AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>䨪<EFBFBD><E4A8AA><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD>祭<EFBFBD><E7A5AD><EFBFBD><EFBFBD> <20><> RAM-Disk
|
||
; LD DE,DRIVES_DRIVER.RAMDTBL
|
||
; .initLoop:
|
||
; PUSH BC
|
||
; LD A,B
|
||
; PUSH DE
|
||
; RST ToBIOS
|
||
; POP DE
|
||
; OR A
|
||
; JR Z,.noDRV
|
||
|
||
; LD (DE),A
|
||
; INC DE
|
||
; POP BC
|
||
; LD A,B
|
||
; LD (DE),A
|
||
; INC DE
|
||
; JP 1F
|
||
; .noDRV: POP BC
|
||
; 1: INC B
|
||
; LD A,DRIVES_DRIVER.RAMDTBL.Size / RAMDTBL.TBL_Entry
|
||
; CP B
|
||
; JR NZ,.initLoop
|
||
|
||
; LD HL,DRIVES_DRIVER.RAMDTBL ;!FIXIT LD HL,-RAMDTBL
|
||
; EX DE,HL
|
||
; AND A ;!FIXIT ----
|
||
; SBC HL,DE ;!FIXIT ADD HL,DE
|
||
; SRL L
|
||
; LD A,L
|
||
; ; LD HL,ENDDRVR
|
||
; AND A
|
||
; RET
|
||
;----------------------------------------------------------------------;!TEST
|
||
;;;
|
||
;;
|
||
;
|
||
|
||
;
|
||
;;
|
||
;;;
|
||
;----------------------------------------------------------------------;!TEST
|
||
;S_P_P DB #00
|
||
Init:
|
||
; .SectorSize EQU 512 ;!HARDCODE
|
||
; LD HL,.SectorSize
|
||
; LD A,#80
|
||
; .loop: SRL A
|
||
; RR H
|
||
; JR NC,.loop
|
||
; LD (S_P_P),A
|
||
|
||
LD BC,0*256+BIOS.GET_RAMD_ST ; <20><><EFBFBD><EFBFBD>祭<EFBFBD><E7A5AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>䨪<EFBFBD><E4A8AA><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD>祭<EFBFBD><E7A5AD><EFBFBD><EFBFBD> <20><> RAM-Disk
|
||
LD DE,DRIVES_DRIVER.RAMDTBL
|
||
.initLoop: PUSH BC
|
||
LD A,B
|
||
PUSH DE
|
||
RST ToBIOS
|
||
POP DE
|
||
OR A
|
||
JR Z,.noDRV
|
||
;
|
||
INC DE
|
||
LD (DE),A
|
||
DEC DE
|
||
;
|
||
POP BC
|
||
LD A,B
|
||
LD (DE),A
|
||
INC DE
|
||
INC DE
|
||
JP .skip_pop
|
||
;
|
||
.noDRV: POP BC
|
||
.skip_pop: INC B
|
||
LD A,DRIVES_DRIVER.RAMDTBL.Size/DRIVES_DRIVER.RAMDTBL.TBL_Entry
|
||
CP B
|
||
JR NZ,.initLoop
|
||
|
||
LD HL,DRIVES_DRIVER.RAMDTBL ;!FIXIT LD HL,-RAMDTBL
|
||
EX DE,HL
|
||
AND A ;!FIXIT ----
|
||
SBC HL,DE ;!FIXIT ADD HL,DE
|
||
SRL L
|
||
LD A,L
|
||
; LD HL,ENDDRVR
|
||
AND A
|
||
RET
|
||
;----------------------------------------------------------------------;!TEST
|
||
;;;
|
||
;;
|
||
;
|
||
|
||
; ;
|
||
; ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD> RAM-DISK ID
|
||
; ; Log Number: DB RAM_DRIVE_ID, RAM_DRIVE_NUMBER
|
||
; RAMDTBL.TBL_Entry EQU 2
|
||
; RAMDTBL: DUP MAX_RAMDRIVES * RAMDTBL.TBL_Entry
|
||
; DB #FF
|
||
; EDUP
|
||
; .Size EQU $-RAMDTBL
|
||
; ;
|
||
|
||
|
||
; 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,.RGETPRM
|
||
;DEC B
|
||
;JP Z,FRDTRAC
|
||
;DEC B
|
||
;JP Z,FCHTRAC
|
||
LD A,BIOS.Error.InvalidSubFunction
|
||
SCF
|
||
RET
|
||
|
||
.O_CTL_F: ;RES 7,B
|
||
;INC B
|
||
;DEC B
|
||
;JP Z,.RSETPRM
|
||
;DEC B
|
||
;JP Z,FWRTRAC
|
||
;DEC B
|
||
;JP Z,FFRTRAC
|
||
LD A,BIOS.Error.InvalidSubFunction
|
||
SCF
|
||
RET
|
||
|
||
; 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: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
|
||
.RGETPRM: EX DE,HL
|
||
LD BC,#55AA
|
||
AND A
|
||
SBC HL,BC
|
||
LD L,A
|
||
LD A,BIOS.Error.Failure
|
||
SCF
|
||
RET NZ
|
||
;
|
||
EX AF,AF'
|
||
LD A,L
|
||
CALL GET_RAMDRV_NUM
|
||
PUSH AF
|
||
PUSH AF
|
||
EX AF,AF'
|
||
|
||
POP AF
|
||
LD C,BIOS.DRV_GET_PAR
|
||
RST ToBIOS
|
||
|
||
PUSH HL ;<3B><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> ᥪ<><E1A5AA> (<28><> 楫<><E6A5AB><EFBFBD><EFBFBD>)
|
||
PUSH DE ;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⢮ 樫<><E6A8AB><EFBFBD>
|
||
EXX
|
||
POP HL ;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⢮ 樫<><E6A8AB><EFBFBD>
|
||
POP BC ;<3B><> ᥪ<><E1A5AA> (<28><> 楫<><E6A5AB><EFBFBD><EFBFBD>)
|
||
LD D,0
|
||
LD E,B ;<3B><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
LD B,D
|
||
EXX
|
||
|
||
LD A,L
|
||
|
||
RRA
|
||
JR C,.end
|
||
.loopShift: SLA E
|
||
RL D
|
||
RRA
|
||
JR NC,.loopShift
|
||
;
|
||
.end: EX AF,AF'
|
||
POP AF
|
||
EX AF,AF'
|
||
XOR A
|
||
LD L,A
|
||
LD H,L
|
||
LD C,A ;[x] 17.12.2023 <20><><EFBFBD><EFBFBD>㧪<EFBFBD> <20> <20><>⨢<EFBFBD><E2A8A2><EFBFBD><EFBFBD> ࠧ<><E0A0A7><EFBFBD><EFBFBD>, <20> <20><> <20> <20><>ࢮ<EFBFBD><E0A2AE>
|
||
LD A,%10100000
|
||
RET
|
||
|
||
; !TODO
|
||
; !FIXIT
|
||
; .RSETPRM: AND A
|
||
; RET
|
||
|
||
GET_RAMDRV_NUM: LD BC,DRIVES_DRIVER.RAMDTBL
|
||
.skip_tbl: ADD A,A
|
||
ADD A,C
|
||
LD C,A
|
||
LD A,0
|
||
ADC A,B
|
||
LD B,A
|
||
;INC BC
|
||
LD A,(BC)
|
||
OR #60 ;!HARDCODE ᤥ<><E1A4A5><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ࠧ<><E0A0A7><EFBFBD> <20><><EFBFBD>ன<EFBFBD><E0AEA9><EFBFBD> <20><>१ <20><>⪨
|
||
RET
|
||
;
|
||
;ENDDRVR EQU $
|
||
ENDMODULE ;RAMDSK_DRV
|
||
;
|