EXTERN _loader_main
GLOBAL _main,_goto_protected_mode
SEGMENT _TEXT PUBLIC CLASS=CODE USE16
_main
; initialiser la pile
mov ax,0x9000
mov ss,ax
mov sp,0xFFFF
xor ax,ax
; faire un jump vers loader_main
jmp _loader_main
hlt
_goto_protected_mode:
call enable_A20
mov ax,gdt_end
mov bx,gdt
sub ax,bx
mov word [gdt_limit],ax
xor eax,eax
xor ebx,ebx
mov ax,ds
shl eax,4
mov bx,gdt
add eax,ebx
mov dword [gdt_base],eax
cli
lgdt [gdt_limit]
mov eax,cr0
or ax,1
mov cr0,eax
jmp refrech
refrech:
mov ax,0x10
mov ds,ax
mov es,ax
mov fs,ax
mov gs,ax
mov ss,ax
mov esp,0x9FFFF
jmp dword 0x8:0x100000
enable_A20:
cli
call a20wait
mov al,0xAD
out 0x64,al
call a20wait
mov al,0xD0
out 0x64,al
call a20wait2
in al,0x60
push eax
call a20wait
mov al,0xD1
out 0x64,al
call a20wait
pop eax
or al,2
out 0x60,al
call a20wait
mov al,0xAE
out 0x64,al
call a20wait
ret
a20wait:
.l0: mov ecx,65536
.l1: in al,0x64
test al,2
jz .l2
loop .l1
jmp .l0
.l2: ret
a20wait2:
.l0: mov ecx,65536
.l1: in al,0x64
test al,1
jnz .l2
loop .l1
jmp .l0
.l2: ret
SEGMENT _DATA PUBLIC CLASS=DATA USE16
gdt:
db 0,0,0,0,0,0,0,0
gdt_cs:
db 0xFF,0xFF,0,0,0,0x9b,0xDF,0
gdt_ds:
db 0xFF,0xFF,0,0,0,0x92,0xDF,0
gdt_end:
gdt_limit:
dw 0
gdt_base:
dd 0