source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS_Configurator_v2/Src/Menupages/FlashMenu.asm @ 371

Last change on this file since 371 was 371, checked in by gregli@…, 12 years ago

Small changes. 1) Changes biosdrvs.com to output CR+LF instead of LF+CR, consistent with DOS/Windows, but I did not update the Assembly Library as this would break the Configurator; 2) Put a C/C++ section in Version.inc for the serial server; 3) Configurator defaults the EEPROM address after scanning for a EEPROM in memory (as it does for loading the BIOS from ROM); 4) Added a command to the Configurator main menu to save chages to the file from which it was loaded (if it was loaded form a file), which is symmetric with the Load command and more discoverable than exiting DOS and then being prompted (which is still there too, if changes are unsaved).

File size: 13.4 KB
Line 
1; Project name  :   XTIDE Universal BIOS Configurator v2
2; Description   :   "Flash EEPROM" menu structs and functions.
3
4; Section containing initialized data
5SECTION .data
6
7ALIGN WORD_ALIGN
8g_MenupageForFlashMenu:
9istruc MENUPAGE
10    at  MENUPAGE.fnEnter,           dw  FlashMenu_EnterMenuOrModifyItemVisibility
11    at  MENUPAGE.fnBack,            dw  MainMenu_EnterMenuOrModifyItemVisibility
12    at  MENUPAGE.wMenuitems,        dw  7
13iend
14
15g_MenuitemFlashBackToMainMenu:
16istruc MENUITEM
17    at  MENUITEM.fnActivate,        dw  MainMenu_EnterMenuOrModifyItemVisibility
18    at  MENUITEM.szName,            dw  g_szItemCfgBackToMain
19    at  MENUITEM.szQuickInfo,       dw  g_szItemCfgBackToMain
20    at  MENUITEM.szHelp,            dw  g_szItemCfgBackToMain
21    at  MENUITEM.bFlags,            db  FLG_MENUITEM_VISIBLE
22    at  MENUITEM.bType,             db  TYPE_MENUITEM_PAGEBACK
23iend
24
25g_MenuitemFlashStartFlashing:
26istruc MENUITEM
27    at  MENUITEM.fnActivate,        dw  StartFlashing
28    at  MENUITEM.szName,            dw  g_szItemFlashStart
29    at  MENUITEM.szQuickInfo,       dw  g_szNfoFlashStart
30    at  MENUITEM.szHelp,            dw  g_szNfoFlashStart
31    at  MENUITEM.bFlags,            db  FLG_MENUITEM_VISIBLE
32    at  MENUITEM.bType,             db  TYPE_MENUITEM_ACTION
33iend
34
35g_MenuitemFlashEepromType:
36istruc MENUITEM
37    at  MENUITEM.fnActivate,        dw  Menuitem_ActivateMultichoiceSelectionForMenuitemInDSSI
38    at  MENUITEM.fnFormatValue,     dw  MenuitemPrint_WriteLookupValueStringToBufferInESDIfromShiftedItemInDSSI
39    at  MENUITEM.szName,            dw  g_szItemFlashEepromType
40    at  MENUITEM.szQuickInfo,       dw  g_szNfoFlashEepromType
41    at  MENUITEM.szHelp,            dw  g_szNfoFlashEepromType
42    at  MENUITEM.bFlags,            db  FLG_MENUITEM_PROGRAMVAR | FLG_MENUITEM_BYTEVALUE | FLG_MENUITEM_VISIBLE
43    at  MENUITEM.bType,             db  TYPE_MENUITEM_MULTICHOICE
44    at  MENUITEM.itemValue + ITEM_VALUE.wRomvarsValueOffset,        dw  CFGVARS.bEepromType
45    at  MENUITEM.itemValue + ITEM_VALUE.szDialogTitle,              dw  g_szDlgFlashEepromType
46    at  MENUITEM.itemValue + ITEM_VALUE.szMultichoice,              dw  g_szMultichoiceEepromType
47    at  MENUITEM.itemValue + ITEM_VALUE.rgwChoiceToValueLookup,     dw  g_rgwChoiceToValueLookupForEepromType
48    at  MENUITEM.itemValue + ITEM_VALUE.rgszValueToStringLookup,    dw  g_rgszValueToStringLookupForEepromType
49iend
50
51g_MenuitemFlashSdpCommand:
52istruc MENUITEM
53    at  MENUITEM.fnActivate,        dw  Menuitem_ActivateMultichoiceSelectionForMenuitemInDSSI
54    at  MENUITEM.fnFormatValue,     dw  MenuitemPrint_WriteLookupValueStringToBufferInESDIfromShiftedItemInDSSI
55    at  MENUITEM.szName,            dw  g_szItemFlashSDP
56    at  MENUITEM.szQuickInfo,       dw  g_szNfoFlashSDP
57    at  MENUITEM.szHelp,            dw  g_szHelpFlashSDP
58    at  MENUITEM.bFlags,            db  FLG_MENUITEM_PROGRAMVAR | FLG_MENUITEM_BYTEVALUE | FLG_MENUITEM_VISIBLE
59    at  MENUITEM.bType,             db  TYPE_MENUITEM_MULTICHOICE
60    at  MENUITEM.itemValue + ITEM_VALUE.wRomvarsValueOffset,        dw  CFGVARS.bSdpCommand
61    at  MENUITEM.itemValue + ITEM_VALUE.szDialogTitle,              dw  g_szDlgFlashSDP
62    at  MENUITEM.itemValue + ITEM_VALUE.szMultichoice,              dw  g_szMultichoiceSdpCommand
63    at  MENUITEM.itemValue + ITEM_VALUE.rgwChoiceToValueLookup,     dw  g_rgwChoiceToValueLookupForSdpCommand
64    at  MENUITEM.itemValue + ITEM_VALUE.rgszValueToStringLookup,    dw  g_rgszValueToStringLookupForSdpCommand
65iend
66
67g_MenuitemFlashPageSize:
68istruc MENUITEM
69    at  MENUITEM.fnActivate,        dw  Menuitem_ActivateMultichoiceSelectionForMenuitemInDSSI
70    at  MENUITEM.fnFormatValue,     dw  MenuitemPrint_WriteLookupValueStringToBufferInESDIfromShiftedItemInDSSI
71    at  MENUITEM.szName,            dw  g_szItemFlashPageSize
72    at  MENUITEM.szQuickInfo,       dw  g_szNfoFlashPageSize
73    at  MENUITEM.szHelp,            dw  g_szHelpFlashPageSize
74    at  MENUITEM.bFlags,            db  FLG_MENUITEM_PROGRAMVAR | FLG_MENUITEM_BYTEVALUE | FLG_MENUITEM_VISIBLE
75    at  MENUITEM.bType,             db  TYPE_MENUITEM_MULTICHOICE
76    at  MENUITEM.itemValue + ITEM_VALUE.wRomvarsValueOffset,        dw  CFGVARS.bEepromPage
77    at  MENUITEM.itemValue + ITEM_VALUE.szDialogTitle,              dw  g_szDlgFlashPageSize
78    at  MENUITEM.itemValue + ITEM_VALUE.szMultichoice,              dw  g_szMultichoicePageSize
79    at  MENUITEM.itemValue + ITEM_VALUE.rgwChoiceToValueLookup,     dw  g_rgwChoiceToValueLookupForPageSize
80    at  MENUITEM.itemValue + ITEM_VALUE.rgszValueToStringLookup,    dw  g_rgszValueToStringLookupForPageSize
81iend
82
83g_MenuitemFlashEepromAddress:
84istruc MENUITEM
85    at  MENUITEM.fnActivate,        dw  Menuitem_ActivateHexInputForMenuitemInDSSI
86    at  MENUITEM.fnFormatValue,     dw  MenuitemPrint_WriteHexValueStringToBufferInESDIfromItemInDSSI
87    at  MENUITEM.szName,            dw  g_szItemFlashAddr
88    at  MENUITEM.szQuickInfo,       dw  g_szNfoFlashAddr
89    at  MENUITEM.szHelp,            dw  g_szNfoFlashAddr
90    at  MENUITEM.bFlags,            db  FLG_MENUITEM_PROGRAMVAR | FLG_MENUITEM_VISIBLE
91    at  MENUITEM.bType,             db  TYPE_MENUITEM_HEX
92    at  MENUITEM.itemValue + ITEM_VALUE.wRomvarsValueOffset,        dw  CFGVARS.wEepromSegment
93    at  MENUITEM.itemValue + ITEM_VALUE.szDialogTitle,              dw  g_szDlgFlashAddr
94    at  MENUITEM.itemValue + ITEM_VALUE.wMinValue,                  dw  0C000h
95    at  MENUITEM.itemValue + ITEM_VALUE.wMaxValue,                  dw  0F800h
96iend
97
98g_MenuitemFlashGenerateChecksum:
99istruc MENUITEM
100    at  MENUITEM.fnActivate,        dw  Menuitem_ActivateMultichoiceSelectionForMenuitemInDSSI
101    at  MENUITEM.fnFormatValue,     dw  MenuitemPrint_WriteLookupValueStringToBufferInESDIfromShiftedItemInDSSI
102    at  MENUITEM.szName,            dw  g_szItemFlashChecksum
103    at  MENUITEM.szQuickInfo,       dw  g_szNfoFlashChecksum
104    at  MENUITEM.szHelp,            dw  g_szHelpFlashChecksum
105    at  MENUITEM.bFlags,            db  FLG_MENUITEM_PROGRAMVAR | FLG_MENUITEM_VISIBLE | FLG_MENUITEM_FLAGVALUE
106    at  MENUITEM.bType,             db  TYPE_MENUITEM_MULTICHOICE
107    at  MENUITEM.itemValue + ITEM_VALUE.wRomvarsValueOffset,        dw  CFGVARS.wFlags
108    at  MENUITEM.itemValue + ITEM_VALUE.szDialogTitle,              dw  g_szDlgFlashChecksum
109    at  MENUITEM.itemValue + ITEM_VALUE.szMultichoice,              dw  g_szMultichoiceBooleanFlag
110    at  MENUITEM.itemValue + ITEM_VALUE.rgszValueToStringLookup,    dw  g_rgszValueToStringLookupForFlagBooleans
111    at  MENUITEM.itemValue + ITEM_VALUE.wValueBitmask,              dw  FLG_CFGVARS_CHECKSUM
112iend
113
114g_rgwChoiceToValueLookupForEepromType:
115    dw  EEPROM_TYPE.2816_2kiB
116    dw  EEPROM_TYPE.2864_8kiB
117    dw  EEPROM_TYPE.2864_8kiB_MOD
118    dw  EEPROM_TYPE.28256_32kiB
119    dw  EEPROM_TYPE.28512_64kiB
120g_rgszValueToStringLookupForEepromType:
121    dw  g_szValueFlash2816
122    dw  g_szValueFlash2864
123    dw  g_szValueFlash2864Mod
124    dw  g_szValueFlash28256
125    dw  g_szValueFlash28512
126
127g_rgwChoiceToValueLookupForSdpCommand:
128    dw  SDP_COMMAND.none
129    dw  SDP_COMMAND.enable
130    dw  SDP_COMMAND.disable
131g_rgszValueToStringLookupForSdpCommand:
132    dw  g_szValueFlashNone
133    dw  g_szValueFlashEnable
134    dw  g_szValueFlashDisable
135
136g_rgwChoiceToValueLookupForPageSize:
137    dw  EEPROM_PAGE.1_byte
138    dw  EEPROM_PAGE.2_bytes
139    dw  EEPROM_PAGE.4_bytes
140    dw  EEPROM_PAGE.8_bytes
141    dw  EEPROM_PAGE.16_bytes
142    dw  EEPROM_PAGE.32_bytes
143    dw  EEPROM_PAGE.64_bytes
144g_rgszValueToStringLookupForPageSize:
145    dw  g_szValueFlash1byte
146    dw  g_szValueFlash2bytes
147    dw  g_szValueFlash4bytes
148    dw  g_szValueFlash8bytes
149    dw  g_szValueFlash16bytes
150    dw  g_szValueFlash32bytes
151    dw  g_szValueFlash64bytes
152
153
154; Section containing code
155SECTION .text
156
157;--------------------------------------------------------------------
158; MainMenu_EnterMenuOrModifyItemVisibility
159;   Parameters:
160;       SS:BP:  Menu handle
161;   Returns:
162;       Nothing
163;   Corrupts registers:
164;       All, except BP
165;--------------------------------------------------------------------
166ALIGN JUMP_ALIGN
167FlashMenu_EnterMenuOrModifyItemVisibility:
168    push    cs
169    pop     ds
170
171    cmp     word [cs:g_cfgVars+CFGVARS.wEepromSegment], 0
172    jnz     .alreadySet
173
174    push    es
175    push    di
176    call    EEPROM_FindXtideUniversalBiosROMtoESDI
177    push    es
178    pop     ax
179    pop     di
180    pop     es
181    jc      .storeEepromSegment
182    mov     ax, DEFAULT_EEPROM_SEGMENT
183.storeEepromSegment:   
184    mov     word [cs:g_cfgVars+CFGVARS.wEepromSegment], ax
185       
186.alreadySet:   
187               
188    mov     si, g_MenupageForFlashMenu
189    jmp     Menupage_ChangeToNewMenupageInDSSI
190
191
192;--------------------------------------------------------------------
193; MENUITEM activation functions (.fnActivate)
194;   Parameters:
195;       SS:BP:  Ptr to MENU
196;   Returns:
197;       Nothing
198;   Corrupts registers:
199;       All, except segments
200;--------------------------------------------------------------------
201ALIGN JUMP_ALIGN
202StartFlashing:
203    call    .MakeSureThatImageFitsInEeprom
204    jc      SHORT .InvalidFlashingParameters
205    push    es
206    push    ds
207
208    call    .PrepareBuffersForFlashing
209    mov     cx, FLASHVARS_size + PROGRESS_DIALOG_IO_size
210    call    Memory_ReserveCXbytesFromStackToDSSI
211    call    .InitializeFlashvarsFromDSSI
212    mov     bx, si                          ; DS:BX now points to FLASHVARS
213    add     si, BYTE FLASHVARS_size         ; DS:SI now points to PROGRESS_DIALOG_IO
214    call    Dialogs_DisplayProgressDialogForFlashingWithDialogIoInDSSIandFlashvarsInDSBX
215    call    .DisplayFlashingResultsFromFlashvarsInDSBX
216
217    add     sp, BYTE FLASHVARS_size + PROGRESS_DIALOG_IO_size
218    pop     ds
219    pop     es
220.InvalidFlashingParameters:
221    ret
222
223;--------------------------------------------------------------------
224; .MakeSureThatImageFitsInEeprom
225;   Parameters:
226;       SS:BP:  Ptr to MENU
227;   Returns:
228;       CF:     Set if EEPROM too small
229;   Corrupts registers:
230;       AX, BX, DX
231;--------------------------------------------------------------------
232ALIGN JUMP_ALIGN
233.MakeSureThatImageFitsInEeprom:
234    call    .GetSelectedEepromSizeInWordsToAX
235    cmp     ax, [cs:g_cfgVars+CFGVARS.wImageSizeInWords]
236    jae     SHORT .ImageFitsInSelectedEeprom
237    mov     dx, g_szErrEepromTooSmall
238    call    Dialogs_DisplayErrorFromCSDX
239    stc
240ALIGN JUMP_ALIGN, ret
241.ImageFitsInSelectedEeprom:
242    ret
243
244;--------------------------------------------------------------------
245; .PrepareBuffersForFlashing
246;   Parameters:
247;       SS:BP:  Ptr to MENU
248;   Returns:
249;       Nothing
250;   Corrupts registers:
251;       AX, BX, CX, SI, DI
252;--------------------------------------------------------------------
253ALIGN JUMP_ALIGN
254.PrepareBuffersForFlashing:
255    call    EEPROM_LoadFromRomToRamComparisonBuffer
256    call    Buffers_AppendZeroesIfNeeded
257    test    WORD [cs:g_cfgVars+CFGVARS.wFlags], FLG_CFGVARS_CHECKSUM
258    jz      SHORT .DoNotGenerateChecksumByte
259    jmp     Buffers_GenerateChecksum
260.DoNotGenerateChecksumByte:
261    ret
262
263;--------------------------------------------------------------------
264; .InitializeFlashvarsFromDSSI
265;   Parameters:
266;       DS:SI:  Ptr to FLASHVARS to initialize
267;       SS:BP:  Ptr to MENU
268;   Returns:
269;       Nothing
270;   Corrupts registers:
271;       AX, BX, DX, DI, ES
272;--------------------------------------------------------------------
273ALIGN JUMP_ALIGN
274.InitializeFlashvarsFromDSSI:
275    call    Buffers_GetFileBufferToESDI
276    mov     [si+FLASHVARS.fpNextSourcePage], di
277    mov     [si+FLASHVARS.fpNextSourcePage+2], es
278
279    call    Buffers_GetFlashComparisonBufferToESDI
280    mov     [si+FLASHVARS.fpNextComparisonPage], di
281    mov     [si+FLASHVARS.fpNextComparisonPage+2], es
282
283    mov     ax, [cs:g_cfgVars+CFGVARS.wEepromSegment]
284    mov     WORD [si+FLASHVARS.fpNextDestinationPage], 0
285    mov     [si+FLASHVARS.fpNextDestinationPage+2], ax
286
287    mov     al, [cs:g_cfgVars+CFGVARS.bEepromType]
288    mov     [si+FLASHVARS.bEepromType], al
289
290    mov     al, [cs:g_cfgVars+CFGVARS.bSdpCommand]
291    mov     [si+FLASHVARS.bEepromSdpCommand], al
292
293    eMOVZX  bx, [cs:g_cfgVars+CFGVARS.bEepromPage]
294    mov     ax, [cs:bx+g_rgwEepromPageToSizeInBytes]
295    mov     [si+FLASHVARS.wEepromPageSize], ax
296
297    call    .GetNumberOfPagesToFlashToAX
298    mov     [si+FLASHVARS.wPagesToFlash], ax
299    ret
300
301;--------------------------------------------------------------------
302; .GetNumberOfPagesToFlashToAX
303;   Parameters:
304;       DS:SI:  Ptr to FLASHVARS to initialize
305;   Returns:
306;       AX:     Number of pages to flash (0 = 65536)
307;   Corrupts registers:
308;       BX, DX
309;--------------------------------------------------------------------
310ALIGN JUMP_ALIGN
311.GetNumberOfPagesToFlashToAX:
312    call    .GetSelectedEepromSizeInWordsToAX
313    xor     dx, dx
314    shl     ax, 1       ; Size in bytes to...
315    rcl     dx, 1       ; ...DX:AX
316
317    cmp     WORD [si+FLASHVARS.wEepromPageSize], BYTE 1
318    jbe     SHORT .PreventDivideException
319    div     WORD [si+FLASHVARS.wEepromPageSize]
320.PreventDivideException:
321    ret
322
323;--------------------------------------------------------------------
324; .GetSelectedEepromSizeInWordsToAX
325;   Parameters:
326;       Nothing
327;   Returns:
328;       AX:     Selected EEPROM size in WORDs
329;   Corrupts registers:
330;       BX
331;--------------------------------------------------------------------
332ALIGN JUMP_ALIGN
333.GetSelectedEepromSizeInWordsToAX:
334    eMOVZX  bx, [cs:g_cfgVars+CFGVARS.bEepromType]
335    mov     ax, [cs:bx+g_rgwEepromTypeToSizeInWords]
336    ret
337
338;--------------------------------------------------------------------
339; .DisplayFlashingResultsFromFlashvarsInDSBX
340;   Parameters:
341;       DS:BX:  Ptr to FLASHVARS
342;       SS:BP:  Ptr to MENU
343;   Returns:
344;       Nothing
345;   Corrupts registers:
346;       AX, BX, DX
347;--------------------------------------------------------------------
348ALIGN JUMP_ALIGN
349.DisplayFlashingResultsFromFlashvarsInDSBX:
350    eMOVZX  bx, [bx+FLASHVARS.flashResult]
351    jmp     [cs:bx+.rgfnFlashResultMessage]
352
353ALIGN WORD_ALIGN
354.rgfnFlashResultMessage:
355    dw      .DisplayFlashSuccessful
356    dw      .DisplayPollingError
357    dw      .DisplayDataVerifyError
358
359
360;--------------------------------------------------------------------
361; .DisplayPollingError
362; .DisplayDataVerifyError
363; .DisplayFlashSuccessful
364;   Parameters:
365;       SS:BP:  Ptr to MENU
366;   Returns:
367;       Nothing
368;   Corrupts registers:
369;       AX, DX, DI, ES
370;--------------------------------------------------------------------
371ALIGN JUMP_ALIGN
372.DisplayPollingError:
373    mov     dx, g_szErrEepromPolling
374    jmp     Dialogs_DisplayErrorFromCSDX
375
376ALIGN JUMP_ALIGN
377.DisplayDataVerifyError:
378    mov     dx, g_szErrEepromVerify
379    jmp     Dialogs_DisplayErrorFromCSDX
380
381ALIGN JUMP_ALIGN
382.DisplayFlashSuccessful:
383    call    Buffers_GetFileBufferToESDI
384    cmp     WORD [es:di+ROMVARS.wRomSign], 0AA55h   ; PC ROM?
385    je      SHORT .DisplayRebootMessageAndReboot
386    mov     dx, g_szForeignFlash
387    jmp     Dialogs_DisplayNotificationFromCSDX
388ALIGN JUMP_ALIGN
389.DisplayRebootMessageAndReboot:
390    mov     dx, g_szPCFlashSuccessful
391    call    Dialogs_DisplayNotificationFromCSDX
392    xor     ax, ax          ; Cold boot flag
393    jmp     Reboot_ComputerWithBootFlagInAX
Note: See TracBrowser for help on using the repository browser.