Gigamix Online

懐かしの8bitおもちゃPC「MSX」を骨までしゃぶり尽くそう。MSXの最新ニュース、ブログ、自作ソフトの配布など。

松下仕様12ドット漢字ROM 解析資料 by ごりぽん+α

 「松下仕様の12ドット漢字ROM」という、MSX標準の漢字ROMではないパナソニック独自の12pxスモールフォントというものがかつて存在していました(当クラブは省略して「CM1フォント」と呼んでいました)。低画質のMSXかつフリーフォントという概念が無かった時代において、ピクセル数の少ない漢字フォントというのは当時はたいへん貴重なものでした。

https://p.gigamix.jp/devmsx/cg/kanjirom_matsushita12_large.png

【細かすぎて伝わらない】松下仕様12ドット漢字ROMとは、パナソニックの一部環境(FS-4600F、FS-A1FM、FS-CM1)に搭載されたROM。画面解像度が低いMSXでは16px角の標準漢字ROMより12px角が重宝する場面あり。また、漢字BASICの_kanji1と_kanji3でこのROMが利用される。文字の見え方が全然違うでしょ? pic.twitter.com/8fSJPVDd6U — Takashi Kobayashi (@nf_ban) 2020年7月20日

 当クラブではDMシステム2のフォントドライバにて対応した実績がありますが、その開発中に用いた解析資料がこの度見つかりましたので、作者のごりぽんさんの許可を得て当ブログにて公開するものです。なお、最近の動作検証で判明した事実に関しては赤字で追記してゆきます。

0.初めに

 このデータは,ごりぽんが独自に漢字BASIC等を解析した結果に加え2021年10月に実施したさらなる検証を追加した結果によるものです.松下電気産業への問い合わせはご遠慮ください.

0.1.対応ハードウェア

 松下仕様の12ドット漢字ROMを搭載しているハードウェアは以下のものが判明しています。他にもあるかもしれません。

本体内蔵系

  • FS-4600F(MSX2)本体
  • FS-A1FM(MSX2)本体

カートリッジ系

  • FS-CM1 通信モデムカートリッジ

1.I/Oポート

 松下仕様12ドット漢字ROMは,以下のI/Oに接続されています.

I/O R/W 用途
40H R/W 拡張I/Oセレクト
41H R 使徒不明(漢字BASICでは使用されている)
42H W 漢字ROMイネーブル(FS-4600F・FS-A1FM)
bit0 第一水準漢字(ON=1)
bit1 第二水準漢字(ON=1)
47H W 漢字番号上位8bit
48H W 漢字番号下位8bit
49H R フォントデータ

2.フォントデータの読み出し

2.0.ハードウェアの存在確認

カートリッジ系(FS-CM1)の場合

ポート40hに書く数値 読むポート 結果
F7h 40h 第一水準 8=存在する, FFh=存在しない
F7h 41h 第二水準 8=存在する, FFh=存在しない

 ポート40hに F7h を書き込んだあとポート41hを読むと、第二水準のROMが存在する場合は 8 が返りますが、第二水準のROMというものは実在しないようですので、ポート41hのレジスタ不定と思われます(FS-CM1の場合はFFh(255)が返ります)。

本体内蔵系(FS-4600F・FS-A1FM)の場合

 後述の漢字フォントの読み出し手順に準じて、実際にフォントデータが読めるかどうかで存在を確認します。

2.1.漢字フォントの読み出し方

・カートリッジ系(FS-CM1内蔵)の場合

 メーカーコードF7h(松下のメーカーコード08hではありません)の拡張I/Oを選択してから,漢字番号を設定してフォントデータを読み出します.

 この場合,使う前後で拡張I/Oセレクトが変化すると,他の拡張I/Oを使用するプログラムで不都合が生じる可能性があります.必ず拡張I/Oセレクトの値を保存しておき,使い終わったら復帰させるようにしてください.

 なお,割り込み処理中に拡張I/Oが操作される可能性もありますので,アクセスする際には割り込みを禁止したほうが良いでしょう.

・本体内蔵系(FS-4600F内蔵・FS-A1FM内蔵)や第二水準漢字の場合

 メーカーコードF7hの拡張I/Oを選択し,漢字イネーブルビットの第一水準漢字をON(bit0を1)にしてから,漢字番号を設定してフォントデータを読み出します.FS-4600Fでは第二水準漢字のみをON(bit1を1)にしてもイネーブルされません。

 

2.2.漢字番号の計算方法(第一・第二水準共通)

 シフトJISコードから7340hを引いた値が漢字コードになります.半角の場合には半角コードそのまま(0000h~00FFh)が漢字番号になります.

2.3.フォントデータの並び方

 フォントデータの並び方は,全・半角共通で以下のようになっています.半角の場合はフォントの左半分が有効です.

       +---------+----------------+
 1ライン目 |1バイト目のデータ|2バイト目のデータの上位4bit|
       +---------+------+---------+
 2ライン目 |2バイト目のデータの下位4bit|3バイト目のデータ|
       +---------+------+---------+
 3ライン目 |4バイト目のデータ|5バイト目のデータの上位4bit|
       +---------+----------------+
   ・   |             ・            |
   ・   |             ・            |
   ・   |             ・            |
       +--------------------------+

2.4.第一水準漢字ROMのチェック

 第一水準では,漢字番号0000h(半角スペース)の先頭2バイトが00hで,漢字番号0E5Fhの始め8バイトの合計が4Chになるようになっています.

 なお,拡張I/OにメーカーコードF7hの機器が接続されている場合,必ず第一水準漢字が存在しますので,上記のようなチェックは必要ありません.

2.5.第二水準漢字ROMのチェック

 第二水準では,漢字番号255Ehのフォントの先頭2バイトが41H,42Hになっているようです.ただし,これは漢字BASICでチェックされているのを確認しただけであり,現在のところ第二水準の漢字ROMは発見されていません.

4.その他

4.1.漢字ROMのデータの鮮度

 松下仕様12ドット漢字ROMには,罫線などがサポートされたJIS83のJISコードが使用されているようです(8区にJIS罫線が入っています).

4.2.未定義文字コード

 JISコードで定義されていない9区から15区には,横向きフォントやトランプマークなどのフォントが格納されています.12ドット漢字ROM専用ということで構わなければ使用しても問題はないでしょう.

補足

 ここから先は nf_ban が書いています。

 私(nf_ban)がBASICで検証した結果と解析資料とで違いが見られましたので、解析資料に赤字で追記させていただきました。

 松下仕様12ドット漢字ROMは「本体内蔵系(FS-4600F・FS-A1FM)」と「カートリッジ系(FS-CM1・FS-PW1?)」の2系統あるのが現在有力な説となっています。

漢字ROMをイネーブルする方法

  • FS-4600Fではポート40hにメーカーID F7hを書く手順が解析資料には書いてありませんでしたが、FS-4600Fでもポート40hにF7hを書かなければフォントが有効になりませんでした(さらにポート42hに1 or 3を書かないとフォントが有効になりません)。
  • FS-A1FMでもポート42hに1 or 3を書かないとフォントが有効にならない、という情報が入りました。
  • FS-CM1ではポート42hの利用なしにフォントが有効化されますが、ポート42hに0(全部無効)・1(第一水準のみ有効)・2(第二水準のみ有効)・3(両方有効)のどれを書いても第一水準のフォントデータが読み出せるようです。42hを利用してはいけないということではなさそうですし、無視されるだけかもしれません。

FS-4600F、拡張I/Oポート40hと42hに適切に書き込まないと49hの読み出しは0にならないね。存在しない2水のみ(ポート42hに2)ではFFh(255)だ。イネーブルが有効であるときに49hに0が返る、というロジックなのかな? pic.twitter.com/nR7LWD936G — Takashi Kobayashi (@nf_ban) 2021年10月9日

松下製品なのに拡張I/OのメーカーIDが「8」でない混乱

 松下仕様12ドット漢字ROMはMSXの「拡張I/O」に接続されていますが、これが混乱の原因につながっています。

 要因の一つとして、拡張I/Oでは予め割り振られたメーカーIDをポート40hに出力してからポート41h~4Fhで各周辺機器の制御を切り替えるのですが、松下(パナソニック)のメーカーIDが「8」でありながら松下仕様12ドット漢字ROMではメーカーIDに「F7h(247)」が採用されていることです。

 このF7h(247)というIDは、2021年現在に至ってもどのドキュメントにも明記されていませんでしたアスキー刊の公式技術書である「MSX2テクニカル・ハンドブック」「MSX-Datapack」はもとより、海外の同人ハードウェアのI/Oまで網羅しているWebサイトにも明記されていません。

map.grauw.nl

 つまり、メーカーID F7hは空いていると認識したうえで個人やインディーチームが新しいMSX用デバイスハードウェアを開発した際にメーカーID F7hを採用してしまうと、環境によってはI/Oの衝突が発生して誤動作や本体故障の可能性が生まれてしまいます。実際、不具合回収が発生した事例があります。

【不具合のお知らせ】にがHP様より御連絡がありまして「漢字FlashROM」が特定環境にて不具合が発生するとの事です。緊急:漢字FlashROM初回ロット不具合のお知らせ(PDF)https://t.co/zE22Gjsaac にがHP公式ページhttps://t.co/afRxpHo1wC#akiba #MSX pic.twitter.com/5RJxn92elQ — 家電のHRDちゃん4078ヽ(´ー`)ノ (@zan2zanjp) 2021年9月30日

 しかも、指定するメーカーIDの拡張I/Oが実行環境に存在するかを判定する「ポート40hにメーカーIDを書いたうえでポート40を読んだ数値がメーカーIDをビット反転した数値と同じであればそのメーカーIDの拡張I/Oは有効である」という拡張I/Oの仕様に対し、松下仕様12ドット漢字ROM(メーカーID F7h)の場合正しく 8 が返ってくるハードウェアはFS-CM1だけで、他は反転した数値が返ってきません(実際にはFFhが返ってきます)。

 当記事をまとめ始めたきっかけが、この松下仕様12ドット漢字ROMが不具合に影響している疑いがあったためです。皆様もご注意くださいませ。

拡張I/Oの入出力テストの結果

ポート40hに F7h を書いた場合

読むポート 機種 結果 情報源 補足
40h CM1 8 これ
40h PW1 FFh これ
40h 4600F FFh これ
40h A1FM FFh
41h CM1 FFh これ
41h PW1 FFh これ
41h 4600F FFh これ
41h A1FM FFh
49h CM1 0 これ
49h PW1 FFh これ
49h 4600F 0 これ
49h A1FM FFh

 松下仕様12ドット漢字ROMが実行環境に存在するかを判定するには、まずはポート40hに F7h を書き込んだあとポート40hを読んだ結果が「8」であれば拡張I/Oの仕様上それは有効であることが分かるのですが、「8」を返す機器がなんとFS-CM1しか存在しません。

 そこで、ポート49hを読むと何らかのROMが存在する場合は 0 が返る(FS-CM1・FS-4600F)ようなのでROMの有無を判定するフラグに使える?かと思っていたら、FS-PW1・FS-A1FMでは FFh(255)が返ることが判明したため、この判定法はボツとなりました。

 なお、2021年10月20日現在、FS-PW1は松下仕様のROMが載っていない、と推測しています。詳しくはこちらのブログにまとめました。

gigamix.hatenablog.com

ポート40hに 8 を書いた場合

読むポート 機種 結果 情報源 補足
40h CM1 FFh これ
40h PW1 FFh これ
40h 4600F F7h これ 松下仕様漢字として
40h A1FM FFh
40h A1FX/WX/WSX F7h WX WSX 1.5倍速モードとして
41h CM1 FFh これ
41h PW1 FFh これ
41h 4600F FFh これ
41h A1FM FFh
41h A1FX/WX/WSX FBh WX WSX 1.5倍速モードとして
45h CM1 FFh
45h PW1 FFh これ
45h 4600F 0 これ
45h A1FM FFh
45h A1FX/WX/WSX FFh WX WSX
46h CM1 FFh
46h PW1 FFh これ
46h 4600F FEh これ
46h A1FM FFh
46h A1FX/WX/WSX FFh WX WSX

 拡張ポート40hに松下(パナソニック)のメーカーID「8」を書いたうえでポート40hを読み出すと F7h(247)が返るハードウェアは松下(パナソニック)の拡張I/Oが搭載されているハードウェアであると言えますが、MSX2+の1.5倍速モードもFS-4600Fの12ドット漢字ROMもポート40hの読み出し結果が同じ(8)になることには注意が必要です。

実装例・開発方法について

DMシステム2のフォントドライバ

 当クラブのMSXミドルウェア「DMシステム2」にて、松下仕様12ドット漢字ROMに対応した開発事例があります。ソースコードGitHubで公開しています。

github.com

 注意点として、当クラブではFS-A1FMとFS-PW1による動作チェックをしていません。もしかすると、仕様や実装が違うかもしれません。

MSX BASIC

 なお、MSX BASICからFS-4600F・FS-CM1・FS-A1FMのどれでもフォントデータを読み出せることが判明しました。   コメントアウトを取って(ポート40hにF7hを書いて)実行すると、なんかデータが読めました!ってちゃんと読めてるのかなこれ。ビジュアル化しないと分からないですね。 pic.twitter.com/FZUikBKRHX — Takashi Kobayashi (@nf_ban) 2021年10月3日
FS-CM1を使おうとしてポート40hにメーカーID 8を書いても読み出せなくて、なぜかF7hを書くとフォントデータが取り出せる(42hに何か書くのは不要)…なるほど、これが知られざるMSXの松下仕様12ドット漢字ROMなのか!😰 混乱のもとですね… pic.twitter.com/F1BtesP6nX — Takashi Kobayashi (@nf_ban) 2021年10月3日

フォントビュアー(BASICプログラム)

松下仕様の漢字フォントビュアーのプログラムが完成しました。もしお時間ありましたら、FS-PW1やFS-A1FMで表示できるかお試しいただきたく。🙏https://t.co/fCxGtFfyDr — Takashi Kobayashi (@nf_ban) 2021年10月8日
リザルトが0,255なので、たぶん最初の拡張I/Oセレクターに機種コードを渡した後で返ってくる値が機種によって違うのかなー、という気が。チェック部分を削除したこちらではどうでしょう? https://t.co/tOEa05sOyz — EmiCharLounge (@EmiCharLounge) 2021年10月19日

その他の実装例

この解析資料を見るのは初めてです。自分は https://t.co/YixWlCzeiK を再実装するような形でFS-CM1の書体吸い出しツールを作ってみたことがあります。 — SASANO Takayoshi (@uaa) 2021年10月2日

 http://www.msxarchive.nl にて公開中のソースコードがありますので、参考にしてください。

www.msxarchive.nl

ハードウェアの競合について

 FS-4600FやFS-A1FMのスロットへFS-CM1を差すなど「同一拡張I/Oポートのハードウェアが複数同居するケース」は考えられますが、その際の挙動はまだよく分かっていません(どちらもフォントのデザインが全く同じため、見分けが付かない)。普通の漢字ROMと同様に「外付けが優先される」という見解が現在の有力説となっています。

 ただし、FS-CM1とFS-PW1のようにカートリッジ同士を複数同居するケースについては全くの未知数です。拡張I/Oの重複により故障の原因にもなりかねませんので、できることならそもそもそんな環境にしないことをおすすめします。

漢字フォントの互換性について

 MSX標準の漢字ROMと松下仕様12ドット漢字ROMは、ハードウェア上の互換性は全くありません。松下仕様の漢字ROMが利用可能だからと言ってMSX標準の漢字ROMの代用品になっているのではありません。

 MSX標準の漢字ROMと松下仕様12ドット漢字ROMは、同一環境で併用可能でありながら一部の文字コードで互換性が失われています。当ブログの別ページにて検証しています。

gigamix.hatenablog.com

各ハードウェアの中身(部品の確認)

FS-CM1

FS-CM1、開封の儀。部品が色々載っていますね…。ボタン型電池があるけど金具とくっついてみたいで簡単には取れない。裏面はICなし。 pic.twitter.com/Y8IMrxJ9dN — Takashi Kobayashi (@nf_ban) 2021年10月9日

「©MEI 1986 831000-20 354 BA 8644 E01」と書かれたICが松下仕様12ドット漢字ROMと思われます。

「©MEI 1987 831000-20 714 BA 8746 Z00」と書かれたICは内蔵通信ソフトが含まれているのでしょうか?

FS-4600F

usbsecretbase.michikusa.jp

「©MEI 1986 831000-20 354 BA 8705 Z48」?と書かれたICが松下仕様12ドット漢字ROMと思われます(354 BAと書かれた型番のICがFS-CM1にも含まれているため)。

「©MEI 1986 831000-20 340 BA 8709 Z59」と書かれたICは内蔵ワープロソフトが含まれているのでしょうか?

FS-A1FM

usbsecretbase.michikusa.jp

「©MEI 1988 DA53P66220 TC534000P-6622 8809EBI」と書かれたICが、松下仕様12ドット漢字ROMを含む統合ICと思われます。

FS-PW1には搭載されていません

 調査の結果、FS-PW1には松下仕様12ドット漢字ROMは搭載されていませんでした。FS-PW1の解析結果については、こちらの記事で解説しています。

gigamix.hatenablog.com

オリジナルの解析資料

https://www.gigamix.jp/ds2/download/CM1FONT.TXT にあります。(文字コード シフトJIS、タイムスタンプ 1994/04/15 18:31:52)

※このドキュメントはFS-A1FMについての言及がありません。