So, wie gesagt habe ich schon einen FAT12-Bootstrap geschrieben. Er läd einfach die Datei LOST.SYS an Adresse 1000:0000. Und falls die Datei nicht gefunden wurde, gibt er eine Meldung aus. Ein paar verbesserungen kann man noch einbauen, wie z.B. beide FAT-Tabellen nutzen (fals eine beschädigt ist). Hier der Code:
;Bootstrap für LOST assemblieren mit nasm
org 7C00h
jmp EndBPB ;unter dem BIOS-Parameter-Block
OSName db "L O S T "
BytesPerSec dw 512
SecPerClus db 1
RsvdSecCnt dw 1
NumFATs db 2
RootEntCnt dw 224
TotSec dw 2880
MediaType db 0F0h
FATsize dw 9
SecPerTrack dw 18
NumHeads dw 2
HiddenSec dd 0
TotSec32 dd 0
DrvNum db 0
Reserved db 0
ExBPSign db 29h ;keine Ahnung wofür das ist
VolumeID dd 0FFFFFFFFh
DiskLabel db "LOST "
FileSysType db "FAT12 "
EndBPB:
cli
xor ax,ax
mov ds,ax
mov es,ax
mov ss,ax
mov sp,0FFFFh
sti
mov [drive],dl ;Laufwerk
;load rootdirectory
mov ax,32 ;32 Byte pro Eintrag
mul word [RootEntCnt]
div word [BytesPerSec]
mov cx,ax ;Anzahl der Sektoren für das Wurzelverzeichnis
mov al,[NumFATs]
xor ah,ah
mul word [FATsize]
add ax,[RsvdSecCnt] ;Startposition des Wurzelverzeichnisses nach ax
mov bx,7E00h ;nach 0000:7E00 das Wurzelverzeichnis laden
call ReadSectors
mov cx,[RootEntCnt]
mov di,7E00h
;search the filename
SearchFile:
push cx
mov cx,11 ;länge des Dateinamens
mov si,FileName
push di
rep cmpsb
pop di
pop cx
je LoadFAT
add di,32
loop SearchFile
jmp Error ;Datei nicht gefunden
LoadFAT:
mov dx,[di+001Ah] ;Startcluster der Datei
mov [FileCluster],dx
mov al,[NumFATs]
xor ah,ah
mul word [FATsize]
mov cx,ax ;Anzahl der Sektore für die beiden FAT-Tabellen
mov ax,[RsvdSecCnt] ;StartSektor der beiden FAT-Tabellen
mov bx,7E00h ;FAT-Tabellen nach 7E00h laden
call ReadSectors
;Lade Datei nach 1000:0000
mov ax,1000h
mov es,ax
xor bx,bx
push bx
LoadFile:
mov ax,[FileCluster]
pop bx
call CluSec ;Cluster zum Sektor umwandeln
mov cl,[SecPerClus]
xor ch,ch
call ReadSectors
push bx
;Aus FAT-Eintrag lesen (12 Bit)
mov ax,[FileCluster]
mov cx,ax
mov dx,ax
shr dx,1 ;durch zwei
add cx,dx
mov bx,7E00h
add bx,cx
mov dx,[bx]
test ax,0001h ;gerader oder ungerader Cluster?
jnz OddCluster ;ungerader Cluster
and dx,0FFFh
jmp Finish
OddCluster:
shr dx,4
Finish:
mov [FileCluster],dx
cmp dx,0FFFh ;letzter zu ladender Cluster der Datei?
jne LoadFile
pop bx
mov ax,1000h
mov ds,ax
mov es,ax
db 0EAh ;springe
dw 0000h ;Offset
dw 1000h ;Segment
;Datei wurde nicht gefunden
Error:
mov si,ErrorMsg
callWriteMsg
xor ah,ah
int 16h
;neu starten
db 0EAh
dw 0000h
dw 0FFFFh
WriteMsg:
lodsb
or al,al
jz WriteMsgBack
mov ah,0Eh
int 10h
jmp WriteMsg
WriteMsgBack:
ret
;input: ax = logischer Startsektor
; bx = Offsetadresse an dem die Sektoren geladen werden sollen
; cx = Anzahl der zu ladenden Sektore
; es = Segmentadresse an dem die Sektoren geladen werden sollen
;output: ax = letzter Sektor + 1
; bx = letze 512 Byte + 512
ReadSectors:
push ax
push bx
push cx
call LogPhySec
ReadSectors2:
mov ax,0201h ;ein Sektor laden
mov cl,[PhySector]
mov ch,[PhyTrack]
mov dl,[drive]
mov dh,[PhyPage]
int 13h
jc ReadSectors2
pop cx
pop bx
pop ax
add bx,[BytesPerSec]
inc ax
loop ReadSectors
ret
;input: ax = logischer Sektor
;output: ds:PhySec = physikalischer Sektor
; ds:PhyTrack = Spur
; ds:PhyPage = Seite
LogPhySec:
push ax
push dx
xor dx,dx
div word [SecPerTrack]
inc dl
mov [PhySector],dl
xor dx,dx
div word [NumHeads]
mov [PhyPage],dl
mov [PhyTrack],al
pop dx
pop ax
ret
;input: ax = Cluster
;output: ax = Sektor
CluSec:
push cx
push dx
sub ax,2 ;die ersten beiden Cluster-Einträge sind in der FAT reserviert
mov cl,[SecPerClus]
xor ch,ch
mul cx
mov cx,[RsvdSecCnt]
add ax,cx
push ax
mov ax,32
mul word [RootEntCnt]
div word [BytesPerSec]
mov cx,ax
pop ax
add ax,cx
push ax
mov al,[NumFATs]
xor ah,ah
mul word [FATsize]
mov dx,ax
pop ax
add ax,dx
pop dx
pop cx
ret
Msg db "LOST wird geladen...",00h
ErrorMsg db "LOST: Datei nicht gefunden.",0
FileName db "LOST SYS"
drive db 0
FileCluster dw 0
PhySector db 0
PhyTrack db 0
PhyPage db 0
times 510-($-$$) db 0
dw 0AA55h