aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/boot.stage2.asm2
-rw-r--r--src/boot/boot.common.asm (renamed from src/boot.common.asm)0
-rw-r--r--src/boot/boot.stage1.asm (renamed from src/boot.stage1.asm)24
-rw-r--r--src/boot/boot.stage1.print.asm (renamed from src/boot.stage1.print.asm)4
-rw-r--r--src/boot/boot.stage2.a20.asm147
-rw-r--r--src/boot/boot.stage2.asm11
-rw-r--r--src/boot/boot.stage2.gdt32.asm (renamed from src/boot.stage2.gdt32.asm)0
-rw-r--r--src/boot/boot.stage2.pm.asm12
8 files changed, 188 insertions, 12 deletions
diff --git a/src/boot.stage2.asm b/src/boot.stage2.asm
deleted file mode 100644
index 7eeefe7..0000000
--- a/src/boot.stage2.asm
+++ /dev/null
@@ -1,2 +0,0 @@
- ;; boot.stage2.asm
-
diff --git a/src/boot.common.asm b/src/boot/boot.common.asm
index e69de29..e69de29 100644
--- a/src/boot.common.asm
+++ b/src/boot/boot.common.asm
diff --git a/src/boot.stage1.asm b/src/boot/boot.stage1.asm
index c5bab26..801860e 100644
--- a/src/boot.stage1.asm
+++ b/src/boot/boot.stage1.asm
@@ -9,7 +9,7 @@
%define BOOT_LOAD_ADDR 0x7c00
%define SECTOR_SIZE 512
- entry _start
+ global _start
_start:
;; Disable interrupts
@@ -23,16 +23,24 @@ _start:
;; Adjust Stack
mov sp, _start
+
+ clc
- mov si, [disk_addr_packet]
+ mov si, disk_addr_packet
mov ah, 0x42 ; BIOS extended read function
mov dl, 0x80 ; Drive number
int 0x13 ; BIOS disk services
jc _disk_read_err
+ mov si, disk_read_success_msg
+ call _print_string
+
jmp 0x0000:0x7e00
_disk_read_err:
+ mov si, disk_read_err_msg
+ call _print_string
+
hlt
jmp _disk_read_err
@@ -43,12 +51,12 @@ _end:
disk_read_err_msg: db "Failed to read disk", 13, 10, 0
disk_read_success_msg: db "Read the disk successfully", 13, 10, 0
disk_addr_packet:
- db 0x10
- db 0x0
-DAP_sectors_num:
- dw READ_SECTORS_NUM ; Number of read sectors
- dd (BOOT_LOAD_ADDR + SECTOR_SIZE) ; Destination address
- dq 1 ; First sector after the boot sector
+ db 0x10
+ db 0x00
+ dw READ_SECTORS_NUM
+ dw 0x0000
+ dw 0x7e00
+ dq 1
;; Padding and magic number
times 510 - ($ - $$) db 0
diff --git a/src/boot.stage1.print.asm b/src/boot/boot.stage1.print.asm
index 106a4df..aff2e0d 100644
--- a/src/boot.stage1.print.asm
+++ b/src/boot/boot.stage1.print.asm
@@ -7,13 +7,13 @@ _print_string:
_print_string_loop:
cmp byte [bx], 0
- je print_string_return
+ je _print_string_return
mov al, [bx]
int 0x10
inc bx
- jmp print_string_loop
+ jmp _print_string_loop
_print_string_return:
popa
diff --git a/src/boot/boot.stage2.a20.asm b/src/boot/boot.stage2.a20.asm
new file mode 100644
index 0000000..6a9c250
--- /dev/null
+++ b/src/boot/boot.stage2.a20.asm
@@ -0,0 +1,147 @@
+ ;; boot.stage2.a20.asm
+
+_enable_a20:
+ call _check_a20
+ test ax, ax
+ jnz .end
+
+ 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
+ call .wait_io1
+ mov al, 0xad
+ out 0x64, al
+
+ call .wait_io1
+ mov al, 0x0d0
+ out 0x64, al
+
+ call .wait_io2
+ in al, 0x60
+ push eax
+
+ call .wait_io1
+ mov al, 0xd1
+ out 0x64, al
+
+ call .wait_io1
+ mov al, 0xae
+ out 0x64, al
+
+ sti
+ ret
+
+ .wait_io1:
+ in al, 0x64
+ test al, 2
+ jnz .wait_io1
+ ret
+
+ .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
diff --git a/src/boot/boot.stage2.asm b/src/boot/boot.stage2.asm
new file mode 100644
index 0000000..56ab73a
--- /dev/null
+++ b/src/boot/boot.stage2.asm
@@ -0,0 +1,11 @@
+ ;; boot.stage2.asm
+
+ [bits 16]
+ [org 0x7e00]
+
+ %include "boot.stage2.a20.asm"
+ %include "boot.stage2.pm.asm"
+_s2_entry:
+ call _enable_a20
+ call _enter_pm
+ [bits 32]
diff --git a/src/boot.stage2.gdt32.asm b/src/boot/boot.stage2.gdt32.asm
index f9f27a5..f9f27a5 100644
--- a/src/boot.stage2.gdt32.asm
+++ b/src/boot/boot.stage2.gdt32.asm
diff --git a/src/boot/boot.stage2.pm.asm b/src/boot/boot.stage2.pm.asm
new file mode 100644
index 0000000..77f5f61
--- /dev/null
+++ b/src/boot/boot.stage2.pm.asm
@@ -0,0 +1,12 @@
+ ;; boot.stage2.pm.asm
+
+
+ [bits 16]
+ %include "boot.stage2.gdt32.asm"
+
+_
+ cli
+ lgdt [GDT32_ptr]
+
+
+ ;; Enable Protected Mode