Mercurial > hg > Members > mitsuki > haribote
view ipl10.asm @ 0:1a23828953f2
haribote day 4
author | mir3636 |
---|---|
date | Wed, 03 Oct 2018 21:06:50 +0900 |
parents | |
children |
line wrap: on
line source
; hello-os ; TAB=4 CYLS EQU 10 ; どこまで読み込むか ORG 0x7c00 ; 以下は標準的なFAT12フォーマットフロッピーディスクのための記述 JMP entry DB 0x90 DB "HARIBOTE" DW 512 ; 1セクタの大きさ DB 1 ; クラスタの大きさ DW 1 ; FATがどこから始まるか DB 2 ; FATの個数 DW 224 ; ルートディレクトリの大きさ DW 2880 ; このドライブの大きさ DB 0xf0 ; メディアのタイプ DW 9 ; FAT領域の長さ DW 18 ; 1トラックに幾つのセクタがあるか DW 2 ; ヘッドの数 DD 0 ; パーティションを使ってここは必ず0 DD 2880 ; このドライブの大きさをもう一度 DB 0 ; physical disk number DB 0 ; current head DB 0x29 ; extended boot signature (0x29 means DOS 4.0 EBPB) DD 0xffffffff ; ボリュームシリアルナンバー DB "HARIBOTEOS " ; ディスクの名前11バイト DB "FAT12 " ; フォーマットの名前 TIMES 18 DB 0 ; 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 readloop: MOV SI,0 ; 失敗回数を数えるレジスタ retry: MOV AH,0x02 ; AH=0x02 ディスク読み込み MOV AL,1 ; 1セクタ MOV BX,0 MOV DL,0x00 ; Aドライブ INT 0x13 ; ディスクBIOS呼び出し JNC next ; エラーが起きなければnextへ 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 next: MOV AX,ES ; アドレスを0x200進める ADD AX,0x0020 MOV ES,AX ; ADD ES,0x020 という命令がないのでこうしている ADD CL,1 ; CLに1を足す CMP CL,18 ; CLと18を比較 JBE readloop ; CL<=18だったらreadloopへ MOV CL,1 ADD DH,1 CMP DH,2 JB readloop ; DH < 2 だったら readloop へ MOV DH,0 ADD CH,1 CMP CH,CYLS JB readloop ; CH < CYLS だったら readloop へ ; 読み終わったのでharibote.sysを実行だ! MOV [0x0ff0],CH ; IPLがどこまで読んだかをメモ JMP 0xc200 error: MOV SI,msg putloop: MOV AL,[SI] ; SI番地の1バイトの内容をALに書き込む ADD SI,1 CMP AL,0 JE fin MOV AH,0x0e ; 一文字表示ファンクション MOV BX,15 INT 0x10 JMP putloop fin: HLT JMP fin msg: DB 0x0a, 0x0a ; 改行を2つ DB "hello, world" DB 0x0a DB 0 TIMES 0x7dfe-0x7c00-($-$$) DB 0 ; 0x01ff までスキップ DB 0x55, 0xaa ; boot signature