[BITS 16]
[CPU PentiumPro]
jmp short MainEntryPoint
nop
%define Bootdrive 0x200 + 0x00
%define DiskAdressPacket 0x200 + 0x01
%define DiskAdressPacket.Size DiskAdressPacket + 0x00
%define DiskAdressPacket.Reserved DiskAdressPacket + 0x01
%define DiskAdressPacket.Count DiskAdressPacket + 0x02
%define DiskAdressPacket.Buffer DiskAdressPacket + 0x04
%define DiskAdressPacket.LBALow DiskAdressPacket + 0x08
%define DiskAdressPacket.LBAHigh DiskAdressPacket + 0x0C
MainEntryPoint:
cli ; Keine Interrupts zulassen
mov AX, 0x07C0 ; Segmentregister updaten
mov DS, AX ;
mov ES, AX ;
mov FS, AX ;
mov GS, AX ;
xor AX, 0x9000 ; Stack setzen
mov SS, AX ;
xor SP, SP ;
sti ; Interrupts wieder zulassen
mov [Bootdrive], DL ; Bootlaufwerk speichern
CheckLBAExtensions:
mov AH, 0x41 ; ExtLBA Installation Check
mov BX, 0x55AA ; Test Muster
mov DL, byte [Bootdrive] ; Bootlaufwerk
int 13h ; Interrupt 13h ausführen
jb short LBAExtensions.Exception.NotFound ; Falls ein Fehler auftritt --> Exception auslösen
cmp BX, 0xAA55 ; Überprüfen, ob das Testmuster richtig zurückgegeben wurde
jne short LBAExtensions.Exception.NotFound ; Falls nein --> Exception auslösen
cmp CL, 00000100b ; Überprüfen, ob das Laufwerk unterstützt wird (ob Bit 3 gesetzt ist)
je short LBAExtensions.Exception.NoSupport ; Falls nein --> Exception auslösen
jmp short LoadBootloader ; Zur Lade Routine des Bootloaders springen
; Exception, falls Die LBA Erweiteruingen nicht installiert sind
LBAExtensions.Exception.NotFound:
mov SI, Error1
jmp short RaiseError
; Exception, falls Die LBA Erweiteruingen nicht verfügbar sind (für das aktuelle Laufwerk)
LBAExtensions.Exception.NoSupport
mov SI, Error2
jmp short RaiseError
LoadBootloader:
mov AH, 0x42
mov DL, byte [Bootdrive]
mov byte [DiskAdressPacket.Size], 0x10
mov byte [DiskAdressPacket.Reserved], 0x00
mov byte [DiskAdressPacket.Count], 0x01
mov dword [DiskAdressPacket.Buffer], 0x10000000
mov dword [DiskAdressPacket.LBALow], 0x000000001
mov dword [DiskAdressPacket.LBAHigh], 0x000000000
mov SI, DiskAdressPacket
int 13h
jb LoadBootloader.Exception
jmp short ShellBootloader
LoadBootloader.Exception:
mov SI, Error3
jmp short RaiseError
ShellBootloader:
cli ; Keine Interrupts zulassen
mov AX, 0x07C0 ; Segmentregister updaten
mov DS, AX ;
mov ES, AX ;
mov FS, AX ;
mov GS, AX ;
xor SP, SP ; Stack neu setzen
sti ; Interrupts wieder zulassen
push 0x1000 ; Segment laden...
push 0x0000 ; Offset laden...
retf ; Zum Bootloader springen
Print:
mov AL, byte [SI] ; Zeichen aus RAM laden
inc SI ;
or AL, AL ;
jz short PrintEnd ; Wenn Zeichen = 0 Routine beenden
mov AH, 0x0E ; Zeichen ausgeben mit Int 0x10
mov BX, 0x0007 ;
int 0x10 ;
jmp short Print ; Nächstes Zeichen laden
PrintEnd: ; Alle Zeichen sind Ausgegeben
ret ;
RaiseError:
push SI ; Felher ausgeben
mov SI, GlobalError ;
call Print ;
pop SI ;
call Print ;
jmp $ ;
GlobalError db "Fatal Error:", 13, 10, " ** STOP (0x000000)", 0
Error1 db 13, 10, " --> Das BIOS unterstützt keine Logische Laufwerksadressierung!"
Error2 db 13, 10, " --> Ihr BIOS unterstützt keinen Lesezugriff für das aktuelle Laufwerk!"
Error3 db 13, 10, " --> Fehler beim Laden des Bootloader!"
times 510-($-$$) db 0x00 ; Den Rest des Bootsektors mit Nullen füllen (Bis auf 2 Bytes)
dw 0xAA55 ; Bootsignatur anhängen "U?"