mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 08:58:11 +00:00

Instead of cowboy-calling the VESA BIOS in the bootloader, find the emulator VGA adapter by scanning the PCI bus. Then set up the desired video mode by sending device commands.
201 lines
2.8 KiB
NASM
Executable file
201 lines
2.8 KiB
NASM
Executable file
; asmsyntax=nasm
|
|
|
|
[org 0x7c00]
|
|
[bits 16]
|
|
|
|
boot:
|
|
cli
|
|
mov ax, 0x8000
|
|
mov ss, ax
|
|
mov sp, 0xffff
|
|
|
|
push cs
|
|
pop ds
|
|
xor bx, bx
|
|
mov ah, 0x0e
|
|
mov si, message
|
|
lodsb
|
|
.lewp:
|
|
int 0x10
|
|
lodsb
|
|
cmp al, 0
|
|
jne .lewp
|
|
|
|
; Enable A20
|
|
mov ax, 0x2401
|
|
int 0x15
|
|
|
|
mov bx, 0x1000
|
|
mov es, bx
|
|
xor bx, bx ; Load kernel @ 0x10000
|
|
|
|
mov cx, word [cur_lba]
|
|
.sector_loop:
|
|
call convert_lba_to_chs
|
|
|
|
mov ah, 0x02 ; cmd 0x02 - Read Disk Sectors
|
|
mov al, 1 ; 1 sector at a time
|
|
mov dl, 0 ; drive 0 (fd0)
|
|
int 0x13
|
|
|
|
jc fug
|
|
|
|
mov ah, 0x0e
|
|
mov al, '.'
|
|
int 0x10
|
|
|
|
inc word [cur_lba]
|
|
mov cx, word [cur_lba]
|
|
cmp cx, 600
|
|
jz .sector_loop_end
|
|
|
|
mov bx, es
|
|
add bx, 0x20
|
|
mov es, bx
|
|
xor bx, bx
|
|
|
|
jmp .sector_loop
|
|
|
|
.sector_loop_end:
|
|
|
|
call durk
|
|
|
|
; Turn off the floppy motor.
|
|
mov dx, 0x3f2
|
|
xor al, al
|
|
out dx, al
|
|
|
|
lgdt [cs:test_gdt_ptr]
|
|
|
|
mov eax, cr0
|
|
or al, 1
|
|
mov cr0, eax
|
|
|
|
jmp 0x08:pmode
|
|
|
|
durk:
|
|
push cs
|
|
pop ds
|
|
xor bx, bx
|
|
mov ah, 0x0e
|
|
mov si, msg_sectors_loaded
|
|
lodsb
|
|
.lewp:
|
|
int 0x10
|
|
lodsb
|
|
cmp al, 0
|
|
jne .lewp
|
|
ret
|
|
|
|
pmode:
|
|
[bits 32]
|
|
mov ax, 0x10
|
|
mov ds, ax
|
|
mov es, ax
|
|
mov fs, ax
|
|
mov gs, ax
|
|
|
|
mov ss, ax
|
|
mov esp, 0x4000
|
|
|
|
xor eax, eax
|
|
xor ebx, ebx
|
|
xor ecx, ecx
|
|
xor edx, edx
|
|
xor ebp, ebp
|
|
xor esi, esi
|
|
xor edi, edi
|
|
|
|
jmp 0x10000
|
|
|
|
hlt
|
|
|
|
test_gdt_ptr:
|
|
dw (test_gdt_end-test_gdt)
|
|
dd test_gdt
|
|
|
|
test_gdt:
|
|
dd 0
|
|
dd 0
|
|
dd 0x0000ffff
|
|
dd 0x00cf9a00
|
|
dd 0x0000ffff
|
|
dd 0x00cf9200
|
|
dd 0
|
|
dd 0
|
|
dd 0
|
|
dd 0
|
|
test_gdt_end:
|
|
|
|
[bits 16]
|
|
fug:
|
|
xor bx, bx
|
|
mov ah, 0x0e
|
|
mov si, fug_message
|
|
lodsb
|
|
.lewp:
|
|
int 0x10
|
|
lodsb
|
|
cmp al, 0
|
|
jne .lewp
|
|
|
|
cli
|
|
hlt
|
|
|
|
; Input:
|
|
;
|
|
; AX = LBA
|
|
;
|
|
; Output:
|
|
;
|
|
; CX and DH = C/H/S address formatted for Int13,2
|
|
|
|
; CL = sector (LBA % sectors_per_track) + 1
|
|
;
|
|
; 1.44M floppy stats:
|
|
; (sectors_per_track: 18)
|
|
; (heads: 2)
|
|
; (sectors: 2880)
|
|
|
|
convert_lba_to_chs:
|
|
mov ax, cx
|
|
|
|
; AX = LBA/spt, DX = LBA%spt
|
|
xor dx, dx
|
|
div word [sectors_per_track]
|
|
|
|
; CL = sector (LBA % sectors_per_track) + 1
|
|
mov cl, dl
|
|
inc cl
|
|
|
|
; CH = track (LBA / sectors_per_track) / heads
|
|
mov ch, al
|
|
shr ch, 1
|
|
|
|
; AX = (LBA/spt)/heads, DX = (LBA/spt)%heads
|
|
xor dx, dx
|
|
div word [heads]
|
|
|
|
; DH = sector (LBA / sectors_per_track) % heads
|
|
mov dh, dl
|
|
|
|
ret
|
|
|
|
cur_lba:
|
|
dw 9
|
|
sectors_per_track:
|
|
dw 18
|
|
heads:
|
|
dw 2
|
|
|
|
msg_sectors_loaded:
|
|
db "done!", 0x0d, 0x0a, 0
|
|
|
|
message:
|
|
db "Loading kernel", 0
|
|
|
|
fug_message:
|
|
db "FUG!", 0x0d, 0x0a, 0
|
|
|
|
times 510-($-$$) db 0
|
|
dw 0xaa55
|