読者です 読者をやめる 読者になる 読者になる

コケッココケッコ

コケコッコー

FAT12のブートセクターを書く

概要

FAT12のブートセクターを書いてみる。 画面上にHello World!を表示する。

FAT12の仕様

下記の資料を頑張って読む

Microsoft EFI FAT32 File System Specification

日本語に翻訳されている方がいらっしゃるので、こちらも参考に。

0から作るOS開発 ブートローダその4 FAT12

FAT12 | ブートセクターフォーマット ファイルアロケーションテーブル 目録区 データエリア

レシピ

printstring.asm

;*********************************
; printstring
;*********************************
%ifndef PRINTSTRING_ASM
%define PRINTSTRING_ASM

org   0x7c00
bits  16

Start:
    CALL  PrintString
    
    cli           ; Clear interrupts
    hlt           ; halt the system

PrintChar:
    MOV AH, 0x0E
    INT 0x10 
    RET

; input: SI(pointer of string)
PrintString:
    ;MOV SI, string
    
    string_loop:
    MOV AL, [SI]
    INC SI
    OR AL, AL
    JZ exit_print_string
    CALL PrintChar
    JMP string_loop

    exit_print_string:
    RET
;string:
;  db 'Hello World!', 0

%endif

bootloader.asm

;*********************************
; BootLoader
;*********************************
ORG   0x7c00
BITS  16

;========================================
; BIOS Parameter Blog (BPB) for FAT12
;========================================
JMP       BOOT ; BS_jmpBoot
BS_OEMName   DB "NiwaOS  "   ; 8bytes
BPB_BytsPerSec   DW 0x0200     ; Bytes Per Sector. 0x0200 = 512bytes
BPB_SecPerClus   DB 0x01
BPB_RsvdSecCnt   DW 0x0001
BPB_NumFATs  DB 0x02
BPB_RootEntCnt   DW 0x00E0
BPB_TotSec16 DW 0x0B40
BPB_Media    DB 0xF0       ; 0xF0: removable media
BPB_FATSz16  DW 0x0009
BPB_SecPerTrk    DW 0x0012
BPB_NumHeads DW 0x0002
BPB_HiddSec  DD 0x00000000
BPB_TotSec32 DD 0x00000000
BS_DrvNum    DB 0x00       ; Drive A:0x00
BS_Reserved1 DB 0x00
BS_BootSig   DB 0x29
BS_VolID DD 0x00000000
BS_VolLab    DB "NiwaOS     "
BS_FileSysType   DB "FAT12   "

%include "printstring.asm"

string:
    DB 'Hello World!', 0

BOOT:
    MOV SI, string
    CALL PrintString
    CLI
    HLT

    TIMES 510 - ($ - $$) DB 0  ; Clear the rest of the bytes with 0
    DW 0xAA55         ; Boot signature(2byte)