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

Last change on this file was 293, checked in by krille_n_@…, 12 years ago

Commit 1/2 (Library, Configurators and Serial Server):

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