source: xtideuniversalbios/trunk/Configurator/Src/Flash.asm@ 520

Last change on this file since 520 was 293, checked in by krille_n_@…, 13 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.4 KB
RevLine 
[2]1; Project name : XTIDE Univeral BIOS Configurator
2; Description : Function for flashing the EEPROM.
3
4; Section containing code
5SECTION .text
6
7;--------------------------------------------------------------------
8; Loads old XTIDE Universal BIOS settings from ROM to RAM.
9;
10; EEPROM_LoadSettingsFromRomToRam
11; Parameters:
12; Nothing
13; Returns:
14; Nothing
15; Corrupts registers:
16; BX, CX, ES
17;--------------------------------------------------------------------
18ALIGN JUMP_ALIGN
19Flash_CopyCurrentContentsForComparison:
20 push ds
21 push di
22 push si
23
24 call EEPROM_GetComparisonBufferPointerToDSBX
25 push ds
26 pop es
27 mov di, bx ; Comparison buffer now in ES:DI
28 xor si, si
29 mov ds, [cs:g_cfgVars+CFGVARS.wEepromSegment] ; EEPROM now in DS:SI
30 mov cx, [cs:g_cfgVars+CFGVARS.wEepromSize]
31 shr cx, 1 ; Byte count to word count
32 cld ; MOVSW to increment DI and SI
33 rep movsw
34
35 pop si
36 pop di
37 pop ds
38 ret
39
40
41;--------------------------------------------------------------------
42; Verifies that all data has been written successfully.
43;
[293]44; Flash_WasDataWriteSuccessful
[2]45; Parameters:
46; Nothing
47; Returns:
48; ZF: Set if data was written successfully
49; Cleared if write failed
50; Corrupts registers:
51; CX, ES
52;--------------------------------------------------------------------
53ALIGN JUMP_ALIGN
[293]54Flash_WasDataWriteSuccessful:
[2]55 push ds
56 push di
57 push si
58
59 call EEPROM_GetSourceBufferPointerToDSSI
60 call EEPROM_GetEepromPointerToESDI
61 mov cx, [cs:g_cfgVars+CFGVARS.wEepromSize]
62 shr cx, 1 ; Byte count to word count
63 cld ; CMPSW to increment SI and DI
64 repe cmpsw
65
66 pop si
67 pop di
68 pop ds
69 ret
70
71
72;--------------------------------------------------------------------
73; Writes page of data to EEPROM.
74;
75; Flash_WritePage
76; Parameters:
77; AX: SDP command
78; CX: Page size (1, 2, 4, 8, 16, 32 or 64 bytes)
79; DS:BX: Ptr to comparison buffer with old EEPROM data
80; DS:SI: Ptr to source data to write
81; ES:DI: Ptr to destination EEPROM
82; Returns:
83; BX, SI, DI: Updated to next page
84; CF: Cleared if page written successfully
85; Set if polling timeout
86; Corrupts registers:
87; Nothing
88;--------------------------------------------------------------------
89ALIGN JUMP_ALIGN
90Flash_WritePage:
91 call Flash_DoesPageNeedToBeWritten
92 jz SHORT .ReturnWithoutWriting
93 push bp
94 push cx
95 push ax
96
97 mov bp, .LoopWritePageBytes ; Return address from SDP command
98 cli ; Disable interrupts
99 jmp SHORT Flash_WriteSdpCommand
100
101ALIGN JUMP_ALIGN
102.LoopWritePageBytes:
103 lodsb ; Load source byte to AL, increment SI
104 cmp al, [bx] ; Trying to write existing data?
105 je SHORT .SkipByte
106 inc bx ; Increment comparison buffer pointer
107 mov ah, al ; Last byte written to AH
108 mov bp, di ; ES:BP points to last byte written
109 stosb ; Write source byte to EEPROM, increment DI
110 loop .LoopWritePageBytes
111 jmp SHORT .PageCompleted
112ALIGN JUMP_ALIGN
113.SkipByte:
114 inc bx
115 inc di
116 loop .LoopWritePageBytes
117
118ALIGN JUMP_ALIGN
119.PageCompleted:
120 sti ; Enable interrupts
121 call Flash_PollEepromUntilWriteCycleHasCompleted
122 pop ax
123 pop cx
124 pop bp
125 ret
126
127ALIGN JUMP_ALIGN
128.ReturnWithoutWriting:
129 add bx, cx
130 add si, cx
131 add di, cx
132 clc
133 ret
134
135;--------------------------------------------------------------------
136; Compares source data and comparison buffer.
137;
138; Flash_DoesPageNeedToBeWritten
139; Parameters:
140; CX: Page size (1, 2, 4, 8, 16, 32 or 64 bytes)
141; DS:BX: Ptr to comparison buffer with old EEPROM data
142; DS:SI: Ptr to source data to write
143; Returns:
144; ZF: Set if no need to write page
145; Cleared if writing is needed
146; Corrupts registers:
147; Nothing
148;--------------------------------------------------------------------
149ALIGN JUMP_ALIGN
150Flash_DoesPageNeedToBeWritten:
151 push es
152 push di
153 push si
154 push cx
155
156 push ds
157 pop es
158 mov di, bx ; ES:DI now points to comparison buffer
159 cld ; CMPSB to increment SI and DI
160 repe cmpsb
161
162 pop cx
163 pop si
164 pop di
165 pop es
166 ret
167
168
169;--------------------------------------------------------------------
170; Writes Software Data Protection command to EEPROM.
171;
172; Flash_WriteSdpCommand
173; Parameters:
174; AX: SDP command
175; BP: Return address
176; ES: Segment to EEPROM
177; Returns:
178; Nothing
179; Corrupts registers:
180; Nothing
181;--------------------------------------------------------------------
182ALIGN JUMP_ALIGN
183Flash_WriteSdpCommand:
184 cmp ax, CMD_SDP_ENABLE
185 je SHORT Flash_WriteSdpEnableCommand
186 cmp ax, CMD_SDP_DISABLE
187 je SHORT Flash_WriteSdpDisableCommand
188 jmp bp
189
190ALIGN JUMP_ALIGN
191Flash_WriteSdpEnableCommand:
192 mov BYTE [es:1555h], 0AAh ; Write AAh to address 1555h
193 mov BYTE [es:0AAAh], 55h ; Write 55h to address 0AAAh
194 mov BYTE [es:1555h], 0A0h ; Write A0h to address 1555h
195 jmp bp
196
197ALIGN JUMP_ALIGN
198Flash_WriteSdpDisableCommand:
199 mov BYTE [es:1555h], 0AAh ; Write AAh to address 1555h
200 mov BYTE [es:0AAAh], 55h ; Write 55h to address 0AAAh
201 mov BYTE [es:1555h], 80h ; Write 80h to address 1555h
202 mov BYTE [es:1555h], 0AAh ; Write AAh to address 1555h
203 mov BYTE [es:0AAAh], 55h ; Write 55h to address 0AAAh
204 mov BYTE [es:1555h], 20h ; Write 20h to address 1555h
205 jmp bp
206
207
208;--------------------------------------------------------------------
209; Polls EEPROM until write cycle ends.
210;
211; Flash_PollEepromUntilWriteCycleHasCompleted
212; Parameters:
213; AH: Last byte written
214; ES:BP: Ptr to EEPROM last write location
215; Returns:
[293]216; CF: Cleared if polling successful
[2]217; Set if polling timeout
218; Corrupts registers:
219; AX, CX
220;--------------------------------------------------------------------
221ALIGN JUMP_ALIGN
222Flash_PollEepromUntilWriteCycleHasCompleted:
223 call Flash_InitializePollingTimeout
224ALIGN JUMP_ALIGN
225.PollLoop:
226 mov al, [es:bp] ; Load byte from EEPROM
227 and ax, 8080h ; Clear all but bit 7 from both bytes
228 cmp al, ah ; Same bytes?
229 je SHORT .Return
230 call Flash_UpdatePollingTimeout
231 jnc SHORT .PollLoop ; Not timeout
232ALIGN JUMP_ALIGN
233.Return:
234 ret
235
236;--------------------------------------------------------------------
237; Initializes timeout counter. Timeouts are implemented using system
238; timer ticks. First tick might take 0...54.9ms and remaining ticks
239; will occur at 54.9ms intervals. Use delay of two (or more) ticks to
240; ensure at least 54.9ms wait.
241;
242; Flash_InitializePollingTimeout
243; Parameters:
244; Nothing
245; Returns:
246; CX: Timeout end time for Flash_UpdatePollingTimeout
247; Corrupts registers:
248; Nothing
249;--------------------------------------------------------------------
250ALIGN JUMP_ALIGN
251Flash_InitializePollingTimeout:
252 push ds
253 LOAD_BDA_SEGMENT_TO ds, cx
254 mov cx, CNT_TMEOUT_POLL
255 add cx, [BDA.dwTimerTicks] ; CX = End time
256 pop ds
257 sti ; Enable interrupts
258 ret
259
260;--------------------------------------------------------------------
261; Updates timeout counter. Timeout counter can be
262; initialized with Flash_InitializePollingTimeout.
263;
264; Flash_UpdatePollingTimeout
265; Parameters:
266; CX: Timeout end time
267; Returns:
268; CF: Set if timeout
269; Cleared if time left
270; Corrupts registers:
271; Nothing
272;--------------------------------------------------------------------
273ALIGN JUMP_ALIGN
274Flash_UpdatePollingTimeout:
275 push ds
276 push ax
277 LOAD_BDA_SEGMENT_TO ds, ax
278 cmp cx, [BDA.dwTimerTicks] ; Timeout?
279 pop ax
280 pop ds
281 je SHORT .ReturnTimeout
282 clc
283 ret
284.ReturnTimeout:
285 stc
286 ret
Note: See TracBrowser for help on using the repository browser.