Let's use View font

1 概要

いわゆるView fontを使用するための資料です。

2 必要とする環境

サンプルプログラムを動作させるために、MSX-View付属ROM・FS-A1GT・View font内蔵FS-A1ST・似非RAM(ASCII型8KBバンク・RAM240KB以上)のいずれかと、MSX-DOS(2)が必要です。

3 使用方法

3.1 View font使用の手順

View fontを使用する手順は、大雑把に言って次のようになっています。

  1. 検索
    View fontを検索し、スロット・内容に関する情報を得ます。
  2. 初期化
    スロット・バンクレジスタを保存し、スロットをView fontに切り替えます。
  3. ポインタ計算
    JISコードからフォントへのポインタを計算し、バンク番号・バンク内アドレスに変換します。
  4. フォント獲得
    バンクを切り替え、目的のフォントを得ます。
  5. 後処理
    スロット・バンクレジスタを元に戻します。

3.2 View fontの検索

検索は、

の順序で行うのが妥当だと思われます(見つかった時点で検索終了)。
データバグの補正(後述)を行う場合は、12x12のみの使用であっても、12x8第二水準を検索する必要があります。

3.2.1 MSX-View付属ROM

MSX-View付属ROMは、ASCII型のMEGA ROM Controllerを使って8Kbytesバンクでマッピングされています。Bank=00Hの0010H〜001AHには'MSXViewKROM'という文字列が書き込まれており、これを識別子として使用します。バンクレジスタの初期値は、全てのページにおいて0なので、検索時にバンクレジスタを切り替える必要はありません。
接続されるスロットは決まっていないので、全てのスロットに関して検索を行う必要があります。

3.2.2 Extended View font

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'を検索する形になります。

3.2.3 FS-A1GT内蔵

FS-A1GTは、View fontを標準で内蔵していますが、12x12の第二水準が存在しません。FS-A1GTを他のMSXと区別するには、MAIN ROMの値を読んでFS-A1GT固有の値であるか判定します。全ての値が一致すれば、その機械はFS-A1GTであると判断できます。

判定するアドレスFS-A1GT固有の値
002DH03H
0C49H00H
1A74HDBH
1A75HE9H
1A7BHDBH
1A7CHE9H

3.2.4 FS-A1ST内蔵

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第二水準が存在)。

3.3 フォント型式

3.3.1 12x8

半角・全角とも、1文字に12bytes使って表現されています。2linesで3bytes使用されており、0〜2bytes目をそれぞれA・B・Cとすれば

+00+01+02+03+04+05+06+07+08+09+10+11
0th lineA7A6A5A4A3A2A1A0B7B6B5B4
1st lineB3B2B1B0C7C6C5C4C3C2C1C0

と表現され、これが4回(8lines/12bytes)繰り返されます。
半角の場合、+6〜+11は必ず0になります。

3.3.2 12x12

半角・全角とも、1文字に18bytes使って表現されています。12x8と同じく、2linesで3bytes使用されており、0〜2bytes目をそれぞれA・B・Cとすれば

+00+01+02+03+04+05+06+07+08+09+10+11
0th lineA7A6A5A4A3A2A1A0B7B6B5B4
1st lineB3B2B1B0C7C6C5C4C3C2C1C0

と表現され、これが6回(12lines/18bytes)繰り返されます。
半角の場合、+6〜+11は必ず0になります。

3.4 フォントへのポインタ取得

3.4.1 12x8

3.4.1.1 半角

まず、00H〜1FH(コントロールコード)・80H〜9FH・E0H〜FFH(MSX固有コード)のフォントは存在しないので別処理を行って下さい。20H〜7FH(Alphabet/記号)とA0H〜DFH(半角カナ)に関しては、対応するフォントが存在しますので、ポインタが計算できます。
ポインタの計算ですが、まずASCIIコードの最上位bitを0にして20Hを引き、これを12倍します。更に、ASCIIコードに応じたオフセットを加えると、フォントへのポインタが求まります。FS-A1GT内蔵のオフセットが二種類存在しますが、どちらを使用しても同じフォントが得られます。

オフセットの対応 (括弧内はバンク番号)
機種\ASCIIコード20H〜7FHA0H〜DFH
MSX-View付属ROM24000H(12H)26880H(13H)
Extended View font24000H(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)
3.4.1.2 全角

まず、区点コードを求めます。この時、12x8第二水準が拡張されている場合を除き、第二水準(区が48以上)の文字はView fontを使わずに処理するよう、コーディングしなければなりません。
次に区点コードから漢字コードを求めてこれを12倍し、区の値に応じて次のオフセットを加えると、フォントへのポインタを得ます。FS-A1GT内蔵のオフセットが二種類存在しますが、どちらを使用しても同じです。

オフセットの対応 (括弧内はバンク番号)
機種\区1〜4748〜84
MSX-View付属ROM24000H(12H)------
Extended View font24000H(12H)30000H(18H)
FS-A1GT内蔵1C0000H(0E0H)
240000H(120H)
------
------
FS-A1ST内蔵1A4000H(0D2H)------
FS-A1ST内蔵(Extended)1A4000H(0D2H)1B0000H(D8H)

実際のコーディングでは、適当にバンクと(バンク内)アドレスの演算を分離した方が効率が上がると思われます。

3.4.2 12x12

3.4.2.1 半角

まず、00H〜1FH(コントロールコード)・80H〜9FH・E0H〜FFH(MSX固有コード)のフォントは存在しないので別処理を行って下さい。20H〜7FH(Alphabet/記号)とA0H〜DFH(半角カナ)に関しては、対応するフォントが存在しますので、ポインタが計算できます。
ポインタの計算ですが、まずASCIIコードの最上位bitを0にして20Hを引き、これを18倍します。更に、ASCIIコードに応じたオフセットを加えると、フォントへのポインタが求まります。

オフセットの対応 (括弧内はバンク番号)
機種\ASCIIコード20H〜7FHA0H〜DFH
MSX-View付属ROM2000H(01H)5CC0H(02H)
Extended View font2000H(01H)5CC0H(02H)
FS-A1GT内蔵140000H(A0H)143CC0H(A1H)
FS-A1ST内蔵182000H(C1H)185CC0H(C2H)
FS-A1ST内蔵(Extended)182000H(C1H)185CC0H(C2H)
3.4.2.2 全角

まず、区点コードを求めます。この時、FS-A1GT内蔵では、第二水準(区が48以上)の文字はView fontを使わずに処理するよう、コーディングしなければなりません。
次に区点コードから漢字コードを求めてこれを18倍し、区の値に応じて次のオフセットを加えると、フォントへのポインタを得ます。

オフセットの対応 (括弧内はバンク番号)
機種\区1〜4748〜84
MSX-View付属ROM2000H(01H)14000H(0AH)
Extended View font2000H(01H)14000H(0AH)
FS-A1GT内蔵140000H(A0H)------
FS-A1ST内蔵182000H(C1H)194000H(CAH)
FS-A1ST内蔵(Extended)182000H(C1H)194000H(CAH)

実際のコーディングでは、適当にバンクと(バンク内)アドレスの演算を分離した方が効率が上がると思われます。

3.5 フォントの取得

まず、スロットを切り替えてView fontを表に出します。
次に、ポインタのbit21〜bit13をView fontの出ているページに応じたバンクレジスタに書き込んで、バンクを切り替えます。バンクレジスタは、次のアドレスに配置されています。

3.5.1 MSX-View付属ROM・Extended View font

切り替わるアドレスバンクレジスタのアドレス(bit7〜bit0)
4000H〜5FFFH6000H〜67FFH
6000H〜7FFFH6800H〜6FFFH
8000H〜9FFFH7000H〜77FFH
A000H〜BFFFH7800H〜7FFFH

3.5.2 FS-A1GT内蔵・FS-A1ST内蔵

切り替わるアドレスバンクレジスタのアドレス(bit7〜bit0)アクセス属性
0000H〜1FFFH6000H〜63FFHwrite only
2000H〜3FFFH6400H〜67FFH
4000H〜5FFFH6800H〜6BFFH
6000H〜7FFFH6C00H〜6FFFH
8000H〜9FFFH7000H〜73FFH
A000H〜BFFFH7800H〜7BFFH
C000H〜DFFFH7400H〜77FFH
E000H〜FFFFH7C00H〜7FEFH
切り替わるアドレスバンクレジスタのアドレス(bit8)アクセス属性
0000H〜1FFFH7FF8Hbit0read/write
2000H〜3FFFHbit1
4000H〜5FFFHbit2
6000H〜7FFFHbit3
8000H〜9FFFHbit4
A000H〜BFFFHbit5
C000H〜DFFFHbit6
E000H〜FFFFHbit7

また7FF9Hにて各種の設定を行えます。

7FF9Hbit21;7FF0H〜7FF7Hからバンクレジスタの値を読み込める
bit31;7FF9Hの値を読み込める
bit41;7FF8Hの値を操作出来る

更にbit12〜bit0にView fontが出ているページの先頭アドレスを足すと、フォントの先頭アドレスが出ます。このアドレス以降の12bytesもしくは18bytesが求めるフォントです。フォントがバンク境界に掛かる事もありますが、ページの前半と後半を連続する二つのバンクに切り替える様にすると、問題無くコーディング出来ます。
フォントの型式はフォント型式を参照して下さい。

なおFS-A1ST/GTの場合、切り替えたバンクは必ず元に戻して下さい。戻さないと、ほぼ確実に暴走します。元に戻すバンクレジスタの値を得るには、7FF9H/bit2・bit4を1にした状態で以下のアドレスを読み出します。

7FF0H0000H〜1FFFHのバンクレジスタ(bit7〜bit0)Read only
7FF1H2000H〜3FFFHのバンクレジスタ(bit7〜bit0)Read only
7FF2H4000H〜5FFFHのバンクレジスタ(bit7〜bit0)Read only
7FF3H6000H〜7FFFHのバンクレジスタ(bit7〜bit0)Read only
7FF4H8000H〜9FFFHのバンクレジスタ(bit7〜bit0)Read only
7FF5HA000H〜BFFFHのバンクレジスタ(bit7〜bit0)Read only
7FF6HC000H〜DFFFHのバンクレジスタ(bit7〜bit0)Read only
7FF7HE000H〜FFFFHのバンクレジスタ(bit7〜bit0)Read only
7FF8H各バンクレジスタのbit8read/write

またMSX-View付属ROM・Extended View fontについても、後のプログラムがView fontを使用出来るように、終了時にはバンクレジスタを0に戻して下さい。

3.6 View fontのバグ

オリジナルの(拡張されていない)View fontの12x12フォントには、いくつかのデータバグが存在しています。バグが存在するのは、12x12第二水準があって、かつ12x8第二水準が拡張されていない機種です。

機種バグの有無備考
MSX-View付属ROM有り
Extended View font無し12x8第二水準が拡張されている
FS-A1GT内蔵無し12x12第二水準が存在しない
FS-A1ST内蔵有り
FS-A1ST内蔵(Extended)無し12x8第二水準が拡張されている

3.6.1 12x12の半角7EH

本来、'‾'のフォントが存在するはずですが、MSX-View付属ROMとFS-A1ST内蔵では空白になっています。対処方法としては、12x8の半角7EHやMain ROMの7EHで代用する、12x12の半角7EHに限り自前のフォントを用意するといった方法が考えられます。
なおこのバグは、FS-A1GT内蔵・Extnded View font・FS-A1ST内蔵(Extended)では修正されています。

3.6.2 12x12の第二水準

本来とは異なる位置に文字が配置されている部分があり、12x12第二水準を使用するソフトは、これを補正すべきだと思われます。バグが存在するのは、半角7EHと同じくMSX-View付属ROM・FS-A1ST内蔵で、Extnded View font・FS-A1ST内蔵(Extended)では修正されています。また、FS-A1GT内蔵には12x12第二水準が存在しません。

3.6.2.1 64区

64区1〜6点に配置されるべきデータが63区95点・64区0〜4点にずれている。
64区5〜6点はゴミで、64区7点から正常化。

3.6.2.2 66区

66区1点に配置されるべきデータが65区95点にずれている。
66区0〜1点はゴミで、66区2点から正常化。

3.6.2.3 84区

84区1〜4点に配置されるべきデータが83区95点・84区0〜2点にずれている。
84区3〜4点は空白。

3.7 View fontの構成

View fontの構成を示します。

3.7.1 MSX-View付属ROM

接続されるスロットは不定です。
MEGA ROM Controller(ASCII型・8KBバンク)により次の様にマッピングされています。
12x12第二水準にデータバグが存在します。

0000H〜 1FFFH0000H〜0001Hに'AB'・0010H〜001AHに'MSXViewKROM'
2000H〜 26BFH12x12半角の20H〜7FH
26C0H〜 5CBFH12x12全角の1〜8区
5CC0H〜 613FH12x12半角のA0H〜DFH
6140H〜 67FFH空白(Zero Fillされている)
6800H〜13FFFH12x12全角の16〜47区
14000H〜239BFH12x12全角の48〜84区
239C0H〜23FFFH空白(Zero Fillされている)
24000H〜2447FH12x8半角の20H〜7FH
24480H〜2687FH12x8全角の1〜8区
26880H〜26B7FH12x8半角のA0H〜DFH
26B80H〜26FFFH空白(Zero Fillされている)
27000H〜2FFFFH12x8全角の16〜47区

3.7.2 Extended View font(拡張されたView font)

接続されるスロットは不定です。
MEGA ROM Controller(ASCII型・8KBバンク)により次の様にマッピングされています。
12x12第二水準のデータバグは修正されています。

0000H〜 1FFFH0000H〜0001Hに'AB'・0010H〜001EHに'MSXViewKROM&2nd'
2000H〜 26BFH12x12半角の20H〜7FH
26C0H〜 5CBFH12x12全角の1〜8区
5CC0H〜 613FH12x12半角のA0H〜DFH
6140H〜 67FFH空白(Zero Fillされている)
6800H〜13FFFH12x12全角の16〜47区
14000H〜239BFH12x12全角の48〜84区
239C0H〜23FFFH空白(Zero Fillされている)
24000H〜2447FH12x8半角の20H〜7FH
24480H〜2687FH12x8全角の1〜8区
26880H〜26B7FH12x8半角のA0H〜DFH
26B80H〜26FFFH空白(Zero Fillされている)
27000H〜2FFFFH12x8全角の16〜47区
30000H〜3A67FH12x8全角の48〜84区
3A680H〜3BFFFH空白(Zero Fillされている)

3.7.3 FS-A1GT内蔵

必ずSlot#3-3に接続されます。
MEGA ROM Controller(Panasonic型)により次の様にマッピングされています。
12x12第二水準が存在しません。

140000H〜1406BFH12x12半角の20H〜7FH
1406C0H〜143CBFH12x12全角の1〜8区
143CC0H〜14413FH12x12半角のA0H〜DFH
144140H〜1447FFH空白(Zero Fillされている)
144800H〜151FFFH12x12全角の16〜47区
152000H〜1BFFFFH不明
1C0000H〜1C047FH12x8半角の20H〜7FH
1C0480H〜1C287FH12x8全角の1〜8区
1C2880H〜1C2B7FH12x8半角のA0H〜DFH
1C2B80H〜1C2FFFH空白(Zero Fillされている)
1C3000H〜1CBFFFH12x8全角の16〜47区
----------[以下は1C0000H〜1CBFFFHと同内容]----------
240000H〜24047FH12x8半角の20H〜7FH
240480H〜24287FH12x8全角の1〜8区
242880H〜242B7FH12x8半角のA0H〜DFH
242B80H〜242FFFH空白(Zero Fillされている)
243000H〜24BFFFH12x8全角の16〜47区

3.7.4 FS-A1ST内蔵

必ずSlot#3-3に接続されます。
MEGA ROM Controller(Panasonic型)により次の様にマッピングされています。
12x8第二水準が拡張されている場合を除き、12x12第二水準にデータバグが存在します。

180000H〜181FFFH0000H〜0001Hに'AB'・0010H〜001AHに'MSXViewKROM'
12x8第二水準が拡張されている場合は001BH〜001EHに'&2nd'
182000H〜1826BFH12x12半角の20H〜7FH
1826C0H〜185CBFH12x12全角の1〜8区
185CC0H〜18613FH12x12半角のA0H〜DFH
186140H〜1867FFH空白(Zero Fillされている)
186800H〜193FFFH12x12全角の16〜47区
194000H〜1A39BFH12x12全角の48〜84区
1A39C0H〜1A3FFFH空白(Zero Fillされている)
1A4000H〜1A447FH12x8半角の20H〜7FH
1A4480H〜1A687FH12x8全角の1〜8区
1A6880H〜1A6B7FH12x8半角のA0H〜DFH
1A6B80H〜1A6FFFH空白(Zero Fillされている)
1A7000H〜1AFFFFH12x8全角の16〜47区
----------[以下は12x8第二水準が拡張されている場合]----------
1B0000H〜1BA67FH12x8全角の48〜84区
1BA680H〜1BBFFFH空白(Zero Fillされている)

4 余談

第二水準の漢字コードを求めるとき、(区-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)

Web master: Nakayama Atsushi
E-mail: anaka@yo.rim.or.jp