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

Last change on this file since 620 was 620, checked in by Krister Nordvall, 4 years ago

Changes:

  • A huge thank you to Jayeson Lee-Steere for adding SST39SF0x0 flash ROM programming support to the configurator (XTIDECFG.COM). This means that there is no longer a need to use a separate program for flashing the Lo-Tech boards and other devices using these flash ROMs.
File size: 16.1 KB
Line 
1; Project name : XTIDE Universal BIOS Configurator v2
2; Description : "Flash EEPROM" menu structs and functions.
3
4;
5; XTIDE Universal BIOS and Associated Tools
6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
7;
8; This program is free software; you can redistribute it and/or modify
9; it under the terms of the GNU General Public License as published by
10; the Free Software Foundation; either version 2 of the License, or
11; (at your option) any later version.
12;
13; This program is distributed in the hope that it will be useful,
14; but WITHOUT ANY WARRANTY; without even the implied warranty of
15; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16; GNU General Public License for more details.
17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
18;
19
20; Section containing initialized data
21SECTION .data
22
23ALIGN WORD_ALIGN
24g_MenupageForFlashMenu:
25istruc MENUPAGE
26 at MENUPAGE.fnEnter, dw FlashMenu_EnterMenuOrModifyItemVisibility
27 at MENUPAGE.fnBack, dw MainMenu_EnterMenuOrModifyItemVisibility
28 at MENUPAGE.wMenuitems, dw 7
29iend
30
31g_MenuitemFlashBackToMainMenu:
32istruc MENUITEM
33 at MENUITEM.fnActivate, dw MainMenu_EnterMenuOrModifyItemVisibility
34 at MENUITEM.szName, dw g_szItemCfgBackToMain
35 at MENUITEM.szQuickInfo, dw g_szItemCfgBackToMain
36 at MENUITEM.szHelp, dw g_szItemCfgBackToMain
37 at MENUITEM.bFlags, db FLG_MENUITEM_VISIBLE
38 at MENUITEM.bType, db TYPE_MENUITEM_PAGEBACK
39iend
40
41g_MenuitemFlashStartFlashing:
42istruc MENUITEM
43 at MENUITEM.fnActivate, dw StartFlashing
44 at MENUITEM.szName, dw g_szItemFlashStart
45 at MENUITEM.szQuickInfo, dw g_szNfoFlashStart
46 at MENUITEM.szHelp, dw g_szNfoFlashStart
47 at MENUITEM.bFlags, db FLG_MENUITEM_VISIBLE
48 at MENUITEM.bType, db TYPE_MENUITEM_ACTION
49iend
50
51g_MenuitemFlashEepromType:
52istruc MENUITEM
53 at MENUITEM.fnActivate, dw Menuitem_ActivateMultichoiceSelectionForMenuitemInDSSI
54 at MENUITEM.fnFormatValue, dw MenuitemPrint_WriteLookupValueStringToBufferInESDIfromShiftedItemInDSSI
55 at MENUITEM.szName, dw g_szItemFlashEepromType
56 at MENUITEM.szQuickInfo, dw g_szNfoFlashEepromType
57 at MENUITEM.szHelp, dw g_szNfoFlashEepromType
58 at MENUITEM.bFlags, db FLG_MENUITEM_MODIFY_MENU | 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.bEepromType
61 at MENUITEM.itemValue + ITEM_VALUE.szDialogTitle, dw g_szDlgFlashEepromType
62 at MENUITEM.itemValue + ITEM_VALUE.szMultichoice, dw g_szMultichoiceEepromType
63 at MENUITEM.itemValue + ITEM_VALUE.rgwChoiceToValueLookup, dw g_rgwChoiceToValueLookupForEepromType
64 at MENUITEM.itemValue + ITEM_VALUE.rgszValueToStringLookup, dw g_rgszValueToStringLookupForEepromType
65iend
66
67g_MenuitemFlashSdpCommand:
68istruc MENUITEM
69 at MENUITEM.fnActivate, dw Menuitem_ActivateMultichoiceSelectionForMenuitemInDSSI
70 at MENUITEM.fnFormatValue, dw MenuitemPrint_WriteLookupValueStringToBufferInESDIfromShiftedItemInDSSI
71 at MENUITEM.szName, dw g_szItemFlashSDP
72 at MENUITEM.szQuickInfo, dw g_szNfoFlashSDP
73 at MENUITEM.szHelp, dw g_szHelpFlashSDP
74 at MENUITEM.bFlags, db FLG_MENUITEM_PROGRAMVAR | FLG_MENUITEM_BYTEVALUE
75 at MENUITEM.bType, db TYPE_MENUITEM_MULTICHOICE
76 at MENUITEM.itemValue + ITEM_VALUE.wRomvarsValueOffset, dw CFGVARS.bSdpCommand
77 at MENUITEM.itemValue + ITEM_VALUE.szDialogTitle, dw g_szDlgFlashSDP
78 at MENUITEM.itemValue + ITEM_VALUE.szMultichoice, dw g_szMultichoiceSdpCommand
79 at MENUITEM.itemValue + ITEM_VALUE.rgwChoiceToValueLookup, dw g_rgwChoiceToValueLookupForSdpCommand
80 at MENUITEM.itemValue + ITEM_VALUE.rgszValueToStringLookup, dw g_rgszValueToStringLookupForSdpCommand
81iend
82
83g_MenuitemFlashPageSize:
84istruc MENUITEM
85 at MENUITEM.fnActivate, dw Menuitem_ActivateMultichoiceSelectionForMenuitemInDSSI
86 at MENUITEM.fnFormatValue, dw MenuitemPrint_WriteLookupValueStringToBufferInESDIfromShiftedItemInDSSI
87 at MENUITEM.szName, dw g_szItemFlashPageSize
88 at MENUITEM.szQuickInfo, dw g_szNfoFlashPageSize
89 at MENUITEM.szHelp, dw g_szHelpFlashPageSize
90 at MENUITEM.bFlags, db FLG_MENUITEM_PROGRAMVAR | FLG_MENUITEM_BYTEVALUE
91 at MENUITEM.bType, db TYPE_MENUITEM_MULTICHOICE
92 at MENUITEM.itemValue + ITEM_VALUE.wRomvarsValueOffset, dw CFGVARS.bEepromPage
93 at MENUITEM.itemValue + ITEM_VALUE.szDialogTitle, dw g_szDlgFlashPageSize
94 at MENUITEM.itemValue + ITEM_VALUE.szMultichoice, dw g_szMultichoicePageSize
95 at MENUITEM.itemValue + ITEM_VALUE.rgwChoiceToValueLookup, dw g_rgwChoiceToValueLookupForPageSize
96 at MENUITEM.itemValue + ITEM_VALUE.rgszValueToStringLookup, dw g_rgszValueToStringLookupForPageSize
97iend
98
99g_MenuitemFlashEepromAddress:
100istruc MENUITEM
101 at MENUITEM.fnActivate, dw Menuitem_ActivateHexInputForMenuitemInDSSI
102 at MENUITEM.fnFormatValue, dw MenuitemPrint_WriteHexValueStringToBufferInESDIfromItemInDSSI
103 at MENUITEM.szName, dw g_szItemFlashAddr
104 at MENUITEM.szQuickInfo, dw g_szNfoFlashAddr
105 at MENUITEM.szHelp, dw g_szNfoFlashAddr
106 at MENUITEM.bFlags, db FLG_MENUITEM_PROGRAMVAR | FLG_MENUITEM_VISIBLE
107 at MENUITEM.bType, db TYPE_MENUITEM_HEX
108 at MENUITEM.itemValue + ITEM_VALUE.wRomvarsValueOffset, dw CFGVARS.wEepromSegment
109 at MENUITEM.itemValue + ITEM_VALUE.szDialogTitle, dw g_szDlgFlashAddr
110 at MENUITEM.itemValue + ITEM_VALUE.wMinValue, dw 0C000h
111 at MENUITEM.itemValue + ITEM_VALUE.wMaxValue, dw 0F800h
112iend
113
114g_MenuitemFlashGenerateChecksum:
115istruc MENUITEM
116 at MENUITEM.fnActivate, dw Menuitem_ActivateMultichoiceSelectionForMenuitemInDSSI
117 at MENUITEM.fnFormatValue, dw MenuitemPrint_WriteLookupValueStringToBufferInESDIfromShiftedItemInDSSI
118 at MENUITEM.szName, dw g_szItemFlashChecksum
119 at MENUITEM.szQuickInfo, dw g_szNfoFlashChecksum
120 at MENUITEM.szHelp, dw g_szHelpFlashChecksum
121 at MENUITEM.bFlags, db FLG_MENUITEM_PROGRAMVAR | FLG_MENUITEM_VISIBLE | FLG_MENUITEM_FLAGVALUE
122 at MENUITEM.bType, db TYPE_MENUITEM_MULTICHOICE
123 at MENUITEM.itemValue + ITEM_VALUE.wRomvarsValueOffset, dw CFGVARS.wFlags
124 at MENUITEM.itemValue + ITEM_VALUE.szDialogTitle, dw g_szDlgFlashChecksum
125 at MENUITEM.itemValue + ITEM_VALUE.szMultichoice, dw g_szMultichoiceBooleanFlag
126 at MENUITEM.itemValue + ITEM_VALUE.rgszValueToStringLookup, dw g_rgszValueToStringLookupForFlagBooleans
127 at MENUITEM.itemValue + ITEM_VALUE.wValueBitmask, dw FLG_CFGVARS_CHECKSUM
128iend
129
130g_rgwChoiceToValueLookupForEepromType:
131 dw EEPROM_TYPE.2816_2kiB
132 dw EEPROM_TYPE.2864_8kiB
133 dw EEPROM_TYPE.2864_8kiB_MOD
134 dw EEPROM_TYPE.28256_32kiB
135 dw EEPROM_TYPE.28512_64kiB
136 dw EEPROM_TYPE.SST_39SF
137
138g_rgszValueToStringLookupForEepromType:
139 dw g_szValueFlash2816
140 dw g_szValueFlash2864
141 dw g_szValueFlash2864Mod
142 dw g_szValueFlash28256
143 dw g_szValueFlash28512
144 dw g_szValueFlashSST39SF
145
146g_rgwChoiceToValueLookupForSdpCommand:
147 dw SDP_COMMAND.none
148 dw SDP_COMMAND.enable
149 dw SDP_COMMAND.disable
150g_rgszValueToStringLookupForSdpCommand:
151 dw g_szValueFlashNone
152 dw g_szValueFlashEnable
153 dw g_szValueFlashDisable
154
155g_rgwChoiceToValueLookupForPageSize:
156 dw EEPROM_PAGE.1_byte
157 dw EEPROM_PAGE.2_bytes
158 dw EEPROM_PAGE.4_bytes
159 dw EEPROM_PAGE.8_bytes
160 dw EEPROM_PAGE.16_bytes
161 dw EEPROM_PAGE.32_bytes
162 dw EEPROM_PAGE.64_bytes
163g_rgszValueToStringLookupForPageSize:
164 dw g_szValueFlash1byte
165 dw g_szValueFlash2bytes
166 dw g_szValueFlash4bytes
167 dw g_szValueFlash8bytes
168 dw g_szValueFlash16bytes
169 dw g_szValueFlash32bytes
170 dw g_szValueFlash64bytes
171
172
173; Section containing code
174SECTION .text
175
176;--------------------------------------------------------------------
177; MainMenu_EnterMenuOrModifyItemVisibility
178; Parameters:
179; SS:BP: Menu handle
180; Returns:
181; Nothing
182; Corrupts registers:
183; All, except BP
184;--------------------------------------------------------------------
185ALIGN JUMP_ALIGN
186FlashMenu_EnterMenuOrModifyItemVisibility:
187 push cs
188 pop ds
189
190 cmp WORD [g_cfgVars+CFGVARS.wEepromSegment], 0
191 jne SHORT .AlreadySet
192
193 push es
194 push di
195 call EEPROM_FindXtideUniversalBiosROMtoESDI
196 mov ax, es
197 pop di
198 pop es
199 jnc SHORT .StoreEepromSegment
200 mov ax, DEFAULT_EEPROM_SEGMENT
201.StoreEepromSegment:
202 mov [g_cfgVars+CFGVARS.wEepromSegment], ax
203
204.AlreadySet:
205 mov si, g_MenupageForFlashMenu
206 ePUSH_T bx, Menupage_ChangeToNewMenupageInDSSI
207 cmp WORD [g_cfgVars+CFGVARS.bEepromType], EEPROM_TYPE.SST_39SF
208 jz SHORT .DisableMenuitemsUnusedBySstFlash
209 ; Fall to .EnableMenuitemsUnusedBySstFlash
210
211;--------------------------------------------------------------------
212; .EnableMenuitemsUnusedBySstFlash
213; Parameters:
214; SS:BP: Menu handle
215; Returns:
216; Nothing
217; Corrupts registers:
218; AX, BX
219;--------------------------------------------------------------------
220ALIGN JUMP_ALIGN
221.EnableMenuitemsUnusedBySstFlash:
222 mov bx, g_MenuitemFlashSdpCommand
223 call EnableMenuitemFromCSBX
224 mov bx, g_MenuitemFlashPageSize
225 jmp EnableMenuitemFromCSBX
226
227;--------------------------------------------------------------------
228; .DisableMenuitemsUnusedBySstFlash
229; Parameters:
230; SS:BP: Menu handle
231; Returns:
232; Nothing
233; Corrupts registers:
234; AX, BX
235;--------------------------------------------------------------------
236ALIGN JUMP_ALIGN
237.DisableMenuitemsUnusedBySstFlash:
238 mov bx, g_MenuitemFlashSdpCommand
239 call DisableMenuitemFromCSBX
240 mov bx, g_MenuitemFlashPageSize
241 jmp DisableMenuitemFromCSBX
242
243;--------------------------------------------------------------------
244; MENUITEM activation functions (.fnActivate)
245; Parameters:
246; SS:BP: Ptr to MENU
247; Returns:
248; Nothing
249; Corrupts registers:
250; All, except segments
251;--------------------------------------------------------------------
252ALIGN JUMP_ALIGN
253StartFlashing:
254 call .MakeSureThatImageFitsInEeprom
255 jc SHORT .InvalidFlashingParameters
256 cmp WORD [cs:g_cfgVars+CFGVARS.bEepromType], EEPROM_TYPE.SST_39SF
257 jnz SHORT .SkipAlignmentCheck
258 call .MakeSureAddress32KAligned
259 jc SHORT .InvalidFlashingParameters
260.SkipAlignmentCheck:
261 push es
262 push ds
263
264 call .PrepareBuffersForFlashing
265 mov cl, FLASHVARS_size + PROGRESS_DIALOG_IO_size
266 call Memory_ReserveCLbytesFromStackToDSSI
267 call .InitializeFlashvarsFromDSSI
268 mov bx, si ; DS:BX now points to FLASHVARS
269 cmp WORD [cs:g_cfgVars+CFGVARS.bEepromType], EEPROM_TYPE.SST_39SF
270 jz SHORT .FlashWithoutProgressBar
271 add si, BYTE FLASHVARS_size ; DS:SI now points to PROGRESS_DIALOG_IO
272 call Dialogs_DisplayProgressDialogForFlashingWithDialogIoInDSSIandFlashvarsInDSBX
273.FlashComplete:
274 call .DisplayFlashingResultsFromFlashvarsInDSBX
275
276 add sp, BYTE FLASHVARS_size + PROGRESS_DIALOG_IO_size
277 pop ds
278 pop es
279.InvalidFlashingParameters:
280 ret
281
282.FlashWithoutProgressBar: ; Worst case. SST devices will
283 call FlashSst_WithFlashvarsInDSBX ; either complete flashing
284 jmp SHORT .FlashComplete ; or timeout within 2 seconds.
285
286;--------------------------------------------------------------------
287; .MakeSureThatImageFitsInEeprom
288; Parameters:
289; SS:BP: Ptr to MENU
290; Returns:
291; CF: Set if EEPROM too small
292; Corrupts registers:
293; AX, BX, DX
294;--------------------------------------------------------------------
295ALIGN JUMP_ALIGN
296.MakeSureThatImageFitsInEeprom:
297 call Buffers_GetSelectedEepromSizeInWordsToAX
298 cmp ax, [cs:g_cfgVars+CFGVARS.wImageSizeInWords]
299 jae SHORT .ImageFitsInSelectedEeprom
300 mov dx, g_szErrEepromTooSmall
301 call Dialogs_DisplayErrorFromCSDX
302 stc
303ALIGN JUMP_ALIGN, ret
304.ImageFitsInSelectedEeprom:
305.AlignmentIs32K:
306.DoNotGenerateChecksumByte:
307 ret
308
309;--------------------------------------------------------------------
310; .MakeSureAddress32KAligned
311; Parameters:
312; SS:BP: Ptr to MENU
313; Returns:
314; CF: Set if EEPROM segment is not 32K aligned
315; Corrupts registers:
316; AX, BX, DX
317;--------------------------------------------------------------------
318ALIGN JUMP_ALIGN
319.MakeSureAddress32KAligned:
320 mov ax, [cs:g_cfgVars+CFGVARS.wEepromSegment]
321 and ax, 007FFh
322 jz SHORT .AlignmentIs32K
323 mov dx, g_szErrAddrNot32KAligned
324 call Dialogs_DisplayErrorFromCSDX
325 stc
326 ret
327
328;--------------------------------------------------------------------
329; .PrepareBuffersForFlashing
330; Parameters:
331; SS:BP: Ptr to MENU
332; Returns:
333; Nothing
334; Corrupts registers:
335; AX, BX, CX, SI, DI
336;--------------------------------------------------------------------
337ALIGN JUMP_ALIGN
338.PrepareBuffersForFlashing:
339 call EEPROM_LoadFromRomToRamComparisonBuffer
340 call Buffers_AppendZeroesIfNeeded
341 test BYTE [cs:g_cfgVars+CFGVARS.wFlags], FLG_CFGVARS_CHECKSUM
342 jz SHORT .DoNotGenerateChecksumByte
343 jmp Buffers_GenerateChecksum
344
345;--------------------------------------------------------------------
346; .InitializeFlashvarsFromDSSI
347; Parameters:
348; DS:SI: Ptr to FLASHVARS to initialize
349; SS:BP: Ptr to MENU
350; Returns:
351; Nothing
352; Corrupts registers:
353; AX, BX, DX, DI, ES
354;--------------------------------------------------------------------
355ALIGN JUMP_ALIGN
356.InitializeFlashvarsFromDSSI:
357 call Buffers_GetFileBufferToESDI
358 mov [si+FLASHVARS.fpNextSourcePage], di
359 mov [si+FLASHVARS.fpNextSourcePage+2], es
360
361 call Buffers_GetFlashComparisonBufferToESDI
362 mov [si+FLASHVARS.fpNextComparisonPage], di
363 mov [si+FLASHVARS.fpNextComparisonPage+2], es
364
365 mov ax, [cs:g_cfgVars+CFGVARS.wEepromSegment]
366 mov WORD [si+FLASHVARS.fpNextDestinationPage], 0
367 mov [si+FLASHVARS.fpNextDestinationPage+2], ax
368
369 mov al, [cs:g_cfgVars+CFGVARS.bEepromType]
370 mov [si+FLASHVARS.bEepromType], al
371
372 mov al, [cs:g_cfgVars+CFGVARS.bSdpCommand]
373 mov [si+FLASHVARS.bEepromSdpCommand], al
374
375 mov ax, SST_PAGE_SIZE
376 cmp WORD [g_cfgVars+CFGVARS.bEepromType], EEPROM_TYPE.SST_39SF
377 jz SHORT .UseSstPageSize
378
379 eMOVZX bx, [cs:g_cfgVars+CFGVARS.bEepromPage]
380 mov ax, [cs:bx+g_rgwEepromPageToSizeInBytes]
381.UseSstPageSize:
382 mov [si+FLASHVARS.wEepromPageSize], ax
383
384 call .GetNumberOfPagesToFlashToAX
385 mov [si+FLASHVARS.wPagesToFlash], ax
386 ret
387
388;--------------------------------------------------------------------
389; .GetNumberOfPagesToFlashToAX
390; Parameters:
391; DS:SI: Ptr to FLASHVARS to initialize
392; Returns:
393; AX: Number of pages to flash (0 = 65536)
394; Corrupts registers:
395; BX, DX
396;--------------------------------------------------------------------
397ALIGN JUMP_ALIGN
398.GetNumberOfPagesToFlashToAX:
399 call Buffers_GetSelectedEepromSizeInWordsToAX
400 xor dx, dx
401 eSHL_IM ax, 1 ; Size in bytes to...
402 eRCL_IM dx, 1 ; ...DX:AX
403
404 cmp WORD [si+FLASHVARS.wEepromPageSize], BYTE 1
405 jbe SHORT .PreventDivideException
406 div WORD [si+FLASHVARS.wEepromPageSize]
407.PreventDivideException:
408 ret
409
410;--------------------------------------------------------------------
411; .DisplayFlashingResultsFromFlashvarsInDSBX
412; Parameters:
413; DS:BX: Ptr to FLASHVARS
414; SS:BP: Ptr to MENU
415; Returns:
416; Nothing
417; Corrupts registers:
418; AX, BX, DX
419;--------------------------------------------------------------------
420ALIGN JUMP_ALIGN
421.DisplayFlashingResultsFromFlashvarsInDSBX:
422 eMOVZX bx, [bx+FLASHVARS.flashResult]
423 jmp [cs:bx+.rgfnFlashResultMessage]
424
425ALIGN WORD_ALIGN
426.rgfnFlashResultMessage:
427 dw .DisplayFlashSuccessful
428 dw .DisplayDeviceDetectionError
429 dw .DisplayPollingError
430 dw .DisplayDataVerifyError
431
432
433;--------------------------------------------------------------------
434; .DisplayDeviceDetectionError
435; .DisplayPollingError
436; .DisplayDataVerifyError
437; .DisplayFlashSuccessful
438; Parameters:
439; SS:BP: Ptr to MENU
440; Returns:
441; Nothing
442; Corrupts registers:
443; AX, DX, DI, ES
444;--------------------------------------------------------------------
445ALIGN JUMP_ALIGN
446.DisplayDeviceDetectionError:
447 mov dx, g_szErrEepromDetection
448 jmp Dialogs_DisplayErrorFromCSDX
449
450ALIGN JUMP_ALIGN
451.DisplayPollingError:
452 mov dx, g_szErrEepromPolling
453 jmp Dialogs_DisplayErrorFromCSDX
454
455ALIGN JUMP_ALIGN
456.DisplayDataVerifyError:
457 mov dx, g_szErrEepromVerify
458 jmp Dialogs_DisplayErrorFromCSDX
459
460ALIGN JUMP_ALIGN
461.DisplayFlashSuccessful:
462 call Buffers_GetFileBufferToESDI
463 cmp WORD [es:di+ROMVARS.wRomSign], 0AA55h ; PC ROM?
464 je SHORT .DisplayRebootMessageAndReboot
465 mov dx, g_szForeignFlash
466 jmp Dialogs_DisplayNotificationFromCSDX
467ALIGN JUMP_ALIGN
468.DisplayRebootMessageAndReboot:
469 mov dx, g_szPCFlashSuccessful
470 call Dialogs_DisplayNotificationFromCSDX
471 xor ax, ax ; Cold boot flag
472 jmp Reboot_ComputerWithBootFlagInAX
Note: See TracBrowser for help on using the repository browser.