HuBASICの解析


目次


予約語と中間コードとジャンプテーブル

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)SCR10
32DDH(31FFH)CRT11
32DEH(3200H)KEY12
32DFH(3201H)LPT13
32E0H(3202H)CAS14
32E1H(3203H)MEM25
32E2H(3204H)EMM106
32E3H(3205H)0:~3:47
32E4H(3206H)F(8"FD)48
32E5H(3207H)HD49
32E6H(3208H)COM110
アドレスは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)がバッファに格納されています。

このバッファは全デバイスで共用しているため、不足する事が有ります。不足した際に運が悪いと恐ろしい事が・・・気をつけましょう。