diff --git a/Shared_Includes b/Shared_Includes index 8371051..72b28f7 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 8371051031cac61e25740ba6cf9f2acacdc783b7 +Subproject commit 72b28f7d64cd4f263ed0e23acbe8f1eb254b1f7f diff --git a/src/bios/exp/FUNC_4x.ASM b/src/bios/exp/FUNC_4x.ASM index 6a01b9f..052f141 100644 --- a/src/bios/exp/FUNC_4x.ASM +++ b/src/bios/exp/FUNC_4x.ASM @@ -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 ; СЕКТОР - 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] ; Не должна портить регистр 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 diff --git a/src/bios/rom/SETUP/AUTOIDE.asm b/src/bios/rom/SETUP/AUTOIDE.asm index 1294eeb..10b58de 100644 --- a/src/bios/rom/SETUP/AUTOIDE.asm +++ b/src/bios/rom/SETUP/AUTOIDE.asm @@ -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 diff --git a/src/bios/shared/RECOVERY.IMG b/src/bios/shared/RECOVERY.IMG index 5be649a..eee9238 100644 Binary files a/src/bios/shared/RECOVERY.IMG and b/src/bios/shared/RECOVERY.IMG differ