Home > スポンサー広告 > TempAR - CWC/PSPAR形式短縮コード(シリアル)

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

コメント: -

Home > スポンサー広告 > TempAR - CWC/PSPAR形式短縮コード(シリアル)

Home > TempAR Usage > TempAR - CWC/PSPAR形式短縮コード(シリアル)

TempAR - CWC/PSPAR形式短縮コード(シリアル)


『PSPAR 短縮コード』で検索してきている方がいるみたいなので
短縮コードについて書いてみます。

まず、『短縮コード』というのは何でしょうか。
他にも『圧縮コード』『シリアルコード』『シリアル化』とも呼ばれるようですね。
英語だと『Multi-Address Write』と呼ばれるようです。
英語の方が端的で動作が想像しやすい名前ですね。
いわゆる『通常書き込み』を『複数のアドレス』にまとめて処理したいときに使います。
フラグをまとめてONにする場合や、全アイテム所持等でよく使われます。

アドレスずらしの部分が最初はちょっと分かりにくいので
実際の動作結果を見て覚えるのが手っ取り早いと思います。
コードサンプルとその結果の違いを見て覚えていきましょう。

サンプルコードは実際に動かすことが可能です。
[Decoder]タブで、アドレス0x00001000を表示させ動きを確認してください。

基本を理解出来れば値増分の部分も理解出来ると思いますので
増分についての説明は省略します。


サンプルコード数値クリア用


サンプルを実行したら、これを実行して数値を0にリセットしてから
次のサンプルを実行してください。

_C0 PSPAR 32bit Clear
_M 0xD5000000 0x00000000
_M 0xC0000000 0x0000000F
_M 0xD6000000 0x08801000
_M 0xD2000000 0x00000000


CWC形式



▼書式(日本語 by wiki)

8bit(ver0.1.6以降)
0x8aaaaaaa 0xbbbbyyyy
0x000000dd 0x000000ee

アドレスaaaaaaaからbbbb個のアドレスになるように
yyyyアドレスずつずらしながら値ddを書き込み続ける
このときddもee分ずつ増加して書き込む
16bit(ver0.1.6以降)
0x8aaaaaaa 0xbbbbyyyy
0x1000dddd 0x0000eeee

アドレスaaaaaaaからbbbb個のアドレスになるように
yyyy*2アドレスずつずらしながら値ddddを書き込み続ける
このときddddもeeee分ずつ増加して書き込む
32bit
0x4aaaaaaa 0xbbbbyyyy
0xdddddddd 0xeeeeeeee

アドレスaaaaaaaからbbbb個のアドレスになるように
yyyy*4アドレスずつずらしながら値ddddddddを書き込み続ける
このときddddddddもeeeeeeee分ずつ増加して書き込む

yyyy*nの部分は、書き込むbit数を『1かたまり』と捉えて置き換えると分かりやすいと思います。
実際に使用する局面では『次のオフセット+いくつ』を『1かたまり』で割ることで
yyyyの数値として使用出来ます。

▼8-bit Multi-Address Write

■サンプル1
_C0 CWC 8bit Serial 1
_L 0x80001000 0x00040001
_L 0x000000FF 0x00000000

アドレス0x00001000から0x0001*1ずつずらしながら0xFFを4回書き込む
■結果
0x00001000 0xFFFFFFFF 
0x00001004 0x00000000
0x00001008 0x00000000 
0x0000100C 0x00000000
■サンプル2
_C0 CWC 8bit Serial 2
_L 0x80001000 0x00040002
_L 0x000000FF 0x00000000

アドレス0x00001000から0x0002*1ずつずらしながら0xFFを4回書き込む
■結果
0x00001000 0x00FF00FF
0x00001004 0x00FF00FF
0x00001008 0x00000000 
0x0000100C 0x00000000
■サンプル3
_C0 CWC 8bit Serial 4
_L 0x80001000 0x00040004
_L 0x000000FF 0x00000000

アドレス0x00001000から0x0004*1ずつずらしながら0xFFを4回書き込む
■結果
0x00001000 0x000000FF
0x00001004 0x000000FF
0x00001008 0x000000FF
0x0000100C 0x000000FF

▼16-bit Multi-Address Write

■サンプル1
_C0 CWC 16bit Serial 1
_L 0x80001000 0x00040001
_L 0x1000FFFF 0x00000000

アドレス0x00001000から0x0001*2ずつずらしながら0xFFFFを4回書き込む
■結果
0x00001000 0xFFFFFFFF
0x00001004 0xFFFFFFFF
0x00001008 0x00000000
0x0000100C 0x00000000
■サンプル2
_C0 CWC 16bit Serial 2
_L 0x80001000 0x00040002
_L 0x1000FFFF 0x00000000

アドレス0x00001000から0x0002*2ずつずらしながら0xFFFFを4回書き込む
■結果
0x00001000 0x0000FFFF
0x00001004 0x0000FFFF
0x00001008 0x0000FFFF
0x0000100C 0x0000FFFF
■サンプル3
_C0 CWC 16bit Serial 4
_L 0x80001000 0x00040004
_L 0x1000FFFF 0x00000000

アドレス0x00001000から0x0004*2ずつずらしながら0xFFFFを4回書き込む
■結果
0x00001000 0x0000FFFF
0x00001004 0x00000000
0x00001008 0x0000FFFF
0x0000100C 0x00000000
0x00001010 0x0000FFFF
0x00001014 0x00000000
0x00001018 0x0000FFFF
0x0000101C 0x00000000

▼32-bit Multi-Address Write

■サンプル1
_C0 CWC 32bit Serial 1
_L 0x40001000 0x00040001
_L 0xFFFFFFFF 0x00000000
アドレス0x00001000から0x0001*4ずつずらしながら0xFFFFFFFFを4回書き込む
■結果
0x00001000 0xFFFFFFFF
0x00001004 0xFFFFFFFF
0x00001008 0xFFFFFFFF
0x0000100C 0xFFFFFFFF
0x00001010 0x00000000
0x00001014 0x00000000
0x00001018 0x00000000
0x0000101C 0x00000000
■サンプル2
_C0 CWC 32bit Serial 2
_L 0x40001000 0x00040002
_L 0xFFFFFFFF 0x00000000

アドレス0x00001000から0x0002*4ずつずらしながら0xFFFFFFFFを4回書き込む
■結果
0x00001000 0xFFFFFFFF
0x00001004 0x00000000
0x00001008 0xFFFFFFFF
0x0000100C 0x00000000
0x00001010 0xFFFFFFFF
0x00001014 0x00000000
0x00001018 0xFFFFFFFF
0x0000101C 0x00000000
■サンプル3
_C0 CWC 32bit Serial 4
_L 0x40001000 0x00040004
_L 0xFFFFFFFF 0x00000000

アドレス0x00001000から0x0004*4ずつずらしながら0xFFFFFFFFを4回書き込む
■結果
0x00001000 0xFFFFFFFF
0x00001004 0x00000000
0x00001008 0x00000000
0x0000100C 0x00000000
0x00001010 0xFFFFFFFF
0x00001014 0x00000000
0x00001018 0x00000000
0x0000101C 0x00000000
0x00001020 0xFFFFFFFF
0x00001024 0x00000000
0x00001028 0x00000000
0x0000102C 0x00000000
0x00001030 0xFFFFFFFF
0x00001034 0x00000000
0x00001038 0x00000000
0x0000103C 0x00000000


PSPAR形式コードタイプ


PSPAR形式ではCWC形式のような決まった書式があるわけではなく、
レジスタコード、ループカウンタ、オフセットずらし書き込み、ターミネータ、
といういくつかのコードタイプを用いて表現します。

難しそうに聞こえますが、構造が単純なのでサンプルを見ればすぐに理解出来ると思います。

▼0xD5 Set Value

■書き込む値をセット
0xD5000000 0xXXXXXXXX

Set XXXXXXXX to the 'Dx data register'.

'Dx data register'にXXXXXXXXをセットします。

難しく考える必要は無く、架空の計算機にXXXXXXXXにセットします、程度に捉えてください。
XXXXXXXXに書き込みたい値を入力します。

▼0xC0 Loop Codes

■ループしたい回数をセット
0xC0000000 0xXXXXXXXX 

This sets the 'Dx repeat value' to YYYYYYYY and saves the 'Dx nextcode
to be executed' and the 'Dx execution status'.
Repeat will be executed when a D1/D2 code is encountered.
When repeat is executed, the AR reloads the 'next code to be executed'
and the 'execution status' from the Dx registers.

コードステータスうんぬんとか色々がありますが、ここでは省略します。
XXXXXXXXにループしたい回数を入力します。

▼0xDC Add Offset

■現在のオフセットにオフセットを加算します。
0xDC000000 0xXXXXXXXX 

Adds XXXXXXXX to the current offset (Dual Offset).

PSPAR形式ではアドレス部分をオフセットで表現します。

以下のような命令があった場合オフセットが0ならアドレス0x08801000に書き込みますが
_M 0x08801000 0xFFFFFFFF
オフセットが0x1000ならアドレス0x08801000+オフセ0x1000で0x08802000に書き込まれます。
これはオフセットを0にしない限りこの状態が続きます。

なんでそんな面倒くさいことするんだと思われるかも知れませんが
このオフセットがあるおかげで、柔軟な表現が可能になります。
CWCでは表現不可能なコードが記述できます。


▼0xD6 0xD7 0xD8 Incrementive Write

■8-bit Incrementive Write
D8000000 XXXXXXXX

Writes the 'Dx data register' word to [XXXXXXXX+offset], and increments the offset by 1.

アドレスXXXXXXXX+offsetに'Dx data register'(0xD5でセットした値)の数値を書き込みます。
その後、オフセットに1を加算します。(1ずらす)

■16-bit Incrementive Write
D7000000 XXXXXXXX
Writes the 'Dx data register' word to [XXXXXXXX+offset], and increments the offset by 2.

アドレスXXXXXXXX+offsetに'Dx data register'(0xD5でセットした値)の数値を書き込みます。
その後、オフセットに2を加算します。(2ずらす)

■32-bit Incrementive Write
D6000000 XXXXXXXX

Writes the 'Dx data register' word to [XXXXXXXX+offset], and increments the offset by 4.

アドレスXXXXXXXX+offsetに'Dx data register'(0xD5でセットした値)の数値を書き込みます。
その後、オフセットに4を加算します。(4ずらす)



PSPAR形式シリアル


コードタイプを見てもよく分からなかったという方でも
サンプルを見れば理解しやすいのではないでしょうか。
これをテンプレートとして活用してください。
また、TempARに同梱されているtest.dbを見ると理解が深まります。

また、『次のオフセット+いくつ』の表現はCWCのように割り算をしなくても
書き込むbit数だけオフセットから減算すればいいだけなので、分かりやすいかと
思います。

結果欄はCWCとの対比のためわざとfake addressで記載しています。



▼8-bit Multi-Address Write

■サンプル1
_C0 PSPAR 8bit 0xD2
_M 0xD5000000 0x000000FF 0xFFを書き込みたい値としてセット。
_M 0xC0000000 0x00000003 ループ回数は3回
_M 0xD8000000 0x08801000 アドレス0x08801000+オフセに書き込み後オフセ+1。その後3回ループ。(合計4回書く。)
_M 0xD2000000 0x00000000 終端コード
■結果
0x00001000 0xFFFFFFFF
0x00001004 0x00000000
0x00001008 0x00000000
0x0000100C 0x00000000

▼16-bit Multi-Address Write

■サンプル2
_C0 PSPAR 16bit 0xD2
_M 0xD5000000 0x0000FFFF 0xFFFFを書き込みたい値としてセット。
_M 0xC0000000 0x00000003 ループ回数は3回
_M 0xD7000000 0x08801000 アドレス0x08801000+オフセに書き込み後オフセ+2。その後3回ループ。(合計4回書く。)
_M 0xD2000000 0x00000000 終端コード
■結果
0x00001000 0xFFFFFFFF
0x00001004 0xFFFFFFFF
0x00001008 0x00000000
0x0000100C 0x00000000

▼32-bit Multi-Address Write

■サンプル3
_C0 PSPAR 32bit 0xD2
_M 0xD5000000 0xFFFFFFFF 0xFFFFFFFFを書き込みたい値としてセット。
_M 0xC0000000 0x00000003 ループ回数は3回
_M 0xD6000000 0x08801000 アドレス0x08801000+オフセに書き込み後オフセ+4。その後3回ループ。(合計4回書く。)
_M 0xD2000000 0x00000000 終端コード
■結果
0x00001000 0xFFFFFFFF
0x00001004 0xFFFFFFFF
0x00001008 0xFFFFFFFF
0x0000100C 0xFFFFFFFF

▼8-bit Multi-Address+Offset Write

■サンプル4
_C0 PSPAR 8bit 0xD2+0xDC
_M 0xD5000000 0x000000FF 0xFFを書き込みたい値としてセット。
_M 0xC0000000 0x00000003 ループ回数は3回
_M 0xD8000000 0x08801000 アドレス0x08801000+オフセに書き込み後オフセ+1。その後3回ループ。(合計4回書く。)
_M 0xDC000000 0x00000003 現在オフセット(+1)に3を足す。つまり4。
_M 0xD2000000 0x00000000 終端コード
■結果
0x00001000 0x000000FF
0x00001004 0x000000FF
0x00001008 0x000000FF
0x0000100C 0x000000FF

▼16-bit Multi-Address+Offset Write

■サンプル5
_C0 PSPAR 16bit 0xD2+0xDC
_M 0xD5000000 0x0000FFFF 0xFFFFを書き込みたい値としてセット。
_M 0xC0000000 0x00000003 ループ回数は3回
_M 0xD7000000 0x08801000 アドレス0x08801000+オフセに書き込み後オフセ+2。その後3回ループ。(合計4回書く。)
_M 0xDC000000 0x00000002 現在オフセット(+2)に2を足す。つまり4。
_M 0xD2000000 0x00000000 終端コード
■結果
0x00001000 0x0000FFFF
0x00001004 0x0000FFFF
0x00001008 0x0000FFFF
0x0000100C 0x0000FFFF

▼32-bit Multi-Address+Offset Write

■サンプル6
_C0 PSPAR 32bit 0xD2+0xDC
_M 0xD5000000 0xFFFFFFFF 0xFFFFFFFFを書き込みたい値としてセット。
_M 0xC0000000 0x00000003 ループ回数は3回
_M 0xD6000000 0x08801000 アドレス0x08801000+オフセに書き込み後オフセ+4。その後3回ループ。(合計4回書く。)
_M 0xDC000000 0x00000004 現在オフセット(+4)に4を足す。つまり8。
_M 0xD2000000 0x00000000 終端コード
■結果
0x00001000 0xFFFFFFFF
0x00001004 0x00000000
0x00001008 0xFFFFFFFF
0x0000100C 0x00000000
0x00001010 0xFFFFFFFF
0x00001014 0x00000000
0x00001018 0xFFFFFFFF
0x0000101C 0x00000000


PSPAR形式 終端コード


ターミネータコード(0xD0 0xD1 0xD2)にはいくつも働きがあります。(※)
CWC形式には無い概念で分かりにくいと思いますので
0xD1/0xD2を設定した場合、しなかった場合に何が起きるか具体例を見ていきます。

※正確には0xD1はターミネータコードではありませんが、
似たような働きをする仲間ということでひとくくりに扱います。



▼ターミネータ無し

■サンプル1
_C0 PSPAR 8bit without terminator 1
_M 0xD5000000 0x000000FF 0xFFを書き込みたい値としてセット。
_M 0xC0000000 0x00000001 ループ回数は1回
_M 0xD8000000 0x08801000 アドレス0x08801000+オフセに書き込み後オフセ+1。その後1回ループ。(合計2回書く。)
_M 0x08801010 0x11111111 アドレス0x08801010+オフセに0x11111111を書き込み
_M 0xC6000000 0x08801020 アドレス0x08801010にオフセットを値を出力
■結果
0x00001000 0x0000FFFF
0x00001004 0x00000000
0x00001008 0x00000000
0x0000100C 0x00000000
0x00001010 0x11111111
0x00001014 0x00000000
0x00001020 0x00000002
■サンプル2
_C0 PSPAR 8bit without terminator 3
_M 0xD5000000 0x000000FF 0xFFを書き込みたい値としてセット。
_M 0xC0000000 0x00000003 ループ回数は3回
_M 0xD8000000 0x08801000 アドレス0x08801000+オフセに書き込み後オフセ+1。その後3回ループ。(合計4回書く。)
_M 0x08801010 0x11111111 アドレス0x08801010+オフセに0x11111111を書き込み
_M 0xC6000000 0x08801020 アドレス0x08801020にオフセットを値として出力
■結果
0x00001000 0xFFFFFFFF
0x00001004 0x00000000
0x00001008 0x00000000
0x0000100C 0x00000000
0x00001010 0x11111111
0x00001014 0x11111111
0x00001020 0x00000004


サンプル2では0x00001014になぜか0x11111111が書かれてしまっていますね。
これは2つの原因が絡んでいます。

1つ目は、オフセットです。
ループ3周目にはオフセットが4になります。
通常書き込みも『アドレス+オフセット』の形でアドレスを取り扱うので
_M 0x08801010 0x11111111 アドレス0x08801010+オフセに0x11111111を書き込み
この行でオフセット+4された際に書き込まれるというわけです。

ではオフセット+1~+3の際に書き込まれたのはどこへ行ったのかということですが
これが原因2つめです。

32bit通常書き込みの場合、アドレス末端が0,4,8,Cのそれぞれの間は、

1,2,3の場合は0
5,6,7の場合は4
9,A,Bの場合は8
D,E,Fの場合はC

下の数字と見なすという働きのためです。
[0]123[4]567[8]9AB[C]DEF

つまりこうなります。

_M 0x08801011 0x11111111 0x08801000に0x11111111を書き込む
_M 0x08801012 0x11111111 0x08801000に0x11111111を書き込む 
_M 0x08801013 0x11111111 0x08801000に0x11111111を書き込む

オフセット+4になるまでは見た目では変わらなかった訳ですね。



▼0xD1 Loop Execute Variant

■サンプル3
_C0 PSPAR 8bit 0xD1
_M 0xD5000000 0x000000FF 0xFFを書き込みたい値としてセット。
_M 0xC0000000 0x00000003 ループ回数は3回
_M 0xD8000000 0x08801000 アドレス0x08801000+オフセに書き込み後オフセ+1。その後3回ループ。(合計4回書く。)
_M 0xD1000000 0x00000000 ここまでがループするブロック。オフセットをクリアしない。
_M 0x08801010 0x11111111 アドレス0x08801010+オフセに0x11111111を書き込み
_M 0xC6000000 0x08801020 アドレス0x08801020にオフセットを値として出力
■結果
0x00001000 0xFFFFFFFF
0x00001004 0x00000000
0x00001008 0x00000000
0x0000100C 0x00000000
0x00001010 0x00000000
0x00001014 0x11111111
0x00001020 0x00000004

今度は0x00001010に何も書き込まれていません。0x00000000のままです。
これは、0xD1までがループする対象になっている為で、ループを抜けた際に
初めて0x00001010に書き込むわけですが、その時にはオフセットが+0x4に
なっているので0x00001014に書き込んでしまうと言うわけです。



▼0xD2 Loop Execute Variant/ Full Terminator

■サンプル4
_C0 PSPAR 8bit 0xD2
_M 0xD5000000 0x000000FF 0xFFを書き込みたい値としてセット。
_M 0xC0000000 0x00000003 ループ回数は3回
_M 0xD8000000 0x08801000 アドレス0x08801000+オフセに書き込み後オフセ+1。その後3回ループ。(合計4回書く。)
_M 0xD2000000 0x00000000 ここまでがループするブロック。オフセットをクリア。
_M 0x08801010 0x11111111 アドレス0x08801010+オフセに0x11111111を書き込み
_M 0xC6000000 0x08801020 アドレス0x08801020にオフセットを値として出力
■結果
0x00001000 0xFFFFFFFF
0x00001004 0x00000000
0x00001008 0x00000000
0x0000100C 0x00000000
0x00001010 0x11111111
0x00001014 0x00000000
0x00001020 0x00000000


0x00001010に0x11111111が書き込まれています。
オフセットが0xD2でクリアされ+0x0になったためにこのような結果になりました。
0x00001020にはオフセットが0x00000000と表示されています。
一番よく使うのが0xD2なのでこれを最初に覚えておきましょう。


まとめ


簡単にまとめます。

1. 0xD5で値をセット
2. 0xC0でループ回数をセット
3. 0xD6~D7で書き込みを実行
4. 0xDCでオフセットを加算(必要に応じて)
5. 0xD2で終端コード





関連記事
スポンサーサイト

コメント: -

Home > TempAR Usage > TempAR - CWC/PSPAR形式短縮コード(シリアル)

Return to page top

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。