ワークエリア
ワークエリアとは、ポケコンが動作する上で使用するメモリエリアのことです。
動作に関する記憶が入っているので、いじると面白いことが出来ます。
BASICの変数
ポケコン(PC-G850S)のBASICの1文字変数のワークエリアです。
1文字変数とは、あらかじめメモリ確保されている変数で、AやB$などと1文字で記述する固定変数です。
(ABやCD$などの2文字変数は動的にメモリ確保されるので、ワークエリアはまだわかっていません。)
1文字変数はAとA$のように同じ文字の変数を同じエリアで使っています。そのため、BASICではこれらを同時に使えません。
A~Zのアドレスは7800h~78cfhになっています。
7800hから8ByteがZで、そこから8Byteずつ増えていくごとにY,X,W,V,U...と減っていき、78c8~78cfがAのワークエリアになっています。
ためしに、Zのワークエリアの中身をのぞいてみましょう。
ワークエリアの閲覧はマシン語モニタを使うのが一般的ですが、ここにワークエリアを見るのに便利なC言語プログラム用意しました。
10 #define H 0x7800
20 main(){
30 int j;
40 for(j=0;j<8;j++)printf(" %2X",peek(j+H));
50 for(j=0;j<8;j++){gotoxy(j*3+2,1);putchar(peek(j+H));}
60 }
これを実行するとZの中身を見ることができます。
1行目の値を見たい変数のワークエリアの先頭アドレスに変更できます。
Aが見たいときは、10 #define H 0x78c8とすればOKです。
では、実際にZのアドレスの中を見てみましょう。
その前に、Zに何か入れないといけないですね。
RUN MODEなどで、
Z=12345
と入力してください。そして、C言語を実行してみてください。
数字と文字が表示されましたか?
上の数字は左から先頭アドレスより1バイトずつ16進数で表示しています。
下の文字はそれをアスキーコードとしたときの文字を表示しています。
数値変数はBCD浮動小数点10桁で保存されています。
次は文字列変数です。
Z$="POCKET"
とRUN MODEで入力してみてください。
前述したように、ZとZ$は同じエリアを使っているのでこれもさっきのC言語で表示できます。
C言語で中身を見てみると、今度は下の文字のほうが P O C K E T となっていることがわかります。そして、1Byte目が"時"という文字になっています。
この"時"というのは16進数でF5hで、文字列を意味しています。変数の1バイト目にF5hがあると文字列として認識されます。
ためしに、Zの先頭アドレス7800hを0に書き換えるとどうなるでしょうか。下をRUN MODEで実行してみてください。
POKE &H7800,0
これでZ$はZに変身です。Z$が使えなくなっていることを確認してください。またZが使えるようになりました。
以上BASICの変数のワークエリアの紹介でした。
しかし、解析以外に何か面白い使い方はないのでしょうか・・・。
ラストアンサー
ラストアンサーというのは、最後の計算結果のことです。
PC-G850Sはこれをきちんと覚えてくれてるんです。
使い方は簡単。電源OFFのキーのすぐ左の「ANS」ボタンを押すだけ。
BASICのRUNモード、PROGRAMモードのどちらでも使えます。(残念なことにテキストエディタでは使えません。)
これって使いようによれば計算するときかなり役に立ちますが、プログラミング中には使い道なんてありません。
今回は、これを使ってみよう!というチャレンジです。
ORG 0100H
; ラストアンサーに文字列を入れるためのフォーマット
LD HL,FORMAT
LD DE,79A0H
LD BC,7
LDIR
; 文字列の長さを設定
LD A,STRL
LD (79A7H),A
RET
FORMAT: DB 0,0,0,0,0D0H
DW STR
STR: DB 'Pocket'
STRL EQU 6
これをアセンブル&実行してみてください。アセンブルの方法はこちら「ポケコンのマシン語でのHello,world」
実行した後RUNモードでANSキーを押してみてください。
「Pocket」って表示されませんでしたか?
これでプログラム上からラストアンサーに対していろいろと書き換えができるようになりました。
文字列で入力だけど、数字を文字列として入力すればきちんと扱えます。
(数値フォーマットすると最後に不要な"."が入ってしまうので推奨しない。)
一度アセンブルすれば文字列を変更しない限り実行するだけでオッケーです。
これでラストアンサーに任意の文字列を入力していつでも呼び出せるようにできます。
ちなみに、ラストアンサーの仕組み上、「BASICで計算すると値がその結果になる。」ので注意。
E-Mail:
Weblog: Tosikの雑記