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

View File

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