Skip to content

Commit

Permalink
日文文字显示(2)
Browse files Browse the repository at this point in the history
  • Loading branch information
yourtion committed May 18, 2016
1 parent ac8b6b1 commit fcd87ee
Show file tree
Hide file tree
Showing 5 changed files with 143 additions and 5 deletions.
2 changes: 1 addition & 1 deletion 28_day/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 25,7 @@ haribote.img : haribote/ipl10.bin haribote/haribote.sys Makefile \
$(EDIMG) imgin:../z_tools/fdimg0at.tek \
wbinimg src:haribote/ipl10.bin len:512 from:0 to:0 \
copy from:haribote/haribote.sys to:@: \
copy from:haribote/ipl10.nas to:@: \
copy from:haribote/jp.nas to:@: \
copy from:make.bat to:@: \
copy from:a/a.hrb to:@: \
copy from:hello3/hello3.hrb to:@: \
Expand Down
2 changes: 1 addition & 1 deletion 28_day/haribote/bootpack.h
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 217,7 @@ struct TASK {
struct FILEHANDLE *fhandle;
int *fat;
char *cmdline;
char langmode;
unsigned char langmode, langbyte1;
};
struct TASKLEVEL {
int running; /*正在运行的任务数量*/
Expand Down
6 changes: 6 additions & 0 deletions 28_day/haribote/console.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 37,7 @@ void console_task(struct SHEET *sheet, int memtotal)
} else {
task->langmode = 0;
}
task->langbyte1 = 0;

/*显示提示符*/
cons_putchar(&cons, '>', 1);
Expand Down Expand Up @@ -158,6 159,7 @@ void cons_newline(struct CONSOLE *cons)
{
int x, y;
struct SHEET *sheet = cons->sht;
struct TASK *task = task_now();
if (cons->cur_y < 28 112) {
cons->cur_y = 16; /*到下一行*/
} else {
Expand All @@ -177,6 179,9 @@ void cons_newline(struct CONSOLE *cons)
}
}
cons->cur_x = 8;
if (task->langmode == 1 && task->langbyte1 != 0) {
cons->cur_x = 8;
}
return;
}

Expand Down Expand Up @@ -403,6 408,7 @@ int cmd_app(struct CONSOLE *cons, int *fat, char *cmdline)
}
timer_cancelall(&task->fifo);
memman_free_4k(memman, (int) q, segsiz);
task->langbyte1 = 0;
} else {
cons_putstr0(cons, ".hrb file format error.\n");
}
Expand Down
31 changes: 28 additions & 3 deletions 28_day/haribote/graphic.c
Original file line number Diff line number Diff line change
Expand Up @@ -107,9 107,10 @@ void putfont8(char *vram, int xsize, int x, int y, char c, char *font)
void putfonts8_asc(char *vram, int xsize, int x, int y, char c, unsigned char *s)
{
extern char hankaku[4096];
/* C语言中,字符串都是以0x00结尾 */
struct TASK *task = task_now();
char *nihongo = (char *) *((int *) 0x0fe8);
char *nihongo = (char *) *((int *) 0x0fe8), *font;
int k, t;

if (task->langmode == 0) {
for (; *s != 0x00; s ) {
putfont8(vram, xsize, x, y, c, hankaku *s * 16);
Expand All @@ -118,7 119,31 @@ void putfonts8_asc(char *vram, int xsize, int x, int y, char c, unsigned char *s
}
if (task->langmode == 1) {
for (; *s != 0x00; s ) {
putfont8(vram, xsize, x, y, c, nihongo *s * 16);
if (task->langbyte1 == 0) {
if ((0x81 <= *s && *s <= 0x9f) || (0xe0 <= *s && *s <= 0xfc)) {
task->langbyte1 = *s;
} else {
putfont8(vram, xsize, x, y, c, nihongo *s * 16);
}
} else {
if (0x81 <= task->langbyte1 && task->langbyte1 <= 0x9f) {
k = (task->langbyte1 - 0x81) * 2;
} else {
k = (task->langbyte1 - 0xe0) * 2 62;
}
if (0x40 <= *s && *s <= 0x7e) {
t = *s - 0x40;
} else if (0x80 <= *s && *s <= 0x9e) {
t = *s - 0x80 63;
} else {
t = *s - 0x9f;
k ;
}
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;
}
}
Expand Down
107 changes: 107 additions & 0 deletions 28_day/haribote/jp.nas
Original file line number Diff line number Diff line change
@@ -0,0 1,107 @@
; haribote-ipl
; TAB=4

CYLS EQU 10 ; どこまで読み込むか

ORG 0x7c00 ; このプログラムがどこに読み込まれるのか

; 以下は標準的なFAT12フォーマットフロッピーディスクのための記述

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バイトあけておく

; プログラム本体

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 ; エラーがおきなければnextへ
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進める
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 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 AX,0
MOV ES,AX
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 ; 改行を2つ
DB "load error"
DB 0x0a ; 改行
DB 0

RESB 0x7dfe-$ ; 0x7dfeまでを0x00で埋める命令

DB 0x55, 0xaa

0 comments on commit fcd87ee

Please sign in to comment.