This commit is contained in:
Tolik 2025-05-27 22:31:39 +10:00
parent 4a3574fe3f
commit 2d3dca1109
4 changed files with 220 additions and 223 deletions

@ -1 +1 @@
Subproject commit 8371051031cac61e25740ba6cf9f2acacdc783b7
Subproject commit 72b28f7d64cd4f263ed0e23acbe8f1eb254b1f7f

View File

@ -1,12 +1,18 @@
;
MACRO WAIT_HDD
LD BC,IDE.Read.Status
.loop: IN A,(C)
BIT IDE.CtrlBit.Busy,A
JR NZ,.loop
ENDM
; MACRO WAIT_HDD
; LD BC,IDE.Read.Status
; .loop: IN A,(C)
; BIT IDE.CtrlBit.Busy,A
; JR NZ,.loop
; ENDM
;______________________________________________________________________:
;
F4x_WAIT_HDD: LD BC,IDE.Read.Status
.loop: IN A,(C)
BIT IDE.CtrlBit.Busy,A
RET Z
JR .loop
; GET_BPB_OFFSET:
; ;LD A,SYS_PAGE
@ -91,23 +97,14 @@ HD_PREPARE:
LD A,B
LD BC,IDE.Write.Counter ; “áâ ­®¢¨âì ç¨á«® ᥪâ®à®¢ ¤«ï § ¯¨á¨
OUT (C),A
IF IDE_Optimization
;
INC C
OUT (C),L
INC C
OUT (C),E
INC C
OUT (C),D
ELSE
LD BC,IDE.Write.Sector
OUT (C),L ; …ŠŽ<E28099>
LD BC,IDE.Write.CylinderLow
INC C
OUT (C),E ; ¤®à®¦ª  low
LD BC,IDE.Write.CylinderHigh
INC C
OUT (C),D ; ¤®à®¦ª  high
ENDIF
;
LD BC,IDE.Read.Control
IN A,(C)
AND #F0 ; !!!!! ¯®á¬®âà¥âì
@ -132,7 +129,6 @@ NEXT_ADD_SEC:
LD BC,IDE.Write.Counter ; “áâ ­®¢¨âì ç¨á«® ᥪâ®à®¢ ¤«ï § ¯¨á¨
OUT (C),A
IF IDE_Optimization
DEC B
INC C
IN A,(C) ; IDE.Read.Sector
@ -156,29 +152,7 @@ NEXT_ADD_SEC:
LD BC,IDE.Read.Control
IN A,(C)
ELSE
LD BC,IDE.Read.Sector
IN A,(C)
ADC A,E
INC B
OUT (C),A ; IDE.Write.Sector
LD BC,IDE.Read.CylinderLow
IN A,(C)
ADC A,D
INC B
OUT (C),A ; IDE.Write.CylinderLow
LD BC,IDE.Read.CylinderHigh
IN A,(C)
ADC A,0
INC B
OUT (C),A ; IDE.Write.CylinderHigh
LD BC,IDE.Read.Control
IN A,(C)
ENDIF
;
LD D,A
ADC A,0
AND #0F
@ -278,7 +252,7 @@ FN_HDD_READ:
LD BC,IDE.Write.Command
LD A,IDE.CMD.ATA.ReadSectorsWithRetry
OUT (C),A
.L2: WAIT_HDD
.L2: CALL F4x_WAIT_HDD
;BIT IDE.CtrlBit.DataRequest,A
AND IDE.CtrlByte.DataRequest
JR Z,.RET_PortY
@ -352,7 +326,7 @@ FN_HDD_WRITE:
OUT (C),A
HD_WR_L2:
WAIT_HDD
CALL F4x_WAIT_HDD
BIT IDE.CtrlBit.DataRequest,A
JR Z,HD_RET
@ -511,11 +485,9 @@ FN_HDD_TEST_IDE:
;-----------------------------------[DIFFERENT]
; <20>¥ ¤®«¦­  ¯®àâ¨âì ॣ¨áâà E!!!
TEST_HDD_DRV:
; EXP_HDD.ASM variant
LD HL,#01FE
LD BC,IDE.Write.Counter
OUT (C),L
IF IDE_Optimization
INC C
OUT (C),H ; IDE.Write.Sector
;
@ -525,15 +497,6 @@ TEST_HDD_DRV:
CP L
RET NZ
INC C
ELSE
LD BC,IDE.Write.Sector
OUT (C),H
LD BC,IDE.Read.Counter
IN A,(C)
CP L
RET NZ
LD BC,IDE.Read.Sector
ENDIF
IN A,(C) ; IDE.Read.Sector
CP H
RET
@ -543,26 +506,15 @@ TEST_HDD_DRV:
; LD HL,#00FF
; LD BC,IDE.Write.CylinderLow
; OUT (C),L
; IF IDE_Optimization
; INC C
; INC C
; OUT (C),H ; IDE.Write.CylinderHigh
; INC B
; DEC C
; INC B
; DEC C
; IN A,(C) ; ’ãâ ॣ¨áâà BC = #0254 - .CylinderLow
; CP L
; RET NZ
; INC C
; ELSE
; LD BC,IDE.Write.CylinderHigh
; OUT (C),H
; LD BC,#0254
; IN A,(C)
; CP L
; RET NZ
; LD BC,#0255
; ENDIF
; INC C
; IN A,(C) ; ’ãâ ॣ¨áâà BC = #0255 - .CylinderHigh
; CP H
@ -647,11 +599,11 @@ FN_HDD_INIT:
; CALL TEST_HDD_DRV
; JR NZ,.ABSENT
;
.L3: WAIT_HDD
.L3: CALL F4x_WAIT_HDD
LD BC,IDE.Write.Command
LD A,IDE.CMD.ATA.IdentifyDevice ;!FIXIT ¯¥à¥¤¥« âì
OUT (C),A
WAIT_HDD
CALL F4x_WAIT_HDD
AND IDE.CtrlByte.DataRequest
;JR NZ,.L2
SCF
@ -689,7 +641,7 @@ FN_HDD_INIT:
DEC A
JR NZ,.loop
LD (SYS_PAGE.HD_IDF_ADR.sec_cyl),HL
WAIT_HDD
CALL F4x_WAIT_HDD
LD BC,IDE.Read.Control
IN A,(C)
AND #10

View File

@ -138,7 +138,14 @@ WAIT:
ENDM
/////////////////////////////////////////////////////////////////////[v]
START: ;CALL Nop_CHANELS
START: ; reset all
LD A,IDE.Chanel.Primary
OUT (IDE.Chanel.Set),A
CALL RESET_IDE_CHANEL
LD A,IDE.Chanel.Secondary ;SELECT SECONDARY
OUT (IDE.Chanel.Set),A
CALL RESET_IDE_CHANEL
;
;
IN A,(SLOT3)
EX AF,AF'
@ -177,26 +184,33 @@ START: ;CALL Nop_CHANELS
;RET
/////////////////////////////////////////////////////////////////////[^]
/////////////////////////////////////////////////////////////////////[v]
RESET_IDE_CHANEL:
LD BC,IDE.Write.DeviceControl
LD A,IDE.DeviceControlByte.setReset
OUT (C),A
DJNZ $
LD B,high IDE.Write.DeviceControl
LD A,IDE.DeviceControlByte.resReset
OUT (C),A
RET
/////////////////////////////////////////////////////////////////////[^]
/////////////////////////////////////////////////////////////////////[v]
AUTODETECT:
LD A,L ;DETECT MESSAGE
CALL POSTMSG
CALL ScreenPOS.SUBNAME
LD A,(MasterSlave)
;
CALL AUTODETECTING
.IDEJUMPBACK:
CALL NC,PRINT_IDE_MODEL
LD A,(SKIP)
INC A
LD A,msgStrings.ideNone
JR Z,.NOSKIPKEY
LD A,msgStrings.ideSkiped
.NOSKIPKEY:
CALL C,POSTMSG
CALL ScreenPOS.CRLF
RET
AUTODETECT: LD A,L ;DETECT MESSAGE
CALL POSTMSG
CALL ScreenPOS.SUBNAME
LD A,(MasterSlave)
CALL AUTODETECTING
.IDEJUMPBACK: CALL NC,PRINT_IDE_MODEL
LD A,(SKIP)
INC A
LD A,msgStrings.ideNone
JR Z,.NOSKIPKEY
LD A,msgStrings.ideSkiped
.NOSKIPKEY: CALL C,POSTMSG
CALL ScreenPOS.CRLF
RET
/////////////////////////////////////////////////////////////////////[^]
@ -265,7 +279,20 @@ IT_IS_ATAPI:
/////////////////////////////////////////////////////////////////////[v]
AUTODETECTING: CALL DETECTORS.CheckChanel
SEND_NOP: XOR A
LD BC,IDE.Write.Features
OUT (C),A
LD BC,IDE.Write.Command
LD E,IDE.CMD.ATA.Nop
OUT (C),E
PAUSE_DJNZ 32
RET
/////////////////////////////////////////////////////////////////////[^]
/////////////////////////////////////////////////////////////////////[v]
AUTODETECTING: CALL SEND_NOP
;
CALL DETECTORS.CheckChanel
JR C,.IDE_ABSENT
CALL Bug31SecCheck
@ -295,12 +322,12 @@ AUTODETECTING: CALL DETECTORS.CheckChanel
.Its_ATA: LD A,IDE.Device.HDD
.get: LD (IDEDEV),A
CALL GETPARAM
JR C,.IDE_ABSENT
RET NC
;JR C,.IDE_ABSENT
;CALL DisableWriteCache
;CALL DisableStandBy
AND A
RET
;
;AND A
;RET
.IDE_ABSENT: LD A,IDE.Device.NONE
LD (IDEDEV),A
;LD A,IDE.CMD.ATA.Nop
@ -319,65 +346,66 @@ AUTODETECTING: CALL DETECTORS.CheckChanel
/////////////////////////////////////////////////////////////////////[v]
SETUP_FROM_CMOS:
LD A,H
LD IX,PRIM_MASTER_CMOS_TABLE
OR A
JR Z,.step1
;
LD IX,PRIM_SLAVE_CMOS_TABLE
CP 1
JR Z,.step1
;
LD IX,SEC_MASTER_CMOS_TABLE
CP 2
JR Z,.step1
;
LD IX,SEC_SLAVE_CMOS_TABLE
.step1: LD HL,IDENTIFY_DEVICE_BUFFER
LD DE,IDENTIFY_DEVICE_BUFFER+1
LD BC,511
LD (HL),0
LDIR
;
CALL Bug31SecCheck
JR NC,.step2
;
LD HL,PAUSES.HALT.BIG
CALL BITS_WAITS.Clear_BUSY
JR C,AUTODETECTING.IDE_ABSENT
;
.step2: LD A,(IX + IDE_CMOS_TABLE.Heads)
CALL READCMS
LD (IDENTIFY_DEVICE_BUFFER.NumHeads),A
;
LD A,(IX + IDE_CMOS_TABLE.CylindersHigh)
CALL READCMS
PUSH AF
;
LD A,(IX + IDE_CMOS_TABLE.CylindersLow)
CALL READCMS
POP HL
LD L,A
LD (IDENTIFY_DEVICE_BUFFER.NumCylinders),HL
;
LD A,(IX + IDE_CMOS_TABLE.Sectors)
CALL READCMS
LD (IDENTIFY_DEVICE_BUFFER.NumSectorsPerTrack),A
;
LD A,IDE.Device.HDD
LD (IDEDEV),A
; CALL IDESPEC
; RET
LD A,H
LD IX,PRIM_MASTER_CMOS_TABLE
OR A
JR Z,.step1
;
LD IX,PRIM_SLAVE_CMOS_TABLE
DEC A
JR Z,.step1
;
LD IX,SEC_MASTER_CMOS_TABLE
DEC A
JR Z,.step1
;
LD IX,SEC_SLAVE_CMOS_TABLE
.step1: LD HL,IDENTIFY_DEVICE_BUFFER
LD DE,IDENTIFY_DEVICE_BUFFER+1
LD BC,511
LD (HL),0
LDIR
;
CALL Bug31SecCheck
JR NC,.step2
;
LD HL,PAUSES.HALT.BIG
CALL BITS_WAITS.Clear_BUSY
JR C,AUTODETECTING.IDE_ABSENT
;
.step2: LD A,(IX + IDE_CMOS_TABLE.Heads)
CALL READCMS
LD (IDENTIFY_DEVICE_BUFFER.NumHeads),A
;
LD A,(IX + IDE_CMOS_TABLE.CylindersHigh)
CALL READCMS
PUSH AF
;
LD A,(IX + IDE_CMOS_TABLE.CylindersLow)
CALL READCMS
POP HL
LD L,A
LD (IDENTIFY_DEVICE_BUFFER.NumCylinders),HL
;
LD A,(IX + IDE_CMOS_TABLE.Sectors)
CALL READCMS
LD (IDENTIFY_DEVICE_BUFFER.NumSectorsPerTrack),A
;
LD A,IDE.Device.HDD
LD (IDEDEV),A
; CALL IDESPEC
; RET
/////////////////////////////////////////////////////////////////////[^]
/////////////////////////////////////////////////////////////////////[v]
IDESPEC: IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
;
LD A,(IDEDEV)
LD (IY+IDE.HDD_INIT_TABLE.DriveType),A
CP IDE.Device.ATAPI
JP Z,.FOR_ATAPI
JR Z,.FOR_ATAPI
;
LD BC,IDE.Read.Control
IN A,(C)
@ -562,37 +590,36 @@ BITS_WAITS:
/////////////////////////////////////////////////////////////////////[v]
SELECT_IDE:
AND A ;%0000'0011
LD B,IDE.Drive.Master
JR Z,.AUTO_0
;
DEC A
LD B,IDE.Drive.Slave
JR Z,.AUTO_0
;
DEC A
;R00
LD B,IDE.Drive.Master
JR Z,.AUTO_1
;
DEC A
LD B,IDE.Drive.Slave
.AUTO_1: LD A,IDE.Chanel.Secondary ;SELECT SECONDARY
OUT (IDE.Chanel.Set),A
JP .AUTO
;
.AUTO_0: LD A,IDE.Chanel.Primary ;SELECT PRIMARY
OUT (IDE.Chanel.Set),A
;
XOR A
.AUTO: LD (ICHANEL),A
;R01
LD A,B
LD BC,IDE.Write.DeviceHead
OUT (C),A
;
RET
SELECT_IDE: AND A ;%0000'0011
LD B,IDE.Drive.Master
JR Z,.AUTO_0
;
DEC A
LD B,IDE.Drive.Slave
JR Z,.AUTO_0
;
DEC A
;R00
LD B,IDE.Drive.Master
JR Z,.AUTO_1
;
DEC A
LD B,IDE.Drive.Slave
.AUTO_1: LD A,IDE.Chanel.Secondary ;SELECT SECONDARY
OUT (IDE.Chanel.Set),A
JP .AUTO
;
.AUTO_0: LD A,IDE.Chanel.Primary ;SELECT PRIMARY
OUT (IDE.Chanel.Set),A
;
XOR A
.AUTO: LD (ICHANEL),A
;R01
LD A,B
LD BC,IDE.Write.DeviceHead
OUT (C),A
;
RET
/////////////////////////////////////////////////////////////////////[^]
@ -692,8 +719,9 @@ SaveToCMOS:
/////////////////////////////////////////////////////////////////////[v]
; Check bug with 31 sec freeze
Bug31SecCheck: LD A,(MasterSlave)
AND 1
RET Z
;AND 1
RRA
RET C
;
LD HL,PAUSES.HALT.Time_2s
CALL BITS_WAITS.Clear_BUSY
@ -704,14 +732,19 @@ Bug31SecCheck: LD A,(MasterSlave)
LD A,IDE.Drive.Slave
LD BC,IDE.Write.DeviceHead
OUT (C),A
PAUSE_DJNZ 16
PAUSE_DJNZ 32
LD BC,IDE.Write.Command
LD A,IDE.CMD.ATAPI.Reset
OUT (C),A
PAUSE_DJNZ 16
PAUSE_DJNZ 64
LD A,IDE.Drive.Master
LD BC,IDE.Write.DeviceHead
OUT (C),A
PAUSE_DJNZ 32
;
;CALL SEND_NOP
;SCF
;CF=1
RET
;
.skip: POP BC ; ¡ « ­á á⥪ 
@ -720,7 +753,8 @@ Bug31SecCheck: LD A,(MasterSlave)
/////////////////////////////////////////////////////////////////////[v]
GETPARAM: LD HL,PAUSES.WAIT.IDE
LD DE,IDE.CtrlByte.DataRequest * 256 + IDE.CtrlByte.DataRequest
;LD DE,256*(IDE.CtrlByte.Busy + IDE.CtrlByte.DataRequest) + IDE.CtrlByte.DataRequest
LD DE,256*IDE.CtrlByte.DataRequest + IDE.CtrlByte.DataRequest
CALL BITS_WAITS.WAIT_PRT
RET C
LD BC,IDE.Read.Data
@ -729,8 +763,7 @@ GETPARAM: LD HL,PAUSES.WAIT.IDE
INIR
CALL IDESPEC
; [x] save hdd parameters to cmos for "setup" in settings
CALL SaveToCMOS
;
CALL SaveToCMOS
AND A
RET
/////////////////////////////////////////////////////////////////////[^]
@ -753,21 +786,27 @@ DETECTORS:
LD BC,IDE.Read.Counter
IN A,(C)
CP .test_counter
RET Z
SCF
RET NZ
AND A
RET
;
; § ¡¨¢ ¥¬ âãä⮩ ¤«ï â¥áâ  ATAPI ¢ .IdentDevCheck
;XOR A
;INC B
;INC C ; IDE.Write.Sector
;OUT (C),A
;INC C ; IDE.Write.CylinderLow
;OUT (C),A
;INC C ; IDE.Write.CylinderHigh
;OUT (C),A
;RET
;-------;
;-------;
; CHECK BY EXECUTING NOP COMMAND AND WAIT.
; Exit: CF - No device
.NOP_Check: LD E,IDE.CMD.ATA.Nop
LD BC,IDE.Write.Command
OUT (C),E
PAUSE_DJNZ 0
;LD HL,PAUSES.HALT.SMALL
.NOP_Check: CALL SEND_NOP
LD HL,PAUSES.HALT.MEDIUM
LD BC,IDE.Read.Status
;
@ -830,30 +869,31 @@ DETECTORS:
.non_ATA: LD BC,IDE.Read.Error
IN A,(C)
AND IDE.ErrorByte.Abort
; check signature #0114EB
;RET NZ ; ATAPI
;
RET NZ ; ATAPI
SCF
RET ; Absent
; check signature #0114EB
;SCF
;RET ; Absent
SCF
RET Z ; Absent
LD C,low IDE.Read.Sector
IN A,(C)
DEC A
;CF=1
RET NZ
;
INC C ; LD BC,IDE.Read.CylinderLow
IN L,(C)
INC C ; LD BC,IDE.Read.CylinderHigh
IN H,(C)
;AND A
LD BC,#EB14 - 1 ; CF=1
SBC HL,BC
SCF
RET NZ
;A=0, CF=1
ADC A,A ; CF=0,ZF=0
RET ; ATAPI
;RET Z ; Absent
;LD C,low IDE.Read.Sector
;IN A,(C)
;DEC A
;;CF=1
;RET NZ
;;
;INC C ; LD BC,IDE.Read.CylinderLow
;IN L,(C)
;INC C ; LD BC,IDE.Read.CylinderHigh
;IN H,(C)
;;AND A
;LD BC,#EB14 - 1 ; CF=1
;SBC HL,BC
;SCF
;RET NZ
;;A=0, CF=1
;ADC A,A ; CF=0,ZF=0
;RET ; ATAPI
;
;-------;
@ -889,11 +929,16 @@ DETECTORS:
LD E,L
; ¥á«¨ ¯ãá⮩: DE=#7868, A=#ED
;
LD HL,#7868 + #ED
LD HL,#7868 ; #7868 + #ED = #7955
AND A
SBC HL,DE
XOR L
RET NZ ; not absent
JR Z,.NOT_HL
;
AND A
RET ; not absent
;
.NOT_HL: XOR #ED
RET NZ
SCF
RET ; absent
;-------;
@ -911,11 +956,11 @@ Nop_CHANELS:
CALL .CMD
LD A,2
.CMD: CALL SELECT_IDE
PAUSE_DJNZ 0
PAUSE_DJNZ 32
LD BC,IDE.Write.Command
LD H,IDE.CMD.ATA.Nop
OUT (C),H
PAUSE_DJNZ 0
PAUSE_DJNZ 64
LD BC,IDE.Read.Status
IN A,(C)
RET

Binary file not shown.