PC-6001用互換BASIC

PC-6001用の互換BASICを書いてみました。実機のBASIC ROMの代替品として使用できます。まだまだバグや不具合があると思うので、気付いた点があれば教えてもらえると幸いです。LGPLでの利用が可能です。(PC-6001mkII/6601用の互換BASICも公開中です)

(2024.6.15 Ver.0.8を公開しました。)

(2023.1.22 ターミナル用P6エミュレータを更新しました。)


目次


使い方

詳細については各エミュレータのマニュアルなどを参照してください。

  1. 互換BASIC Ver.0.8をダウンロードして展開します。
  2. 展開した中にあるBASICROM.60をエミュレータの指定するところに置きます (PC-6001Aとして動かしたい場合はBASICROM.61)。実機から吸い出したファイルが既にある場合、本物を上書きしてしまわないよう注意してください。
  3. 機種は「PC-6001」もしくは「PC-6001A」を選択します。
  4. エミュレータにCRCチェック機能がある場合は無効に、互換ROM使用チェックがある場合は有効にします。
  5. CGROM60.60 (PC-6001Aとして動かす場合はCGROM60.61) が無い場合は次節を参照してください。

PC6001VXなどで、エミュレータに内蔵されているバージョンの互換BASIC ROMや互換CGROMを使用する場合はこうした準備は不要です。

※PCS-6001R 拡張BASICカートリッジとの併用はできません。


CGROMファイルについて

エミュレータを動かすためには、BASICROM.60の他にCGROM60.60というフォントファイルが必要です (機種をPC-6001と指定した場合)。これについては同梱していませんので、利用者が各自用意する必要があります。方法としては、以下の四つがあると思います。

1.実機から吸い出す

これができれば一番です。詳しくは、Hashiさんのサイトの「BIOS吸出し手順」TINY野郎さんのサイトの「新・PC-6001シリーズのBIOSデータをデータレコーダーもフロッピーも使わずにPCに移す」などを参照してください。

実機フォントのドットパターンに依存したプログラムの場合、これ以外の方法ではうまく動かないことがあります。

2.公開されているフォントファイルを使う

エミュレータ上で使えるように一から制作された独自のフォントがいくつか公開されています。ダウンロードして展開するだけ!ありがたや。

3.自分で打ち込む

ばんばんさんが制作されたCGROM交換ツール (p6font.exe) を使うと、自分でCGROMファイルを作成できます。写真などを見ながら本物のフォントを再現するのも良いですし、自分ならではのフォントを作成して使うのも面白いかもしれません。

4.他の形式のフォントファイルから変換する

BDF形式のビットマップフォントを元にしてCGROM60.60形式のファイルを生成するプログラムを同梱しました。PC-6001のフォントは8×12ドットサイズですが、元のフォントがそれより小さい場合はそのまま、大きい場合は適当に縮小します。また、トランプマークが含まれない場合は▲▼★◆で代用するようにしました。単純な変換なので読みにくくなる字もあると思いますが、うまくフォントを選べばとりあえずの使用には耐えるのではないかと思います。TTFやPCFなど他形式のフォントファイルを使いたい場合は、otf2bdfやpcf2bdfといったBDFへの変換プログラムを併用すればうまくいくかもしれません。

使い方は、コマンドラインより

bdf2cgrom [-n] [-ascii] [-pc6001a] [-ascent] fontfile.bdf outfile

のように打ち込みます。Windows以外のOSでは、src/bdf2cgrom.cをコンパイルして使ってください。出力ファイルは確認なく上書きするので注意してください。オプションは以下の通りです。

-nオプション
-8や-10と指定すると、縦のサイズが8ドットや10ドットになるように変換を行います。うまく加工すればmkII以降用のCGROMファイルとして使用できるのではないかと思います。
-asciiオプション
1バイト文字集合のフォントを変換します。仮名文字やグラフィック文字などは空白となります。
-pc6001aオプション
PC-6001A用の変換を行います。
-ascentオプション
bdfフォントの縦サイズ判断に、FONT_ASCENTとFONT_DESCENTを使用します。元フォントによっては、使用する方が適切な文字サイズになるかもしれません。

※変換したフォントファイルの扱いには十分注意してください。再配布はもちろん、他OSでの使用や変換自体を制限するライセンスのフォントもあるようです。

k8x12Lの画像
k8x12Lを変換した例

美咲フォントの画像
美咲フォントの明朝体を変換した例

東雲フォントの画像
東雲フォントの12ドット丸文字を変換した例


P6用のゲームを公開しているサイト

かつて販売されたり雑誌に掲載された自作ゲームを公開されている方、作者の許可を得て公開されている方、新作ゲームを公開されている方などがいらっしゃいます。P6を持っていない、エミュレータで初めてP6に触れてみたけれど何をしたらいいかわからない、という方は、まずこの辺りから試してみるといいかもしれません。感謝しつつ遊ばせてもらいましょう。


旧バージョン

Ver.0.7以降はLGPL、それより前は非LGPLです。


ROM内ルーチン

以下のルーチンのアドレスや入出力レジスタなどをN60-BASICと揃えました。実機のROMは見ないことにしているので、各ルーチンの仕様については参考文献の記述に全面的に頼っています。

アドレス概要 入力出力破壊 詳細
0000h ブート
0008h パラメータチェック HL HL A,CY,Z コール命令の次のアドレスのデータと(HL)を比較し、合えば0010hへ
0010h スペースをスキップして1文字読む HL A,HL,CY,Z F HL=先頭アドレス-1 A=データ Aが00hか3AhならZ=1 Aが30h〜39hならCY=1
0018h フック - - - FFDBhにジャンプ
0020h HL,DE比較 HL,DE CY,Z AF
0028h 実数の符合チェック (FA66h)〜(FF6Ah) A,Z AF 0ならZ=1,A=0 正ならZ=0,A=1 負ならZ=0,A=FFh
0038h フック - - - FFE1hにジャンプ
0384h 文字列データ - - - " Error"
038Bh 文字列データ - - - " in "
0390h 文字列データ - - - "OK"+CRLF
0442h ダイレクトコマンドモード
0741h 実数→整数 (FF66h)〜(FF6Ah)DE AF,BC,HL USR関数で引数をレジスタに入れるのに使用。破壊レジスタについては資料無し
0BEEh アルファベット大文字変換 HL A F (HL)を大文字にしてAに代入
0D16h 整数→実数 AB (FF66h)〜(FF6Ah) AF,BC,HL USR関数で結果をBASICに返すのに使用。破壊レジスタについては資料無し
0DE3h 式解析 HL A,E,HL F,BC,D HLを+1した後、HLを開始アドレスとする中間言語による式を解析して、符号無し1バイト整数をAとEに返す。破壊レジスタについては資料無し
0DE4h 式解析 HL A,E,HL F,BC,D HLを開始アドレスとする中間言語による式を解析して、符号無し1バイト整数をAとEに返す。破壊レジスタについては資料無し
0E78h サブCPU入力 - A F 破壊レジスタについては資料無し
0E8Fh サブCPU出力 A - - 破壊レジスタについては資料無し
0EB0h キー入力割り込み処理 - - - GRAPH、STOP、ファンクションキー等の処理
0EB5h キー入力割り込み処理 - - - 一般キーの処理
0F74h タイマ割り込み処理 - - - TIMEカウント、カーソル点滅、PLAYの演奏を行う。動作を追加するには、新しい割り込みルーチンの最後をJP 0F74hとし、先頭アドレスをFA06h-FA07hに書けば良い
0FBCh キー入力 - A,Z F 入力が無ければZ=1
0FC4h キー入力 - A F 入力があるまでカーソルを点滅させながら待つ
103Ah キー入力 - A,Z F 入力が無ければZ=1。ファンクションキーのデコードを行わない
1058h キーバッファクリア - - AF,BC,DE,HL
1061h ゲームキー入力 - A F
7 スペース
6 0
5
4
3
2
1 STOP
0 SHIFT
1075h 文字表示 A - - A=文字
10AAh 文字表示 A - AF,HL A=文字 コントロールコード処理は行わない。破壊レジスタについては資料無し
116Dh 文字表示位置設定 HL - - H=X+1 L=Y+1
1179h カーソル点滅開始 - - -
1181h カーソル点滅停止 - - HL
11B8h Y座標→左端のVRAMアドレス L DE - L=Y+1 テキストモードにおけるアドレス
11CDh キャラクタ座標→VRAMアドレスHL HL - H=X+1 L=Y+1 テキストモードにおけるアドレス
11DAh 1行消去 DE - - DE=左端のVRAMアドレス グラフィック画面で使う時もテキストモードにおけるアドレスを入力
1257h 文字表示 A,HL- - A=文字 H=X+1 L=Y+1 位置移動とコントロールコード処理は行わない
1260h スクロール HL - AF H=Y上+1 L=Y下+1 指定は行単位。グラフィック画面でも使用可
12A9h 逆スクロール HL - AF H=Y下+1 L=Y上+1 指定は行単位。グラフィック画面でも使用可
12B5h ファンクションキー表示 - - AF 破壊レジスタについては資料無し
1390h 画面モード設定 A - AF,DEA=モード-1
13EDh 表示画面設定 A - AF A=ページ-1
140Ch 使用画面設定 A - - A=ページ-1
1478h VRAMアドレス変換 HL HL - キャラクタモードでのアドレスをグラフィックモードでのアドレスに変換
14A0h CGROMアドレス計算 A DE - A=文字 DE=アドレス
14AFh 文字表示 A,HL- - A=文字 HL=キャラクタモードでのVRAMアドレス
1578h グラフィック座標→スクリーンモード座標変換 BC,DE BC,DE AF BC=X DE=Y
15BAh スクリーンモード座標→アトリビュートアドレス変換 BC,DE A=(FDB2h),HL=(FDB3h)〜(FDB4h) F BC=X DE=Y A=マスク用ビット HL=アトリビュートアドレス (スクリーンモード2はドットパターンアドレス)
15C0h アトリビュート設定 A A F カラーコードを入れてコールすると(FEACh)にアトリビュートをセットする。スクリーンモード2ではそのままの値。破壊レジスタについては資料無し
15D5h 画面のカラーコード取得 (FDB2h),(FDB3h)〜(FDB4h) A F,HL (FDB2h)=マスク用ビット (FDB3h)〜(FDB4h)=アトリビュートアドレス (スクリーンモード2はドットパターンアドレス)。破壊レジスタについては資料無し
18C3h 境界色設定 A A,(FEACh) F カラーコードをアトリビュートの値に変換し、(FEACh)にも書き込む。破壊レジスタについては資料無し
1A1Ch プリンタ出力 A - - A=文字
1A4Fh 平仮名→片仮名変換 A A F
1A61h テープ入力開始 - - - リレーONも行う
1A70h テープ1バイト入力 - A F リードエラーならZ=0
1AAAh テープ入力終了 - - - リレーOFFも行う
1AB8h テープ出力開始 - - - リレーONも行う
1ACCh テープ1バイト出力 A - -
1AEDh テープ出力READYチェック - Z AF,B Z=0なら準備OK。破壊レジスタについては資料無し
1B06h テープ出力終了 - - - リレーOFFも行う
1B2Ah *表示の反転 - - AF
1B49h テープ用リレーOFF - - AF,B 破壊レジスタについては資料無し
1B4Bh テープ用リレーON - - AF,B 破壊レジスタについては資料無し
1B54h ポートB0h出力 A,B - AF A=出力データ B=変更ビットを1にしたもの
1B60h PLAY停止サブ - - - ユーザは1BB3hを使うべきとされる。詳細不明
1BB3h PLAY停止 - - -
1BBEh PSG出力 A,E D - A=レジスタ E=出力値 D=元の値
1BC5h PSG出力 A,E - - A=レジスタ E=出力値
1BCDh ベル - - AF,BC,E
1CA6h ジョイスティック入力A A F 入力=1or2
出力
7 0
6 0
5 (トリガ2)
4 トリガ1
3
2
1
0
1D52h CONSOLE命令メイン部 - - AF,DE,HL 破壊レジスタについては資料無し
1D73h CONSOLE設定 DE - AF,BC,HL D=Y下+1 E=Y上+1 破壊レジスタについては資料無し
1DBBh COLOR第3パラメータ実行 A - AF,BC,DE A=1or2
1DFBh CLS - - AF,DE
1E39h SCREEN命令メイン部 C,D,E - AF,DE 各パラメータから1を引いたものを入れて呼ぶ。破壊レジスタについては資料無し
1EB3h PLAY HL,Z=0 HL AF,BC,DE 入力=PLAY文字列先頭アドレス(ダブルクォーテーションマークのアドレス) 出力=文字列最後の次のアドレス(通常はコロンか00hのあるアドレス)
204Bh 音階データ - - - O1C〜O1B各音に対応するPSGレジスタ0,1のデータ (初代機用)
2286h STICK()方向データ(ジョイスティック用) - - -
2296h STICK()方向データ(カーソルキー用) - - -
2539h CLOADヘッダ読み取り - (FED1h)〜(FED6h) AF,B,DE D3h×10個を確認した後、(FED1h)以降にファイル名を格納する。破壊レジスタについては資料無し
254Eh テープ連続データチェック DE - AF,B テープを読み、データEがD個連続するまで読み飛ばす。破壊レジスタについては資料無し
2576h 文字列データ - - - "Found:"
2583h ファイル名表示 HL - AF,BC,DE,HL (HL)からの文字列及び(FED1h)からのファイル名を表示。破壊レジスタについては資料無し
259Ah INPUT#-1開始 - - AF,B1A61hコール後、9Chが6個連続するまで読み飛ばす。破壊レジスタについては資料無し
25A8h PRINT#-1開始 - - A,B 1AB8hコール後、9Chを6個出力。破壊レジスタについては資料無し
25E5h ウェイト - - AF,BC 約3.5秒待つ。破壊レジスタについては資料無し
26C7h デバイス1文字出力 A,(FA58h) - AF (FA58h)=出力デバイス(0=CRT 1=プリンタ 2=RS-232C 80h〜FFh=テープ)
2701h プリンタCRLF出力 - (FA58h) AF ヘッドの位置が0以外なら改行。終了時に出力デバイスをCRTに変更
272Dh 行頭以外ならデバイスCRLF出力 (FA58h) - AF (FA58h)=出力デバイス(0=CRT 1=プリンタ 2=RS-232C 80h〜FFh=テープ)
2739h デバイスCRLF出力 (FA58h) - AF (FA58h)=出力デバイス(0=CRT 1=プリンタ 2=RS-232C 80h〜FFh=テープ)
274Dh STOP/ESCチェック - - AF ESCが押されれば一時停止、STOPが押されればBreak
2874h CTRL-L処理 - - AF,BC,DE,HL 1DFBhとは違い、直前に指定したグラフィック座標をリセットせず保持する。破壊レジスタについては資料無し
28F9h スクリーンエディット - HL,CYAF,BC,DE HL=FED9h(入力バッファ-1) STOP入力時はCY=1
2905h INPUT用1行入力 - HL,CYAF,BC,DE HL=FED9h(入力バッファ-1) STOP入力時はCY=1
2D13h グラフィック座標セット BC,DE,Z BC=(FDAEh)〜(FDAFh)=(FEADh)〜(FEAEh) DE=(FDB0h)〜(FDB1h)=(FEAFh)〜(FEB0h) F,BC,DE ワークエリアへのセット。BC=X DE=Y Z=1なら相対座標
2D47h PSET BC,DE,(FEACh) - AF,BC,DE BC=X DE=Y (FEACh)=アトリビュート
2DE4h LINE BF BC,DE,(FEADh)〜(FEAEh),(FEAFh)〜(FEB0h),(FEACh) - AF,BC,DE BC=X1 DE=Y1 (FEADh)〜(FEAEh)=X2 (FEAFh)〜(FEB0h)=Y2 (FEACh)=アトリビュート
2E1Fh LINE 同上 - AF 同上
2E35h LINE B 同上 - AF,BC,DE 同上
2EFAh PAINT BC,DE,(FEACh),(FEC5h),(FEC6h) - AF,BC,DE BC=X DE=Y (FEACh)=領域色アトリビュート (FEC5h)=境界色アトリビュート (FEC6h)=境界色カラーコード
30CFh デバイス文字列出力 HL,(FA58h) - AF,BC,DE,HL 00hかダブルクォーテーションマークまで出力。HL=文字列アドレス (FA58h)=出力デバイス(0=CRT 1=プリンタ 2=RS-232C 80h〜FFh=テープ)
310Fh ガベージコレクション - - AF,BC,DE,HL
3913h (DE)→(HL)4バイト転送 DE,HL - A,B,DE,HL
397Ah 10進表示 A - AF,BC,DE,HL 符号無し
3AA1h 10進表示 HL - AF,BC,DE,HL 符号無し
3AA5h 整数→文字列HL HL AF,BC,DE 符合無し,HLに文字列アドレスが入る
3AACh 実数→文字列(FF66h)〜(FF6Ah) HL AF,BC,DE HLに文字列アドレスが入る
3BAFh 乱数生成 - (FF66h)〜(FF6Ah) AF,BC,DE,HL 乱数列を一つ進めて実数で格納する

以下のBASIC命令についてのアドレスもN60-BASICと揃えてあります。パラメータ文字列のアドレスをHLに入れてコールすると、各命令と同じ処理を行います。STICK()とSTRIG()については、アドレス-1(括弧のアドレスの一つ前)をHLに入れます。

アドレス命令
0781h RUN
07E0h DATA
07E2h REM
087Ah LPRINT
087Eh PRINT
1CD2h LOCATE
1CF6h CONSOLE
1D9Bh COLOR
1E04h SCREEN
2236h STICK
2256h STRIG
22A6h LCOPY
2D37h PRESET
2D3Ch PSET
35A9h CLEAR

ワークエリア

以下のワークエリアアドレスについてN60-BASICと揃えました。使い方が微妙に異なるなど完全互換になっていないものもあると思うので、参考程度と思ってください。mkII/6601のワークエリアとは一部アドレスが異なるものもあるので注意が必要です。

アドレス概要 詳細
FA00h〜FA01h 割り込みアドレス (未使用)
FA02h〜FA03h 割り込みアドレス (通常キー入力)
FA04h〜FA05h 割り込みアドレス (RS-232C受信)
FA06h〜FA07h 割り込みアドレス (2msタイマ)
FA08h〜FA09h 割り込みアドレス (CMT受信)
FA0Ah〜FA0Bh 割り込みアドレス (未使用)
FA0Ch〜FA0Dh 割り込みアドレス (未使用)
FA0Eh〜FA0Fh 割り込みアドレス (CMT出力STOP)
FA10h〜FA11h 割り込みアドレス (CMT受信STOP)
FA12h〜FA13h 割り込みアドレス (CMT受信エラー)
FA14h〜FA15h 割り込みアドレス (特殊キー入力)
FA16h〜FA17h 割り込みアドレス (ゲームキー問い合わせ応答)
FA18h STOPキーフラグ 03h=STOP 1Bh=ESC
FA19h CMT受信フラグ bit1=受信 bit4=エラー
FA1Ah 入力デバイス 0=キーボード 2=RS-232C 80h〜FFh=テープ
FA1Dh CMT受信データ
FA1Eh CLOAD時の*点滅状態
FA1Fh ボーレート 00h=600ボー FFh=1200ボー
FA20h 画面縦サイズ 10h
FA27h ポートB0hに出力した値 1B54hで使用
FA28h〜FA2Bh TIME用データ 2/975秒ごとに+2
FA2Dh CONSOLE第4パラメータ クリック音発生フラグ
FA2Eh カーソル点滅フラグ 00h=点滅させない 01h=点滅させる
FA2Fh カーソル反転状態 00h=ノーマル FFh=反転
FA30h グラフィックキー用ワーク
FA31h グラフィックキーフラグ 00hか14h
FA32h ファンクションキー用カウンタ FB8Dhと組み合わせて入力処理される
FA51h〜FA55h 乱数シード
FA57h プリンタヘッド位置
FA58h 出力デバイス 0=CRT 1=プリンタ 2=RS-232C 80h〜FFh=テープ
FA5Bh〜FA5Ch SPの初期値
FA5Dh〜FA5Eh BASIC実行中の行番号
FA5Fh〜FA60h BASICプログラム開始アドレス C401hか8401h
FA61h〜FAE4h BASIC命令ジャンプテーブル 中間言語80h〜C1h
FAE5h〜FB3Ch BASIC関数ジャンプテーブル 中間言語D4h〜FFh
FB3Dh〜FB8Ch ファンクションキー文字列 8文字×10
FB8Dh ファンクションキーアドレス FA32hと組み合わせて入力処理される
FB8Fh キーバッファに入れる位置 00h〜3Fh
FB90h キーバッファから出す位置 00h〜3Fh
FB92h 最大バッファ位置 3Fh
FB93h〜FB94h キーバッファアドレス FBB9h
FB95h〜FB9Ah RS-232C用バッファ制御 役割はFB8Fh〜FB94hと同じ, アドレスはFBF9hを指す
FBA1h〜FBA6h PLAYチャンネルAバッファ制御 役割はFB8Fh〜FB94hと同じ, アドレスはFC39hを指す
FBA7h〜FBACh PLAYチャンネルBバッファ制御 役割はFB8Fh〜FB94hと同じ, アドレスはFC79hを指す
FBADh〜FBB2h PLAYチャンネルCバッファ制御 役割はFB8Fh〜FB94hと同じ, アドレスはFCB9hを指す
FBB9h〜FBF8h キー入力バッファ
FBF9h〜FC38h RS-232Cバッファ
FC39h〜FC78h PLAYチャンネルAバッファ
FC79h〜FCB8h PLAYチャンネルBバッファ
FCB9h〜FCF8h PLAYチャンネルCバッファ
FD14h PLAYチャンネル 00h〜02h
FD15h V,S退避
FD17h PLAY文字数
FD18h PLAY文字列アドレス
FD1Bh 演奏状態 ビット0,1,2=チャンネルA,B,C(1=演奏中)
FD1Dh〜FD1Eh チャンネルA 音符残り時間
FD1Fh チャンネルA 文字数
FD20h〜FD21h チャンネルA 文字列アドレス
FD2Ch チャンネルA O値
FD2Dh チャンネルA L値
FD2Eh チャンネルA T値
FD2Fh チャンネルA V,S値
FD30h〜FD31h チャンネルA M値
FD42h〜FD66h チャンネルBワーク 役割はFD1Dh〜FD41hと同じ
FD67h〜FD8Bh チャンネルCワーク 役割はFD1Dh〜FD41hと同じ
FD8Ch ページ数 01h〜04h
FD8Dh〜FD8Eh BASICエリア最終アドレス
FD8Fh SCREEN第2パラメータ-1 アクティブ画面
FD90h SCREEN第3パラメータ-1 表示画面
FD91h VRAMアドレス上位バイト
FD92h SCREEN第1パラメータ-1 スクリーンモード
FD93h COLOR第1パラメータ
FD94h COLOR第2パラメータ
FD95h COLOR第3パラメータ COLOR,,1なら0、COLOR,,2なら2が入る
FD96h〜FD98h スクリーンモード1のCOLORパラメータ
FD99h〜FD9Bh スクリーンモード1のCOLORパラメータ
FD9Ch〜FD9Eh スクリーンモード1のCOLORパラメータ
FD9Fh〜FDA1h スクリーンモード1のCOLORパラメータ
FDA2h CONSOLE開始行+1 01h〜10h
FDA3h CONSOLE最終行+1 01h〜10h
FDA4h CONSOLE開始行+1 01h〜10h
FDA5h 表示最終行 (テキストモードなら(FDA3h)-(FDA6h)) 01h〜10h
FDA6h CONSOLE第3パラメータ ファンクションキー表示フラグ
FDA7h ファンクションキー表示状態
FDA8h カーソル位置Y+1 01h〜10h
FDA9h カーソル位置X+1 01h〜20h
FDAAh カーソルアドレス
FDACh 画面横サイズ 10hか20h
FDAEh〜FDAFh グラフィック命令X座標
FDB0h〜FDB1h グラフィック命令Y座標
FDB7h〜FDC6h 次の行との接続状態 00h=接続している
FDC8h〜FDFEh ページ1用ワーク 役割はFD91h〜FDC7hと同じ
FDFFh〜FE35h ページ2用ワーク 役割はFD91h〜FDC7hと同じ
FE36h〜FE6Ch ページ3用ワーク 役割はFD91h〜FDC7hと同じ
FE6Dh〜FEA3h ページ4用ワーク 役割はFD91h〜FDC7hと同じ
FEA4h〜FEA5h スクリーンエディタのカーソル初期位置
FEA6h スクリーンエディタのカーソルX座標最大値 01h〜20h
FEA8h INSフラグ FFh=インサートモード
FEAAh STOP時のSCREEN第2パラメータ-1 アクティブ画面
FEABh STOP時のSCREEN第3パラメータ-1 表示画面
FEACh アトリビュートデータ
FEADh〜FEAEh グラフィック命令X座標
FEAFh〜FEB0h グラフィック命令Y座標
FEC5h PAINT境界色アトリビュート
FEC6h PAINT境界色カラーコード
FECAh ゲームキー状態 1061hを呼ぶことなどで更新される
7 スペース
6 0
5
4
3
2
1 STOP
0 SHIFT
FED1h〜FED6h CLOADファイル名
FED8h CLOAD?フラグ 00h=CLOAD FFh=CLOAD?
FEDAh〜FF21h スクリーンエディタ用入力バッファ 71文字
FF25h 00h=数値 01h=文字
FF27h 文字領域最終アドレス
FF29h BASIC領域開始アドレス C400hか8400h
FF2Dh〜FF30h ストリングディスクリプタ1
FF31h〜FF34h ストリングディスクリプタ2
FF35h〜FF38h ストリングディスクリプタ3
FF39h〜FF3Ch ストリングディスクリプタ4
FF3Dh〜FF3Eh 文字領域使用中開始アドレス-1
FF45h〜FF46h DATA文行番号
FF4Eh〜FF4Fh BASIC実行アドレス
FF52h〜FF53h STOP時の行番号
FF54h〜FF55h STOP時のアドレス
FF56h〜FF57h 変数領域開始アドレス
FF58h〜FF59h 配列領域開始アドレス
FF5Ah〜FF5Bh フリーエリア開始アドレス
FF5Ch〜FF5Dh DATAコマンド用アドレス
FF5Eh〜FF5Fh FN()変数名
FF60h〜FF64h FN()引数の値
FF66h〜FF6Ah フローティングアキュムレータ1
FF6Dh〜FF71h フローティングアキュムレータ2
FF72h〜FF76h フローティングアキュムレータ3
FF93h〜FF95h スクリーンエディタ用フック
FF99h〜FF9Bh リンクポインタ更新用フック
FFD8h〜FFDAh STOPキー用フック
FFDBh〜FFDDh RST 18H用フック
FFE1h〜FFE3h RST 38H用フック

おまけ:ターミナル用P6エミュレータ

ターミナル上で動くPC-6001エミュレータを書いてみたので、おまけとして紹介します。どうやっても再現度に限界のあるアプローチですが、その分手軽に扱える面もあるのではないかと。2条項BSDライセンスでの利用が可能です。

ターミナル用P6エミュレータの画像
ターミナル上でP6エミュレータ

mkIIの画像
初代機とmkIIに対応

オリオンの画像 クエストの画像
簡易グラフィック表示を実装

特徴

使い方の詳細については、同梱のreadme.htmlをご覧ください。

2023.1.22バージョン


おまけ:戦士のカートリッジmkII用プログラム

戦士のカートリッジmkII (新ベルーガカートリッジ) 用の、CLOADルーチンを上書きしてフラッシュROMからテープイメージを読み込めるようにするプログラムです。

  1. Ctrl+A〜Ctrl+Xで起動できるROMブロックにselector.binもしくはselector2.binを書き込みます。
  2. 読み込みたいテープイメージをct8k.exeで8KBずつに分割して、どこかのブロックから順番に(隙間を空けずに)書き込みます。
  3. Ctrlで起動します。
  4. 読み出したい先頭ブロックをカーソルキーで選択し、スペースキーを押します。
  5. BASICが起動したら、CLOADなど通常通りの手順で動かしてください。

※BASIC ROMを外部RAMにコピーしてパッチを当てる方式です。
※ROM内ルーチン (1A61h,1A70h) を使用せずにロードを行うプログラム (ドアドアmkIIやオホーツクに消ゆなど) には使えません。
※ワークエリアとしてRS-232C用バッファを使うので、RS-232Cとの併用並びに同じ領域を利用するプログラムでの利用はできません。
※SRのモード6では使えません。


参考文献


トップ > 雑多なもの > PC-6001用互換BASIC