A20
Posted: Fri Apr 04, 2003 12:00 am
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
-------------------------------------------------------------------------------
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
-------------------------------------------------------------------------------