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.
