source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS_Configurator_v2/Src/Flash.asm@ 592

Last change on this file since 592 was 592, checked in by Krister Nordvall, 7 years ago

Changes:

  • The problem with NASM in the previous revision (r591) has been fixed.
  • The colors used by the boot menu and hotkey bar can now be customized by selecting one of a number of pre-defined color themes. Suggestions for additional themes are more than welcome!
  • Large builds are now 10 KB. Small builds are still 8 KB with the exception of the Tiny build which is now 4 KB. In other words, builds are now as small as possible to make it easier to combine them with other BIOSes.
  • Added code to the library to improve drive error handling. XTIDECFG can now handle "Drive Not Ready" errors.
  • Fixed a couple of potential bugs in AtaID.asm (AtaID_GetMaxPioModeToAXandMinCycleTimeToCX); 1) ATA1.bPioMode was treated as a WORD variable. 2) ATA2.bPIOSupp was assumed to be non-zero which would result in PIO mode 3 being returned if the assumption was wrong.
  • Made the same changes in the equivalent function used by BIOSDRVS (DisplayPioModeInformationUsingAtaInfoFromDSBX in AtaInfo.asm).
  • Fixed a bug from r587 in PDC20x30.asm in PDC20x30_GetMaxPioModeToALandMinPioCycleTimeToBX.
  • Fixed a bug from r523 in XTIDECFG where Auto Configure would only set the IRQ on one IDE interface on AT-builds.
  • XTIDECFG will now restore the default settings for the "Serial port virtual device" when reselecting it in the list of device types. This makes it behave consistently for all device types.
  • The eAAM macro is now used regardless if USE_UNDOC_INTEL is defined or not because it is apparently supported on all processors including the NEC V20/V30 CPUs.
  • Renamed the EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS define to EXCLUDE_FROM_XUB.
  • Added a define to exclude unused library code from BIOSDRVS (EXCLUDE_FROM_BIOSDRVS). This makes it a lot smaller than in previous revisions.
  • All unnecessary CLD-instructions are now under a new define 'CLD_NEEDED' which is only enabled for the BIOS. It is disabled for XTIDECFG and BIOSDRVS but can be enabled if needed by adding this define to the respective makefile. This change was made because these unnecessary instructions are wasteful and should never be needed. In fact, they only serve to hide bugs (in other peoples code) which I strongly believe should be avoided. I recommend people making their own BIOSes from source to not use this define as it's extremely unlikely to be needed.
  • Updated the copyright info in SerDrive and changed an URL to point to the new site.
  • Updated the copyright info and version number in BIOSDRVS.
  • Updated the copyright info in XTIDECFG.
  • Optimizations in general.
File size: 10.9 KB
Line 
1; Project name : XTIDE Universal BIOS Configurator v2
2; Description : Functions for flashing the EEPROM.
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 code
21SECTION .text
22
23;--------------------------------------------------------------------
24; Flash_EepromWithFlashvarsInDSSI
25; Parameters:
26; DS:SI: Ptr to FLASHVARS
27; Returns:
28; FLASHVARS.flashResult
29; Corrupts registers:
30; All, including segments
31;--------------------------------------------------------------------
32ALIGN JUMP_ALIGN
33Flash_EepromWithFlashvarsInDSSI:
34 mov [si+FLASHVARS.wProgressUpdateParam], bp ; Store handle to progress DIALOG
35 mov bp, si ; Flashvars now in SS:BP
36 mov cx, [bp+FLASHVARS.wPagesToFlash]
37ALIGN JUMP_ALIGN
38.FlashNextPage:
39 call DisplayFlashProgressWithPagesLeftInCXandFlashvarsInSSBP
40 call Flash_SinglePageWithFlashvarsInSSBP
41 jc SHORT .PollingError
42 call AreSourceAndDestinationPagesEqualFromFlashvarsInSSBP
43 jne SHORT .DataVerifyError
44
45 mov ax, [bp+FLASHVARS.wEepromPageSize]
46 add [bp+FLASHVARS.fpNextSourcePage], ax
47 add [bp+FLASHVARS.fpNextComparisonPage], ax
48 add [bp+FLASHVARS.fpNextDestinationPage], ax
49
50 loop .FlashNextPage
51%ifndef CHECK_FOR_UNUSED_ENTRYPOINTS
52%if FLASH_RESULT.success = 0 ; Just in case this should ever change
53 mov [bp+FLASHVARS.flashResult], cl
54%else
55 mov BYTE [bp+FLASHVARS.flashResult], FLASH_RESULT.success
56%endif
57%endif
58 ret
59
60.PollingError:
61 mov BYTE [bp+FLASHVARS.flashResult], FLASH_RESULT.PollingTimeoutError
62 ret
63.DataVerifyError:
64 mov BYTE [bp+FLASHVARS.flashResult], FLASH_RESULT.DataVerifyError
65 ret
66
67
68;--------------------------------------------------------------------
69; Flash_SinglePageWithFlashvarsInSSBP
70; Parameters:
71; SS:BP: Ptr to FLASHVARS
72; Returns:
73; CF: Set if polling timeout error
74; Cleared if page written successfully
75; Corrupts registers:
76; AX, BX, DX, SI, DI, DS, ES
77;--------------------------------------------------------------------
78ALIGN JUMP_ALIGN
79Flash_SinglePageWithFlashvarsInSSBP:
80%ifdef CLD_NEEDED
81 cld
82%endif
83 call AreSourceAndDestinationPagesEqualFromFlashvarsInSSBP
84 je SHORT .NoNeedToFlashThePage ; CF cleared
85
86 push cx
87 call .GetSdpCommandFunctionToAXwithFlashvarsInSSBP
88 mov cx, [bp+FLASHVARS.wEepromPageSize]
89 mov si, [bp+FLASHVARS.fpNextSourcePage]
90 les di, [bp+FLASHVARS.fpNextComparisonPage]
91 mov bx, [bp+FLASHVARS.fpNextDestinationPage]
92 call WriteAllChangedBytesFromPageToEeprom
93 pop cx
94.NoNeedToFlashThePage:
95 ret
96
97;--------------------------------------------------------------------
98; .GetSdpCommandFunctionToAXwithFlashvarsInSSBP
99; Parameters:
100; SS:BP: Ptr to FLASHVARS
101; Returns:
102; AX: Ptr to SDP Command function
103; Corrupts registers:
104; BX, SI
105;--------------------------------------------------------------------
106ALIGN JUMP_ALIGN
107.GetSdpCommandFunctionToAXwithFlashvarsInSSBP:
108 eMOVZX bx, [bp+FLASHVARS.bEepromSdpCommand]
109 mov si, [cs:bx+.rgpSdpCommandToEepromTypeLookupTable]
110 mov bl, [bp+FLASHVARS.bEepromType]
111 mov ax, [cs:bx+si]
112 ret
113
114ALIGN WORD_ALIGN
115.rgpSdpCommandToEepromTypeLookupTable:
116 dw .rgfnFlashWithoutSDP ; SDP_COMMAND.none
117 dw .rgfnEnableSdpAndFlash ; SDP_COMMAND.enable
118 dw .rgfnDisableSdpAndFlash ; SDP_COMMAND.disable
119.rgfnFlashWithoutSDP: ; SDP_COMMAND.none
120 dw DoNotWriteAnySdpCommand ; EEPROM_TYPE.2816_2kiB
121 dw DoNotWriteAnySdpCommand ; EEPROM_TYPE.2864_8kiB
122 dw DoNotWriteAnySdpCommand ; EEPROM_TYPE.2864_8kiB_MOD
123 dw DoNotWriteAnySdpCommand ; EEPROM_TYPE.28256_32kiB
124 dw DoNotWriteAnySdpCommand ; EEPROM_TYPE.28512_64kiB
125.rgfnEnableSdpAndFlash: ; SDP_COMMAND.enable
126 dw WriteSdpEnableCommandFor2816 ; EEPROM_TYPE.2816_2kiB
127 dw WriteSdpEnableCommandFor2864 ; EEPROM_TYPE.2864_8kiB
128 dw WriteSdpEnableCommandFor2864mod ; EEPROM_TYPE.2864_8kiB_MOD
129 dw WriteSdpEnableCommandFor28256or28512 ; EEPROM_TYPE.28256_32kiB
130 dw WriteSdpEnableCommandFor28256or28512 ; EEPROM_TYPE.28512_64kiB
131.rgfnDisableSdpAndFlash: ; SDP_COMMAND.disable
132 dw WriteSdpDisableCommandFor2816 ; EEPROM_TYPE.2816_2kiB
133 dw WriteSdpDisableCommandFor2864 ; EEPROM_TYPE.2864_8kiB
134 dw WriteSdpDisableCommandFor2864mod ; EEPROM_TYPE.2864_8kiB_MOD
135 dw WriteSdpDisableCommandFor28256or28512 ; EEPROM_TYPE.28256_32kiB
136 dw WriteSdpDisableCommandFor28256or28512 ; EEPROM_TYPE.28512_64kiB
137
138
139;--------------------------------------------------------------------
140; AreSourceAndDestinationPagesEqualFromFlashvarsInSSBP
141; Parameters:
142; SS:BP: Ptr to FLASHVARS
143; Returns:
144; ZF: Set if pages are equal
145; Cleared if pages are not equal
146; Corrupts registers:
147; SI, DI
148;--------------------------------------------------------------------
149ALIGN JUMP_ALIGN
150AreSourceAndDestinationPagesEqualFromFlashvarsInSSBP:
151 push cx
152 mov cx, [bp+FLASHVARS.wEepromPageSize]
153 lds si, [bp+FLASHVARS.fpNextSourcePage]
154 les di, [bp+FLASHVARS.fpNextDestinationPage]
155 repe cmpsb
156 pop cx
157 ret
158
159
160;--------------------------------------------------------------------
161; ENABLE_SDP
162; Parameters:
163; %1: Offset for first command byte
164; %2: Offset for second command byte
165; DS: Segment to beginning of EEPROM
166; Returns:
167; Nothing
168; Corrupts registers:
169; Nothing
170;--------------------------------------------------------------------
171%macro ENABLE_SDP 2
172 mov BYTE [%1], 0AAh
173 mov BYTE [%2], 55h
174 mov BYTE [%1], 0A0h
175%endmacro
176
177;--------------------------------------------------------------------
178; DISABLE_SDP
179; Parameters:
180; %1: Offset for first command byte
181; %2: Offset for second command byte
182; DS: Segment to beginning of EEPROM
183; Returns:
184; Nothing
185; Corrupts registers:
186; AX
187;--------------------------------------------------------------------
188%macro DISABLE_SDP 2
189 mov ax, 80AAh
190%%Again:
191 mov [%1], al ; 0AAh
192 shr al, 1
193 mov [%2], al ; 55h
194 mov [%1], ah ; 80h/20h
195 xor ax, 0A0FFh
196 jns SHORT %%Again
197%endmacro
198
199;--------------------------------------------------------------------
200; SDP Command Functions
201; Parameters:
202; DS: Segment to beginning of EEPROM
203; Returns:
204; Nothing but jumps to WriteActualDataByteAfterSdpCommand
205; Corrupts registers:
206; Nothing
207;--------------------------------------------------------------------
208ALIGN JUMP_ALIGN
209WriteSdpEnableCommandFor2816:
210 ENABLE_SDP 555h, 2AAh
211 jmp ReturnFromSdpCommand
212
213ALIGN JUMP_ALIGN
214WriteSdpEnableCommandFor2864:
215 ENABLE_SDP 1555h, 0AAAh
216 jmp ReturnFromSdpCommand
217
218ALIGN JUMP_ALIGN
219WriteSdpEnableCommandFor2864mod:
220 ENABLE_SDP 155Ch, 0AA3h
221 jmp SHORT ReturnFromSdpCommand
222
223ALIGN JUMP_ALIGN
224WriteSdpEnableCommandFor28256or28512:
225 ENABLE_SDP 5555h, 2AAAh
226 jmp SHORT ReturnFromSdpCommand
227
228
229ALIGN JUMP_ALIGN
230WriteSdpDisableCommandFor2816:
231 DISABLE_SDP 555h, 2AAh
232 jmp SHORT ReturnFromSdpCommand
233
234ALIGN JUMP_ALIGN
235WriteSdpDisableCommandFor2864:
236 DISABLE_SDP 1555h, 0AAAh
237 jmp SHORT ReturnFromSdpCommand
238
239ALIGN JUMP_ALIGN
240WriteSdpDisableCommandFor2864mod:
241 DISABLE_SDP 155Ch, 0AA3h
242 jmp SHORT ReturnFromSdpCommand
243
244ALIGN JUMP_ALIGN
245WriteSdpDisableCommandFor28256or28512:
246 DISABLE_SDP 5555h, 2AAAh
247 jmp SHORT ReturnFromSdpCommand
248
249DoNotWriteAnySdpCommand EQU ReturnFromSdpCommand
250
251
252;--------------------------------------------------------------------
253; WriteAllChangedBytesFromPageToEeprom
254; Parameters:
255; AX: Offset to SDP command function
256; BX: Offset to next destination byte
257; CX: Number of bytes left to write
258; SI: Offset to next source byte
259; ES:DI: Ptr to next comparison byte
260; SS:BP: Ptr to FLASHVARS
261; Returns:
262; CF: Set if polling timeout error
263; Cleared if page written successfully
264; Corrupts registers:
265; AX, BX, CX, DX, SI, DI, DS, ES
266;--------------------------------------------------------------------
267ALIGN JUMP_ALIGN
268WriteAllChangedBytesFromPageToEeprom:
269 mov dx, [bp+FLASHVARS.fpNextSourcePage+2] ; DX = Source segment
270 mov ds, [bp+FLASHVARS.fpNextDestinationPage+2] ; DS = EEPROM segment
271 cli ; Disable interrupts
272 jmp ax ; Write SDP command (once to the beginning of page)
273ALIGN JUMP_ALIGN
274ReturnFromSdpCommand:
275 mov ds, dx ; DS:SI now points to source byte
276
277ALIGN JUMP_ALIGN
278.WriteActualDataByteAfterSdpCommand:
279 lodsb ; Load source byte to AL
280 scasb ; Compare source byte to comparison byte
281 je SHORT .NoChangesForThisByte
282
283 mov ds, [bp+FLASHVARS.fpNextDestinationPage+2] ; DS:BX now points to EEPROM
284 mov [bx], al ; Write byte to EEPROM
285 mov ds, dx ; Restore DS
286 mov [bp+FLASHVARS.wLastOffsetWritten], bx
287 mov [bp+FLASHVARS.bLastByteWritten], al
288
289ALIGN JUMP_ALIGN
290.NoChangesForThisByte:
291 inc bx ; Increment destination offset
292 loop .WriteActualDataByteAfterSdpCommand
293 sti ; Enable interrupts
294 ; Fall to WaitUntilEepromPageWriteHasCompleted
295
296
297;--------------------------------------------------------------------
298; WaitUntilEepromPageWriteHasCompleted
299; Parameters:
300; SS:BP: Ptr to FLASHVARS
301; Returns:
302; CF: Set if polling timeout error
303; Cleared if page written successfully
304; Corrupts registers:
305; AX, BX, DI, DS, ES
306;--------------------------------------------------------------------
307ALIGN JUMP_ALIGN
308WaitUntilEepromPageWriteHasCompleted:
309 push ss
310 pop ds
311 lea bx, [bp+FLASHVARS.wTimeoutCounter]
312 mov ax, EEPROM_POLLING_TIMEOUT_TICKS
313 call TimerTicks_InitializeTimeoutFromAX
314 mov es, [bp+FLASHVARS.fpNextDestinationPage+2]
315 mov di, [bp+FLASHVARS.wLastOffsetWritten]
316ALIGN JUMP_ALIGN
317.PollEeprom:
318 mov al, [es:di] ; Load byte from EEPROM
319 xor al, [bp+FLASHVARS.bLastByteWritten] ; Clear SF if the most significant bits are the same
320 jns SHORT .PageWriteCompleted ; With CF cleared
321 call TimerTicks_GetTimeoutTicksLeftToAXfromDSBX
322 jnc SHORT .PollEeprom
323ALIGN JUMP_ALIGN, ret
324.PageWriteCompleted:
325 ret
326
327;--------------------------------------------------------------------
328; DisplayFlashProgressWithPagesLeftInCXandFlashvarsInSSBP
329; Parameters:
330; CX: Number of pages left to flash
331; SS:BP: Ptr to FLASHVARS
332; Returns:
333; Nothing
334; Corrupts registers:
335; AX, DI
336;--------------------------------------------------------------------
337ALIGN JUMP_ALIGN
338DisplayFlashProgressWithPagesLeftInCXandFlashvarsInSSBP:
339 push bp
340
341 mov ax, [bp+FLASHVARS.wPagesToFlash]
342 sub ax, cx
343 mov bp, [bp+FLASHVARS.wProgressUpdateParam] ; BP now has MENU handle
344 CALL_MENU_LIBRARY SetProgressValueFromAX
345
346 pop bp
347 ret
Note: See TracBrowser for help on using the repository browser.