I've been working for a long time on my own OS, an it works fine within emulator such as Bochs & Qemu. But it fails on real hardware : i have tested with 3 real PC, it's ok until it reaches "STI" and so, no IRQ is fired and OS loops in "idle" task. I've been searching for days an days (forums, doc) but found nothing significant.
Do you have any idea ?
Samples of code :
A20 gate
Code: Select all
; activation ligne A20
; masquer les irg
mov al,0xFF
out 0xA1,al
out 0x21,al
; si ko, essayer de desactiver le kbd avant (out 0x64,0xAD) et de le
; reactiver apres (cmd out 0x64,0xAE), ou de lire le Ouput Port avant d'y
; ecrire la meme valeur OR 2 (bit du A20 : bit 1 - a mettre a 1 pour activer A20)
;
;mov al,0xAD
;out clavier_port_command,al ; ecriture Output Port du 8042
;
attente_8042_1:
jmp $+2
in al,clavier_port_command
test al,2
jnz attente_8042_1 ; attend que le buffer soit dispo (bit 1 à 0)
;
mov al,0xD1
out clavier_port_command,al ; ecriture Output Port du 8042
;
attente_8042_2:
jmp $+2
in al,clavier_port_command
test al,2
jnz attente_8042_2 ; on attend que le buffer soit dispo (bit 1 a 0)
;
mov al,0xDF ; A20 + activation IRQ souris et clavier (0xCF a l'origine, 0xDF menuet32+bochs)
out clavier_port_data,al ; autoriser la ligne A20 (envoi controleur 8042)
;
attente_8042_3:
jmp $+2
in al,clavier_port_command
test al,2
jnz attente_8042_3 ; on attend que le buffer soit dispo (bit 1 a 0)
;
;mov al,0xAE
;out clavier_port_command,al ; ecriture Output Port du 8042
;
attente_8042_4:
;jmp $+2
;in al,clavier_port_command
;test al,2
;jnz attente_8042_4 ; on attend que le buffer soit dispo (bit 1 a 0)
Code: Select all
; mise en place des IRQ, programmation 8259
; sauvegarde des masques
;in al,0x21
;mov bh,al
;in al,0xA1
;mov bl,al
; iowait a mettre apres chaque out, pour laisser le temps au PIC de travailler
;mov al,0xFF ; Masquage de toutes les interruptions avant travaux
;out 0xA1,al
;call pic_iowait
;out 0x21,al
;call pic_iowait
;
mov al,0x11 ; Initialisation
out 0x20,al
out 0xA0,al
;call pic_iowait
mov al,0x20 ; Initialisation - Master - 1ere IRQ = 0x20
out 0x21,al
mov al,0x28 ; Initialisation - Slave - 1ere IRQ = 0x28
out 0xA1,al
;call pic_iowait
mov al,0x04 ; Initialisation - Master - lien master/slave
out 0x21,al
mov al,0x02 ; Initialisation - Slave - lien master/slave
out 0xA1,al
;call pic_iowait
mov al,0x01 ; Initialisation - Master - divers (8086)
out 0x21,al
mov al,0x01 ; Initialisation - Slave - divers (8086)
out 0xA1,al
;call pic_iowait
;
; attente plus longue avant de remettre les masques
mov ecx,0xFFFF
pic_att:
nop
loop pic_att
; remise des masques sauvegardes
;mov al,bh
mov al,0
out 0x21,al
out 0xA1,al
call pic_iowait
;mov al,bl
; envoi EOI aux 2 pics
mov al,0x20
out 0x20,al
out 0xA0,al
jmp pic_fin
pic_iowait:
nop
ret
pic_fin:
Thanks to all by advance