Estex-DSS/DSS/Media_drivers/ram_disk-drv.asm
2023-10-01 02:54:22 +10:00

541 lines
11 KiB
NASM
Raw Blame History

; 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:
; 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,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
; parser
RMDRIVE:
INC C
DEC C
JP Z,INIT_RD ; 0
DEC C
JR Z,RESET_RD ; 1
DEC C
JR Z,STATUS_RD ; 2
DEC C
JR Z,CHEK_RD ; 3
DEC C
JR Z,GBPB_RD ; 4
DEC C
JR Z,READ_RD ; 5
DEC C
JR Z,WRITE_RD ; 6
DEC C
JR Z,REMOV_RD ; 7
DEC C
JP Z,IOCTL_RD ; 8
DEC C
JP Z,.error ; 9 RESR_H
DEC C
JP Z,LREAD_RD ; 10
DEC C
JP Z,LWRITE_RD ; 11
.error:
LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
REMOV_RD:
RESET_RD:
STATUS_RD:
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>
CHEK_RD LD A,#FF
AND A
RET
;DE - ADDRESS
GBPB_RD:
LD IX,0
LD HL,0
LD B,#01
;JP READ_RD
;READ SECTORS
; HL:IX - SECTOR
; DE - ADDRESS
; B - COUNT
; A - DRIVE
READ_RD:
PUSH BC
CALL GET_RAMDRV_NUM
POP BC
LD C,BIOS.DRV_READ
JP ToBIOS
; RST ToBIOS
; XOR A
; RET
LREAD_RD:
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_RD:
PUSH BC
CALL GET_RAMDRV_NUM
POP BC
LD C,BIOS.DRV_WRITE
JP ToBIOS
; RST ToBIOS
; XOR A
; RET
LWRITE_RD:
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,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,RAMDTBL.Size / RAMDTBL.TBL_Entry
; CP B
; JR NZ,.initLoop
; LD HL,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_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,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 1F
;
.noDRV: POP BC
1: INC B
LD A,RAMDTBL.Size / RAMDTBL.TBL_Entry
CP B
JR NZ,.initLoop
LD HL,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
IOCTL_RD:
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,DSS_Error.drv.INVALID_COMMAND
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,DSS_Error.drv.INVALID_COMMAND
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
.RGETPRM:
EX DE,HL
LD BC,#55AA
AND A
SBC HL,BC
LD L,A
LD A,DSS_Error.drv.GENERAL_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 A,%10100000
RET
; !TODO
; !FIXIT
; .RSETPRM:
; AND A
; RET
GET_RAMDRV_NUM:
LD BC,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 $
;