Files
2019-11-18 21:58:51 +05:30

145 lines
1.6 KiB
NASM

[bits 16]
[org 0x7c00]
global _start
_start:
mov ax, 0
mov ss, ax
mov bp, 0x9000
mov sp, bp
jmp 0:loader
gdt_start:
dd 0x0
dd 0x0
gdt_code:
dw 0xffff
dw 0x0
db 0x0
db 10011010b
db 11001111b
db 0x0
gdt_data:
dw 0xffff
dw 0x0
db 0x0
db 10010010b
db 11001111b
db 0x0
gdt_end:
gdt_desc:
dw gdt_end-gdt_start-1
dd gdt_start
CODE_SEG equ gdt_code-gdt_start
DATA_SEG equ gdt_data-gdt_start
print:
pusha
mov ah, 0x0e
repeat:
mov al, [bx]
cmp al, 0
je done
int 0x10
add bx, 1
jmp repeat
done:
popa
ret
MSG db "welcome to bootloader",13,10,0
PROT db "loading protected mode",13,10,0
ERR db "Error in reading disk",13,10,0
error:
mov bx, ERR
call print
jmp disk_loop
disk_loop:
jmp $
loader:
mov ax, 0
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ah, 0x06
mov al, 0
int 0x10
mov ah, 0x00
mov al, 7h
int 0x10
mov bx, MSG
call print
mov bx, 0x1000
mov ah, 0x2
mov al, 0x2
mov cl, 0x2
mov ch, 0x0
mov dh, 0x0
int 0x13
jc error
jnc switch_pm
switch_pm:
xor ax, ax
mov ds, ax
cli
lgdt[gdt_desc]
mov eax, cr0
or eax, 0x1
mov cr0, eax
jmp CODE_SEG:init_pm
[bits 32]
VIDEO_MEMORY equ 0xb8000
WHITE_ON_BLACK equ 0x0f
print_pm:
pusha
mov edx, VIDEO_MEMORY
loop_pm:
mov al, [ebx]
mov ah, WHITE_ON_BLACK
cmp al, 0
je done_pm
mov [edx], ax
add ebx, 1
add edx, 2
jmp loop_pm
done_pm:
popa
ret
init_pm:
mov ax, DATA_SEG
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
mov ebp, 0x9000
mov esp, ebp
mov ebx, PROT
call print_pm
jmp $
times 510-($-$$) db 0
dw 0xAA55