CF bug fixed in ATA/ATAPI R/W procedure

This commit is contained in:
Tolik 2024-12-26 02:14:24 +10:00
parent ed03bf0ee1
commit e90f1cafbf
6 changed files with 191 additions and 971 deletions

@ -1 +1 @@
Subproject commit ccb95c96a5684e4f99c19f96b8fcc72f7d0b8212
Subproject commit d38cd7dd53426ef452cd4afd2a76f6a1e5a84848

View File

@ -546,15 +546,15 @@ TAB_5xFNS:
_mNoDrive_5xTable 3, 0
;-------------------------------------[]
;-----------------------------------------------------------[ CDROM #C ]
;----------------------------------------------------------[ CDROM #C0 ]
;
DB low FN_RESERVED_5x
DB low CD_5x_RESET
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 CD_5x_READ
DB low FN_ABSENT_5x ; WRITE
DB low CD_5x_WRITE ; WRITE ; [ ] new
DB low CD_5x_DETECT
DB low FN_ABSENT_5x ; GETMED
DB low FN_ABSENT_5x ; SETMED
@ -585,6 +585,7 @@ TAB_5xFNS:
DB high FDD_5x_DETECT ;#57
DB high FDD_5x_GETMED ;#58
DB high FDD_5x_SETMED ;#59
DB high DRV_VERSION ;#5A - „ã¡«ì. <20>  íâã äã­ªæ¨î ¯à룠¥â ¨§ ®á­®¢­®£® ®¡à ¡®â稪 
DB high FN_RESERVED_5x ;#5B - „ã¡«ì. <20>  íâã äã­ªæ¨î ¯à룠¥â ¨§ ®á­®¢­®£® ®¡à ¡®â稪 
DB high FN_RESERVED_5x ;#5C - „ã¡«ì. <20>  íâã äã­ªæ¨î ¯à룠¥â ¨§ ®á­®¢­®£® ®¡à ¡®â稪 
@ -610,6 +611,7 @@ TAB_5xFNS:
DB high FN_ABSENT_5x
DB high RMD_5x_GETMED
DB high RMD_5x_SETMED
DB high DRV_VERSION
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_GETMED
DB high HDD_5x_SETMED
DB high DRV_VERSION
DB high FN_RESERVED_5x
DB high FN_RESERVED_5x
@ -651,13 +654,14 @@ TAB_5xFNS:
DB high FN_RESERVED_5x
DB high CD_5x_RESET
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 CD_5x_READ
DB high FN_ABSENT_5x
DB high CD_5x_WRITE ; WRITE ; [ ] new
DB high CD_5x_DETECT
DB high FN_ABSENT_5x
DB high FN_ABSENT_5x
DB high DRV_VERSION
DB high FN_RESERVED_5x
DB high FN_RESERVED_5x

View File

@ -14,11 +14,11 @@
;
;----------------------------------------------------------------------------------
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_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]
CD_5x_RESET: LD C,IDE.Device.ATAPI
@ -54,7 +54,7 @@ CD_5x_READ:
EX AF,AF'
;[]================================================================[#52]
;Function: Long Read Sectors
; A - Disk
; A -os
; HL:IX - Sector
; DE - Address
; B - Sector counter
@ -75,7 +75,18 @@ CD_5x_LONG_READ:
EX AF,AF'
CALL RW_ATAPI_SECTORs
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:
LD C,IDE.Device.ATAPI
CALL SELECT_DRIVE
@ -83,8 +94,8 @@ RW_ATAPI_SECTORs:
;
EXX
LD C,SLOT3
IN A,(C)
PUSH AF
IN B,(C)
PUSH BC
LD A,SYS_PAGE
OUT (C),A
LD HL,ATAPI_CMD_PACKET.READ
@ -93,7 +104,7 @@ RW_ATAPI_SECTORs:
LD HL,ATAPI_CMD_PACKET.WRITE
.read_cmd: EX AF,AF'
LD DE,RAM_ATAPI_RW_CMD
LD BC,PKTSIZE
LD BC,PACKET_SIZE
LDIR
EXX
;
@ -108,8 +119,8 @@ RW_ATAPI_SECTORs:
LD A,B
LD (RAM_ATAPI_RW_CMD + ATAPI_PACKET.COUNTER+1),A ;R01
;
EX AF,AF'
OUT (SLOT3),A
; EX AF,AF'
; OUT (SLOT3),A
;
; POP AF
; OUT (SLOT3),A
@ -117,11 +128,50 @@ RW_ATAPI_SECTORs:
CALL EXEC_PACKET_COMMAND
;
POP BC
LD C,SLOT3
;LD C,SLOT3
OUT (C),B
RET
;[]===========================================================[#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]
;Function: Detect Disk
@ -208,7 +258,7 @@ EXEC_PACKET_COMMAND:
LD A,SYS_PAGE
OUT (C),A
LD DE,RAM_ATAPI_PK ;!FIXIT ¬®¦¥â ­  á⥪¥ ¢ë¤¥«ïâì ¬¥áâ®?
LD BC,PKTSIZE
LD BC,PACKET_SIZE
LDIR
;
POP BC
@ -222,9 +272,9 @@ EXEC_PACKET_COMMAND:
LD BC,IDE.Write.Features
OUT (C),A
LD DE,MAX_ATAPI_SEC_SIZE ;SIZE BLOCK ;!HARDCODE ¤®áâ ¢ âì ¨§ ¯¥à¥¬¥­­®© ª ª®©-­¨¡ã¤ì
LD BC,IDE.Write.CylinderLow
LD BC,IDE.Write.ByteCountLow
OUT (C),E
LD BC,IDE.Write.CylinderHigh
LD BC,IDE.Write.ByteCountHigh
OUT (C),D
LD BC,IDE.Write.Command
LD A,IDE.ATAPI.Packet
@ -250,7 +300,7 @@ EXEC_PACKET_COMMAND:
RRCA
AND #0F
SCF
RET
RET
;
.YEP_DRQ: LD C,SLOT3
IN B,(C)
@ -259,7 +309,7 @@ EXEC_PACKET_COMMAND:
OUT (SLOT3),A
LD HL,RAM_ATAPI_PK
LD BC,IDE.Write.Data
LD A,PKTSIZE/4
LD A,PACKET_SIZE/4 ; !FIXIT ¡à âì ¨§ IDENTIFY PACKET DEVICE
.OUTPKT: OUTI
OUTI
OUTI
@ -268,8 +318,8 @@ EXEC_PACKET_COMMAND:
JR NZ,.OUTPKT
;
POP BC
OUT (C),B
;
LD B,#80
.pause2: DJNZ .pause2
;
@ -301,17 +351,17 @@ EXEC_PACKET_COMMAND:
;====== IF DATA REQUEST =======================================;
;
EX DE,HL
LD BC,IDE.Read.CylinderLow
LD BC,IDE.Read.ByteCountLow
IN E,(C)
LD BC,IDE.Read.CylinderHigh
LD BC,IDE.Read.ByteCountHigh
IN D,(C) ;TRANSFER BLOCK SIZE
LD A,D
OR E
RET Z ;BLOCK = 0
;
LD BC,IDE.Read.Counter
LD BC,IDE.Read.InterruptReason
IN A,(C)
AND %0000'0010 ;SENSE DATA AVAILABLE bit
AND IDE.InterruptReasonByte.IO
LD BC,IDE.Read.Data
JR Z,.WRITE_DATA
;
@ -325,6 +375,9 @@ EXEC_PACKET_COMMAND:
JR NZ,.read_loop
;
.return_rw: INC XL ;INC LOADED SECTORS
EX AF,AF' ;<-----------< /
OUT (SLOT3),A
;
LD A,H
OR L
JR NZ,.AP_LOOP

View File

@ -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]

View File

@ -195,23 +195,49 @@ HDD_5x_LONG_READ:
POP HL
POP IX
POP BC
XOR A
CP B
LD C,B
LD B,A
JR Z,.B_256_sectors
IF 1
;=======================================================================
; HL:IX + B. ¥á«¨ B=0, â® B=256
XOR A
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
POP IY
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 - ­®¬¥à ®è¨¡ª¨
LD C,XL
@ -232,90 +258,6 @@ HDD_5x_LONG_READ:
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]
@ -331,7 +273,7 @@ READ_ATA_SECTORs:
;WRITE SECTOR(S)
HDD_5x_WRITE:
EX AF,AF'
IN A,(SLOT3)
IN A,(SLOT3)
EX AF,AF'
;[]================================================================[#53]
;Function: Long Write Sectors
@ -345,48 +287,46 @@ HDD_5x_WRITE:
; 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
PUSH IY
SAFE_PORTY_2
PUSH BC
PUSH IX
PUSH HL
;
EX AF,AF'
SCF ;write
EX AF,AF'
CALL RW_ATA_SECTORs
;
JP HDD_5x_LONG_READ.shared
/*
EX DE,HL
JP C,.error
LD A,XH
EX AF,AF'
;
POP HL
POP IX
POP BC
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
.error: LD B,A
LD C,XL
LD A,XH
EX AF,AF'
@ -411,6 +351,7 @@ RST8WRR: RESTORE_PORTY
POP IY
;EX AF,AF'
RET
*/
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ;
@ -423,26 +364,26 @@ RST8WRR: RESTORE_PORTY
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
PUSH DE ; Address
CALL PRESET
POP HL
POP HL ; Address
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
JR C,.set_command ; CF = r/w
;
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
@ -466,7 +407,8 @@ RW_ATA_SECTORs: LD C,IDE.Device.HDD
INI
EDUP
JP NZ,.loop_256_2
EX AF,AF'
AND A
;EX AF,AF'
; ; ; ; ;
; CF=0
.return_rw: EX AF,AF' ;<-----------< /
@ -652,32 +594,33 @@ VRS003: CALL WAITPRT
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
;
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
;
OUT (C),A
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
;
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
;
OUT (C),A
EX AF,AF'
OUT (SLOT3),A
AND A

View File

@ -1,5 +1,4 @@
;[x] 18/12/2023. ¤®¡ ¢«¥­¨¥/¤®¯¨«¨¢ ­¨¥ API CD-ROM (ATAPI)
;=======================================================================
; ‚室: A - ­®¬¥à ãáâனá⢠
SELECT_DRIVE: