This commit is contained in:
Yourtion
2014-09-05 16:09:20 +08:00
parent 42bbb18c7f
commit 2374e83783
2 changed files with 52 additions and 50 deletions

View File

@@ -6,12 +6,12 @@ IMGTOL = $(TOOLPATH)imgtol.com
COPY = copy
DEL = del
# デフォルト動
# 默认动
default :
$(MAKE) img
# ファイル生成規則
# 镜像文件生成
ipl.bin : ipl.nas Makefile
$(NASK) ipl.nas ipl.bin ipl.lst
@@ -20,7 +20,7 @@ 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

View File

@@ -1,86 +1,88 @@
; haribote-ipl
; TAB=4
ORG 0x7c00 ; このプログラムがどこに読み込まれるのか
ORG 0x7c00 ; 指明程序装载地址
; 以下は標準的なFAT12フォーマットフロッピーディスクのための記述
; 标准FAT12格式软盘专用的代码 Stand FAT12 format floppy code
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バイトあけておく
DB "HELLOIPL" ; 启动扇区名称8字节
DW 512 ; 每个扇区sector大小必须512字节
DB 1 ; cluster大小必须为1个扇区
DW 1 ; FAT起始位置(一般为第一个扇区
DB 2 ; FAT个数必须为2
DW 224 ; 根目录大小一般为224项
DW 2880 ; 该磁盘大小必须为2880扇区1440*1024/512
DB 0xf0 ; 磁盘类型必须为0xf0
DW 9 ; FAT的长度(必??9扇区
DW 18 ; 一个磁道track有几个扇区必须为18
DW 2 ; 磁头数(必??2
DD 0 ; 不使用分区,必须是0
DD 2880 ; 重写一次磁盘大小
DB 0,0,0x29 ; 意义不明(固定)
DD 0xffffffff ; (可能是)卷标号码
DB "HELLO-OS " ; 磁盘的名称必须为11字?,不足填空格
DB "FAT12 " ; 磁盘格式名称(必??8字?,不足填空格
RESB 18 ; 先空出18字节
; プログラム本
; 程序主
entry:
MOV AX,0 ; レジスタ初期化
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 CH,0 ; 柱面0
MOV DH,0 ; 磁头0
MOV CL,2 ; 扇区2
MOV SI,0 ; 失敗回数を数えるレジスタ
MOV SI,0 ; 记录失败次数寄存器
retry:
MOV AH,0x02 ; AH=0x02 : ディスク読み込み
MOV AL,1 ; 1セクタ
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 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 ; ドライブのリセット
MOV DL,0x00 ; A驱动器
INT 0x13 ; 重置驱动器
JMP retry
; 読み終わったけどとりあえずやることないので寝る
; 读取完毕,无其他指令进入休眠
fin:
HLT ; 何かあるまでCPU停止させる
JMP fin ; 無限ループ
HLT ; CPU停止,等待指令
JMP fin ; 无限循环
error:
MOV SI,msg
putloop:
MOV AL,[SI]
ADD SI,1 ; SIに1を足す
ADD SI,1 ; SI加1
CMP AL,0
JE fin
MOV AH,0x0e ; 一文字表示ファンクション
MOV BX,15 ; カラーコード
INT 0x10 ; ビデオBIOS呼び出し
MOV AH,0x0e ; 显示一个文字
MOV BX,15 ; 指定字符颜色
INT 0x10 ; 调用显卡BIOS
JMP putloop
msg:
DB 0x0a, 0x0a ; 改行を2つ
DB 0x0a, 0x0a ; 换行两次
DB "load error"
DB 0x0a ;
DB 0x0a ;
DB 0
RESB 0x7dfe-$ ; 0x7dfeまでを0x00で埋める命令
RESB 0x7dfe-$ ; 填写0x00直到0x001fe
DB 0x55, 0xaa