[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なしで実行できるプログラム