PC-6001用の互換BASICを書いてみました。実機のBASIC ROMの代替品として使用できます。まだまだバグや不具合があると思うので、気付いた点があれば教えてもらえると幸いです。LGPLでの利用が可能です。(PC-6001mkII/6601用の互換BASICも公開中です)
(2024.6.15 Ver.0.8を公開しました。)
(2023.1.22 ターミナル用P6エミュレータを更新しました。)
詳細については各エミュレータのマニュアルなどを参照してください。
※PC6001VXなどで、エミュレータに内蔵されているバージョンの互換BASIC ROMや互換CGROMを使用する場合はこうした準備は不要です。
※PCS-6001R 拡張BASICカートリッジとの併用はできません。
エミュレータを動かすためには、BASICROM.60の他にCGROM60.60というフォントファイルが必要です (機種をPC-6001と指定した場合)。これについては同梱していませんので、利用者が各自用意する必要があります。方法としては、以下の四つがあると思います。
これができれば一番です。詳しくは、Hashiさんのサイトの「BIOS吸出し手順」やTINY野郎さんのサイトの「新・PC-6001シリーズのBIOSデータをデータレコーダーもフロッピーも使わずにPCに移す」などを参照してください。
実機フォントのドットパターンに依存したプログラムの場合、これ以外の方法ではうまく動かないことがあります。
エミュレータ上で使えるように一から制作された独自のフォントがいくつか公開されています。ダウンロードして展開するだけ!ありがたや。
ばんばんさんが制作されたCGROM交換ツール (p6font.exe) を使うと、自分でCGROMファイルを作成できます。写真などを見ながら本物のフォントを再現するのも良いですし、自分ならではのフォントを作成して使うのも面白いかもしれません。
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をコンパイルして使ってください。出力ファイルは確認なく上書きするので注意してください。オプションは以下の通りです。
※変換したフォントファイルの扱いには十分注意してください。再配布はもちろん、他OSでの使用や変換自体を制限するライセンスのフォントもあるようです。
k8x12Lを変換した例
美咲フォントの明朝体を変換した例
東雲フォントの12ドット丸文字を変換した例
かつて販売されたり雑誌に掲載された自作ゲームを公開されている方、作者の許可を得て公開されている方、新作ゲームを公開されている方などがいらっしゃいます。P6を持っていない、エミュレータで初めてP6に触れてみたけれど何をしたらいいかわからない、という方は、まずこの辺りから試してみるといいかもしれません。感謝しつつ遊ばせてもらいましょう。
Ver.0.7以降はLGPL、それより前は非LGPLです。
以下のルーチンのアドレスや入出力レジスタなどを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 |
| ||||||||||||||||
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,DE | A=モード-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 出力
| ||||||||||||||||
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,B | 1A61hコール後、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,CY | AF,BC,DE | HL=FED9h(入力バッファ-1) STOP入力時はCY=1 | ||||||||||||||||
2905h | INPUT用1行入力 | - | HL,CY | AF,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 | |
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を呼ぶことなどで更新される
| ||||||||||||||||
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用フック |
ターミナル上で動くPC-6001エミュレータを書いてみたので、おまけとして紹介します。どうやっても再現度に限界のあるアプローチですが、その分手軽に扱える面もあるのではないかと。2条項BSDライセンスでの利用が可能です。
ターミナル上でP6エミュレータ
初代機とmkIIに対応
使い方の詳細については、同梱のreadme.htmlをご覧ください。
戦士のカートリッジmkII (新ベルーガカートリッジ) 用の、CLOADルーチンを上書きしてフラッシュROMからテープイメージを読み込めるようにするプログラムです。
※BASIC ROMを外部RAMにコピーしてパッチを当てる方式です。
※ROM内ルーチン (1A61h,1A70h) を使用せずにロードを行うプログラム (ドアドアmkIIやオホーツクに消ゆなど) には使えません。
※ワークエリアとしてRS-232C用バッファを使うので、RS-232Cとの併用並びに同じ領域を利用するプログラムでの利用はできません。
※SRのモード6では使えません。