From e90f1cafbf14e54a4d0876aabb5225b7d4875de4 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Thu, 26 Dec 2024 02:14:24 +1000 Subject: [PATCH] CF bug fixed in ATA/ATAPI R/W procedure --- Shared_Includes | 2 +- src/bios/exp/BIOS_FUNC.asm | 14 +- src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM | 95 ++- src/bios/exp/EXTENDED/IDE/ATA_DRV 2.ASM | 779 ------------------------ src/bios/exp/EXTENDED/IDE/ATA_DRV.ASM | 271 ++++----- src/bios/exp/EXTENDED/IDE/shared.asm | 1 - 6 files changed, 191 insertions(+), 971 deletions(-) delete mode 100644 src/bios/exp/EXTENDED/IDE/ATA_DRV 2.ASM diff --git a/Shared_Includes b/Shared_Includes index ccb95c9..d38cd7d 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit ccb95c96a5684e4f99c19f96b8fcc72f7d0b8212 +Subproject commit d38cd7dd53426ef452cd4afd2a76f6a1e5a84848 diff --git a/src/bios/exp/BIOS_FUNC.asm b/src/bios/exp/BIOS_FUNC.asm index 1e0b2f5..115a294 100644 --- a/src/bios/exp/BIOS_FUNC.asm +++ b/src/bios/exp/BIOS_FUNC.asm @@ -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 - „уЁЋь.   эту фу­ЊцЈю ЏрыЃ Ѕт ЈЇ Ўс­ЎЂ­ЎЃЎ ЎЁр ЁЎтчЈЊ  DB high FN_RESERVED_5x ;#5B - „уЁЋь.   эту фу­ЊцЈю ЏрыЃ Ѕт ЈЇ Ўс­ЎЂ­ЎЃЎ ЎЁр ЁЎтчЈЊ  DB high FN_RESERVED_5x ;#5C - „уЁЋь.   эту фу­ЊцЈю ЏрыЃ Ѕт ЈЇ Ўс­ЎЂ­ЎЃЎ ЎЁр ЁЎтчЈЊ  @@ -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 diff --git a/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM b/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM index ebed052..ab506c9 100644 --- a/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM +++ b/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM @@ -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 diff --git a/src/bios/exp/EXTENDED/IDE/ATA_DRV 2.ASM b/src/bios/exp/EXTENDED/IDE/ATA_DRV 2.ASM deleted file mode 100644 index 449dc1f..0000000 --- a/src/bios/exp/EXTENDED/IDE/ATA_DRV 2.ASM +++ /dev/null @@ -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] \ No newline at end of file diff --git a/src/bios/exp/EXTENDED/IDE/ATA_DRV.ASM b/src/bios/exp/EXTENDED/IDE/ATA_DRV.ASM index 979b9c6..4c077e9 100644 --- a/src/bios/exp/EXTENDED/IDE/ATA_DRV.ASM +++ b/src/bios/exp/EXTENDED/IDE/ATA_DRV.ASM @@ -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 diff --git a/src/bios/exp/EXTENDED/IDE/shared.asm b/src/bios/exp/EXTENDED/IDE/shared.asm index 9183f7d..1127725 100644 --- a/src/bios/exp/EXTENDED/IDE/shared.asm +++ b/src/bios/exp/EXTENDED/IDE/shared.asm @@ -1,5 +1,4 @@ ;[x] 18/12/2023. ЄЎЁ ЂЋЅ­ЈЅ/ЄЎЏЈЋЈЂ ­ЈЅ API CD-ROM (ATAPI) - ;======================================================================= ; ‚хЎЄ: A - ­ЎЌЅр устрЎЉстЂ  SELECT_DRIVE: