いわゆるView fontを使用するための資料です。
サンプルプログラムを動作させるために、MSX-View付属ROM・FS-A1GT・View font内蔵FS-A1ST・似非RAM(ASCII型8KBバンク・RAM240KB以上)のいずれかと、MSX-DOS(2)が必要です。
View fontを使用する手順は、大雑把に言って次のようになっています。
検索は、
の順序で行うのが妥当だと思われます(見つかった時点で検索終了)。
データバグの補正(後述)を行う場合は、12x12のみの使用であっても、12x8第二水準を検索する必要があります。
MSX-View付属ROMは、ASCII型のMEGA ROM Controllerを使って8Kbytesバンクでマッピングされています。Bank=00Hの0010H〜001AHには'MSXViewKROM'という文字列が書き込まれており、これを識別子として使用します。バンクレジスタの初期値は、全てのページにおいて0なので、検索時にバンクレジスタを切り替える必要はありません。
接続されるスロットは決まっていないので、全てのスロットに関して検索を行う必要があります。
Extended View fontは、MSX-View付属ROM互換型式のフォントデータを似非RAM(ASCII型・8KBバンク)にインストールしたものです。MSX-View付属ROMとして使える他、12x8の第二水準漢字が拡張されており、識別子も'MSXViewKROM'(Bank=00H/0010H〜001AH)に加えて、'&2nd'(Bank=00H/001BH〜001EH)が存在します。バンクレジスタの初期値は、全てのページにおいて0なので、検索時にバンクレジスタを切り替える必要はありません。
接続されるスロットは決まっていないので、全てのスロットに関して検索を行う必要があります。通常は、MSX-View付属ROMが見つかった場合に、重ねて'&2nd'を検索する形になります。
FS-A1GTは、View fontを標準で内蔵していますが、12x12の第二水準が存在しません。FS-A1GTを他のMSXと区別するには、MAIN ROMの値を読んでFS-A1GT固有の値であるか判定します。全ての値が一致すれば、その機械はFS-A1GTであると判断できます。
判定するアドレス | FS-A1GT固有の値 |
---|---|
002DH | 03H |
0C49H | 00H |
1A74H | DBH |
1A75H | E9H |
1A7BH | DBH |
1A7CH | E9H |
FS-A1STには、本来View fontは内蔵されていません。しかし、MSX-View付属ROM互換型式のEPROMを、Slot#3-3に乗せる事により独自拡張出来ます。当然View fontを持たない機械もあるので、内蔵しているかどうか判定する必要があります。
判定は、ROMID(002DH,1/MAIN)が3である(即ちMSXturboRである)事、およびSlot#3-3のBank=C0H/0010H〜001AHが'MSXViewKROM'である事をチェックします。両方とも一致すれば、その機械はView font内蔵FS-A1STです。
また、12x8第二水準が拡張されている可能性もあるので、Bank=C0Hの001BH〜001EHが'&2nd'になっているかどうかもチェックすべきだと思われます('&2nd'があれば、12x8第二水準が存在)。
半角・全角とも、1文字に12bytes使って表現されています。2linesで3bytes使用されており、0〜2bytes目をそれぞれA・B・Cとすれば
+00 | +01 | +02 | +03 | +04 | +05 | +06 | +07 | +08 | +09 | +10 | +11 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0th line | A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 | B7 | B6 | B5 | B4 |
1st line | B3 | B2 | B1 | B0 | C7 | C6 | C5 | C4 | C3 | C2 | C1 | C0 |
と表現され、これが4回(8lines/12bytes)繰り返されます。
半角の場合、+6〜+11は必ず0になります。
半角・全角とも、1文字に18bytes使って表現されています。12x8と同じく、2linesで3bytes使用されており、0〜2bytes目をそれぞれA・B・Cとすれば
+00 | +01 | +02 | +03 | +04 | +05 | +06 | +07 | +08 | +09 | +10 | +11 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0th line | A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 | B7 | B6 | B5 | B4 |
1st line | B3 | B2 | B1 | B0 | C7 | C6 | C5 | C4 | C3 | C2 | C1 | C0 |
と表現され、これが6回(12lines/18bytes)繰り返されます。
半角の場合、+6〜+11は必ず0になります。
まず、00H〜1FH(コントロールコード)・80H〜9FH・E0H〜FFH(MSX固有コード)のフォントは存在しないので別処理を行って下さい。20H〜7FH(Alphabet/記号)とA0H〜DFH(半角カナ)に関しては、対応するフォントが存在しますので、ポインタが計算できます。
ポインタの計算ですが、まずASCIIコードの最上位bitを0にして20Hを引き、これを12倍します。更に、ASCIIコードに応じたオフセットを加えると、フォントへのポインタが求まります。FS-A1GT内蔵のオフセットが二種類存在しますが、どちらを使用しても同じフォントが得られます。
機種\ASCIIコード | 20H〜7FH | A0H〜DFH |
---|---|---|
MSX-View付属ROM | 24000H(12H) | 26880H(13H) |
Extended View font | 24000H(12H) | 26880H(13H) |
FS-A1GT内蔵 | 1C0000H(0E0H) 240000H(120H) | 1C2880H(0E1H) 242880H(121H) |
FS-A1ST内蔵 | 1A4000H(0D2H) | 1A6880H(0D3H) |
FS-A1ST内蔵(Extended) | 1A4000H(0D2H) | 1A6880H(0D3H) |
まず、区点コードを求めます。この時、12x8第二水準が拡張されている場合を除き、第二水準(区が48以上)の文字はView fontを使わずに処理するよう、コーディングしなければなりません。
次に区点コードから漢字コードを求めてこれを12倍し、区の値に応じて次のオフセットを加えると、フォントへのポインタを得ます。FS-A1GT内蔵のオフセットが二種類存在しますが、どちらを使用しても同じです。
機種\区 | 1〜47 | 48〜84 |
---|---|---|
MSX-View付属ROM | 24000H(12H) | ------ |
Extended View font | 24000H(12H) | 30000H(18H) |
FS-A1GT内蔵 | 1C0000H(0E0H) 240000H(120H) | ------ ------ |
FS-A1ST内蔵 | 1A4000H(0D2H) | ------ |
FS-A1ST内蔵(Extended) | 1A4000H(0D2H) | 1B0000H(D8H) |
実際のコーディングでは、適当にバンクと(バンク内)アドレスの演算を分離した方が効率が上がると思われます。
まず、00H〜1FH(コントロールコード)・80H〜9FH・E0H〜FFH(MSX固有コード)のフォントは存在しないので別処理を行って下さい。20H〜7FH(Alphabet/記号)とA0H〜DFH(半角カナ)に関しては、対応するフォントが存在しますので、ポインタが計算できます。
ポインタの計算ですが、まずASCIIコードの最上位bitを0にして20Hを引き、これを18倍します。更に、ASCIIコードに応じたオフセットを加えると、フォントへのポインタが求まります。
機種\ASCIIコード | 20H〜7FH | A0H〜DFH |
---|---|---|
MSX-View付属ROM | 2000H(01H) | 5CC0H(02H) |
Extended View font | 2000H(01H) | 5CC0H(02H) |
FS-A1GT内蔵 | 140000H(A0H) | 143CC0H(A1H) |
FS-A1ST内蔵 | 182000H(C1H) | 185CC0H(C2H) |
FS-A1ST内蔵(Extended) | 182000H(C1H) | 185CC0H(C2H) |
まず、区点コードを求めます。この時、FS-A1GT内蔵では、第二水準(区が48以上)の文字はView fontを使わずに処理するよう、コーディングしなければなりません。
次に区点コードから漢字コードを求めてこれを18倍し、区の値に応じて次のオフセットを加えると、フォントへのポインタを得ます。
機種\区 | 1〜47 | 48〜84 |
---|---|---|
MSX-View付属ROM | 2000H(01H) | 14000H(0AH) |
Extended View font | 2000H(01H) | 14000H(0AH) |
FS-A1GT内蔵 | 140000H(A0H) | ------ |
FS-A1ST内蔵 | 182000H(C1H) | 194000H(CAH) |
FS-A1ST内蔵(Extended) | 182000H(C1H) | 194000H(CAH) |
実際のコーディングでは、適当にバンクと(バンク内)アドレスの演算を分離した方が効率が上がると思われます。
まず、スロットを切り替えてView fontを表に出します。
次に、ポインタのbit21〜bit13をView fontの出ているページに応じたバンクレジスタに書き込んで、バンクを切り替えます。バンクレジスタは、次のアドレスに配置されています。
切り替わるアドレス | バンクレジスタのアドレス(bit7〜bit0) |
---|---|
4000H〜5FFFH | 6000H〜67FFH |
6000H〜7FFFH | 6800H〜6FFFH |
8000H〜9FFFH | 7000H〜77FFH |
A000H〜BFFFH | 7800H〜7FFFH |
切り替わるアドレス | バンクレジスタのアドレス(bit7〜bit0) | アクセス属性 |
---|---|---|
0000H〜1FFFH | 6000H〜63FFH | write only |
2000H〜3FFFH | 6400H〜67FFH | 〃 |
4000H〜5FFFH | 6800H〜6BFFH | 〃 |
6000H〜7FFFH | 6C00H〜6FFFH | 〃 |
8000H〜9FFFH | 7000H〜73FFH | 〃 |
A000H〜BFFFH | 7800H〜7BFFH | 〃 |
C000H〜DFFFH | 7400H〜77FFH | 〃 |
E000H〜FFFFH | 7C00H〜7FEFH | 〃 |
切り替わるアドレス | バンクレジスタのアドレス(bit8) | アクセス属性 | |
---|---|---|---|
0000H〜1FFFH | 7FF8H | bit0 | read/write |
2000H〜3FFFH | 〃 | bit1 | 〃 |
4000H〜5FFFH | 〃 | bit2 | 〃 |
6000H〜7FFFH | 〃 | bit3 | 〃 |
8000H〜9FFFH | 〃 | bit4 | 〃 |
A000H〜BFFFH | 〃 | bit5 | 〃 |
C000H〜DFFFH | 〃 | bit6 | 〃 |
E000H〜FFFFH | 〃 | bit7 | 〃 |
また7FF9Hにて各種の設定を行えます。
7FF9H | bit2 | 1;7FF0H〜7FF7Hからバンクレジスタの値を読み込める |
bit3 | 1;7FF9Hの値を読み込める | |
bit4 | 1;7FF8Hの値を操作出来る |
更にbit12〜bit0にView fontが出ているページの先頭アドレスを足すと、フォントの先頭アドレスが出ます。このアドレス以降の12bytesもしくは18bytesが求めるフォントです。フォントがバンク境界に掛かる事もありますが、ページの前半と後半を連続する二つのバンクに切り替える様にすると、問題無くコーディング出来ます。
フォントの型式はフォント型式
を参照して下さい。
なおFS-A1ST/GTの場合、切り替えたバンクは必ず元に戻して下さい。戻さないと、ほぼ確実に暴走します。元に戻すバンクレジスタの値を得るには、7FF9H/bit2・bit4を1にした状態で以下のアドレスを読み出します。
7FF0H | 0000H〜1FFFHのバンクレジスタ(bit7〜bit0) | Read only |
7FF1H | 2000H〜3FFFHのバンクレジスタ(bit7〜bit0) | Read only |
7FF2H | 4000H〜5FFFHのバンクレジスタ(bit7〜bit0) | Read only |
7FF3H | 6000H〜7FFFHのバンクレジスタ(bit7〜bit0) | Read only |
7FF4H | 8000H〜9FFFHのバンクレジスタ(bit7〜bit0) | Read only |
7FF5H | A000H〜BFFFHのバンクレジスタ(bit7〜bit0) | Read only |
7FF6H | C000H〜DFFFHのバンクレジスタ(bit7〜bit0) | Read only |
7FF7H | E000H〜FFFFHのバンクレジスタ(bit7〜bit0) | Read only |
7FF8H | 各バンクレジスタのbit8 | read/write |
またMSX-View付属ROM・Extended View fontについても、後のプログラムがView fontを使用出来るように、終了時にはバンクレジスタを0に戻して下さい。
オリジナルの(拡張されていない)View fontの12x12フォントには、いくつかのデータバグが存在しています。バグが存在するのは、12x12第二水準があって、かつ12x8第二水準が拡張されていない機種です。
機種 | バグの有無 | 備考 |
---|---|---|
MSX-View付属ROM | 有り | |
Extended View font | 無し | 12x8第二水準が拡張されている |
FS-A1GT内蔵 | 無し | 12x12第二水準が存在しない |
FS-A1ST内蔵 | 有り | |
FS-A1ST内蔵(Extended) | 無し | 12x8第二水準が拡張されている |
本来、'‾'のフォントが存在するはずですが、MSX-View付属ROMとFS-A1ST内蔵では空白になっています。対処方法としては、12x8の半角7EHやMain ROMの7EHで代用する、12x12の半角7EHに限り自前のフォントを用意するといった方法が考えられます。
なおこのバグは、FS-A1GT内蔵・Extnded View font・FS-A1ST内蔵(Extended)では修正されています。
本来とは異なる位置に文字が配置されている部分があり、12x12第二水準を使用するソフトは、これを補正すべきだと思われます。バグが存在するのは、半角7EHと同じくMSX-View付属ROM・FS-A1ST内蔵で、Extnded View font・FS-A1ST内蔵(Extended)では修正されています。また、FS-A1GT内蔵には12x12第二水準が存在しません。
64区1〜6点に配置されるべきデータが63区95点・64区0〜4点にずれている。
64区5〜6点はゴミで、64区7点から正常化。
66区1点に配置されるべきデータが65区95点にずれている。
66区0〜1点はゴミで、66区2点から正常化。
84区1〜4点に配置されるべきデータが83区95点・84区0〜2点にずれている。
84区3〜4点は空白。
View fontの構成を示します。
接続されるスロットは不定です。
MEGA ROM Controller(ASCII型・8KBバンク)により次の様にマッピングされています。
12x12第二水準にデータバグが存在します。
0000H〜 1FFFH | 0000H〜0001Hに'AB'・0010H〜001AHに'MSXViewKROM' |
2000H〜 26BFH | 12x12半角の20H〜7FH |
26C0H〜 5CBFH | 12x12全角の1〜8区 |
5CC0H〜 613FH | 12x12半角のA0H〜DFH |
6140H〜 67FFH | 空白(Zero Fillされている) |
6800H〜13FFFH | 12x12全角の16〜47区 |
14000H〜239BFH | 12x12全角の48〜84区 |
239C0H〜23FFFH | 空白(Zero Fillされている) |
24000H〜2447FH | 12x8半角の20H〜7FH |
24480H〜2687FH | 12x8全角の1〜8区 |
26880H〜26B7FH | 12x8半角のA0H〜DFH |
26B80H〜26FFFH | 空白(Zero Fillされている) |
27000H〜2FFFFH | 12x8全角の16〜47区 |
接続されるスロットは不定です。
MEGA ROM Controller(ASCII型・8KBバンク)により次の様にマッピングされています。
12x12第二水準のデータバグは修正されています。
0000H〜 1FFFH | 0000H〜0001Hに'AB'・0010H〜001EHに'MSXViewKROM&2nd' |
2000H〜 26BFH | 12x12半角の20H〜7FH |
26C0H〜 5CBFH | 12x12全角の1〜8区 |
5CC0H〜 613FH | 12x12半角のA0H〜DFH |
6140H〜 67FFH | 空白(Zero Fillされている) |
6800H〜13FFFH | 12x12全角の16〜47区 |
14000H〜239BFH | 12x12全角の48〜84区 |
239C0H〜23FFFH | 空白(Zero Fillされている) |
24000H〜2447FH | 12x8半角の20H〜7FH |
24480H〜2687FH | 12x8全角の1〜8区 |
26880H〜26B7FH | 12x8半角のA0H〜DFH |
26B80H〜26FFFH | 空白(Zero Fillされている) |
27000H〜2FFFFH | 12x8全角の16〜47区 |
30000H〜3A67FH | 12x8全角の48〜84区 |
3A680H〜3BFFFH | 空白(Zero Fillされている) |
必ずSlot#3-3に接続されます。
MEGA ROM Controller(Panasonic型)により次の様にマッピングされています。
12x12第二水準が存在しません。
140000H〜1406BFH | 12x12半角の20H〜7FH |
1406C0H〜143CBFH | 12x12全角の1〜8区 |
143CC0H〜14413FH | 12x12半角のA0H〜DFH |
144140H〜1447FFH | 空白(Zero Fillされている) |
144800H〜151FFFH | 12x12全角の16〜47区 |
152000H〜1BFFFFH | 不明 |
1C0000H〜1C047FH | 12x8半角の20H〜7FH |
1C0480H〜1C287FH | 12x8全角の1〜8区 |
1C2880H〜1C2B7FH | 12x8半角のA0H〜DFH |
1C2B80H〜1C2FFFH | 空白(Zero Fillされている) |
1C3000H〜1CBFFFH | 12x8全角の16〜47区 |
----------[以下は1C0000H〜1CBFFFHと同内容]---------- | |
240000H〜24047FH | 12x8半角の20H〜7FH |
240480H〜24287FH | 12x8全角の1〜8区 |
242880H〜242B7FH | 12x8半角のA0H〜DFH |
242B80H〜242FFFH | 空白(Zero Fillされている) |
243000H〜24BFFFH | 12x8全角の16〜47区 |
必ずSlot#3-3に接続されます。
MEGA ROM Controller(Panasonic型)により次の様にマッピングされています。
12x8第二水準が拡張されている場合を除き、12x12第二水準にデータバグが存在します。
180000H〜181FFFH | 0000H〜0001Hに'AB'・0010H〜001AHに'MSXViewKROM' 12x8第二水準が拡張されている場合は001BH〜001EHに'&2nd' |
182000H〜1826BFH | 12x12半角の20H〜7FH |
1826C0H〜185CBFH | 12x12全角の1〜8区 |
185CC0H〜18613FH | 12x12半角のA0H〜DFH |
186140H〜1867FFH | 空白(Zero Fillされている) |
186800H〜193FFFH | 12x12全角の16〜47区 |
194000H〜1A39BFH | 12x12全角の48〜84区 |
1A39C0H〜1A3FFFH | 空白(Zero Fillされている) |
1A4000H〜1A447FH | 12x8半角の20H〜7FH |
1A4480H〜1A687FH | 12x8全角の1〜8区 |
1A6880H〜1A6B7FH | 12x8半角のA0H〜DFH |
1A6B80H〜1A6FFFH | 空白(Zero Fillされている) |
1A7000H〜1AFFFFH | 12x8全角の16〜47区 |
----------[以下は12x8第二水準が拡張されている場合]---------- | |
1B0000H〜1BA67FH | 12x8全角の48〜84区 |
1BA680H〜1BBFFFH | 空白(Zero Fillされている) |
第二水準の漢字コードを求めるとき、(区-48)*96+点 を (区*96-512)+点 にすればオフセットの場合分けは必要無くなるのですが、まぁ従来の手法との互換性って事で許して下さい。[SJIS -> 漢字コード]ルーチンの流用を考えての事ですんで。
半角のポインタを求めるとき、半角文字(20H〜7FH・A0H〜DFH)を2020H〜207FH・2920H〜295FH(JIS code)に置き換えて計算すれば、全角との場合分けは要らない様です。要するに標準漢字ROM内の半角フォントを使うときの手がそのまま通用するわけです。
もちろんフォントの表示等では場合分けが必要になるので、あまり意味の無い情報ですが、より統一的な理解が出来るとゆ〜事で。
とか言って、サンプルプログラムでは、第二水準ネタも半角ネタもきっちり利用してたりします。
更にど〜でもいい話として、View fontは搭載フォントの種類で3つ、アクセス方法で2つに分類出来るとゆ〜のがあります。これまた、サンプルで利用してたり。
フォント種 | 機種 |
---|---|
第一水準(12x8/12x12) | FS-A1GT内蔵 |
第一水準(12x8/12x12)・第二水準(12x12) | MSX-View付属ROM・FS-A1ST内蔵 |
第一水準(12x8/12x12)・第二水準(12x12/12x8) | Extended View font FS-A1ST内蔵(Extended) |
アクセス方法 | 機種 |
---|---|
ASCII型8KBバンク | MSX-View付属ROM Extended View font |
Panasonic型 | FS-A1GT内蔵・FS-A1ST内蔵 FS-A1ST内蔵(Extended) |