source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS_Configurator_v2/Src/EEPROM.asm @ 138

Last change on this file since 138 was 138, checked in by aitotat, 13 years ago

Changes to Configurator v2:

  • Saving changes now works again (got broken in r118).
File size: 5.2 KB
Line 
1; Project name  :   XTIDE Univeral BIOS Configurator v2
2; Author        :   Tomi Tilli
3; Description   :   Functions for managing EEPROM contents.
4
5; Section containing initialized data
6SECTION .data
7
8ALIGN WORD_ALIGN
9g_rgwEepromTypeToSizeInWords:
10    dw      (2<<10) / 2     ; EEPROM_TYPE.2816_2kiB
11    dw      (8<<10) / 2
12    dw      (32<<10) / 2
13    dw      (64<<10) / 2
14
15g_rgwEepromPageToSizeInBytes:
16    dw      1               ; EEPROM_PAGE.1_byte
17    dw      2
18    dw      4
19    dw      8
20    dw      16
21    dw      32
22    dw      64
23
24
25
26; Section containing code
27SECTION .text
28
29;--------------------------------------------------------------------
30; EEPROM_GetSmallestEepromSizeInWordsToCXforImageWithWordSizeInAX
31;   Parameters:
32;       AX:     Image size in WORDs
33;   Returns:
34;       CX:     Required EEPROM size in WORDs
35;       CF:     Set if EEPROM size found
36;               Cleared if no valid EEPROM found
37;   Corrupts registers:
38;       BX
39;--------------------------------------------------------------------
40ALIGN JUMP_ALIGN
41EEPROM_GetSmallestEepromSizeInWordsToCXforImageWithWordSizeInAX:
42    mov     bx, g_rgwEepromTypeToSizeInWords
43    mov     cx, NUMBER_OF_EEPROM_TYPES
44ALIGN JUMP_ALIGN
45.CheckNextEepromSize:
46    cmp     ax, [cs:bx]
47    jbe     SHORT .ReturnEepromSizeInCX
48    inc     bx
49    inc     bx
50    loop    .CheckNextEepromSize
51    clc     ; None of the supported EEPROMs are large enough
52    ret
53ALIGN JUMP_ALIGN
54.ReturnEepromSizeInCX:
55    mov     cx, [cs:bx]
56    stc
57    ret
58
59
60;--------------------------------------------------------------------
61; EEPROM_LoadXtideUniversalBiosFromRomToRamBufferAndReturnSizeInDXCX
62;   Parameters:
63;       Nothing
64;   Returns:
65;       DX:CX:  BIOS size in bytes
66;   Corrupts registers:
67;       AX, BX, SI, DI
68;--------------------------------------------------------------------
69ALIGN JUMP_ALIGN
70EEPROM_LoadXtideUniversalBiosFromRomToRamBufferAndReturnSizeInDXCX:
71    push    es
72
73    call    EEPROM_FindXtideUniversalBiosROMtoESDI
74    call    .GetXtideUniversalBiosSizeFromEStoDXCX
75    xor     si, si              ; Load from beginning of ROM
76    call    LoadBytesFromRomToRamBuffer
77
78    call    .GetXtideUniversalBiosSizeFromEStoDXCX
79    pop     es
80    ret
81
82;--------------------------------------------------------------------
83; .GetXtideUniversalBiosSizeFromEStoDXCX
84;   Parameters:
85;       Nothing
86;   Returns:
87;       DX:CX:  Bios size in bytes
88;   Corrupts registers:
89;       Nothing
90;--------------------------------------------------------------------
91ALIGN JUMP_ALIGN
92.GetXtideUniversalBiosSizeFromEStoDXCX:
93    xor     dx, dx
94    eMOVZX  cx, BYTE [es:ROMVARS.bRomSize]
95    eSHL_IM cx, 9               ; *= 512 for byte count
96    ret
97
98
99;--------------------------------------------------------------------
100; EEPROM_LoadOldSettingsFromRomToRamBuffer
101;   Parameters:
102;       Nothing
103;   Returns:
104;       CF:     Set if EEPROM was found
105;               Cleared if EEPROM not found
106;   Corrupts registers:
107;       AX, BX, CX, SI, DI
108;--------------------------------------------------------------------
109ALIGN JUMP_ALIGN
110EEPROM_LoadOldSettingsFromRomToRamBuffer:
111    mov     cx, ROMVARS_size - ROMVARS.wFlags   ; Number of bytes to load
112    mov     si, ROMVARS.wFlags                  ; Offset where to start loading
113    ; Fall to LoadBytesFromRomToRamBuffer
114
115;--------------------------------------------------------------------
116; LoadBytesFromRomToRamBuffer
117;   Parameters:
118;       CX:     Number of bytes to load from ROM
119;       SI:     Offset to first byte to load
120;   Returns:
121;       CF:     Set if EEPROM was found
122;               Cleared if EEPROM not found
123;   Corrupts registers:
124;       AX, BX, CX, SI, DI
125;--------------------------------------------------------------------
126ALIGN JUMP_ALIGN
127LoadBytesFromRomToRamBuffer:
128    push    es
129    push    ds
130
131    call    EEPROM_FindXtideUniversalBiosROMtoESDI
132    jnc     SHORT .XtideUniversalBiosNotFound
133    push    es
134    pop     ds                                          ; DS:SI points to ROM
135
136    call    Buffers_GetFileBufferToESDI
137    mov     di, si                                      ; ES:DI points to RAM buffer
138
139    cld
140    call    Memory_CopyCXbytesFromDSSItoESDI
141    stc
142
143.XtideUniversalBiosNotFound:
144    pop     ds
145    pop     es
146    ret
147
148
149;--------------------------------------------------------------------
150; EEPROM_FindXtideUniversalBiosROMtoESDI
151;   Parameters:
152;       Nothing
153;   Returns:
154;       ES:DI:  EEPROM segment
155;       CF:     Set if EEPROM was found
156;               Cleared if EEPROM not found
157;   Corrupts registers:
158;       AX, BX
159;--------------------------------------------------------------------
160ALIGN JUMP_ALIGN
161EEPROM_FindXtideUniversalBiosROMtoESDI:
162    push    si
163    push    cx
164
165    xor     di, di                  ; Zero DI (offset)
166    mov     bx, 0C000h              ; First possible ROM segment
167ALIGN JUMP_ALIGN
168.SegmentLoop:
169    mov     es, bx                  ; Possible ROM segment to ES
170    call    Buffers_IsXtideUniversalBiosSignatureInESDI
171    je      SHORT .RomFound
172    add     bx, 200h                ; Increment by 8kB
173    jnc     SHORT .SegmentLoop      ; Loop until segment overflows
174    clc
175    jmp     SHORT .ReturnWithoutUpdatingCF
176ALIGN JUMP_ALIGN
177.RomFound:
178    stc
179.ReturnWithoutUpdatingCF:
180    pop     cx
181    pop     si
182    ret
183
184
185;--------------------------------------------------------------------
186; EEPROM_LoadFromRomToRamComparisonBuffer
187;   Parameters:
188;       Nothing
189;   Returns:
190;       Nothing
191;   Corrupts registers:
192;       BX, CX, SI, DI
193;--------------------------------------------------------------------
194ALIGN JUMP_ALIGN
195EEPROM_LoadFromRomToRamComparisonBuffer:
196    push    es
197    push    ds
198
199    mov     ds, [cs:g_cfgVars+CFGVARS.wEepromSegment]
200    xor     si, si
201    call    Buffers_GetFlashComparisonBufferToESDI
202    eMOVZX  bx, BYTE [cs:g_cfgVars+CFGVARS.bEepromType]
203    mov     cx, [cs:bx+g_rgwEepromTypeToSizeInWords]
204    cld
205    rep movsw
206
207    pop     ds
208    pop     es
209    ret
Note: See TracBrowser for help on using the repository browser.