174 lines
3.5 KiB
NASM
174 lines
3.5 KiB
NASM
; bootsect.asm - This file is a part of NutsOS
|
|
|
|
; NutsOS
|
|
; Copyright (C) 2013 Free Software Foundation, Inc.
|
|
|
|
; NutsOS is free software; you can redistribute it and/or modify
|
|
; it under the terms of the GNU General Public License as published by
|
|
; the Free Software Foundation; either version 3 of the License, or
|
|
; (at your option) any later version.
|
|
|
|
; NutsOS is distributed in the hope that it will be useful,
|
|
; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
; GNU General Public License for more details.
|
|
|
|
; You should have received a copy of the GNU General Public License along
|
|
; with NutsOS; If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
; Valentin Verdier <valentin.verdier03@gmail.com>
|
|
|
|
|
|
|
|
; Code placé dans le MBR du disque
|
|
|
|
; ####################################
|
|
; BootLoader principal
|
|
; ####################################
|
|
|
|
; Le code est copié par le BIOS à l'adresse 0x7C00, soit à la base du segment 0x07C0
|
|
; 0x0:0x7C00 <=> 0x07C0:0000 0x07C0 x 0x10 = 0x7C00
|
|
; adresse physique = segment x 16 + offset
|
|
|
|
%define BOOT_SEG 0x07C0
|
|
%define KERN_LDR_SEG 0x07E0
|
|
|
|
%define KERN_LDR_LBA_ADDR 1
|
|
|
|
[BITS 16]
|
|
[ORG 0] ; Par rapport au segment 0x07C0
|
|
|
|
boot:
|
|
; On fait pointer les registres de segments sur le segment 0x07C0
|
|
; On ne fait rien pour CS car le bios s'en ait déjà occupé
|
|
mov ax, BOOT_SEG
|
|
mov ds, ax
|
|
|
|
mov ax, 0x9F00 ; On définit l'adresse de base de la pile à la base du segment 0x9F00, soit à l'adresse 0x9F000
|
|
mov ss, ax
|
|
|
|
mov sp, 0xFFF ; On définit le pointeur de pile à l'offset 0xFFFF ce qui correspond à l'adresse 0x9FFFF
|
|
|
|
mov [bootdisk], dl ; On sauvegarde le numéro de l'unité de disque utilisée par le BIOS
|
|
|
|
xor ax, ax ; int 0x13 fonction 0x00
|
|
int 0x13
|
|
|
|
call load_kern_ldr
|
|
|
|
jmp KERN_LDR_SEG:0x0000 ; On saute vers le code de kernLdr
|
|
|
|
|
|
; Fonction load_kern_ldr
|
|
; Charge kernLdr qui commence au 30ème secteur du disque
|
|
load_kern_ldr:
|
|
push ax
|
|
push ebx
|
|
push dx
|
|
push di
|
|
|
|
mov ax, 63 ; On charge 63 secteurs
|
|
mov dx, KERN_LDR_SEG
|
|
xor di, di
|
|
mov ebx, KERN_LDR_LBA_ADDR
|
|
|
|
call build_DAPS
|
|
call read_sector
|
|
|
|
pop di
|
|
pop dx
|
|
pop ebx
|
|
pop ax
|
|
ret
|
|
|
|
; Fonction print
|
|
; Params : pointeur sur str -> ds:si
|
|
print:
|
|
push ax
|
|
push bx
|
|
|
|
.top:
|
|
lodsb
|
|
cmp al, 0
|
|
jz .end
|
|
|
|
mov ah, 0x0E ; int 0x10 fonction 0x0E
|
|
mov bx, 0x07 ; attribut du caractère
|
|
int 0x10
|
|
jmp .top
|
|
|
|
.end:
|
|
pop bx
|
|
pop ax
|
|
ret
|
|
|
|
|
|
read_sector:
|
|
push ax
|
|
push dx
|
|
push si
|
|
|
|
xor ax, ax
|
|
add ax, 0 ; On met le flag de retenue à 0
|
|
mov si, DAPS
|
|
mov ah, 0x42
|
|
mov dl, [bootdisk]
|
|
int 0x13
|
|
jc .error
|
|
jmp .no_error
|
|
|
|
.error:
|
|
mov si, error_int13h
|
|
call print
|
|
call stop
|
|
|
|
.no_error:
|
|
pop si
|
|
pop dx
|
|
pop ax
|
|
ret
|
|
|
|
|
|
; Fonction build_DAPS
|
|
; Params: Nombre de secteur -> ax, Adresse LBA -> ebx, destination -> dx:di
|
|
build_DAPS:
|
|
mov [DAPS + 2], ax ; Nombre de secteurs
|
|
|
|
mov [DAPS + 4], di ; Offset du segment de destination
|
|
mov [DAPS + 6], dx ; Segment de destination
|
|
|
|
; adresse LBA
|
|
mov [DAPS + 8], ebx
|
|
xor ax, ax
|
|
mov [DAPS + 12], ax
|
|
mov [DAPS + 14], ax
|
|
ret
|
|
|
|
; Fonction Error
|
|
stop:
|
|
.loop:
|
|
hlt
|
|
jmp .loop
|
|
|
|
; Variables
|
|
; ############################################
|
|
|
|
DAPS: ; Disk Address Packet Structure
|
|
db 16 ; Taille de la structure
|
|
db 0 ; Toujours à 0
|
|
|
|
dw 0 ; Nombre de secteurs à transfèrer
|
|
|
|
dw 0 ; Offset du segment de buffer
|
|
dw 0 ; segment de buffer
|
|
|
|
dd 0 ; Adresse LBA de début
|
|
dd 0 ; Partie haute de l'adresse LBA (pour LBA 48 bits) non utilisée ici
|
|
|
|
error_int13h: db "BIOS 13H extension error !", 13, 10, 0
|
|
|
|
boot_disk: db 0
|
|
; ############################################
|
|
|
|
times 446-($-$$) db 144
|