「松下仕様の12ドット漢字ROM」という、MSX標準の漢字ROMではないパナソニック独自の12pxスモールフォントというものがかつて存在していました(当クラブは省略して「CM1フォント」と呼んでいました)。低画質のMSXかつフリーフォントという概念が無かった時代において、ピクセル数の少ない漢字フォントというのは当時はたいへん貴重なものでした。
当クラブではDMシステム2のフォントドライバにて対応した実績がありますが、その開発中に用いた解析資料がこの度見つかりましたので、作者のごりぽんさんの許可を得て当ブログにて公開するものです。なお、最近の動作検証で判明した事実に関しては赤字で追記してゆきます。
0.初めに
このデータは,ごりぽんが独自に漢字BASIC等を解析した結果に加え2021年10月に実施したさらなる検証を追加した結果によるものです.松下電気産業への問い合わせはご遠慮ください.
0.1.対応ハードウェア
松下仕様の12ドット漢字ROMを搭載しているハードウェアは以下のものが判明しています。他にもあるかもしれません。
本体内蔵系
カートリッジ系
- 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を利用してはいけないということではなさそうですし、無視されるだけかもしれません。
松下製品なのに拡張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サイトにも明記されていません。
つまり、メーカーID F7hは空いていると認識したうえで個人やインディーチームが新しいMSX用デバイスハードウェアを開発した際にメーカーID F7hを採用してしまうと、環境によってはI/Oの衝突が発生して誤動作や本体故障の可能性が生まれてしまいます。実際、不具合回収が発生した事例があります。
しかも、指定するメーカー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が載っていない、と推測しています。詳しくはこちらのブログにまとめました。
ポート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で公開しています。
注意点として、当クラブではFS-A1FMとFS-PW1による動作チェックをしていません。もしかすると、仕様や実装が違うかもしれません。
MSX BASIC
なお、MSX BASICからFS-4600F・FS-CM1・FS-A1FMのどれでもフォントデータを読み出せることが判明しました。
フォントビュアー(BASICプログラム)
その他の実装例
http://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は、同一環境で併用可能でありながら一部の文字コードで互換性が失われています。当ブログの別ページにて検証しています。
各ハードウェアの中身(部品の確認)
FS-CM1
「©MEI 1986 831000-20 354 BA 8644 E01」と書かれたICが松下仕様12ドット漢字ROMと思われます。
「©MEI 1987 831000-20 714 BA 8746 Z00」と書かれたICは内蔵通信ソフトが含まれているのでしょうか?
FS-4600F
「©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
「©MEI 1988 DA53P66220 TC534000P-6622 8809EBI」と書かれたICが、松下仕様12ドット漢字ROMを含む統合ICと思われます。
FS-PW1には搭載されていません
調査の結果、FS-PW1には松下仕様12ドット漢字ROMは搭載されていませんでした。FS-PW1の解析結果については、こちらの記事で解説しています。
オリジナルの解析資料
https://www.gigamix.jp/ds2/download/CM1FONT.TXT にあります。(文字コード シフトJIS、タイムスタンプ 1994/04/15 18:31:52)
※このドキュメントはFS-A1FMについての言及がありません。