MODE 18, 19 (PEEK, POKE) 関連
PEEK, POKE / $ のアドレス探索 / 隠れキャラクタ表示 / 簡易モニタ
PEEK, POKE
MODE 命令で、一般的な BASIC における PEEK, POKE 相当の動作を行えます。
- MODE 18(A,B) で B=PEEK(A)
- MODE 19(A,B) で POKE A,B
これらを実行可能な機種とそうでない機種があります。
- PB-80/100F/110/120/410, FX-720P, SUPER COLLEGE Ⅱ, PD-200 での動作を確認しました。
- PB-100/200, FX-700P, SUPER COLLEGE では MODE 18, 19 ともに ERR5 でした。
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) のツイートのおかげです。
$ のアドレス探索 (MODE 18 使用)
文字列変数 $ が格納されている領域の先頭アドレスを求めます。
最初に探索開始アドレスを聞かれるので 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