MODE 18, 19 (PEEK, POKE) 関連

PEEK, POKE / $ のアドレス探索 / 隠れキャラクタ表示 / 簡易モニタ

PEEK, POKE

MODE 命令で、一般的な BASIC における PEEK, POKE 相当の動作を行えます。

これらを実行可能な機種とそうでない機種があります。

MODE 18, 19 はプログラム中でのみ使用可能です。
アドレス指定は 65536 (0x10000) でループするようです。

システム領域を破壊すると最悪の場合オールリセットする事になるので、
使用は自己責任で。大事なプログラムはバックアップしておきましょう。

ネタ元: http://www.pisi.com.pl/piotr433/fx730_e.htm - Direct RAM access
手元のマシンで試してみたら POKE はそのまま動く事に気付きました。
PEEK を MODE 18(A,B) と書けば良いことが分かったのは
chamekan さん (@chame) のツイートのおかげです。

文字列変数 $ が格納されている領域の先頭アドレスを求めます。
最初に探索開始アドレスを聞かれるので 10 進数で入力します (0 でよい)。
画面には探索中のアドレスが表示され、
見つかるとビープ音が鳴るとともに $ の格納アドレスが表示されます。
手元の PB-100F, PB-110 では 240 (0x00F0)、
PB-120 では 192 (0x00C0) でした。

A$ などの通常の文字列変数も同様のプログラムで探索可能ですが、
メモリ末尾からアドレスの小さい方に向かって A, B, C, ... と
8 バイト単位で格納されているので、メモリサイズから計算可能なはずです。
RAM を増設すると変数 A~Z の配置はその分ずれると思うので
注意しましょう (未確認)。

内部データ構造 (FX-700P): http://www.pisi.com.pl/piotr433/formats.htm

リスト

10 VAC:B=16:INPUT "Address",A
20 $="0123456789":E=LEN($)
30 C=B
40 PRINT A;:MODE 18(A,D):A=A+1:PRINT:IF D≠C THEN 30
50 C=C+1:IF C<B+E THEN 40
60 $="A":MODE 18(A-E,D):IF D≠32 THEN 20
70 BEEP:PRINT A-E-1

隠れキャラクタ表示 (MODE 19 使用)

文字列変数 $ の中身を直接書き換えて、
キーボードから入力できないキャラクタを表示します。
 隠れキャラクタ
リストの「●」部分には、$ のアドレス探索で求めた $ のアドレスが入ります。
行 50 の DATA は表示文字列のコード ($ の最大長まで列挙可能)、
行 60 の DATA は終端コードです。

なお、MODE 18, 19 を使わない方法
(隠れキャラを PRINT するコードを PC で作って LOAD する) で
FX-700P における表示を見てみましたが、これらのキャラクタは空白でした。
PB-110,120 には標準で存在するバックスラッシュもありませんでした。
残念。

文字コード: http://www.mvcsys.de/doc/casioutil.html#FX-730_character_table

リスト

10 VAC:A=●:L=0
20 READ D:MODE 19(A+L+1,D):IF D=255 THEN 40
30 L=L+1:GOTO 20
40 MODE 19(A,L):PRINT $
50 DATA 58,59,60,61,62,63,90,91,123,124,125,126
60 DATA 255

簡易モニタ (MODE 18, 19 使用)

最低限のメモリの読書きが可能なモニタです。
左にアドレス、右にそのメモリ値がそれぞれ 10 進数で表示されます。

正の数を入力すると、現在のアドレスにその値が書き込まれます (アドレスはそのまま)。
負の数を入力すると、その絶対値をアドレスとして移動します
(0 番地に飛びたい場合は -0.5 など小数部を追加して書く)。
空入力すると次のアドレスに進みます。
PB-100F など、INPUT 文における空入力が効かない場合は
「+」を入力してください。

RUN する度にアドレスが 0 に戻るのが不便な場合は
行 5 を削除してしまって構いませんが、
初回実行の前には VAC 等でアドレスを初期化しておくのが無難です。

リスト

5 VAC
10 MODE 18(A,B):PRINT A;B;:INPUT C$
20 IF C$≦"+";A=A+1:GOTO 10
30 B=VAL(C$):IF B≧0;MODE 19(A,B):GOTO 10
40 A=INT(-B):GOTO 10

[戻る]