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

Last change on this file since 568 was 568, checked in by krille_n_@…, 9 years ago

Changes:

  • SerDrive: Using named pipe mode (serdrive -p) now works under Windows XP/2000/Server 2003.
  • checksum.pl: Added a compatibility fix for 3Com 3C503 cards.
  • XTIDECFG will now scan every possible segment address to find and load the BIOS and/or its settings from EEPROM. This should simplify things for people using combined option ROMs.
  • Fixed a bug from r521 in BootSector.asm where the BIOS would not display a timeout error if it failed to load the boot sector from harddrive.
  • Fixed a bug from r541 in CompatibleDPT.asm where CompatibleDPT_CreateDeviceParameterTableExtensionToESBXfromDPTinDSSI would generate an invalid checksum in the DPTE.
  • Optimizations and other fixes.
File size: 5.2 KB
RevLine 
[57]1; Project name  :   XTIDE Univeral BIOS Configurator v2
2; Description   :   Functions for managing EEPROM contents.
3
[376]4;
[526]5; XTIDE Universal BIOS and Associated Tools
6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
[376]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.
[526]12;
[376]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
[526]16; GNU General Public License for more details.
[376]17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
[526]18;
[376]19
[65]20; Section containing initialized data
21SECTION .data
22
23ALIGN WORD_ALIGN
24g_rgwEepromTypeToSizeInWords:
25    dw      (2<<10) / 2     ; EEPROM_TYPE.2816_2kiB
26    dw      (8<<10) / 2
[159]27    dw      (8<<10) / 2     ; EEPROM_TYPE.2864_8kiB_MOD
[65]28    dw      (32<<10) / 2
29    dw      (64<<10) / 2
30
31g_rgwEepromPageToSizeInBytes:
32    dw      1               ; EEPROM_PAGE.1_byte
33    dw      2
34    dw      4
35    dw      8
36    dw      16
37    dw      32
38    dw      64
39
40
41
[57]42; Section containing code
43SECTION .text
44
45;--------------------------------------------------------------------
[68]46; EEPROM_LoadXtideUniversalBiosFromRomToRamBufferAndReturnSizeInDXCX
[57]47;   Parameters:
48;       Nothing
49;   Returns:
[68]50;       DX:CX:  BIOS size in bytes
[57]51;   Corrupts registers:
52;       AX, BX, SI, DI
53;--------------------------------------------------------------------
54ALIGN JUMP_ALIGN
[68]55EEPROM_LoadXtideUniversalBiosFromRomToRamBufferAndReturnSizeInDXCX:
[57]56    push    es
57
58    call    EEPROM_FindXtideUniversalBiosROMtoESDI
[484]59    call    EEPROM_GetXtideUniversalBiosSizeFromESDItoDXCX
[57]60    xor     si, si              ; Load from beginning of ROM
61    call    LoadBytesFromRomToRamBuffer
62
[484]63    call    EEPROM_GetXtideUniversalBiosSizeFromESDItoDXCX
[57]64    pop     es
65    ret
66
[484]67
[57]68;--------------------------------------------------------------------
[484]69; EEPROM_GetXtideUniversalBiosSizeFromESDItoDXCX
[57]70;   Parameters:
[484]71;       ES:DI:  Ptr to XTIDE Universal BIOS
[57]72;   Returns:
[68]73;       DX:CX:  Bios size in bytes
[57]74;   Corrupts registers:
[68]75;       Nothing
[57]76;--------------------------------------------------------------------
77ALIGN JUMP_ALIGN
[484]78EEPROM_GetXtideUniversalBiosSizeFromESDItoDXCX:
[68]79    xor     dx, dx
[558]80    mov     ch, [es:di+ROMVARS.bRomSize]
81    mov     cl, dl
82    eSHL_IM ch, 1
[57]83    ret
84
85
86;--------------------------------------------------------------------
87; EEPROM_LoadOldSettingsFromRomToRamBuffer
88;   Parameters:
89;       Nothing
90;   Returns:
91;       CF:     Set if EEPROM was found
92;               Cleared if EEPROM not found
93;   Corrupts registers:
94;       AX, BX, CX, SI, DI
95;--------------------------------------------------------------------
96ALIGN JUMP_ALIGN
97EEPROM_LoadOldSettingsFromRomToRamBuffer:
98    mov     cx, ROMVARS_size - ROMVARS.wFlags   ; Number of bytes to load
99    mov     si, ROMVARS.wFlags                  ; Offset where to start loading
100    ; Fall to LoadBytesFromRomToRamBuffer
101
102;--------------------------------------------------------------------
103; LoadBytesFromRomToRamBuffer
104;   Parameters:
105;       CX:     Number of bytes to load from ROM
106;       SI:     Offset to first byte to load
107;   Returns:
108;       CF:     Set if EEPROM was found
109;               Cleared if EEPROM not found
110;   Corrupts registers:
[523]111;       AX, BX, CX, SI
[57]112;--------------------------------------------------------------------
113ALIGN JUMP_ALIGN
114LoadBytesFromRomToRamBuffer:
115    push    es
116    push    ds
[523]117    push    di
[57]118
119    call    EEPROM_FindXtideUniversalBiosROMtoESDI
120    jnc     SHORT .XtideUniversalBiosNotFound
121    push    es
122    pop     ds                                          ; DS:SI points to ROM
123
124    call    Buffers_GetFileBufferToESDI
125    mov     di, si                                      ; ES:DI points to RAM buffer
126
127    cld
128    call    Memory_CopyCXbytesFromDSSItoESDI
129    stc
130
131.XtideUniversalBiosNotFound:
[523]132    pop     di
[57]133    pop     ds
134    pop     es
135    ret
136
137
138;--------------------------------------------------------------------
139; EEPROM_FindXtideUniversalBiosROMtoESDI
140;   Parameters:
141;       Nothing
142;   Returns:
143;       ES:DI:  EEPROM segment
144;       CF:     Set if EEPROM was found
145;               Cleared if EEPROM not found
146;   Corrupts registers:
147;       AX, BX
148;--------------------------------------------------------------------
149ALIGN JUMP_ALIGN
150EEPROM_FindXtideUniversalBiosROMtoESDI:
151    push    si
152    push    cx
153
154    xor     di, di                  ; Zero DI (offset)
155    mov     bx, 0C000h              ; First possible ROM segment
156ALIGN JUMP_ALIGN
157.SegmentLoop:
158    mov     es, bx                  ; Possible ROM segment to ES
159    call    Buffers_IsXtideUniversalBiosSignatureInESDI
160    je      SHORT .RomFound
[568]161    add     bx, 80h                 ; Increment by 2kB (minimum possible distance from the beginning of one option ROM to the next)
[57]162    jnc     SHORT .SegmentLoop      ; Loop until segment overflows
163    clc
164    jmp     SHORT .ReturnWithoutUpdatingCF
165ALIGN JUMP_ALIGN
166.RomFound:
167    stc
168.ReturnWithoutUpdatingCF:
169    pop     cx
170    pop     si
171    ret
172
173
174;--------------------------------------------------------------------
[65]175; EEPROM_LoadFromRomToRamComparisonBuffer
[57]176;   Parameters:
177;       Nothing
178;   Returns:
[65]179;       Nothing
[57]180;   Corrupts registers:
[65]181;       BX, CX, SI, DI
[57]182;--------------------------------------------------------------------
183ALIGN JUMP_ALIGN
[65]184EEPROM_LoadFromRomToRamComparisonBuffer:
185    push    es
186    push    ds
187
188    mov     ds, [cs:g_cfgVars+CFGVARS.wEepromSegment]
189    xor     si, si
190    call    Buffers_GetFlashComparisonBufferToESDI
[293]191    eMOVZX  bx, [cs:g_cfgVars+CFGVARS.bEepromType]
[65]192    mov     cx, [cs:bx+g_rgwEepromTypeToSizeInWords]
193    cld
194    rep movsw
195
196    pop     ds
197    pop     es
[57]198    ret
Note: See TracBrowser for help on using the repository browser.