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

Last change on this file since 373 was 370, checked in by krille_n_@…, 13 years ago

Changes:

  • Added some missing PIO mode timings to ATA_ID.inc (based on info from http://www.singlix.net/specs/cfspc4_0.pdf)
  • Updated Configuration_FullMode.txt but it may need additional changes as the Tandy info doesn't match the wiki.
  • Optimizations.
  • Excluded some unused code from XTIDECFG.
File size: 11.1 KB
Line 
1; Project name : XTIDE Universal BIOS Configurator v2
2; Description : Functions for flashing the EEPROM.
3
4; Section containing code
5SECTION .text
6
7;--------------------------------------------------------------------
8; Flash_EepromWithFlashvarsInDSSI
9; Parameters:
10; DS:SI: Ptr to FLASHVARS
11; Returns:
12; FLASHVARS.flashResult
13; Corrupts registers:
14; All, including segments
15;--------------------------------------------------------------------
16ALIGN JUMP_ALIGN
17Flash_EepromWithFlashvarsInDSSI:
18 mov [si+FLASHVARS.wProgressUpdateParam], bp ; Store handle to progress DIALOG
19 mov bp, si ; Flashvars now in SS:BP
20 mov cx, [bp+FLASHVARS.wPagesToFlash]
21ALIGN JUMP_ALIGN
22.FlashNextPage:
23 call DisplayFlashProgressWithPagesLeftInCXandFlashvarsInSSBP
24 call Flash_SinglePageWithFlashvarsInSSBP
25 jc SHORT .PollingError
26 call AreSourceAndDestinationPagesEqualFromFlashvarsInSSBP
27 jne SHORT .DataVerifyError
28
29 mov ax, [bp+FLASHVARS.wEepromPageSize]
30 add [bp+FLASHVARS.fpNextSourcePage], ax
31 add [bp+FLASHVARS.fpNextComparisonPage], ax
32 add [bp+FLASHVARS.fpNextDestinationPage], ax
33
34 loop .FlashNextPage
35%ifndef CHECK_FOR_UNUSED_ENTRYPOINTS
36%if FLASH_RESULT.success = 0 ; Just in case this should ever change
37 mov [bp+FLASHVARS.flashResult], cl
38%else
39 mov BYTE [bp+FLASHVARS.flashResult], FLASH_RESULT.success
40%endif
41%endif
42 ret
43
44.PollingError:
45 mov BYTE [bp+FLASHVARS.flashResult], FLASH_RESULT.PollingTimeoutError
46 ret
47.DataVerifyError:
48 mov BYTE [bp+FLASHVARS.flashResult], FLASH_RESULT.DataVerifyError
49 ret
50
51
52;--------------------------------------------------------------------
53; Flash_SinglePageWithFlashvarsInSSBP
54; Parameters:
55; SS:BP: Ptr to FLASHVARS
56; Returns:
57; CF: Set if polling timeout error
58; Cleared if page written successfully
59; Corrupts registers:
60; AX, BX, DX, SI, DI, DS, ES
61;--------------------------------------------------------------------
62ALIGN JUMP_ALIGN
63Flash_SinglePageWithFlashvarsInSSBP:
64 cld
65 call AreSourceAndDestinationPagesEqualFromFlashvarsInSSBP
66 je SHORT .NoNeedToFlashThePage ; CF cleared
67
68 push cx
69 call .GetSdpCommandFunctionToDXwithFlashvarsInSSBP
70 mov cx, [bp+FLASHVARS.wEepromPageSize]
71 mov si, [bp+FLASHVARS.fpNextSourcePage]
72 les di, [bp+FLASHVARS.fpNextComparisonPage]
73 mov bx, [bp+FLASHVARS.fpNextDestinationPage]
74 call WriteAllChangedBytesFromPageToEeprom
75 pop cx
76.NoNeedToFlashThePage:
77 ret
78
79;--------------------------------------------------------------------
80; .GetSdpCommandFunctionToDXwithFlashvarsInSSBP
81; Parameters:
82; SS:BP: Ptr to FLASHVARS
83; Returns:
84; DX: Ptr to SDP Command function
85; Corrupts registers:
86; BX, SI
87;--------------------------------------------------------------------
88ALIGN JUMP_ALIGN
89.GetSdpCommandFunctionToDXwithFlashvarsInSSBP:
90 eMOVZX bx, [bp+FLASHVARS.bEepromSdpCommand]
91 mov si, [cs:bx+.rgpSdpCommandToEepromTypeLookupTable]
92 mov bl, [bp+FLASHVARS.bEepromType]
93 mov dx, [cs:bx+si]
94 ret
95
96ALIGN WORD_ALIGN
97.rgpSdpCommandToEepromTypeLookupTable:
98 dw .rgfnFlashWithoutSDP ; SDP_COMMAND.none
99 dw .rgfnEnableSdpAndFlash ; SDP_COMMAND.enable
100 dw .rgfnDisableSdpAndFlash ; SDP_COMMAND.disable
101.rgfnFlashWithoutSDP: ; SDP_COMMAND.none
102 dw DoNotWriteAnySdpCommand ; EEPROM_TYPE.2816_2kiB
103 dw DoNotWriteAnySdpCommand ; EEPROM_TYPE.2864_8kiB
104 dw DoNotWriteAnySdpCommand ; EEPROM_TYPE.2864_8kiB_MOD
105 dw DoNotWriteAnySdpCommand ; EEPROM_TYPE.28256_32kiB
106 dw DoNotWriteAnySdpCommand ; EEPROM_TYPE.28512_64kiB
107.rgfnEnableSdpAndFlash: ; SDP_COMMAND.enable
108 dw WriteSdpEnableCommandFor2816 ; EEPROM_TYPE.2816_2kiB
109 dw WriteSdpEnableCommandFor2864 ; EEPROM_TYPE.2864_8kiB
110 dw WriteSdpEnableCommandFor2864mod ; EEPROM_TYPE.2864_8kiB_MOD
111 dw WriteSdpEnableCommandFor28256or28512 ; EEPROM_TYPE.28256_32kiB
112 dw WriteSdpEnableCommandFor28256or28512 ; EEPROM_TYPE.28512_64kiB
113.rgfnDisableSdpAndFlash: ; SDP_COMMAND.disable
114 dw WriteSdpDisableCommandFor2816 ; EEPROM_TYPE.2816_2kiB
115 dw WriteSdpDisableCommandFor2864 ; EEPROM_TYPE.2864_8kiB
116 dw WriteSdpDisableCommandFor2864mod ; EEPROM_TYPE.2864_8kiB_MOD
117 dw WriteSdpDisableCommandFor28256or28512 ; EEPROM_TYPE.28256_32kiB
118 dw WriteSdpDisableCommandFor28256or28512 ; EEPROM_TYPE.28512_64kiB
119
120
121;--------------------------------------------------------------------
122; AreSourceAndDestinationPagesEqualFromFlashvarsInSSBP
123; Parameters:
124; SS:BP: Ptr to FLASHVARS
125; Returns:
126; ZF: Set if pages are equal
127; Cleared if pages are not equal
128; Corrupts registers:
129; SI, DI
130;--------------------------------------------------------------------
131ALIGN JUMP_ALIGN
132AreSourceAndDestinationPagesEqualFromFlashvarsInSSBP:
133 push cx
134 mov cx, [bp+FLASHVARS.wEepromPageSize]
135 lds si, [bp+FLASHVARS.fpNextSourcePage]
136 les di, [bp+FLASHVARS.fpNextDestinationPage]
137 repe cmpsb
138 pop cx
139 ret
140
141
142;--------------------------------------------------------------------
143; ENABLE_SDP
144; Parameters:
145; %1: Offset for first command byte
146; %2: Offset for second command byte
147; DS: Segment to beginning of EEPROM
148; Returns:
149; Nothing
150; Corrupts registers:
151; Nothing
152;--------------------------------------------------------------------
153%macro ENABLE_SDP 2
154 mov BYTE [%1], 0AAh
155 mov BYTE [%2], 55h
156 mov BYTE [%1], 0A0h
157%endmacro
158
159;--------------------------------------------------------------------
160; DISABLE_SDP
161; Parameters:
162; %1: Offset for first command byte
163; %2: Offset for second command byte
164; DS: Segment to beginning of EEPROM
165; Returns:
166; Nothing
167; Corrupts registers:
168; Nothing
169;--------------------------------------------------------------------
170%macro DISABLE_SDP 2
171 mov BYTE [%1], 0AAh
172 mov BYTE [%2], 55h
173 mov BYTE [%1], 80h
174 mov BYTE [%1], 0AAh
175 mov BYTE [%2], 55h
176 mov BYTE [%1], 20h
177%endmacro
178
179;--------------------------------------------------------------------
180; SDP Command Functions
181; Parameters:
182; DS: Segment to beginning of EEPROM
183; Returns:
184; Nothing but jumps to WriteActualDataByteAfterSdpCommand
185; Corrupts registers:
186; Nothing
187;--------------------------------------------------------------------
188ALIGN JUMP_ALIGN
189WriteSdpEnableCommandFor2816:
190 ENABLE_SDP 555h, 2AAh
191 jmp ReturnFromSdpCommand
192
193ALIGN JUMP_ALIGN
194WriteSdpEnableCommandFor2864:
195 ENABLE_SDP 1555h, 0AAAh
196 jmp ReturnFromSdpCommand
197
198ALIGN JUMP_ALIGN
199WriteSdpEnableCommandFor2864mod:
200 ENABLE_SDP 155Ch, 0AA3h
201 jmp ReturnFromSdpCommand
202
203ALIGN JUMP_ALIGN
204WriteSdpEnableCommandFor28256or28512:
205 ENABLE_SDP 5555h, 2AAAh
206 jmp ReturnFromSdpCommand
207
208
209ALIGN JUMP_ALIGN
210WriteSdpDisableCommandFor2816:
211 DISABLE_SDP 555h, 2AAh
212 jmp SHORT ReturnFromSdpCommand
213
214ALIGN JUMP_ALIGN
215WriteSdpDisableCommandFor2864:
216 DISABLE_SDP 1555h, 0AAAh
217 jmp SHORT ReturnFromSdpCommand
218
219ALIGN JUMP_ALIGN
220WriteSdpDisableCommandFor2864mod:
221 DISABLE_SDP 155Ch, 0AA3h
222 jmp SHORT ReturnFromSdpCommand
223
224ALIGN JUMP_ALIGN
225WriteSdpDisableCommandFor28256or28512:
226 DISABLE_SDP 5555h, 2AAAh
227DoNotWriteAnySdpCommand:
228 jmp SHORT ReturnFromSdpCommand
229
230
231;--------------------------------------------------------------------
232; WriteNextChangedByteFromPageToEeprom
233; Parameters:
234; CX: Number of bytes left to write
235; DX: Offset to SDP command function
236; BX: Offset to next destination byte
237; SI: Offset to next source byte
238; ES:DI: Ptr to next comparison byte
239; SS:BP: Ptr to FLASHVARS
240; Returns:
241; CF: Set if polling timeout error
242; Cleared if page written successfully
243; Corrupts registers:
244; AX, BX, CX, SI, DI, DS, ES
245;--------------------------------------------------------------------
246ALIGN JUMP_ALIGN
247WriteAllChangedBytesFromPageToEeprom:
248 mov ax, [bp+FLASHVARS.fpNextSourcePage+2] ; AX = Source segment
249 mov ds, [bp+FLASHVARS.fpNextDestinationPage+2] ; DS = EEPROM segment
250 cli ; Disable interrupts
251 jmp dx ; Write SDP command (once to the beginning of page)
252ALIGN JUMP_ALIGN
253ReturnFromSdpCommand:
254 mov ds, ax ; DS:SI now points to source byte
255
256ALIGN JUMP_ALIGN
257.WriteActualDataByteAfterSdpCommand:
258 lodsb ; Load source byte to AL
259 scasb ; Compare source byte to comparison byte
260 je SHORT .NoChangesForThisByte
261
262 mov ds, [bp+FLASHVARS.fpNextDestinationPage+2] ; DS:BX now points to EEPROM
263 mov [bx], al ; Write byte to EEPROM
264 mov ds, [bp+FLASHVARS.fpNextSourcePage+2] ; Restore DS
265 mov [bp+FLASHVARS.wLastOffsetWritten], bx
266 mov [bp+FLASHVARS.bLastByteWritten], al
267
268ALIGN JUMP_ALIGN
269.NoChangesForThisByte:
270 inc bx ; Increment destination offset
271 loop .WriteActualDataByteAfterSdpCommand
272 sti ; Enable interrupts
273 ; Fall to WaitUntilEepromPageWriteHasCompleted
274
275
276;--------------------------------------------------------------------
277; WaitUntilEepromPageWriteHasCompleted
278; Parameters:
279; SS:BP: Ptr to FLASHVARS
280; Returns:
281; CF: Set if polling timeout error
282; Cleared if page written successfully
283; Corrupts registers:
284; AX, BX, DI, DS, ES
285;--------------------------------------------------------------------
286ALIGN JUMP_ALIGN
287WaitUntilEepromPageWriteHasCompleted:
288 call .InitializeTimeoutCounterForEepromPollingWithFlashvarsInSSBP
289 mov es, [bp+FLASHVARS.fpNextDestinationPage+2]
290 mov di, [bp+FLASHVARS.wLastOffsetWritten]
291ALIGN JUMP_ALIGN
292.PollEeprom:
293 call .HasWriteCycleCompleted
294 je SHORT .PageWriteCompleted ; CF cleared
295 call TimerTicks_GetTimeoutTicksLeftToAXfromDSBX
296 jnc SHORT .PollEeprom
297ALIGN JUMP_ALIGN
298.PageWriteCompleted:
299 ret
300
301;--------------------------------------------------------------------
302; .InitializeTimeoutCounterForEepromPollingWithFlashvarsInSSBP
303; Parameters:
304; SS:BP: Ptr to FLASHVARS
305; Returns:
306; DS:BX: Ptr to timeout counter variable
307; Corrupts registers:
308; AX
309;--------------------------------------------------------------------
310ALIGN JUMP_ALIGN
311.InitializeTimeoutCounterForEepromPollingWithFlashvarsInSSBP:
312 push ss
313 pop ds
314 lea bx, [bp+FLASHVARS.wTimeoutCounter]
315 mov ax, EEPROM_POLLING_TIMEOUT_TICKS
316 jmp TimerTicks_InitializeTimeoutFromAX
317
318;--------------------------------------------------------------------
319; .HasWriteCycleCompleted
320; Parameters:
321; ES:DI: Ptr to last written byte in EEPROM
322; SS:BP: Ptr to FLASHVARS
323; Returns:
324; ZF: Set if write cycle has completed
325; Cleared if write cycle in progress
326; Corrupts registers:
327; AX
328;--------------------------------------------------------------------
329ALIGN JUMP_ALIGN
330.HasWriteCycleCompleted:
331 mov ah, [es:di] ; Load byte from EEPROM
332 mov al, [bp+FLASHVARS.bLastByteWritten]
333 and ax, 8080h ; Clear all but bit 7 from both bytes
334 cmp al, ah ; Set ZF if high bits are the same
335 ret
336
337
338;--------------------------------------------------------------------
339; DisplayFlashProgressWithPagesLeftInCXandFlashvarsInSSBP
340; Parameters:
341; CX: Number of pages left to flash
342; SS:BP: Ptr to FLASHVARS
343; Returns:
344; Nothing
345; Corrupts registers:
346; AX, DI
347;--------------------------------------------------------------------
348ALIGN JUMP_ALIGN
349DisplayFlashProgressWithPagesLeftInCXandFlashvarsInSSBP:
350 push bp
351
352 mov ax, [bp+FLASHVARS.wPagesToFlash]
353 sub ax, cx
354 mov bp, [bp+FLASHVARS.wProgressUpdateParam] ; BP now has MENU handle
355 CALL_MENU_LIBRARY SetProgressValueFromAX
356
357 pop bp
358 ret
Note: See TracBrowser for help on using the repository browser.