PB-1000の機械語エリアは「最大4KB」と制限がある為、これを越えるプログラムを作成する場合は、
使用されていない領域(仮想スクリーンの下画面の領域や数式記憶機能領域)を使ったり、
使用するデータまたはプログラムの入ったファイルを機械語エリア内へ転送を行ったりする等のテクニックが必要でした。
では、PB-1000では4KBを越える機械語プログラムを実行する事は不可能なのでしょうか?
以下の方法を用いれば、4KB以上の機械語プログラムを実行出来る環境を作る事が出来ます。
これで従来は出来なかった大容量の機械語ソフトが実行可能になるなど、PB-1000の可能性がより広がる事でしょう。
機械語の為の領域を4KB以上確保する方法は2つあります。
「機械語エリアを4KB拡張する方法」と、「ディレクトリ領域を移動させて機械語領域を確保する」方法です。
(本文中の「機械語エリア」とは、PB-1000のSYSTEMコマンドで確保出来る機械語の為の領域で、
「機械語領域」は機械語の為に確保するメモリ領域の事です。紛らわしくて申し訳ありません。)
方法1.機械語エリアを4KB以上拡張する方法
ファイルが登録されていない状態で、以下の手順を実施すると機械語エリアを4KB以上拡張する事が出来ます。
(ファイルが登録されていないのでポインタの書き換えだけで済む)
実行手順 | 操作例 (機械語エリアを10000バイトに設定する場合) |
|
1. | RAM上の全てのファイルを削除します。 | |
2. | CALモードにして、 CLEAR 0,0,100 [EXE] を実行します。 |
[CAL] CLEAR 0,0,100 [EXE] |
3. | 機械語エリアの最終アドレス (実際には機械語エリアの次のI/Oバッファの開始アドレス)を求めます。 PRINT HEX$(&H7000+確保したい機械語エリアのサイズ) [EXE] 表示されたアドレスの上位8ビット(左から2文字)を「数値A」に、 下位8ビット(右から2文字)を「数値B」とします。 |
PRINT HEX$(&H7000+10000) [EXE] 「9710」が表示されますので、 数値Aは「&H97」に、数値Bは「&H10」 になります。 |
4. | 以下のコマンドを実行して、ポインタの内容を書き換えます。 POKE &H692F,数値B [EXE] POKE &H6930,数値A [EXE] POKE &H6931,数値B [EXE] POKE &H6932,数値A [EXE] POKE &H6933,数値B [EXE] POKE &H6934,数値A [EXE] |
POKE &H692F,&H10 [EXE] POKE &H6930,&H97 [EXE] POKE &H6931,&H10 [EXE] POKE &H6932,&H97 [EXE] POKE &H6933,&H10 [EXE] POKE &H6934,&H97 [EXE] |
5. | プログラムの実行環境に合わせて、 CLEARコマンドにて文字変数領域・システムワークサイズを 再設定します(この時、機械語エリアの指定は省略します)。 CLEAR 文字変数領域,,システムワークサイズ [EXE] ※この時、文字変数領域+機械語領域<システムワークサイズ でなければなりません。 |
CLEAR 100,,10200 [EXE] (文字変数領域を100バイト、 システムワークサイズを10200にする場合) |
6. | SYSTEMコマンドで機械語エリアが指定したサイズになっている事を 確認します。 この時の機械語エリアは、&H7000番地から手順2で表示された結果 から1を引いたアドレスになります。 |
SYSTEM [EXE] 機械語エリアが「10000」になっている事に注目。 確保された機械語エリアは「&H7000〜&H970F」になります。 |
方法2.ディレクトリ領域を移動させて、機械語領域を確保する方法
PB-1000のメモリマップを見て頂ければお分かりになると思いますが、アドレス最上位(〜&HFFFF)には
ファイルのディレクトリ情報が記録されています。これは「名前」や「ファイル本体がメモリ上のどこに記憶してあるか」等の
ファイルについての情報が記録してある場所です。この領域をずらす事によって、自由に使用出来る領域を確保する事が出来ます。
実際には、DATDI〜DIRENまでの領域を&HFFFF以前に移動させ、ワークエリアにあるポインタ(DATDI,BASDI,DIREN)を移動したあとの
アドレスに書き換えます。ファイルが登録されていない状態で以下の操作を実施すると、ディレクトリ領域を移動出来ます。
(ファイルが登録されていないのでポインタの書き換えだけで済む)
実行手順 | 操作例 (ディレクトリ領域を移動し、機械語領域を 10000バイト確保する場合) |
|
1. | RAM上の全てのファイルを削除します。 | |
2. | SYSTEMコマンドで、変更前のフリーエリアのサイズを確認します。 | SYSTEM[EXE] |
3. | ワークエリア内にあるディレクトリ領域のポインタの示すアドレス を計算します。 PRINT HEX$(&HFFFF-確保したい機械語領域のサイズ) を実行します。 |
PRINT HEX$(&HFFFF-10000) [EXE] 「D8EF」が表示されますので、 数値Aは「&HD8」に、数値Bは「&HEF」 になります。 |
3. | 以下のコマンドを実行して、実際のポインタを書き換えます。 POKE &H6947,数値B [EXE] POKE &H6948,数値A [EXE] POKE &H6949,数値B [EXE] POKE &H694A,数値A [EXE] POKE &H694B,数値B [EXE] POKE &H694C,数値A [EXE] |
POKE &H6947,&HEF [EXE] POKE &H6948,&HD8 [EXE] POKE &H6949,&HEF [EXE] POKE &H694A,&HD8 [EXE] POKE &H694B,&HEF [EXE] POKE &H694C,&HD8 [EXE] |
4. | SYSTEMコマンドでフリーエリアが指定したサイズ分だけ 減っている事を確認します。 この時の機械語領域は、 &H7000番地から確保したアドレスを引いて1を足したアドレス になります。 |
SYSTEM [EXE] フリーエリアが10000バイト減った事を確認します。 (確保された機械語領域は「&HD8F0〜&HFFFF」になります。) |
この方法の場合、ディレクトリ領域を移動する事によって確保した領域はファイルシステムからは見えません。
よってSYSTEMコマンドのFREE表示も確保した領域を減算した値がフリーエリアとして表示されます。
備考1:&H8000以降に機械語プログラムを置く場合の注意
機械語プログラムを&H8000以降に置いた場合は、実行・システムコール呼び出し・終了などで以下の注意が必要です。
実行 | 機械語プログラムをRAM(バンク1)上に置いて実行する場合は、アドレスがROM(バンク0)と重複する為に、 &H7FFE以前の領域から「バンク切り替え」を行ってから、&H8000以降の領域にジャンプするようにします。 |
システムコールの 呼び出し |
&H7FFE以前の領域にジャンプして、バンク指定を0(ROM)に切り替えて、 システムコールを呼び出し(CALL)します。 その後、バンク指定を1(RAM)に切り替えて、元のアドレス(&H8000以降)に戻ります。 |
終了 | &H7FFE以前の領域にジャンプして、バンク指定を0(ROM)に切り替えて終了します。 |
システムコール呼び出しなどを行う度に&H7FFE以前の領域にジャンプする必要があるのは、
バンク位置(上位アドレス)を切り替えるUAレジスタは&H7FFE以前では、バンク指定を行っても必ずバンク0がアクセスされる為です。
※&H8000以降、バンク1(RAM)にいる状態でバンク切り替えを行うとバンク0(ROM)上の同じアドレスの次のアドレスに実行が移ってしまいます。
以下に実行サンプル("HELLO!PB-1000"の表示)を示します。
実行には2つのファイル(「起動・終了・システムコールの呼び出し」と「&H8000以降実行する機械語プログラム」)
に分かれます。実行用のBASICを含めて、実質3ファイル構成になります。
(実行するには事前に「方法2」を実行し、256バイト以上の領域を確保してください)
SAMPL1.ASM | 実行時処理・システムコール呼び出し・終了時処理を担当 |
PRLB1:EQU &H9664 ORG &H7000 ;START SAMPL |
システムコールのアドレス定義を行います。 START疑似命令をコメント化しているのは、 メニュー画面から容易に実行されないようにする為です。 |
SAMPL:PST UA,&H51 JP &HFF00 |
まず実行後、バンクを1(RAM)に切り替えて&HFF00へジャンプします。 |
SACAL:PST UA,&H50 CAL PRLB1 PST UA,&H51 RTN |
システムコールを呼び出す際にここに戻ってきます。 バンクを0(ROM)に戻して、システムコールを呼び出します。 そして再びバンクを1(RAM)に切り替えて戻ります。 |
RETRN:PST UA,&H50 RTN |
終了時はバンクを0(ROM)に戻して終わります。 |
SAMPL2.ASM | &HFF00以降のプログラム |
ORG &HFF00 HYOJI:LDW $15,TEXT LDW $17,15 CAL &H7006 JP &H7010 TEXT:DB "HELLO! PB-1000",13 |
表示したい文字情報を設定し、 システムコール呼び出しの為に&H7006(SACAL)へジャンプします。 プログラム終了時は&H7010(RETRN)へジャンプして終わります。 |
SAMPL3.BAS | BASIC部分は状況によって不必要な場合もあります。 (例えばSAMPL1.BINからSAMPL2.BINを&HFF00へ 転送するようなプログラムが組んであれば、 SAMPL1.BINだけ実行すれば良いので不要です。) |
10 BLOAD "SAMPL1.BIN",&H7000 20 BLOAD "SAMPL2.BIN",&HFF00 30 CALL &H7000 |
※上記プログラムは参考例で他にも効率の良い方法が色々あると思います(宜しかったらご連絡下さい ^^;)。
備考2:両方法のメリット・デメリットについて
|
両方法の手順は上記の通りですが、全てファイルが登録してない時を前提としています。 では、ファイルが登録されている場合はどうするのか・・? 方法1の場合は、機械語エリア以下の領域をずらした後にワークエリア内の それに対応するポインタの内容を書き換えて、 (ファイル本体の位置も移動するので)ディレクトリの内容まで書き換える必要があり、 変更量が非常に多いのですが、 方法2の場合はディレクトリ領域をずらし、それに対応するポインタを書き換えるだけです。 方法1では機械語ファイルは1つに収める事が出来ますが、 方法2では複数のファイルになります。) どちらを選ぶかは自分が作るプログラムに合わせると良いでしょう。 |
備考3:メモリ確保ユーティリティ登場!
今回「方法2」を追記するにあたって、メモリ確保ユーティリティを作成しました。 使い方は確保したいメモリ容量を[IN]で記憶させてからプログラムを実行するだけ! これでディレクトリ領域移動が簡単に行えます。 「プログラムライブラリ」にありますので、是非ご利用ください。 |
参考文献:ポケコンジャーナル'88 12月号「PAYOPAYO・PLUS(PBT氏)」(工学社)
ポケコンジャーナル’92 8月号「TRPMAN.EXE(ヨーゼフ・K氏)」(工学社)
Special Thanks:板垣様
ご意見がありましたら VYU04421@nifty.ne.jpまで