Page 1 of 1

A20

Posted: Fri Apr 04, 2003 12:00 am
by pepito
The code that follow actvate A20 in my little OS. I test it with Bochs 2.0 and it runs nice, but when I run it in my laptop computer (COMPAQ CONTURA 4/25) it fails.

Someone knows why?

-------------------------------------------------------------------------------

activar_A20:

pusha
mov cx, 5 ; Se intentará 5 veces

.PrimerMetodo:

.esperar1:

xor ax, ax
in al, 0x64
bt ax, 1
jc .esperar1

mov al, 0xD0
out 0x64, al

.esperarbyte1:

xor ax, ax
in al, 0x64
bt ax, 0
jnc .esperarbyte1

xor ax, ax
in al, 0x60

push ax ; Guardar el valor de 'ax'

.esperar2:

xor ax, ax
in al, 0x64
bt ax, 1
jc .esperar2

mov al, 0xD1
out 0x64, al

.esperar3:

xor ax, ax
in al, 0x64
bt ax, 1
jc .esperar3

pop ax ; Recuperar el valor almacenado

or al, 0x02 ; Activar el bit A20
out 0x60, al

.esperar4:

xor ax, ax
in al, 0x64
bt ax, 1
jc .esperar4

mov al, 0xD0 ; Comando leer
out 0x64, al

.esperarbyte2:

xor ax, ax
in al, 0x64
bt ax, 0
jnc .esperarbyte2

xor ax, ax
in al, 0x60

bt ax, 1 ; Checar el bit A20
jc mapear_IRQ ; Saltar si si está activo

loop .PrimerMetodo

mov cx, 5 ; Nuevamente se intentará 5 veces

.SegundoMetodo:

.esperar5:

xor ax, ax
in al, 0x64
bt ax, 1
jc .esperar5

mov al, 0xDF
out 0x64, al

.esperar6:

xor ax, ax
in al, 0x64
bt ax, 1
jc .esperar6

mov al, 0xD0
out 0x64, al

.esperarbyte3:

xor ax, ax
in al, 0x64
bt ax, 0
jnc .esperarbyte3

xor ax, ax
in al, 0x60

bt ax, 1 ; Checar el bit A20
jc mapear_IRQ ; Saltar si si está activo

loop .SegundoMetodo

mov     si, mensaje_ERROR
call    mensaje ; Desplegar mensaje de aviso

hlt ; Detener el procesador

-------------------------------------------------------------------------------