diff --git a/03_day/asmhead.nas b/03_day/asmhead.nas index 2a66b1b..c5bce1b 100644 --- a/03_day/asmhead.nas +++ b/03_day/asmhead.nas @@ -1,49 +1,49 @@ ; haribote-os boot asm ; TAB=4 -BOTPAK EQU 0x00280000 ; bootpackのロード先 -DSKCAC EQU 0x00100000 ; ディスクキャッシュの場所 -DSKCAC0 EQU 0x00008000 ; ディスクキャッシュの場所(リアルモード) +BOTPAK EQU 0x00280000 ; 加载bootpack +DSKCAC EQU 0x00100000 ; 磁盘缓存的位置 +DSKCAC0 EQU 0x00008000 ; 磁盘缓存的位置(实模式) -; BOOT_INFO関係 -CYLS EQU 0x0ff0 ; ブートセクタが設定する +; BOOT_INFO相关 +CYLS EQU 0x0ff0 ; 引导扇区设置 LEDS EQU 0x0ff1 -VMODE EQU 0x0ff2 ; 色数に関する情報。何ビットカラーか? -SCRNX EQU 0x0ff4 ; 解像度のX -SCRNY EQU 0x0ff6 ; 解像度のY -VRAM EQU 0x0ff8 ; グラフィックバッファの開始番地 +VMODE EQU 0x0ff2 ; 关于颜色的信息 +SCRNX EQU 0x0ff4 ; 分辨率X +SCRNY EQU 0x0ff6 ; 分辨率Y +VRAM EQU 0x0ff8 ; 图像缓冲区的起始地址 - ORG 0xc200 ; このプログラムがどこに読み込まれるのか + ORG 0xc200 ; 这个的程序要被装载的内存地址 ; 画面モードを設定 - MOV AL,0x13 ; VGAグラフィックス、320x200x8bitカラー + MOV AL,0x13 ; VGA显卡,320x200x8bit MOV AH,0x00 INT 0x10 - MOV BYTE [VMODE],8 ; 画面モードをメモする(C言語が参照する) + MOV BYTE [VMODE],8 ; 屏幕的模式(参考C语言的引用) MOV WORD [SCRNX],320 MOV WORD [SCRNY],200 MOV DWORD [VRAM],0x000a0000 -; キーボードのLED状態をBIOSに教えてもらう +; 通过BIOS获取指示灯状态 MOV AH,0x02 INT 0x16 ; keyboard BIOS MOV [LEDS],AL -; PICが一切の割り込みを受け付けないようにする -; AT互換機の仕様では、PICの初期化をするなら、 -; こいつをCLI前にやっておかないと、たまにハングアップする -; PICの初期化はあとでやる +; 防止PIC接受所有中断 +; AT兼容机的规范、PIC初始化 +; 然后之前在CLI不做任何事就挂起 +; PIC在同意后初始化 MOV AL,0xff OUT 0x21,AL - NOP ; OUT命令を連続させるとうまくいかない機種があるらしいので + NOP ; 不断执行OUT指令 OUT 0xa1,AL - CLI ; さらにCPUレベルでも割り込み禁止 + CLI ; 进一步中断CPU -; CPUから1MB以上のメモリにアクセスできるように、A20GATEを設定 +; 让CPU支持1M以上内存、设置A20GATE CALL waitkbdout MOV AL,0xd1 @@ -53,72 +53,72 @@ VRAM EQU 0x0ff8 ; グラフィックバッファの開始番地 OUT 0x60,AL CALL waitkbdout -; プロテクトモード移行 +; 保护模式转换 -[INSTRSET "i486p"] ; 486の命令まで使いたいという記述 +[INSTRSET "i486p"] ; 说明使用486指令 - LGDT [GDTR0] ; 暫定GDTを設定 + LGDT [GDTR0] ; 设置临时GDT MOV EAX,CR0 - AND EAX,0x7fffffff ; bit31を0にする(ページング禁止のため) - OR EAX,0x00000001 ; bit0を1にする(プロテクトモード移行のため) + AND EAX,0x7fffffff ; 使用bit31(禁用分页) + OR EAX,0x00000001 ; bit0到1转换(保护模式过渡) MOV CR0,EAX JMP pipelineflush pipelineflush: - MOV AX,1*8 ; 読み書き可能セグメント32bit + MOV AX,1*8 ; 写32bit的段 MOV DS,AX MOV ES,AX MOV FS,AX MOV GS,AX MOV SS,AX -; bootpackの転送 +; bootpack传递 - MOV ESI,bootpack ; 転送元 - MOV EDI,BOTPAK ; 転送先 + MOV ESI,bootpack ; 源 + MOV EDI,BOTPAK ; 目标 MOV ECX,512*1024/4 CALL memcpy -; ついでにディスクデータも本来の位置へ転送 +; 传输磁盘数据 -; まずはブートセクタから +; 从引导区开始 - MOV ESI,0x7c00 ; 転送元 - MOV EDI,DSKCAC ; 転送先 + MOV ESI,0x7c00 ; 源 + MOV EDI,DSKCAC ; 目标 MOV ECX,512/4 CALL memcpy -; 残り全部 +; 剩余的全部 - MOV ESI,DSKCAC0+512 ; 転送元 - MOV EDI,DSKCAC+512 ; 転送先 + 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の分だけ差し引く + IMUL ECX,512*18*2/4 ; 除以4得到字节数 + SUB ECX,512/4 ; IPL偏移量 CALL memcpy -; asmheadでしなければいけないことは全部し終わったので、 -; あとはbootpackに任せる +; 由于还需要asmhead才能完成 +; 完成其余的bootpack任务 -; 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] ; 転送元 + JZ skip ; 传输完成 + MOV ESI,[EBX+20] ; 源 ADD ESI,EBX - MOV EDI,[EBX+12] ; 転送先 + MOV EDI,[EBX+12] ; 目标 CALL memcpy skip: - MOV ESP,[EBX+12] ; スタック初期値 + MOV ESP,[EBX+12] ; 堆栈的初始化 JMP DWORD 2*8:0x0000001b waitkbdout: IN AL,0x64 AND AL,0x02 - JNZ waitkbdout ; ANDの結果が0でなければwaitkbdoutへ + JNZ waitkbdout ; AND结果不为0跳转到waitkbdout RET memcpy: @@ -127,15 +127,15 @@ memcpy: MOV [EDI],EAX ADD EDI,4 SUB ECX,1 - JNZ memcpy ; 引き算した結果が0でなければmemcpyへ + JNZ memcpy ; 运算结果不为0跳转到memcpy RET -; memcpyはアドレスサイズプリフィクスを入れ忘れなければ、ストリング命令でも書ける +; memcpy地址前缀大小 ALIGNB 16 GDT0: - RESB 8 ; ヌルセレクタ - DW 0xffff,0x0000,0x9200,0x00cf ; 読み書き可能セグメント32bit - DW 0xffff,0x0000,0x9a28,0x0047 ; 実行可能セグメント32bit(bootpack用) + RESB 8 ; 初始值 + DW 0xffff,0x0000,0x9200,0x00cf ; 写32bit位段寄存器 + DW 0xffff,0x0000,0x9a28,0x0047 ; 可执行的文件的32bit寄存器(bootpack用) DW 0 GDTR0: