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

View File

@ -138,7 +138,14 @@ WAIT:
ENDM ENDM
/////////////////////////////////////////////////////////////////////[v] /////////////////////////////////////////////////////////////////////[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) IN A,(SLOT3)
EX AF,AF' EX AF,AF'
@ -177,24 +184,31 @@ START: ;CALL Nop_CHANELS
;RET ;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] /////////////////////////////////////////////////////////////////////[v]
AUTODETECT: AUTODETECT: LD A,L ;DETECT MESSAGE
LD A,L ;DETECT MESSAGE
CALL POSTMSG CALL POSTMSG
CALL ScreenPOS.SUBNAME CALL ScreenPOS.SUBNAME
LD A,(MasterSlave) LD A,(MasterSlave)
;
CALL AUTODETECTING CALL AUTODETECTING
.IDEJUMPBACK: .IDEJUMPBACK: CALL NC,PRINT_IDE_MODEL
CALL NC,PRINT_IDE_MODEL
LD A,(SKIP) LD A,(SKIP)
INC A INC A
LD A,msgStrings.ideNone LD A,msgStrings.ideNone
JR Z,.NOSKIPKEY JR Z,.NOSKIPKEY
LD A,msgStrings.ideSkiped LD A,msgStrings.ideSkiped
.NOSKIPKEY: .NOSKIPKEY: CALL C,POSTMSG
CALL C,POSTMSG
CALL ScreenPOS.CRLF CALL ScreenPOS.CRLF
RET RET
/////////////////////////////////////////////////////////////////////[^] /////////////////////////////////////////////////////////////////////[^]
@ -265,7 +279,20 @@ IT_IS_ATAPI:
/////////////////////////////////////////////////////////////////////[v] /////////////////////////////////////////////////////////////////////[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 JR C,.IDE_ABSENT
CALL Bug31SecCheck CALL Bug31SecCheck
@ -295,12 +322,12 @@ AUTODETECTING: CALL DETECTORS.CheckChanel
.Its_ATA: LD A,IDE.Device.HDD .Its_ATA: LD A,IDE.Device.HDD
.get: LD (IDEDEV),A .get: LD (IDEDEV),A
CALL GETPARAM CALL GETPARAM
JR C,.IDE_ABSENT RET NC
;JR C,.IDE_ABSENT
;CALL DisableWriteCache ;CALL DisableWriteCache
;CALL DisableStandBy ;CALL DisableStandBy
AND A ;AND A
RET ;RET
;
.IDE_ABSENT: LD A,IDE.Device.NONE .IDE_ABSENT: LD A,IDE.Device.NONE
LD (IDEDEV),A LD (IDEDEV),A
;LD A,IDE.CMD.ATA.Nop ;LD A,IDE.CMD.ATA.Nop
@ -325,11 +352,11 @@ SETUP_FROM_CMOS:
JR Z,.step1 JR Z,.step1
; ;
LD IX,PRIM_SLAVE_CMOS_TABLE LD IX,PRIM_SLAVE_CMOS_TABLE
CP 1 DEC A
JR Z,.step1 JR Z,.step1
; ;
LD IX,SEC_MASTER_CMOS_TABLE LD IX,SEC_MASTER_CMOS_TABLE
CP 2 DEC A
JR Z,.step1 JR Z,.step1
; ;
LD IX,SEC_SLAVE_CMOS_TABLE LD IX,SEC_SLAVE_CMOS_TABLE
@ -374,10 +401,11 @@ IDESPEC: IN A,(SLOT3)
EX AF,AF' EX AF,AF'
LD A,SYS_PAGE LD A,SYS_PAGE
OUT (SLOT3),A OUT (SLOT3),A
;
LD A,(IDEDEV) LD A,(IDEDEV)
LD (IY+IDE.HDD_INIT_TABLE.DriveType),A LD (IY+IDE.HDD_INIT_TABLE.DriveType),A
CP IDE.Device.ATAPI CP IDE.Device.ATAPI
JP Z,.FOR_ATAPI JR Z,.FOR_ATAPI
; ;
LD BC,IDE.Read.Control LD BC,IDE.Read.Control
IN A,(C) IN A,(C)
@ -562,8 +590,7 @@ BITS_WAITS:
/////////////////////////////////////////////////////////////////////[v] /////////////////////////////////////////////////////////////////////[v]
SELECT_IDE: SELECT_IDE: AND A ;%0000'0011
AND A ;%0000'0011
LD B,IDE.Drive.Master LD B,IDE.Drive.Master
JR Z,.AUTO_0 JR Z,.AUTO_0
; ;
@ -692,8 +719,9 @@ SaveToCMOS:
/////////////////////////////////////////////////////////////////////[v] /////////////////////////////////////////////////////////////////////[v]
; Check bug with 31 sec freeze ; Check bug with 31 sec freeze
Bug31SecCheck: LD A,(MasterSlave) Bug31SecCheck: LD A,(MasterSlave)
AND 1 ;AND 1
RET Z RRA
RET C
; ;
LD HL,PAUSES.HALT.Time_2s LD HL,PAUSES.HALT.Time_2s
CALL BITS_WAITS.Clear_BUSY CALL BITS_WAITS.Clear_BUSY
@ -704,14 +732,19 @@ Bug31SecCheck: LD A,(MasterSlave)
LD A,IDE.Drive.Slave LD A,IDE.Drive.Slave
LD BC,IDE.Write.DeviceHead LD BC,IDE.Write.DeviceHead
OUT (C),A OUT (C),A
PAUSE_DJNZ 16 PAUSE_DJNZ 32
LD BC,IDE.Write.Command LD BC,IDE.Write.Command
LD A,IDE.CMD.ATAPI.Reset LD A,IDE.CMD.ATAPI.Reset
OUT (C),A OUT (C),A
PAUSE_DJNZ 16 PAUSE_DJNZ 64
LD A,IDE.Drive.Master LD A,IDE.Drive.Master
LD BC,IDE.Write.DeviceHead LD BC,IDE.Write.DeviceHead
OUT (C),A OUT (C),A
PAUSE_DJNZ 32
;
;CALL SEND_NOP
;SCF
;CF=1
RET RET
; ;
.skip: POP BC ; ¡ « ­á á⥪  .skip: POP BC ; ¡ « ­á á⥪ 
@ -720,7 +753,8 @@ Bug31SecCheck: LD A,(MasterSlave)
/////////////////////////////////////////////////////////////////////[v] /////////////////////////////////////////////////////////////////////[v]
GETPARAM: LD HL,PAUSES.WAIT.IDE 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 CALL BITS_WAITS.WAIT_PRT
RET C RET C
LD BC,IDE.Read.Data LD BC,IDE.Read.Data
@ -730,7 +764,6 @@ GETPARAM: LD HL,PAUSES.WAIT.IDE
CALL IDESPEC CALL IDESPEC
; [x] save hdd parameters to cmos for "setup" in settings ; [x] save hdd parameters to cmos for "setup" in settings
CALL SaveToCMOS CALL SaveToCMOS
;
AND A AND A
RET RET
/////////////////////////////////////////////////////////////////////[^] /////////////////////////////////////////////////////////////////////[^]
@ -753,21 +786,27 @@ DETECTORS:
LD BC,IDE.Read.Counter LD BC,IDE.Read.Counter
IN A,(C) IN A,(C)
CP .test_counter CP .test_counter
RET Z
SCF SCF
RET NZ
AND A
RET 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. ; CHECK BY EXECUTING NOP COMMAND AND WAIT.
; Exit: CF - No device ; Exit: CF - No device
.NOP_Check: LD E,IDE.CMD.ATA.Nop .NOP_Check: CALL SEND_NOP
LD BC,IDE.Write.Command
OUT (C),E
PAUSE_DJNZ 0
;LD HL,PAUSES.HALT.SMALL
LD HL,PAUSES.HALT.MEDIUM LD HL,PAUSES.HALT.MEDIUM
LD BC,IDE.Read.Status LD BC,IDE.Read.Status
; ;
@ -830,30 +869,31 @@ DETECTORS:
.non_ATA: LD BC,IDE.Read.Error .non_ATA: LD BC,IDE.Read.Error
IN A,(C) IN A,(C)
AND IDE.ErrorByte.Abort AND IDE.ErrorByte.Abort
; check signature #0114EB
;RET NZ ; ATAPI
;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 RET NZ ; ATAPI
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 SCF
RET NZ RET ; Absent
;A=0, CF=1 ; check signature #0114EB
ADC A,A ; CF=0,ZF=0 ;SCF
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 LD E,L
; ¥á«¨ ¯ãá⮩: DE=#7868, A=#ED ; ¥á«¨ ¯ãá⮩: DE=#7868, A=#ED
; ;
LD HL,#7868 + #ED LD HL,#7868 ; #7868 + #ED = #7955
AND A AND A
SBC HL,DE SBC HL,DE
XOR L JR Z,.NOT_HL
RET NZ ; not absent ;
AND A
RET ; not absent
;
.NOT_HL: XOR #ED
RET NZ
SCF SCF
RET ; absent RET ; absent
;-------; ;-------;
@ -911,11 +956,11 @@ Nop_CHANELS:
CALL .CMD CALL .CMD
LD A,2 LD A,2
.CMD: CALL SELECT_IDE .CMD: CALL SELECT_IDE
PAUSE_DJNZ 0 PAUSE_DJNZ 32
LD BC,IDE.Write.Command LD BC,IDE.Write.Command
LD H,IDE.CMD.ATA.Nop LD H,IDE.CMD.ATA.Nop
OUT (C),H OUT (C),H
PAUSE_DJNZ 0 PAUSE_DJNZ 64
LD BC,IDE.Read.Status LD BC,IDE.Read.Status
IN A,(C) IN A,(C)
RET RET

Binary file not shown.