From 7497159026b52b78bbaaf1570b1c0db0fd520c07 Mon Sep 17 00:00:00 2001 From: Yourtion Date: Wed, 18 May 2016 13:08:09 +0800 Subject: [PATCH] =?UTF-8?q?=E6=97=A5=E6=96=87=E6=96=87=E5=AD=97=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=EF=BC=883=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 28_day/Makefile | 12 +++- 28_day/apilib.h | 1 + 28_day/apilib/Makefile | 2 +- 28_day/apilib/api027.nas | 13 +++++ 28_day/chklang/!cons_9x.bat | 1 + 28_day/chklang/!cons_nt.bat | 1 + 28_day/chklang/Makefile | 5 ++ 28_day/chklang/chklang.c | 24 ++++++++ 28_day/chklang/make.bat | 1 + 28_day/euc.txt | 1 + 28_day/haribote/Makefile | 6 +- 28_day/haribote/console.c | 4 +- 28_day/haribote/graphic.c | 19 +++++++ 28_day/haribote/ipl20.nas | 109 ++++++++++++++++++++++++++++++++++++ 14 files changed, 193 insertions(+), 6 deletions(-) create mode 100644 28_day/apilib/api027.nas create mode 100644 28_day/chklang/!cons_9x.bat create mode 100644 28_day/chklang/!cons_nt.bat create mode 100644 28_day/chklang/Makefile create mode 100644 28_day/chklang/chklang.c create mode 100644 28_day/chklang/make.bat create mode 100644 28_day/euc.txt create mode 100644 28_day/haribote/ipl20.nas diff --git a/28_day/Makefile b/28_day/Makefile index 191f468..5e59a38 100644 --- a/28_day/Makefile +++ b/28_day/Makefile @@ -14,16 +14,17 @@ default : #文件生成规则 -haribote.img : haribote/ipl10.bin haribote/haribote.sys Makefile \ +haribote.img : haribote/ipl20.bin haribote/haribote.sys Makefile \ a/a.hrb hello3/hello3.hrb hello4/hello4.hrb hello5/hello5.hrb \ winhelo/winhelo.hrb winhelo2/winhelo2.hrb winhelo3/winhelo3.hrb \ star1/star1.hrb stars/stars.hrb stars2/stars2.hrb \ lines/lines.hrb walk/walk.hrb noodle/noodle.hrb \ beepdown/beepdown.hrb color/color.hrb color2/color2.hrb \ sosu/sosu.hrb sosu2/sosu2.hrb sosu3/sosu3.hrb \ - typeipl/typeipl.hrb type/type.hrb iroha/iroha.hrb + typeipl/typeipl.hrb type/type.hrb iroha/iroha.hrb \ + chklang/chklang.hrb $(EDIMG) imgin:../z_tools/fdimg0at.tek \ - wbinimg src:haribote/ipl10.bin len:512 from:0 to:0 \ + wbinimg src:haribote/ipl20.bin len:512 from:0 to:0 \ copy from:haribote/haribote.sys to:@: \ copy from:haribote/jp.nas to:@: \ copy from:make.bat to:@: \ @@ -49,6 +50,8 @@ haribote.img : haribote/ipl10.bin haribote/haribote.sys Makefile \ copy from:typeipl/typeipl.hrb to:@: \ copy from:type/type.hrb to:@: \ copy from:iroha/iroha.hrb to:@: \ + copy from:chklang/chklang.hrb to:@: \ + copy from:euc.txt to:@: \ copy from:nihongo/nihongo.fnt to:@: \ imgout:haribote.img @@ -88,6 +91,7 @@ full : $(MAKE) -C typeipl $(MAKE) -C type $(MAKE) -C iroha + $(MAKE) -C chklang $(MAKE) haribote.img run_full : @@ -135,6 +139,7 @@ clean_full : $(MAKE) -C typeipl clean $(MAKE) -C type clean $(MAKE) -C iroha clean + $(MAKE) -C chklang clean src_only_full : $(MAKE) -C haribote src_only @@ -161,6 +166,7 @@ src_only_full : $(MAKE) -C typeipl src_only $(MAKE) -C type src_only $(MAKE) -C iroha src_only + $(MAKE) -C chklang src_only -$(DEL) haribote.img refresh : diff --git a/28_day/apilib.h b/28_day/apilib.h index fbf0884..ac282d8 100644 --- a/28_day/apilib.h +++ b/28_day/apilib.h @@ -24,3 +24,4 @@ void api_fseek(int fhandle, int offset, int mode); int api_fsize(int fhandle, int mode); int api_fread(char *buf, int maxsize, int fhandle); int api_cmdline(char *buf, int maxsize); +int api_getlang(void); diff --git a/28_day/apilib/Makefile b/28_day/apilib/Makefile index b40633b..8ce9ef5 100644 --- a/28_day/apilib/Makefile +++ b/28_day/apilib/Makefile @@ -2,7 +2,7 @@ OBJS_API = api001.obj api002.obj api003.obj api004.obj api005.obj api006.obj \ api007.obj api008.obj api009.obj api010.obj api011.obj api012.obj \ api013.obj api014.obj api015.obj api016.obj api017.obj api018.obj \ api019.obj api020.obj api021.obj api022.obj api023.obj api024.obj \ - api025.obj api026.obj alloca.obj + api025.obj api026.obj api027.obj alloca.obj TOOLPATH = ../../z_tools/ INCPATH = ../../z_tools/haribote/ diff --git a/28_day/apilib/api027.nas b/28_day/apilib/api027.nas new file mode 100644 index 0000000..38bfbc1 --- /dev/null +++ b/28_day/apilib/api027.nas @@ -0,0 +1,13 @@ +[FORMAT "WCOFF"] +[INSTRSET "i486p"] +[BITS 32] +[FILE "api027.nas"] + + GLOBAL _api_getlang + +[SECTION .text] + +_api_getlang: ; int api_getlang(void); + MOV EDX,27 + INT 0x40 + RET diff --git a/28_day/chklang/!cons_9x.bat b/28_day/chklang/!cons_9x.bat new file mode 100644 index 0000000..e42252a --- /dev/null +++ b/28_day/chklang/!cons_9x.bat @@ -0,0 +1 @@ +command \ No newline at end of file diff --git a/28_day/chklang/!cons_nt.bat b/28_day/chklang/!cons_nt.bat new file mode 100644 index 0000000..6e07473 --- /dev/null +++ b/28_day/chklang/!cons_nt.bat @@ -0,0 +1 @@ +cmd.exe \ No newline at end of file diff --git a/28_day/chklang/Makefile b/28_day/chklang/Makefile new file mode 100644 index 0000000..c00ebbc --- /dev/null +++ b/28_day/chklang/Makefile @@ -0,0 +1,5 @@ +APP = chklang +STACK = 1k +MALLOC = 0k + +include ../app_make.txt diff --git a/28_day/chklang/chklang.c b/28_day/chklang/chklang.c new file mode 100644 index 0000000..3c28491 --- /dev/null +++ b/28_day/chklang/chklang.c @@ -0,0 +1,24 @@ +#include "apilib.h" + +void HariMain(void) +{ + int langmode = api_getlang(); + static char s1[23] = { /* 日本語シフトJISモード(日文Shift-JIS模式)*/ + 0x93, 0xfa, 0x96, 0x7b, 0x8c, 0xea, 0x83, 0x56, 0x83, 0x74, 0x83, 0x67, + 0x4a, 0x49, 0x53, 0x83, 0x82, 0x81, 0x5b, 0x83, 0x68, 0x0a, 0x00 + }; + static char s2[17] = { /*日本語EUCモード(日文EUC模式)*/ + 0xc6, 0xfc, 0xcb, 0xdc, 0xb8, 0xec, 0x45, 0x55, 0x43, 0xa5, 0xe2, 0xa1, + 0xbc, 0xa5, 0xc9, 0x0a, 0x00 + }; + if (langmode == 0) { + api_putstr0("English ASCII mode\n"); + } + if (langmode == 1) { + api_putstr0(s1); + } + if (langmode == 2) { + api_putstr0(s2); + } + api_end(); +} diff --git a/28_day/chklang/make.bat b/28_day/chklang/make.bat new file mode 100644 index 0000000..6b0dbfc --- /dev/null +++ b/28_day/chklang/make.bat @@ -0,0 +1 @@ +..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 \ No newline at end of file diff --git a/28_day/euc.txt b/28_day/euc.txt new file mode 100644 index 0000000..ae6d81a --- /dev/null +++ b/28_day/euc.txt @@ -0,0 +1 @@ +ܸEUCǽ񤤤Ƥߤ衼 diff --git a/28_day/haribote/Makefile b/28_day/haribote/Makefile index b0ce461..374bba7 100644 --- a/28_day/haribote/Makefile +++ b/28_day/haribote/Makefile @@ -23,7 +23,7 @@ DEL = del #默认动作 default : - $(MAKE) ipl10.bin + $(MAKE) ipl20.bin $(MAKE) haribote.sys # 镜像文件生成 @@ -31,6 +31,9 @@ default : ipl10.bin : ipl10.nas Makefile $(NASK) ipl10.nas ipl10.bin ipl10.lst +ipl20.bin : ipl20.nas Makefile + $(NASK) ipl20.nas ipl20.bin ipl20.lst + asmhead.bin : asmhead.nas Makefile $(NASK) asmhead.nas asmhead.bin asmhead.lst @@ -76,4 +79,5 @@ clean : src_only : $(MAKE) clean -$(DEL) ipl10.bin + -$(DEL) ipl20.bin -$(DEL) haribote.sys diff --git a/28_day/haribote/console.c b/28_day/haribote/console.c index e2e20f8..b231d2b 100644 --- a/28_day/haribote/console.c +++ b/28_day/haribote/console.c @@ -334,7 +334,7 @@ void cmd_langmode(struct CONSOLE *cons, char *cmdline) { struct TASK *task = task_now(); unsigned char mode = cmdline[9] - '0'; - if (mode <= 1) { + if (mode <= 2) { task->langmode = mode; } else { cons_putstr0(cons, "mode number error.\n"); @@ -620,6 +620,8 @@ int *hrb_api(int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int i++; } reg[7] = i; + } else if (edx == 27) { + reg[7] = task->langmode; } return 0; } diff --git a/28_day/haribote/graphic.c b/28_day/haribote/graphic.c index ab39ac9..3ac5000 100644 --- a/28_day/haribote/graphic.c +++ b/28_day/haribote/graphic.c @@ -147,6 +147,25 @@ void putfonts8_asc(char *vram, int xsize, int x, int y, char c, unsigned char *s x += 8; } } + if (task->langmode == 2) { + for (; *s != 0x00; s++) { + if (task->langbyte1 == 0) { + if (0x81 <= *s && *s <= 0xfe) { + task->langbyte1 = *s; + } else { + putfont8(vram, xsize, x, y, c, nihongo + *s * 16); + } + } else { + k = task->langbyte1 - 0xa1; + t = *s - 0xa1; + task->langbyte1 = 0; + font = nihongo + 256 * 16 + (k * 94 + t) * 32; + putfont8(vram, xsize, x - 8, y, c, font ); /* 左半部分 */ + putfont8(vram, xsize, x , y, c, font + 16); /* 右半部分 */ + } + x += 8; + } + } return; } diff --git a/28_day/haribote/ipl20.nas b/28_day/haribote/ipl20.nas new file mode 100644 index 0000000..9b14835 --- /dev/null +++ b/28_day/haribote/ipl20.nas @@ -0,0 +1,109 @@ +; haribote-ipl +; TAB=4 + +CYLS EQU 20 ; 声明CYLS=20 + + ORG 0x7c00 ; 指明程序装载地址 + +; 标准FAT12格式软盘专用的代码 Stand FAT12 format floppy code + + JMP entry + DB 0x90 + 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 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 ; 没出错则跳转到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 ; 重置驱动器 + JMP retry +next: + MOV AX,ES ; 把内存地址后移0x200(512/16十六进制转换) + ADD AX,0x0020 + 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 + 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] + ADD SI,1 ; 给SI加1 + CMP AL,0 + JE fin + MOV AH,0x0e ; 显示一个文字 + MOV BX,15 ; 指定字符颜色 + INT 0x10 ; 调用显卡BIOS + JMP putloop + +fin: + HLT ; 让CPU停止,等待指令 + JMP fin ; 无限循环 + +msg: + DB 0x0a, 0x0a ; 换行两次 + DB "load error" + DB 0x0a ; 换行 + DB 0 + + RESB 0x7dfe-$ ; 填写0x00直到0x001fe + + DB 0x55, 0xaa