Ist zwar noch ziemlich in der Entwicklung. Jedoch schaltet es schonmal in den PMode.
Grafikmodus musst du aber selbst noch schalten lassen.
Einen Bootloader hab ich weiter oben auch gepostet.
Dieser läd dir zumindest eine binäre Datei in den Speicher. Dieser Datei muss aber selbst noch Code enthalten die in den PMode schaltet.
Dazu kannst du Ansatzweise diesen hier benutzen.
Der ist aber noch nicht ausgereift und ich empfehle es auch nicht umbedingt diesen 1 zu 1 zu kopieren.
Wenn der Code mal fertig ist, wird er im Resource-Center gepostet.
[BITS 16]
jmp start
gdt_null:
dw 0
dw 0
dw 0
dw 0
gdt_code:
dw 0xFFFF ;Segmentgröße Byte 0/1
dw 0 ;Segmentbasisadresse Byte 0/1
db 0 ;Segmentbasisadresse Byte 2
db 10011010b ;Zugriffsberechtigungen
db 11001111b ;Zusatz + Segmentgröße Bits 16 - 19
db 0 ;Segmentbasisadresse Byte 3
gdt_data:
dw 0xFFFF
dw 0
db 0
db 10010010b
db 11001111b
db 0
gdt_end:
gdt:
Limit dw 0
Base dd 0
start:
cli
mov ax, 0x1000
mov ds, ax
mov es, ax
mov ax, cs
and eax, 0xFFFF
shl eax, 4 ;Physikalische Startadresse der GDT errechnen
add eax, gdt_null
mov [Base], eax
mov ax, cs
and eax, 0xFFFF
shl eax, 4
mov WORD [gdt_code+2], ax
shr eax, 16
mov BYTE [gdt_code+4], al
mov WORD [Limit], gdt_end - gdt_null
lgdt [gdt]
mov eax, cr0
or eax, 1
mov cr0, eax
mov eax, 0x10
mov ds, ax
mov ss, ax
mov es, ax
db 0xea
dw PMODE
dw 08h
[BITS 32]
extern _main
global _EnableA20Gate
;#######################################################################
PMODE:
mov esp, 0xFFFF
jmp PMODE
sti
;#######################################################################
_EnableA20Gate:
cli
push ecx
.0:
mov ecx, 5
.1:
mov eax, 0
in al, 64h
test al, 00000001b
je .1
mov al, 0xD0
out 64h, al
.2:
mov eax, 0
in al, 64h
test al, 00000001b
jne .2
mov eax, 0
in al, 60h
push eax
.3:
mov eax, 0
in al, 64h
test al, 00000001b
je .3
mov al, 0xD1
out 64h, al
.4:
mov eax, 0
in al, 64h
test al, 00000001b
je .4
pop eax
or al, 00000010b
out 60h, al
.5:
mov eax, 0
in al, 64h
test al, 00000001b
je .5
mov al, 0xD0
out 64h, al
.6:
mov eax, 0
in al, 64h
test al, 00000001b
je .6
mov eax, 0
in al, 60h
test al, 00000001b
je .Enabled
loop .0
.Failed:
sti
pop ecx
mov eax, 0
ret
.Enabled:
sti
pop ecx
mov eax, 1
ret