[bits 16]
jmp init0
nop
;-----------------------------------------------------------------------------------
;Boot Parameter Block ;Offset byte数 内容
;-----------------------------------------------------------------------------------
OEMLabel db "test " ;03 8 OEM名/初期化を行ったOS.VER
BytePerSector dw 0x0200 ;0b 2 セクター当りのバイト数 通常512固定
SectorsPerCluser db 0x01 ;0d 1 クラスタ当りのセクター数
ReservedSectors dw 0x0001 ;0e 2 起動プログラムが使用するセクター数
NumberFATs db 0x02 ;10 1 FATの数(通常2)
MaxRootEntries dw 0x0200 ;11 2 ルートディレクトリのエントリー数(通常512)
NumberSectors dw 0x0b40 ;13 2 論理ディスク当りのセクタ数
MediaDescriptor db 0xf0 ;15 1 ディスクタイプ
SectorsPerFAT dw 0x0009 ;16 2 FAT当りのセクター数
SectorsPerTrack dw 0x0012 ;18 2 トラック当りのセクタ数
NumberHeads dw 0x0002 ;1a 2 ヘッド数
HiddenSectors dd 0x00000000 ;1c 4 隠しセクター数
LargeSectors dd 0x00000000 ;20 4 論理ディスク当りのセクタ数
DriveNumber db 0x00 ;24 1 物理ドライブ番号
Reserved1 db 0x00 ;25 1 予約
BootSignature db 0x29 ;26 1 拡張ブート識別コード
VolumeID dd 0x00000000 ;27 4 ボリュームS/N
VolumeLabel db " " ;2a 11 ボリューム名称
FileSystemLabel db "FAT12 " ;36 8 FATタイプ
;-----------------------------------------------------------------------------------
init0:
jmp 07C0h:init ;アドレス 07C0h にジャンプ。ロード・順次実行が行われる
init:
;初期化処理
cli ;割り込みを無効化
mov ax,07C0h ;セグメントの初期化
mov ds,ax
mov es,ax
mov ss,ax
mov sp,0xFFF0 ;スタックポインタを0xFFF0に設定
sti ;割り込みを有効に
start:
call diskSysReset
call diskRead
mov al,10 ;CR
call putc
mov al,13 ;LF
call putc
push ds ;セグメントをスタックに保存
mov ax, 9C0h
mov cx,word [MaxRootEntries] ;Boot Parameter Blockのエントリー数だけループさせる
loop1:
mov ds, ax ;セグメントを設定
push ax
mov al,byte [00h]
cmp al,00h ;0ならば何も無いため表示しない
je loop1end
cmp al,0E5h ;e5ならば削除ファイルのため表示しない
je loop1end
call putc
mov al,byte [01h]
call putc
mov al,byte [02h]
call putc
mov al,byte [03h]
call putc
mov al,byte [04h]
call putc
mov al,byte [05h]
call putc
mov al,byte [06h]
call putc
mov al,byte [07h]
call putc
mov al,byte [08h]
call putc
mov al,byte [09h]
call putc
mov al,byte [0Ah]
call putc
mov al,10 ;CR
call putc
mov al,13 ;LF
call putc
loop1end:
pop ax
add ax,02h ;セグメントを2進めるための加算
loop loop1
pop ds ;セグメントをスタックから復帰
end:
err:
jmp err
;------------------------------------------
; ディスクシステムのリセット
;------------------------------------------
diskSysReset:
mov ax,0 ;AH = 00h
mov dl,0 ;drive (if bit 7 is set both hard disks and floppy disks reset)
int 13h ;Int 13/AH=00h RESET DISK SYSTEM
;clear if successful (returned AH=00h)
jc diskSysReset
ret
;------------------------------------------
; FAT12のテーブルがある19セクタ目から6セクタをメモリにコピー
;------------------------------------------
diskRead:
mov ax, 9C0h ;配置アドレス
mov es, ax
mov bx, 0 ;es:bx セグメント:オフセットの設定
mov ah, 02h ;AH=02h
mov al, 6 ;number of sectors to read 6 セクター読み出し
mov ch, 0 ;low eight bits of cylinder number シリンダ
mov cl, 2 ;sector number 1-63 (bits 0-5) 読み込み開始セクター
mov dh, 1 ;head number
mov dl, 0 ;drive number (bit 7 set for hard disk)
int 13h ;Int 13/AH=02h DISK - READ SECTOR(S) INTO MEMORY
jc diskRead
ret
;------------------------------------------
;al レジスタの数字から文字に
;------------------------------------------
itoa:
add al,48
ret
;------------------------------------------
; al レジスタの値を画面に出力
;------------------------------------------
putc:
push bx
mov ah, 0Eh
mov bx, 7
int 10h
pop bx
ret
filename db "COM COM"
;MBRとして起動するために必要
times 510-($-$$) db 0 ;510バイトまで0で埋める
dw 0AA55h ;MBRをMBRたらしめるマジックナンバーを書き込む
▲トップページ
>
プログラミングの実験
>
OSなしで実行できるプログラム