Estex-DSS/DSS/IDE_DRV0.ASM
2023-07-05 02:43:28 +10:00

720 lines
13 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
;[]===========================================================[]
;Procedure : Initialization
;
;Function : Initialization device(s)
;
;Input : C = 00h
; IX - Environment
;Output : A = Amount drive support
; HL = Size driver
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Open
;
;Function : Open disk
;
;Input : C = 01h
; A - Drive
;Output : None
;
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Close
;
;Function : Close disk
;
;Input : C = 02h
; A - Drive
;Output : None
;
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Media check
;
;Function : Checking change line
;
;Input : C = 03h
; A - Drive
;Output : A = 00h disk no changed
; A = 0FFh disk changed
;
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Get BPB
;
;Function : Get Block Parameters BIOS
;
;Input : C = 04h
; DE - Address
;Output : None
;
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Input
;
;Function : Input from disk
;
;Input : C = 05h
; HL:IX - Logical Block (sector)
; DE - Address
; B - Sector count
;Output : None
;
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Output
;
;Function : Output to disk
;
;Input : C = 06h
; HL:IX - Logical Block (sector)
; DE - Address
; B - Sector count
;Output : None
;
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Removable
;
;Function : Checking change line
;
;Input : C = 07h
; A - Drive
;Output : A = 00h Removable
; A = FFh Nonremovable
;
;[]===========================================================[]
;[]===========================================================[]
;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 :
;
;[]===========================================================[]
;[]===========================================================[]
;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
;
;[]===========================================================[]
;[]===========================================================[]
;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
;
;[]===========================================================[]
;
; 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
; IDE0 EQU #0C1C0
; IDE1 EQU #0C1C8
PART EQU #C000
HDDRIVE INC C
DEC C
JP Z,INIT_H ;#00
DEC C
JP Z,RESE_H ;#01
DEC C
JP Z,STAT_H ;#02
DEC C
JP Z,CHEK_H ;#03
DEC C
JP Z,GBPB_H ;#04
DEC C
JP Z,READH ;#05
DEC C
JP Z,WRITEH ;#06
DEC C
JP Z,REMOV_H ;#07
DEC C
JP Z,IOCTL_H ;#08
DEC C
JP Z,RESR_H ;#09
DEC C
JP Z,LREADH ;#0A
DEC C
JP Z,LWRITEH ;#0B
RESR_H LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
;Commands for restart #18
INIT_H PUSH IY
LD HL,LOGDRV
LD (OFFSECT),HL
LD IX,DEVICE_CFG ;!TODO ᤥ<><E1A4A5><EFBFBD><EFBFBD> RAMDRIVE <20><><EFBFBD> <20> DEVICE_CFG ?
LD C,BIOS.DRV_LIST
RST ToBIOS
XOR A
;!TEST
;LD B,(IX+2) ;HDD
;CP B
CP (IX+2)
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>
NX_DVCI PUSH BC
LD A,C
LD (DRV),A
CALL PARTIT
POP BC
INC C
DJNZ NX_DVCI
;R02
;R02 LD A,#80
;R02 LD (DRV),A
;R02 LD C,SLOT3
;R02 IN B,(C)
;R02 LD A,SYSPAGE
;R02 OUT (C),A
;R02 LD HL,IDE0
;R02 CALL YEP_DRV
;R02 OUT (C),B
;R02 CALL NZ,PARTIT
;R02
;R02 LD A,#81
;R02 LD (DRV),A
;R02 LD C,SLOT3
;R02 IN B,(C)
;R02 LD A,SYSPAGE
;R02 OUT (C),A
;R02 LD HL,IDE1
;R02 CALL YEP_DRV
;R02 OUT (C),B
;R02 CALL NZ,PARTIT
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
; DB 0 ;LEN
; DB 0 ;FDD COUNT
; DB 0 ;HDD COUNT
; DB 0 ;CDROM COUNT
; DS 28 ;RESERVED
YEP_DRV LD A,#FF
; CP (HL)
; RET NZ
INC HL
CP (HL)
RET NZ
INC HL
CP (HL)
RET NZ
INC HL
CP (HL)
RET NZ
INC HL
CP (HL)
RET NZ
INC HL
CP (HL)
RET
;+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
DRVHD_H EQU 0
SC_PT_H EQU 1
HEADS_H EQU 2
CYL_L_H EQU 3
CYL_H_H EQU 4
SPCLL_H EQU 5
SPCLH_H EQU 6
;IDE0 DB #FF ;DRIVE/HEAD REGISTER ;00
; DB #FF ;SECTORS PER TRACK ;01
; DB #FF ;HEADS ;02
; DB #FF ;CYLINDERS LOW ;03
; DB #FF ;CYLINDERS HIGH ;04
; DB #FF ;SECTOR PER CYLINDER LOW ;05
; DB #FF ;SECTOR PER CYLINDER HIGH ;06
; DB #FF ;RESERVED ;07
;IDE1 DB #FF ;DRIVE/HEAD REGISTER ;00
; DB #FF ;SECTORS PER TRACK ;01
; DB #FF ;HEADS ;02
; DB #FF ;CYLINDERS LOW ;03
; DB #FF ;CYLINDERS HIGH ;04
; DB #FF ;SECTOR PER CYLINDER LOW ;05
; DB #FF ;SECTOR PER CYLINDER HIGH ;06
; DB #FF ;RESERVED ;07
LOGDRV BLOCK 12*LD_DSK,0
;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/...
;+01 LONG SECTOR OFFSET
;+05 LONG SIZE IN SECTORS
;+09 FREE
;+15
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
; D0...D3 - "0" RESERVED (MAY BE OTHER)
; D4 - DEVICE MASTER/SLAVE
; D5 - "1" RESERVED
; D6 - ADDRESSING MODE LBA/CHS
; D7 - "1" RESERVED
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 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 ;!FIXIT <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
ADD IY,BC
LD E,(IY+5)
LD D,(IY+6)
LD L,(IY+7)
LD H,(IY+8)
LD A,(IY+0)
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+DRVHD_H) ;HDD/DRV
EXX
LD L,(IY+CYL_L_H) ;CYLINDER LOW
LD H,(IY+CYL_H_H) ;CYLINDER HIGH
LD E,(IY+HEADS_H) ;HEADS
LD D,0
LD C,(IY+SC_PT_H) ;SECTORS
LD B,0
EXX
EX AF,AF'
POP AF
OUT (SLOT3),A
LD A,C
EX AF,AF'
POP IY
AND A
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,#0155
RST ToBIOS
RET
;HL:IX - SECTOR
; DE - ADDRESS
; B - COUNTER
; A'- PAGE
;READ SECTOR
LREADH PUSH IY
CALL SELHDD
LD C,#52 ; A - HDD NUMBER +128
RST ToBIOS
POP IY
RET
;HL:IX - SECTOR
; DE - ADDRESS
; B - COUNTER
; A'- PAGE
;WRITE SECTOR
LWRITEH PUSH IY
CALL SELHDD
LD C,#53 ; A - HDD NUMBER +128
RST ToBIOS
POP IY
RET
;HL:IX - SECTOR
; DE - ADDRESS
; B - COUNTER
;WRITE SECTOR
WRITEH PUSH IY
CALL SELHDD
LD C,#56 ; A - HDD NUMBER +128
RST ToBIOS
POP IY
RET
;HL:IX - SECTOR
; DE - ADDRESS
; B - COUNTER
;READ SECTOR
READH PUSH IY
CALL SELHDD
LD C,#55 ; A - HDD NUMBER +128
RST ToBIOS
POP IY
RET
;HL:IX - SECTOR
; DE - ADDRESS
; B - COUNTER
;CHECK SECTOR
CHECKH PUSH IY
CALL SELHDD
LD C,#54 ; A - HDD NUMBER +128
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)
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,#FF
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 IDE2..3
;
LD HL,(PART+510)
LD DE,#AA55
AND A
SBC HL,DE
JR NZ,NODEFIN
LD IY,PART+#01BE
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 BC,#0155
LD A,(DRV)
RST ToBIOS
POP IY
RET
DRV DB #00 ;PHISICAL DRIVE NUMBER
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
;=======================================================