From ed203cce4fefd96f17f2824a59f59abcefe5f68d Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Fri, 5 Jul 2024 03:38:58 +1000 Subject: [PATCH] ctrl for boot recovery --- src/bios/rom/SETUP/MAIN.asm | 154 ++++++++++++++++++-------------- src/bios/rom/SETUP/SETTINGS.asm | 5 +- src/bios/rom/SETUP/messages.z80 | 76 ++++++++-------- src/bios/shared/DEFINES.INC | 3 - src/bios/shared/RECOVERY.IMG | Bin 98304 -> 98304 bytes src/bios/shared/VERSION.inc | 4 + 6 files changed, 135 insertions(+), 107 deletions(-) diff --git a/src/bios/rom/SETUP/MAIN.asm b/src/bios/rom/SETUP/MAIN.asm index 4c8d145..3598fb3 100644 --- a/src/bios/rom/SETUP/MAIN.asm +++ b/src/bios/rom/SETUP/MAIN.asm @@ -651,13 +651,21 @@ CHEKOK: ;CALL ScreenPOS.GET_CUR JR INFO_MESSAGE CMOS_ABSENT: CALL POSTMSG -INFO_MESSAGE: ;!FIXIT название неправильное +INFO_MESSAGE: + ; For alternative boot + LD DE,#0428 + CALL LP_SET_PLACE + LD A,msgStrings.forCtrlBootButton + LD E,COLORS.CGA.INC.WHITE + CALL POSTMSC + ; for recovery boot LD DE,#0528 CALL LP_SET_PLACE LD A,msgStrings.forAltBootButton LD E,COLORS.CGA.INC.WHITE CALL POSTMSC + POP DE CALL LP_SET_PLACE @@ -666,12 +674,18 @@ INFO_MESSAGE: ;!FIXIT CALL CONFIGURE_IDE_DRIVES.START CALL CTRLKEY LD A,B - AND #10 - JR NZ,ABOOT - + ; [ ] 05/07/2024 + BIT X_CTRL,A + LD BC,#FFFF ; маркер для PrepareToBOOT, чтоб грузил Recovery + JR NZ,RECOVERY_BOOT + ; + BIT X_ALT,A + JR NZ,ALT_BOOT + ; CALL TSETUP - + ; LD BC,CMOS_CELL.BootDrives.Mask.SysDisk ;#0710 +RECOVERY_BOOT: CALL PrepareToBOOT LD A,msgStrings.bootFail LD E,COLORS.CGA.INC.LRED @@ -679,7 +693,8 @@ INFO_MESSAGE: ;!FIXIT CALL ScreenPOS.CRLF ; CALL INT_ON -ABOOT: LD A,msgStrings.bootAltDrv +ALT_BOOT: + LD A,msgStrings.bootAltDrv LD E,COLORS.CGA.INC.LGREEN CALL POSTMSC @@ -703,31 +718,32 @@ ABOOT: LD A,msgStrings.bootAltDrv ;EI CALL INT_ON -AGAKEY: CALL WAITKEY - LD HL,#4F00 ; DEL - go to settings - ;AND A - SBC HL,DE - JR Z,ENTER_SETUP - CP #1B ; ESC - go to zx spectrum mode - JP Z,EXIT_SETUP - CP #0D ; ENTER - restart - JP NZ,AGAKEY - XOR A - JP Start_again +AGAKEY: CALL WAITKEY + LD HL,#4F00 ; DEL - go to settings + ;AND A + SBC HL,DE + JR Z,ENTER_SETUP + ; + CP #1B ; ESC - go to zx spectrum mode + JP Z,EXIT_SETUP + CP #0D ; ENTER - restart + JP NZ,AGAKEY + XOR A + JP Start_again -TSETUP: - CALL SCANKEY - RET Z - LD HL,#4F00 ; DEL - go to settings - AND A - SBC HL,DE - JR Z,ENTER_SETUP - LD HL,#011B - AND A - SBC HL,DE - JR NZ,TSETUP - POP HL ; убираем лишнее - JP EXIT_SETUP +TSETUP: CALL SCANKEY + RET Z + LD HL,#4F00 ; DEL - go to settings + AND A + SBC HL,DE + JR Z,ENTER_SETUP + ; + LD HL,#011B ; ESC + AND A + SBC HL,DE + JR NZ,TSETUP + POP HL ; убираем лишнее + JP EXIT_SETUP ENTER_SETUP: XOR A LD (ITEM_Restore),A @@ -890,43 +906,49 @@ RECOVERYstart: ;[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ] ; -PrepareToBOOT: - ;CALL INT_ON - HALT - CALL PORTS_INIT.clean_kbd_buf ;Clearing the keyboard buffer - CALL PORTS_INIT.clean_mouse_buf ;Clearing the mouse buffer - CALL INT_OFF +PrepareToBOOT: ;CALL INT_ON + HALT + CALL PORTS_INIT.clean_kbd_buf ;Clearing the keyboard buffer + CALL PORTS_INIT.clean_mouse_buf ;Clearing the mouse buffer + CALL INT_OFF ; тут не должно быть испорчено значение BC - CALL G_VALUE - LD B,0 - ; FDD - OR A - JR Z,FDSTART ; FDD A: - INC B - DEC A - JR Z,FDSTART ; FDD B: - ; IDE - LD B,#80 - DEC A - JR Z,HDSTART - INC B ;LD B,#81 - DEC A - JR Z,HDSTART - INC B ;LD B,#82 - DEC A - JR Z,HDSTART - INC B ;LD B,#83 - DEC A - JR Z,HDSTART - ; RAM - DEC A - JR Z,RDSTART - ; ROM - DEC A - JP Z,RECOVERYstart - ; Error - SCF - RET + ; [ ] 05/07/2024 + INC BC + LD A,B + OR C + JP Z,RECOVERYstart + DEC BC + ; + CALL G_VALUE + LD B,0 + ; FDD + OR A + JR Z,FDSTART ; FDD A: + INC B + DEC A + JR Z,FDSTART ; FDD B: + ; IDE + LD B,#80 + DEC A + JR Z,HDSTART + INC B ;LD B,#81 + DEC A + JR Z,HDSTART + INC B ;LD B,#82 + DEC A + JR Z,HDSTART + INC B ;LD B,#83 + DEC A + JR Z,HDSTART + ; RAM + DEC A + JR Z,RDSTART + ; ROM + DEC A + JP Z,RECOVERYstart + ; Error + SCF + RET FDSTART: PUSH BC diff --git a/src/bios/rom/SETUP/SETTINGS.asm b/src/bios/rom/SETUP/SETTINGS.asm index b7f90f7..c6fc779 100644 --- a/src/bios/rom/SETUP/SETTINGS.asm +++ b/src/bios/rom/SETUP/SETTINGS.asm @@ -868,6 +868,8 @@ setInt: ld a,CMOS_CELL.ScreenSET jp SETTINGS ENDMODULE ; +;-----------------------------------------------------------------------; +;!FIXIT прибраться тут MEMTEST EQU #80 SAVERAM EQU #40 EXTBIOS EQU #20 @@ -928,6 +930,7 @@ TRD48 EQU #04 BAS48 EQU #05 REBOOTM EQU #02 HDDWP EQU #01 +;-----------------------------------------------------------------------; STYLES: ; Color Style 0 @@ -1013,7 +1016,7 @@ STYLES: DEFVAL: DB SAVERAM+EXTBIOS+SDELAY1 ;X0E - OPTIONS DB TDL250+TRATE30 ;X0F - KEYBOARD - DB SDIDE1+ASDRECOVERY ;X10 - SYSTEM DISKS + DB SDIDE1+SDFDD1 ;X10 - SYSTEM DISKS DB FD1720+FD2720+HD1AUTO+HD2AUTO ;X11 - FDD & Primary HDD's DB 0 ;X12 - CYLINDERS LOW MASTER DB 0 ;X13 - CYLINDERS HIGH MASTER diff --git a/src/bios/rom/SETUP/messages.z80 b/src/bios/rom/SETUP/messages.z80 index 4accc0a..666e0eb 100644 --- a/src/bios/rom/SETUP/messages.z80 +++ b/src/bios/rom/SETUP/messages.z80 @@ -140,27 +140,27 @@ folderLine EQU 1 ENDIF ; -firstColumn EQU 03 ; смещение по X для первого столбца -secondColumn EQU 43 ; смещение по X для второго столбца -firstLine EQU 07 ; смещение по Y для первой строки +firstColumn EQU 03 ; смещение по X для первого столбца +secondColumn EQU 43 ; смещение по X для второго столбца +firstLine EQU 07 ; смещение по Y для первой строки SettingsItemsTabs: _mSETitemParams Lang - DW OnChangeAction.setLang ; действие при изменении - IF NEW_FEATURE : DB paramLine : ENDIF ; тип параметра (строка со значением или каталог) - DB columnNum,lineNum ; столбец, строка - DB paramName ; Название параметра - DB #0E,%0000'0100,%0000'0100 ; CMOS, MASK - DB msgStrings.valLangEng ; 1-й вариант параметра - DB msgStrings.valLangRus ; 2-й вариант параметра + DW OnChangeAction.setLang ; действие при изменении + IF NEW_FEATURE : DB paramLine : ENDIF ; тип параметра (строка со значением или каталог) + DB columnNum,lineNum ; столбец, строка + DB paramName ; Название параметра + DB CMOS_CELL.BootUpParams,%0000'0100,%0000'0100 ; CMOS, MASK + DB msgStrings.valLangEng ; 1-й вариант параметра + DB msgStrings.valLangRus ; 2-й вариант параметра _mSETitemParams MemTest DW OnChangeAction.nothing IF NEW_FEATURE : DB paramLine : ENDIF DB columnNum,lineNum DB paramName - DB #0E,%1000'0000,%1000'0000 + DB CMOS_CELL.BootUpParams,%1000'0000,%1000'0000 DB msgStrings.valDisabled DB msgStrings.valEnabled @@ -169,7 +169,7 @@ SettingsItemsTabs: IF NEW_FEATURE : DB paramLine : ENDIF DB columnNum,lineNum DB paramName - DB #0E,%0100'0000,%0100'0000 + DB CMOS_CELL.BootUpParams,%0100'0000,%0100'0000 DB msgStrings.valDisabled DB msgStrings.valEnabled @@ -178,7 +178,7 @@ SettingsItemsTabs: IF NEW_FEATURE : DB paramLine : ENDIF DB columnNum,lineNum DB paramName - DB #0E,%0010'0000,%0010'0000 + DB CMOS_CELL.BootUpParams,%0010'0000,%0010'0000 DB msgStrings.valDisabled DB msgStrings.valEnabled @@ -187,7 +187,7 @@ SettingsItemsTabs: IF NEW_FEATURE : DB paramLine : ENDIF DB columnNum,lineNum DB paramName - DB #0E,%0001'1000,%0001'0000 + DB CMOS_CELL.BootUpParams,%0001'1000,%0001'0000 DB msgStrings.valDisabled DB msgStrings.valNormal DB msgStrings.valEnabled @@ -197,7 +197,7 @@ SettingsItemsTabs: IF NEW_FEATURE : DB paramLine : ENDIF DB columnNum,lineNum DB paramName - DB #0F,%0000'0111,%0000'0111 + DB CMOS_CELL.Typematic,%0000'0111,%0000'0111 DB msgStrings.val_6 DB msgStrings.val_8 DB msgStrings.val_10 @@ -212,7 +212,7 @@ SettingsItemsTabs: IF NEW_FEATURE : DB paramLine : ENDIF DB columnNum,lineNum DB paramName - DB #0F,%0110'0000,%0110'0000 + DB CMOS_CELL.Typematic,%0110'0000,%0110'0000 DB msgStrings.val_250 DB msgStrings.val_500 DB msgStrings.val_750 @@ -223,7 +223,7 @@ SettingsItemsTabs: IF NEW_FEATURE : DB paramLine : ENDIF DB columnNum,lineNum DB paramName - DB #1D,%0000'0010,%0000'0010 + DB CMOS_CELL.Options,%0000'0010,%0000'0010 DB msgStrings.valDisabled DB msgStrings.valEnabled @@ -232,7 +232,7 @@ SettingsItemsTabs: IF NEW_FEATURE : DB paramLine : ENDIF DB columnNum,lineNum DB paramName - DB #10,%0000'0111,%0000'0111 ; !!!!! + DB CMOS_CELL.BootDrives,%0000'0111,%0000'0111 ; !!!!! DB msgStrings.val1stFDD DB msgStrings.val2ndFDD DB msgStrings.val1stIDE @@ -247,7 +247,7 @@ SettingsItemsTabs: IF NEW_FEATURE : DB paramLine : ENDIF DB columnNum,lineNum DB paramName - DB #10,%0111'0000,%0111'0000 + DB CMOS_CELL.BootDrives,%0111'0000,%0111'0000 DB msgStrings.val1stFDD DB msgStrings.val2ndFDD DB msgStrings.val1stIDE @@ -262,7 +262,7 @@ SettingsItemsTabs: IF NEW_FEATURE : DB paramLine : ENDIF DB columnNum,lineNum DB paramName - DB #11,%0000'0011,%0000'0000 + DB CMOS_CELL.DrivesSetup_1,%0000'0011,%0000'0000 DB msgStrings.valAuto ; DB msgStrings.val720 ; DB msgStrings.val1440 @@ -273,7 +273,7 @@ SettingsItemsTabs: IF NEW_FEATURE : DB paramLine : ENDIF DB columnNum,lineNum DB paramName - DB #11,%0000'1100,%0000'0000 + DB CMOS_CELL.DrivesSetup_1,%0000'1100,%0000'0000 DB msgStrings.valAuto ; DB msgStrings.val720 ; DB msgStrings.val1440 @@ -284,7 +284,7 @@ SettingsItemsTabs: IF NEW_FEATURE : DB paramLine : ENDIF DB columnNum,lineNum DB paramName - DB #11,%0011'0000,%0011'0000 + DB CMOS_CELL.DrivesSetup_1,%0011'0000,%0011'0000 DB msgStrings.valAuto DB msgStrings.valSetup DB msgStrings.valCdRom @@ -295,7 +295,7 @@ SettingsItemsTabs: IF NEW_FEATURE : DB paramLine : ENDIF DB columnNum,lineNum DB paramName - DB #11,%1100'0000,%1100'0000 + DB CMOS_CELL.DrivesSetup_1,%1100'0000,%1100'0000 DB msgStrings.valAuto DB msgStrings.valSetup DB msgStrings.valCdRom @@ -306,7 +306,7 @@ SettingsItemsTabs: IF NEW_FEATURE : DB paramLine : ENDIF DB columnNum,lineNum DB paramName - DB #20,%0011'0000,%0011'0000 + DB CMOS_CELL.DrivesSetup_2,%0011'0000,%0011'0000 DB msgStrings.valAuto DB msgStrings.valSetup DB msgStrings.valCdRom @@ -317,7 +317,7 @@ SettingsItemsTabs: IF NEW_FEATURE : DB paramLine : ENDIF DB columnNum,lineNum DB paramName - DB #20,%1100'0000,%1100'0000 + DB CMOS_CELL.DrivesSetup_2,%1100'0000,%1100'0000 DB msgStrings.valAuto DB msgStrings.valSetup DB msgStrings.valCdRom @@ -329,7 +329,7 @@ SettingsItemsTabs: IF NEW_FEATURE : DB paramLine : ENDIF DB columnNum,lineNum DB paramName - DB #1D,%0000'0001,%0000'0001 + DB CMOS_CELL.Options,%0000'0001,%0000'0001 DB msgStrings.valDisabled DB msgStrings.valEnabled ENDIF @@ -339,7 +339,7 @@ SettingsItemsTabs: IF NEW_FEATURE : DB paramLine : ENDIF DB columnNum,lineNum DB paramName - DB #1F,%1111'0000,%1110'0000 + DB CMOS_CELL.ScreenPosition,%1111'0000,%1110'0000 DB msgStrings.valMinus7 DB msgStrings.valMinus6 DB msgStrings.valMinus5 @@ -361,7 +361,7 @@ SettingsItemsTabs: IF NEW_FEATURE : DB paramLine : ENDIF DB columnNum,lineNum DB paramName - DB #1F,%0000'1111,%0000'1110 + DB CMOS_CELL.ScreenPosition,%0000'1111,%0000'1110 DB msgStrings.valPlus7 DB msgStrings.valPlus6 DB msgStrings.valPlus5 @@ -383,7 +383,7 @@ SettingsItemsTabs: IF NEW_FEATURE : DB paramLine : ENDIF DB columnNum,lineNum DB paramName - DB #1A,%0011'0000,%0011'0000 + DB CMOS_CELL.ScreenSET,%0011'0000,%0011'0000 DB msgStrings.valDash8 DB msgStrings.valScorpion DB msgStrings.valPentagon @@ -394,7 +394,7 @@ SettingsItemsTabs: IF NEW_FEATURE : DB paramLine : ENDIF DB columnNum,lineNum DB paramName - DB #1A,%1100'0000,%1000'0000 + DB CMOS_CELL.ScreenSET,%1100'0000,%1000'0000 DB msgStrings.valDash8 DB msgStrings.val312_50 DB msgStrings.val320_49 @@ -404,7 +404,7 @@ SettingsItemsTabs: IF NEW_FEATURE : DB paramLine : ENDIF DB columnNum,lineNum DB paramName - DB #0E,%0000'0001,%0000'0001 + DB CMOS_CELL.BootUpParams,%0000'0001,%0000'0001 DB msgStrings.valDisabled DB msgStrings.valEnabled @@ -413,7 +413,7 @@ SettingsItemsTabs: IF NEW_FEATURE : DB paramLine : ENDIF DB columnNum,lineNum DB paramName - DB #1E,%0000'0011,%0000'0010 + DB CMOS_CELL.TRDOSmount,%0000'0011,%0000'0010 DB msgStrings.valDefault DB msgStrings.valFDD DB msgStrings.valHDD @@ -423,7 +423,7 @@ SettingsItemsTabs: IF NEW_FEATURE : DB paramLine : ENDIF DB columnNum,lineNum DB paramName - DB #1E,%0000'1100,%0000'1000 + DB CMOS_CELL.TRDOSmount,%0000'1100,%0000'1000 DB msgStrings.valDefault DB msgStrings.valFDD DB msgStrings.valHDD @@ -433,7 +433,7 @@ SettingsItemsTabs: IF NEW_FEATURE : DB paramLine : ENDIF DB columnNum,lineNum DB paramName - DB #1E,%0011'0000,%0010'0000 + DB CMOS_CELL.TRDOSmount,%0011'0000,%0010'0000 DB msgStrings.valDefault DB msgStrings.valFDD DB msgStrings.valHDD @@ -443,7 +443,7 @@ SettingsItemsTabs: IF NEW_FEATURE : DB paramLine : ENDIF DB columnNum,lineNum DB paramName - DB #1E,%1100'0000,%1000'0000 + DB CMOS_CELL.TRDOSmount,%1100'0000,%1000'0000 DB msgStrings.valDefault DB msgStrings.valFDD DB msgStrings.valHDD @@ -514,7 +514,8 @@ msgStrings: _mSetStr setupHelpStr3, tmp_Counter : DZ 'F5 : Old Values PU/PD/+/- : Modify' _mSetStr setupHelpStr4, tmp_Counter : DZ 'F7 : Default Values F3 : Color ' _mSetStr toSetupButton, tmp_Counter : DZ ' to enter SETUP' - _mSetStr forAltBootButton, tmp_Counter : DZ ' for Alternative boot' + _mSetStr forCtrlBootButton, tmp_Counter : DZ ' for Recovery boot' + _mSetStr forAltBootButton, tmp_Counter : DZ ' for Alternative boot' _mSetStr cmosChecksumErr, tmp_Counter : DZ 'WARNING! CMOS CHECKSUM ERROR, DEFAULT VALUES SET!' _mSetStr cmosDateTimeErr, tmp_Counter : DZ 'WARNING! CMOS DATE/TIME ERROR, DEFAULT VALUES SET!' _mSetStr detectIdePrMA, tmp_Counter : DZ ' Detecting IDE Primary Master ... [Press F4 to skip]' @@ -665,7 +666,8 @@ msgRusStrings: _mSetStrRus setupHelpStr3, tmp_Counter : DZ 'F5 : Старые значения PU/PD/+/- : Изменение' _mSetStrRus setupHelpStr4, tmp_Counter : DZ 'F7 : Значения по умолчанию F3 : Цвета ' _mSetStrRus toSetupButton, tmp_Counter : DZ ' для входа в SETUP' - _mSetStrRus forAltBootButton, tmp_Counter : DZ ' для Альтернативной загрузки' + _mSetStrRus forCtrlBootButton, tmp_Counter : DZ ' для загрузки Recovery' + _mSetStrRus forAltBootButton, tmp_Counter : DZ ' для Альтернативной загрузки' _mSetStrRus cmosChecksumErr, tmp_Counter : DZ 'ВНИМАНИЕ! ОШИБКА КОНТРОЛЬНОЙ СУММЫ CMOS, УСТАНОВЛЕНЫ ЗНАЧЕНИЯ ПО УМОЛЧАНИЮ' _mSetStrRus cmosDateTimeErr, tmp_Counter : DZ 'ВНИМАНИЕ! ОШИБКА ДАТЫ/ВРЕМЕНИ CMOS, УСТАНОВЛЕНЫ ЗНАЧЕНИЯ ПО УМОЛЧАНИЮ' _mSetStrRus detectIdePrMA, tmp_Counter : DZ ' Определяем Первичный IDE Master ... [F4 для пропуска] ' diff --git a/src/bios/shared/DEFINES.INC b/src/bios/shared/DEFINES.INC index 6c248da..150ba86 100644 --- a/src/bios/shared/DEFINES.INC +++ b/src/bios/shared/DEFINES.INC @@ -1,9 +1,6 @@ ; ;---------[All shared defines]---------- DEFINE BETA_BUILD 1 ; добавляет строку и сообщение о тестовой сборке на стартовом экране - IF BETA_BUILD - DEFINE BETA_str_ver 'BETA 3' - ENDIF DEFINE PACKED_MAIN 0 ; паковать MAIN или влезает без этого? DEFINE SP2000_Loader_Flag #0107 DEFINE IDE_Optimization 1 ; слегка оптимизирует некоторые процедуры работы с HDD diff --git a/src/bios/shared/RECOVERY.IMG b/src/bios/shared/RECOVERY.IMG index bcb37708e64d36ba85acfd1c5e198f793c705804..9e7f4fe1d246947d6f4cd2ef3750e7dd7bba5090 100755 GIT binary patch delta 20065 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 H5ct0U$6_i1 delta 21486 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 B{_p?* diff --git a/src/bios/shared/VERSION.inc b/src/bios/shared/VERSION.inc index c418309..b0bbaa9 100644 --- a/src/bios/shared/VERSION.inc +++ b/src/bios/shared/VERSION.inc @@ -6,6 +6,10 @@ EXP_ID: BIOS_ver_hex EQU EXP_ID.VER*256+EXP_ID.MOD DEFINE BIOS_ver_string '0'+EXP_ID.VER, '.', '0'+EXP_ID.MOD/10, '0'+EXP_ID.MOD-(EXP_ID.MOD/10)*10 + + IF BETA_BUILD + DEFINE BETA_str_ver 'BETA 4' + ENDIF ;---------------------------------------