こんなもんをせっせこと作っていましたが、玄冬さんの方がすっきりしててわかりやすいですね。
(さっき投稿しましたが少しだけ改良して再投稿)
#define global boxf2(%1,%2,%3,%4) boxf %1,%2,(%1)+(%3)-1,(%2)+(%4)-1
#define global color_code(%1) color ((%1)>>16)&0xFF,((%1)>>8)&0xFF,(%1)&0xFF //色をカラーコードで指定
#const global box_x 14 //メッセージ欄のX座標
#const global box_y 300 //メッセージ欄のY座標
#const global box_xm 2 //メッセージ欄のXマージン
#const global box_ym 2 //メッセージ欄のYマージン
#const global mes_x box_x+box_xm //メッセージの起点X
#const global mes_y box_y+box_ym //メッセージの起点Y
#const global chr_w 8 //文字の横幅(半角)
#const global chr_h 18 //文字の縦幅
#define global font_name msgothic //フォント名
#const global font_size 16 //フォントサイズ
#const global chr_xnum 76 //文字の横の表示数
#const global chr_ynum 4 //文字の縦の表示数
#const global box_w chr_w*chr_xnum+box_xm*2
#const global box_h chr_h*chr_ynum+box_ym*2
#const global wait_t 200 //ウェイト時間
#const global box_color 0x000000 //メッセージ欄の背景色
#const global chr_color 0xFFFFFF //メッセージ欄の文字色
color_code box_color
boxf2 box_x,box_y,box_w,box_h
color_code chr_color
font font_name,font_size
//表示させるテキスト
text="いろはにほへと\nちりぬるをわか\nよたれそつねな\nらむうゐのおく\nやまけふこえて\nあさきゆめみし\nゑひもせす"
chr_x=0 : chr_y=0
notesel text
text0=""
sdim buf,3
repeat notemax
noteget text0,cnt
c=0 : max=strlen(text0) //cは何文字目を表示するか、maxは表示する文字の数
repeat
if c>=max : break
kanji=0
a=peek(text0,c) //表示する文字を取得
if c<=max-2 : b=peek(text0,c+1) : else : b=0 //次の文字を取得
//漢字(2バイト文字判定)
if ((a>=0x81)&(a<=0x9F)) | ((a>=0xE0)&(a<=0xEF)) {
if ((b>=0x40)&(b<=0x7E)) | ((b>=0x80)&(a<=0xFC)) {
kanji=1
if chr_x>=chr_xnum-1 : gosub *nl
}
}
chr_xpos=chr_x*chr_w+mes_x
chr_ypos=chr_y*chr_h+mes_y
pos chr_xpos,chr_ypos
if kanji {
//2バイト文字の場合
poke buf,0,a : poke buf,1,b
mes buf
chr_x+=2
c+=2
} else {
//1バイト文字の場合
poke buf,0,a : poke buf,1,0
mes buf
chr_x+=1
c+=1
}
if chr_x>=chr_xnum : gosub *nl
await wait_t
loop
gosub *nl
await wait_t
loop
stop
*nl
//改行処理
chr_x=0 : chr_y++
if chr_y>=chr_ynum-1 {
pos mes_x,mes_y
gcopy 0,mes_x,mes_y+chr_h,chr_xnum*chr_w,(chr_ynum-1)*chr_h
color_code box_color
boxf2 mes_x,mes_y+chr_h*(chr_ynum-2),chr_xnum*chr_w,chr_h*2
color_code chr_color
chr_y--
}
return