ZZ[ZZ-xxxx-y-nn,...]-xxxx-y-nn-comment
↑(条件分岐時のみ)
xxxx: アドレス
{ 0000H- 0800H : MainMemory }
{ 6000H- FFFFH : ROM(書き込みは危険カもしれないので今のところ不可) }
{ 10000H-1FFFFH : SRAM }
{ 20000H-2FFFFH : Mapper拡張メモリ }
y: データのサイズ(バイト数)
nn: データ
*一部のコードで例外あり。
//*********** 以下コードの説明 ************//
ZZ : コード
(mはファミコン内部のメモリ[メインメモリ, SRAM, マッパー拡張メモリ])
・演算 (xxxx = アドレス)
00: 書き換え // m = n
01: 一度書き換え
02: 加算 // m = m + n
03: 減算 // m = m - n
04: 論理積 // m = m & n
05: 論理和 // m = m | n
06: 排他的論理和 // m = m ^ n
07: 左ビットシフト // m = m << n
08: 右ビットシフト // m = m >> n
09: 乗算 // m = m * n
0A: 除算 // m = m / n
0B: 除算の余り // m = m % n
0C: コピー // m[n] = m[xxxx]
// xxxx = コピー元のアドレス、 nn = コピー先のアドレス, y = コピーするサイズ
*使用例:
00-0100-1-0 // アドレス 0100H に0(1バイト)を書き込む
0C-0200-2-0400 // アドレス 0200H からアドレス 0400Hに数値をコピー(2バイト)
・条件実行命令 (m = メモリ, n = データ)
10: IF (m & n)
11: IF !(m & n)
12: IF (m == n)
13: IF (m != n)
14: IF (m < n)
15: IF (m > n)
16: IF (m <= n)
17: IF (m >= n)
18: IF (1) // 常に実行(幾つかのコードをまとめる時に使用)
// [30-0000-1-00,32-0100-1-1] ←のように省略可能
*条件実行命令について。
条件に合った時にサブコードが実行されます。
例:(アドレス 0000Hが0(1byte)の時だけ0100Hに1を書き込む)
12[00-0100-1-1]-0000-1-00 // IF(m[0x0100] == 0)
11[00-0100-1-1]-0000-1-FF // IF(m[0x0100]&0xff == 0)
サブコードは"[ ]"内に書きます。
','で区切って複数のコードが使用できます。(一応制限はありません)
・繰り返し
// エミュレータ側の変数
TM_AD : アドレス
TM_DT : データ
TM_SIZE : データのサイズ
// -------------------
20: アドレス、データをセット
TM_AD = xxxx , TM_DT = nn, TM_SIZE = y
21: コードを実行(xxxx = 繰り返し数, nn = 実行コード, y = 未使用)
xxxxで指定された回数だけnnで指定されたコードを実行します。
アドレスはコード20でセットされたTM_AD, データはTM_DTを使用します。
コードを実行するたびにTM_SIZEをTM_AD(アドレス)に加算します。
22: 転送(xxxx = 転送元アドレス, nn = 繰り返し数, y = 未使用)
xxxxで指定されたアドレスからTM_ADで指定されたアドレスに数値をコピーします。
コードを実行するたびにTM_SIZEをTM_AD,xxxxに加算します。
23: 書き換え(xxxx = 繰り返し数, nn = 書き込むデータ, y = 未使用)
・コード20でアドレス,データをまず指定します。
例:
・[20-0000-1-00,22-0100-1-1]
// アドレス 0000H-0100Hの範囲を0で埋める
・[20-0000-1-00,21-0100-1-1]
// アドレス 0000H-0100Hまでを0200H-0300Hにコピー
・一時メモリ
// エミュレータ側の変数
TM[32] : 保存メモリ
// -------------------
*メモリと一時メモリ評価
// xxxx = メモリアドレス, n = 一時メモリのアドレス(最大0x1f)
30: IF (m[x] & TM[n])
31: IF !(m[x] & TM[n])
32: IF (m[x] == TM[n])
33: IF (m[x] != TM[n])
34: IF (m[x] < TM[n])
35: IF (m[x] > TM[n])
36: IF (m[x] <= TM[n])
37: IF (m[x] >= TM[n])
38: TM[nn] = m[xxxx] // メモリを保存 ;xxxx = メモリのアドレス, nn = 保存メモリのアドレス
39: m[xxxx] = TM[nn] // 一時メモリからメモリに書き込み ;xxxx = メモリのアドレス, nn = 保存メモリのアドレス
3A: TM[xxxx] = nn // 一時メモリに数値書き込み ;xxxx = 保存メモリのアドレス, nn = 書き込むデータ
3B: TM[xxxx] += nn // 一時メモリに加算 ;xxxx = 保存メモリのアドレス, nn = 数値
3C: TM[xxxx] -= nn // 一時メモリを減算 ;xxxx = 保存メモリのアドレス, nn = 数値
*一時メモリと数値評価
// xxxx = 一時メモリのアドレス, n = 数値
40: IF (TM[x] & n)
41: IF !(TM[x] & n)
42: IF (TM[x] == n)
43: IF (TM[x] != n)
44: IF (TM[x] < n)
45: IF (TM[x] > n)
46: IF (TM[x] <= n)
47: IF (TM[x] >= n)
使用例:(一時メモリを使用して、複数の条件があった場合実行する)
(これはアドレス0x0000が0x10、0x0100が0x20の数値だった場合0x0200に数値0x30を書き込む)
3A-0000-4-0 ; TM[0]を0で初期化
12[3B-0-4-1]-0000-1-10 ; IF (m[0x0000] == 0x10) TM[0] += 1;
12[3B-0-4-1]-0100-1-20 ; IF (m[0x0100] == 0x20) TM[0] += 1;
42[00-0200-1-30]-0-4-2 ; IF (TM[0] == 2) m[0x0200] = 0x30
#メモ:
・コードの順番を入れ替えると正常に動作しません。
・3A-0000-4-0000 は 3A-0-4-0でも可。
・メモリ同士の比較(条件実行)
// xxxx = メモリのアドレス, nn = メモリのアドレス(右辺), y = 比較するサイズ
50: IF (m[x] & m[n])
51: IF !(m[x] & m[n])
52: IF (m[x] == m[n])
53: IF (m[x] != m[n])
54: IF (m[x] < m[n])
55: IF (m[x] > m[n])
56: IF (m[x] <= m[n])
57: IF (m[x] >= m[n])