« ROBOBASIC講座(テンプレートMAINループ) | トップページ | RZ1Basic v0.2.1 公開 »

ROBOBASIC講座(PEEK、POKE その1)

【PEEK(ピーク)】
 コントローラー内部のSRAMのデーターを読み込む。
 書 式:PEEK 読込むアドレス
   例:DIM A AS INTEGER
     A=PEEK(&h0140)
 備 考:マニュアルには、0-255までの...と書いてあるが、
     戻り値はINTEGERで受け取れるみたい。

【POKE(ポーク)】
 コントローラー内部のSRAMにデーターを書込むする。
 書 式:POKE 書込むアドレス,書込む値
   例:POKE &h0D02,0
     POKE &h0D03,16
 備 考:マニュアルには、書込む値はBYTEで
     INTEGERは使えない。

今回は、PEEKとPOKEがテーマなんですが、その話に行き着く前に、これまでのGOSUB...RETURN関連の話の流れとして、スタック、スタックポインタがどんな挙動を示すのか。それを理解flairした上で、PEEKやPOKEを利用してみたいと思います。

と、その前に「ROBOBASIC講座(GOSUB...RETURN)」をまだ見てない方は、いちおうそちらを見てからここを読んで下さいねpaper それから、オブジェクトコードなど、ちょsign04っと難し目の話が出てきますが、諦めないで頑張って最後までみて下さいねheart04

さて、まずdownwardleft以下のサンプル1をroboBASICかRZ1Basicでロボットに転送して、実行させてみましょう!

《サンプル1》
TEMPO 230
MUSIC "C"
GOSUB test
MUSIC "E"
END

test:
MUSIC "D"
RETURN

earpaper
は〜いhappy01いつも聞き慣れたnoteでしたね。
それでは早速、このソースのオブジェクトコードを見てみましょうrun

  1. roboBASICを使われている方は、サンプル1を保存し、RZ1Basicでそのファイルを開いて下さい。
  2. 開いたら、右上に「ソースコード」と表示されているポップアップメニューを、「オブジェクトコード」に変更して下さい。

すると以下のようなものが表示されると思いますdownwardleft
※Hexエディタでオブジェクトコードを見るとこの前に余分?な部分も付いてますので、アドレスの値がズレルので読み難くなるかもしれません。

《サンプル1のオブジェクトコード》
[0000] 556E7469 746C6564 08020C0A 210D2F00   Untitled....!./.
[0016] BF12E6BA 19001824 00C52500 BA220018   .......$..%.."..
[0032] 2800C422 00BA2B00 182600C6 C42C00     (.."..+..&...,..

  • 左 :バイト数(10進数)
  • 中央:実際に転送されるコード(16進数)
  • 右 :そのコードをASCIIで表したもの

1行目の最初の16バイトはプログラムの情報なので、その次の行から、オブジェクトコードとソースコードと対応させると以下のようになります。

Finderscreensnapz002_3

※1の「GOSUB test」は、0xC5 0x25 0x00となっています。0xC5というのは、GOSUBを意味しています。0x25 0x00は、ジャンプ先きのアドレスを示しています。このアドレスの値はリトルエンディアンで記述されているので、ひっくり返して、0x0025がジャンプ先きになります。

次に、※2の「RETURN」のコードを見てみると、RETURNは、RETURNを意味する0xC6のみしか書かれていないことがわかります。「ROBOBASIC講座(GOSUB...RETURN)」でも書きましたが、RETURNの行き先は、実行時にスタックに記録されます。以下をご覧下さいdownwardleft

実行時のスタックポインタおよびスタックの様子
GOSUB が実行されると(図A→B)
1、スタックポインタ(0x04D5,04D6)の値が示すアドレス(0x0D02)に、 RETURNで戻ってくる場所(GOSUBの次の行)の、0x001Cを記録する。
2、 スタックポインタの値(0x0D02)を、2バイト足した値にする(0x0D04)。
3、0x0025へジャンプする。

RETURN が実行されると(図B→A)
1、 スタックポインタの値(0x0D04)を、2バイト引いた値にする(0x0D02)。
2、 スタックポインタの値が示すアドレス(0x0D02)の値(0x001C)へジャンプする。


Stackmem

では、サンプル1を実行後、スタックポインタの値と、スタックの値を見てみることにしましょう。サンプル1は変な所はないので、正常に終了しているはずです。なので、スタックポインタの値は0x0D02(初期値)であり、スタック(0x0D02)は、0x001Cであればいいはずですよね。

調べてみましょうsearch

oneスタックポインタの値

  1. roboBASICで転送しててもOKです。兎に角、転送すれば実行されているはずなので、RZ1Basicを起動して、コントローラーのコマンドテストを選択します。
  2. スタックポインタのアドレスは0x04D5です。10進数だと1237です。
    Rz1basicscreensnapz012

  3. 「MEMORY READ」で、「SRAM」を選択。
  4. Start Address1237と入力します。
  5. Read Length2バイトです。
    ※SRAMのアドレス1237から2バイト読込むという意味になります。
  6. Startボタンをクリックしてみて下さい。
    Parallels_desktopscreensnapz037

Resultの所に、020Dと表示されたかと思います。逆さまに並べないといけないので(図A、B参照)、0x0D02がスタックポインタが示す値ということになります。

twoスタックの値

  1. 0x0D02は、10進数にすると、3330です。
  2. Start Address3330と入力します。
  3. Startボタンをクリックしてみて下さい。

Resultの所に、1C00と表示されたでしょうかsign02この数値も逆さにして、0x001Cがスタックされた値ということになります。

スタックポインタ、スタックの値の読み方は理解頂けましたでしょうか?


まだまだ話はつづくのですが、なんだか長くなってしまいましたねsweat01お仕事に寝坊してしまうといけないのでdash次に書こうと思っていたことを宿題にすることしましたshine

以下のサンプル2と3のソースコードは、サンプル1を少し変なコードにしたものです。

  • サンプル2は、RETURNのところをENDにしました。
  • サンプル3は、GOSUBのところをGOTO testにし、RETURNの後にENDを付け加えました。

one:サンプル2はGOSUBで呼ばれたまま停止してしまいます。スタックポインタはいくつになっているでしょうか?
two:サンプル3は、GOTOで呼んだにも関わらず、サブルーチンにはRETURNがあります。スタックポインタにはいくつになっているでしょうか?

私はお風呂に入って、少し寝ま〜すsleepy
頑張ってねheart02

《サンプル2》
TEMPO 230
MUSIC "C"
GOSUB test
MUSIC "E"
END

test:
MUSIC "D"
END

《サンプル3》
TEMPO 230
MUSIC "C"
GOTO test
MUSIC "E"
END

test:
MUSIC "D"
RETURN
END

 

つづきの「PEEK, POKE その2」はこちらpaper

|

« ROBOBASIC講座(テンプレートMAINループ) | トップページ | RZ1Basic v0.2.1 公開 »

ROBOBASIC講座」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/221673/40088640

この記事へのトラックバック一覧です: ROBOBASIC講座(PEEK、POKE その1):

« ROBOBASIC講座(テンプレートMAINループ) | トップページ | RZ1Basic v0.2.1 公開 »