CF bug fixed in ATA/ATAPI R/W procedure
This commit is contained in:
parent
ed03bf0ee1
commit
e90f1cafbf
@ -1 +1 @@
|
|||||||
Subproject commit ccb95c96a5684e4f99c19f96b8fcc72f7d0b8212
|
Subproject commit d38cd7dd53426ef452cd4afd2a76f6a1e5a84848
|
||||||
@ -546,15 +546,15 @@ TAB_5xFNS:
|
|||||||
_mNoDrive_5xTable 3, 0
|
_mNoDrive_5xTable 3, 0
|
||||||
;-------------------------------------[]
|
;-------------------------------------[]
|
||||||
|
|
||||||
;-----------------------------------------------------------[ CDROM #C ]
|
;----------------------------------------------------------[ CDROM #C0 ]
|
||||||
;
|
;
|
||||||
DB low FN_RESERVED_5x
|
DB low FN_RESERVED_5x
|
||||||
DB low CD_5x_RESET
|
DB low CD_5x_RESET
|
||||||
DB low CD_5x_LONG_READ
|
DB low CD_5x_LONG_READ
|
||||||
DB low FN_ABSENT_5x ; LONG_WRITE
|
DB low CD_5x_LONG_WRITE ; LONG_WRITE ; [ ] new
|
||||||
DB low FN_ABSENT_5x ; VERIFY
|
DB low FN_ABSENT_5x ; VERIFY
|
||||||
DB low CD_5x_READ
|
DB low CD_5x_READ
|
||||||
DB low FN_ABSENT_5x ; WRITE
|
DB low CD_5x_WRITE ; WRITE ; [ ] new
|
||||||
DB low CD_5x_DETECT
|
DB low CD_5x_DETECT
|
||||||
DB low FN_ABSENT_5x ; GETMED
|
DB low FN_ABSENT_5x ; GETMED
|
||||||
DB low FN_ABSENT_5x ; SETMED
|
DB low FN_ABSENT_5x ; SETMED
|
||||||
@ -585,6 +585,7 @@ TAB_5xFNS:
|
|||||||
DB high FDD_5x_DETECT ;#57
|
DB high FDD_5x_DETECT ;#57
|
||||||
DB high FDD_5x_GETMED ;#58
|
DB high FDD_5x_GETMED ;#58
|
||||||
DB high FDD_5x_SETMED ;#59
|
DB high FDD_5x_SETMED ;#59
|
||||||
|
|
||||||
DB high DRV_VERSION ;#5A - „ã¡«ì. <20> íâã äãªæ¨î ¯àë£ ¥â ¨§ ®á®¢®£® ®¡à ¡®â稪
|
DB high DRV_VERSION ;#5A - „ã¡«ì. <20> íâã äãªæ¨î ¯àë£ ¥â ¨§ ®á®¢®£® ®¡à ¡®â稪
|
||||||
DB high FN_RESERVED_5x ;#5B - „ã¡«ì. <20> íâã äãªæ¨î ¯àë£ ¥â ¨§ ®á®¢®£® ®¡à ¡®â稪
|
DB high FN_RESERVED_5x ;#5B - „ã¡«ì. <20> íâã äãªæ¨î ¯àë£ ¥â ¨§ ®á®¢®£® ®¡à ¡®â稪
|
||||||
DB high FN_RESERVED_5x ;#5C - „ã¡«ì. <20> íâã äãªæ¨î ¯àë£ ¥â ¨§ ®á®¢®£® ®¡à ¡®â稪
|
DB high FN_RESERVED_5x ;#5C - „ã¡«ì. <20> íâã äãªæ¨î ¯àë£ ¥â ¨§ ®á®¢®£® ®¡à ¡®â稪
|
||||||
@ -610,6 +611,7 @@ TAB_5xFNS:
|
|||||||
DB high FN_ABSENT_5x
|
DB high FN_ABSENT_5x
|
||||||
DB high RMD_5x_GETMED
|
DB high RMD_5x_GETMED
|
||||||
DB high RMD_5x_SETMED
|
DB high RMD_5x_SETMED
|
||||||
|
|
||||||
DB high DRV_VERSION
|
DB high DRV_VERSION
|
||||||
DB high FN_RESERVED_5x
|
DB high FN_RESERVED_5x
|
||||||
DB high FN_RESERVED_5x
|
DB high FN_RESERVED_5x
|
||||||
@ -634,6 +636,7 @@ TAB_5xFNS:
|
|||||||
DB high HDD_5x_DETECT
|
DB high HDD_5x_DETECT
|
||||||
DB high HDD_5x_GETMED
|
DB high HDD_5x_GETMED
|
||||||
DB high HDD_5x_SETMED
|
DB high HDD_5x_SETMED
|
||||||
|
|
||||||
DB high DRV_VERSION
|
DB high DRV_VERSION
|
||||||
DB high FN_RESERVED_5x
|
DB high FN_RESERVED_5x
|
||||||
DB high FN_RESERVED_5x
|
DB high FN_RESERVED_5x
|
||||||
@ -651,13 +654,14 @@ TAB_5xFNS:
|
|||||||
DB high FN_RESERVED_5x
|
DB high FN_RESERVED_5x
|
||||||
DB high CD_5x_RESET
|
DB high CD_5x_RESET
|
||||||
DB high CD_5x_LONG_READ
|
DB high CD_5x_LONG_READ
|
||||||
DB high FN_ABSENT_5x
|
DB high CD_5x_LONG_WRITE ; LONG_WRITE ; [ ] new
|
||||||
DB high FN_ABSENT_5x
|
DB high FN_ABSENT_5x
|
||||||
DB high CD_5x_READ
|
DB high CD_5x_READ
|
||||||
DB high FN_ABSENT_5x
|
DB high CD_5x_WRITE ; WRITE ; [ ] new
|
||||||
DB high CD_5x_DETECT
|
DB high CD_5x_DETECT
|
||||||
DB high FN_ABSENT_5x
|
DB high FN_ABSENT_5x
|
||||||
DB high FN_ABSENT_5x
|
DB high FN_ABSENT_5x
|
||||||
|
|
||||||
DB high DRV_VERSION
|
DB high DRV_VERSION
|
||||||
DB high FN_RESERVED_5x
|
DB high FN_RESERVED_5x
|
||||||
DB high FN_RESERVED_5x
|
DB high FN_RESERVED_5x
|
||||||
|
|||||||
@ -14,11 +14,11 @@
|
|||||||
;
|
;
|
||||||
;----------------------------------------------------------------------------------
|
;----------------------------------------------------------------------------------
|
||||||
MAX_ATAPI_SEC_SIZE EQU 4096/2
|
MAX_ATAPI_SEC_SIZE EQU 4096/2
|
||||||
PKTSIZE EQU 12
|
PACKET_SIZE EQU 12 ; !FIXIT ¡à âì ¨§ IDENTIFY PACKET DEVICE
|
||||||
RAM_ATAPI_PK EQU SYS_PAGE.SHARED_BUFFER_32b
|
RAM_ATAPI_PK EQU SYS_PAGE.SHARED_BUFFER_32b
|
||||||
RAM_ATAPI_RW_CMD EQU SYS_PAGE.SHARED_BUFFER_32b+16
|
RAM_ATAPI_RW_CMD EQU SYS_PAGE.SHARED_BUFFER_32b+16
|
||||||
|
|
||||||
ASSERT ((PKTSIZE % 4) = 0), "PKTSIZE must be an even number"
|
ASSERT ((PACKET_SIZE % 4) = 0), "PACKET_SIZE must be an even number"
|
||||||
|
|
||||||
;[]================================================================[#51]
|
;[]================================================================[#51]
|
||||||
CD_5x_RESET: LD C,IDE.Device.ATAPI
|
CD_5x_RESET: LD C,IDE.Device.ATAPI
|
||||||
@ -54,7 +54,7 @@ CD_5x_READ:
|
|||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
;[]================================================================[#52]
|
;[]================================================================[#52]
|
||||||
;Function: Long Read Sectors
|
;Function: Long Read Sectors
|
||||||
; A - Disk
|
; A -os
|
||||||
; HL:IX - Sector
|
; HL:IX - Sector
|
||||||
; DE - Address
|
; DE - Address
|
||||||
; B - Sector counter
|
; B - Sector counter
|
||||||
@ -75,7 +75,18 @@ CD_5x_LONG_READ:
|
|||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
CALL RW_ATAPI_SECTORs
|
CALL RW_ATAPI_SECTORs
|
||||||
JP HDD_5x_LONG_READ.shared
|
JP HDD_5x_LONG_READ.shared
|
||||||
|
;
|
||||||
|
;[]================================================================[#52]
|
||||||
|
; INPUT:
|
||||||
|
; A - Disk
|
||||||
|
; HL:IX - Sector
|
||||||
|
; DE - Address
|
||||||
|
; B - Sector counter
|
||||||
|
; A'- Memory Page Number
|
||||||
|
; CF'=1 - write, CF'=0 - read
|
||||||
|
;
|
||||||
|
; OUTPUT:
|
||||||
|
;
|
||||||
RW_ATAPI_SECTORs:
|
RW_ATAPI_SECTORs:
|
||||||
LD C,IDE.Device.ATAPI
|
LD C,IDE.Device.ATAPI
|
||||||
CALL SELECT_DRIVE
|
CALL SELECT_DRIVE
|
||||||
@ -83,8 +94,8 @@ RW_ATAPI_SECTORs:
|
|||||||
;
|
;
|
||||||
EXX
|
EXX
|
||||||
LD C,SLOT3
|
LD C,SLOT3
|
||||||
IN A,(C)
|
IN B,(C)
|
||||||
PUSH AF
|
PUSH BC
|
||||||
LD A,SYS_PAGE
|
LD A,SYS_PAGE
|
||||||
OUT (C),A
|
OUT (C),A
|
||||||
LD HL,ATAPI_CMD_PACKET.READ
|
LD HL,ATAPI_CMD_PACKET.READ
|
||||||
@ -93,7 +104,7 @@ RW_ATAPI_SECTORs:
|
|||||||
LD HL,ATAPI_CMD_PACKET.WRITE
|
LD HL,ATAPI_CMD_PACKET.WRITE
|
||||||
.read_cmd: EX AF,AF'
|
.read_cmd: EX AF,AF'
|
||||||
LD DE,RAM_ATAPI_RW_CMD
|
LD DE,RAM_ATAPI_RW_CMD
|
||||||
LD BC,PKTSIZE
|
LD BC,PACKET_SIZE
|
||||||
LDIR
|
LDIR
|
||||||
EXX
|
EXX
|
||||||
;
|
;
|
||||||
@ -108,8 +119,8 @@ RW_ATAPI_SECTORs:
|
|||||||
LD A,B
|
LD A,B
|
||||||
LD (RAM_ATAPI_RW_CMD + ATAPI_PACKET.COUNTER+1),A ;R01
|
LD (RAM_ATAPI_RW_CMD + ATAPI_PACKET.COUNTER+1),A ;R01
|
||||||
;
|
;
|
||||||
EX AF,AF'
|
; EX AF,AF'
|
||||||
OUT (SLOT3),A
|
; OUT (SLOT3),A
|
||||||
;
|
;
|
||||||
; POP AF
|
; POP AF
|
||||||
; OUT (SLOT3),A
|
; OUT (SLOT3),A
|
||||||
@ -117,11 +128,50 @@ RW_ATAPI_SECTORs:
|
|||||||
CALL EXEC_PACKET_COMMAND
|
CALL EXEC_PACKET_COMMAND
|
||||||
;
|
;
|
||||||
POP BC
|
POP BC
|
||||||
LD C,SLOT3
|
;LD C,SLOT3
|
||||||
OUT (C),B
|
OUT (C),B
|
||||||
RET
|
RET
|
||||||
;[]===========================================================[#52, #55]
|
;[]===========================================================[#52, #55]
|
||||||
|
|
||||||
|
;[]================================================================[#56]
|
||||||
|
;Function: Write Sectors
|
||||||
|
; A - Disk
|
||||||
|
; HL:IX - Sector
|
||||||
|
; DE - Address
|
||||||
|
; B - Sector counter
|
||||||
|
;Return:
|
||||||
|
; HL:IX - Sector + Sector counter
|
||||||
|
; DE - Address + (Sector counter * Size sector)
|
||||||
|
;WRITE SECTOR(S)
|
||||||
|
CD_5x_WRITE:
|
||||||
|
EX AF,AF'
|
||||||
|
IN A,(SLOT3)
|
||||||
|
EX AF,AF'
|
||||||
|
;[]================================================================[#53]
|
||||||
|
;Function: Long Write Sectors
|
||||||
|
; A - Disk
|
||||||
|
; HL:IX - Sector
|
||||||
|
; DE - Address
|
||||||
|
; B - Sector counter
|
||||||
|
; A'- Memory Page Number
|
||||||
|
;Return:
|
||||||
|
; HL:IX - Sector + Sector counter
|
||||||
|
; DE - Address + (Sector counter * Size sector)
|
||||||
|
;WRITE SECTOR(S)
|
||||||
|
CD_5x_LONG_WRITE:
|
||||||
|
PUSH IY
|
||||||
|
SAFE_PORTY_2
|
||||||
|
PUSH BC
|
||||||
|
PUSH IX
|
||||||
|
PUSH HL
|
||||||
|
;
|
||||||
|
EX AF,AF'
|
||||||
|
SCF ;write
|
||||||
|
EX AF,AF'
|
||||||
|
CALL RW_ATAPI_SECTORs
|
||||||
|
;
|
||||||
|
JP HDD_5x_LONG_READ.shared
|
||||||
|
|
||||||
|
|
||||||
;[]================================================================[#57]
|
;[]================================================================[#57]
|
||||||
;Function: Detect Disk
|
;Function: Detect Disk
|
||||||
@ -208,7 +258,7 @@ EXEC_PACKET_COMMAND:
|
|||||||
LD A,SYS_PAGE
|
LD A,SYS_PAGE
|
||||||
OUT (C),A
|
OUT (C),A
|
||||||
LD DE,RAM_ATAPI_PK ;!FIXIT ¬®¦¥â á⥪¥ ¢ë¤¥«ïâì ¬¥áâ®?
|
LD DE,RAM_ATAPI_PK ;!FIXIT ¬®¦¥â á⥪¥ ¢ë¤¥«ïâì ¬¥áâ®?
|
||||||
LD BC,PKTSIZE
|
LD BC,PACKET_SIZE
|
||||||
LDIR
|
LDIR
|
||||||
;
|
;
|
||||||
POP BC
|
POP BC
|
||||||
@ -222,9 +272,9 @@ EXEC_PACKET_COMMAND:
|
|||||||
LD BC,IDE.Write.Features
|
LD BC,IDE.Write.Features
|
||||||
OUT (C),A
|
OUT (C),A
|
||||||
LD DE,MAX_ATAPI_SEC_SIZE ;SIZE BLOCK ;!HARDCODE ¤®áâ ¢ âì ¨§ ¯¥à¥¬¥®© ª ª®©-¨¡ã¤ì
|
LD DE,MAX_ATAPI_SEC_SIZE ;SIZE BLOCK ;!HARDCODE ¤®áâ ¢ âì ¨§ ¯¥à¥¬¥®© ª ª®©-¨¡ã¤ì
|
||||||
LD BC,IDE.Write.CylinderLow
|
LD BC,IDE.Write.ByteCountLow
|
||||||
OUT (C),E
|
OUT (C),E
|
||||||
LD BC,IDE.Write.CylinderHigh
|
LD BC,IDE.Write.ByteCountHigh
|
||||||
OUT (C),D
|
OUT (C),D
|
||||||
LD BC,IDE.Write.Command
|
LD BC,IDE.Write.Command
|
||||||
LD A,IDE.ATAPI.Packet
|
LD A,IDE.ATAPI.Packet
|
||||||
@ -250,7 +300,7 @@ EXEC_PACKET_COMMAND:
|
|||||||
RRCA
|
RRCA
|
||||||
AND #0F
|
AND #0F
|
||||||
SCF
|
SCF
|
||||||
RET
|
RET
|
||||||
;
|
;
|
||||||
.YEP_DRQ: LD C,SLOT3
|
.YEP_DRQ: LD C,SLOT3
|
||||||
IN B,(C)
|
IN B,(C)
|
||||||
@ -259,7 +309,7 @@ EXEC_PACKET_COMMAND:
|
|||||||
OUT (SLOT3),A
|
OUT (SLOT3),A
|
||||||
LD HL,RAM_ATAPI_PK
|
LD HL,RAM_ATAPI_PK
|
||||||
LD BC,IDE.Write.Data
|
LD BC,IDE.Write.Data
|
||||||
LD A,PKTSIZE/4
|
LD A,PACKET_SIZE/4 ; !FIXIT ¡à âì ¨§ IDENTIFY PACKET DEVICE
|
||||||
.OUTPKT: OUTI
|
.OUTPKT: OUTI
|
||||||
OUTI
|
OUTI
|
||||||
OUTI
|
OUTI
|
||||||
@ -268,8 +318,8 @@ EXEC_PACKET_COMMAND:
|
|||||||
JR NZ,.OUTPKT
|
JR NZ,.OUTPKT
|
||||||
;
|
;
|
||||||
POP BC
|
POP BC
|
||||||
|
|
||||||
OUT (C),B
|
OUT (C),B
|
||||||
|
;
|
||||||
LD B,#80
|
LD B,#80
|
||||||
.pause2: DJNZ .pause2
|
.pause2: DJNZ .pause2
|
||||||
;
|
;
|
||||||
@ -301,17 +351,17 @@ EXEC_PACKET_COMMAND:
|
|||||||
;====== IF DATA REQUEST =======================================;
|
;====== IF DATA REQUEST =======================================;
|
||||||
;
|
;
|
||||||
EX DE,HL
|
EX DE,HL
|
||||||
LD BC,IDE.Read.CylinderLow
|
LD BC,IDE.Read.ByteCountLow
|
||||||
IN E,(C)
|
IN E,(C)
|
||||||
LD BC,IDE.Read.CylinderHigh
|
LD BC,IDE.Read.ByteCountHigh
|
||||||
IN D,(C) ;TRANSFER BLOCK SIZE
|
IN D,(C) ;TRANSFER BLOCK SIZE
|
||||||
LD A,D
|
LD A,D
|
||||||
OR E
|
OR E
|
||||||
RET Z ;BLOCK = 0
|
RET Z ;BLOCK = 0
|
||||||
;
|
;
|
||||||
LD BC,IDE.Read.Counter
|
LD BC,IDE.Read.InterruptReason
|
||||||
IN A,(C)
|
IN A,(C)
|
||||||
AND %0000'0010 ;SENSE DATA AVAILABLE bit
|
AND IDE.InterruptReasonByte.IO
|
||||||
LD BC,IDE.Read.Data
|
LD BC,IDE.Read.Data
|
||||||
JR Z,.WRITE_DATA
|
JR Z,.WRITE_DATA
|
||||||
;
|
;
|
||||||
@ -325,6 +375,9 @@ EXEC_PACKET_COMMAND:
|
|||||||
JR NZ,.read_loop
|
JR NZ,.read_loop
|
||||||
;
|
;
|
||||||
.return_rw: INC XL ;INC LOADED SECTORS
|
.return_rw: INC XL ;INC LOADED SECTORS
|
||||||
|
EX AF,AF' ;<-----------< /
|
||||||
|
OUT (SLOT3),A
|
||||||
|
;
|
||||||
LD A,H
|
LD A,H
|
||||||
OR L
|
OR L
|
||||||
JR NZ,.AP_LOOP
|
JR NZ,.AP_LOOP
|
||||||
|
|||||||
@ -1,779 +0,0 @@
|
|||||||
|
|
||||||
;========================================================
|
|
||||||
;R03 !25.07.2001! BUG FIX WITH RETURN ERROR CODE
|
|
||||||
;R02 !24.07.2001! ADD SECONDARY CHANEL
|
|
||||||
;R01 !16.08.2000! REMOVED "DI"
|
|
||||||
|
|
||||||
/*
|
|
||||||
;Write
|
|
||||||
IDE.Write.Command EQU #4153 ; #1F7 Command
|
|
||||||
IDE.Write.DeviceHead EQU #4152 ; #1F6 Drive Control
|
|
||||||
|
|
||||||
HDW_CLH EQU #0155 ; #1F5 Cylinder High
|
|
||||||
HDW_CLL EQU #0154 ; #1F4 Cylinder Low
|
|
||||||
HDW_SEC EQU #0153 ; #1F3 Sector
|
|
||||||
HDW_CNT EQU #0152 ; #1F2 Counter
|
|
||||||
HDW_ERR EQU #0151 ; #1F1 Error
|
|
||||||
HDW_DAT EQU #0150 ; #1F0 Data
|
|
||||||
|
|
||||||
;Read
|
|
||||||
IDE.Read.Status EQU #4053 ; #1F7 Status (Control)
|
|
||||||
HDR_DRV EQU #4052 ; #1F6 Drive Control
|
|
||||||
|
|
||||||
HDR_CLH EQU #0055 ; #1F5 Cylinder High
|
|
||||||
HDR_CLL EQU #0054 ; #1F4 Cylinder Low
|
|
||||||
HDR_SEC EQU #0053 ; #1F3 Sector
|
|
||||||
HDR_CNT EQU #0052 ; #1F2 Counter
|
|
||||||
HDR_ERR EQU #0051 ; #1F1 Error
|
|
||||||
HDR_DAT EQU #0050 ; #1F0 Data
|
|
||||||
|
|
||||||
;Bits for IDE.Read.Status
|
|
||||||
;---[]
|
|
||||||
BSY EQU 7
|
|
||||||
RDY EQU 6
|
|
||||||
DRQ EQU 3
|
|
||||||
ERR EQU 0
|
|
||||||
;---[]
|
|
||||||
|
|
||||||
HDD EQU 1
|
|
||||||
CDROM EQU 2
|
|
||||||
|
|
||||||
|
|
||||||
;EQU FOR IY+
|
|
||||||
IDE.HDD_INIT_TABLE.DRV_Flags EQU 0
|
|
||||||
IDE.HDD_INIT_TABLE.SectorsPerTrack EQU 1
|
|
||||||
IDE.HDD_INIT_TABLE.HeadsNumber EQU 2
|
|
||||||
IDE.HDD_INIT_TABLE.CylinderNumberLow EQU 3
|
|
||||||
IDE.HDD_INIT_TABLE.CylinderNumberHigh EQU 4
|
|
||||||
IDE.HDD_INIT_TABLE.SectorsPerCylinderLow EQU 5
|
|
||||||
IDE.HDD_INIT_TABLE.SectorsPerCylinderHigh EQU 6
|
|
||||||
DTYPE_H EQU 7
|
|
||||||
|
|
||||||
IDE0 EQU #C1C0
|
|
||||||
IDE1 EQU #C1C8
|
|
||||||
IDE2 EQU #C1D0
|
|
||||||
IDE3 EQU #C1D8
|
|
||||||
*/
|
|
||||||
|
|
||||||
;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
|
|
||||||
|
|
||||||
|
|
||||||
WRITE_OUTI_DUPs EQU 32 ; bytes
|
|
||||||
|
|
||||||
;[]================================================================[#51]
|
|
||||||
;Function: Reset drive
|
|
||||||
HDD_5x_RESET: ; !FIXIT ¥ à¥á¥â¨âáï?
|
|
||||||
;For non-ATAPI drives, the only method a driver has of resetting a drive
|
|
||||||
; after a major error is to do a "software reset" on the bus.
|
|
||||||
; Set bit 2 (SRST, value = 4) in the proper Control Register for the
|
|
||||||
; bus. This will reset both ATA devices on the bus. Then, you have to
|
|
||||||
; clear that bit again, yourself. The master drive on the bus is
|
|
||||||
; automatically selected.
|
|
||||||
XOR A
|
|
||||||
RET
|
|
||||||
;[]================================================================[#51]
|
|
||||||
|
|
||||||
|
|
||||||
;[]================================================================[#58]
|
|
||||||
;Function: Get Current Media Parameters
|
|
||||||
; A - Disk
|
|
||||||
;Return:
|
|
||||||
; H - Heads
|
|
||||||
; L - Sectors per cylinder
|
|
||||||
; DE - Cylinders
|
|
||||||
; IX - Capacity sector in bytes
|
|
||||||
; B - Flags: MASTER/SLAVE, LBA/CHS
|
|
||||||
HDD_5x_GETMED:
|
|
||||||
LD C,IDE.Device.HDD
|
|
||||||
CALL SELECT_DRIVE
|
|
||||||
RET C
|
|
||||||
IN A,(SLOT3)
|
|
||||||
EX AF,AF'
|
|
||||||
LD A,SYS_PAGE
|
|
||||||
OUT (SLOT3),A
|
|
||||||
LD L,(IY+IDE.HDD_INIT_TABLE.SectorsPerTrack)
|
|
||||||
LD H,(IY+IDE.HDD_INIT_TABLE.HeadsNumber)
|
|
||||||
LD E,(IY+IDE.HDD_INIT_TABLE.CylinderNumberLow)
|
|
||||||
LD D,(IY+IDE.HDD_INIT_TABLE.CylinderNumberHigh)
|
|
||||||
LD B,(IY+IDE.HDD_INIT_TABLE.DRV_Flags)
|
|
||||||
LD IX,512 ;!HARDCODE sector size
|
|
||||||
EX AF,AF'
|
|
||||||
OUT (SLOT3),A
|
|
||||||
;EX AF,AF'
|
|
||||||
AND A
|
|
||||||
RET
|
|
||||||
;[]================================================================[#58]
|
|
||||||
|
|
||||||
;[]================================================================[#59]
|
|
||||||
;Function: Set Current Media Parameters
|
|
||||||
; A - Disk
|
|
||||||
; H - Heads
|
|
||||||
; L - Sectors
|
|
||||||
; DE - Cylinders
|
|
||||||
; IX - Capacity sector in bytes
|
|
||||||
; B - Flags
|
|
||||||
;Return: None
|
|
||||||
HDD_5x_SETMED:
|
|
||||||
LD C,IDE.Device.HDD
|
|
||||||
CALL SELECT_DRIVE
|
|
||||||
RET C
|
|
||||||
IN A,(SLOT3)
|
|
||||||
EX AF,AF'
|
|
||||||
LD A,SYS_PAGE
|
|
||||||
OUT (SLOT3),A
|
|
||||||
LD (IY+IDE.HDD_INIT_TABLE.SectorsPerTrack),L
|
|
||||||
LD (IY+IDE.HDD_INIT_TABLE.HeadsNumber),H
|
|
||||||
LD (IY+IDE.HDD_INIT_TABLE.CylinderNumberLow),E
|
|
||||||
LD (IY+IDE.HDD_INIT_TABLE.CylinderNumberHigh),D
|
|
||||||
LD (IY+IDE.HDD_INIT_TABLE.DRV_Flags),B
|
|
||||||
EX AF,AF'
|
|
||||||
OUT (SLOT3),A
|
|
||||||
;EX AF,AF'
|
|
||||||
AND A
|
|
||||||
RET
|
|
||||||
;[]================================================================[#59]
|
|
||||||
|
|
||||||
;[]================================================================[#55]
|
|
||||||
;Function: Read Sectors
|
|
||||||
; A - Disk
|
|
||||||
; HL:IX - Sector
|
|
||||||
; DE - Address
|
|
||||||
; B - Sector counter
|
|
||||||
;Return:
|
|
||||||
; HL:IX - Sector + Sector counter
|
|
||||||
; DE - Address + (Sector counter * Size sector)
|
|
||||||
;READ SECTOR(S)
|
|
||||||
HDD_5x_READ:
|
|
||||||
EX AF,AF'
|
|
||||||
IN A,(SLOT3)
|
|
||||||
EX AF,AF'
|
|
||||||
;[]================================================================[#52]
|
|
||||||
;Function: Long Read Sectors
|
|
||||||
; A - Disk
|
|
||||||
; HL:IX - Sector
|
|
||||||
; DE - Address
|
|
||||||
; B - Sector counter, 0 = 256
|
|
||||||
; A'- Memory Page Number
|
|
||||||
;Return:
|
|
||||||
; HL:IX - Sector + Sector counter
|
|
||||||
; DE - Address + (Sector counter * Size sector)
|
|
||||||
; A' - Last mem page in RAM Block used for readed data
|
|
||||||
;LONG READ SECTOR(S)
|
|
||||||
HDD_5x_LONG_READ:
|
|
||||||
PUSH IY
|
|
||||||
SAFE_PORTY_2
|
|
||||||
PUSH BC
|
|
||||||
PUSH IX
|
|
||||||
PUSH HL
|
|
||||||
;IF OPTIMIZE_RW_PROCEDURE
|
|
||||||
EX AF,AF'
|
|
||||||
AND A ;read
|
|
||||||
EX AF,AF'
|
|
||||||
CALL RW_ATA_SECTORs
|
|
||||||
;ELSE
|
|
||||||
;CALL READ_ATA_SECTORs
|
|
||||||
;ENDIF
|
|
||||||
;
|
|
||||||
EX DE,HL
|
|
||||||
JR C,.error
|
|
||||||
LD A,XH ; current page in mem block for SLOT3
|
|
||||||
EX AF,AF'
|
|
||||||
;
|
|
||||||
POP HL
|
|
||||||
POP IX
|
|
||||||
POP BC
|
|
||||||
XOR A
|
|
||||||
CP B
|
|
||||||
LD C,B
|
|
||||||
LD B,A
|
|
||||||
JR Z,.B_256_sectors
|
|
||||||
;
|
|
||||||
ADD IX,BC
|
|
||||||
LD C,B
|
|
||||||
.pre_exit: ADC HL,BC
|
|
||||||
.exit: RESTORE_PORTY
|
|
||||||
POP IY
|
|
||||||
RET
|
|
||||||
;
|
|
||||||
.B_256_sectors: INC B
|
|
||||||
ADD IX,BC
|
|
||||||
LD B,C
|
|
||||||
JR .pre_exit
|
|
||||||
;
|
|
||||||
.error: LD B,A ; A - ®¬¥à ®è¨¡ª¨
|
|
||||||
LD C,XL
|
|
||||||
LD A,XH ; current page in mem block for SLOT3
|
|
||||||
EX AF,AF'
|
|
||||||
POP HL
|
|
||||||
POP IX
|
|
||||||
PUSH BC
|
|
||||||
LD B,0
|
|
||||||
ADD IX,BC
|
|
||||||
LD C,B
|
|
||||||
ADC HL,BC
|
|
||||||
POP BC
|
|
||||||
POP AF
|
|
||||||
SUB C
|
|
||||||
LD C,A
|
|
||||||
LD A,B
|
|
||||||
LD B,C
|
|
||||||
SCF ;R03
|
|
||||||
JR .exit
|
|
||||||
;
|
|
||||||
/*
|
|
||||||
IFN OPTIMIZE_RW_PROCEDURE
|
|
||||||
READ_ATA_SECTORs:
|
|
||||||
LD C,IDE.Device.HDD
|
|
||||||
CALL SELECT_DRIVE
|
|
||||||
RET C
|
|
||||||
EXX
|
|
||||||
;LD DE,#C140 ;WAIT BUSY=0 & READY=1 & ERR=0
|
|
||||||
CALL WAITPRT
|
|
||||||
EXX
|
|
||||||
RET C
|
|
||||||
EX AF,AF'
|
|
||||||
PUSH AF ; memory page number
|
|
||||||
PUSH DE
|
|
||||||
CALL PRESET
|
|
||||||
POP HL
|
|
||||||
POP AF ; memory page number
|
|
||||||
LD XL,0
|
|
||||||
LD XH,A
|
|
||||||
LD BC,IDE.Write.Command
|
|
||||||
LD A,IDE.ATA.ReadSectorsWithRetry
|
|
||||||
OUT (C),A
|
|
||||||
;SAVE HL!
|
|
||||||
EXX
|
|
||||||
LD DE,#8908 ;WAIT BUSY=0 & DRQ=1 & ERR=0
|
|
||||||
CALL WAITPRT.custom
|
|
||||||
EXX
|
|
||||||
RET C
|
|
||||||
;DI ;R01 REMOVED "DI"
|
|
||||||
.big_loop: IN A,(SLOT3)
|
|
||||||
EX AF,AF' ;>-----------> \
|
|
||||||
LD A,XH
|
|
||||||
OUT (SLOT3),A
|
|
||||||
;
|
|
||||||
; READ SECTOR 512 bytes ;!HARDCODE sector size
|
|
||||||
LD BC,IDE.Read.Data
|
|
||||||
.loop_256_1: DUP 16
|
|
||||||
INI
|
|
||||||
EDUP
|
|
||||||
JP NZ,.loop_256_1
|
|
||||||
.loop_256_2: DUP 16
|
|
||||||
INI
|
|
||||||
EDUP
|
|
||||||
JP NZ,.loop_256_2
|
|
||||||
; ; ; ; ;
|
|
||||||
;
|
|
||||||
EX AF,AF' ;<-----------< /
|
|
||||||
OUT (SLOT3),A
|
|
||||||
;
|
|
||||||
LD A,H
|
|
||||||
OR L
|
|
||||||
JR NZ,.W44
|
|
||||||
; next page in mem block
|
|
||||||
LD HL,#C000
|
|
||||||
IN A,(SLOT3)
|
|
||||||
EX AF,AF' ;>-----------> \
|
|
||||||
LD A,SYS_PAGE
|
|
||||||
OUT (SLOT3),A
|
|
||||||
LD D,high SYS_PAGE.RAM_TABLE
|
|
||||||
LD E,XH
|
|
||||||
LD A,(DE)
|
|
||||||
LD XH,A
|
|
||||||
EX AF,AF' ;<-----------< /
|
|
||||||
OUT (SLOT3),A
|
|
||||||
;
|
|
||||||
.W44: INC XL ;INC LOADED SECTORS
|
|
||||||
EXX
|
|
||||||
;LD DE,#C140 ;WAIT BUSY=0 & ERR=0 & READY=1
|
|
||||||
CALL WAITPRT
|
|
||||||
EXX
|
|
||||||
RET C
|
|
||||||
LD BC,IDE.Read.Status
|
|
||||||
IN A,(C)
|
|
||||||
BIT IDE.CtrlBit.DataRequest,A
|
|
||||||
;
|
|
||||||
RET Z
|
|
||||||
JP .big_loop
|
|
||||||
;JP NZ,.big_loop
|
|
||||||
;XOR A
|
|
||||||
;RET
|
|
||||||
;
|
|
||||||
ENDIF
|
|
||||||
*/
|
|
||||||
;[]===========================================================[#52, #55]
|
|
||||||
|
|
||||||
|
|
||||||
;[]================================================================[#56]
|
|
||||||
;Function: Write Sectors
|
|
||||||
; A - Disk
|
|
||||||
; HL:IX - Sector
|
|
||||||
; DE - Address
|
|
||||||
; B - Sector counter
|
|
||||||
;Return:
|
|
||||||
; HL:IX - Sector + Sector counter
|
|
||||||
; DE - Address + (Sector counter * Size sector)
|
|
||||||
;WRITE SECTOR(S)
|
|
||||||
HDD_5x_WRITE:
|
|
||||||
EX AF,AF'
|
|
||||||
IN A,(SLOT3)
|
|
||||||
EX AF,AF'
|
|
||||||
;[]================================================================[#53]
|
|
||||||
;Function: Long Write Sectors
|
|
||||||
; A - Disk
|
|
||||||
; HL:IX - Sector
|
|
||||||
; DE - Address
|
|
||||||
; B - Sector counter
|
|
||||||
; A'- Memory Page Number
|
|
||||||
;Return:
|
|
||||||
; HL:IX - Sector + Sector counter
|
|
||||||
; DE - Address + (Sector counter * Size sector)
|
|
||||||
;WRITE SECTOR(S)
|
|
||||||
HDD_5x_LONG_WRITE:
|
|
||||||
PUSH IY
|
|
||||||
|
|
||||||
SAFE_PORTY_2
|
|
||||||
|
|
||||||
PUSH IX
|
|
||||||
PUSH HL
|
|
||||||
PUSH BC
|
|
||||||
;IF OPTIMIZE_RW_PROCEDURE
|
|
||||||
EX AF,AF'
|
|
||||||
SCF ;write
|
|
||||||
EX AF,AF'
|
|
||||||
CALL RW_ATA_SECTORs
|
|
||||||
;ELSE
|
|
||||||
;CALL WRITE_ATA_SECTORs
|
|
||||||
;ENDIF
|
|
||||||
;
|
|
||||||
EX DE,HL
|
|
||||||
JP C,HERRWR0
|
|
||||||
LD A,XH
|
|
||||||
EX AF,AF'
|
|
||||||
POP BC
|
|
||||||
POP HL
|
|
||||||
POP IX
|
|
||||||
XOR A
|
|
||||||
CP B
|
|
||||||
LD C,B
|
|
||||||
LD B,A
|
|
||||||
JR NZ,WNOT256
|
|
||||||
INC B
|
|
||||||
ADD IX,BC
|
|
||||||
LD B,C
|
|
||||||
ADC HL,BC
|
|
||||||
;EX AF,AF'
|
|
||||||
JR RST8WRR
|
|
||||||
|
|
||||||
WNOT256 ADD IX,BC
|
|
||||||
LD C,B
|
|
||||||
ADC HL,BC
|
|
||||||
;EX AF,AF'
|
|
||||||
JR RST8WRR
|
|
||||||
|
|
||||||
HERRWR0 LD B,A
|
|
||||||
LD C,XL
|
|
||||||
LD A,XH
|
|
||||||
EX AF,AF'
|
|
||||||
POP HL
|
|
||||||
POP IX
|
|
||||||
PUSH BC
|
|
||||||
LD B,0
|
|
||||||
ADD IX,BC
|
|
||||||
LD C,B
|
|
||||||
ADC HL,BC
|
|
||||||
POP BC
|
|
||||||
POP AF
|
|
||||||
SUB C
|
|
||||||
LD C,A
|
|
||||||
LD A,B
|
|
||||||
LD B,C
|
|
||||||
;R03
|
|
||||||
SCF ;R03
|
|
||||||
;EX AF,AF' ;R03 ;!FIXIT ¬ã¤à¨« ® çñâ ¢ í⮬ R03
|
|
||||||
;
|
|
||||||
RST8WRR: RESTORE_PORTY
|
|
||||||
POP IY
|
|
||||||
;EX AF,AF'
|
|
||||||
RET
|
|
||||||
|
|
||||||
|
|
||||||
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ;
|
|
||||||
/*
|
|
||||||
temp1=0;
|
|
||||||
bp 20e3,{b@20e3==cd},{temp1=1; g};
|
|
||||||
bp 213b,{b@213b==cd},{temp1=2; g};
|
|
||||||
bp 21B1,{b@21b1==01 and temp1==2};
|
|
||||||
bp 2229,{b@2229==01 and temp1==1};
|
|
||||||
*/
|
|
||||||
; IF OPTIMIZE_RW_PROCEDURE
|
|
||||||
; CF=1 - write, CF=0 - read
|
|
||||||
RW_ATA_SECTORs: LD C,IDE.Device.HDD
|
|
||||||
CALL SELECT_DRIVE
|
|
||||||
RET C
|
|
||||||
EXX
|
|
||||||
;LD DE,#C140 ;WAIT BUSY=0 & READY=1 & ERR=0
|
|
||||||
CALL WAITPRT
|
|
||||||
EXX
|
|
||||||
RET C
|
|
||||||
EX AF,AF'
|
|
||||||
PUSH AF ; memory page number
|
|
||||||
PUSH DE
|
|
||||||
CALL PRESET
|
|
||||||
POP HL
|
|
||||||
POP AF ; memory page number
|
|
||||||
LD XL,0
|
|
||||||
LD XH,A
|
|
||||||
LD BC,IDE.Write.Command
|
|
||||||
LD A,IDE.ATA.WriteSectorsWithRetry
|
|
||||||
JR C,.set_command
|
|
||||||
;
|
|
||||||
LD A,IDE.ATA.ReadSectorsWithRetry
|
|
||||||
.set_command: OUT (C),A
|
|
||||||
;SAVE HL!
|
|
||||||
EX AF,AF'
|
|
||||||
EXX
|
|
||||||
LD DE,256*(IDE.CtrlByte.Busy+IDE.CtrlByte.DataRequest+IDE.CtrlByte.Error)+IDE.CtrlByte.DataRequest
|
|
||||||
CALL WAITPRT.custom
|
|
||||||
EXX
|
|
||||||
RET C
|
|
||||||
;DI ;R01 REMOVED "DI"
|
|
||||||
.big_loop: IN A,(SLOT3)
|
|
||||||
EX AF,AF' ;>-----------> \
|
|
||||||
LD A,XH
|
|
||||||
OUT (SLOT3),A
|
|
||||||
JR C,.write_sector
|
|
||||||
;
|
|
||||||
; READ SECTOR 512 bytes ;!HARDCODE sector size
|
|
||||||
LD BC,IDE.Read.Data
|
|
||||||
.loop_256_1: DUP 16
|
|
||||||
INI
|
|
||||||
EDUP
|
|
||||||
JP NZ,.loop_256_1
|
|
||||||
.loop_256_2: DUP 16
|
|
||||||
INI
|
|
||||||
EDUP
|
|
||||||
JP NZ,.loop_256_2
|
|
||||||
EX AF,AF'
|
|
||||||
; ; ; ; ;
|
|
||||||
; CF=0
|
|
||||||
.return_rw: EX AF,AF' ;<-----------< /
|
|
||||||
OUT (SLOT3),A
|
|
||||||
;
|
|
||||||
LD A,H
|
|
||||||
OR L
|
|
||||||
JR NZ,.W44
|
|
||||||
; next page in mem block
|
|
||||||
LD HL,#C000
|
|
||||||
IN A,(SLOT3)
|
|
||||||
EX AF,AF' ;>-----------> \
|
|
||||||
LD A,SYS_PAGE
|
|
||||||
OUT (SLOT3),A
|
|
||||||
LD D,high SYS_PAGE.RAM_TABLE
|
|
||||||
LD E,XH
|
|
||||||
LD A,(DE)
|
|
||||||
LD XH,A
|
|
||||||
EX AF,AF' ;<-----------< /
|
|
||||||
OUT (SLOT3),A
|
|
||||||
;
|
|
||||||
.W44: INC XL ;INC LOADED SECTORS
|
|
||||||
EXX
|
|
||||||
CALL WAITPRT
|
|
||||||
EXX
|
|
||||||
RET C
|
|
||||||
LD BC,IDE.Read.Status
|
|
||||||
IN A,(C)
|
|
||||||
BIT IDE.CtrlBit.DataRequest,A
|
|
||||||
;
|
|
||||||
RET Z
|
|
||||||
JP .big_loop
|
|
||||||
;JP NZ,.big_loop
|
|
||||||
;XOR A
|
|
||||||
;RET
|
|
||||||
;
|
|
||||||
;
|
|
||||||
.write_sector: ; WRITE SECTOR 512 bytes ;!HARDCODE sector size
|
|
||||||
LD BC,IDE.Write.Data
|
|
||||||
LD D,512/WRITE_OUTI_DUPs ;!HARDCODE sector size
|
|
||||||
.loop: DUP WRITE_OUTI_DUPs
|
|
||||||
OUTI
|
|
||||||
EDUP
|
|
||||||
DEC D
|
|
||||||
JR NZ,.loop
|
|
||||||
SCF
|
|
||||||
JP .return_rw
|
|
||||||
; ; ; ; ;
|
|
||||||
|
|
||||||
;ENDIF
|
|
||||||
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ;
|
|
||||||
/*
|
|
||||||
IFN OPTIMIZE_RW_PROCEDURE
|
|
||||||
WRITE_ATA_SECTORs:
|
|
||||||
LD C,IDE.Device.HDD
|
|
||||||
CALL SELECT_DRIVE
|
|
||||||
RET C
|
|
||||||
EXX
|
|
||||||
;LD DE,#C140 ;WAIT BUSY=0 & READY=1 & ERR=0
|
|
||||||
CALL WAITPRT
|
|
||||||
EXX
|
|
||||||
RET C
|
|
||||||
EX AF,AF'
|
|
||||||
PUSH AF
|
|
||||||
PUSH DE
|
|
||||||
CALL PRESET
|
|
||||||
POP HL
|
|
||||||
POP AF
|
|
||||||
LD XL,0
|
|
||||||
LD XH,A
|
|
||||||
LD BC,IDE.Write.Command
|
|
||||||
LD A,IDE.ATA.WriteSectorsWithRetry
|
|
||||||
OUT (C),A
|
|
||||||
; SAVE HL?!
|
|
||||||
EXX
|
|
||||||
LD DE,#8908 ;WAIT BUSY=0 & DRQ=1 & ERR=0
|
|
||||||
CALL WAITPRT.custom
|
|
||||||
EXX
|
|
||||||
RET C
|
|
||||||
;
|
|
||||||
.big_loop: IN A,(SLOT3)
|
|
||||||
EX AF,AF'
|
|
||||||
LD A,XH
|
|
||||||
OUT (SLOT3),A
|
|
||||||
; WRITE SECTOR 512 bytes ;!HARDCODE sector size
|
|
||||||
LD BC,IDE.Write.Data
|
|
||||||
LD D,512/WRITE_OUTI_DUPs ;!HARDCODE sector size
|
|
||||||
.loop: DUP WRITE_OUTI_DUPs
|
|
||||||
OUTI
|
|
||||||
EDUP
|
|
||||||
DEC D
|
|
||||||
JR NZ,.loop
|
|
||||||
; ; ; ; ;
|
|
||||||
EX AF,AF'
|
|
||||||
OUT (SLOT3),A
|
|
||||||
;EI
|
|
||||||
;
|
|
||||||
LD A,H
|
|
||||||
OR L
|
|
||||||
JR NZ,.W33
|
|
||||||
; next page in mem block
|
|
||||||
LD HL,#C000
|
|
||||||
IN A,(SLOT3)
|
|
||||||
EX AF,AF'
|
|
||||||
LD A,SYS_PAGE
|
|
||||||
OUT (SLOT3),A
|
|
||||||
LD D,high SYS_PAGE.RAM_TABLE
|
|
||||||
LD E,XH
|
|
||||||
LD A,(DE)
|
|
||||||
LD XH,A
|
|
||||||
EX AF,AF'
|
|
||||||
OUT (SLOT3),A
|
|
||||||
;
|
|
||||||
.W33: INC XL ;INC SAVED SECTORS
|
|
||||||
EXX
|
|
||||||
;LD DE,#C140 ;WAIT BUSY=0 & ERR=0 & READY=1
|
|
||||||
CALL WAITPRT
|
|
||||||
EXX
|
|
||||||
RET C
|
|
||||||
LD BC,IDE.Read.Status
|
|
||||||
IN A,(C)
|
|
||||||
BIT IDE.CtrlBit.DataRequest,A
|
|
||||||
;
|
|
||||||
RET Z
|
|
||||||
JP .big_loop
|
|
||||||
;JP NZ,.big_loop
|
|
||||||
;XOR A
|
|
||||||
;RET
|
|
||||||
;
|
|
||||||
ENDIF
|
|
||||||
*/
|
|
||||||
;[]===========================================================[#53, #56]
|
|
||||||
|
|
||||||
|
|
||||||
;[]================================================================[#54]
|
|
||||||
;Function: Verify Sectors
|
|
||||||
; A - Disk
|
|
||||||
; HL:IX - Sector
|
|
||||||
; B - Sector counter
|
|
||||||
;Return: None
|
|
||||||
;VERIFY SECTOR(S)
|
|
||||||
HDD_5x_VERIFY:
|
|
||||||
PUSH IY
|
|
||||||
SAFE_PORTY_2
|
|
||||||
PUSH IX
|
|
||||||
PUSH HL
|
|
||||||
CALL VRS000
|
|
||||||
POP HL
|
|
||||||
POP IX
|
|
||||||
RESTORE_PORTY
|
|
||||||
POP IY
|
|
||||||
RET
|
|
||||||
;[]================================================================[#54]
|
|
||||||
;VERIFY SECTOR(S)
|
|
||||||
VRS000: LD C,IDE.Device.HDD
|
|
||||||
CALL SELECT_DRIVE
|
|
||||||
RET C
|
|
||||||
EXX
|
|
||||||
CALL WAITPRT
|
|
||||||
EXX
|
|
||||||
RET C
|
|
||||||
PUSH DE
|
|
||||||
CALL PRESET
|
|
||||||
POP HL
|
|
||||||
LD BC,IDE.Write.Command
|
|
||||||
LD A,IDE.ATA.ReadVerifySectorsWithRetry
|
|
||||||
OUT (C),A
|
|
||||||
VRS002: LD BC,IDE.Read.Status
|
|
||||||
IN A,(C)
|
|
||||||
BIT IDE.CtrlBit.Error,A
|
|
||||||
JR Z,VRS003
|
|
||||||
SCF
|
|
||||||
RET
|
|
||||||
VRS003: CALL WAITPRT
|
|
||||||
RET C
|
|
||||||
XOR A
|
|
||||||
RET
|
|
||||||
LD BC,IDE.Read.Counter
|
|
||||||
; HL:IX - LBA SECTOR
|
|
||||||
; B - SECTOR COUNTER
|
|
||||||
PRESET: LD A,B
|
|
||||||
LD BC,IDE.Write.Counter
|
|
||||||
OUT (C),A
|
|
||||||
IN A,(SLOT3)
|
|
||||||
EX AF,AF'
|
|
||||||
LD A,SYS_PAGE
|
|
||||||
OUT (SLOT3),A
|
|
||||||
LD A,(IY+IDE.HDD_INIT_TABLE.DRV_Flags)
|
|
||||||
LD BC,IDE.Write.DeviceHead
|
|
||||||
OUT (C),A
|
|
||||||
;¡¨â CHS/LBA ;!FIXIT ᤥ« âì ¬¥âª ¬¨ ®¬¥à ¡¨â
|
|
||||||
AND %0100'0000
|
|
||||||
LD E,XL
|
|
||||||
LD D,XH
|
|
||||||
CALL Z,LBA_CHS
|
|
||||||
LD BC,IDE.Write.Sector
|
|
||||||
OUT (C),E ;LBA 0..7
|
|
||||||
IF IDE_Optimization
|
|
||||||
INC C ; LD BC,IDE.Write.CylinderLow
|
|
||||||
OUT (C),D ;LBA 8..15
|
|
||||||
INC C ; LD BC,IDE.Write.CylinderHigh
|
|
||||||
OUT (C),L ;LBA 16..23
|
|
||||||
LD BC,IDE.Read.Control
|
|
||||||
IN A,(C)
|
|
||||||
AND #F0 ;!HARDCODE DRIVE/HEAD REGISTER PHISICAL DISK bitmask
|
|
||||||
OR H ;LBA 24..27
|
|
||||||
INC B ; LD BC,IDE.Write.DeviceHead
|
|
||||||
ELSE
|
|
||||||
LD BC,IDE.Write.CylinderLow
|
|
||||||
OUT (C),D ;LBA 8..15
|
|
||||||
LD BC,IDE.Write.CylinderHigh
|
|
||||||
OUT (C),L ;LBA 16..23
|
|
||||||
LD BC,IDE.Read.Control
|
|
||||||
IN A,(C)
|
|
||||||
AND #F0 ;!HARDCODE DRIVE/HEAD REGISTER PHISICAL DISK bitmask
|
|
||||||
OR H ;LBA 24..27
|
|
||||||
LD BC,IDE.Write.DeviceHead
|
|
||||||
ENDIF
|
|
||||||
OUT (C),A
|
|
||||||
EX AF,AF'
|
|
||||||
OUT (SLOT3),A
|
|
||||||
AND A
|
|
||||||
RET
|
|
||||||
|
|
||||||
; HL:DE - SECTOR OFFSET
|
|
||||||
LBA_CHS:
|
|
||||||
LD C,(IY+IDE.HDD_INIT_TABLE.SectorsPerCylinderLow)
|
|
||||||
LD B,(IY+IDE.HDD_INIT_TABLE.SectorsPerCylinderHigh)
|
|
||||||
; HL:DE / BC => DE:IX HL-OSTATOK
|
|
||||||
DIV32X: LD XH,D
|
|
||||||
LD XL,E
|
|
||||||
EX DE,HL
|
|
||||||
LD HL,0
|
|
||||||
LD A,#20
|
|
||||||
DIV011: ADD IX,IX
|
|
||||||
EX DE,HL
|
|
||||||
ADC HL,HL
|
|
||||||
EX DE,HL
|
|
||||||
ADC HL,HL
|
|
||||||
SBC HL,BC
|
|
||||||
JR NC,DIV012
|
|
||||||
ADD HL,BC
|
|
||||||
DEC A
|
|
||||||
JR NZ,DIV011
|
|
||||||
JR DIV014
|
|
||||||
DIV012: INC IX
|
|
||||||
DEC A
|
|
||||||
JR NZ,DIV011
|
|
||||||
DIV014: LD E,(IY+IDE.HDD_INIT_TABLE.SectorsPerTrack)
|
|
||||||
LD D,0
|
|
||||||
XOR A
|
|
||||||
CHS005: INC A
|
|
||||||
SBC HL,DE
|
|
||||||
JR NC,CHS005
|
|
||||||
ADD HL,DE
|
|
||||||
DEC A
|
|
||||||
LD H,A
|
|
||||||
LD E,L
|
|
||||||
INC E
|
|
||||||
LD D,XL
|
|
||||||
LD A,XH
|
|
||||||
LD L,A
|
|
||||||
RET
|
|
||||||
|
|
||||||
;----------------------------------------------------------------------;
|
|
||||||
; D - MASK
|
|
||||||
; E - PATTERN
|
|
||||||
WAITPRT: LD DE,256*(IDE.CtrlByte.Busy+IDE.CtrlByte.Ready+IDE.CtrlByte.Error)+IDE.CtrlByte.Ready
|
|
||||||
.custom: LD BC,IDE.Read.Status
|
|
||||||
LD HL,#0000 ; § ¤¥à¦ª ;!HARDCODE
|
|
||||||
;
|
|
||||||
.loop: PUSH HL
|
|
||||||
;
|
|
||||||
.loop2: IN A,(C)
|
|
||||||
AND D
|
|
||||||
CP E
|
|
||||||
JR Z,.ok
|
|
||||||
DEC HL
|
|
||||||
LD A,L
|
|
||||||
OR H
|
|
||||||
JP NZ,.loop2
|
|
||||||
;
|
|
||||||
POP HL
|
|
||||||
DEC L
|
|
||||||
JR NZ,.loop
|
|
||||||
;
|
|
||||||
.error: LD A,BIOS.Error.NotReady
|
|
||||||
SCF
|
|
||||||
RET
|
|
||||||
.ok: POP HL
|
|
||||||
RET
|
|
||||||
;----------------------------------------------------------------------;
|
|
||||||
|
|
||||||
|
|
||||||
;[]================================================================[#57]
|
|
||||||
;[x] 18/12/2023. ¤®¡ ¢«¥¨¥/¤®¯¨«¨¢ ¨¥ API CD-ROM (ATAPI)
|
|
||||||
;Function: Detect Disk
|
|
||||||
; A - Disk
|
|
||||||
;Return: CF=0 - A=Drive type
|
|
||||||
; CF=1 - drive not present, A=#02
|
|
||||||
HDD_5x_DETECT:
|
|
||||||
LD C,IDE.Device.HDD
|
|
||||||
JP DRV_DETECT
|
|
||||||
;[]================================================================[#57]
|
|
||||||
@ -195,23 +195,49 @@ HDD_5x_LONG_READ:
|
|||||||
POP HL
|
POP HL
|
||||||
POP IX
|
POP IX
|
||||||
POP BC
|
POP BC
|
||||||
XOR A
|
IF 1
|
||||||
CP B
|
;=======================================================================
|
||||||
LD C,B
|
; HL:IX + B. ¥á«¨ B=0, â® B=256
|
||||||
LD B,A
|
XOR A
|
||||||
JR Z,.B_256_sectors
|
CP B
|
||||||
|
LD C,B
|
||||||
|
CCF
|
||||||
|
RLA
|
||||||
|
LD B,A
|
||||||
|
ADD IX,BC
|
||||||
|
JR NC,.exit
|
||||||
|
INC HL
|
||||||
|
CCF
|
||||||
;
|
;
|
||||||
ADD IX,BC
|
|
||||||
LD C,B
|
|
||||||
.pre_exit: ADC HL,BC
|
|
||||||
.exit: RESTORE_PORTY
|
.exit: RESTORE_PORTY
|
||||||
POP IY
|
POP IY
|
||||||
RET
|
RET
|
||||||
|
;=======================================================================
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
|
||||||
|
IF 0
|
||||||
|
;=======================================================================
|
||||||
|
XOR A ; 4 1
|
||||||
|
CP B ; 4 1
|
||||||
|
LD C,B ; 4 1
|
||||||
|
JR Z,.B_256_sectors ; 12/7 2
|
||||||
|
;
|
||||||
|
LD B,A ; 4 1
|
||||||
|
ADD IX,BC ; 15 2
|
||||||
|
LD C,A ; 4 1
|
||||||
|
.pre_exit: ADC HL,BC ; 15 2
|
||||||
|
.exit: RESTORE_PORTY ;45/62
|
||||||
|
POP IY
|
||||||
|
RET
|
||||||
|
;
|
||||||
|
.B_256_sectors: INC B ; 4 1
|
||||||
|
ADD IX,BC ; 15 2
|
||||||
|
LD B,A ; 4 1
|
||||||
|
JR .pre_exit ; 12 2
|
||||||
|
;=======================================================================
|
||||||
|
ENDIF
|
||||||
;
|
;
|
||||||
.B_256_sectors: INC B
|
|
||||||
ADD IX,BC
|
|
||||||
LD B,C
|
|
||||||
JR .pre_exit
|
|
||||||
;
|
;
|
||||||
.error: LD B,A ; A - ®¬¥à ®è¨¡ª¨
|
.error: LD B,A ; A - ®¬¥à ®è¨¡ª¨
|
||||||
LD C,XL
|
LD C,XL
|
||||||
@ -232,90 +258,6 @@ HDD_5x_LONG_READ:
|
|||||||
LD B,C
|
LD B,C
|
||||||
SCF ;R03
|
SCF ;R03
|
||||||
JR .exit
|
JR .exit
|
||||||
;
|
|
||||||
/*
|
|
||||||
IFN OPTIMIZE_RW_PROCEDURE
|
|
||||||
READ_ATA_SECTORs:
|
|
||||||
LD C,IDE.Device.HDD
|
|
||||||
CALL SELECT_DRIVE
|
|
||||||
RET C
|
|
||||||
EXX
|
|
||||||
;LD DE,#C140 ;WAIT BUSY=0 & READY=1 & ERR=0
|
|
||||||
CALL WAITPRT
|
|
||||||
EXX
|
|
||||||
RET C
|
|
||||||
EX AF,AF'
|
|
||||||
PUSH AF ; memory page number
|
|
||||||
PUSH DE
|
|
||||||
CALL PRESET
|
|
||||||
POP HL
|
|
||||||
POP AF ; memory page number
|
|
||||||
LD XL,0
|
|
||||||
LD XH,A
|
|
||||||
LD BC,IDE.Write.Command
|
|
||||||
LD A,IDE.ATA.ReadSectorsWithRetry
|
|
||||||
OUT (C),A
|
|
||||||
;SAVE HL!
|
|
||||||
EXX
|
|
||||||
LD DE,#8908 ;WAIT BUSY=0 & DRQ=1 & ERR=0
|
|
||||||
CALL WAITPRT.custom
|
|
||||||
EXX
|
|
||||||
RET C
|
|
||||||
;DI ;R01 REMOVED "DI"
|
|
||||||
.big_loop: IN A,(SLOT3)
|
|
||||||
EX AF,AF' ;>-----------> \
|
|
||||||
LD A,XH
|
|
||||||
OUT (SLOT3),A
|
|
||||||
;
|
|
||||||
; READ SECTOR 512 bytes ;!HARDCODE sector size
|
|
||||||
LD BC,IDE.Read.Data
|
|
||||||
.loop_256_1: DUP 16
|
|
||||||
INI
|
|
||||||
EDUP
|
|
||||||
JP NZ,.loop_256_1
|
|
||||||
.loop_256_2: DUP 16
|
|
||||||
INI
|
|
||||||
EDUP
|
|
||||||
JP NZ,.loop_256_2
|
|
||||||
; ; ; ; ;
|
|
||||||
;
|
|
||||||
EX AF,AF' ;<-----------< /
|
|
||||||
OUT (SLOT3),A
|
|
||||||
;
|
|
||||||
LD A,H
|
|
||||||
OR L
|
|
||||||
JR NZ,.W44
|
|
||||||
; next page in mem block
|
|
||||||
LD HL,#C000
|
|
||||||
IN A,(SLOT3)
|
|
||||||
EX AF,AF' ;>-----------> \
|
|
||||||
LD A,SYS_PAGE
|
|
||||||
OUT (SLOT3),A
|
|
||||||
LD D,high SYS_PAGE.RAM_TABLE
|
|
||||||
LD E,XH
|
|
||||||
LD A,(DE)
|
|
||||||
LD XH,A
|
|
||||||
EX AF,AF' ;<-----------< /
|
|
||||||
OUT (SLOT3),A
|
|
||||||
;
|
|
||||||
.W44: INC XL ;INC LOADED SECTORS
|
|
||||||
EXX
|
|
||||||
;LD DE,#C140 ;WAIT BUSY=0 & ERR=0 & READY=1
|
|
||||||
CALL WAITPRT
|
|
||||||
EXX
|
|
||||||
RET C
|
|
||||||
LD BC,IDE.Read.Status
|
|
||||||
IN A,(C)
|
|
||||||
BIT IDE.CtrlBit.DataRequest,A
|
|
||||||
;
|
|
||||||
RET Z
|
|
||||||
JP .big_loop
|
|
||||||
;JP NZ,.big_loop
|
|
||||||
;XOR A
|
|
||||||
;RET
|
|
||||||
;
|
|
||||||
ENDIF
|
|
||||||
*/
|
|
||||||
;[]===========================================================[#52, #55]
|
;[]===========================================================[#52, #55]
|
||||||
|
|
||||||
|
|
||||||
@ -331,7 +273,7 @@ READ_ATA_SECTORs:
|
|||||||
;WRITE SECTOR(S)
|
;WRITE SECTOR(S)
|
||||||
HDD_5x_WRITE:
|
HDD_5x_WRITE:
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
IN A,(SLOT3)
|
IN A,(SLOT3)
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
;[]================================================================[#53]
|
;[]================================================================[#53]
|
||||||
;Function: Long Write Sectors
|
;Function: Long Write Sectors
|
||||||
@ -345,48 +287,46 @@ HDD_5x_WRITE:
|
|||||||
; DE - Address + (Sector counter * Size sector)
|
; DE - Address + (Sector counter * Size sector)
|
||||||
;WRITE SECTOR(S)
|
;WRITE SECTOR(S)
|
||||||
HDD_5x_LONG_WRITE:
|
HDD_5x_LONG_WRITE:
|
||||||
PUSH IY
|
PUSH IY
|
||||||
|
SAFE_PORTY_2
|
||||||
SAFE_PORTY_2
|
PUSH BC
|
||||||
|
PUSH IX
|
||||||
PUSH IX
|
PUSH HL
|
||||||
PUSH HL
|
;
|
||||||
PUSH BC
|
EX AF,AF'
|
||||||
;IF OPTIMIZE_RW_PROCEDURE
|
SCF ;write
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
SCF ;write
|
CALL RW_ATA_SECTORs
|
||||||
EX AF,AF'
|
;
|
||||||
CALL RW_ATA_SECTORs
|
JP HDD_5x_LONG_READ.shared
|
||||||
;ELSE
|
/*
|
||||||
;CALL WRITE_ATA_SECTORs
|
EX DE,HL
|
||||||
;ENDIF
|
JP C,.error
|
||||||
;
|
LD A,XH
|
||||||
EX DE,HL
|
EX AF,AF'
|
||||||
JP C,HERRWR0
|
;
|
||||||
LD A,XH
|
POP HL
|
||||||
EX AF,AF'
|
POP IX
|
||||||
POP BC
|
POP BC
|
||||||
POP HL
|
XOR A
|
||||||
POP IX
|
CP B
|
||||||
XOR A
|
LD C,B
|
||||||
CP B
|
LD B,A
|
||||||
LD C,B
|
JR NZ,WNOT256
|
||||||
LD B,A
|
;
|
||||||
JR NZ,WNOT256
|
INC B
|
||||||
INC B
|
ADD IX,BC
|
||||||
ADD IX,BC
|
LD B,C
|
||||||
LD B,C
|
ADC HL,BC
|
||||||
ADC HL,BC
|
;EX AF,AF'
|
||||||
;EX AF,AF'
|
JR RST8WRR
|
||||||
JR RST8WRR
|
;
|
||||||
|
|
||||||
WNOT256 ADD IX,BC
|
WNOT256 ADD IX,BC
|
||||||
LD C,B
|
LD C,B
|
||||||
ADC HL,BC
|
ADC HL,BC
|
||||||
;EX AF,AF'
|
|
||||||
JR RST8WRR
|
JR RST8WRR
|
||||||
|
|
||||||
HERRWR0 LD B,A
|
.error: LD B,A
|
||||||
LD C,XL
|
LD C,XL
|
||||||
LD A,XH
|
LD A,XH
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
@ -411,6 +351,7 @@ RST8WRR: RESTORE_PORTY
|
|||||||
POP IY
|
POP IY
|
||||||
;EX AF,AF'
|
;EX AF,AF'
|
||||||
RET
|
RET
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ;
|
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ;
|
||||||
@ -423,26 +364,26 @@ RST8WRR: RESTORE_PORTY
|
|||||||
RW_ATA_SECTORs: LD C,IDE.Device.HDD
|
RW_ATA_SECTORs: LD C,IDE.Device.HDD
|
||||||
CALL SELECT_DRIVE
|
CALL SELECT_DRIVE
|
||||||
RET C
|
RET C
|
||||||
|
;
|
||||||
EXX
|
EXX
|
||||||
;LD DE,#C140 ;WAIT BUSY=0 & READY=1 & ERR=0
|
|
||||||
CALL WAITPRT
|
CALL WAITPRT
|
||||||
EXX
|
EXX
|
||||||
RET C
|
RET C
|
||||||
|
;
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
PUSH AF ; memory page number
|
PUSH AF ; memory page number
|
||||||
PUSH DE
|
PUSH DE ; Address
|
||||||
CALL PRESET
|
CALL PRESET
|
||||||
POP HL
|
POP HL ; Address
|
||||||
POP AF ; memory page number
|
POP AF ; memory page number
|
||||||
LD XL,0
|
LD XL,0
|
||||||
LD XH,A
|
LD XH,A
|
||||||
LD BC,IDE.Write.Command
|
LD BC,IDE.Write.Command
|
||||||
LD A,IDE.ATA.WriteSectorsWithRetry
|
LD A,IDE.ATA.WriteSectorsWithRetry
|
||||||
JR C,.set_command
|
JR C,.set_command ; CF = r/w
|
||||||
;
|
;
|
||||||
LD A,IDE.ATA.ReadSectorsWithRetry
|
LD A,IDE.ATA.ReadSectorsWithRetry
|
||||||
.set_command: OUT (C),A
|
.set_command: OUT (C),A
|
||||||
;SAVE HL!
|
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
EXX
|
EXX
|
||||||
LD DE,256*(IDE.CtrlByte.Busy+IDE.CtrlByte.DataRequest+IDE.CtrlByte.Error)+IDE.CtrlByte.DataRequest
|
LD DE,256*(IDE.CtrlByte.Busy+IDE.CtrlByte.DataRequest+IDE.CtrlByte.Error)+IDE.CtrlByte.DataRequest
|
||||||
@ -466,7 +407,8 @@ RW_ATA_SECTORs: LD C,IDE.Device.HDD
|
|||||||
INI
|
INI
|
||||||
EDUP
|
EDUP
|
||||||
JP NZ,.loop_256_2
|
JP NZ,.loop_256_2
|
||||||
EX AF,AF'
|
AND A
|
||||||
|
;EX AF,AF'
|
||||||
; ; ; ; ;
|
; ; ; ; ;
|
||||||
; CF=0
|
; CF=0
|
||||||
.return_rw: EX AF,AF' ;<-----------< /
|
.return_rw: EX AF,AF' ;<-----------< /
|
||||||
@ -652,32 +594,33 @@ VRS003: CALL WAITPRT
|
|||||||
PRESET: LD A,B
|
PRESET: LD A,B
|
||||||
LD BC,IDE.Write.Counter
|
LD BC,IDE.Write.Counter
|
||||||
OUT (C),A
|
OUT (C),A
|
||||||
|
;
|
||||||
IN A,(SLOT3)
|
IN A,(SLOT3)
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
LD A,SYS_PAGE
|
LD A,SYS_PAGE
|
||||||
OUT (SLOT3),A
|
OUT (SLOT3),A
|
||||||
LD A,(IY+IDE.HDD_INIT_TABLE.DRV_Flags)
|
LD A,(IY+IDE.HDD_INIT_TABLE.DRV_Flags)
|
||||||
LD BC,IDE.Write.DeviceHead
|
LD BC,IDE.Write.DeviceHead
|
||||||
OUT (C),A
|
OUT (C),A
|
||||||
;¡¨â CHS/LBA ;!FIXIT ᤥ« âì ¬¥âª ¬¨ ®¬¥à ¡¨â
|
;¡¨â CHS/LBA ;!FIXIT ᤥ« âì ¬¥âª ¬¨ ®¬¥à ¡¨â
|
||||||
AND %0100'0000
|
AND %0100'0000
|
||||||
LD E,XL
|
LD E,XL
|
||||||
LD D,XH
|
LD D,XH
|
||||||
CALL Z,LBA_CHS
|
CALL Z,LBA_CHS
|
||||||
LD BC,IDE.Write.Sector
|
LD BC,IDE.Write.Sector
|
||||||
OUT (C),E ;LBA 0..7
|
OUT (C),E ;LBA 0..7
|
||||||
;
|
;
|
||||||
INC C ; LD BC,IDE.Write.CylinderLow
|
INC C ; LD BC,IDE.Write.CylinderLow
|
||||||
OUT (C),D ;LBA 8..15
|
OUT (C),D ;LBA 8..15
|
||||||
INC C ; LD BC,IDE.Write.CylinderHigh
|
INC C ; LD BC,IDE.Write.CylinderHigh
|
||||||
OUT (C),L ;LBA 16..23
|
OUT (C),L ;LBA 16..23
|
||||||
LD BC,IDE.Read.Control
|
LD BC,IDE.Read.Control
|
||||||
IN A,(C)
|
IN A,(C)
|
||||||
AND #F0 ;!HARDCODE DRIVE/HEAD REGISTER PHISICAL DISK bitmask
|
AND #F0 ;!HARDCODE DRIVE/HEAD REGISTER PHISICAL DISK bitmask
|
||||||
OR H ;LBA 24..27
|
OR H ;LBA 24..27
|
||||||
INC B ; LD BC,IDE.Write.DeviceHead
|
INC B ; LD BC,IDE.Write.DeviceHead
|
||||||
;
|
;
|
||||||
OUT (C),A
|
OUT (C),A
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
OUT (SLOT3),A
|
OUT (SLOT3),A
|
||||||
AND A
|
AND A
|
||||||
|
|||||||
@ -1,5 +1,4 @@
|
|||||||
;[x] 18/12/2023. ¤®¡ ¢«¥¨¥/¤®¯¨«¨¢ ¨¥ API CD-ROM (ATAPI)
|
;[x] 18/12/2023. ¤®¡ ¢«¥¨¥/¤®¯¨«¨¢ ¨¥ API CD-ROM (ATAPI)
|
||||||
|
|
||||||
;=======================================================================
|
;=======================================================================
|
||||||
; ‚室: A - ®¬¥à ãáâனáâ¢
|
; ‚室: A - ®¬¥à ãáâனáâ¢
|
||||||
SELECT_DRIVE:
|
SELECT_DRIVE:
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user