From aedd21445b2e79750ac1ef4e8be0390725bdcb5d Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 28 Jul 2023 02:45:42 +1000 Subject: [PATCH] refactoring, optimization --- Shared_Includes | 2 +- src/bios/exp/EXTENDED/HDD_DRIVER_6.asm | 49 +++++++++----- src/bios/rom/SETUP/AUTOIDE.asm | 92 +++++++++++++++++--------- 3 files changed, 94 insertions(+), 49 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index 8d33d0c..552b44b 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 8d33d0cb93254448d9dcca4a4d7d4977125280c9 +Subproject commit 552b44b20bb90ad446fbd70d3229a935c89412d3 diff --git a/src/bios/exp/EXTENDED/HDD_DRIVER_6.asm b/src/bios/exp/EXTENDED/HDD_DRIVER_6.asm index 3b8533c..40e5ef0 100644 --- a/src/bios/exp/EXTENDED/HDD_DRIVER_6.asm +++ b/src/bios/exp/EXTENDED/HDD_DRIVER_6.asm @@ -40,7 +40,7 @@ CDROM EQU 2 ;EQU FOR IY+ -IDE.HDD_INIT_TABLE.Chanel EQU 0 +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 @@ -95,7 +95,6 @@ SELECTH: JR Z,SELHH DEC A LD IY,IDE.INIT_TBL_IDE1 - ;R02 JR Z,SELHH DEC A @@ -103,7 +102,7 @@ SELECTH: JR Z,SELHH DEC A LD IY,IDE.INIT_TBL_IDE3 - ;R02 + ; JR NZ,NODRIVE SELHH: EXX LD C,SLOT3 @@ -111,7 +110,7 @@ SELHH: EXX LD A,SYS_PAGE OUT (C),A - LD A,(IY+IDE.HDD_INIT_TABLE.Chanel) + LD A,(IY+IDE.HDD_INIT_TABLE.DRV_Flags) AND #01 LD A,IDE.Chanel.Secondary JR NZ,SELCHAN @@ -121,8 +120,8 @@ SELCHAN: LD A,(IY+IDE.HDD_INIT_TABLE.DriveType) CP IDE.Device.HDD ;!FIXIT возможно, нахрен не нужно, потому-что если CD, то прилетит в драйвер CD - LD A,(IY+IDE.HDD_INIT_TABLE.Chanel) - OUT (C),B + LD A,(IY+IDE.HDD_INIT_TABLE.DRV_Flags) + OUT (C),B ;возврат страницы LD BC,IDE.Write.DriveCtrl RES 0,A OUT (C),A @@ -141,7 +140,7 @@ NODRIVE: ; L - Sectors per cylinder ; DE - Cylinders ; IX - Capacity sector in bytes -; B - Flags: ide chanel +; B - Flags: MASTER/SLAVE, LBA/CHS HDD_5x.GETMED: CALL SELECTH RET C @@ -153,7 +152,7 @@ HDD_5x.GETMED: 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.Chanel) + LD B,(IY+IDE.HDD_INIT_TABLE.DRV_Flags) LD IX,512 EX AF,AF' OUT (SLOT3),A @@ -182,7 +181,7 @@ HDD_5x.SETMED: 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.Chanel),B + LD (IY+IDE.HDD_INIT_TABLE.DRV_Flags),B EX AF,AF' OUT (SLOT3),A EX AF,AF' @@ -595,25 +594,39 @@ PRESET: LD A,B EX AF,AF' LD A,SYS_PAGE OUT (SLOT3),A - LD A,(IY+IDE.HDD_INIT_TABLE.Chanel) + LD A,(IY+IDE.HDD_INIT_TABLE.DRV_Flags) LD BC,IDE.Write.DriveCtrl OUT (C),A - BIT 6,A ;бит CHS/LBA ;!FIXIT сделать метками номера бит + ;!TEST + ;BIT 6,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 - LD BC,IDE.Write.CylinderLow + 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.DriveCtrl + 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.Write.DriveCtrl - DEC B + LD BC,IDE.Read.Control IN A,(C) - AND #F0 + AND #F0 ;!HARDCODE DRIVE/HEAD REGISTER PHISICAL DISK bitmask OR H ;LBA 24..27 - INC B + LD BC,IDE.Write.DriveCtrl + ENDIF OUT (C),A EX AF,AF' OUT (SLOT3),A @@ -688,7 +701,7 @@ WAITPRT: ;[]================================================================[#57] ;Function: Detect Disk ; A - Disk -;Return: CF=0 - A=Drive type +;Return: CF=0 - A=Drive type ; CF=1 - drive not present, A=#FF HDD_5x.DETECT: CP #84 ;!HARDCODE max HDD drives (#80,#81,#82,#83) @@ -715,7 +728,7 @@ HDD_5x.DETECT: LD C,SLOT3 OUT (C),B - CP #FF + CP IDE.Device.NONE CCF RET ;[]================================================================[#57] \ No newline at end of file diff --git a/src/bios/rom/SETUP/AUTOIDE.asm b/src/bios/rom/SETUP/AUTOIDE.asm index 5940467..4a1e120 100644 --- a/src/bios/rom/SETUP/AUTOIDE.asm +++ b/src/bios/rom/SETUP/AUTOIDE.asm @@ -106,18 +106,17 @@ SELECT_IDE: JR Z,IAUTO1 ;R00 DEC A ;R00 LD D,#B0 ;R00 -IAUTO1: - LD A,IDE.Chanel.Secondary ;R00 ;SELECT SECONDARY +IAUTO1: LD A,IDE.Chanel.Secondary ;R00 ;SELECT SECONDARY OUT (IDE.Chanel.Set),A ;R00 - LD A,1 + ;LD A,1 JP IAUTO ;R00 IAUTO0: LD A,IDE.Chanel.Primary ;R00 ;SELECT PRIMARY OUT (IDE.Chanel.Set),A ;R00 - LD A,0 -IAUTO: - LD (ICHANEL),A + ;LD A,0 + XOR A +IAUTO: LD (ICHANEL),A LD BC,IDE.Write.DriveCtrl ;R01 OUT (C),D ;R01 RET @@ -131,8 +130,12 @@ CDMASTR: LD (SKIP),A LD BC,IDE.Write.DriveCtrl OUT (C),D - - LD BC,IDE.Read.Status + IF IDE_Optimization + DEC B + INC C + ELSE + LD BC,IDE.Read.Status + ENDIF IN A,(C) AND #80 LD HL,280 @@ -156,11 +159,17 @@ NO_BUSY: LD E,#05 LD BC,IDE.Write.Counter OUT (C),E - LD BC,#0010 - DJNZ $ ;!HARDCODE + + LD BC,#0010 ;задержка 50092 такта + int +.pause: DJNZ .pause DEC C - JR NZ,$-3 ;!HARDCODE - LD BC,IDE.Read.Counter + JR NZ,.pause + + IF IDE_Optimization + LD C,IDE.Read.Counter + ELSE + LD BC,IDE.Read.Counter + ENDIF IN A,(C) CP E JP NZ,ABSENT @@ -172,7 +181,9 @@ NO_BUSY: LD E,#00 ;NOP LD BC,IDE.Write.Command OUT (C),E - + IF IDE_Optimization + DEC B + ENDIF WXREADY: HALT DEC HL @@ -181,13 +192,15 @@ WXREADY: JP Z,ABSENT CALL SKIPKEY JP C,ABSENT - LD BC,IDE.Read.Status + IFN IDE_Optimization + LD BC,IDE.Read.Status + ENDIF IN A,(C) AND #C0 CP #40 JR NZ,WXREADY -; LD A,#90 ; +; LD A,#90 ;????? ; CALL IDE_CMD LD A,IDE.Device.HDD @@ -195,11 +208,17 @@ WXREADY: LD E,#EC ;IDENTIFY ATA LD BC,IDE.Write.Command OUT (C),E + LD B,0 .pause: DJNZ .pause + LD HL,(WAITSML) LD DE,#0101 - LD BC,IDE.Read.Status + IF IDE_Optimization + LD B,high IDE.Read.Status + ELSE + LD BC,IDE.Read.Status + ENDIF CALL WAIT_PRT JP NC,NOHDD @@ -222,11 +241,17 @@ NOHDD: LD A,IDE.Device.CDROM LD E,#A1 ;IDENTIFY ATAPI LD BC,IDE.Write.Command OUT (C),E - LD B,#00 - DJNZ $ + + LD B,0 +.pause: DJNZ .pause + LD HL,(WAITSML) LD DE,#0101 - LD BC,IDE.Read.Status + IF IDE_Optimization + LD B,high IDE.Read.Status + ELSE + LD BC,IDE.Read.Status + ENDIF CALL WAIT_PRT JP C,GETPARM ABSENT: @@ -256,20 +281,23 @@ IDESPEC: BIT 1,A JR Z,NONLBA SET 6,B -NONLBA: - LD A,B +NONLBA: LD A,B LD BC,IDE.Write.DriveCtrl OUT (C),A - AND #F0 + AND #F0 ;!HARDCODE DRIVE/HEAD REGISTER PHISICAL DISK bitmask LD HL,ICHANEL OR (HL) - LD (IY+IDE.HDD_INIT_TABLE.Chanel),A + LD (IY+IDE.HDD_INIT_TABLE.DRV_Flags),A LD HL,(TEMP+#02) ; !TODO сделать через структуру. CYLINDERS LD (IY+IDE.HDD_INIT_TABLE.CylinderNumberLow),L LD (IY+IDE.HDD_INIT_TABLE.CylinderNumberHigh),H LD A,(TEMP+#0C) ; !TODO сделать через структуру. SECTOR PER TRACK LD (IY+IDE.HDD_INIT_TABLE.SectorsPerTrack),A - LD BC,IDE.Write.Counter + IF IDE_Optimization + LD B,high IDE.Write.Counter + ELSE + LD BC,IDE.Write.Counter + ENDIF OUT (C),A LD A,#91 ; CALL IDE_CMD @@ -296,7 +324,7 @@ FOR_CDR: AND #F0 LD HL,ICHANEL OR (HL) - LD (IY+IDE.HDD_INIT_TABLE.Chanel),A + LD (IY+IDE.HDD_INIT_TABLE.DRV_Flags),A JR NOSPEC IDE_CMD: @@ -307,7 +335,11 @@ IDE_CMD: CALL WAIT_PRT POP DE RET C - LD BC,IDE.Write.Command + IF IDE_Optimization + INC B + ELSE + LD BC,IDE.Write.Command + ENDIF OUT (C),D LD HL,(WAITIDE) LD DE,#C040 @@ -372,15 +404,15 @@ WAIT_PRT: SKIPKEY: EXX - CALL SCANKEY + CALL SCANKEY EXX SCF CCF RET Z EXX - LD HL,#3E00 ;!HARDCODE - AND A - SBC HL,DE + LD HL,#3E00 ;!HARDCODE + AND A + SBC HL,DE EXX SCF CCF