メモリの内容を調べる(PEEK相当をマシン語で)

IchigoJamのBASIC言語にはメモリ内容を調べるPEEK関数があります。
これはBASIC言語から見た仮想的なメモリ空間を16ビットのアドレスで指定して調べるものです。

なので、マイコンから見えているメモリ空間上に配置された各種レジスタの内容を読むために、PEEK関数相当を書いてみました

使い方

配列 [0] にアドレスの下位 16bitをセット
[1] に上位 16bit をセットします
戻り値
配列[2] に内容の下位16bit
[3] に上位16bit が格納されます

usr関数の戻り値も内容の下位16bitとなるので そちらを使えば十分な場合も多い、かも


#12345678 番地を読み出す場合
[0] =#5678
[1] =#1234
r=usr(#700,0)

プログラム


10 poke #700,`00001000,`00100000 :'r0=8
20 poke #702,`00000000,`00000010 :'r0=r0<<#8
30 poke #704,`00001001,`00011000 :'r1=r1+r0
40 poke #706,`00001000,`01101000 :'r0=[r1+#0] L
50 poke #708,`00000000,`01101000 :'r0=[r0+#0] L
60 poke #70a,`01001000,`01100000 :'[r1+1]=r0 L
70 poke #70c,`01110000,`01000111 :'ret

UM10398 LPC111x/LPC11C1x ユーザーマニュアルを見ながら、各レジスタのアドレスを調べて読み出してみると楽しい、かも。

例) LED の状態を調べる

LED 端子は マニュアルの表記では PIO1_5に相当するので、#5001_3ffc番地を調べます


80 [0]=#3ffc:[1]=#5001
90 r=usr(#700,0)
100 ?"LED GPIO1DATA 0x5001 3FFC"
110 ?hex$([3]),hex$([2])
120 if [2]&(1<<5) then I=1 else I=0
130 ? IN(1),I
140 END

実行例


led 1
OK
run
LED GPIO1DATA 0x5001 3FFC
0 CE0
1
OK
led 0
OK
run
LED GPIO1DATA 0x5001 3FFC
0 CC0
0
OK

LEDを点灯したり消したりすると、ポートのbit 5 が 1 になったり0になったり変化しています

例) IN 1 端子の状態を調べる

IN 1 端子は マニュアルの表記では PIO0_10に相当するので、#5000_3ffc番地を調べます


80 [0]=#3ffc:[1]=#5000
90 r=usr(#700,0)
100 ?"IN 1 GPIO0DATA 0x5000 3FFC"
110 ?hex$([3]),hex$([2])
120 if [2]&(1<<10) then I=1 else I=0
130 ? IN(1),I
140 END

出力


'IN 1 はプルアップされてるので何もつながないとHigh
(GPIO0DATA 0x5000 3FFC
0 5C3
1 1  IN 関数と、読み出したデータのbit10を比較
'IN 1 をリード線などでGNDに落として Lowに
(GPIO0DATA 0x5000 3FFC
(GPIO0DATA 0x5000 3FFC
0 1C3
0 0

bit 10 だけ変化してます

捕捉説明

なぜBTNを使わないかというとですね。。。
BTN (PIO1_4)の状態を同様の方法で調べてみたのですけれども、うちの環境だとうまく読み出せなかったのです。(BTN関数の値はちゃんと変化してるのに。なぜ?)
ポートの読み書きを高速化するために、特定のビットだけマスクすることができるようなのですが、、、BTNとかIN2端子はこれでマスクされているようで、このようなプログラムだとうまく読み出せなかったです。
IN 2 は、 OUT 9,* で出力レベルを変更したら読み出せました。

(勉強不足ですんません)

例) システムメモリリマップレジスタ

割り込みベクタテーブルがどこに存在するか調べてみます


'#800番地 = 配列 [0] [1] にアドレスをセット
'32bit単位で読み出しているので、アドレスは4の倍数の必要あり
poke #800, #00,#80,#04,#40
'マシン語実行
r=usr(#700,0)
'配列[2][3]に読み出した内容がセットされるので表示
?hex$([3]),hex$([2])

2 が返ってきているので、Flashメモリ上に割り込みベクタテーブル(512 バイト) が存在していることがわかります。