2022-09-19 programmed by Meister
シャープX1のCP/M V2.2 (※1)とLSX-Dodgers(※2)向けにデータファイルから PCGを定義するプログラムを作成しました。 このプログラムを使用して事前にPCGを定義しておくことでユーザープログラムでは アトリビュートVRAMの設定だけでPCGを表示できます。 RogueのPCG化などにいかがでしょうか。
「試験に出るX1」[参考文献 1]で紹介された24倍速定義の手法を使用しているため 2~3秒で定義が完了する・・・と言いたいところですが,実際にはプログラム本体と データファイル読込みのためそれなりの時間がかかります。
※1 ランゲージマスター CZ-128SF
※2 Gaku氏作,CP/M互換システムコールとMS-DOS互換ファイルシステムを持つX1用OS
https://tablacus.github.io/LSX-Dodgers/
https://github.com/tablacus/LSX-Dodgers/
setpcg.com [-v|-w] [データファイル名]
-v 全キャラクタ(256文字)のプレビューを表示
-w 全キャラクタ(256文字)のプレビューを横2倍角モードで表示
データファイルを読込み,全256文字のPCGを定義して終了します。
オプション -v または -w をつけると定義済みのPCGを 16×16 文字に並べて表示します。
オプション -w の場合は横2倍角モードで表示します。WIDTH 80のCP/M上でWIDTH 40用の
PCGを確認する用途を想定しています。
下記の形式で,全6144byteの無圧縮・ヘッダなしバイナリファイルです。
文字コード 0x00・1ライン目の青(1byte)
文字コード 0x00・1ライン目の赤(1byte)
文字コード 0x00・1ライン目の緑(1byte)
文字コード 0x00・2ライン目の青(1byte)
・
・
・
文字コード 0x00・8ライン目の緑(1byte)
文字コード 0x01・1ライン目の青(1byte)
・
・
・
文字コード 0xff・8ライン目の緑(1byte)
データファイルの拡張子は任意です。
添付している *.PCG ファイル ( HOKUSAI.PCG,FLOWER.PCG ) がサンプルです。
気の利いた作成プログラムは用意していません。 一応,添付の png2pcg.rb がRubyにより128×128ドットのPNG画像からデータファイルに 変換するサンプルプログラムです。
- 終了時に25行目をVRAM上で直に消去しているため,CP/Mではファンクションキーの表示が 消去されます。STARTUP.COMを実行することで復元できます。
- LSX-Dodgersは念のためにRelease 1.40以降を使用してください。(理由を後述)
「試験に出るX1」にある24倍速PCG定義を参考にしています。 これはCRTCを操作して画面下部の非表示期間を下部8行(7行+半端1行)に増やしたうえで,
- VSYNCを監視
- タイミングが来たら1ライン分のPCGデータ(青・赤・緑)を順次OUTI
- 次のスキャンラインにソフトウェアディレイでタイミングを合わせる
という処理を行い,一度に8文字を登録するものです。
Cコンパイラとしてz88dk (※3) を使用し,VSYNCとタイミングを取る部分のみ インラインアセンブラで記述しています。
ところでz88dkのCP/M向けスタートアップルーチンではスタックポインタ(SP)の 再設定を行ないません。 そのためOS内のSPがそのままユーザープログラム(トランジェントコマンド)に 引き継がれるLSX-DosgersのRelease 1.39以前でz88dkで作成されたのプログラムを 実行すると,場合によりスタックを食いつぶして暴走します。
Release 1.40からCP/Mなどと同様の位置をSPが指すように変更されましたので そちらを使用してください。
※3 Z80向けのクロスCコンパイラ
https://z88dk.org/site/
- 試験に出るX1, 祝 一平, 日本ソフトバンク, 1987
本プログラム(ソース・バイナリ含む)およびドキュメント一式について,CC0ライセンス ( http://creativecommons.org/publicdomain/zero/1.0/deed.ja )を宣言します。