かんたん手帳リフィルくん
かんたん手帳リフィルくん
に付属しているROMの漢字フォントを使用するための資料です。
MSX2/2+/turboR及びかんたん手帳リフィルくん
の付属ROMが必要です。
リフィルくんの検索
リフィルくん
のROMは、ASCII型のメガROMコントローラを使って16kbytesバンクでマッピングされています。
切り替わるアドレス | バンクレジスタのアドレス |
---|---|
4000H〜7FFFH | 6000H〜67FFH |
8000H〜BFFFH | 7000H〜77FFH |
Bank0の先頭16bytesには 'SHARSHAR!! 'という文字列('SHARSHAR!!'の後に20Hが6個)が書き込まれており、これを識別子として使用します。バンクレジスタの初期値は、全てのページにおいて0なので、検索時にバンクレジスタを切り替える必要はありません。
1文字に、12bytes使って表現されています。1Lineに1byteですが、bit7〜bit0の内、bit6〜bit1のみがフォントとして扱われ、bit7とbit0は常に0です。
b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | ||
---|---|---|---|---|---|---|---|---|---|
0 line | 0 | u | u | u | u | u | u | 0 | 0byte目 |
1 line | 0 | u | u | u | u | u | u | 0 | 1byte目 |
: | : | ||||||||
11 line | 0 | u | u | u | u | u | u | 0 | 11bytes目 |
uの部分がフォントとして使用されている |
フォントは、20H〜7FH・A0H〜DFHのみが連続して搭載されており、00H〜1FH・80H〜9FH・E0H〜FFHのフォントは存在しません。
1文字に、24bytes使って表現されています。1Lineに2bytes使用されており、各ラインの+0byte目がフォントの左8dotを、+1byte目の上位4bitが右4dotを表しています。
+0byte | +1byte | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | ||
0 line | u | u | u | u | u | u | u | u | u | u | u | u | 0 | 0 | 0 | 0 | 0〜1byte目 |
1 line | u | u | u | u | u | u | u | u | u | u | u | u | 0 | 0 | 0 | 0 | 2〜3byte目 |
: | : | : | |||||||||||||||
11 line | u | u | u | u | u | u | u | u | u | u | u | u | 0 | 0 | 0 | 0 | 22〜23byte目 |
uの部分がフォントとして使用されている |
フォントは、第一水準のみが搭載されており、第二水準のフォントは存在しません。
また記号の一部が、MSXの標準漢字ROMと異なるようです。
まず、ASCIIコードから20Hを引きます。このとき、繰り下がりが起こるようならば、それはコントロールコードなので、別処理を行います。
次に60H(=80H-20H)と比較し、これより小さければ処理Aに飛びます。
60H以上だった場合、20Hを引いた後に60H(=A0H-40H)と比較し、これより小さければ、リフィルくん
には相当するフォントが存在しないので別処理を行います(半角かな)。
60H以上であれば更にA0H(=E0H-40H)と比較し、これより小さければ処理Aに飛びます。
A0H以上であれば、リフィルくん
には相当するフォントが存在しないので別処理を行います(半角かな)。
処理Aでは、ここまでに求めたコードを12倍し、更にオフセットとして16を加えるとフォントへのポインタを得ます。
まず、区点コードを求めます。この時、第二水準(区が48以上)の文字はリフィルくん
を使わずに処理するよう、コーディングしなければなりません。
区点コードを求めたら、区の値からフォントを得る為のオフセットを求めます。オフセットは次の様になっています。
区 | オフセット | |
---|---|---|
1〜7 | 14080 | =4000H-[(21H-20H)*96*24] |
16〜22 | 8192 | =4000H*2-[{(30H-20H)*96-512}*24] |
23〜29 | 8192+256 | =4000H*3-[{(37H-20H)*96-512}*24] |
30〜36 | 8192+256*2 | =4000H*4-[{(3EH-20H)*96-512}*24] |
37〜43 | 8192+256*3 | =4000H*5-[{(45H-20H)*96-512}*24] |
44〜47 | 8192+256*4 | =4000H*6-[{(4CH-20H)*96-512}*24] |
次に区点コードから漢字コードを求めて、これを24倍し、更に先程のオフセットを加えると、フォントへのポインタを得ます。このとき、ポインタが17bitで表現される事に注意して下さい。
まず、スロットを切り替えてリフィルくん
を表に出し、リフィルくん
の出ているページに応じたバンクレジスタ(6000Hか7000H)に0を書き込みます。
次に、リフィルくん
が出ているページの先頭アドレス(4000Hか8000H)にフォントへのポインタを足すと、フォントの先頭アドレスが出ます。このアドレス以降の12bytesが求めるフォントです。
フォントの型式はフォントの種類
を参照して下さい。
まず、スロットを切り替えてリフィルくん
を表に出します。
次に、ポインタ(17bit)の上位3bitをリフィルくん
の出ているページに応じたバンクレジスタ(6000Hか7000H)に書き込んで、バンクを切り替えます。
更に下位14bitにリフィルくん
が出ているページの先頭アドレス(4000Hか8000H)を足すと、フォントの先頭アドレスが出ます。このアドレス以降の24bytesが求めるフォントです。フォントがバンク境界に掛かることはありません。
フォントの型式はフォントの種類
を参照して下さい。
プログラム終了時には、必ずバンクレジスタに0を書き込んで下さい。これは、他のプログラムがリフィルくん
を発見出来るようにするための処置です。