フォト
無料ブログはココログ

« FRAM  <強誘電体メモリ> | トップページ | 幸福の方程式 <新しい消費のカタチを探る> »

2015年6月 1日 (月)

IchigoJam(4) <メモリダンプ・プログラム>

 IchigoJam BASICはPEEK()が使えるようなのでメモリダンププログラムを書いてみた。 HEX$()CHR$()があるので楽だ。

1 'Memory dump
2 ' May. 2015 / Yoshi
10 INPUT "Dump address:?", A
20 INPUT "Length:?", L
30 IF L=0 THEN L=256 
40 IF (L%16)<>0 THEN L=(L/16+1)*16

100 FOR I=A TO A+L-1
110   IF (I%256)=0 THEN PRINT "     +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F"
120   IF (I%16)=0 THEN PRINT HEX$(I,4);" ";
130   C=PEEK(I)
140   IF ASC(" ")<=C AND C<=ASC("~") THEN [I%16]=C ELSE [I%16]=ASC(".")
150   PRINT HEX$(C,2);" ";
160   IF (I%16)<>15 THEN GOTO 210
170     FOR J=0 TO 15
180       PRINT CHR$([J]);
190     NEXT
200     PRINT
210   REM ENDIF
220 NEXT
230 END

ちょっと丁寧に書いてみた。^^)
メモリダンプ見てると萌えるねえ...

###

 IchigoJamの作者のページ「福野泰介の一日一創」に「IchigoJamのメモリマップと演算子優先順位」というエントリがあってIchigoJamのメモリマップが公開されている。これを見るとPEEK()で見えるアドレスは仮想的なアドレスのようだ。

 やっぱりRAM(実アドレス、0x10000000~)の中を見たい!
 USR()で機械語ルーチンをコールできるようなので、PEEK()の代わりにUSR()でRAMの実アドレスを読むようにすればよさそうだ。

 しかし!、ARMのアセンブラなど書きたくない!!、しかもthumb命令だし!!

 IchigoJamのUSR()は引数をR0レジスタで渡して戻り値をR0で受け取るらしいので、機械語への翻訳はgccにお願いすることにしよう。

uint16_t peek_ex(uint16_t addr)
{
    return *(uint8_t*)(0x10000000+addr);
}

のような関数を書いてgccでコンパイルしてobjdumpで逆汗とすると

$ arm-none-eabi-gcc -c -Os -mthumb -mlittle-endian -mno-unaligned-access
$ arm-none-eabi-objdump -d dump.o

00000000 <peek_ex>:
   0:   4b01            ldr     r3, [pc, #4]    ; (8 <peek_ex+0x8>)
   2:   5cc0            ldrb    r0, [r0, r3]
   4:   4770            bx      lr
   6:   46c0            nop                     ; (mov r8, r8)
   8:   10000000        .word   0x10000000

が得られる。

 RAMの実アドレスのデータを読む関数は

POKE #700, #01, #4B, #C0, #5C, #70, #47, #C6, #46, #00, #00, #00, #10
D=USR(#700,A)

とすればよさそうだ。
実メモリをダンプするプログラムは

1 'Memory dump
2 ' May. 2015 / Yoshi
10 POKE #700, #01, #4B, #C0, #5C, #70, #47, #46, #C0, #00, #00, #00, #10
20 INPUT "Internal:0 RAM:1 Flash:2 APB:3 AHB:4 System:5 ?", T
30 IF T<0 OR 5<T GOTO 10
40 IF T=2 THEN POKE #70B, 0
50 IF T=3 THEN POKE #70B, #40
60 IF T=4 THEN POKE #70B, #50
70 IF T=5 THEN POKE #70B, #E0
80 INPUT "Address? ", A
90 IF 3<=T AND #1000<=A THEN POKE #70A,A>>12 : A=A>>4
100 INPUT "Length? ", L
110 IF L=0 THEN L=256
120 IF (L%16)<>0 THEN L=(L/16+1)*16

200 L=A+L-1
210 FORI=ATOL
220   IF!(I&#FF)?"    ";:FORK=0TO15:?" +";K;:NEXT:?
230   IF!(I&#F)?HEX$(I,4);" ";
240   C=PEEK(I):IFTC=USR(#700,I)
250   [I&#F]=C:IFC<32OR128<c[i&#f]=46 
260   ?HEX$(C,2);" "
270   IFI&#F=15FORJ=0TO15:?CHR$([J]);:NEXT:?
280 NEXT
290 END

ダンプ・ルーチンを最適化(分かり難く)してみた。
ソースはわかり難くなったけど、速度は目に見えて早くなったようには感じないなあ


     

« FRAM  <強誘電体メモリ> | トップページ | 幸福の方程式 <新しい消費のカタチを探る> »

CPUボード」カテゴリの記事

IchigoJam」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

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

トラックバック

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

この記事へのトラックバック一覧です: IchigoJam(4) <メモリダンプ・プログラム>:

« FRAM  <強誘電体メモリ> | トップページ | 幸福の方程式 <新しい消費のカタチを探る> »