From 6d8447dc66e85f2aaee18adf021c4d717dc0008a Mon Sep 17 00:00:00 2001 From: Jayeson Lee-Steere Date: Sat, 2 Oct 2021 18:00:37 +0800 Subject: [PATCH 01/13] Added SST39SFxxx device option to EEPROM type menu. Disable SPD and page size options when that selection is active. Currently still runs the EEPROM flashing code which is not correct for the Flash parts. --- .../Inc/Variables.inc | 1 + .../Src/EEPROM.asm | 3 ++ .../Src/Flash.asm | 3 ++ .../Src/Menupages/FlashMenu.asm | 45 +++++++++++++++++-- .../Src/Strings.asm | 4 +- 5 files changed, 51 insertions(+), 5 deletions(-) diff --git a/XTIDE_Universal_BIOS_Configurator_v2/Inc/Variables.inc b/XTIDE_Universal_BIOS_Configurator_v2/Inc/Variables.inc index 9bc0bdc..3c862ad 100644 --- a/XTIDE_Universal_BIOS_Configurator_v2/Inc/Variables.inc +++ b/XTIDE_Universal_BIOS_Configurator_v2/Inc/Variables.inc @@ -56,6 +56,7 @@ struc EEPROM_TYPE .2864_8kiB_MOD resb 2 ; Reversed A0 and A3 address lines .28256_32kiB resb 2 .28512_64kiB resb 2 + .SST_39SF resb 2 endstruc ; Software Data Protection commands diff --git a/XTIDE_Universal_BIOS_Configurator_v2/Src/EEPROM.asm b/XTIDE_Universal_BIOS_Configurator_v2/Src/EEPROM.asm index 0a9e039..b098fcd 100644 --- a/XTIDE_Universal_BIOS_Configurator_v2/Src/EEPROM.asm +++ b/XTIDE_Universal_BIOS_Configurator_v2/Src/EEPROM.asm @@ -27,6 +27,9 @@ g_rgwEepromTypeToSizeInWords: dw (8<<10) / 2 ; EEPROM_TYPE.2864_8kiB_MOD dw (32<<10) / 2 dw (64<<10) / 2 + dw (32<<10) / 2 ; EEPROM_TYPE.SST_39SF + ; Actual size of flash will be larger than 32K, + ; however most (all?) XUB devices map a 32K window. g_rgwEepromPageToSizeInBytes: dw 1 ; EEPROM_PAGE.1_byte diff --git a/XTIDE_Universal_BIOS_Configurator_v2/Src/Flash.asm b/XTIDE_Universal_BIOS_Configurator_v2/Src/Flash.asm index 4afffa1..75880c2 100644 --- a/XTIDE_Universal_BIOS_Configurator_v2/Src/Flash.asm +++ b/XTIDE_Universal_BIOS_Configurator_v2/Src/Flash.asm @@ -122,18 +122,21 @@ ALIGN WORD_ALIGN dw DoNotWriteAnySdpCommand ; EEPROM_TYPE.2864_8kiB_MOD dw DoNotWriteAnySdpCommand ; EEPROM_TYPE.28256_32kiB dw DoNotWriteAnySdpCommand ; EEPROM_TYPE.28512_64kiB + dw DoNotWriteAnySdpCommand ; EEPROM_TYPE.SST_39SF .rgfnEnableSdpAndFlash: ; SDP_COMMAND.enable dw WriteSdpEnableCommandFor2816 ; EEPROM_TYPE.2816_2kiB dw WriteSdpEnableCommandFor2864 ; EEPROM_TYPE.2864_8kiB dw WriteSdpEnableCommandFor2864mod ; EEPROM_TYPE.2864_8kiB_MOD dw WriteSdpEnableCommandFor28256or28512 ; EEPROM_TYPE.28256_32kiB dw WriteSdpEnableCommandFor28256or28512 ; EEPROM_TYPE.28512_64kiB + dw DoNotWriteAnySdpCommand ; EEPROM_TYPE.SST_39SF .rgfnDisableSdpAndFlash: ; SDP_COMMAND.disable dw WriteSdpDisableCommandFor2816 ; EEPROM_TYPE.2816_2kiB dw WriteSdpDisableCommandFor2864 ; EEPROM_TYPE.2864_8kiB dw WriteSdpDisableCommandFor2864mod ; EEPROM_TYPE.2864_8kiB_MOD dw WriteSdpDisableCommandFor28256or28512 ; EEPROM_TYPE.28256_32kiB dw WriteSdpDisableCommandFor28256or28512 ; EEPROM_TYPE.28512_64kiB + dw DoNotWriteAnySdpCommand ; EEPROM_TYPE.SST_39SF ;-------------------------------------------------------------------- diff --git a/XTIDE_Universal_BIOS_Configurator_v2/Src/Menupages/FlashMenu.asm b/XTIDE_Universal_BIOS_Configurator_v2/Src/Menupages/FlashMenu.asm index eb145cd..72dc901 100644 --- a/XTIDE_Universal_BIOS_Configurator_v2/Src/Menupages/FlashMenu.asm +++ b/XTIDE_Universal_BIOS_Configurator_v2/Src/Menupages/FlashMenu.asm @@ -55,7 +55,7 @@ istruc MENUITEM at MENUITEM.szName, dw g_szItemFlashEepromType at MENUITEM.szQuickInfo, dw g_szNfoFlashEepromType at MENUITEM.szHelp, dw g_szNfoFlashEepromType - at MENUITEM.bFlags, db FLG_MENUITEM_PROGRAMVAR | FLG_MENUITEM_BYTEVALUE | FLG_MENUITEM_VISIBLE + at MENUITEM.bFlags, db FLG_MENUITEM_MODIFY_MENU | FLG_MENUITEM_PROGRAMVAR | FLG_MENUITEM_BYTEVALUE | FLG_MENUITEM_VISIBLE at MENUITEM.bType, db TYPE_MENUITEM_MULTICHOICE at MENUITEM.itemValue + ITEM_VALUE.wRomvarsValueOffset, dw CFGVARS.bEepromType at MENUITEM.itemValue + ITEM_VALUE.szDialogTitle, dw g_szDlgFlashEepromType @@ -71,7 +71,7 @@ istruc MENUITEM at MENUITEM.szName, dw g_szItemFlashSDP at MENUITEM.szQuickInfo, dw g_szNfoFlashSDP at MENUITEM.szHelp, dw g_szHelpFlashSDP - at MENUITEM.bFlags, db FLG_MENUITEM_PROGRAMVAR | FLG_MENUITEM_BYTEVALUE | FLG_MENUITEM_VISIBLE + at MENUITEM.bFlags, db FLG_MENUITEM_PROGRAMVAR | FLG_MENUITEM_BYTEVALUE at MENUITEM.bType, db TYPE_MENUITEM_MULTICHOICE at MENUITEM.itemValue + ITEM_VALUE.wRomvarsValueOffset, dw CFGVARS.bSdpCommand at MENUITEM.itemValue + ITEM_VALUE.szDialogTitle, dw g_szDlgFlashSDP @@ -87,7 +87,7 @@ istruc MENUITEM at MENUITEM.szName, dw g_szItemFlashPageSize at MENUITEM.szQuickInfo, dw g_szNfoFlashPageSize at MENUITEM.szHelp, dw g_szHelpFlashPageSize - at MENUITEM.bFlags, db FLG_MENUITEM_PROGRAMVAR | FLG_MENUITEM_BYTEVALUE | FLG_MENUITEM_VISIBLE + at MENUITEM.bFlags, db FLG_MENUITEM_PROGRAMVAR | FLG_MENUITEM_BYTEVALUE at MENUITEM.bType, db TYPE_MENUITEM_MULTICHOICE at MENUITEM.itemValue + ITEM_VALUE.wRomvarsValueOffset, dw CFGVARS.bEepromPage at MENUITEM.itemValue + ITEM_VALUE.szDialogTitle, dw g_szDlgFlashPageSize @@ -133,12 +133,15 @@ g_rgwChoiceToValueLookupForEepromType: dw EEPROM_TYPE.2864_8kiB_MOD dw EEPROM_TYPE.28256_32kiB dw EEPROM_TYPE.28512_64kiB + dw EEPROM_TYPE.SST_39SF + g_rgszValueToStringLookupForEepromType: dw g_szValueFlash2816 dw g_szValueFlash2864 dw g_szValueFlash2864Mod dw g_szValueFlash28256 dw g_szValueFlash28512 + dw g_szValueFlashSST39SF g_rgwChoiceToValueLookupForSdpCommand: dw SDP_COMMAND.none @@ -200,8 +203,42 @@ FlashMenu_EnterMenuOrModifyItemVisibility: .AlreadySet: mov si, g_MenupageForFlashMenu - jmp Menupage_ChangeToNewMenupageInDSSI + ePUSH_T bx, Menupage_ChangeToNewMenupageInDSSI + cmp WORD [g_cfgVars+CFGVARS.bEepromType], EEPROM_TYPE.SST_39SF + jz SHORT .DisableMenuitemsUnusedBySstFlash + ; Fall to .EnableMenuitemsUnusedBySstFlash + +;-------------------------------------------------------------------- +; .EnableMenuitemsUnusedBySstFlash +; Parameters: +; SS:BP: Menu handle +; Returns: +; Nothing +; Corrupts registers: +; AX, BX +;-------------------------------------------------------------------- +ALIGN JUMP_ALIGN +.EnableMenuitemsUnusedBySstFlash: + mov bx, g_MenuitemFlashSdpCommand + call EnableMenuitemFromCSBX + mov bx, g_MenuitemFlashPageSize + jmp EnableMenuitemFromCSBX +;-------------------------------------------------------------------- +; .DisableMenuitemsUnusedBySstFlash +; Parameters: +; SS:BP: Menu handle +; Returns: +; Nothing +; Corrupts registers: +; AX, BX +;-------------------------------------------------------------------- +ALIGN JUMP_ALIGN +.DisableMenuitemsUnusedBySstFlash: + mov bx, g_MenuitemFlashSdpCommand + call DisableMenuitemFromCSBX + mov bx, g_MenuitemFlashPageSize + jmp DisableMenuitemFromCSBX ;-------------------------------------------------------------------- ; MENUITEM activation functions (.fnActivate) diff --git a/XTIDE_Universal_BIOS_Configurator_v2/Src/Strings.asm b/XTIDE_Universal_BIOS_Configurator_v2/Src/Strings.asm index e2c2543..8ef857e 100644 --- a/XTIDE_Universal_BIOS_Configurator_v2/Src/Strings.asm +++ b/XTIDE_Universal_BIOS_Configurator_v2/Src/Strings.asm @@ -555,12 +555,14 @@ g_szMultichoiceEepromType: db "2816 (2 kiB)",LF db "2864 (8 kiB)",LF db "2864 mod (8 kiB)",LF db "28256 (32 kiB)",LF - db "28512 (64 kiB)",NULL + db "28512 (64 kiB)",LF + db "SST39SFxxx flash",NULL g_szValueFlash2816: db "2816",NULL g_szValueFlash2864: db "2864",NULL g_szValueFlash2864Mod: db "2864mod",NULL g_szValueFlash28256: db "28256",NULL g_szValueFlash28512: db "28512",NULL +g_szValueFlashSST39SF: db "SST39SFx",NULL g_szMultichoiceSdpCommand: db "None",LF db "Enable",LF From cdda53462b5017606444921abb2c68cdf8b1504d Mon Sep 17 00:00:00 2001 From: Jayeson Lee-Steere Date: Sat, 2 Oct 2021 18:29:01 +0800 Subject: [PATCH 02/13] Check SST39SF flash device address is 32K aligned. Flashing very unlikley to be successful otherwise. --- .../Src/Menupages/FlashMenu.asm | 25 +++++++++++++++++++ .../Src/Strings.asm | 20 ++++++++------- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/XTIDE_Universal_BIOS_Configurator_v2/Src/Menupages/FlashMenu.asm b/XTIDE_Universal_BIOS_Configurator_v2/Src/Menupages/FlashMenu.asm index 72dc901..057fac0 100644 --- a/XTIDE_Universal_BIOS_Configurator_v2/Src/Menupages/FlashMenu.asm +++ b/XTIDE_Universal_BIOS_Configurator_v2/Src/Menupages/FlashMenu.asm @@ -253,6 +253,11 @@ ALIGN JUMP_ALIGN StartFlashing: call .MakeSureThatImageFitsInEeprom jc SHORT .InvalidFlashingParameters + cmp WORD [cs:g_cfgVars+CFGVARS.bEepromType], EEPROM_TYPE.SST_39SF + jnz SHORT .SkipAlignmentCheck + call .MakeSureAddress32KAligned + jc SHORT .InvalidFlashingParameters +.SkipAlignmentCheck: push es push ds @@ -290,9 +295,29 @@ ALIGN JUMP_ALIGN stc ALIGN JUMP_ALIGN, ret .ImageFitsInSelectedEeprom: +.AlignmentIs32K: .DoNotGenerateChecksumByte: ret +;-------------------------------------------------------------------- +; .MakeSureAddress32KAligned +; Parameters: +; SS:BP: Ptr to MENU +; Returns: +; CF: Set if EEPROM segment is not 32K aligned +; Corrupts registers: +; AX, BX, DX +;-------------------------------------------------------------------- +ALIGN JUMP_ALIGN +.MakeSureAddress32KAligned: + mov ax, [cs:g_cfgVars+CFGVARS.wEepromSegment] + and ax, 007FFh + jz SHORT .AlignmentIs32K + mov dx, g_szErrAddrNot32KAligned + call Dialogs_DisplayErrorFromCSDX + stc + ret + ;-------------------------------------------------------------------- ; .PrepareBuffersForFlashing ; Parameters: diff --git a/XTIDE_Universal_BIOS_Configurator_v2/Src/Strings.asm b/XTIDE_Universal_BIOS_Configurator_v2/Src/Strings.asm index 8ef857e..ce5700c 100644 --- a/XTIDE_Universal_BIOS_Configurator_v2/Src/Strings.asm +++ b/XTIDE_Universal_BIOS_Configurator_v2/Src/Strings.asm @@ -52,15 +52,17 @@ g_szErrorDialog: db "Error!",NULL g_szGenericDialogInfo: db "Press ENTER or ESC to close dialog.",NULL ; Flashing related strings -g_szFlashTitle: db "Flashing EEPROM, please wait.",NULL -g_szErrEepromTooSmall: db "Image is too large for selected EEPROM type!",NULL -g_szErrEepromPolling: db "Timeout when polling EEPROM.",LF - db "EEPROM was not flashed properly!",NULL -g_szErrEepromVerify: db "EEPROM did not return the same byte that was written.",LF - db "EEPROM was not flashed properly!",NULL -g_szPCFlashSuccessful: db "EEPROM was written successfully.",LF - db "Press any key to reboot.",NULL -g_szForeignFlash: db "EEPROM was written successfully.",NULL +g_szFlashTitle: db "Flashing EEPROM, please wait.",NULL +g_szErrEepromTooSmall: db "Image is too large for selected EEPROM type!",NULL +g_szErrAddrNot32KAligned: db "The selected EEPROM type requires the address be 32 " + db "kiB aligned (C800, D000, D800, E000, etc.)",NULL +g_szErrEepromPolling: db "Timeout when polling EEPROM.",LF + db "EEPROM was not flashed properly!",NULL +g_szErrEepromVerify: db "EEPROM did not return the same byte that was written.",LF + db "EEPROM was not flashed properly!",NULL +g_szPCFlashSuccessful: db "EEPROM was written successfully.",LF + db "Press any key to reboot.",NULL +g_szForeignFlash: db "EEPROM was written successfully.",NULL ; Strings for main menu From fbdf00a81f560651805d0c548dce82dfcf48f7b9 Mon Sep 17 00:00:00 2001 From: Jayeson Lee-Steere Date: Sat, 2 Oct 2021 20:00:26 +0800 Subject: [PATCH 03/13] Add flashing error message and display for device not detected. Set up SST flashing to be called, bypassing the progress bar display. --- .../Inc/Variables.inc | 1 + .../Src/Menupages/FlashMenu.asm | 14 ++++++++++++++ .../Src/Strings.asm | 4 +++- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/XTIDE_Universal_BIOS_Configurator_v2/Inc/Variables.inc b/XTIDE_Universal_BIOS_Configurator_v2/Inc/Variables.inc index 3c862ad..1ab1882 100644 --- a/XTIDE_Universal_BIOS_Configurator_v2/Inc/Variables.inc +++ b/XTIDE_Universal_BIOS_Configurator_v2/Inc/Variables.inc @@ -105,6 +105,7 @@ endstruc ; Flashing results struc FLASH_RESULT .success resb 2 + .DeviceNotDetected resb 2 .PollingTimeoutError resb 2 .DataVerifyError resb 2 endstruc diff --git a/XTIDE_Universal_BIOS_Configurator_v2/Src/Menupages/FlashMenu.asm b/XTIDE_Universal_BIOS_Configurator_v2/Src/Menupages/FlashMenu.asm index 057fac0..1260c82 100644 --- a/XTIDE_Universal_BIOS_Configurator_v2/Src/Menupages/FlashMenu.asm +++ b/XTIDE_Universal_BIOS_Configurator_v2/Src/Menupages/FlashMenu.asm @@ -266,8 +266,11 @@ StartFlashing: call Memory_ReserveCLbytesFromStackToDSSI call .InitializeFlashvarsFromDSSI mov bx, si ; DS:BX now points to FLASHVARS + cmp WORD [cs:g_cfgVars+CFGVARS.bEepromType], EEPROM_TYPE.SST_39SF + jz SHORT .FlashWithoutProgressBar add si, BYTE FLASHVARS_size ; DS:SI now points to PROGRESS_DIALOG_IO call Dialogs_DisplayProgressDialogForFlashingWithDialogIoInDSSIandFlashvarsInDSBX +.FlashComplete: call .DisplayFlashingResultsFromFlashvarsInDSBX add sp, BYTE FLASHVARS_size + PROGRESS_DIALOG_IO_size @@ -276,6 +279,10 @@ StartFlashing: .InvalidFlashingParameters: ret +.FlashWithoutProgressBar: +; call Flash_SstWithFlashvarsInDSSI ; SST devices complete flashing and/or + jmp SHORT .FlashComplete ; timeout in well under 1 second. + ;-------------------------------------------------------------------- ; .MakeSureThatImageFitsInEeprom ; Parameters: @@ -429,11 +436,13 @@ ALIGN JUMP_ALIGN ALIGN WORD_ALIGN .rgfnFlashResultMessage: dw .DisplayFlashSuccessful + dw .DisplayDeviceDetectionError dw .DisplayPollingError dw .DisplayDataVerifyError ;-------------------------------------------------------------------- +; .DisplayDeviceDetectionError ; .DisplayPollingError ; .DisplayDataVerifyError ; .DisplayFlashSuccessful @@ -444,6 +453,11 @@ ALIGN WORD_ALIGN ; Corrupts registers: ; AX, DX, DI, ES ;-------------------------------------------------------------------- +ALIGN JUMP_ALIGN +.DisplayDeviceDetectionError: + mov dx, g_szErrEepromDetection + jmp Dialogs_DisplayErrorFromCSDX + ALIGN JUMP_ALIGN .DisplayPollingError: mov dx, g_szErrEepromPolling diff --git a/XTIDE_Universal_BIOS_Configurator_v2/Src/Strings.asm b/XTIDE_Universal_BIOS_Configurator_v2/Src/Strings.asm index ce5700c..2d85f20 100644 --- a/XTIDE_Universal_BIOS_Configurator_v2/Src/Strings.asm +++ b/XTIDE_Universal_BIOS_Configurator_v2/Src/Strings.asm @@ -54,8 +54,10 @@ g_szGenericDialogInfo: db "Press ENTER or ESC to close dialog.",NULL ; Flashing related strings g_szFlashTitle: db "Flashing EEPROM, please wait.",NULL g_szErrEepromTooSmall: db "Image is too large for selected EEPROM type!",NULL -g_szErrAddrNot32KAligned: db "The selected EEPROM type requires the address be 32 " +g_szErrAddrNot32KAligned: db "The selected EEPROM type requires the address to be 32 " db "kiB aligned (C800, D000, D800, E000, etc.)",NULL +g_szErrEepromDetection: db "EEPROM type not detected.",LF + db "EEPROM was not flashed properly!",NULL g_szErrEepromPolling: db "Timeout when polling EEPROM.",LF db "EEPROM was not flashed properly!",NULL g_szErrEepromVerify: db "EEPROM did not return the same byte that was written.",LF From 43cab38d5a78b56d5254dce18b924b3bc9a4d46a Mon Sep 17 00:00:00 2001 From: Jayeson Lee-Steere Date: Sat, 2 Oct 2021 20:22:17 +0800 Subject: [PATCH 04/13] Add shell function for flashing SST devices. --- .../Inc/Variables.inc | 3 ++ .../Src/FlashSST.asm | 51 +++++++++++++++++++ .../Src/Main.asm | 1 + .../Src/Menupages/FlashMenu.asm | 2 +- 4 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 XTIDE_Universal_BIOS_Configurator_v2/Src/FlashSST.asm diff --git a/XTIDE_Universal_BIOS_Configurator_v2/Inc/Variables.inc b/XTIDE_Universal_BIOS_Configurator_v2/Inc/Variables.inc index 1ab1882..ddd84b0 100644 --- a/XTIDE_Universal_BIOS_Configurator_v2/Inc/Variables.inc +++ b/XTIDE_Universal_BIOS_Configurator_v2/Inc/Variables.inc @@ -95,6 +95,9 @@ struc FLASHVARS .bEepromSdpCommand resb 1 .bEepromType resb 1 + .wTimeoutCalibrationLow resb 2 ; Used by SST flashing. + .wTimeoutCalibrationHigh resb 2 + .wProgressUpdateParam resb 2 .wTimeoutCounter resb 2 .wLastOffsetWritten resb 2 diff --git a/XTIDE_Universal_BIOS_Configurator_v2/Src/FlashSST.asm b/XTIDE_Universal_BIOS_Configurator_v2/Src/FlashSST.asm new file mode 100644 index 0000000..368e47d --- /dev/null +++ b/XTIDE_Universal_BIOS_Configurator_v2/Src/FlashSST.asm @@ -0,0 +1,51 @@ +; Project name : XTIDE Universal BIOS Configurator v2 +; Description : Functions for flashing SST flash devices. + +; +; Created by Jayeson Lee-Steere +; Hereby placed into the public domain. +; + +; Section containing code +SECTION .text + +;-------------------------------------------------------------------- +; Flash_SstWithFlashvarsInDSSI +; Parameters: +; DS:SI: Ptr to FLASHVARS +; Returns: +; FLASHVARS.flashResult +; Corrupts registers: +; All, including segments +;-------------------------------------------------------------------- +ALIGN JUMP_ALIGN +Flash_SstWithFlashvarsInDSSI: + mov bp, si ; Flashvars now in SS:BP + mov cx, 1 ; TODO +ALIGN JUMP_ALIGN +.FlashNextPage: + +; TODO: + + loop .FlashNextPage +%ifndef CHECK_FOR_UNUSED_ENTRYPOINTS +%if FLASH_RESULT.success = 0 ; Just in case this should ever change + mov [bp+FLASHVARS.flashResult], cl +%else + mov BYTE [bp+FLASHVARS.flashResult], FLASH_RESULT.success +%endif +%endif + ret + +.DeviceDetectionError: + mov BYTE [bp+FLASHVARS.flashResult], FLASH_RESULT.DeviceNotDetected + ret +.PollingError: + mov BYTE [bp+FLASHVARS.flashResult], FLASH_RESULT.PollingTimeoutError + ret +.DataVerifyError: + mov BYTE [bp+FLASHVARS.flashResult], FLASH_RESULT.DataVerifyError + ret + + + diff --git a/XTIDE_Universal_BIOS_Configurator_v2/Src/Main.asm b/XTIDE_Universal_BIOS_Configurator_v2/Src/Main.asm index d11779d..8f0270f 100644 --- a/XTIDE_Universal_BIOS_Configurator_v2/Src/Main.asm +++ b/XTIDE_Universal_BIOS_Configurator_v2/Src/Main.asm @@ -55,6 +55,7 @@ Start: %include "Dialogs.asm" %include "EEPROM.asm" %include "Flash.asm" +%include "FlashSST.asm" %include "IdeAutodetect.asm" %include "MenuEvents.asm" %include "Menuitem.asm" diff --git a/XTIDE_Universal_BIOS_Configurator_v2/Src/Menupages/FlashMenu.asm b/XTIDE_Universal_BIOS_Configurator_v2/Src/Menupages/FlashMenu.asm index 1260c82..0de7254 100644 --- a/XTIDE_Universal_BIOS_Configurator_v2/Src/Menupages/FlashMenu.asm +++ b/XTIDE_Universal_BIOS_Configurator_v2/Src/Menupages/FlashMenu.asm @@ -280,7 +280,7 @@ StartFlashing: ret .FlashWithoutProgressBar: -; call Flash_SstWithFlashvarsInDSSI ; SST devices complete flashing and/or + call Flash_SstWithFlashvarsInDSSI ; SST devices complete flashing and/or jmp SHORT .FlashComplete ; timeout in well under 1 second. ;-------------------------------------------------------------------- From 30172b5d1fe8d271a65fbe288dc5832cab78ea13 Mon Sep 17 00:00:00 2001 From: Jayeson Lee-Steere Date: Sun, 3 Oct 2021 13:37:11 +0800 Subject: [PATCH 05/13] Add SST flash device detected and timeout loop count calibration to FlashSst. Also has shell for erase/write/verify. --- .../Inc/Variables.inc | 24 +-- .../Src/FlashSST.asm | 181 ++++++++++++++++-- .../Src/Menupages/FlashMenu.asm | 9 +- .../Src/Strings.asm | 2 +- 4 files changed, 186 insertions(+), 30 deletions(-) diff --git a/XTIDE_Universal_BIOS_Configurator_v2/Inc/Variables.inc b/XTIDE_Universal_BIOS_Configurator_v2/Inc/Variables.inc index ddd84b0..2272e29 100644 --- a/XTIDE_Universal_BIOS_Configurator_v2/Inc/Variables.inc +++ b/XTIDE_Universal_BIOS_Configurator_v2/Inc/Variables.inc @@ -21,14 +21,17 @@ %define VARIABLES_INC ; Equates and defines -BOOT_MENU_DEFAULT_TIMEOUT EQU (TICKS_PER_MINUTE / 2) -MAX_ALLOWED_IDE_CONTROLLERS EQU 4 ; Maximum number of IDE controllers -MAX_LITE_MODE_CONTROLLERS EQU 2 -EEPROM_POLLING_TIMEOUT_TICKS EQU 3 ; 1 tick = 54.9 ms -XTIDE_SIGNATURE_LENGTH EQU 6 ; XTIDE Universal BIOS signature string length (must be even) -NUMBER_OF_EEPROM_TYPES EQU 5 -MAX_EEPROM_SIZE_IN_BYTES EQU 65536 - +BOOT_MENU_DEFAULT_TIMEOUT EQU (TICKS_PER_MINUTE / 2) +MAX_ALLOWED_IDE_CONTROLLERS EQU 4 ; Maximum number of IDE controllers +MAX_LITE_MODE_CONTROLLERS EQU 2 +EEPROM_POLLING_TIMEOUT_TICKS EQU 3 ; 1 tick = 54.9 ms +XTIDE_SIGNATURE_LENGTH EQU 6 ; XTIDE Universal BIOS signature string length (must be even) +NUMBER_OF_EEPROM_TYPES EQU 5 +MAX_EEPROM_SIZE_IN_BYTES EQU 65536 +SST_POLLING_TIMEOUT_TICKS EQU 4 ; 219.6 ms, about 9x datasheet max time for sector erase and + ; 1000's of times longer than byte write time. +SST_PAGE_SHIFT EQU 12 ; Minimum we can erase is a 4K sector. +SST_PAGE_SIZE EQU (1 << SST_PAGE_SHIFT) ; Program global variables struc CFGVARS @@ -95,11 +98,8 @@ struc FLASHVARS .bEepromSdpCommand resb 1 .bEepromType resb 1 - .wTimeoutCalibrationLow resb 2 ; Used by SST flashing. - .wTimeoutCalibrationHigh resb 2 - .wProgressUpdateParam resb 2 - .wTimeoutCounter resb 2 + .wTimeoutCounter resb 2 ; On SSI, this is timeout cal .wLastOffsetWritten resb 2 .bLastByteWritten resb 1 .flashResult resb 1 diff --git a/XTIDE_Universal_BIOS_Configurator_v2/Src/FlashSST.asm b/XTIDE_Universal_BIOS_Configurator_v2/Src/FlashSST.asm index 368e47d..e15a6c2 100644 --- a/XTIDE_Universal_BIOS_Configurator_v2/Src/FlashSST.asm +++ b/XTIDE_Universal_BIOS_Configurator_v2/Src/FlashSST.asm @@ -10,24 +10,46 @@ SECTION .text ;-------------------------------------------------------------------- -; Flash_SstWithFlashvarsInDSSI +; FlashSst_WithFlashvarsInDSSI ; Parameters: -; DS:SI: Ptr to FLASHVARS +; DS:BX: Ptr to FLASHVARS ; Returns: -; FLASHVARS.flashResult +; Updated FLASHVARS in DS:BX ; Corrupts registers: -; All, including segments +; AX, DX, DI ;-------------------------------------------------------------------- ALIGN JUMP_ALIGN -Flash_SstWithFlashvarsInDSSI: - mov bp, si ; Flashvars now in SS:BP - mov cx, 1 ; TODO +FlashSst_WithFlashvarsInDSBX: + push ds + push es + push bx + push cx + push si + push bp + mov bp, bx ; Flashvars now in SS:BP + + mov BYTE [bp+FLASHVARS.flashResult], FLASH_RESULT.DeviceNotDetected + call DetectSstDevice + jc SHORT .ExitOnError + + call CalibrateSstTimeout + + mov BYTE [bp+FLASHVARS.flashResult], FLASH_RESULT.PollingTimeoutError + mov cx, [bp+FLASHVARS.wPagesToFlash] + ; TODO: load DS:SI and ES:DI with source/dest. ALIGN JUMP_ALIGN .FlashNextPage: + call EraseSstPage + jc SHORT .ExitOnError + call WriteSstPage + jc SHORT .ExitOnError + loop .FlashNextPage -; TODO: + ; TODO: load DS:SI and ES:DI with source/dest. + + ; TODO: Verify results match. + mov BYTE [bp+FLASHVARS.flashResult], FLASH_RESULT.DataVerifyError - loop .FlashNextPage %ifndef CHECK_FOR_UNUSED_ENTRYPOINTS %if FLASH_RESULT.success = 0 ; Just in case this should ever change mov [bp+FLASHVARS.flashResult], cl @@ -35,17 +57,146 @@ ALIGN JUMP_ALIGN mov BYTE [bp+FLASHVARS.flashResult], FLASH_RESULT.success %endif %endif +ALIGN JUMP_ALIGN +.ExitOnError: + pop bp + pop si + pop cx + pop bx + pop es + pop ds ret -.DeviceDetectionError: - mov BYTE [bp+FLASHVARS.flashResult], FLASH_RESULT.DeviceNotDetected +;-------------------------------------------------------------------- +; GetDestinationFarPtr +; Parameters: +; SS:BP: Ptr to FLASHVARS +; Returns: +; ES:DI: Ptr to destination location +; Corrupts registers: +; Nothing +;-------------------------------------------------------------------- +ALIGN JUMP_ALIGN +GetDestinationFarPtr: + mov di, [bp+FLASHVARS.fpNextDestinationPage+2] + mov es, di + mov di, [bp+FLASHVARS.fpNextDestinationPage] ret -.PollingError: - mov BYTE [bp+FLASHVARS.flashResult], FLASH_RESULT.PollingTimeoutError + +;-------------------------------------------------------------------- +; DetectSstDevice +; Parameters: +; SS:BP: Ptr to FLASHVARS +; Returns: +; CF: Clear if supported SST device found +; Set if supported SST device not found +; Corrupts registers: +; AX, DI, ES +;-------------------------------------------------------------------- +ALIGN JUMP_ALIGN +DetectSstDevice: + call GetDestinationFarPtr + + cli + mov BYTE [es:05555h], 0AAh ; Enter software ID sequence. + mov BYTE [es:02AAAh], 055h + mov BYTE [es:05555h], 090h + mov al, [es:di] ; Extra reads to be sure device + mov al, [es:di] ; has time to respond. + mov al, [es:di] + mov ah, [es:di] ; Vendor ID in AH. + mov al, [es:di + 1] ; Device ID in AL. + mov BYTE [es:05555h], 0F0h ; Exit software ID. + sti + + cmp al, 0B4h + jb SHORT .NotValidDevice + cmp al, 0B7h + ja SHORT .NotValidDevice + cmp ah, 0BFh + jne SHORT .NotValidDevice ret -.DataVerifyError: - mov BYTE [bp+FLASHVARS.flashResult], FLASH_RESULT.DataVerifyError + +.NotValidDevice: + stc ret + +;-------------------------------------------------------------------- +; CalibrateSstTimeout +; Parameters: +; SS:BP: Ptr to FLASHVARS +; Returns: +; FLASHVARS.wTimeoutCounter +; Corrupts registers: +; AX, BX, CX, SI, DI, DS, ES +;-------------------------------------------------------------------- +ALIGN JUMP_ALIGN +CalibrateSstTimeout: + LOAD_BDA_SEGMENT_TO ds, ax + call GetDestinationFarPtr + xor cx, cx + mov si, cx + mov di, cx + mov al, [es:di] + not al ; Forces poll to fail. + mov bx, [BDA.dwTimerTicks] ; Read low word only. + inc bx +.WaitForFirstIncrement: + cmp bx, [BDA.dwTimerTicks] + jnz SHORT .WaitForFirstIncrement + + inc bx + +.WaitForSecondIncrement: + inc ch ; cx now 0x0100 +.PollLoop: ; Identical to poll loop used + cmp [es:di], al ; during programming + jz SHORT .PollComplete ; Will never branch in this case + loop .PollLoop +.PollComplete: + add si, 1 ; number of poll loops completed + jc SHORT .countOverflow + cmp bx, [BDA.dwTimerTicks] + jnz SHORT .WaitForSecondIncrement + +.CalComplete: + ; SI ~= number of polling loops in 215us. + mov [bp+FLASHVARS.wTimeoutCounter], si + ret + +.countOverflow: + ; Clamp on overflow, although it should not be possible on + ; real hardware. In principle SI could overflow on a very + ; fast CPU. However the SST device is on a slow bus. Even + ; running at the min read cycle time of fastest version of + ; the device, SI can not overflow. + dec si + jmp SHORT .CalComplete + +;-------------------------------------------------------------------- +; EraseSstPage +; Parameters: +; TODO +; Returns: +; TODO +; Corrupts registers: +; TODO +;-------------------------------------------------------------------- +ALIGN JUMP_ALIGN +EraseSstPage: + ret +;-------------------------------------------------------------------- +; EraseSstPage +; Parameters: +; TODO +; Returns: +; TODO +; Corrupts registers: +; TODO +;-------------------------------------------------------------------- +ALIGN JUMP_ALIGN +WriteSstPage: + ret diff --git a/XTIDE_Universal_BIOS_Configurator_v2/Src/Menupages/FlashMenu.asm b/XTIDE_Universal_BIOS_Configurator_v2/Src/Menupages/FlashMenu.asm index 0de7254..79efca8 100644 --- a/XTIDE_Universal_BIOS_Configurator_v2/Src/Menupages/FlashMenu.asm +++ b/XTIDE_Universal_BIOS_Configurator_v2/Src/Menupages/FlashMenu.asm @@ -280,8 +280,8 @@ StartFlashing: ret .FlashWithoutProgressBar: - call Flash_SstWithFlashvarsInDSSI ; SST devices complete flashing and/or - jmp SHORT .FlashComplete ; timeout in well under 1 second. + call FlashSst_WithFlashvarsInDSBX ; SST devices with either complete flashing + jmp SHORT .FlashComplete ; or timeout within 1 second. ;-------------------------------------------------------------------- ; .MakeSureThatImageFitsInEeprom @@ -372,8 +372,13 @@ ALIGN JUMP_ALIGN mov al, [cs:g_cfgVars+CFGVARS.bSdpCommand] mov [si+FLASHVARS.bEepromSdpCommand], al + mov ax, SST_PAGE_SIZE + cmp WORD [g_cfgVars+CFGVARS.bEepromType], EEPROM_TYPE.SST_39SF + jz SHORT .UseSstPageSize + eMOVZX bx, [cs:g_cfgVars+CFGVARS.bEepromPage] mov ax, [cs:bx+g_rgwEepromPageToSizeInBytes] +.UseSstPageSize: mov [si+FLASHVARS.wEepromPageSize], ax call .GetNumberOfPagesToFlashToAX diff --git a/XTIDE_Universal_BIOS_Configurator_v2/Src/Strings.asm b/XTIDE_Universal_BIOS_Configurator_v2/Src/Strings.asm index 2d85f20..97477e0 100644 --- a/XTIDE_Universal_BIOS_Configurator_v2/Src/Strings.asm +++ b/XTIDE_Universal_BIOS_Configurator_v2/Src/Strings.asm @@ -560,7 +560,7 @@ g_szMultichoiceEepromType: db "2816 (2 kiB)",LF db "2864 mod (8 kiB)",LF db "28256 (32 kiB)",LF db "28512 (64 kiB)",LF - db "SST39SFxxx flash",NULL + db "SST39SFx flash",NULL g_szValueFlash2816: db "2816",NULL g_szValueFlash2864: db "2864",NULL g_szValueFlash2864Mod: db "2864mod",NULL From 032e10e85af012e778f2431fb3b4b5d8465dc656 Mon Sep 17 00:00:00 2001 From: Jayeson Lee-Steere Date: Sun, 3 Oct 2021 13:54:20 +0800 Subject: [PATCH 06/13] Set up DS:SI / ES:DI pointers in FlashSST. Add memory-compare for final verify. --- .../Src/FlashSST.asm | 38 ++++++++----------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/XTIDE_Universal_BIOS_Configurator_v2/Src/FlashSST.asm b/XTIDE_Universal_BIOS_Configurator_v2/Src/FlashSST.asm index e15a6c2..347869e 100644 --- a/XTIDE_Universal_BIOS_Configurator_v2/Src/FlashSST.asm +++ b/XTIDE_Universal_BIOS_Configurator_v2/Src/FlashSST.asm @@ -36,7 +36,9 @@ FlashSst_WithFlashvarsInDSBX: mov BYTE [bp+FLASHVARS.flashResult], FLASH_RESULT.PollingTimeoutError mov cx, [bp+FLASHVARS.wPagesToFlash] - ; TODO: load DS:SI and ES:DI with source/dest. + lds si, [bp+FLASHVARS.fpNextSourcePage] + les di, [bp+FLASHVARS.fpNextDestinationPage] + ALIGN JUMP_ALIGN .FlashNextPage: call EraseSstPage @@ -45,10 +47,18 @@ ALIGN JUMP_ALIGN jc SHORT .ExitOnError loop .FlashNextPage - ; TODO: load DS:SI and ES:DI with source/dest. - - ; TODO: Verify results match. + ; The write process has already confirmed the results one byte at a time. + ; Here we do an additional verify check just in case there was some + ; kind of oddity with pages / addresses. mov BYTE [bp+FLASHVARS.flashResult], FLASH_RESULT.DataVerifyError + mov ax, [bp+FLASHVARS.wPagesToFlash] + mov cl, SST_PAGE_SHIFT + shl ax, cl + mov cx, ax + lds si, [bp+FLASHVARS.fpNextSourcePage] + les di, [bp+FLASHVARS.fpNextDestinationPage] + repe cmpsb + jnz SHORT .ExitOnError %ifndef CHECK_FOR_UNUSED_ENTRYPOINTS %if FLASH_RESULT.success = 0 ; Just in case this should ever change @@ -67,22 +77,6 @@ ALIGN JUMP_ALIGN pop ds ret -;-------------------------------------------------------------------- -; GetDestinationFarPtr -; Parameters: -; SS:BP: Ptr to FLASHVARS -; Returns: -; ES:DI: Ptr to destination location -; Corrupts registers: -; Nothing -;-------------------------------------------------------------------- -ALIGN JUMP_ALIGN -GetDestinationFarPtr: - mov di, [bp+FLASHVARS.fpNextDestinationPage+2] - mov es, di - mov di, [bp+FLASHVARS.fpNextDestinationPage] - ret - ;-------------------------------------------------------------------- ; DetectSstDevice ; Parameters: @@ -95,7 +89,7 @@ GetDestinationFarPtr: ;-------------------------------------------------------------------- ALIGN JUMP_ALIGN DetectSstDevice: - call GetDestinationFarPtr + les di, [bp+FLASHVARS.fpNextDestinationPage] cli mov BYTE [es:05555h], 0AAh ; Enter software ID sequence. @@ -133,7 +127,7 @@ DetectSstDevice: ALIGN JUMP_ALIGN CalibrateSstTimeout: LOAD_BDA_SEGMENT_TO ds, ax - call GetDestinationFarPtr + les di, [bp+FLASHVARS.fpNextDestinationPage] xor cx, cx mov si, cx mov di, cx From 5617de519055b0928c34e2a69278299a12eef521 Mon Sep 17 00:00:00 2001 From: Jayeson Lee-Steere Date: Sun, 3 Oct 2021 15:10:07 +0800 Subject: [PATCH 07/13] Implement WriteSstPage. EraseSstPage still remaining. --- .../Src/FlashSST.asm | 45 ++++++++++++++++--- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/XTIDE_Universal_BIOS_Configurator_v2/Src/FlashSST.asm b/XTIDE_Universal_BIOS_Configurator_v2/Src/FlashSST.asm index 347869e..26de69f 100644 --- a/XTIDE_Universal_BIOS_Configurator_v2/Src/FlashSST.asm +++ b/XTIDE_Universal_BIOS_Configurator_v2/Src/FlashSST.asm @@ -41,8 +41,8 @@ FlashSst_WithFlashvarsInDSBX: ALIGN JUMP_ALIGN .FlashNextPage: - call EraseSstPage - jc SHORT .ExitOnError +; call EraseSstPage +; jc SHORT .ExitOnError call WriteSstPage jc SHORT .ExitOnError loop .FlashNextPage @@ -182,15 +182,46 @@ EraseSstPage: ret ;-------------------------------------------------------------------- -; EraseSstPage +; WriteSstPage ; Parameters: -; TODO +; DS:SI: Source ptr. +; ES:DI: Desintation ptr. ; Returns: -; TODO +; SI, DI: Each advanced forward 1 page. +; CF: Set on error. ; Corrupts registers: -; TODO +; AL, BX, DX ;-------------------------------------------------------------------- ALIGN JUMP_ALIGN WriteSstPage: - ret + push cx + mov bx, [bp+FLASHVARS.wTimeoutCounter] + mov dx, SST_PAGE_SIZE + cli + +.NextByte: + lodsb + mov BYTE [es:05555h], 0AAh ; Byte program sequence. + mov BYTE [es:02AAAh], 055h + mov BYTE [es:05555h], 0A0h + mov [es:di], al + + mov cx, bx +.WaitLoop: + cmp [es:di], al ; Device won't return actual data until + jz SHORT .ByteFinished ; write complete. Timeout ~215us, or + loop .WaitLoop ; ~10x 20us max program time from datasheet. + + stc ; Write timeout. + jmp SHORT .Exit + +.ByteFinished: + inc di + dec dx + jnz SHORT .NextByte + clc +.Exit: + sti + pop cx + ret From 8a2e004ce5266fc0046386fc8e191a1939a59223 Mon Sep 17 00:00:00 2001 From: Jayeson Lee-Steere Date: Sun, 3 Oct 2021 15:44:54 +0800 Subject: [PATCH 08/13] Implemented EraseSstPage. Asssembles, not yet tested on real hardware. --- .../Inc/Variables.inc | 6 ++-- .../Src/FlashSST.asm | 35 +++++++++++++++---- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/XTIDE_Universal_BIOS_Configurator_v2/Inc/Variables.inc b/XTIDE_Universal_BIOS_Configurator_v2/Inc/Variables.inc index 2272e29..ac0e70e 100644 --- a/XTIDE_Universal_BIOS_Configurator_v2/Inc/Variables.inc +++ b/XTIDE_Universal_BIOS_Configurator_v2/Inc/Variables.inc @@ -28,10 +28,8 @@ EEPROM_POLLING_TIMEOUT_TICKS EQU 3 ; 1 tick = 54.9 ms XTIDE_SIGNATURE_LENGTH EQU 6 ; XTIDE Universal BIOS signature string length (must be even) NUMBER_OF_EEPROM_TYPES EQU 5 MAX_EEPROM_SIZE_IN_BYTES EQU 65536 -SST_POLLING_TIMEOUT_TICKS EQU 4 ; 219.6 ms, about 9x datasheet max time for sector erase and - ; 1000's of times longer than byte write time. -SST_PAGE_SHIFT EQU 12 ; Minimum we can erase is a 4K sector. -SST_PAGE_SIZE EQU (1 << SST_PAGE_SHIFT) +SST_PAGE_SIZE_SHIFT EQU 12 ; Minimum we can erase is a 4K sector. +SST_PAGE_SIZE EQU (1 << SST_PAGE_SIZE_SHIFT) ; Program global variables struc CFGVARS diff --git a/XTIDE_Universal_BIOS_Configurator_v2/Src/FlashSST.asm b/XTIDE_Universal_BIOS_Configurator_v2/Src/FlashSST.asm index 26de69f..16c74e9 100644 --- a/XTIDE_Universal_BIOS_Configurator_v2/Src/FlashSST.asm +++ b/XTIDE_Universal_BIOS_Configurator_v2/Src/FlashSST.asm @@ -41,8 +41,8 @@ FlashSst_WithFlashvarsInDSBX: ALIGN JUMP_ALIGN .FlashNextPage: -; call EraseSstPage -; jc SHORT .ExitOnError + call EraseSstPage + jc SHORT .ExitOnError call WriteSstPage jc SHORT .ExitOnError loop .FlashNextPage @@ -52,7 +52,7 @@ ALIGN JUMP_ALIGN ; kind of oddity with pages / addresses. mov BYTE [bp+FLASHVARS.flashResult], FLASH_RESULT.DataVerifyError mov ax, [bp+FLASHVARS.wPagesToFlash] - mov cl, SST_PAGE_SHIFT + mov cl, SST_PAGE_SIZE_SHIFT shl ax, cl mov cx, ax lds si, [bp+FLASHVARS.fpNextSourcePage] @@ -171,21 +171,42 @@ CalibrateSstTimeout: ;-------------------------------------------------------------------- ; EraseSstPage ; Parameters: -; TODO +; ES:DI: Destination ptr. ; Returns: -; TODO +; CF: Set on error. ; Corrupts registers: -; TODO +; AX ;-------------------------------------------------------------------- ALIGN JUMP_ALIGN EraseSstPage: + push cx + + mov BYTE [es:05555h], 0AAh ; Sector erase sequence. + mov BYTE [es:02AAAh], 055h + mov BYTE [es:05555h], 080h + mov BYTE [es:05555h], 0AAh + mov BYTE [es:02AAAh], 055h + mov BYTE [es:di], 030h + + mov ax, 1163 ; 1163 x ~215us = 250ms = 10x datasheet max +.TimeoutOuterLoop: + mov cx, [bp+FLASHVARS.wTimeoutCounter] +.TimeoutInnerLoop: + cmp BYTE [es:di], 0FFh ; Will return 0FFh when erase complete. + jz .Exit + loop .TimeoutInnerLoop + dec ax + jnz .TimeoutOuterLoop + stc ; Timed out. +.Exit: + pop cx ret ;-------------------------------------------------------------------- ; WriteSstPage ; Parameters: ; DS:SI: Source ptr. -; ES:DI: Desintation ptr. +; ES:DI: Destination ptr. ; Returns: ; SI, DI: Each advanced forward 1 page. ; CF: Set on error. From 6f5a4f0182d277db0b08b5243ed2133e87d02d60 Mon Sep 17 00:00:00 2001 From: Jayeson Lee-Steere Date: Sun, 3 Oct 2021 15:46:15 +0800 Subject: [PATCH 09/13] Small change to message string when EEPROM type is not detected. --- XTIDE_Universal_BIOS_Configurator_v2/Src/Strings.asm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/XTIDE_Universal_BIOS_Configurator_v2/Src/Strings.asm b/XTIDE_Universal_BIOS_Configurator_v2/Src/Strings.asm index 97477e0..172fe11 100644 --- a/XTIDE_Universal_BIOS_Configurator_v2/Src/Strings.asm +++ b/XTIDE_Universal_BIOS_Configurator_v2/Src/Strings.asm @@ -56,7 +56,7 @@ g_szFlashTitle: db "Flashing EEPROM, please wait.",NULL g_szErrEepromTooSmall: db "Image is too large for selected EEPROM type!",NULL g_szErrAddrNot32KAligned: db "The selected EEPROM type requires the address to be 32 " db "kiB aligned (C800, D000, D800, E000, etc.)",NULL -g_szErrEepromDetection: db "EEPROM type not detected.",LF +g_szErrEepromDetection: db "EEPROM of type not found.",LF db "EEPROM was not flashed properly!",NULL g_szErrEepromPolling: db "Timeout when polling EEPROM.",LF db "EEPROM was not flashed properly!",NULL From 6c522a5e35ef129941b22bebd2fe146f87a6ff86 Mon Sep 17 00:00:00 2001 From: Jayeson Lee-Steere Date: Sun, 3 Oct 2021 17:05:57 +0800 Subject: [PATCH 10/13] FlashSST: No longer flashes pages where the ROM is already up to date. --- .../Src/FlashSST.asm | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/XTIDE_Universal_BIOS_Configurator_v2/Src/FlashSST.asm b/XTIDE_Universal_BIOS_Configurator_v2/Src/FlashSST.asm index 16c74e9..2d492e3 100644 --- a/XTIDE_Universal_BIOS_Configurator_v2/Src/FlashSST.asm +++ b/XTIDE_Universal_BIOS_Configurator_v2/Src/FlashSST.asm @@ -26,7 +26,7 @@ FlashSst_WithFlashvarsInDSBX: push cx push si push bp - mov bp, bx ; Flashvars now in SS:BP + mov bp, bx ; Flashvars now in SS:BP. mov BYTE [bp+FLASHVARS.flashResult], FLASH_RESULT.DeviceNotDetected call DetectSstDevice @@ -40,12 +40,29 @@ FlashSst_WithFlashvarsInDSBX: les di, [bp+FLASHVARS.fpNextDestinationPage] ALIGN JUMP_ALIGN -.FlashNextPage: +.NextPage: + ; See if this page needs updating. + push si + push di + push cx + mov cx, [bp+FLASHVARS.wEepromPageSize] + mov bx, cx + repe cmpsb + pop cx + pop di + pop si + jnz .FlashThisPage + add si, bx + add di, bx + jmp .ContinueLoop + +.FlashThisPage: call EraseSstPage jc SHORT .ExitOnError call WriteSstPage jc SHORT .ExitOnError - loop .FlashNextPage +.ContinueLoop: + loop .NextPage ; The write process has already confirmed the results one byte at a time. ; Here we do an additional verify check just in case there was some @@ -218,7 +235,7 @@ WriteSstPage: push cx mov bx, [bp+FLASHVARS.wTimeoutCounter] - mov dx, SST_PAGE_SIZE + mov dx, [bp+FLASHVARS.wEepromPageSize] cli .NextByte: From 7da3ed8b0a2eb99990d1ddc438fc4f05ee5ba88f Mon Sep 17 00:00:00 2001 From: Jayeson Lee-Steere Date: Sun, 3 Oct 2021 17:06:51 +0800 Subject: [PATCH 11/13] Update comment about worst case flash times after testing on 4.77MHz 8086. --- .../Src/Menupages/FlashMenu.asm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/XTIDE_Universal_BIOS_Configurator_v2/Src/Menupages/FlashMenu.asm b/XTIDE_Universal_BIOS_Configurator_v2/Src/Menupages/FlashMenu.asm index 79efca8..0aaff32 100644 --- a/XTIDE_Universal_BIOS_Configurator_v2/Src/Menupages/FlashMenu.asm +++ b/XTIDE_Universal_BIOS_Configurator_v2/Src/Menupages/FlashMenu.asm @@ -279,9 +279,9 @@ StartFlashing: .InvalidFlashingParameters: ret -.FlashWithoutProgressBar: - call FlashSst_WithFlashvarsInDSBX ; SST devices with either complete flashing - jmp SHORT .FlashComplete ; or timeout within 1 second. +.FlashWithoutProgressBar: ; Worst case. SST devices will + call FlashSst_WithFlashvarsInDSBX ; either complete flashing + jmp SHORT .FlashComplete ; or timeout within 2 seconds. ;-------------------------------------------------------------------- ; .MakeSureThatImageFitsInEeprom From 375f5bb7444ce0be295c161dc1b4c87bce9a2376 Mon Sep 17 00:00:00 2001 From: Jayeson Lee-Steere Date: Mon, 4 Oct 2021 15:08:13 +0800 Subject: [PATCH 12/13] Added a couple of missing SHORT modifiers to jumps. --- XTIDE_Universal_BIOS_Configurator_v2/Src/FlashSST.asm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/XTIDE_Universal_BIOS_Configurator_v2/Src/FlashSST.asm b/XTIDE_Universal_BIOS_Configurator_v2/Src/FlashSST.asm index 2d492e3..fab5b80 100644 --- a/XTIDE_Universal_BIOS_Configurator_v2/Src/FlashSST.asm +++ b/XTIDE_Universal_BIOS_Configurator_v2/Src/FlashSST.asm @@ -51,10 +51,10 @@ ALIGN JUMP_ALIGN pop cx pop di pop si - jnz .FlashThisPage + jnz SHORT .FlashThisPage add si, bx add di, bx - jmp .ContinueLoop + jmp SHORT .ContinueLoop .FlashThisPage: call EraseSstPage @@ -210,10 +210,10 @@ EraseSstPage: mov cx, [bp+FLASHVARS.wTimeoutCounter] .TimeoutInnerLoop: cmp BYTE [es:di], 0FFh ; Will return 0FFh when erase complete. - jz .Exit + jz SHORT .Exit loop .TimeoutInnerLoop dec ax - jnz .TimeoutOuterLoop + jnz SHORT .TimeoutOuterLoop stc ; Timed out. .Exit: pop cx From 65e25b33989a80a5e13d5debaf2cccdf16873067 Mon Sep 17 00:00:00 2001 From: Jayeson Lee-Steere Date: Mon, 4 Oct 2021 15:48:21 +0800 Subject: [PATCH 13/13] Auto-double the SST flash size when the image does not fit into 32K. Would be useful for flashing a 64K image to the Lo-Tech ISA ROM board for example. --- .../Src/Buffers.asm | 27 ++++++++++++++++--- .../Src/FlashSST.asm | 3 +++ .../Src/Menupages/FlashMenu.asm | 20 ++------------ 3 files changed, 29 insertions(+), 21 deletions(-) diff --git a/XTIDE_Universal_BIOS_Configurator_v2/Src/Buffers.asm b/XTIDE_Universal_BIOS_Configurator_v2/Src/Buffers.asm index 7250c85..3069ec9 100644 --- a/XTIDE_Universal_BIOS_Configurator_v2/Src/Buffers.asm +++ b/XTIDE_Universal_BIOS_Configurator_v2/Src/Buffers.asm @@ -172,6 +172,27 @@ ALIGN JUMP_ALIGN .NothingToSave: ret +;-------------------------------------------------------------------- +; Buffers_GetSelectedEepromSizeInWordsToAX +; Parameters: +; Nothing +; Returns: +; AX: Selected EEPROM size in WORDs +; Corrupts registers: +; BX +;-------------------------------------------------------------------- +ALIGN JUMP_ALIGN +Buffers_GetSelectedEepromSizeInWordsToAX: + eMOVZX bx, [cs:g_cfgVars+CFGVARS.bEepromType] + mov ax, [cs:bx+g_rgwEepromTypeToSizeInWords] + + cmp bl, EEPROM_TYPE.SST_39SF + jnz SHORT .HaveEepromSize + cmp ax, [cs:g_cfgVars+CFGVARS.wImageSizeInWords] + jae SHORT .HaveEepromSize + shl ax, 1 ; Auto-double SST size when too small. +.HaveEepromSize: + ret ;-------------------------------------------------------------------- ; Buffers_AppendZeroesIfNeeded @@ -180,14 +201,14 @@ ALIGN JUMP_ALIGN ; Returns: ; Nothing ; Corrupts registers: -; AX, CX, DI +; AX, BX, CX, DI ;-------------------------------------------------------------------- ALIGN JUMP_ALIGN Buffers_AppendZeroesIfNeeded: push es - eMOVZX di, [cs:g_cfgVars+CFGVARS.bEepromType] - mov cx, [cs:di+g_rgwEepromTypeToSizeInWords] + call Buffers_GetSelectedEepromSizeInWordsToAX + mov cx, ax sub cx, [cs:g_cfgVars+CFGVARS.wImageSizeInWords] ; CX = WORDs to append jbe SHORT .NoNeedToAppendZeroes diff --git a/XTIDE_Universal_BIOS_Configurator_v2/Src/FlashSST.asm b/XTIDE_Universal_BIOS_Configurator_v2/Src/FlashSST.asm index fab5b80..d215fe6 100644 --- a/XTIDE_Universal_BIOS_Configurator_v2/Src/FlashSST.asm +++ b/XTIDE_Universal_BIOS_Configurator_v2/Src/FlashSST.asm @@ -38,6 +38,9 @@ FlashSst_WithFlashvarsInDSBX: mov cx, [bp+FLASHVARS.wPagesToFlash] lds si, [bp+FLASHVARS.fpNextSourcePage] les di, [bp+FLASHVARS.fpNextDestinationPage] +%ifdef CLD_NEEDED + cld +%endif ALIGN JUMP_ALIGN .NextPage: diff --git a/XTIDE_Universal_BIOS_Configurator_v2/Src/Menupages/FlashMenu.asm b/XTIDE_Universal_BIOS_Configurator_v2/Src/Menupages/FlashMenu.asm index 0aaff32..ae5ab1e 100644 --- a/XTIDE_Universal_BIOS_Configurator_v2/Src/Menupages/FlashMenu.asm +++ b/XTIDE_Universal_BIOS_Configurator_v2/Src/Menupages/FlashMenu.asm @@ -294,7 +294,7 @@ StartFlashing: ;-------------------------------------------------------------------- ALIGN JUMP_ALIGN .MakeSureThatImageFitsInEeprom: - call .GetSelectedEepromSizeInWordsToAX + call Buffers_GetSelectedEepromSizeInWordsToAX cmp ax, [cs:g_cfgVars+CFGVARS.wImageSizeInWords] jae SHORT .ImageFitsInSelectedEeprom mov dx, g_szErrEepromTooSmall @@ -396,7 +396,7 @@ ALIGN JUMP_ALIGN ;-------------------------------------------------------------------- ALIGN JUMP_ALIGN .GetNumberOfPagesToFlashToAX: - call .GetSelectedEepromSizeInWordsToAX + call Buffers_GetSelectedEepromSizeInWordsToAX xor dx, dx eSHL_IM ax, 1 ; Size in bytes to... eRCL_IM dx, 1 ; ...DX:AX @@ -407,22 +407,6 @@ ALIGN JUMP_ALIGN .PreventDivideException: ret -;-------------------------------------------------------------------- -; .GetSelectedEepromSizeInWordsToAX -; Parameters: -; Nothing -; Returns: -; AX: Selected EEPROM size in WORDs -; Corrupts registers: -; BX -;-------------------------------------------------------------------- -ALIGN JUMP_ALIGN -.GetSelectedEepromSizeInWordsToAX: - eMOVZX bx, [cs:g_cfgVars+CFGVARS.bEepromType] - mov ax, [cs:bx+g_rgwEepromTypeToSizeInWords] - ret - - ;-------------------------------------------------------------------- ; .DisplayFlashingResultsFromFlashvarsInDSBX ; Parameters: