Small Demonstration Part X


img
残り物をかたづけておこう企画。
エミュレータ環境でバンク切り替えのできる拡張ROMが使えるようになったので
漢字ROMを作ってみました。第一・第二水準の 8x8 ドットフォントで Screen 4 に
半角と全角文字が表示できます。

メモリの使い道としてはベタですが、漢字が扱えるだけでも色々と応用が効きそうです。
表示ルーチンは手抜きですが出来るだけシンプルにまとめてみました。




■ 漢字ROMと簡易ドライバ

ROMイメージとテープイメージ kanji.zip

エミュレータの拡張ROMファイルとして同梱の"misakip6.bin"を指定し、
拡張ROMタイプを"戦士のカートリッジ",PORT番号を"7F"にしてください。

mode=1 page=2 で "KanjiTest"を cload後、runすると、簡易ドライバがメモリに配置されます。
ソースはアセンブラ"AS"でコンパイルできます。

簡易ドライバをrunした後、ページ切り替えキーを押して画面左上に「あ」が表示されていたらOKです。
白い真四角が表示されている場合は拡張ROMが正しくセットされていません。


※ 動作確認はPC-6001VW ver2.05 上でのみ行っています。
※ 漢字フォントはフリーで配布されている「美咲フォント periodβ11」を使用させていただきました。
※ ROMの取り扱いについてはオリジナルフォントのライセンスに準じるものとします。(後述)


■ 漢字表示ルーチンの使い方

上の画面で「あ」を表示している部分を例に説明します。
ドライバは BASIC リストで短いので以下に全文載せてみます。
10 D=&HDE00:
20 READ A$:IF A$<>"$" THEN POKE D,VAL("&H"+A$):D=D+1:GOTO 20
30 SCREEN 4,2,2:COLOR 1,0,2:CLS
40 POKE &HDE0C,&HA0 ← シフトJIS 漢字コード下位
50 POKE &HDE0D,&H82 ← シフトJIS 漢字コード上位
60 POKE &HDE0E,0	← X座標
70 POKE &HDE0F,0	← Y座標
80 EXEC &HDE00 ← 全角表示ルーチン用コールアドレス
90 END
300 DATA C3,10,DE,C3,16,DE,C3,1C,DE,C3,22,DE,A0,82,00,00
310 DATA CD,B0,DE,C3,28,DE,CD,B0,DE,C3,39,DE,CD,ED,DE,C3
320 DATA 28,DE,CD,ED,DE,C3,39,DE,54,5D,CD,FF,DE,3E,B6,32
330 DATA 33,DF,32,37,DF,CD,1C,DF,C9,54,5D,DD,21,0E,DE,3E
340 DATA B6,32,33,DF,32,37,DF,CD,FF,DE,CD,1C,DF,DD,34,00
350 DATA CD,FF,DE,CD,1C,DF,DD,34,00,CD,FF,DE,CD,1C,DF,DD
360 DATA 34,01,CD,FF,DE,CD,1C,DF,DD,35,00,CD,FF,DE,CD,1C
370 DATA DF,DD,35,00,CD,FF,DE,CD,1C,DF,DD,34,01,CD,FF,DE
380 DATA CD,1C,DF,DD,34,00,CD,FF,DE,CD,1C,DF,DD,34,00,CD
390 DATA FF,DE,CD,1C,DF,DD,35,00,DD,35,01,3E,AE,32,33,DF
400 DATA 32,37,DF,CD,FF,DE,CD,1C,DF,DD,35,00,DD,35,01,C9
410 DATA 3A,0D,DE,EE,20,D6,A1,6F,26,00,29,29,44,4D,29,29
420 DATA 29,29,09,44,4D,67,2E,00,B7,ED,42,3A,0C,DE,D6,40
430 DATA FE,40,38,01,3D,4F,06,00,09,29,29,29,7C,07,07,07
440 DATA E6,07,D3,7F,7C,E6,1F,67,01,00,40,09,C9,3E,09,D3
450 DATA 7F,3A,0C,DE,6F,26,00,29,29,29,01,00,40,09,C9,3A
460 DATA 0F,DE,6F,26,00,29,29,29,29,29,3A,0E,DE,CB,3F,CB
470 DATA 3F,CB,3F,4F,06,00,09,01,00,E2,09,C9,3E,08,D5,08
480 DATA 3A,0E,DE,E6,07,47,04,0E,00,1A,05,28,06,CB,3F,CB
490 DATA 19,18,F7,B6,77,23,79,B6,77,01,1F,00,09,13,08,3D
500 DATA 20,DD,D1,C9,$

X座標は(0-255) Y座標は(0-191)です。ただし、はみ出してもチェックしていません。
漢字コードはシフトJISで指定します。ATOKやMS-IMEなどで漢字コードは調べられます。
半角の場合は2バイトでなく1バイトなので、下位の方にだけ値を入れます。
これらを &HDE0C-DE0F にそれぞれ POKE し、文字種・装飾別に以下の表示ルーチンを EXEC します。

EXEC &HDE00 ← 全角ノーマル
EXEC &HDE03 ← 全角袋文字
EXEC &HDE06 ← 半角ノーマル
EXEC &HDE09 ← 半角袋文字

上の「あ」表示では "座標(0,0)にシフトJISコード0x82A0を全角ノーマルで表示" となるわけです。


これは test2.p6t で表示できるテストです。
ドライバを run した後、 test2.p6t をロードし実行してみてください。


■ 応用など

拡張ROMは $4000-$5FFF の 8KB空間に配置され、I/Oポート $7F に 0-15 の数値を書き込むことで
16 バンクを切り替えて使用できるらしいです("戦士のカートリッジ"仕様の時)。
合計すると16*8KB=128KBということになります。

美咲フォントは表示すべき文字のフォントデータのみを持っているので、そのままバイナリに変換すると
55,696バイト(+半角 1,264バイト)という小ささで実現できます。
「表示すべきフォントデータのみ」というのは、例えば全角アルファベットの「Z(0x8279)」と
その次のコードである「a(0x8281)」が連続して格納されているという意味で、空白部分のデータ
(0x827A-0x8280)が省略されているという意味です。

漢字ROM作成にあたり、フォントデータを通し番号で管理しやすくするために、こういった部分を 0 で
埋めたデータを作りました。そのため容量が若干増えて全角69KB+半角2KBということになりました。
拡張ROMの仕様が 1バンク=8KB ですから バンク#0-#8 を全角(9*8KB=72KB) バンク#9 を半角として
割り当てています。やや無駄がありますが、まだ 128KB の容量には余裕があります。

ちなみに 10x10 ドットフォントの「ナガ10」は全角だけで 144KB になります。

表示ルーチンはかなり適当です。シフトJISコードから変換する部分も含めて、高速化の余地はあるでしょう。
そもそもまともに日本語を扱おうとするとクリッピング処理やコントロールコード等も含めて
結構大がかりになってしまいます。
とりあえずモノ(漢字ROM)があれば後はそれを弄るアイデアは尽きないということで。

スクリーンモード3と4の混在でアドベンチャーゲーム風にグラフィックを表示しつつ
文字フォントを 8x8 表示できたりすると面白そうですね。


・謝辞

漢字フォントについてです。

「美咲フォント」は 門真 なむ 氏が Little Limit (http://www.geocities.jp/littlimi/) で配布されている
フリーフォントで、今回の漢字ROM作成にあたり、period β11版を使用させていただきました。
漢字ROMの取り扱いについても、オリジナルフォントのライセンスに準じるものとします。
本来の使い方とは違うかもしれませんが、このような有用なリソースをフリーで配布されていることにお礼申し上げます。


▲ TOP