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固有の値
        002DH                   03H
        0C49H                   00H
        1A74H                   DBH
        1A75H                   E9H
        1A7BH                   DBH
        1A7CH                   E9H

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 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になります。

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 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になります。

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〜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)
                                        *括弧内はバンク番号
3.4.1.2 全角

まず、区点コードを求めます。この時、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)
                                        *括弧内はバンク番号

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

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〜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)
                                        *括弧内はバンク番号
3.4.2.2 全角

まず、区点コードを求めます。この時、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)
                                        *括弧内はバンク番号

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

3.4.3 フォントの取得

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

3.4.3.1 MSX-View付属ROM・Extended View font

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

3.4.3.2 FS-A1GT内蔵・FS-A1ST内蔵

        切り替わるアドレス      バンクレジスタのアドレス(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に戻して下さい。

3.5 View fontのバグ

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

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

3.5.1 12x12の半角7EH

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

3.5.2 12x12の第二水準

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

3.5.2.1 64区

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

3.5.2.2 66区

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

3.5.2.3 84区

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

3.6 View fontの構成

View fontの構成を示します。

3.6.1 MSX-View付属ROM

接続されるスロットは不定です。
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区

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

接続されるスロットは不定です。
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されている)

3.6.3 FS-A1GT内蔵

必ず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区

3.6.4 FS-A1ST内蔵

必ず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されている)

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