forked from yourtion/30dayMakeOS
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
3 changed files
with
117 additions
and
113 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,105 +1,109 @@ | ||
; haribote-ipl | ||
; TAB=4 | ||
|
||
CYLS EQU 10 ; どこまで読み込むか | ||
CYLS EQU 10 ; 声明CYLS=10 | ||
|
||
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 "HARIBOTE" ; 启动扇区名称(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 "HARIBOTEOS " ; 磁盘的名称(必须为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 | ||
|
||
readloop: | ||
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 next ; エラーがおきなければnextへ | ||
ADD SI,1 ; SIに1を足す | ||
CMP SI,5 ; SIと5を比較 | ||
JAE error ; SI >= 5 だったらerrorへ | ||
MOV DL,0x00 ; A驱动器 | ||
INT 0x13 ; 调用磁盘BIOS | ||
JNC next ; 没出错则跳转到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 | ||
next: | ||
MOV AX,ES ; アドレスを0x200進める | ||
MOV AX,ES ; 把内存地址后移0x200(512/16十六进制转换) | ||
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 ES,AX ; ADD ES,0x020因为没有ADD ES,只能通过AX进行 | ||
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へ | ||
JB readloop ; DH < 2 跳转到readloop | ||
MOV DH,0 | ||
ADD CH,1 | ||
CMP CH,CYLS | ||
JB readloop ; CH < CYLS だったらreadloopへ | ||
|
||
; 読み終わったのでharibote.sysを実行だ! | ||
JB readloop ; CH < CYLS 跳转到readloop | ||
|
||
MOV [0x0ff0],CH ; IPLがどこまで読んだのかをメモ | ||
; 读取完毕,跳转到haribote.sys执行! | ||
MOV [0x0ff0],CH ; IPLがどこまで読んだのかをメモ | ||
JMP 0xc200 | ||
|
||
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 | ||
|
||
fin: | ||
HLT ; 何かあるまでCPUを停止させる | ||
JMP fin ; 無限ループ | ||
HLT ; 让CPU停止,等待指令 | ||
JMP fin ; 无限循环 | ||
|
||
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 |