Many things pt.2
Now the bootloader (/src/boot.asm) has a FAT12 driver that searches the KERNEL.BIN file and loads it. Now the kernel has something in it, it just prints a Hello World message.
This commit is contained in:
parent
f394eb42b4
commit
453c3d130b
2
Makefile
2
Makefile
@ -43,3 +43,5 @@ always:
|
|||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -rf $(BUILD_DIR)/*
|
rm -rf $(BUILD_DIR)/*
|
||||||
|
|
||||||
|
#Strumenti
|
@ -8,19 +8,19 @@ bits 16
|
|||||||
jmp short start
|
jmp short start
|
||||||
nop
|
nop
|
||||||
|
|
||||||
bdb_oem: db 'MSWIN4.1'
|
oem: db 'MSWIN4.1'
|
||||||
bdb_bytes_per_sector: dw 512
|
bytes_per_sector: dw 512
|
||||||
bdb_sectors_per_cluster: db 1
|
sectors_per_cluster: db 1
|
||||||
bdb_reserved_sectors: dw 1
|
reserved_sectors: dw 1
|
||||||
bdb_fat_count: db 2
|
fat_count: db 2
|
||||||
bdb_dir_entries_count: dw 0E0h
|
dir_entries_count: dw 0E0h
|
||||||
bdb_total_sectors: dw 2880
|
total_sectors: dw 2880
|
||||||
bdb_media_descriptor_type: db 0F0h
|
media_descriptor_type: db 0F0h
|
||||||
bdb_sectors_per_fat: dw 9
|
sectors_per_fat: dw 9
|
||||||
bdb_sectors_per_track: dw 18
|
sectors_per_track: dw 18
|
||||||
bdb_heads: dw 2
|
heads: dw 2
|
||||||
bdb_hidden_sectors: dd 0
|
hidden_sectors: dd 0
|
||||||
bdb_large_sector_count: dd 0
|
large_sector_count: dd 0
|
||||||
|
|
||||||
ebr_drive_number: db 0
|
ebr_drive_number: db 0
|
||||||
db 0
|
db 0
|
||||||
@ -29,71 +29,158 @@ ebr_volume_id: db 12h, 34h, 56h, 78h
|
|||||||
ebr_volume_label: db 'XanvicOS '
|
ebr_volume_label: db 'XanvicOS '
|
||||||
ebr_system_id: db 'FAT12 '
|
ebr_system_id: db 'FAT12 '
|
||||||
|
|
||||||
;Codice
|
;Codice del bootloader
|
||||||
|
|
||||||
start:
|
start:
|
||||||
jmp main
|
;Inizializza segmenti di dati
|
||||||
|
|
||||||
puts:
|
|
||||||
push si
|
|
||||||
push ax
|
|
||||||
push bx
|
|
||||||
|
|
||||||
.loop:
|
|
||||||
lodsb
|
|
||||||
or al, al
|
|
||||||
jz .fine
|
|
||||||
|
|
||||||
mov ah, 0x0E
|
|
||||||
mov bh, 0
|
|
||||||
int 0x10
|
|
||||||
|
|
||||||
jmp .loop
|
|
||||||
|
|
||||||
.fine:
|
|
||||||
pop bx
|
|
||||||
pop ax
|
|
||||||
pop si
|
|
||||||
ret
|
|
||||||
|
|
||||||
main:
|
|
||||||
mov ax, 0
|
mov ax, 0
|
||||||
mov ds, ax
|
mov ds, ax
|
||||||
mov es, ax
|
mov es, ax
|
||||||
|
|
||||||
|
;Iniializza gli stack
|
||||||
|
|
||||||
mov ss, ax
|
mov ss, ax
|
||||||
mov sp, 0x7C00
|
mov sp, 0x7C00
|
||||||
|
|
||||||
mov si, msg_helloworld
|
.dopo:
|
||||||
|
|
||||||
|
;Mostra il messaggio di caricamento
|
||||||
|
|
||||||
|
mov si, msg_caricamento
|
||||||
call puts
|
call puts
|
||||||
|
|
||||||
;Legge cose dal floppy
|
;Legge cose dal floppy
|
||||||
|
|
||||||
mov [ebr_drive_number], dl
|
mov [ebr_drive_number], dl
|
||||||
|
|
||||||
mov ax, 1
|
;Legge i parametri del disco
|
||||||
mov cl, 1
|
|
||||||
mov bx, 0x7E00
|
push es
|
||||||
|
mov ah, 08h
|
||||||
|
int 13h
|
||||||
|
jc errore_floppy
|
||||||
|
pop es
|
||||||
|
|
||||||
|
and cl, 0x3F
|
||||||
|
xor ch, ch
|
||||||
|
mov [sectors_per_track], cx
|
||||||
|
|
||||||
|
inc dh
|
||||||
|
mov [heads], dh
|
||||||
|
|
||||||
|
;Calcola l'indirizzo LBA della root del filesystem FAT12
|
||||||
|
|
||||||
|
mov ax, [sectors_per_fat]
|
||||||
|
mov bl, [fat_count]
|
||||||
|
xor bh, bh
|
||||||
|
mul bx
|
||||||
|
add ax, [reserved_sectors]
|
||||||
|
push ax
|
||||||
|
|
||||||
|
;Calcola il peso della root
|
||||||
|
|
||||||
|
mov ax, [sectors_per_fat]
|
||||||
|
shl ax, 5
|
||||||
|
xor dx, dx
|
||||||
|
div word [bytes_per_sector]
|
||||||
|
|
||||||
|
test dx, dx
|
||||||
|
jz .root_dopo
|
||||||
|
inc ax
|
||||||
|
|
||||||
|
.root_dopo:
|
||||||
|
;Legge la root
|
||||||
|
mov cl, al
|
||||||
|
pop ax
|
||||||
|
mov dl, [ebr_drive_number]
|
||||||
|
mov bx, buffer
|
||||||
call lettura_disco
|
call lettura_disco
|
||||||
|
|
||||||
cli
|
;Cerca il kernel
|
||||||
hlt
|
xor bx, bx
|
||||||
|
mov di, buffer
|
||||||
|
|
||||||
;Errori
|
.cerca_kernel:
|
||||||
|
mov si, file_kernel_bin
|
||||||
|
mov cx, 11
|
||||||
|
push di
|
||||||
|
repe cmpsb
|
||||||
|
pop di
|
||||||
|
je .kernel_trovato
|
||||||
|
|
||||||
errore_floppy:
|
add di, 32
|
||||||
mov si, msg_errore_lettura
|
inc bx
|
||||||
|
cmp bx, [dir_entries_count]
|
||||||
|
jl .cerca_kernel
|
||||||
|
|
||||||
|
;Kernel non trovato
|
||||||
|
jmp errore_kernel_non_trovato
|
||||||
|
|
||||||
|
.kernel_trovato:
|
||||||
|
mov si, msg_kernel_trovato
|
||||||
call puts
|
call puts
|
||||||
|
|
||||||
|
mov ax, [di + 26]
|
||||||
|
mov [kernel_cluster], ax
|
||||||
|
|
||||||
|
mov ax, [reserved_sectors]
|
||||||
|
mov bx, buffer
|
||||||
|
mov cl, [sectors_per_fat]
|
||||||
|
mov dl, [ebr_drive_number]
|
||||||
|
call lettura_disco
|
||||||
|
|
||||||
|
mov bx, KERNEL_LOAD_SEGMENT
|
||||||
|
mov es, bx
|
||||||
|
mov bx, KERNEL_LOAD_OFFSET
|
||||||
|
|
||||||
|
.carica_kernel:
|
||||||
|
mov ax, [kernel_cluster]
|
||||||
|
add ax, 31
|
||||||
|
|
||||||
|
mov cl, 1
|
||||||
|
mov dl, [ebr_drive_number]
|
||||||
|
call lettura_disco
|
||||||
|
|
||||||
|
add bx, [bytes_per_sector]
|
||||||
|
|
||||||
|
mov ax, [kernel_cluster]
|
||||||
|
mov cx, 3
|
||||||
|
mul cx
|
||||||
|
mov cx, 2
|
||||||
|
div cx
|
||||||
|
|
||||||
|
mov si, buffer
|
||||||
|
add si, ax
|
||||||
|
mov ax, [ds:si]
|
||||||
|
|
||||||
|
or dx, dx
|
||||||
|
jz .pari
|
||||||
|
|
||||||
|
.dispari:
|
||||||
|
shr ax, 4
|
||||||
|
jmp .prossimo_cluster
|
||||||
|
|
||||||
|
.pari:
|
||||||
|
and ax, 0x0FFF
|
||||||
|
|
||||||
|
.prossimo_cluster:
|
||||||
|
cmp ax, 0x0FF8
|
||||||
|
jae .fine_lettura
|
||||||
|
|
||||||
|
mov [kernel_cluster], ax
|
||||||
|
jmp .carica_kernel
|
||||||
|
|
||||||
|
.fine_lettura:
|
||||||
|
mov dl, [ebr_drive_number]
|
||||||
|
|
||||||
|
mov ax, KERNEL_LOAD_SEGMENT
|
||||||
|
mov ds, ax
|
||||||
|
mov es, ax
|
||||||
|
|
||||||
|
jmp KERNEL_LOAD_SEGMENT:KERNEL_LOAD_OFFSET
|
||||||
jmp premi_per_riavviare
|
jmp premi_per_riavviare
|
||||||
|
|
||||||
premi_per_riavviare:
|
|
||||||
mov ah, 0
|
|
||||||
int 16h
|
|
||||||
jmp 0FFFFh:0
|
|
||||||
|
|
||||||
.halt:
|
|
||||||
cli
|
|
||||||
hlt
|
|
||||||
|
|
||||||
;Trasforma/Converte un indirizzo LBA in uno CHS
|
;Trasforma/Converte un indirizzo LBA in uno CHS
|
||||||
|
|
||||||
lba_to_chs:
|
lba_to_chs:
|
||||||
@ -101,13 +188,13 @@ lba_to_chs:
|
|||||||
push dx
|
push dx
|
||||||
|
|
||||||
xor dx, dx
|
xor dx, dx
|
||||||
div word [bdb_sectors_per_track]
|
div word [sectors_per_track]
|
||||||
|
|
||||||
inc dx
|
inc dx
|
||||||
mov cx, dx
|
mov cx, dx
|
||||||
|
|
||||||
xor dx, dx
|
xor dx, dx
|
||||||
div word [bdb_heads]
|
div word [heads]
|
||||||
|
|
||||||
mov dh, dl
|
mov dh, dl
|
||||||
mov ch, al
|
mov ch, al
|
||||||
@ -123,11 +210,7 @@ lba_to_chs:
|
|||||||
;Legge i settori da un disco
|
;Legge i settori da un disco
|
||||||
|
|
||||||
lettura_disco:
|
lettura_disco:
|
||||||
; push ax
|
|
||||||
; push bx
|
|
||||||
push cx
|
push cx
|
||||||
; push dx
|
|
||||||
; push di
|
|
||||||
|
|
||||||
call lba_to_chs
|
call lba_to_chs
|
||||||
pop ax
|
pop ax
|
||||||
@ -155,11 +238,6 @@ lettura_disco:
|
|||||||
.fine:
|
.fine:
|
||||||
popa
|
popa
|
||||||
|
|
||||||
; pop di
|
|
||||||
; pop dx
|
|
||||||
; pop cx
|
|
||||||
; pop bx
|
|
||||||
; pop ax
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
disk_reset:
|
disk_reset:
|
||||||
@ -171,12 +249,70 @@ disk_reset:
|
|||||||
popa
|
popa
|
||||||
ret
|
ret
|
||||||
|
|
||||||
;Mostra una stringa sullo schermo
|
puts:
|
||||||
|
;Salva i registri
|
||||||
|
push si
|
||||||
|
push ax
|
||||||
|
push bx
|
||||||
|
|
||||||
|
.loop:
|
||||||
|
lodsb
|
||||||
|
or al, al ; verify if next character is n
|
||||||
|
jz .fine
|
||||||
|
|
||||||
|
mov ah, 0x0E ; call bios interrupt
|
||||||
|
mov bh, 0 ; set page number to 0
|
||||||
|
int 0x10
|
||||||
|
|
||||||
|
jmp .loop
|
||||||
|
|
||||||
|
.fine:
|
||||||
|
pop bx
|
||||||
|
pop ax
|
||||||
|
pop si
|
||||||
|
ret
|
||||||
|
|
||||||
|
;Mostra delle stringhe sullo schermo
|
||||||
|
|
||||||
|
msg_caricamento:
|
||||||
|
db 'Caricamento...', ENDL, 0
|
||||||
|
|
||||||
msg_helloworld:
|
|
||||||
db 'Hello World!', ENDL, 0
|
|
||||||
msg_errore_lettura:
|
msg_errore_lettura:
|
||||||
db 'Errore nella lettura del disco!'
|
db 'Errore del disco', ENDL, 0
|
||||||
|
|
||||||
|
msg_kernel_non_trovato:
|
||||||
|
db 'Kernel non trovato', ENDL, 0
|
||||||
|
|
||||||
|
msg_kernel_trovato:
|
||||||
|
db 'Kernel trovato', ENDL, 0
|
||||||
|
|
||||||
|
;Errori
|
||||||
|
|
||||||
|
errore_floppy:
|
||||||
|
mov si, msg_errore_lettura
|
||||||
|
call puts
|
||||||
|
jmp premi_per_riavviare
|
||||||
|
|
||||||
|
errore_kernel_non_trovato:
|
||||||
|
mov si, msg_kernel_non_trovato
|
||||||
|
call puts
|
||||||
|
jmp premi_per_riavviare
|
||||||
|
|
||||||
|
;Variabili
|
||||||
|
|
||||||
|
file_kernel_bin: db 'KERNEL BIN'
|
||||||
|
kernel_cluster: dw 0
|
||||||
|
KERNEL_LOAD_SEGMENT equ 0x2000
|
||||||
|
KERNEL_LOAD_OFFSET equ 0
|
||||||
|
|
||||||
|
;Cose che non so dove mettere
|
||||||
|
|
||||||
|
premi_per_riavviare:
|
||||||
|
mov ah, 0
|
||||||
|
int 16h
|
||||||
|
jmp 0FFFFh:0
|
||||||
|
|
||||||
times 510-($-$$) db 0
|
times 510-($-$$) db 0
|
||||||
dw 0AA55h
|
dw 0AA55h
|
||||||
|
|
||||||
|
buffer:
|
||||||
|
@ -0,0 +1,56 @@
|
|||||||
|
org 0x0
|
||||||
|
bits 16
|
||||||
|
|
||||||
|
|
||||||
|
%define ENDL 0x0D, 0x0A
|
||||||
|
|
||||||
|
;Codice del kernel
|
||||||
|
start:
|
||||||
|
mov si, msg_helloworld
|
||||||
|
call puts
|
||||||
|
call premi_per_riavviare
|
||||||
|
|
||||||
|
.halt:
|
||||||
|
cli
|
||||||
|
hlt
|
||||||
|
|
||||||
|
puts:
|
||||||
|
; save registers we will modify
|
||||||
|
push si
|
||||||
|
push ax
|
||||||
|
push bx
|
||||||
|
|
||||||
|
.loop:
|
||||||
|
lodsb
|
||||||
|
or al, al
|
||||||
|
jz .fine
|
||||||
|
|
||||||
|
mov ah, 0x0E
|
||||||
|
mov bh, 0
|
||||||
|
int 0x10
|
||||||
|
|
||||||
|
jmp .loop
|
||||||
|
|
||||||
|
.fine:
|
||||||
|
pop bx
|
||||||
|
pop ax
|
||||||
|
pop si
|
||||||
|
ret
|
||||||
|
|
||||||
|
;Stringhe
|
||||||
|
msg_helloworld:
|
||||||
|
db 'Hello World dal kernel!', ENDL, 0
|
||||||
|
|
||||||
|
msg_premi_per_riavviare:
|
||||||
|
db 'Premi un tasto per riavviare...', ENDL, 0
|
||||||
|
;Errori
|
||||||
|
|
||||||
|
;Variabili
|
||||||
|
|
||||||
|
;Cose che non so dove mettere
|
||||||
|
premi_per_riavviare:
|
||||||
|
mov si, msg_premi_per_riavviare
|
||||||
|
call puts
|
||||||
|
mov ah, 0
|
||||||
|
int 16h
|
||||||
|
jmp 0FFFFh:0
|
Loading…
x
Reference in New Issue
Block a user