開発日記

今回の並列 programming は下記の順番(上から下)で bus cycle を DMA で一度に連続で動かす.

通常           |page programming
r a     d   l c|l    c
c $5555 $aa 1 4|   1 $103
c $2aaa $55 1 /|   1    /
c $5555 $90 1 /|   1    /
c  d+0   ww 1 /|$100    /
p $5555 $aa 1 4|   1 $103
p $2aaa $55 1 /|   1    /
p $5555 $90 1 /|   1    /
p  d+0   ww 1 /|$100    /
c  d+0   rr 1 2|   1    2
c  d+0   rr 1 /|   1    /
p  d+0   rr 1 2|   1    2
p  d+0   rr 1 /|   1    /
  • r: memory region
  • a: flash memory address, d+n は programming destination address + offset
  • d: memory data, ww は programming destination data, rr は read data
  • l: bus cycle 回数, 1を超える場合は a における d+0 の 0 が l 回 increment される.
  • c: bus control 回数. 詳しくは後述.

通常であれば address と data はすべて個別に記載する. control は変わる部分では何回繰り返すと定義するので数字が書いてある. 変わらない部分は / にしてある. c は 4///,4/// とあり、 DMA の参照元を 1 byte 書き換えることによって write cycle を送るか何もしないかを早く変更できる.

page programming device の場合は a=d+0 の行の l が $100 (=256) となっているので、 a=d+0 から a=d+0xff まで順番に変更する. これは ROM dump でよく使うのでその仕組みを再利用する. 今回の問題は c の $103/// という中途半端な値である.

長さの定義は ROM dump ではきりのいい値を使うことが大半なので 16 未満は 2 の n 乗の値ということにして、転送プロトコルとして本来 2 byte いる領域を 1 byte に縮めている. この規定では 0x103 は1つで表現できないので、指数と整数の選択をやめて、指数と整数の加算に変更した. 8 bit のうち 4 bit は2のn乗の指数で 1 から 0x8000 まで. 残り 4 bit は定数で 0 から 15 まで. これにより 1 byte で 0x103 を表現することができる.

表現はできるのだがここまでケチる意義はあるのかは programming が成功してから考え直す. それとこの方式は 0 が表現できない (2 の 0 乗は 1 であるため)ことと 1 から 32 までは表現方法が何通りもあるということが中途半端である.