From 42bbb18c7f7ddfebf1e9a43a8ef94d20dcf0bcf8 Mon Sep 17 00:00:00 2001 From: Yourtion Date: Fri, 5 Sep 2014 16:01:26 +0800 Subject: [PATCH] Add day3 code --- 03_day/!cons_9x.bat | 1 + 03_day/!cons_nt.bat | 1 + 03_day/Makefile | 46 ++++++++++++++++++++++++ 03_day/ipl.nas | 86 +++++++++++++++++++++++++++++++++++++++++++++ 03_day/make.bat | 1 + 5 files changed, 135 insertions(+) create mode 100644 03_day/!cons_9x.bat create mode 100644 03_day/!cons_nt.bat create mode 100644 03_day/Makefile create mode 100644 03_day/ipl.nas create mode 100644 03_day/make.bat diff --git a/03_day/!cons_9x.bat b/03_day/!cons_9x.bat new file mode 100644 index 0000000..e42252a --- /dev/null +++ b/03_day/!cons_9x.bat @@ -0,0 +1 @@ +command \ No newline at end of file diff --git a/03_day/!cons_nt.bat b/03_day/!cons_nt.bat new file mode 100644 index 0000000..6e07473 --- /dev/null +++ b/03_day/!cons_nt.bat @@ -0,0 +1 @@ +cmd.exe \ No newline at end of file diff --git a/03_day/Makefile b/03_day/Makefile new file mode 100644 index 0000000..1d0ec5e --- /dev/null +++ b/03_day/Makefile @@ -0,0 +1,46 @@ +TOOLPATH = ../z_tools/ +MAKE = $(TOOLPATH)make.exe -r +NASK = $(TOOLPATH)nask.exe +EDIMG = $(TOOLPATH)edimg.exe +IMGTOL = $(TOOLPATH)imgtol.com +COPY = copy +DEL = del + +# デフォルト動作 + +default : + $(MAKE) img + +# ファイル生成規則 + +ipl.bin : ipl.nas Makefile + $(NASK) ipl.nas ipl.bin ipl.lst + +haribote.img : ipl.bin Makefile + $(EDIMG) imgin:../z_tools/fdimg0at.tek \ + wbinimg src:ipl.bin len:512 from:0 to:0 imgout:haribote.img + +# コマンド + +asm : + $(MAKE) ipl.bin + +img : + $(MAKE) haribote.img + +run : + $(MAKE) img + $(COPY) haribote.img ..\z_tools\qemu\fdimage0.bin + $(MAKE) -C ../z_tools/qemu + +install : + $(MAKE) img + $(IMGTOL) w a: haribote.img + +clean : + -$(DEL) ipl.bin + -$(DEL) ipl.lst + +src_only : + $(MAKE) clean + -$(DEL) haribote.img diff --git a/03_day/ipl.nas b/03_day/ipl.nas new file mode 100644 index 0000000..effcd95 --- /dev/null +++ b/03_day/ipl.nas @@ -0,0 +1,86 @@ +; haribote-ipl +; TAB=4 + + ORG 0x7c00 ; このプログラムがどこに読み込まれるのか + +; 以下は標準的なFAT12フォーマットフロッピーディスクのための記述 + + JMP entry + DB 0x90 + DB "HARIBOTE" ; ブートセクタの名前を自由に書いてよい(8バイト) + DW 512 ; 1セクタの大きさ(512にしなければいけない) + DB 1 ; クラスタの大きさ(1セクタにしなければいけない) + DW 1 ; FATがどこから始まるか(普通は1セクタ目からにする) + DB 2 ; FATの個数(2にしなければいけない) + DW 224 ; ルートディレクトリ領域の大きさ(普通は224エントリにする) + DW 2880 ; このドライブの大きさ(2880セクタにしなければいけない) + DB 0xf0 ; メディアのタイプ(0xf0にしなければいけない) + DW 9 ; FAT領域の長さ(9セクタにしなければいけない) + DW 18 ; 1トラックにいくつのセクタがあるか(18にしなければいけない) + DW 2 ; ヘッドの数(2にしなければいけない) + DD 0 ; パーティションを使ってないのでここは必ず0 + DD 2880 ; このドライブ大きさをもう一度書く + DB 0,0,0x29 ; よくわからないけどこの値にしておくといいらしい + DD 0xffffffff ; たぶんボリュームシリアル番号 + DB "HARIBOTEOS " ; ディスクの名前(11バイト) + DB "FAT12 " ; フォーマットの名前(8バイト) + RESB 18 ; とりあえず18バイトあけておく + +; プログラム本体 + +entry: + MOV AX,0 ; レジスタ初期化 + MOV SS,AX + MOV SP,0x7c00 + MOV DS,AX + +; ディスクを読む + + MOV AX,0x0820 + MOV ES,AX + MOV CH,0 ; シリンダ0 + MOV DH,0 ; ヘッド0 + MOV CL,2 ; セクタ2 + + MOV SI,0 ; 失敗回数を数えるレジスタ +retry: + MOV AH,0x02 ; AH=0x02 : ディスク読み込み + MOV AL,1 ; 1セクタ + MOV BX,0 + MOV DL,0x00 ; Aドライブ + INT 0x13 ; ディスクBIOS呼び出し + JNC fin ; エラーがおきなければfinへ + ADD SI,1 ; SIに1を足す + CMP SI,5 ; SIと5を比較 + JAE error ; SI >= 5 だったらerrorへ + MOV AH,0x00 + MOV DL,0x00 ; Aドライブ + INT 0x13 ; ドライブのリセット + JMP retry + +; 読み終わったけどとりあえずやることないので寝る + +fin: + HLT ; 何かあるまでCPUを停止させる + JMP fin ; 無限ループ + +error: + MOV SI,msg +putloop: + MOV AL,[SI] + ADD SI,1 ; SIに1を足す + CMP AL,0 + JE fin + MOV AH,0x0e ; 一文字表示ファンクション + MOV BX,15 ; カラーコード + INT 0x10 ; ビデオBIOS呼び出し + JMP putloop +msg: + DB 0x0a, 0x0a ; 改行を2つ + DB "load error" + DB 0x0a ; 改行 + DB 0 + + RESB 0x7dfe-$ ; 0x7dfeまでを0x00で埋める命令 + + DB 0x55, 0xaa diff --git a/03_day/make.bat b/03_day/make.bat new file mode 100644 index 0000000..e489766 --- /dev/null +++ b/03_day/make.bat @@ -0,0 +1 @@ +..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 \ No newline at end of file