Re: Bootloader
Verfasst: Mi 16. Nov 2016, 22:22
Ich habe vor Jahren mal ein bisschen mit sowas rumexperimentiert und habe noch diesen alten Quellcode für einen eigenen Bootsektor.
Keine Ahnung ob der code so funktioniert, aber vielleicht hilft er interessierten ja weiter.
Läd zwar auch keine EXE-Dateien, aber prüft auf 386er und VGA und springt in den Protected Mode.
Das ist doch auch schonmal etwas
Wenn man den auf den ersten Sektor schreibt, wird die Diskette von DOS natürlich nicht mehr erkannt.
Keine Ahnung ob der code so funktioniert, aber vielleicht hilft er interessierten ja weiter.
Code: Alles auswählen
.386
_Text SEGMENT PUBLIC USE16
assume CS:_Text, DS:_Text
org 0
Entry:
db 0EAh ; jmp far SEG:OFS ; Wir sind an 0:7C00
dw OFFSET Start, 08000h ;Und jetzt an 08000:0
; -------------------------------------
; Daten
; -------------------------------------
bootmsg db 'Loader V.1.1 vom 14.06.1999',13,10,0
loadmsg db 'Kernel erfolgreich geladen! Taste druecken...',13,10,0
rebootmsg db 'Taste druecken für Neustart',13,10,0
processormsg db 'Pruefe auf 386 oder besser: ',0
vgamsg db 'Pruefe auf VGA: ',0
needVGA db 'Sorry... VGA benoetigt!',13,10,0
need386 db 'Sorry... 386+ benoetigt!',13,10,0
found386 db 'OK!',13,10,0
cr db 13,10,0
pmodemsg db 'Wechsel in den Protected Mode...',13,10,0
allok db 'Erfolgreich geladen!',13,10,0
; IDT und GDT. Intel = little endian!
pIDT dw 7FFh ; max 256 IDT slots
dd 0000h
pGDT dw 17FFh ; max 768 GDT slots
dd 0800h ; start an 0800h (hinter IDT)
; -------------------------------------
; Subroutinen
; -------------------------------------
detect_cpu:
mov si,OFFSET processormsg
call message
; test 8088/8086 (flag bits 12-15 set)
pushf
xor ah,ah
push ax
popf
pushf
pop ax
and ah,0f0h
cmp ah,0f0h
je no386 ; nein? Dann wohl 286 (8088/8086 vorhanden)
; test auf 286 (bits 12-15 = 0)
mov ah,0f0h ; setze bits 12-15
push ax
popf
pushf
pop ax
and ah,0f0h ; prüfe ob bits 12-15 = 0
jz no386 ; nein?
popf
mov si, OFFSET found386
call message
ret
no386:
mov si, OFFSET need386
call message
jmp reboot
; ------------------------------------------------------------------
detect_VGA:
mov ax, 01A00h
int 010h ;prüfe VGA/MCGA
cmp al, 01Ah
jne NoVGA ;kein VGA Bios
cmp bl, 7
jb NoVGA
cmp bl, 0FFh
jz NoVGA
mov si,OFFSET bootmsg ; startup message
call message
mov si,OFFSET cr
call message
mov si,OFFSET vgamsg
call message
mov si,OFFSET found386
call message
ret
NoVGA:
mov si,OFFSET needVGA
call message
jmp reboot
; ------------------------------------------------------------------
message:
lodsb
or al,al
jz done
mov ah,0Eh
xor bx,bx
mov cx,1
int 010h
jmp message
done:
ret
; ------------------------------------------------------------------
getkey:
mov ah, 0
int 016h
ret
; ------------------------------------------------------------------
reboot:
mov si,OFFSET rebootmsg
call message
call getkey
db 0EAh ; jump FFFF:0000 (reboot)
dw 0000h
dw 0FFFFh
Start:
mov si,OFFSET bootmsg
call message
mov si,OFFSET cr
call message
call detect_VGA
call detect_cpu
mov si,OFFSET pmodemsg
call message
mov si,OFFSET cr
call message
mov eax, cr0 ; lade kontrollregister
or al, 1 ; setze bit 1, das pmode bit
mov cr0, eax ; zurück damit in das kontrollregister
jmp $+2 ; und den prefetch queue leeren
nop
nop
mov si,OFFSET loadmsg
call message
call getkey
call reboot
_Text ENDS
END
Das ist doch auch schonmal etwas
Wenn man den auf den ersten Sektor schreibt, wird die Diskette von DOS natürlich nicht mehr erkannt.