Clean bootsect code up

This commit is contained in:
mintsuki 2020-01-22 04:12:55 +01:00
parent 54074f2a97
commit fdfc83abfb
3 changed files with 128 additions and 138 deletions

View File

@ -1,52 +1,52 @@
org 0x7C00
bits 16
code_start:
start:
cli
jmp 0x0000:.initialise_cs
.initialise_cs:
xor ax, ax
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
mov sp, 0x7c00
sti
cli
jmp 0x0000:initialise_cs
initialise_cs:
xor ax, ax
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
mov sp, 0x7c00
sti
mov si, LoadingMsg
call simple_print
mov si, LoadingMsg
call simple_print
; ****************** Load stage 2 ******************
; ****************** Load stage 2 ******************
mov si, Stage2Msg
call simple_print
mov si, Stage2Msg
call simple_print
mov eax, 1
mov ebx, 0x7e00
mov ecx, 1
call read_sectors
mov ax, 1
mov ebx, 0x7e00
mov cx, 1
call read_sectors
jc err_reading_disk
jc err_reading_disk
mov si, DoneMsg
call simple_print
mov si, DoneMsg
call simple_print
jmp 0x7e00
jmp 0x7e00
err_reading_disk:
mov si, ErrReadDiskMsg
call simple_print
jmp halt
mov si, ErrReadDiskMsg
call simple_print
jmp halt
err_enabling_a20:
mov si, ErrEnableA20Msg
call simple_print
mov si, ErrEnableA20Msg
call simple_print
jmp halt
halt:
hlt
jmp halt
hlt
jmp halt
; Data
@ -70,44 +70,40 @@ dw 0xaa55
; ********************* Stage 2 *********************
; Load stage 3
stage2:
; Load stage 3
mov eax, 2
mov ebx, 0x8000
mov ecx, 62
call read_sectors
jc err_reading_disk
mov ax, 2
mov ebx, 0x8000
mov cx, 62
call read_sectors
jc err_reading_disk
; Enable A20
call enable_a20
jc err_enabling_a20
; Enable A20
; Enter 32 bit pmode
lgdt [GDT] ; Load the GDT
call enable_a20
jc err_enabling_a20
cli
; Enter 32 bit pmode
mov eax, cr0
or al, 1
mov cr0, eax
lgdt [GDT] ; Load the GDT
jmp 0x18:.pmode
bits 32
.pmode:
mov ax, 0x20
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
cli
jmp 0x8000
mov eax, cr0
or eax, 00000001b
mov cr0, eax
jmp 0x18:.pmode
bits 32
.pmode:
mov ax, 0x20
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
jmp 0x8000
bits 16
%include 'a20_enabler.inc'
%include 'gdt.inc'

View File

@ -1,5 +1,3 @@
read_sector:
; ***********************************************
; Reads a disk sector with an LBA address
; ***********************************************
@ -13,35 +11,35 @@ read_sector:
; OUT:
; Carry if error
push eax
push ebx
push ecx
push edx
push esi
push edi
read_sector:
push eax
push ebx
push ecx
push edx
push esi
push edi
push es
pop word [.target_segment]
mov word [.target_offset], bx
mov dword [.lba_address_low], eax
push es
pop word [.target_segment]
mov word [.target_offset], bx
mov dword [.lba_address_low], eax
xor esi, esi
mov si, .da_struct
mov ah, 0x42
xor esi, esi
mov si, .da_struct
mov ah, 0x42
clc ; Clear carry for int 0x13 because some BIOSes may not clear it on success
clc ; Clear carry for int 0x13 because some BIOSes may not clear it on success
int 0x13 ; Call int 0x13
int 0x13 ; Call int 0x13
.done:
pop edi
pop esi
pop edx
pop ecx
pop ebx
pop eax
ret ; Exit routine
.done:
pop edi
pop esi
pop edx
pop ecx
pop ebx
pop eax
ret ; Exit routine
align 4
.da_struct:
@ -53,9 +51,6 @@ align 4
.lba_address_low dd 0
.lba_address_high dd 0
read_sectors:
; ********************************************
; Reads multiple LBA addressed sectors
; ********************************************
@ -65,58 +60,58 @@ read_sectors:
; DL = Drive number
; ES = Buffer segment
; EBX = Buffer offset
; CX = Sectors count
; ECX = Sectors count
; OUT:
; Carry if error
push eax ; Save GPRs
push ebx
push ecx
push edx
push esi
push edi
read_sectors:
push eax ; Save GPRs
push ebx
push ecx
push edx
push esi
push edi
.loop:
.loop:
push es
push ebx
push es
push ebx
mov bx, 0x7000 ; Load in a temp buffer
mov es, bx
xor bx, bx
mov bx, 0x7000 ; Load in a temp buffer
mov es, bx
xor bx, bx
call read_sector ; Read sector
call read_sector ; Read sector
pop ebx
pop es
pop ebx
pop es
jc .done ; If carry exit with flag
jc .done ; If carry exit with flag
push ds
push ds
mov si, 0x7000
mov ds, si
mov edi, ebx
xor esi, esi
mov si, 0x7000
mov ds, si
mov edi, ebx
xor esi, esi
push ecx
mov ecx, 512
a32 o32 rep movsb
pop ecx
push ecx
mov ecx, 512
a32 o32 rep movsb
pop ecx
pop ds
pop ds
inc eax ; Increment sector
add ebx, 512 ; Add 512 to the buffer
inc eax ; Increment sector
add ebx, 512 ; Add 512 to the buffer
loop .loop ; Loop!
loop .loop ; Loop!
.done:
pop edi
pop esi
pop edx
pop ecx ; Restore GPRs
pop ebx
pop eax
ret ; Exit routine
.done:
pop edi
pop esi
pop edx
pop ecx ; Restore GPRs
pop ebx
pop eax
ret ; Exit routine

View File

@ -1,5 +1,3 @@
simple_print:
; **************************************
; Prints a string using the BIOS
; **************************************
@ -7,16 +5,17 @@ simple_print:
; IN:
; SI = points to a 0x00 terminated string
push ax ; Save registers
push si
mov ah, 0x0E ; int 0x10, function 0x0E (print character)
.loop:
simple_print:
push ax ; Save registers
push si
mov ah, 0x0E ; int 0x10, function 0x0E (print character)
.loop:
lodsb ; Load character from string
test al, al ; Is is the 0x00 terminator?
jz .done ; If it is, exit routine
int 0x10 ; Call BIOS
jmp .loop ; Repeat!
.done:
.done:
pop si ; Restore registers
pop ax
ret ; Exit routine