Estex-DSS/DSS/Media_drivers/ide-drv.asm
2023-07-29 03:28:09 +10:00

759 lines
14 KiB
NASM
Raw Blame History

;---------------------------------------------------------------
;Rev Date Name Description
;---------------------------------------------------------------
;R02 06-08-2001 DNS Secondary IDE
;R01 06-08-2001 DNS Fixed BUG with partitions on Second hard disk
;---------------------------------------------------------------
;
; 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]
;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]
;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]
;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
;
;[]===========================================================[9]
;[]===========================================================[10]
;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
;
;[]===========================================================[10]
;
; 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
LD_DSK EQU 16 ; <20><><EFBFBD><EFBFBD><E1A8AC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20> <20><><EFBFBD><EFBFBD>
; IDE0 EQU #0C1C0
; IDE1 EQU #0C1C8
PART EQU #C000
HDDRIVE INC C
DEC C
JP Z,INIT_H ; c=0 Initialization
DEC C
JP Z,RESE_H ; c=1 open
DEC C
JP Z,STAT_H ; c=2 close
DEC C
JP Z,CHEK_H ; c=3 media check (ᬥ<><E1ACA5> <20><><EFBFBD><EFBFBD><EFBFBD>)
DEC C
JP Z,GBPB_H ; c=4 get BPB
DEC C
JP Z,READH ; c=5 input (<28><EFBFBD><E2A5AD><><E1A5AA>஢)
DEC C
JP Z,WRITEH ; c=6 output (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E1A5AA>஢)
DEC C
JP Z,REMOV_H ; c=7 Removable
DEC C
JP Z,IOCTL_H ; c=8 㧭<><E3A7AD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>᪠ Generic IOCTL
DEC C
JP Z,RESR_H ; c=9 Reserved
DEC C
JP Z,LREADH ; c=10 Read Long
DEC C
JP Z,LWRITEH ; c=11 Write Long
RESR_H LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
////////////////////////////////////////////////////////////////////////
// Commands for restart #18 //
////////////////////////////////////////////////////////////////////////
;!FIXIT ---------------------------------------------------------------------------[v]
; c=0 Initialization
INIT_H: PUSH IY
LD HL,LOGDRV
LD (OFFSECT),HL
; IN A,(SLOT2)
; PUSH AF
; IN A,(SLOT0)
; OUT (SLOT2),A
;LD IX,DEVICE_CFG+#8000 ; <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LD IX,SYS_PAGE.TMP_BUFFER
LD C,BIOS.DRV_LIST
RST ToBIOS
IN A,(SLOT3)
LD C,A
LD A,SYS_PAGE
OUT (SLOT3),A
XOR A
LD B,(IX+2) ;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⢮ HDD <20><><EFBFBD> <20><><EFBFBD><EFBFBD><E6A5A4><EFBFBD> NX_DVCI
CP B
LD A,C
OUT (SLOT3),A
JR Z,NO_HARDS
;LD BC,4*256 + #80 ;!HARDCODE 4 - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD>⮢, 80 - ID <20><><EFBFBD><EFBFBD><EFBFBD> ;!FIXIT
LD C,#80 ;!HARDCODE - ID <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><E6A5A4><EFBFBD> BIOS.DRV_DETECT
NX_DVCI: PUSH BC
LD A,C
LD (DRV_NUM),A
LD C,BIOS.DRV_DETECT
RST ToBIOS
;JR C,.NO_DRIVE
CALL NC,PARTIT
POP BC
INC C
JR C,NX_DVCI
DJNZ NX_DVCI
; c=0 Initialization
; INIT_H: PUSH IY
; LD HL,LOGDRV
; LD (OFFSECT),HL
; LD IX,DEVICE_CFG ;!FIXIT <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
; LD C,BIOS.DRV_LIST
; RST ToBIOS
; XOR A
; ;!TEST
; ;LD B,(IX+2)
; ;CP B
; CP (IX+2) ;HDD
; JR Z,NO_HARDS
; LD BC,4*256 + #80 ;!HARDCODE 4 - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD>⮢, 80 - ID <20><><EFBFBD><EFBFBD><EFBFBD> ;!FIXIT
; ;LD C,#80 ;!HARDCODE 4 - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD>⮢, 80 - ID <20><><EFBFBD><EFBFBD><EFBFBD> ;!FIXIT
; NX_DVCI: PUSH BC
; LD A,C
; LD (DRV_NUM),A
; LD C,BIOS.DRV_DETECT
; RST ToBIOS
; ;JR C,.NO_DRIVE
; CALL NC,PARTIT
; POP BC
; INC C
; ;JR C,NX_DVCI
; DJNZ NX_DVCI
;!FIXIT ---------------------------------------------------------------------------[^]
;
NO_HARDS:
POP IY
LD HL,(OFFSECT)
LD DE,LOGDRV
XOR A
SBC HL,DE
RET Z
LD DE,LD_DSK
DRVCLC: INC A
SBC HL,DE
JR NZ,DRVCLC
AND A
RET
;DEVICE_CFG EQU #4000 ;!TEST
;DEVICE_CFG EQU DRV_TEMP_BUFFER ;!TEST
; DB 0 ;LEN
; DB 0 ;FDD COUNT
; DB 0 ;HDD COUNT
; DB 0 ;CDROM COUNT
; DS 28 ;RESERVED
;+00 ;SECTORS PER TRACK
;+01 ;TRACKS PER CYLLINDER
;+02 ;RESERVED
;+03 ;HDD/DRIVE/LBA
;+04 ;SECTOR PER CYLINDER LOW
;+05 ;SECTOR PER CYLINDER HIGH
;+06 ;RESERVED
;+07 ;RESERVED
LOGDRV: BLOCK 16*LD_DSK,0 ;!FIXIT <20><><EFBFBD><E0A5AD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E0A0AD><EFBFBD>
;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/...
;+01 LONG SECTOR OFFSET
;+05 LONG SIZE IN SECTORS
;+09 FREE
;+15
.Size EQU $-LOGDRV
SELHDD: PUSH DE
PUSH BC
PUSH HL
LD L,A
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
EX DE,HL
LD IY,LOGDRV
ADD IY,DE
LD C,(IY+1)
LD B,(IY+2)
LD E,(IY+3)
LD D,(IY+4)
POP HL
ADD IX,BC
ADC HL,DE
LD A,(IY+0) ;DRIVE NUMBER
POP BC
POP DE
RET
; 00 - GET DEVICE PARAMETERS
; 01 - READ TRACK
; 02 - TEST TRACK
; 80 - SET DEVICE PARAMETERS
; 81 - WRITE TRACK
; 82 - FORMAT TRACK
IOCTL_H BIT 7,B
JR NZ,O_CTL_H
INC B
DEC B
JP Z,HGETPRM
DEC B
JP Z,HRDTRAC
DEC B
JP Z,HCHTRAC
LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
O_CTL_H RES 7,B
INC B
DEC B
JP Z,HSETPRM
DEC B
JP Z,HWRTRAC
DEC B
JP Z,HFRTRAC
LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
HRDTRAC LD A,DSS_Error.drv.GENERAL_FAILURE
SCF
RET
HCHTRAC LD B,L
CALL CHECKH
RET
HSETPRM AND A
RET
HWRTRAC LD A,DSS_Error.drv.GENERAL_FAILURE
SCF
RET
HFRTRAC LD A,DSS_Error.drv.GENERAL_FAILURE
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 - DRIVE/HEAD REGISTER PHISICAL DISK:
; bit7 - reserved "1"
; bit6 - ADDRESSING MODE LBA/CHS
; bit5 - reserved "1"
; bit4 - DEVICE MASTER/SLAVE
; bit3 - reserved "0" (MAY BE OTHER)
; bit2 - reserved "0" (MAY BE OTHER)
; bit1 - reserved "0" (MAY BE OTHER)
; bit0 - Primary/Secondary Chanel
HGETPRM:
EX DE,HL
LD BC,#55AA
AND A
SBC HL,BC
LD L,A
LD A,DSS_Error.drv.GENERAL_FAILURE
SCF
RET NZ
PUSH IX
PUSH IY
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD B,H
LD C,L
LD IY,LOGDRV
ADD IY,BC
;
LD A,(IY+0) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/...
;!TEST --------------------------------------------------------------------------------+
PUSH IY
LD C,BIOS.DRV_GET_PAR
RST ToBIOS
POP IY
LD A,DSS_Error.drv.INVALID_DRIVE
JR C,.error
EX DE,HL
LD C,E
LD E,D
LD D,0
LD A,B
LD B,D
EXX
;SECTORS ON LOGICAL DISK
LD E,(IY+5)
LD D,(IY+6)
LD L,(IY+7)
LD H,(IY+8)
;
EX AF,AF'
LD A,(IY+0) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/...
EX AF,AF'
; LD C,A
; LD IY,SYS_PAGE.IDE_0
; AND #0F
; JR Z,GELH1
; LD IY,SYS_PAGE.IDE_1
; CP 2
; JR C,GELH1
; LD IY,SYS_PAGE.IDE_2
; JR Z,GELH1
; LD IY,SYS_PAGE.IDE_3
; GELH1: IN A,(SLOT3)
; PUSH AF
; LD A,SYS_PAGE
; OUT (SLOT3),A
; LD A,(IY+HDD_INIT_TABLE.DRV_Flags) ;HDD/DRV
; EXX
; LD L,(IY+HDD_INIT_TABLE.CylinderNumberLow) ;CYLINDER LOW +
; LD H,(IY+HDD_INIT_TABLE.CylinderNumberHigh) ;CYLINDER HIGH +
; LD E,(IY+HDD_INIT_TABLE.HeadsNumber) ;HEADS +
; LD D,0
; LD C,(IY+HDD_INIT_TABLE.SectorsPerTrack) ;SECTORS +
; LD B,0
; EXX
; EX AF,AF'
; POP AF
; OUT (SLOT3),A
; LD A,C
; EX AF,AF'
;!TEST --------------------------------------------------------------------------------+
AND A
.error: POP IY
POP IX
RET
REMOV_H:
LD A,1
AND A
RET
RESE_H: XOR A
RET
STAT_H: XOR A
RET
CHEK_H:
;!TEST
;LD A,#FF
XOR A
;
AND A
RET
;HL:IX - SECTOR
; DE - ADDRESS
GBPB_H: PUSH IY
PUSH DE
LD L,A
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD B,H
LD C,L
LD IY,LOGDRV
ADD IY,BC
LD E,(IY+1)
LD D,(IY+2)
LD L,(IY+3)
LD H,(IY+4)
LD XL,E
LD XH,D
LD A,(IY+0)
POP DE
POP IY
LD BC,1*256 + BIOS.DRV_READ
RST ToBIOS
RET
;HL:IX - SECTOR
; DE - ADDRESS
; B - COUNTER
; A'- PAGE
; A - HDD NUMBER +#80
;READ SECTOR
LREADH: PUSH IY
CALL SELHDD
LD C,BIOS.DRV_READ_LONG
RST ToBIOS
POP IY
RET
;HL:IX - SECTOR
; DE - ADDRESS
; B - COUNTER
; A'- PAGE
; A - HDD NUMBER +#80
;WRITE SECTOR
LWRITEH:
PUSH IY
CALL SELHDD
LD C,BIOS.DRV_WRITE_LONG
RST ToBIOS
POP IY
RET
;HL:IX - SECTOR
; DE - ADDRESS
; B - COUNTER
; A - HDD NUMBER +#80
;WRITE SECTOR
WRITEH: PUSH IY
CALL SELHDD
LD C,BIOS.DRV_WRITE
RST ToBIOS
POP IY
RET
;HL:IX - SECTOR
; DE - ADDRESS
; B - COUNTER
; A - HDD NUMBER +#80
;READ SECTOR
READH: PUSH IY
CALL SELHDD
LD C,BIOS.DRV_READ
RST ToBIOS
POP IY
RET
;HL:IX - SECTOR
; DE - ADDRESS
; B - COUNTER
; A - HDD NUMBER +#80
;CHECK SECTOR
CHECKH: PUSH IY
CALL SELHDD
LD C,BIOS.DRV_VERIFY
RST ToBIOS
POP IY
RET
;-----------------
EASYDOS:
MEDIDOS:
HIGHDOS:
LD E,(IY+08)
LD D,(IY+09)
LD L,(IY+10)
LD H,(IY+11)
LD IX,(CURSECL)
ADD IX,DE
LD DE,(CURSECH)
ADC HL,DE
LD D,XH
LD E,XL
LD IX,(OFFSECT)
LD (IX+1),E ;BPB SECTOR
LD (IX+2),D
LD (IX+3),L
LD (IX+4),H
; LD DE,(CURSECL)
; LD HL,(CURSECH)
; LD (IX+1),E ;START DISK
; LD (IX+2),D
; LD (IX+3),L
; LD (IX+4),H
LD E,(IY+12)
LD D,(IY+13)
LD L,(IY+14)
LD H,(IY+15)
LD (IX+5),E ;SIZE DISK
LD (IX+6),D
LD (IX+7),L
LD (IX+8),H
LD A,(DRV_NUM)
LD (IX+0),A
LD DE,LD_DSK ; DSKITEM
ADD IX,DE
LD (OFFSECT),IX
NXTPART LD DE,#10
ADD IY,DE
POP BC
DJNZ DOSAGA
AND A
RET
PARTIT: IN A,(SLOT3)
PUSH AF
LD A,DSS_PAGE
OUT (SLOT3),A
CALL PARTIT1
POP AF
OUT (SLOT3),A
RET
PARTIT1 LD IX,0
LD DE,0
LD (EXTDOSL),DE ;R01
LD (EXTDOSH),IX ;R01
PARTIT2 LD (CURSECL),DE
LD (CURSECH),IX
CALL LOADSEC
;!TEST
;RET C ; for absent drive
;
LD HL,(PART+510) ;!HARDCODE
LD DE,#AA55
AND A
SBC HL,DE
JR NZ,NODEFIN
LD IY,PART+#01BE ;!HARDCODE
LD B,4
DOSAGA PUSH BC
LD A,(IY+4)
CP 5
JR NZ,NOEXTDS
SUBLEV PUSH IY
LD DE,(CURSECL)
LD IX,(CURSECH)
PUSH DE
PUSH IX
CALL EXTDOS
POP IX
POP DE
LD (CURSECL),DE
LD (CURSECH),IX
CALL LOADSEC
POP IY
JP NXTPART
NOEXTDS CP #0F
JP Z,SUBLEV
CP #0E
JP Z,HIGHDOS
CP 6
JP Z,HIGHDOS
CP 4
JP Z,MEDIDOS
CP 1
JP Z,EASYDOS
POP BC
OR A
RET Z
NODEFIN SCF
RET
EXTDOS: LD HL,(EXTDOSL)
LD DE,(EXTDOSH)
LD A,L
OR H
OR E
OR D
LD E,(IY+08)
LD D,(IY+09)
LD L,(IY+10)
LD H,(IY+11)
JP NZ,EXTDOS2
LD (EXTDOSL),DE
LD (EXTDOSH),HL
LD IX,(EXTDOSH)
JP PARTIT2
EXTDOS2 LD IX,(EXTDOSL)
ADD IX,DE
PUSH IX
LD DE,(EXTDOSH)
ADC HL,DE
PUSH HL
POP IX
POP DE
JP PARTIT2
LOADSEC PUSH IY
LD IX,(CURSECL)
LD HL,(CURSECH)
LD DE,PART
LD A,(DRV_NUM)
LD BC,1*256 + BIOS.DRV_READ
RST ToBIOS
POP IY
RET
DRV_NUM DB #00 ;PHISICAL DRIVE NUMBER. <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (#80/#81 - primary <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/᫥<><E1ABA5>, #82/#83 - secondary <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/᫥<><E1ABA5>)
CURSECL DW #0000 ;CURRENT SECTOR LOADED
CURSECH DW #0000
EXTDOSL DW #0000 ;CURRENT PARTITION TABLE
EXTDOSH DW #0000
OFFSECT DW LOGDRV ;POINTER ON CURRENT DISK RECORD
;=======================================================