aboutsummaryrefslogtreecommitdiffstats
path: root/src/boot/boot.stage2.a20.asm
diff options
context:
space:
mode:
authorkotorifan <kotorifan05@gmail.com>2026-03-07 17:14:14 +0100
committerkotorifan <kotorifan05@gmail.com>2026-03-07 17:14:14 +0100
commitf81dee10ef19f0c82eb89d0e528bcbfb7a38b016 (patch)
tree32e733d4ad2471419bdc9e1dd112d1d6a5b90958 /src/boot/boot.stage2.a20.asm
parent857f2d6fe4a77a485d9ed46c0c80eecf61142607 (diff)
downloadkotori-os-f81dee10ef19f0c82eb89d0e528bcbfb7a38b016.tar.gz
Kernel loads now, bootloader works kind of
Diffstat (limited to 'src/boot/boot.stage2.a20.asm')
-rw-r--r--src/boot/boot.stage2.a20.asm135
1 files changed, 17 insertions, 118 deletions
diff --git a/src/boot/boot.stage2.a20.asm b/src/boot/boot.stage2.a20.asm
index 3c69d79..d0b52c4 100644
--- a/src/boot/boot.stage2.a20.asm
+++ b/src/boot/boot.stage2.a20.asm
@@ -1,147 +1,46 @@
- ;; boot.stage2.a20.asm
- section .stage2
+ ;; boot.stage2.a20.asm
_enable_a20:
- call _check_a20
- test ax, ax
- jnz .end
+ cli
- call _enable_a20_bios
- call _check_a20
- test ax, ax
- jnz .end
-
- call _enable_a20_keyb
- call _check_a20
- test ax, ax
- jnz .end
-
- call _enable_a20_io92
- call _check_a20
- test ax, ax
- jnz .end
-
- .halt: hlt
- jmp .halt
- .end:
- ret
-
-_check_a20:
- pushf
- push ds
- push es
- push di
- push si
- cli ; Clear Interrupts
-
- xor ax, ax
- mov es, ax
- not ax
- mov ds, ax
- ;; 0500 and 0510 are guaranteed to be free
- mov di, 0x0500
- mov si, 0x0510
-
- ;; Save the original values
- mov dl, byte [es:di]
- push dx
- mov dl, byte [ds:si]
- push dx
-
- mov byte [es:di], 0x00
- mov byte [ds:si], 0xFF
- cmp byte [es:di], 0xFF
-
- mov ax, 0 ; The A20 is disabled
- je .a20_disabled
- mov ax, 1 ; The A20 is enabled
- .a20_disabled:
- pop dx
- mov byte [ds:si], dl
- pop dx
- mov byte [es:di], dl
-
- pop si
- pop di
- pop es
- pop ds
- popf
- sti ; Enable interrupts again
- ret
-
-_enable_a20_bios:
- mov ax, 0x2401
- int 0x15
- jc .fast_gate
- test ah, ah
- jnz .failed
- call _check_a20
- test ax, ax
- jnz .done
-
- .fast_gate:
- in al, 0x92
- test al, 2
- jnz .done
-
- or al, 2
- and al, 0xfe
- out 0x92, al
-
- call _check_a20
- test ax, ax
- jnz .done
-
- .done:
- mov ax, 1
- ret
-
- .failed:
- mov ax, 0
- ret
-
-_enable_a20_keyb:
- cli
+ ;; Disable keyboard
call .wait_io1
mov al, 0xad
out 0x64, al
+ ;; Read from keyboard controller
call .wait_io1
- mov al, 0x0d0
+ mov al, 0xd0
out 0x64, al
call .wait_io2
in al, 0x60
- push eax
+ push eax ; Save current value
+
+ ;; Write back with the A20 bit set
call .wait_io1
mov al, 0xd1
out 0x64, al
call .wait_io1
+ pop eax
+ or al, 2 ; Set A20 bit
+
+ ;; Enable keyboard
+ call .wait_io1
mov al, 0xae
out 0x64, al
-
- sti
- ret
+ call .wait_io1
+
.wait_io1:
in al, 0x64
test al, 2
jnz .wait_io1
ret
-
- .wait_io2:
+
+ .wait_io2:
in al, 0x64
test al, 1
jz .wait_io2
ret
-
-_enable_a20_io92:
- in al, 0x92 ; Read from port 0x92
- test al, 2 ; Check if bit 1
- jnz .end
- or al, 2
- and al, 0xfe
- out 0x92, al
- .end:
- ret