📄 bootload.lst
字号:
157
158 ; Relocate image to 0000:0000
159 ; Can't use the stack anymore!
160
161 000000CF 5D POP BP ; retrieve ending src paragraph #
162 000000D0 B88000 MOV AX,0080H ; source segment
163 000000D3 31DB XOR BX,BX ; destination segment
164 000000D5 8B16[4800] MOV DX,[paras_per_clust]
165 000000D9 8B26[4000] MOV SP,[bytes_per_clust]
166 000000DD 89E1 BL2: MOV CX,SP ; reload byte count
167 000000DF 8ED8 MOV DS,AX
168 000000E1 8EC3 MOV ES,BX
169 000000E3 31F6 XOR SI,SI
170 000000E5 31FF XOR DI,DI
171 000000E7 F3A4 REP MOVSB
172 000000E9 01D0 ADD AX,DX
173 000000EB 01D3 ADD BX,DX
174 000000ED 39E8 CMP AX,BP
175 000000EF 72EC JB BL2
176
177 ; transfer control to the application
178
179 000000F1 EA DB 0EAh ; An direct intersegment
180 000000F2 00000000 DW 0,0 ; jump to 0000:0000
181
182 Find_File:
183 ; ----------------------------------------------------------------
184 ; Parameters: None
185 ; Returns: DI = Starting Cluster
186 ; Modifies: BX, CX, BP, SI
187 ; ----------------------------------------------------------------
188 000000F6 8B2E[1100] MOV BP,[dir_entries]; #entries to search
189 000000FA 31DB XOR BX,BX ; start w/entry #0
190 000000FC 80BF000200 FF1: CMP BYTE [buffer+BX],0
191 00000101 741D JE FF3 ; done if rest is unused
192 00000103 F6870B0218 TEST BYTE [buffer+BX+11],00011000B
193 00000108 750F JNZ FF4 ; skip if dir or vol label
194 0000010A 8D36[4E00] LEA SI,[file2load] ; compare filename
195 0000010E 8DBF0002 LEA DI,[buffer+BX]
196 00000112 B90B00 MOV CX,11
197 00000115 F3A6 REP CMPSB
198 00000117 7408 JE FF2
199 00000119 81C32000 FF4: ADD BX,32 ; BX -> next entry
200 0000011D 4D DEC BP ; any more entries?
201 0000011E 75DC JNZ FF1
202 00000120 F4 FF3: HLT ; file not found
203 00000121 8BBF1A02 FF2: MOV DI,[buffer+BX+1Ah]
204 00000125 C3 RET
205
206 Read_Cluster:
207 ; ----------------------------------------------------------------
208 ; Parameters: DI = current cluster # (Preserved)
209 ; ES = buffer segment
210 ; Returns: Nothing
211 ; Modifies: AX, CX, DX, BP, ES, SI
212 ; ----------------------------------------------------------------
213 00000126 57 PUSH DI
214 00000127 0FB62E[0D00] MOVZX BP,BYTE [sctrs_per_clust]
215 0000012C 8D45FE LEA AX,[DI-2] ; 1st cluster in file space is #2
216 0000012F F7E5 MUL BP
217 00000131 0306[4400] ADD AX,[data_sector0]
218 00000135 89C7 MOV DI,AX ; DI = 1st logical sector
219 00000137 31DB XOR BX,BX ; load at offset 0 of segment
220 00000139 E82E00 CALL Read_Sectors ; (Modifies AX,BX,CX,DX,SI,DI,BP)
221 0000013C 8CC0 MOV AX,ES
222 0000013E 0306[4800] ADD AX,[paras_per_clust]
223 00000142 8EC0 MOV ES,AX
224 00000144 5F POP DI
225 00000145 C3 RET
226
227 Next_Cluster:
228 ; ----------------------------------------------------------------
229 ; Parameters: DI = current cluster #
230 ; Returns: DI = next cluster #
231 ; Modifies: AX, CX, DX
232 ; ----------------------------------------------------------------
233 00000146 89F8 MOV AX,DI
234 00000148 F726[3E00] MUL WORD [fat_nibbles] ; (DX will be zero)
235 0000014C D1E8 SHR AX,1 ; AX = rel offset into FAT entries
236 0000014E 9C PUSHF ; CF = 1: Left-Aligned FAT12 entry
237 0000014F 89C7 MOV DI,AX
238 00000151 58 POP AX
239 00000152 8BBD0002 MOV DI,[buffer+DI]
240 00000156 813E[3E00]0400 CMP WORD [fat_nibbles],4 ; FAT12 or FAT16?
241 0000015C 740B JE NC2 ; If FAT16, we're done.
242 0000015E D1E8 SHR AX,1 ; Get CF
243 00000160 7303 JNC NC1
244 00000162 C1EF04 SHR DI,4 ; Left-aligned FAT12
245 00000165 81E7FF0F NC1: AND DI,0FFFH
246 00000169 C3 NC2: RET
247
248 Read_Sectors:
249 ; ----------------------------------------------------------------
250 ; Parameters: DI = 1st logical sector #
251 ; BP = sector count
252 ; ES:BX = load address
253 ; Returns: Nothing
254 ; Modifies: AX, BX, CX, DX, SI, DI, BP
255 ; ----------------------------------------------------------------
256 0000016A BE0300 MOV SI,3 ; retry count
257 0000016D 89F8 RS1: MOV AX,DI
258 0000016F F636[1800] DIV BYTE [sctrs_per_track]
259 00000173 31D2 XOR DX,DX ; DL = drive 0
260 00000175 D0E8 SHR AL,1
261 00000177 D0D6 RCL DH,1 ; DH = head
262 00000179 FEC4 INC AH ; disk sectors start at 1
263 0000017B 86C4 XCHG AL,AH
264 0000017D 89C1 MOV CX,AX ; CH = track, CL = sector
265 0000017F B80102 MOV AX,0201H ; Read 1 sector
266 00000182 CD13 INT 13H
267 00000184 730B JNC RS3
268 00000186 4E DEC SI ; decrement retry count
269 00000187 7501 JNZ RS2
270 00000189 F4 HLT ; halt after 3 attempts
271 0000018A 31C0 RS2: XOR AX,AX ; reset disk...
272 0000018C CD13 INT 13H
273 0000018E E9DCFF JMP RS1 ; ...and try again
274 00000191 BE0300 RS3: MOV SI,3 ; reset retry count
275 00000194 031E[0B00] ADD BX,[bytes_per_sctr]
276 00000198 47 INC DI ; next logical sector
277 00000199 4D DEC BP ; any more?
278 0000019A 75D1 JNZ RS1
279 0000019C C3 RET
280
281 Wait8042:
282 ; ----------------------------------------------------------------
283 ; Wait for 8042 to complete previous command.
284 ; ----------------------------------------------------------------
285 0000019D 31C9 XOR CX,CX ; CX=65536 for timeout value
286 0000019F E464 Wait8042Loop: IN AL,64h ; Read the status port, find
287 000001A1 A802 TEST AL,00000010b ; out if the buffer is full
288 000001A3 E0FA LOOPNZ Wait8042Loop ; Loop until buffer empty
289 000001A5 C3 RET
290
291 Enable_A20:
292 ; ----------------------------------------------------------------
293 ; Enable the A20 line to make memory above 1MB accessible
294 ; ----------------------------------------------------------------
295 000001A6 E8F4FF CALL Wait8042 ; Be sure 8042 is ready
296 000001A9 7517 JNZ EnableA20Failed
297 000001AB B0D1 MOV AL,~00101110b ; Prepare to Write output port
298 000001AD E664 OUT 64h,AL
299 000001AF E8EBFF CALL Wait8042
300 000001B2 750E JNZ EnableA20Failed
301 000001B4 B0DF MOV AL,~00100000b ; Enable the A20 line
302 000001B6 E660 OUT 60h,AL
303 000001B8 E8E2FF CALL Wait8042
304 000001BB 7505 JNZ EnableA20Failed
305 000001BD 31C9 XOR CX,CX ; Command started; give
306 000001BF E2FE EnableA20Wait: LOOP EnableA20Wait ; it time to complete.
307 000001C1 C3 RET
308 000001C2 F4 EnableA20Failed:HLT
309
310 000001C3 00<rept> TIMES 510 - ($-$$) DB 0
311 000001FE 55AA DW 0AA55h
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -