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

Last change on this file since 595 was 593, checked in by Tomi Tilli, 6 years ago

Flashing now works again.
Hack to get Windows 95 to work properly (MODULE_WIN95_CMOS_HACK included for 386 builds by default).
Edited makefile to produce large 386 build.
Fixed recovery time for QDI Vision VLB-IDE controllers.
No more warnings with Nasm 2.13.xx and later.
File dialog now properly restores default drive when file selection is cancelled.

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;--------------------------------------------------------------------
307.WaitUntilEepromPageWriteHasCompleted:
308 push ss
309 pop ds
310 lea bx, [bp+FLASHVARS.wTimeoutCounter]
311 mov ax, EEPROM_POLLING_TIMEOUT_TICKS
312 call TimerTicks_InitializeTimeoutFromAX
313 mov es, [bp+FLASHVARS.fpNextDestinationPage+2]
314 mov di, [bp+FLASHVARS.wLastOffsetWritten]
315ALIGN JUMP_ALIGN
316.PollEeprom:
317 mov al, [es:di] ; Load byte from EEPROM
318 xor al, [bp+FLASHVARS.bLastByteWritten] ; Clear SF if the most significant bits are the same
319 jns SHORT .PageWriteCompleted ; With CF cleared
320 call TimerTicks_GetTimeoutTicksLeftToAXfromDSBX
321 jnc SHORT .PollEeprom
322ALIGN JUMP_ALIGN, ret
323.PageWriteCompleted:
324 ret
325
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.