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