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

Last change on this file since 592 was 592, checked in by krille_n_, 6 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.