mirror of
https://github.com/romychs/SprinterFirmware.git
synced 2025-04-18 18:12:39 +03:00
696 lines
12 KiB
NASM
696 lines
12 KiB
NASM
;---------------------------------------------------------------
|
|
;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
|
|
JR 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
|
|
JR Z,RESR_H ;#09
|
|
DEC C
|
|
JP Z,LREADH ;#0A
|
|
DEC C
|
|
JP Z,LWRITEH ;#0Bh
|
|
|
|
RESR_H ; TODO: UNK?
|
|
LD A,1
|
|
SCF
|
|
RET
|
|
|
|
;Commands for restart #18
|
|
INIT_H
|
|
PUSH IY
|
|
LD HL,LOGDRV
|
|
LD (OFFSECT),HL
|
|
LD IX,DEVICE_CFG
|
|
LD C,#5F
|
|
RST #08
|
|
XOR A
|
|
LD B,(IX+2) ;HDD
|
|
CP B
|
|
JR Z,NO_HARDS
|
|
LD B,0x04 ; TODO: 1op
|
|
LD C,0x80
|
|
|
|
NX_DVCI
|
|
PUSH BC
|
|
LD A,C
|
|
LD (DRV),A
|
|
CALL PARTIT
|
|
POP BC
|
|
INC C
|
|
DJNZ NX_DVCI
|
|
|
|
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
|
|
|
|
LOGDRV DB 0 ;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/...
|
|
SOFF DW 0,0 ;+01 LONG SECTOR OFFSET
|
|
NSECT DW 0,0 ;+05 LONG SIZE IN SECTORS
|
|
DS 183,0 ;+09 FREE
|
|
|
|
DEVICE_CFG EQU #4000
|
|
|
|
|
|
;+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
|
|
|
|
|
|
SELHDD
|
|
PUSH DE
|
|
PUSH BC
|
|
PUSH HL
|
|
LD L,A
|
|
LD H,0x0
|
|
ADD HL,HL
|
|
ADD HL,HL
|
|
ADD HL,HL
|
|
ADD HL,HL
|
|
EX DE,HL
|
|
LD HL,LOGDRV
|
|
ADD HL,DE
|
|
LD A,(HL) ; LOGDRV
|
|
INC HL
|
|
LD C,(HL) ; =>SOFF+0
|
|
INC HL
|
|
LD B,(HL) ; =>SOFF+1
|
|
INC HL
|
|
LD E,(HL) ; =>SOFF+2
|
|
INC HL
|
|
LD D,(HL) ; =>SOFF+3
|
|
POP HL
|
|
ADD IX,BC
|
|
ADC HL,DE
|
|
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
|
|
JR Z,HGETPRM
|
|
DEC B
|
|
JR Z,HRDTRAC
|
|
DEC B
|
|
JR Z,HCHTRAC
|
|
LD A,1
|
|
SCF
|
|
RET
|
|
|
|
O_CTL_H
|
|
RES 7,B
|
|
INC B
|
|
DEC B
|
|
JR Z,HSETPRM
|
|
DEC B
|
|
JR Z,HWRTRAC
|
|
DEC B
|
|
JR Z,HFRTRAC
|
|
LD A,1
|
|
SCF
|
|
RET
|
|
|
|
HRDTRAC
|
|
LD A,11
|
|
SCF
|
|
RET
|
|
|
|
HCHTRAC
|
|
LD B,L
|
|
JP CHECKH
|
|
|
|
HSETPRM
|
|
AND A
|
|
RET
|
|
|
|
HWRTRAC
|
|
LD A,11
|
|
SCF
|
|
RET
|
|
|
|
HFRTRAC
|
|
LD A,11
|
|
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,11
|
|
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
|
|
ADD IY,BC
|
|
LD E,(IY+5) ; Number of sectors 0
|
|
LD D,(IY+6) ; Number of sectors 1
|
|
LD L,(IY+7) ; Number of sectors 2
|
|
LD H,(IY+8) ; Number of sectors 3
|
|
|
|
LD A,(IY+0) ; drv
|
|
LD C,A
|
|
LD IY,IDE0
|
|
AND #0F
|
|
JR Z,GELH1
|
|
LD IY,IDE1
|
|
GELH1
|
|
IN A,(PAGE3)
|
|
PUSH AF
|
|
LD A,SYSPAGE
|
|
OUT (PAGE3),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 B,D
|
|
LD C,(IY+SC_PT_H) ;SECTORS
|
|
EXX
|
|
EX AF,AF'
|
|
POP AF
|
|
OUT (PAGE3),A
|
|
LD A,C
|
|
EX AF,AF'
|
|
POP IY
|
|
AND A
|
|
RET
|
|
|
|
REMOV_H
|
|
LD A,1
|
|
AND A
|
|
RET
|
|
|
|
RESE_H
|
|
LD L,A
|
|
LD H,0x0
|
|
ADD HL,HL
|
|
ADD HL,HL
|
|
ADD HL,HL
|
|
ADD HL,HL
|
|
EX DE,HL
|
|
LD HL,LOGDRV
|
|
ADD HL,DE
|
|
LD A,(HL)
|
|
RET
|
|
|
|
STAT_H
|
|
XOR A
|
|
RET
|
|
|
|
CHEK_H
|
|
LD A,#FF
|
|
AND A
|
|
RET
|
|
|
|
;HL:IX - SECTOR
|
|
; DE - ADDRESS
|
|
|
|
GBPB_H
|
|
LD HL,0x0
|
|
LD IX,0x0
|
|
CALL SELHDD
|
|
LD BC,0x155
|
|
JP A0008
|
|
|
|
;HL:IX - SECTOR
|
|
; DE - ADDRESS
|
|
; B - COUNTER
|
|
; A'- PAGE
|
|
|
|
;READ SECTOR
|
|
LREADH
|
|
CALL SELHDD
|
|
LD C,0x52
|
|
JP A0008
|
|
|
|
;HL:IX - SECTOR
|
|
; DE - ADDRESS
|
|
; B - COUNTER
|
|
; A'- PAGE
|
|
|
|
;WRITE SECTOR
|
|
LWRITEH
|
|
CALL SELHDD
|
|
LD C,0x53
|
|
JP A0008
|
|
|
|
;HL:IX - SECTOR
|
|
; DE - ADDRESS
|
|
; B - COUNTER
|
|
|
|
;WRITE SECTOR
|
|
WRITEH
|
|
CALL SELHDD
|
|
LD C,0x56
|
|
JP A0008
|
|
|
|
;HL:IX - SECTOR
|
|
; DE - ADDRESS
|
|
; B - COUNTER
|
|
|
|
;READ SECTOR
|
|
READH
|
|
CALL SELHDD
|
|
LD C,0x55
|
|
JP A0008
|
|
|
|
;HL:IX - SECTOR
|
|
; DE - ADDRESS
|
|
; B - COUNTER
|
|
|
|
;CHECK SECTOR
|
|
CHECKH
|
|
CALL SELHDD
|
|
LD C,0x54
|
|
JP A0008
|
|
|
|
;-----------------
|
|
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,(PAGE3)
|
|
PUSH AF
|
|
LD A,#FF
|
|
OUT (PAGE3),A
|
|
CALL PARTIT1
|
|
POP AF
|
|
OUT (PAGE3),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
|
|
RET C
|
|
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
|
|
JR NXTPART
|
|
|
|
NOEXTDS
|
|
CP 0xf
|
|
JR Z,SUBLEV
|
|
CP 0xe
|
|
JP Z,HIGHDOS
|
|
CP 0x6
|
|
JP Z,HIGHDOS
|
|
CP 0x4
|
|
JP Z,HIGHDOS
|
|
CP 0x1
|
|
JP Z,HIGHDOS
|
|
CP 0xb
|
|
JR Z,SUBLEV
|
|
CP 0x7
|
|
JR Z,SUBLEV
|
|
CP 0x82
|
|
JR Z,SUBLEV
|
|
CP 0x83
|
|
JR Z,SUBLEV
|
|
CP 0xeb
|
|
JR Z,SUBLEV
|
|
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)
|
|
JR 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 #08
|
|
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
|
|
|
|
;======================================================= |