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-80/100F/110/410, FX-720P, SUPER COLLEGE Ⅱ では 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 するコードを bas730 で作って LOAD する) で
FX-700P における表示を見てみましたが、これらのキャラクタは空白でした。
PB-110,120 に標準で存在するバックスラッシュもありませんでした。残念。
また、MODE 18,19 が使える PB-100F, SUPER COLLEGE Ⅱ でも隠れキャラはなく空白でした。

文字コード: 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 使用)

最低限のメモリの読書きが可能なモニタです。
[SHIFT][1] でアドレスを初期化して実行。[SHIFT][0] で続きから実行。
左にアドレス、右にそのメモリ値がそれぞれ 10 進数で表示されます。

正の数を入力すると、現在のアドレスにその値が書き込まれます (アドレスはそのまま)。
負の数を入力すると、その絶対値をアドレスとして移動します
(0 番地に飛びたい場合は -.5 など小数部を追加して書く)。
「+」のみを入力すると次のアドレスに進みます (一部の機種では空入力も可)。
「-」のみを入力すると一つ前のアドレスに戻ります (負になるとエラー)。

リスト (104 steps)

[P0]
1 MODE 18(A,B):PRINT A;B;:INPUT C$
2 IF C$≦"+";A=A+1:GOTO 1
3 IF C$="-";A=A-1:GOTO 1
4 B=VAL(C$):IF B≧0;MODE 19(A,B):GOTO 1
5 A=INT -B:GOTO 1

[P1]
1 VAC:GOTO #0
   

[戻る]