From 8fc2d2934ee61f2cbcb00cc29769ec9b4d0c49f3 Mon Sep 17 00:00:00 2001 From: Yourtion Date: Wed, 10 Sep 2014 14:10:51 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BC=80=E5=A7=8B=E5=AF=BC=E5=85=A5C=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=EF=BC=88haribote.nas=E6=94=B9=E6=88=90asmhead.nas?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 03_day/Makefile | 42 +++++++++++-- 03_day/asmhead.nas | 146 ++++++++++++++++++++++++++++++++++++++++++++ 03_day/bootpack.c | 8 +++ 03_day/haribote.nas | 30 --------- 03_day/ipl10.nas | 2 +- 5 files changed, 192 insertions(+), 36 deletions(-) create mode 100644 03_day/asmhead.nas create mode 100644 03_day/bootpack.c delete mode 100644 03_day/haribote.nas diff --git a/03_day/Makefile b/03_day/Makefile index e3e47be..546830e 100644 --- a/03_day/Makefile +++ b/03_day/Makefile @@ -1,6 +1,13 @@ TOOLPATH = ../z_tools/ +INCPATH = ../z_tools/haribote/ + MAKE = $(TOOLPATH)make.exe -r NASK = $(TOOLPATH)nask.exe +CC1 = $(TOOLPATH)cc1.exe -I$(INCPATH) -Os -Wall -quiet +GAS2NASK = $(TOOLPATH)gas2nask.exe -a +OBJ2BIM = $(TOOLPATH)obj2bim.exe +BIM2HRB = $(TOOLPATH)bim2hrb.exe +RULEFILE = $(TOOLPATH)haribote/haribote.rul EDIMG = $(TOOLPATH)edimg.exe IMGTOL = $(TOOLPATH)imgtol.com COPY = copy @@ -16,8 +23,28 @@ default : ipl10.bin : ipl10.nas Makefile $(NASK) ipl10.nas ipl10.bin ipl10.lst -haribote.sys : haribote.nas Makefile - $(NASK) haribote.nas haribote.sys haribote.lst +asmhead.bin : asmhead.nas Makefile + $(NASK) asmhead.nas asmhead.bin asmhead.lst + +bootpack.gas : bootpack.c Makefile + $(CC1) -o bootpack.gas bootpack.c + +bootpack.nas : bootpack.gas Makefile + $(GAS2NASK) bootpack.gas bootpack.nas + +bootpack.obj : bootpack.nas Makefile + $(NASK) bootpack.nas bootpack.obj bootpack.lst + +bootpack.bim : bootpack.obj Makefile + $(OBJ2BIM) @$(RULEFILE) out:bootpack.bim stack:3136k map:bootpack.map \ + bootpack.obj +# 3MB+64KB=3136KB + +bootpack.hrb : bootpack.bim Makefile + $(BIM2HRB) bootpack.bim bootpack.hrb 0 + +haribote.sys : asmhead.bin bootpack.hrb Makefile + copy /B asmhead.bin+bootpack.hrb haribote.sys haribote.img : ipl10.bin haribote.sys Makefile $(EDIMG) imgin:../z_tools/fdimg0at.tek \ @@ -40,10 +67,15 @@ install : $(IMGTOL) w a: haribote.img clean : - -$(DEL) ipl10.bin - -$(DEL) ipl10.lst + -$(DEL) *.bin + -$(DEL) *.lst + -$(DEL) *.gas + -$(DEL) *.obj + -$(DEL) bootpack.nas + -$(DEL) bootpack.map + -$(DEL) bootpack.bim + -$(DEL) bootpack.hrb -$(DEL) haribote.sys - -$(DEL) haribote.lst src_only : $(MAKE) clean diff --git a/03_day/asmhead.nas b/03_day/asmhead.nas new file mode 100644 index 0000000..2a66b1b --- /dev/null +++ b/03_day/asmhead.nas @@ -0,0 +1,146 @@ +; haribote-os boot asm +; TAB=4 + +BOTPAK EQU 0x00280000 ; bootpackのロード先 +DSKCAC EQU 0x00100000 ; ディスクキャッシュの場所 +DSKCAC0 EQU 0x00008000 ; ディスクキャッシュの場所(リアルモード) + +; BOOT_INFO関係 +CYLS EQU 0x0ff0 ; ブートセクタが設定する +LEDS EQU 0x0ff1 +VMODE EQU 0x0ff2 ; 色数に関する情報。何ビットカラーか? +SCRNX EQU 0x0ff4 ; 解像度のX +SCRNY EQU 0x0ff6 ; 解像度のY +VRAM EQU 0x0ff8 ; グラフィックバッファの開始番地 + + ORG 0xc200 ; このプログラムがどこに読み込まれるのか + +; 画面モードを設定 + + MOV AL,0x13 ; VGAグラフィックス、320x200x8bitカラー + MOV AH,0x00 + INT 0x10 + MOV BYTE [VMODE],8 ; 画面モードをメモする(C言語が参照する) + MOV WORD [SCRNX],320 + MOV WORD [SCRNY],200 + MOV DWORD [VRAM],0x000a0000 + +; キーボードのLED状態をBIOSに教えてもらう + + MOV AH,0x02 + INT 0x16 ; keyboard BIOS + MOV [LEDS],AL + +; PICが一切の割り込みを受け付けないようにする +; AT互換機の仕様では、PICの初期化をするなら、 +; こいつをCLI前にやっておかないと、たまにハングアップする +; PICの初期化はあとでやる + + MOV AL,0xff + OUT 0x21,AL + NOP ; OUT命令を連続させるとうまくいかない機種があるらしいので + OUT 0xa1,AL + + CLI ; さらにCPUレベルでも割り込み禁止 + +; CPUから1MB以上のメモリにアクセスできるように、A20GATEを設定 + + CALL waitkbdout + MOV AL,0xd1 + OUT 0x64,AL + CALL waitkbdout + MOV AL,0xdf ; enable A20 + OUT 0x60,AL + CALL waitkbdout + +; プロテクトモード移行 + +[INSTRSET "i486p"] ; 486の命令まで使いたいという記述 + + LGDT [GDTR0] ; 暫定GDTを設定 + MOV EAX,CR0 + AND EAX,0x7fffffff ; bit31を0にする(ページング禁止のため) + OR EAX,0x00000001 ; bit0を1にする(プロテクトモード移行のため) + MOV CR0,EAX + JMP pipelineflush +pipelineflush: + MOV AX,1*8 ; 読み書き可能セグメント32bit + MOV DS,AX + MOV ES,AX + MOV FS,AX + MOV GS,AX + MOV SS,AX + +; bootpackの転送 + + MOV ESI,bootpack ; 転送元 + MOV EDI,BOTPAK ; 転送先 + MOV ECX,512*1024/4 + CALL memcpy + +; ついでにディスクデータも本来の位置へ転送 + +; まずはブートセクタから + + MOV ESI,0x7c00 ; 転送元 + MOV EDI,DSKCAC ; 転送先 + MOV ECX,512/4 + CALL memcpy + +; 残り全部 + + MOV ESI,DSKCAC0+512 ; 転送元 + MOV EDI,DSKCAC+512 ; 転送先 + MOV ECX,0 + MOV CL,BYTE [CYLS] + IMUL ECX,512*18*2/4 ; シリンダ数からバイト数/4に変換 + SUB ECX,512/4 ; IPLの分だけ差し引く + CALL memcpy + +; asmheadでしなければいけないことは全部し終わったので、 +; あとはbootpackに任せる + +; bootpackの起動 + + MOV EBX,BOTPAK + MOV ECX,[EBX+16] + ADD ECX,3 ; ECX += 3; + SHR ECX,2 ; ECX /= 4; + JZ skip ; 転送するべきものがない + MOV ESI,[EBX+20] ; 転送元 + ADD ESI,EBX + MOV EDI,[EBX+12] ; 転送先 + CALL memcpy +skip: + MOV ESP,[EBX+12] ; スタック初期値 + JMP DWORD 2*8:0x0000001b + +waitkbdout: + IN AL,0x64 + AND AL,0x02 + JNZ waitkbdout ; ANDの結果が0でなければwaitkbdoutへ + RET + +memcpy: + MOV EAX,[ESI] + ADD ESI,4 + MOV [EDI],EAX + ADD EDI,4 + SUB ECX,1 + JNZ memcpy ; 引き算した結果が0でなければmemcpyへ + RET +; memcpyはアドレスサイズプリフィクスを入れ忘れなければ、ストリング命令でも書ける + + ALIGNB 16 +GDT0: + RESB 8 ; ヌルセレクタ + DW 0xffff,0x0000,0x9200,0x00cf ; 読み書き可能セグメント32bit + DW 0xffff,0x0000,0x9a28,0x0047 ; 実行可能セグメント32bit(bootpack用) + + DW 0 +GDTR0: + DW 8*3-1 + DD GDT0 + + ALIGNB 16 +bootpack: diff --git a/03_day/bootpack.c b/03_day/bootpack.c new file mode 100644 index 0000000..fcf4d29 --- /dev/null +++ b/03_day/bootpack.c @@ -0,0 +1,8 @@ +void HariMain(void) +{ + +fin: + /* 这里想写上HLT,但是C语言中不能用HLT! */ + goto fin; + +} diff --git a/03_day/haribote.nas b/03_day/haribote.nas deleted file mode 100644 index 0f694b0..0000000 --- a/03_day/haribote.nas +++ /dev/null @@ -1,30 +0,0 @@ -; haribote-os -; TAB=4 - -; 有关BOOT_INFO -CYLS EQU 0x0ff0 ; 设定启动区 -LEDS EQU 0x0ff1 -VMODE EQU 0x0ff2 ; 关于颜色数目的信息。颜色的位数 -SCRNX EQU 0x0ff4 ; 分辨率的X(screen x) -SCRNY EQU 0x0ff6 ; 分辨率的Y(screen y) -VRAM EQU 0x0ff8 ; 图像缓冲区的开始地址 - - ORG 0xc200 ; 这个的程序要被装载的内存地址 - - MOV AL,0x13 ; VGA显卡,320x200x8bit - MOV AH,0x00 - INT 0x10 - MOV BYTE [VMODE],8 ; 记录画面模式 - MOV WORD [SCRNX],320 - MOV WORD [SCRNY],200 - MOV DWORD [VRAM],0x000a0000 - -; 用BIOS取得键盘上各种LED指示灯的状态 - - MOV AH,0x02 - INT 0x16 ; keyboard BIOS - MOV [LEDS],AL - -fin: - HLT - JMP fin diff --git a/03_day/ipl10.nas b/03_day/ipl10.nas index b72c70b..4efa119 100644 --- a/03_day/ipl10.nas +++ b/03_day/ipl10.nas @@ -24,7 +24,7 @@ CYLS EQU 10 ; 声明CYLS=10 DD 2880 ; 重写一次磁盘大小 DB 0,0,0x29 ; 意义不明(固定) DD 0xffffffff ; (可能是)卷标号码 - DB "HELLO-OS " ; 磁盘的名称(必须为11字?,不足填空格) + DB "HARIBOTEOS " ; 磁盘的名称(必须为11字?,不足填空格) DB "FAT12 " ; 磁盘格式名称(必??8字?,不足填空格) RESB 18 ; 先空出18字节