いわゆる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) 1C2880H(0E1H) 240000H(120H) 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 〃 7FF2H 4000H〜5FFFH 〃 7FF3H 6000H〜7FFFH 〃 7FF4H 8000H〜9FFFH 〃 7FF5H A000H〜BFFFH 〃 7FF6H C000H〜DFFFH 〃 7FF7H E000H〜FFFFH 〃 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)