PC-6001mkII/6601用互換BASIC

PC-6001用に続き、PC-6001mkII/6601用の互換BASICを書いてみました。実機のBASIC ROMの代替品として使用できます。現在、少しずつ対応コマンドを増やしているところ。LGPLでの利用が可能です。

(2023.1.9 Ver.0.4.2を公開しました。)

PC-6001mkII/6601用互換BASICの画像
PC-6001mkII/6601用互換BASIC


目次


Ver.0.4.2の状況


使い方

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

  1. PC-6001mkII/6601用互換BASIC Ver.0.4.2をダウンロードして展開します。
  2. 展開した中にあるROMファイルをエミュレータの指定するところに置きます。実機から吸い出したファイルが既にある場合、本物を上書きしてしまわないよう注意してください。
  3. PC-6001mkIIで使用する場合はBASICROM.62とVOICEROM.62を、PC-6601で使用する場合はBASICROM.66とVOICEROM.66を使います。(ファイル名が違うだけで中身は同じです)
  4. エミュレータにCRCチェック機能がある場合は無効に、互換ROM使用チェックがある場合は有効にします。
  5. 他に、PC-6001mkIIではKANJIROM.62、CGROM60.62、CGROM60m.62の3ファイル、PC-6601ではKANJIROM.66、CGROM60.66、CGROM66.66の3ファイルが必要です。無い場合は次節を参照してください。

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


CGROM/KANJIROMファイルについて

エミュレータを動かすためにはフォントファイルが必要です。これについては同梱していませんので、利用者が各自用意する必要があります。方法としては、以下の三つがあると思います。

1.実機から吸い出す

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

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

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

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

また、CGROM60.62/CGROM60.66に関しては、初代機用のフォントも利用できます。mkII/6601ではサイズが8KBである必要があるため、同じものを二つ連結させてサイズを倍にしたものを作成するのが手っ取り早いかと思います。KANJIROMについては、漢字を使用しないのであれば、とにかくサイズ32KBのファイルを用意すれば動く場合が多いようです。

3.自分で打ち込む

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

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

BDF形式のビットマップフォントを元にしてフォントファイルを生成するプログラムを同梱しました。TTFやPCFなど他形式のフォントファイルを使いたい場合は、otf2bdfやpcf2bdfといったBDFへの変換プログラムを併用すればうまくいくかもしれません。

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

bdf2cgrom66 [-ascii] [-ascent] fontfile60.bdf [fontfile66.bdf] (CGROM60.66とCGROM66.66が出力される)

bdf2kanjirom [-ascent] fontfile.bdf (KANJIROM.66が出力される)

のように打ち込みます。出力ファイル名は固定で、既にファイルがあれば上書きされます。CGROMについては、CGROM60.66 (モード1-4用8×12フォント) とCGROM66.66 (モード5用8×10フォント) それぞれに対して元ファイルを別個指定することもできます。入力ファイルが1個ならば両方ともそのファイルから生成されます。Windows以外のOSでは、src/bdf2cgrom.cをコンパイルして使ってください。オプションの意味は以下の通りです。

-asciiオプション
1バイト文字集合のフォントを変換します。仮名文字やグラフィック文字などは空白となります。
-ascentオプション
bdfフォントの縦サイズ判断に、FONT_ASCENTとFONT_DESCENTを使用します。元フォントによっては、使用する方が適切な文字サイズになるかもしれません。

mk2の場合は、CGROM60.62、CGROM60m.62 (エミュレータによってはCGROM62.62)、KANJIROM.62にそれぞれリネームしてください。

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

※モード5のセミグラフィック文字の変換は限定的なものです。BDFファイルに含まれない文字は、機械的に生成したり似たような文字を使ったり二種類の記号をむりやり合成したりするようにしました。また、人間文字はどうにもならないので、●■=のようなフォントになります。

※変換したCGROM60.66をPC-6601で使用する場合、実機から吸い出したBASICROM.66と組み合わせて使用することはできません。実機のCGROM60.66にはフォント以外のデータやプログラムが含まれており、実機BASICROM.66はその部分を利用しているようです。実機BASICROM.66と組み合わせたい場合は、変換したCGROM60.66の先頭6656バイトと実機CGROM60.66の末尾1536バイトを連結したファイルを用意してください。mkIIでBASICROM.62と組み合わせる場合はそのままで使えるはずです。

美咲フォントの画像
美咲フォントのゴシック体を変換した例

おまけ:拡張漢字ROM

エミュレータでの対応はまちまちですが、拡張漢字ROM (PC-6601-01やPC-6007SR) 相当のフォントファイルをBDFファイルから生成するプログラムも同梱しました。出力ファイル形式の違いにより、以下の2種類のプログラムがあります。

プログラム名 形式 対応エミュレータ
bdf2exkanji saverkanji/EXKANJI.ROM形式 iP6 Plus 4.9以降、PC-6001F、PC6001Vなど
bdf2extkanji ksaver/EXTKANJI.ROM形式 iP6 Plus 4.5〜4.8

コマンドラインより

bdf2exkanji [-f] [-jisx0213] [-ascent] [-8 pc8001fie] fontfile.bdf outfile

もしくは

bdf2extkanji [-f] [-jisx0213] [-ascent] [-8 pc8001fie] fontfile.bdf outfile

のように打ち込んで使います。出力ファイルは確認なく上書きするので注意してください。オプションは以下の3種です。

-fオプション
N66/N66SR-BASICでは、フォントファイルの特定のアドレスの値を確認することで拡張漢字ROMの判定をしているようです。そのため異なるフォントで拡張漢字ROMイメージを生成すると、認識されない可能性があります。このオプションを付けるとN66/N66SR-BASICでも認識されるようになりますが、「Y」の文字 (拡張漢字コード89) の字形が崩れます。互換BASICでは判定が緩めなのでオプション無しでも認識します。
-jisx0213オプション
可能であれば、拡張漢字コードの空き部分をJIS X 0213文字で埋めます。
-ascentオプション
bdfフォントの縦サイズ判断に、FONT_ASCENTとFONT_DESCENTを使用します。元フォントによっては、使用する方が適切な文字サイズになるかもしれません。
-8オプション
指定したフォントファイル (サイズ2KB) を、PC-8001/8801キャラクタセット相当部分 (拡張漢字コード256-511) にコピーして使用します。PC-8001などを持っている場合は使うと良いでしょう。

拡張漢字ROMの実物データを吸い出したい時は、Windyさんによるksaverや、えすびさんによるsaverkanjiを使うと便利です。ksaverとsaverkanjiとではデータの形式 (並び方) が異なりますが、相互に形式を変換するプログラムを置いておきます。(ソース / Windows用実行ファイル)


旧バージョン


現在判明している不具合


ROM内ルーチン

以下のルーチンのアドレスや入出力レジスタなどをN66-BASICと揃えました。初代機にもあるルーチンについては、PC-6001用互換BASICの解説を参照してください。

アドレス概要 入力出力破壊 詳細
2030h 音階データ - - - O1C〜O1B各音に対応するPSGレジスタ0,1のデータ
397Ah 10進表示 A - AF,BC,DE,HL 符号無し
3995h BASICモードチェック - A,Z F A=モード-1 モード5ならZ=0
4000h(VOICEROM) 音声合成 E,HL - AF,BC,DE,HL, AF',BC',D',HL' E=文字数 HL=文字列アドレス
4274h FDDアクセス A,BC,DE, IX,CY,Z, (IX+0), (IX+1Bh) CY F,DE A=セクタ数 B=トラック C=開始セクタ DE=アドレス IX=ワークアドレス (IX+0)=ドライブ番号-1 (IX+1Bh)=エラーカウント初期値 読み込み(CY=0/Z=0) チェック(CY=0/Z=1) 書き込み(CY=1) エラーならカウント+1してCY=1で返るが、カウントが10回以上になると??IO Error
42B9h FDD接続確認 - A,Z F,BC,DE,HL A=接続FDD数 FDD無しならZ=1
51F2h FATポインタ設定 A,IX Z, (IX+0), (FB33h)〜(FB34h) AF,DE IX=ワークアドレス A=ドライブ番号-1 Z=0ならリムーブ済 (IX+0)=ドライブ番号-1 (FB33h)=FATポインタ(ドライブポインタ)
5CFDh FDDアクセス A,BC,HL, IX,CY,Z, (IX+0) CY F,HL A=セクタ数 B=トラック C=開始セクタ HL=アドレス IX=ワークアドレス (IX+0)=ドライブ番号-1 読み込み(CY=0/Z=0) チェック(CY=0/Z=1) 書き込み(CY=1) エラーが10回連続すると??IO Error。ただしFAT領域のエラーならCY=1で帰る。破壊レジスタについては資料無し
63E2h スクロール(モード5) HL - AF H=Y上+1 L=Y下+1 指定は行単位。グラフィック画面でも使用可
642Fh 逆スクロール(モード5) HL - AF H=Y下+1 L=Y上+1 指定は行単位。グラフィック画面でも使用可
65CCh VRAMアドレス変換(モード5) HL HL - キャラクタモードでのアドレスをグラフィックモードでのアドレスに変換
69F3h 境界色設定(モード5) A - AF,BC
6B7Ah COLOR第3パラメータ実行(モード5) A,C - AF A=カラーセット-1 C=スクリーンモード-1
70E7h LINE BF(モード5) BC,DE,(FEADh)〜(FEAEh),(FEAFh)〜(FEB0h),(FEACh),(FE60h) - AF,BC,DE BC=X1 DE=Y1 (FEADh)〜(FEAEh)=X2 (FEAFh)〜(FEB0h)=Y2 (FEACh)=アトリビュート1 (FE60h)=アトリビュート2
7122h LINE B(モード5) 同上 - AF,BC,DE 同上
7161h PAINT(モード5) (SP+3)〜(SP),(FEACh),(FEC5h),(FEC6h),(FE60h),(FE61h) - AF,BC,DE (SP+3,SP+2)=X (SP+1,SP)=Y (FEACh)=領域色アトリビュート1 (FE60h)=領域色アトリビュート2(FEC5h)=境界色アトリビュート1 (FE61h)=境界色アトリビュート2 (FEC6h)=境界色カラーコード
716Ah PAINT(モード5) BC,DE,(FEACh),(FEC5h),(FEC6h),(FE60h),(FE61h) - AF,BC,DE BC=X DE=Y (FEACh)=領域色アトリビュート1 (FE60h)=領域色アトリビュート2(FEC5h)=境界色アトリビュート1 (FE61h)=境界色アトリビュート2 (FEC6h)=境界色カラーコード
FE8Dh RAMを読む HL A - HL=アドレス
FE93h RAMでのLDIR BC,DE,HL BC,DE,HL F 終了後はBC=0,DE=DE+BC,HL=HL+BC,SZCフラグに変化無し
FE98h BASIC ROMに切り替え - - - 0000h-7FFFhをバンク切り替え
FEA5h RAMでのLDDR BC,DE,HL BC,DE,HL F 終了後はBC=0,DE=DE-BC,HL=HL-BC,SZCフラグに変化無し

以下のBASIC命令についてのアドレスもN60m/N66-BASICと揃えてあります。パラメータ文字列のアドレスをHLに入れてコールすると、各命令と同じ処理を行います。

アドレス命令
4A72h CIRCLE
6B4Ah COLOR
6B9Bh SCREEN (モード5)
70C9h LINE (モード5)

ワークエリア

以下のワークエリアアドレスについて実機BASICと揃えました。使い方が微妙に異なるなど完全互換になっていないものもあると思うので、参考程度と思ってください。初代機のワークエリアから一部アドレスが変更になっているものもあるので注意が必要です。N60-BASICモードであってもこちらのアドレスになります。

アドレス概要 詳細
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用データ 約2msごとに+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=テープ
FA5Ah 特殊キーフラグ ビット0=CAPS ビット1=SHIFT+PAGE ビット2=かな ビット3=MODE
FA5Bh〜FA5Ch SPの初期値
FA5Dh〜FA5Eh BASIC実行中の行番号
FA5Fh〜FA60h BASICプログラム開始アドレス モード1,3=C401h モード2,4=8401h モード5ページ1,2,3,4=8001h,8001h,8801h,C801h
FA61h〜FAE4h BASIC命令ジャンプテーブル 中間言語80h〜C1h
FAE5h〜FB30h BASIC関数ジャンプテーブル 中間言語D4h〜F9h
FB31h ファイル数
FB33h〜FB34h FATバッファのアドレス
FB35h〜FB36h ファイルバッファのアドレステーブルのアドレス
FB37h〜FB38h 0番バッファのデータアドレス
FB39h〜FB3Ah 操作中のファイルバッファのアドレス
FB3Bh ドライブ数
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バッファ
FCF9h Fレジスタの値 MON用
FCFAh Aレジスタの値 MON用
FCFBh Cレジスタの値 MON用
FCFCh Bレジスタの値 MON用
FCFDh Eレジスタの値 MON用
FCFEh Dレジスタの値 MON用
FCFFh Lレジスタの値 MON用
FD00h Hレジスタの値 MON用
FD02h〜FD03h PCレジスタの値 MON用
FD04h〜FD05h SPレジスタの値 MON用
FD06h〜FD07h ブレークポイントアドレス1 MON用
FD08h〜FD09h ブレークポイントのデータ退避1 MON用
FD0Ah〜FD0Bh ブレークポイントアドレス2 MON用
FD0Ch〜FD0Dh ブレークポイントのデータ退避2 MON用
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パラメータ 出力用に処理された後の値
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座標
FDB5h〜FDB7h 前の行との接続状態 下のビットから順に1行1ビット, 0=接続している
FDB9h〜FDE0h ページ1用ワーク 役割はFD91h〜FDB7hと同じ
FDE1h〜FE08h ページ2用ワーク 役割はFD91h〜FDB7hと同じ
FE09h〜FE30h ページ3用ワーク 役割はFD91h〜FDB7hと同じ
FE31h〜FE58h ページ4用ワーク 役割はFD91h〜FDC7hと同じ
FE59h〜FE5Ah スクリーンエディタのカーソル初期位置
FE5Bh スクリーンエディタのカーソルX座標最大値 01h〜20h
FE5Ch INSフラグ FFh=インサートモード
FE5Eh STOP時のSCREEN第2パラメータ-1 アクティブ画面
FE5Fh STOP時のSCREEN第3パラメータ-1 表示画面
FE60h アトリビュートデータ2
FE61h 境界色アトリビュート2
FE65h BASICモード-1
FEACh アトリビュートデータ1
FEADh〜FEAEh グラフィック命令X座標
FEAFh〜FEB0h グラフィック命令Y座標
FEC5h PAINT境界色アトリビュート1
FEC6h PAINT境界色カラーコード
FEC7h ファンクションキーを表示できる文字数 モード1〜4=5 モード5=6
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領域開始アドレス モード1,3=C400h モード2,4=8400h モード5ページ1,2,3,4=8000h,8000h,8800h,C800h
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用フック
FFE6h CIRCLEのアスペクト比
FFFCh〜FFFDh FATバッファのアドレステーブルのアドレス

また、モード3〜5では、IXレジスタが指す付近のアドレスもワークエリアとして使っています。

アドレス概要 詳細
IX+00h ドライブ番号-1
IX+02h セクタ
IX+03h Rオプションの有無 LOAD, BLOAD
IX+05h ファイル名バッファ1 拡張子含め9バイト
IX+0Eh ファイル名バッファ2 拡張子含め9バイト
IX+18h ASCII形式かどうか 00h=ASCII形式以外
IX+19h BLOADでのアドレス指定 01h=指定なし FFh=あり
IX+1Bh エラーカウンタ 4274hなどで使用
IX+2Bh PAD() X座標
IX+2Ch PAD() Y座標

IXの値は以下の通りです。

モード ページ IX
3,4 1 F9D2h
2 DFD2h
3 BFD2h
4 9FD2h
5 F9D2h

参考文献


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