<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
<META content="MSHTML 6.00.2600.0" name=GENERATOR></HEAD>
<BODY id=role_body style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Arial" 
bottomMargin=7 leftMargin=7 topMargin=7 rightMargin=7><FONT id=role_document 
face=Arial color=#000000 size=2>
<DIV>Bonsoir,</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;Quelqu'un peut-il me filer un tuyau car j'avoue que 
pour le moment j'ai du mal à comprendre ce qui se passe ?</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;Voilà, j'ai un Bootloader qui fonctionne sous Qemu, 
Bochs, VmWare et sur machine réelle, malheureusement il ne veut pas fonctionner 
sur Virtual PC !!!</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;Est-ce que quelqu'un dans la salle utilise Virtual 
PC, mon but etant d'avoir un bootloader qui fonctionne sur tous les 
émulateurs.</DIV>
<DIV>&nbsp;</DIV>
<DIV>Pour ceux que cela interresse, ci-dessous le source du bootloader.</DIV>
<DIV>&nbsp;</DIV>
<DIV>Cordialement,</DIV>
<DIV>&nbsp;</DIV>
<DIV>Krys</DIV>
<DIV>&nbsp;</DIV>
<DIV>------------Début du bootloader-------------</DIV>
<DIV>&nbsp;</DIV>
<DIV>[BITS 
16]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
; Set 16 bit code generation<BR>[ORG 
0x0000]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
; Set code start address to 000h (SYS File)</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;jmp START</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;OEM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
db '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '&nbsp;&nbsp;&nbsp;&nbsp; ;OEM 
String<BR>&nbsp;BytesPerSector&nbsp;&nbsp;&nbsp;&nbsp; dw 
0x0200&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;Bytes per sector 
(fixed)<BR>&nbsp;SectorsPerCluster&nbsp; db 
0x01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;Sectors per 
cluster (fixed)<BR>&nbsp;ReservedSectors&nbsp;&nbsp;&nbsp; dw 
0x0001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;Number of reserved 
sectors 
(fixed)<BR>&nbsp;TotalFats&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
db 0x02&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;Number of 
fat copies<BR>&nbsp;MaxRootEntries&nbsp;&nbsp;&nbsp;&nbsp; dw 
0x00E0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;Number of directories 
(512*14/32)<BR>&nbsp;TotalSectorsSmall&nbsp; dw 
0x0B40&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;Number of sectors 
(18*80*2)<BR>&nbsp;MediaDescriptor&nbsp;&nbsp;&nbsp; db 
0xF0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;Media 
Descriptor (Floppy Disk)<BR>&nbsp;SectorsPerFat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dw 
0x0009&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;Number of 
sectors<BR>&nbsp;SectorsPerTrack&nbsp;&nbsp;&nbsp; dw 
0x0012&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;Number of sectors per 
Track<BR>&nbsp;NumHeads&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
dw 0x0002&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;Number of 
Heads<BR>&nbsp;HiddenSectors&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dd 
0x00000000&nbsp;&nbsp;&nbsp;&nbsp; ;<BR>&nbsp;TotalSectorsLarge&nbsp; dd 
0x00000000&nbsp;&nbsp;&nbsp;&nbsp; 
;<BR>&nbsp;DriveNumber&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db 
0x00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;Drive number 
(fixed)<BR>&nbsp;Flags&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
db 0x00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
;<BR>&nbsp;Signature&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db 
0x29&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
;<BR>&nbsp;VolumeID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
dd 0x05102001&nbsp;&nbsp;&nbsp;&nbsp; 
;<BR>&nbsp;VolumeLabel&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db 
'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '&nbsp; 
;<BR>&nbsp;SystemID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
db 'FAT12&nbsp;&nbsp; '&nbsp;&nbsp;&nbsp;&nbsp; ;</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;DataSector&nbsp;&nbsp;&nbsp; dw 
0x0000<BR>&nbsp;Cluster&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dw 
0x0000<BR>&nbsp;<BR>&nbsp;Dummy&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
db 0x00<BR>&nbsp;&nbsp; <BR>;Constantes&nbsp; <BR>&nbsp;%define LoaderSegment 
0x0100<BR>&nbsp;%define LoaderOffset&nbsp; 0x0000<BR>&nbsp;<BR>&nbsp;%define 
BootSegment&nbsp;&nbsp; 0xFFFF<BR>&nbsp;%define BootOffset&nbsp;&nbsp;&nbsp; 
0x0000<BR>&nbsp;<BR>&nbsp;%define 
Buffer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
EndSector+0x0002<BR>&nbsp;<BR>&nbsp;ImageName db 'LOADER&nbsp; BIN'</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;FailureMessage&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db 
0x0D,0x0A,'Error, Press Any Key to 
reboot',0x00<BR>&nbsp;CrLfMessage&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
db 
0x0D,0x0A,0x00<BR>&nbsp;DotMessage&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
db '.',0x00</DIV>
<DIV>&nbsp;</DIV>
<DIV><BR>Failure:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov si, 
FailureMessage<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call 
Write<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xor ah, 
ah<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int 
0x16<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jmp 
BootSegment:BootOffset</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<BR>Write:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
lodsb<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; or al, 
al<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jz 
Write_01<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov ah, 
0x0E<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov bx, 
0x0007<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int 
0x10<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jmp 
Write<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
Write_01:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>;Convert LBA adressing 
scheme to CHS adressing scheme.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<BR>ReadSectors:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov di, 
0x0003<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
ReadSectors_01:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push 
ax<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push 
bx<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push 
cx<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xor dx, 
dx<BR>;AbsoluteSector=(LogicalSector div 
SectorsPerTrack)+0x0001.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; div word 
[SectorsPerTrack]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inc 
dl<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov byte [Dummy], 
dl<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xor dx, 
dx<BR>;AbsoluteHead=(LogicalSector div SectorPerTrack) mod NumHeads (in register 
dl).<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; div word 
[NumHeads]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov dh, byte 
[DriveNumber]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xchg dl, 
dh<BR>;AbsoluteTrack=(LogicalSector div (SectorPerTrack*NumHeads)) (in register 
al).&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov cx, 
ax<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xchg cl, 
ch<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shl cl, 
0x0006<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; or cl, byte 
[Dummy]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov al, 
0x01<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov ah, 
0x02<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int 
0x13<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jnc 
ReadSectors_02<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xor ax, 
ax<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int 
0x13<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dec 
di<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop 
cx<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop 
bx<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop 
ax<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jnz ReadSectors_01<BR>;Call the 
"Failure" function.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call 
Failure<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
ReadSectors_02:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov si, 
DotMessage<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call 
Write<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop 
cx<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop 
bx<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop 
ax<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; add bx, word 
[BytesPerSector]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inc 
ax<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loop 
ReadSectors<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>START:<BR>;Code located at 
0x00007C00, adjust segment 
registers.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov ax, 
0x07C0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov ds, 
ax<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov es, ax<BR>;Create Stack at 
0x0009FFFF.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
cli<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov ax, 
0x9000<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov ss, 
ax<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov sp, 
0xFFFF<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sti<BR>;Save current 
driver.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov byte [DriveNumber], 
dl<BR>;Clean the screen.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov ax, 
0x0003<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int 0x0010<BR>;Compute size 
of root directory and store in "CX" 
register.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xor cx, 
cx<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xor dx, dx<BR>;Calculate the 
number of sectors for Root Directory.<BR>;For a floppy: 32 bytes*224 
directories/512 bytes per 
sector.<BR>;SectorPerRootDirectory=14.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
mov ax, 0x0020<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mul word 
[MaxRootEntries]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; div word 
[BytesPerSector]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xchg ax, 
cx<BR>;Compute location of Root Directory and store in 
DataSector.<BR>;DataSector=(SectorPerRootDirectory)14+(ReservedSectors)1+(TotalFats*SectorsPerFat)18.<BR>;DataSector=33.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
mov al, byte [TotalFats]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mul word 
[SectorsPerFat]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; add ax, word 
[ReservedSectors]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov word 
[DataSector], ax<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; add word 
[DataSector], cx<BR>;Copy Root Directory into Root Buffer at 0x07C0:0x0200 or 
0x00007E00.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov bx, 
Buffer<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call ReadSectors<BR>;Jump a 
line on the screen.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov si, 
CrLfMessage<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call Write<BR>;Browse 
Root Buffer for Binary Image.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov 
cx, word [MaxRootEntries]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov di, 
Buffer<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
cld<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
NextRootEntry:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push 
cx<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov cx, 
0x000B<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov si, 
ImageName<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push 
di<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rep 
cmpsb<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop 
di<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop 
cx<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; je 
LoadFat<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; add di, 
0x0020<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loop 
NextRootEntry<BR>;Error beccause we didn't find the file in the Root 
Buffer.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call Failure<BR>;Loading the 
Fat.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LoadFat:<BR>;Save starting cluster of 
boot image.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov dx, 
[di+001Ah]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov word [Cluster], 
dx<BR>;Compute size of Fat.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov 
cx, word [SectorsPerFat]<BR>;Compute location of 
Fat.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov ax, word 
[ReservedSectors]<BR>;Copy Fat into Fat Buffer at 0x07C0:0x0200 or 
0x00007E00.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov bx, 
Buffer<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call ReadSectors<BR>;Jump a 
line on the screen.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov si, 
CrLfMessage<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call Write<BR>;Copy 
Image file into memory at 0x0100:0x0000 or 
0x00001000.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov ax, 
LoaderSegment<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov es, 
ax<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov bx, 
LoaderOffset<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push 
bx<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
LoadImage:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov ax, word 
[Cluster]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop bx<BR>;Subtract 2 
from the logical cluster number (because they start at 
2).&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sub ax, 
0x0002<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xor cx, 
cx<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov cl, byte 
[SectorsPerCluster]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mul 
cx<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; add ax, word 
[DataSector]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xor cx, 
cx<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov cl, byte 
[SectorsPerCluster]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call 
ReadSectors<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push bx<BR>;Compute 
next sector.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov ax, word 
[Cluster]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov cx, 
ax<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov dx, ax<BR>;Divide by 
two.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shr dx, 
0x0001<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; add cx, 
dx<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov bx, 
Buffer<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; add bx, 
cx<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov dx, word 
[bx]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test ax, 
0x0001<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jnz 
OddCluster<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
EvenCluster:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and dx, 
0000111111111111b<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jmp 
NextCluster<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
OddCluster:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shr dx, 
0x0004<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
NextCluster:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov word [Cluster], 
dx<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmp dx, 
0x0FF0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jb LoadImage<BR>;We 
identify the FAT, here it's a FAT12.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xor ax, ax<BR>;FAT12 is the 
filesystem type of the boot 
device.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push ax<BR>;Far jump to 
the loader at adress 0x0100:0x0000 or 
0x00001000.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jmp 
LoaderSegment:LoaderOffset</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;TIMES 510-($-$$) db 0x00<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
EndSector:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dw 0xAA55</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;</DIV></FONT></BODY></HTML>