source: xtideuniversalbios/trunk/Configurator/Src/EEPROM.asm @ 2

Last change on this file since 2 was 2, checked in by aitotat, 14 years ago
File size: 7.2 KB
Line 
1; File name     :   EEPROM.asm
2; Project name  :   XTIDE Univeral BIOS Configurator
3; Created date  :   19.4.2010
4; Last update   :   2.5.2010
5; Author        :   Tomi Tilli
6; Description   :   Functions for managing EEPROM contents.
7
8; Section containing code
9SECTION .text
10
11;--------------------------------------------------------------------
12; Loads XTIDE Universal BIOS from ROM to RAM to be configured.
13;
14; EEPROM_LoadBiosFromROM
15;   Parameters:
16;       Nothing
17;   Returns:
18;       CX:     BIOS size in bytes
19;   Corrupts registers:
20;       AX, BX, ES
21;--------------------------------------------------------------------
22ALIGN JUMP_ALIGN
23EEPROM_LoadBiosFromROM:
24    push    si
25    call    EEPROM_FindXtideUniversalBiosROM
26    xor     si, si                                  ; Load from beginning of ROM
27    eMOVZX  cx, BYTE [es:ROMVARS.bRomSize]
28    eSHL_IM cx, 9                                   ; *= 512 for byte count
29    call    EEPROM_LoadBytesFromROM
30    pop     si
31    ret
32
33
34;--------------------------------------------------------------------
35; Loads old XTIDE Universal BIOS settings from ROM to RAM.
36;
37; EEPROM_LoadSettingsFromRomToRam
38;   Parameters:
39;       Nothing
40;   Returns:
41;       Nothing
42;   Corrupts registers:
43;       AX, BX, CX, SI, ES
44;--------------------------------------------------------------------
45ALIGN JUMP_ALIGN
46EEPROM_LoadSettingsFromRomToRam:
47    mov     cx, ROMVARS_size - ROMVARS.wFlags   ; Number of bytes to load
48    mov     si, ROMVARS.wFlags                  ; Offset where to start loading
49    ; Fall to EEPROM_LoadBytesFromROM
50
51;--------------------------------------------------------------------
52; Loads wanted number of bytes from XTIDE Universal BIOS ROM.
53;
54; EEPROM_LoadBytesFromROM
55;   Parameters:
56;       CX:     Number of bytes to load from beginning of ROM
57;       SI:     Offset to first byte
58;   Returns:
59;       Nothing
60;   Corrupts registers:
61;       AX, BX, SI, ES
62;--------------------------------------------------------------------
63ALIGN JUMP_ALIGN
64EEPROM_LoadBytesFromROM:
65    push    ds
66    push    di
67    push    cx
68
69    call    EEPROM_FindXtideUniversalBiosROM
70    push    es
71    pop     ds                                          ; DS:SI points to ROM
72    push    cs
73    pop     es
74    lea     di, [si+g_cfgVars+CFGVARS.rgbEepromBuffers] ; ES:DI points to RAM buffer
75    shr     cx, 1                                       ; Byte count to word count
76    cld                                                 ; MOVSW to increment SI and DI
77    rep movsw                                           ; Read from ROM to RAM
78
79    pop     cx
80    pop     di
81    pop     ds
82    ret
83
84
85;--------------------------------------------------------------------
86; Finds EEPROM using known signature.
87;
88; EEPROM_FindXtideUniversalBiosROM
89;   Parameters:
90;       Nothing
91;   Returns:
92;       ES:     EEPROM segment
93;       CF:     Set if EEPROM was found
94;               Cleared if EEPROM not found
95;   Corrupts registers:
96;       AX, BX
97;--------------------------------------------------------------------
98ALIGN JUMP_ALIGN
99EEPROM_FindXtideUniversalBiosROM:
100    push    di
101    xor     di, di                  ; Zero DI
102    mov     bx, 0C000h              ; First possible ROM segment
103ALIGN JUMP_ALIGN
104.SegmentLoop:
105    mov     es, bx                  ; Possible ROM segment to ES
106    call    EEPROM_IsXtideUniversalBiosSignaturePresent
107    je      SHORT .RomFound
108    add     bx, 200h                ; Increment by 8kB
109    jnc     SHORT .SegmentLoop      ; Loop until segment overflows
110    pop     di
111    clc
112    ret
113ALIGN JUMP_ALIGN
114.RomFound:
115    pop     di
116    stc
117    ret
118
119
120;--------------------------------------------------------------------
121; Checks if XTIDE Universal BIOS is loaded to be configured.
122;
123; EEPROM_IsXtideUniversalBiosLoaded
124;   Parameters:
125;       Nothing
126;   Returns:
127;       ZF:     Set if signature found
128;               Cleared if signature not present
129;   Corrupts registers:
130;       AX
131;--------------------------------------------------------------------
132ALIGN JUMP_ALIGN
133EEPROM_IsXtideUniversalBiosLoaded:
134    push    es
135    push    di
136
137    push    cs
138    pop     es
139    mov     di, g_cfgVars+CFGVARS.rgbEepromBuffers
140    call    EEPROM_IsXtideUniversalBiosSignaturePresent
141
142    pop     di
143    pop     es
144    ret
145
146
147;--------------------------------------------------------------------
148; Checks if ROM contains Xtide Universal BIOS signature.
149;
150; EEPROM_IsXtideUniversalBiosSignaturePresent
151;   Parameters:
152;       ES:DI:  Ptr to ROM contents
153;   Returns:
154;       ZF:     Set if signature found
155;               Cleared if signature not present
156;   Corrupts registers:
157;       AX
158;--------------------------------------------------------------------
159ALIGN JUMP_ALIGN
160EEPROM_IsXtideUniversalBiosSignaturePresent:
161    push    ds
162    push    di
163    push    si
164    push    cx
165
166    push    cs
167    pop     ds
168    mov     si, g_szSignature           ; DS:SI points to known signature string
169    add     di, BYTE ROMVARS.rgbSign    ; ES:DI points to possible ROM signature
170    mov     cx, LEN_SIGNATURE/2         ; Signature string length in words
171    cld                                 ; CMPSW to increment DI and SI
172    repe cmpsw
173
174    pop     cx
175    pop     si
176    pop     di
177    pop     ds
178    ret
179
180
181;--------------------------------------------------------------------
182; Called when new BIOS has been loaded to be flashed.
183;
184; EEPROM_NewBiosLoadedFromFileOrROM
185;   Parameters:
186;       AX:     EEPROM source (FLG_CFGVARS_FILELOADED or FLG_CFGVARS_ROMLOADED)
187;       CX:     EEPROM size in bytes
188;   Returns:
189;       Nothing
190;   Corrupts registers:
191;       Nothing
192;--------------------------------------------------------------------
193ALIGN JUMP_ALIGN
194EEPROM_NewBiosLoadedFromFileOrROM:
195    and     WORD [cs:g_cfgVars+CFGVARS.wFlags], ~(FLG_CFGVARS_FILELOADED | FLG_CFGVARS_ROMLOADED | FLG_CFGVARS_UNSAVED)
196    or      WORD [cs:g_cfgVars+CFGVARS.wFlags], ax
197    mov     WORD [cs:g_cfgVars+CFGVARS.wEepromSize], cx
198    ret
199
200
201;--------------------------------------------------------------------
202; Generated checksum byte to the end of BIOS image buffer.
203;
204; EEPROM_GenerateChecksum
205;   Parameters:
206;       Nothing
207;   Returns:
208;       Nothing
209;   Corrupts registers:
210;       AX, BX, CX
211;--------------------------------------------------------------------
212ALIGN JUMP_ALIGN
213EEPROM_GenerateChecksum:
214    xor     ax, ax
215    mov     bx, g_cfgVars+CFGVARS.rgbEepromBuffers
216    mov     cx, [cs:g_cfgVars+CFGVARS.wEepromSize]
217    dec     cx
218ALIGN JUMP_ALIGN
219.ByteLoop:
220    add     al, [cs:bx]
221    inc     bx
222    loop    .ByteLoop
223    neg     al
224    mov     [cs:bx], al
225    ret
226
227
228;--------------------------------------------------------------------
229; Returns pointer source data to be flashed to EEPROM.
230;
231; EEPROM_GetSourceBufferPointerToDSSI
232;   Parameters:
233;       Nothing
234;   Returns:
235;       DS:SI:      Ptr to source buffer
236;   Corrupts registers:
237;       Nothing
238;--------------------------------------------------------------------
239ALIGN JUMP_ALIGN
240EEPROM_GetSourceBufferPointerToDSSI:
241    push    cs
242    pop     ds
243    mov     si, g_cfgVars+CFGVARS.rgbEepromBuffers
244    ret
245
246
247;--------------------------------------------------------------------
248; Returns pointer to comparison buffer for old EEPROM data.
249;
250; EEPROM_GetComparisonBufferPointerToDSBX
251;   Parameters:
252;       Nothing
253;   Returns:
254;       DS:BX:      Ptr to verify buffer
255;   Corrupts registers:
256;       Nothing
257;--------------------------------------------------------------------
258ALIGN JUMP_ALIGN
259EEPROM_GetComparisonBufferPointerToDSBX:
260    push    cs
261    pop     ds
262    mov     bx, [cs:g_cfgVars+CFGVARS.wEepromSize]
263    add     bx, g_cfgVars+CFGVARS.rgbEepromBuffers
264    ret
265
266
267;--------------------------------------------------------------------
268; Returns pointer to EEPROM where to flash.
269;
270; EEPROM_GetEepromPointerToESDI
271;   Parameters:
272;       Nothing
273;   Returns:
274;       ES:DI:      Ptr to EEPROM
275;   Corrupts registers:
276;       Nothing
277;--------------------------------------------------------------------
278ALIGN JUMP_ALIGN
279EEPROM_GetEepromPointerToESDI:
280    mov     es, [cs:g_cfgVars+CFGVARS.wEepromSegment]
281    xor     di, di
282    ret
Note: See TracBrowser for help on using the repository browser.