CZ-8FB03(New Z-BASIC)の解析ついでに、予約語と中間コードとジャンプテーブルの表を作りました。CZ-8FB01 V2.0はどこに埋まってしまったのやら・・・
表を作ってみて、ほとんど使った経験の無いCZ-8CB01 V1.0には、いくつかの命令(関数)が無い事を知りました。例えば、あの変態関数のCALC関数。
CZ-8CB01 V1.0だけは他にも無い関数があって、デバイスの空きクラスタを返すDEVF関数も無く、FILES命令で空きクラスタの表示が無いため、EMMの残り容量が不明・・・
CZ-8FB01 V1.0では、この時点で既に階層ディレクトリに対応していて、turbo BASICで作成したディレクトリの表示のみ対応しています。
CZ-8FB03のMOVMEM命令にある制限が極めて不便なので、これを解消します。
例の表から、MOVMEM命令は0E38Hから始まります。そこから解析を始めると、少し進んだ所にパラメータの範囲チェックがありました。
まず、バンク番号0のチェックを回避します。
0E75 OR A ;バンク番号が0か? 0E76 CALL Z,066EH ;エラー(Illegal function call)へ 0E79 CP 10H ;バンク番号最大値チェック 0E7B CALL NC,066EH ;エラー(Illegal function call)へ 0E7E POP HL
0E76Hでエラーに飛ばないように、0E76Hの内容を CCH → 21H と変更します。これでバンク0へのアクセスが可能になります。
次に、バンク1への制限を無くします。
0E80 CP 01H ;バンク番号が1か? 0E82 JR NZ,0E90H ;バンク番号が1以外なら分岐 0E84 LD A,H 0E85 CP 60H ;アドレスが60xxHよりも・・・
バンク番号が1でも他バンク同様の処理になるように、0E82Hの内容を 20H → 18H と変更します。これでバンク1の0000H~6000Hへアクセス可能になります。
MOVMEM(バンク番号, 転送元アドレス, 転送先アドレス, 転送バイト数)
パラメータ パラメータの範囲
バンク番号 0~15
転送元アドレス メインメモリの場合、8000H~。バンクメモリの場合、~7FFFH。
転送先アドレス
転送バイト数 0001H~8000H
VPOKE,VPEEK命令は、バンク0を対象にできない仕様なので見なかったことに・・・
デバイス数のテーブル
デバイス数を変更する事はあまり無いと思いますが、ハードディスクを大量に接続する際に変更します。
アドレス デバイス名 デバイス数 FDCNO(FADDH)の値
32DCH(31FEH) SCR 1 0
32DDH(31FFH) CRT 1 1
32DEH(3200H) KEY 1 2
32DFH(3201H) LPT 1 3
32E0H(3202H) CAS 1 4
32E1H(3203H) MEM 2 5
32E2H(3204H) EMM 10 6
32E3H(3205H) 0:~3: 4 7
32E4H(3206H) F(8"FD) 4 8
32E5H(3207H) HD 4 9
32E6H(3208H) COM 1 10
アドレスはCZ-8FB02 V1.0のものです。カッコ内はCZ-8FB03 V1.0のアドレスです。
EMMを36個にしてMEMA:~MEMZ:なんて事も・・・BIOSでの上限は16なので、頑張れば16までは増やせる?
ハードディスクのFAT領域レコード数
HDの使用可能領域を16MB化する際に書き換えます。もちろんBIOSの書き換えで上限値の撤廃とHDD側の対応も必要です。
アドレス 初期値 16MB化
32AFH(31D1H) 14H(10進で20) 20H(10進で32)
アドレスはCZ-8FB02 V1.0のものです。カッコ内はCZ-8FB03 V1.0のアドレスです。
デフォルトのデバイス
DEVICE命令と同じ文字列を右詰め(後ろ詰め?)で格納し、余った領域はスペース(20H)で埋められます。
アドレス バイト数 内容
F5DCH(F5DAH) 5 デバイス名
アドレスはCZ-8FB02 V1.0のものです。カッコ内はCZ-8FB03 V1.0のアドレスです。
DEVICE"HD1:"の場合は次のようになります。
アドレス 内容 文字コード
F5DCH(F5DAH) " " 20H
F5DDH(F5DBH) "H" 48H
F5DEH(F5DCH) "D" 44H
F5DFH(F5DDH) "1" 31H
F5E0H(F5DEH) ":" 3AH
アドレスはCZ-8FB02 V1.0のものです。カッコ内はCZ-8FB03 V1.0のアドレスです。
階層ディレクトリのバッファ
デバイスのカレントディレクトリがルートのときは使用していません。
アドレス バイト数 内容
7573H(6D12H) 256 デバイス名+ディレクトリ名(未使用領域は01Hを充填)
アドレスはCZ-8FB02 V1.0のものです。カッコ内はCZ-8FB03 V1.0のアドレスです。
例えば、"EMM0:"が"/PIYO"ディレクトリになっているとき、"EMM0:/PIYO/"+CHR$(0)+CHR$(1)がバッファに格納されています。
このバッファは全デバイスで共用しているため、不足する事が有ります。不足した際に運が悪いと恐ろしい事が・・・気をつけましょう。