diff --git a/Shared_Includes b/Shared_Includes index 25ac1c8..8371051 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 25ac1c89f4ce070e041437ddbcdd18ab2ab223be +Subproject commit 8371051031cac61e25740ba6cf9f2acacdc783b7 diff --git a/src/bios/exp/EXTENDED/IDE/ATA_DRV.ASM b/src/bios/exp/EXTENDED/IDE/ATA_DRV.ASM index d07d348..102d965 100644 --- a/src/bios/exp/EXTENDED/IDE/ATA_DRV.ASM +++ b/src/bios/exp/EXTENDED/IDE/ATA_DRV.ASM @@ -300,8 +300,9 @@ RW_ATA_SECTORs: PUSH BC ; POP BC ; признак short/long в C RET C ; - EXX - CALL WAITPRT + EXX + LD DE,256*(IDE.CtrlByte.Busy+IDE.CtrlByte.Ready) + IDE.CtrlByte.Ready + CALL WAITPRT.custom EXX RET C ; @@ -547,8 +548,9 @@ ATA_5x_VERIFY: PUSH IY .VERIFY: LD C,IDE.Device.HDD CALL SELECT_DRIVE RET C - EXX - CALL WAITPRT + EXX + LD DE,256*(IDE.CtrlByte.Busy+IDE.CtrlByte.Ready) + IDE.CtrlByte.Ready + CALL WAITPRT.custom EXX RET C ;PUSH DE @@ -664,7 +666,7 @@ DIV32X: ;HL:DE / BC => DE:IX HL-OSTATOK ; D - MASK ; E - PATTERN ; !!! некоторые функции надеются, что на выходе всегда ZF -WAITPRT: LD DE,256*(IDE.CtrlByte.Busy+IDE.CtrlByte.Ready+IDE.CtrlByte.Error)+IDE.CtrlByte.Ready +WAITPRT: LD DE,256*(IDE.CtrlByte.Busy+IDE.CtrlByte.Ready+IDE.CtrlByte.Error) + IDE.CtrlByte.Ready .custom: LD BC,IDE.Read.Status LD HL,#0000 ; задержка ;!HARDCODE ; diff --git a/src/bios/exp/EXTENDED/IDE/shared.asm b/src/bios/exp/EXTENDED/IDE/shared.asm index d4dbc7e..160ec71 100644 --- a/src/bios/exp/EXTENDED/IDE/shared.asm +++ b/src/bios/exp/EXTENDED/IDE/shared.asm @@ -51,12 +51,14 @@ SELECT_DRIVE: AND #0F LD BC,IDE.Write.DeviceHead OUT (C),A ; - LD A,high IDE.Read.Status +.del_me: LD A,high IDE.Read.Status IN A,(low IDE.Read.Status) AND IDE.CtrlByte.Busy - JR Z,.notBusy - LD B,32 - DJNZ $ + ; тестирование задержек + ;JR NZ,.del_me + JR Z,.notBusy + LD B,32 + DJNZ $ ; .notBusy: LD A,H EXX diff --git a/src/bios/rom/SETUP/AUTOIDE.asm b/src/bios/rom/SETUP/AUTOIDE.asm index 2068315..1294eeb 100644 --- a/src/bios/rom/SETUP/AUTOIDE.asm +++ b/src/bios/rom/SETUP/AUTOIDE.asm @@ -96,6 +96,7 @@ IDE3 EQU #C1D8 HALT: .Time_2s EQU 100 .SMALL EQU 200 ; 04 сек +.MEDIUM EQU 400 ; 08 сек .BIG EQU 1550 ; 31 сек WAIT: .IDE EQU #0000 @@ -137,7 +138,7 @@ WAIT: ENDM /////////////////////////////////////////////////////////////////////[v] -START: CALL SetUP_CHANELS +START: ;CALL Nop_CHANELS ; IN A,(SLOT3) EX AF,AF' @@ -172,8 +173,8 @@ START: CALL SetUP_CHANELS ;[x] save hdd parameters to cmos for "setup" in settings CALL WRITING ; - CALL ScreenPOS.CRLF - RET + JP ScreenPOS.CRLF + ;RET /////////////////////////////////////////////////////////////////////[^] @@ -200,7 +201,6 @@ AUTODETECT: /////////////////////////////////////////////////////////////////////[v] -; !HARDCODE заменить числа на метки в этой процедуре STEP1_GETCMOS: LD (MasterSlave),A LD H,A ;SAVE DRIVE NUMBER @@ -225,12 +225,12 @@ STEP1_GETCMOS: LD L,msgStrings.detectIdeSecMA JR Z,.choose ; - DEC A + ;DEC A LD BC,CMOS_CELL.DrivesSetup_2.Mask.SecIDEslave LD L,msgStrings.detectIdeSecSL - JR Z,.choose - SCF - RET + ;JR Z,.choose + ;SCF + ;RET ;0 - AUTODETECT ;1 - GETTING FROM SETUP ;2 - CD-ROM (ATAPI device) @@ -269,7 +269,7 @@ AUTODETECTING: CALL DETECTORS.CheckChanel JR C,.IDE_ABSENT CALL Bug31SecCheck - JR C,.next + JR NC,.next LD HL,PAUSES.HALT.BIG CALL BITS_WAITS.Clear_BUSY @@ -286,7 +286,6 @@ AUTODETECTING: CALL DETECTORS.CheckChanel CALL DETECTORS.IdentDevCheck JR C,.IDE_ABSENT JR Z,.Its_ATA - ; enter point for ATAPI in setup .Its_ATAPI: CALL DETECTORS.IdentPDevChk JR C,.IDE_ABSENT @@ -304,11 +303,15 @@ AUTODETECTING: CALL DETECTORS.CheckChanel ; .IDE_ABSENT: LD A,IDE.Device.NONE LD (IDEDEV),A - LD A,IDE.CMD.ATA.Nop - LD BC,IDE.Write.Command - OUT (C),A - DEC B - IN A,(C) ; IDE.Read.Status + ;LD A,IDE.CMD.ATA.Nop + ;LD BC,IDE.Write.Command + ;OUT (C),A + ;; + ; ;DEC B + ; PAUSE_DJNZ 0 + ; LD BC,IDE.Read.Status + ;; + ;IN A,(C) ; IDE.Read.Status SCF RET /////////////////////////////////////////////////////////////////////[^] @@ -337,7 +340,7 @@ SETUP_FROM_CMOS: LDIR ; CALL Bug31SecCheck - JR C,.step2 + JR NC,.step2 ; LD HL,PAUSES.HALT.BIG CALL BITS_WAITS.Clear_BUSY @@ -447,8 +450,9 @@ IDESPEC: IN A,(SLOT3) LD (IY+IDE.HDD_INIT_TABLE.MediaParameters),%0000'0001 LD B,100 ; счётчик попыток (1 попытка - 1 HALT) .get_error_loop: PUSH BC - LD HL,ATAPI_CMD_PACKET.TEST_UNIT_READY - CALL EXEC_PACKET_COMMAND.start + ;LD HL,ATAPI_CMD_PACKET.TEST_UNIT_READY + ;CALL EXEC_PACKET_COMMAND.start + CALL EXEC_TEST_CMD POP BC JR NC,.s_size ; @@ -458,7 +462,7 @@ IDESPEC: IN A,(SLOT3) ; HALT DJNZ .get_error_loop - ; + ; ; [ ] sector size ATAPI .s_size: LD DE,IDENTIFY_DEVICE_BUFFER.ReservedWord224 ; просто нужен был буфер CALL ATAPI_READ_CAPACITY_DATA @@ -541,11 +545,6 @@ BITS_WAITS: ; Pause for clear BUSY and DATA REQUEST .Clear_BUSY: LD BC,IDE.Read.Status IN A,(C) - ;!TEST for normal bus with pull-ups - ;CP #FF - ;SCF - ;RET Z - ; AND IDE.CtrlByte.Busy; + IDE.CtrlByte.DataRequest RET Z ; @@ -607,16 +606,17 @@ SKIPKEY: RET Z EXX LD HL,#3E00 ;!HARDCODE - AND A + XOR A SBC HL,DE EXX SCF CCF RET NZ - LD A,0 + ;A=0 LD (SKIP),A - SCF - RET + INC A + SCF + RET ;ZF=0, CF=1 /////////////////////////////////////////////////////////////////////[^] @@ -664,9 +664,43 @@ SaveToCMOS: JP WRITCMS /////////////////////////////////////////////////////////////////////[^] - /////////////////////////////////////////////////////////////////////[v] -RESET_Slave_ATAPI: +; Check bug with 31 sec freeze +; Bug31SecCheck: LD A,(MasterSlave) +; AND 1 +; RET NZ +; ; +; LD HL,PAUSES.HALT.Time_2s +; CALL BITS_WAITS.Clear_BUSY +; CCF +; RET C +; ; +; .RESET_Slave_ATAPI: +; LD A,IDE.Drive.Slave +; LD BC,IDE.Write.DeviceHead +; OUT (C),A +; PAUSE_DJNZ 16 +; LD BC,IDE.Write.Command +; LD A,IDE.CMD.ATAPI.Reset +; OUT (C),A +; PAUSE_DJNZ 16 +; LD A,IDE.Drive.Master +; LD BC,IDE.Write.DeviceHead +; OUT (C),A +; RET +/////////////////////////////////////////////////////////////////////[^] +/////////////////////////////////////////////////////////////////////[v] +; Check bug with 31 sec freeze +Bug31SecCheck: LD A,(MasterSlave) + AND 1 + RET Z + ; + LD HL,PAUSES.HALT.Time_2s + CALL BITS_WAITS.Clear_BUSY + RET NC + JR NZ,.skip + ; +.RESET_Slave_ATAPI: LD A,IDE.Drive.Slave LD BC,IDE.Write.DeviceHead OUT (C),A @@ -679,40 +713,26 @@ RESET_Slave_ATAPI: LD BC,IDE.Write.DeviceHead OUT (C),A RET + ; +.skip: POP BC ; баланс стека + JP AUTODETECTING.IDE_ABSENT /////////////////////////////////////////////////////////////////////[^] - /////////////////////////////////////////////////////////////////////[v] -; Check bug with 31 sec freeze -Bug31SecCheck: LD A,(MasterSlave) - AND 1 - RET NZ - ; - LD HL,PAUSES.HALT.Time_2s - CALL BITS_WAITS.Clear_BUSY - CCF +GETPARAM: LD HL,PAUSES.WAIT.IDE + LD DE,IDE.CtrlByte.DataRequest * 256 + IDE.CtrlByte.DataRequest + CALL BITS_WAITS.WAIT_PRT RET C + LD BC,IDE.Read.Data + LD HL,IDENTIFY_DEVICE_BUFFER + INIR + INIR + CALL IDESPEC + ; [x] save hdd parameters to cmos for "setup" in settings + CALL SaveToCMOS ; - JP RESET_Slave_ATAPI -/////////////////////////////////////////////////////////////////////[^] - - -/////////////////////////////////////////////////////////////////////[v] -GETPARAM: - LD HL,PAUSES.WAIT.IDE - LD DE,IDE.CtrlByte.DataRequest * 256 + IDE.CtrlByte.DataRequest - CALL BITS_WAITS.WAIT_PRT - RET C - LD BC,IDE.Read.Data - LD HL,IDENTIFY_DEVICE_BUFFER - INIR - INIR - CALL IDESPEC - ; [x] save hdd parameters to cmos for "setup" in settings - CALL SaveToCMOS - ; - AND A - RET + AND A + RET /////////////////////////////////////////////////////////////////////[^] @@ -747,13 +767,16 @@ DETECTORS: PAUSE_DJNZ 0 - LD HL,PAUSES.HALT.SMALL + ;LD HL,PAUSES.HALT.SMALL + LD HL,PAUSES.HALT.MEDIUM LD BC,IDE.Read.Status - ;DEC B ; .loop: IN A,(C) SCF RET Z + ; old CF bug fix + CP IDE.CtrlByte.Ready + IDE.CtrlByte.SeekComplete + RET Z ; AND IDE.CtrlByte.Busy + IDE.CtrlByte.DataRequest + IDE.CtrlByte.Error CP IDE.CtrlByte.Error @@ -763,20 +786,19 @@ DETECTORS: DEC HL LD A,H OR L - ;SCF - ;RET Z ; Absent - JR Z,.nop_exit + ;JR Z,.nop_exit + SCF + RET Z ; Absent ; CALL SKIPKEY RET C ; Skipped = Absent - ; JR .loop ; -.nop_exit: IN A,(C) - CP IDE.CtrlByte.Ready + IDE.CtrlByte.SeekComplete - RET Z ; old CF bug fix - SCF - RET ; Absent +; .nop_exit: IN A,(C) +; CP IDE.CtrlByte.Ready + IDE.CtrlByte.SeekComplete +; RET Z ; old CF bug fix +; SCF +; RET ; Absent ;-------; ;-------; @@ -808,10 +830,31 @@ DETECTORS: .non_ATA: LD BC,IDE.Read.Error IN A,(C) AND IDE.ErrorByte.Abort - RET NZ ; ATAPI + ; 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 + 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 ; - SCF ; Absent - RET ;-------; ;-------; @@ -858,20 +901,24 @@ DETECTORS: /////////////////////////////////////////////////////////////////////[v] -SetUP_CHANELS: + IFUSED Nop_CHANELS +Nop_CHANELS: LD A,1 CALL .CMD LD A,3 CALL .CMD - LD A,0 + XOR A ; LD A,0 CALL .CMD LD A,2 .CMD: CALL SELECT_IDE - PAUSE_DJNZ 32 + PAUSE_DJNZ 0 LD BC,IDE.Write.Command LD H,IDE.CMD.ATA.Nop OUT (C),H - PAUSE_DJNZ 32 + PAUSE_DJNZ 0 + LD BC,IDE.Read.Status + IN A,(C) + RET ; Disable INTRQ ; LD BC,IDE.Write.DeviceControl ; LD A,%0000'0010 @@ -880,7 +927,7 @@ SetUP_CHANELS: ; ; ; CALL DisableStandBy ; PAUSE_DJNZ 32 - RET + ENDIF /////////////////////////////////////////////////////////////////////[^] diff --git a/src/bios/rom/SETUP/MAIN.asm b/src/bios/rom/SETUP/MAIN.asm index f35a39e..314eac8 100644 --- a/src/bios/rom/SETUP/MAIN.asm +++ b/src/bios/rom/SETUP/MAIN.asm @@ -777,6 +777,7 @@ INFO_MESSAGE: CALL TSETUP ;!TODO может пихнуть её на прерывания? CALL CONFIGURE_IDE_DRIVES.START + ;CALL CONFIGURE_IDE_DRIVES.Nop_CHANELS CALL CTRLKEY LD A,B ; [x] 05/07/2024 diff --git a/src/bios/rom/SETUP/SETTINGS.asm b/src/bios/rom/SETUP/SETTINGS.asm index 45411b0..1e8e30f 100644 --- a/src/bios/rom/SETUP/SETTINGS.asm +++ b/src/bios/rom/SETUP/SETTINGS.asm @@ -617,15 +617,15 @@ GET_CMOS_VALUE: RET ; [x] чтоб не влезло куда не надо -READCMS: - LD D,high CMOSARE - LD E,A - CP CMOS.USED_MAX_ADDRESS+1 - JR NC,.error - LD A,(DE) - RET -.error: SCF - RET +READCMS: LD D,high CMOSARE + LD E,A + CP CMOS.USED_MAX_ADDRESS+1 + JR NC,.error + LD A,(DE) + RET + ; +.error: SCF + RET ; [x] чтоб не влезло куда не надо WRITCMS: @@ -688,25 +688,22 @@ READING: JR NZ,.loop RET -WRITING: - CALL CHEKSUM - LD B,H - LD A,CMOS.Cell.CheckSum - CALL WRITCMS - LD D,CMOS.USED_MIN_ADDRESS ; !HARDCODE CMOS -.loop: - LD H,high CMOSARE - LD L,D - LD A,(HL) - PUSH DE - CALL CMOS_WR - - POP DE - LD A,CMOS.USED_MAX_ADDRESS+1 - INC D - CP D - JR NZ,.loop - RET +WRITING: CALL CHEKSUM + LD B,H + LD A,CMOS.Cell.CheckSum + CALL WRITCMS + LD D,CMOS.USED_MIN_ADDRESS +.loop: LD H,high CMOSARE + LD L,D + LD A,(HL) + PUSH DE + CALL CMOS_WR + POP DE + LD A,CMOS.USED_MAX_ADDRESS+1 + INC D + CP D + JR NZ,.loop + RET SETDEFX: LD A,#FF diff --git a/src/bios/shared/RECOVERY.IMG b/src/bios/shared/RECOVERY.IMG index ac5171f..5be649a 100644 Binary files a/src/bios/shared/RECOVERY.IMG and b/src/bios/shared/RECOVERY.IMG differ