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