5かいプログラムのスニペット
ニックネームでプログラムを書くときのスニペット。 アイテムを使って書く場合よりも数値的に大きい値が使いやすいのが魅力ですが、中間付近に使えない命令がいっぱいあるのが曲者。 通常書けない命令を言い換えてうまくかけるようにしました。 0x50に関してはうまく処理してください。ロード系
ld a, 00
お馴染みのxorです。x86ではむしろこっちがデフォルト感すらある。
AF; xor a ョ
ld a, FF
0x00-0x01は0xFFです。
AF; xor a ョ
3D; dec a べ キャリー立たないらしい
ld [bcd], 00
decする方法
0x05を入れてから5回decする以上に良い方法が見つかりません。濁点多くてちょっと面倒。
06 05; ld b, 05 ギガ
05; dec b ガ
05; dec b ガ
05; dec b ガ
05; dec b ガ
05; dec b ガ
ローテートする方法
ローテート使うともっと簡単にかけそうだった。コード長は若干短くなった。
06 80; ld b, 80 ギア
BF; cp a そ (cpでキャリーを0に。ccfは使えません。)
CB 10; sla b ひヂ
リセットする方法
これたぶん最短。
06 80; ld b, 80 ギア
CB B8; res 7,b; ひく
ld a, b
AF; xor a
80; add b 同様にc,d,e,h,l,(hl)からもld可能
ジャンプ系
フラグ破壊注意、負数の場合オフセットずれ注意jr xx
zフラグを立ててからjr zします。cp aでaレジスタとaレジスタを比較すれば当然zフラグが立ちます。
BF; cp a そ
28 xx; jr z xx ぐ[xx]
jr nz, xx
jr nzの代わりに強制のjrを置き、zの場合はそれをjr zで飛び越えるようにします。が、jr z, 02は書けないのでいくつかnopを挟むことになります。
28 05; jr z, 05 ぐガ
BF; cp a そ このcpはzを立てるためです
BF; cp a そ ここと次はnopがわりです
BF; cp a そ このへんどっかでうまく0x50をはさんでください
28 xx; jr z xx ぐ[xx]
jr c, xx
原理はjr nzと同様。
30 05; jr nc, 05 だガ
BF; cp a そ このcpはzを立てるためです
BF; cp a そ ここと次はnopがわりです
BF; cp a そ このへんどっかでうまく0x50をはさんでください
28 xx; jr z xx ぐ[xx]
tips
- 入力可能な文字: 「をヲ」を除く通常の仮名+濁音半濁音、「ャュョッゃゅょっ」および0x50。
- メモリからbへのロードは46 ld b,(hl)を使うとできる。それ以外のレジスタは入力不能な文字を含む。
- ldi (hl),aはできないがldd (hl),aはできる。ループは後ろから回すと効率的。a,(hl)はどっちもできる。
- レジスタ間のldは基本的にできないが、終端文字50をうまく使うとld d,bだけはできる。
- 16bitのレジスタ間ldはpushとpopを使うと一部できる。bc,deからbc,de,hlへのロードが可能。しかし肝心のaは操作不能である。
- aレジスタはレジスタからのld以外はほぼ全ての命令が使える範囲にあります。あと即値xorが使えれば完璧だったのだが・・・
- CBのビット操作命令はRESはだいたい使えそう。SETは下位のみ。
- どうしても上位bitを立てたいときはswap [bcdeh]を活用しましょう。
- なんかのパラメータを取りたいときは道具欄のアイテム個数あたりを取ると良いと思います。D2A3-D2CAまではいずれも入力可能です。ただし0x63までの値しか取れないので注意。
- アドレスや数値がちょっと入力可能範囲に届かない場合はinc/decをうまく使いましょう。inc/decを連発しても入力の手間は大きく変わりません。
- 通常a以外のレジスタに直接演算結果の代入はできませんが、cb prefixのビット演算命令は対象のレジスタにビット演算の結果を書き戻すのでうまく使うとアドレスの調整などに使えます。
- 入力不能な文字にどうしても使いたい命令がある場合は、手間はかかりますが一文字ずつプログラムでかきかえることもできます。
- ループなど戻りのジャンプが必要な場合、相対ジャンプでは一定以上の距離がないと飛べないため絶対ジャンプの方が良い場合もあります
0x50の処分の仕方
- 予めbにdと同じ値を入れておいてそのまま動かしてしまう。42 ld b, dが使用可能。
- ldで適当なレジスタに代入する。
- addやsubと組み合わせてaレジスタに都合よく値を作るのに使う。
- push deとpop deで挟む
- cb 50にしてbit 2,Bに化けさせる。
戻る
connecting: rikako.2rnd.msmrrenda.net