refactoring, optimization

This commit is contained in:
Anatoliy Belyanskiy 2023-07-28 02:45:42 +10:00
parent cd7f0580ba
commit aedd21445b
3 changed files with 94 additions and 49 deletions

@ -1 +1 @@
Subproject commit 8d33d0cb93254448d9dcca4a4d7d4977125280c9 Subproject commit 552b44b20bb90ad446fbd70d3229a935c89412d3

View File

@ -40,7 +40,7 @@ CDROM EQU 2
;EQU FOR IY+ ;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.SectorsPerTrack EQU 1
IDE.HDD_INIT_TABLE.HeadsNumber EQU 2 IDE.HDD_INIT_TABLE.HeadsNumber EQU 2
IDE.HDD_INIT_TABLE.CylinderNumberLow EQU 3 IDE.HDD_INIT_TABLE.CylinderNumberLow EQU 3
@ -95,7 +95,6 @@ SELECTH:
JR Z,SELHH JR Z,SELHH
DEC A DEC A
LD IY,IDE.INIT_TBL_IDE1 LD IY,IDE.INIT_TBL_IDE1
;R02 ;R02
JR Z,SELHH JR Z,SELHH
DEC A DEC A
@ -103,7 +102,7 @@ SELECTH:
JR Z,SELHH JR Z,SELHH
DEC A DEC A
LD IY,IDE.INIT_TBL_IDE3 LD IY,IDE.INIT_TBL_IDE3
;R02 ;
JR NZ,NODRIVE JR NZ,NODRIVE
SELHH: EXX SELHH: EXX
LD C,SLOT3 LD C,SLOT3
@ -111,7 +110,7 @@ SELHH: EXX
LD A,SYS_PAGE LD A,SYS_PAGE
OUT (C),A OUT (C),A
LD A,(IY+IDE.HDD_INIT_TABLE.Chanel) LD A,(IY+IDE.HDD_INIT_TABLE.DRV_Flags)
AND #01 AND #01
LD A,IDE.Chanel.Secondary LD A,IDE.Chanel.Secondary
JR NZ,SELCHAN JR NZ,SELCHAN
@ -121,8 +120,8 @@ SELCHAN:
LD A,(IY+IDE.HDD_INIT_TABLE.DriveType) LD A,(IY+IDE.HDD_INIT_TABLE.DriveType)
CP IDE.Device.HDD ;!FIXIT ¢®§¬®¦­®, ­ å७ ­¥ ­ã¦­®, ¯®â®¬ã-çâ® ¥á«¨ CD, â® ¯à¨«¥â¨â ¢ ¤à ©¢¥à CD CP IDE.Device.HDD ;!FIXIT ¢®§¬®¦­®, ­ å७ ­¥ ­ã¦­®, ¯®â®¬ã-çâ® ¥á«¨ CD, â® ¯à¨«¥â¨â ¢ ¤à ©¢¥à CD
LD A,(IY+IDE.HDD_INIT_TABLE.Chanel) LD A,(IY+IDE.HDD_INIT_TABLE.DRV_Flags)
OUT (C),B OUT (C),B ;¢®§¢à â áâà ­¨æë
LD BC,IDE.Write.DriveCtrl LD BC,IDE.Write.DriveCtrl
RES 0,A RES 0,A
OUT (C),A OUT (C),A
@ -141,7 +140,7 @@ NODRIVE:
; L - Sectors per cylinder ; L - Sectors per cylinder
; DE - Cylinders ; DE - Cylinders
; IX - Capacity sector in bytes ; IX - Capacity sector in bytes
; B - Flags: ide chanel ; B - Flags: MASTER/SLAVE, LBA/CHS
HDD_5x.GETMED: HDD_5x.GETMED:
CALL SELECTH CALL SELECTH
RET C RET C
@ -153,7 +152,7 @@ HDD_5x.GETMED:
LD H,(IY+IDE.HDD_INIT_TABLE.HeadsNumber) LD H,(IY+IDE.HDD_INIT_TABLE.HeadsNumber)
LD E,(IY+IDE.HDD_INIT_TABLE.CylinderNumberLow) LD E,(IY+IDE.HDD_INIT_TABLE.CylinderNumberLow)
LD D,(IY+IDE.HDD_INIT_TABLE.CylinderNumberHigh) 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 LD IX,512
EX AF,AF' EX AF,AF'
OUT (SLOT3),A OUT (SLOT3),A
@ -182,7 +181,7 @@ HDD_5x.SETMED:
LD (IY+IDE.HDD_INIT_TABLE.HeadsNumber),H LD (IY+IDE.HDD_INIT_TABLE.HeadsNumber),H
LD (IY+IDE.HDD_INIT_TABLE.CylinderNumberLow),E LD (IY+IDE.HDD_INIT_TABLE.CylinderNumberLow),E
LD (IY+IDE.HDD_INIT_TABLE.CylinderNumberHigh),D 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' EX AF,AF'
OUT (SLOT3),A OUT (SLOT3),A
EX AF,AF' EX AF,AF'
@ -595,25 +594,39 @@ PRESET: LD A,B
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.Chanel) LD A,(IY+IDE.HDD_INIT_TABLE.DRV_Flags)
LD BC,IDE.Write.DriveCtrl LD BC,IDE.Write.DriveCtrl
OUT (C),A OUT (C),A
BIT 6,A ;¡¨â CHS/LBA ;!FIXIT ᤥ« âì ¬¥âª ¬¨ ­®¬¥à  ¡¨â ;!TEST
;BIT 6,A ;¡¨â CHS/LBA ;!FIXIT ᤥ« âì ¬¥âª ¬¨ ­®¬¥à  ¡¨â
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
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 OUT (C),D ;LBA 8..15
LD BC,IDE.Write.CylinderHigh LD BC,IDE.Write.CylinderHigh
OUT (C),L ;LBA 16..23 OUT (C),L ;LBA 16..23
LD BC,IDE.Write.DriveCtrl LD BC,IDE.Read.Control
DEC B
IN A,(C) IN A,(C)
AND #F0 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.DriveCtrl
ENDIF
OUT (C),A OUT (C),A
EX AF,AF' EX AF,AF'
OUT (SLOT3),A OUT (SLOT3),A
@ -715,7 +728,7 @@ HDD_5x.DETECT:
LD C,SLOT3 LD C,SLOT3
OUT (C),B OUT (C),B
CP #FF CP IDE.Device.NONE
CCF CCF
RET RET
;[]================================================================[#57] ;[]================================================================[#57]

View File

@ -106,18 +106,17 @@ SELECT_IDE:
JR Z,IAUTO1 ;R00 JR Z,IAUTO1 ;R00
DEC A ;R00 DEC A ;R00
LD D,#B0 ;R00 LD D,#B0 ;R00
IAUTO1: IAUTO1: LD A,IDE.Chanel.Secondary ;R00 ;SELECT SECONDARY
LD A,IDE.Chanel.Secondary ;R00 ;SELECT SECONDARY
OUT (IDE.Chanel.Set),A ;R00 OUT (IDE.Chanel.Set),A ;R00
LD A,1 ;LD A,1
JP IAUTO ;R00 JP IAUTO ;R00
IAUTO0: IAUTO0:
LD A,IDE.Chanel.Primary ;R00 ;SELECT PRIMARY LD A,IDE.Chanel.Primary ;R00 ;SELECT PRIMARY
OUT (IDE.Chanel.Set),A ;R00 OUT (IDE.Chanel.Set),A ;R00
LD A,0 ;LD A,0
IAUTO: XOR A
LD (ICHANEL),A IAUTO: LD (ICHANEL),A
LD BC,IDE.Write.DriveCtrl ;R01 LD BC,IDE.Write.DriveCtrl ;R01
OUT (C),D ;R01 OUT (C),D ;R01
RET RET
@ -131,8 +130,12 @@ CDMASTR:
LD (SKIP),A LD (SKIP),A
LD BC,IDE.Write.DriveCtrl LD BC,IDE.Write.DriveCtrl
OUT (C),D OUT (C),D
IF IDE_Optimization
LD BC,IDE.Read.Status DEC B
INC C
ELSE
LD BC,IDE.Read.Status
ENDIF
IN A,(C) IN A,(C)
AND #80 AND #80
LD HL,280 LD HL,280
@ -156,11 +159,17 @@ NO_BUSY:
LD E,#05 LD E,#05
LD BC,IDE.Write.Counter LD BC,IDE.Write.Counter
OUT (C),E OUT (C),E
LD BC,#0010
DJNZ $ ;!HARDCODE LD BC,#0010 ;§ ¤¥à¦ª  50092 â ªâ  + int
.pause: DJNZ .pause
DEC C DEC C
JR NZ,$-3 ;!HARDCODE JR NZ,.pause
LD BC,IDE.Read.Counter
IF IDE_Optimization
LD C,IDE.Read.Counter
ELSE
LD BC,IDE.Read.Counter
ENDIF
IN A,(C) IN A,(C)
CP E CP E
JP NZ,ABSENT JP NZ,ABSENT
@ -172,7 +181,9 @@ NO_BUSY:
LD E,#00 ;NOP LD E,#00 ;NOP
LD BC,IDE.Write.Command LD BC,IDE.Write.Command
OUT (C),E OUT (C),E
IF IDE_Optimization
DEC B
ENDIF
WXREADY: WXREADY:
HALT HALT
DEC HL DEC HL
@ -181,13 +192,15 @@ WXREADY:
JP Z,ABSENT JP Z,ABSENT
CALL SKIPKEY CALL SKIPKEY
JP C,ABSENT JP C,ABSENT
LD BC,IDE.Read.Status IFN IDE_Optimization
LD BC,IDE.Read.Status
ENDIF
IN A,(C) IN A,(C)
AND #C0 AND #C0
CP #40 CP #40
JR NZ,WXREADY JR NZ,WXREADY
; LD A,#90 ; ; LD A,#90 ;?????
; CALL IDE_CMD ; CALL IDE_CMD
LD A,IDE.Device.HDD LD A,IDE.Device.HDD
@ -195,11 +208,17 @@ WXREADY:
LD E,#EC ;IDENTIFY ATA LD E,#EC ;IDENTIFY ATA
LD BC,IDE.Write.Command LD BC,IDE.Write.Command
OUT (C),E OUT (C),E
LD B,0 LD B,0
.pause: DJNZ .pause .pause: DJNZ .pause
LD HL,(WAITSML) LD HL,(WAITSML)
LD DE,#0101 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 CALL WAIT_PRT
JP NC,NOHDD JP NC,NOHDD
@ -222,11 +241,17 @@ NOHDD: LD A,IDE.Device.CDROM
LD E,#A1 ;IDENTIFY ATAPI LD E,#A1 ;IDENTIFY ATAPI
LD BC,IDE.Write.Command LD BC,IDE.Write.Command
OUT (C),E OUT (C),E
LD B,#00
DJNZ $ LD B,0
.pause: DJNZ .pause
LD HL,(WAITSML) LD HL,(WAITSML)
LD DE,#0101 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 CALL WAIT_PRT
JP C,GETPARM JP C,GETPARM
ABSENT: ABSENT:
@ -256,20 +281,23 @@ IDESPEC:
BIT 1,A BIT 1,A
JR Z,NONLBA JR Z,NONLBA
SET 6,B SET 6,B
NONLBA: NONLBA: LD A,B
LD A,B
LD BC,IDE.Write.DriveCtrl LD BC,IDE.Write.DriveCtrl
OUT (C),A OUT (C),A
AND #F0 AND #F0 ;!HARDCODE DRIVE/HEAD REGISTER PHISICAL DISK bitmask
LD HL,ICHANEL LD HL,ICHANEL
OR (HL) 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 HL,(TEMP+#02) ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã. CYLINDERS
LD (IY+IDE.HDD_INIT_TABLE.CylinderNumberLow),L LD (IY+IDE.HDD_INIT_TABLE.CylinderNumberLow),L
LD (IY+IDE.HDD_INIT_TABLE.CylinderNumberHigh),H LD (IY+IDE.HDD_INIT_TABLE.CylinderNumberHigh),H
LD A,(TEMP+#0C) ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã. SECTOR PER TRACK LD A,(TEMP+#0C) ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã. SECTOR PER TRACK
LD (IY+IDE.HDD_INIT_TABLE.SectorsPerTrack),A 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 OUT (C),A
LD A,#91 ; LD A,#91 ;
CALL IDE_CMD CALL IDE_CMD
@ -296,7 +324,7 @@ FOR_CDR:
AND #F0 AND #F0
LD HL,ICHANEL LD HL,ICHANEL
OR (HL) OR (HL)
LD (IY+IDE.HDD_INIT_TABLE.Chanel),A LD (IY+IDE.HDD_INIT_TABLE.DRV_Flags),A
JR NOSPEC JR NOSPEC
IDE_CMD: IDE_CMD:
@ -307,7 +335,11 @@ IDE_CMD:
CALL WAIT_PRT CALL WAIT_PRT
POP DE POP DE
RET C RET C
LD BC,IDE.Write.Command IF IDE_Optimization
INC B
ELSE
LD BC,IDE.Write.Command
ENDIF
OUT (C),D OUT (C),D
LD HL,(WAITIDE) LD HL,(WAITIDE)
LD DE,#C040 LD DE,#C040
@ -372,15 +404,15 @@ WAIT_PRT:
SKIPKEY: SKIPKEY:
EXX EXX
CALL SCANKEY CALL SCANKEY
EXX EXX
SCF SCF
CCF CCF
RET Z RET Z
EXX EXX
LD HL,#3E00 ;!HARDCODE LD HL,#3E00 ;!HARDCODE
AND A AND A
SBC HL,DE SBC HL,DE
EXX EXX
SCF SCF
CCF CCF