i've testet my code and it worked on qemu...
here is my new snapshot
Code:
BITS 32
GLOBAL osdk_i386_lock
GLOBAL osdk_i386_unlock
GLOBAL osdk_i386_in
GLOBAL osdk_i386_out
GLOBAL osdk_i386_reboot
GLOBAL osdk_i386_set_gdt_desc
GLOBAL osdk_i386_set_idt_desc
GDT:
GDT_LIMIT DW 0FFFFh
GDT_ADDR DD GDT_DESC
GDT_DESC:
TIMES 10000h DB 0h
IDT:
IDT_LIMIT DW 800h
IDT_ADDR DD GDT_DESC
IDT_DESC:
TIMES 800h DB 0h
osdk_i386_lock:
CLI
RET
osdk_i386_unlock:
STI
RET
osdk_i386_out:
PUSH EBP
MOV EBP, ESP
PUSH DX
PUSH AX
MOV DX, WORD [EBP+8]
MOV AL, BYTE [EBP+12]
OUT DX, AL
POP AX
POP DX
POP EBP
RET
osdk_i386_in
PUSH EBP
MOV EBP ,ESP
PUSH DX
MOV DX, WORD [EBP+8]
IN AL, DX
POP DX
POP EBP
RET
osdk_i386_reboot:
CLI
REBOOT_LOOP:
IN AL, 64h
MOV AH, AL
AND AH, 01h
OR AH, AH
JZ REBOOT_END
PUSH AX
IN AL, 60h
POP AX
AND AL, 02h
OR AL, AL
JNZ REBOOT_LOOP
REBOOT_END:
MOV AL, 0FEh
OUT 64h, AL
HLT
HALT:
JMP HALT
SET_GDT_SEG_DESC:
PUSH EDI
PUSH EDX
PUSH ECX
PUSH EBX
PUSH EAX
;; ASSUMES BX=NUMBER, ESI=POINTER TO DESC
MOV EDI, GDT_DESC
MOV EAX, 08h
MUL BX
ADD EDI, EAX
CLD
MOV CX, 08h
REP MOVSB
POP EAX
POP EBX
POP ECX
POP EDX
POP EDI
RET
osdk_i386_set_gdt_desc:
PUSH EBP
MOV EBP, ESP
PUSH ESI
PUSH EBX
MOV EBX, [EBP+8]
MOV ESI, [EBP+12]
CALL SET_GDT_SEG_DESC
POP EBX
POP ESI
POP EBP
RET
SET_IDT_SYS_DESC:
PUSH EDI
PUSH EDX
PUSH ECX
PUSH EBX
PUSH EAX
;; ASSUMES BX=NUMBER, ESI=POINTER TO DESC
MOV EDI, IDT_DESC
MOV EAX, 08h
MUL BX
ADD EDI, EAX
CLD
MOV CX, 08h
REP MOVSB
POP EAX
POP EBX
POP ECX
POP EDX
POP EDI
RET
osdk_i386_set_idt_desc:
PUSH EBP
MOV EBP, ESP
PUSH ESI
PUSH EBX
MOV EBX, [EBP+8]
MOV ESI, [EBP+12]
CALL SET_IDT_SYS_DESC
POP EBX
POP ESI
POP EBP
RET
LOAD_GDT:
GDTA DD GDT
LGDT [GDTA]
RET
LOAD_IDT:
IDTA DD IDT
LIDT [IDTA]
RET