SMB Laboratoryのトップページへ

6502 CPUのbit命令を用いたコードサイズの縮小

概要

 以前に運営していたサイトの掲示板で、ATA氏に投稿していただいた6502 CPUのbit命令を用いたプログラムコードのサイズ縮小についての解説です。

投稿内容

 bitはcmp cpx cpyと同じ比較命令です。これらは演算結果によるフラグを立てるのみで、アキュムレータ等には直接的な影響は及ぼさず、ある程度素通りが許される(?)もののようです。

 一例を挙げますと[ lda #$01 bit $09A9 sta $07FF ]の場合、Aレジスタは途中のbitによる影響を受けないため、そのまま$07FFに<01>がストアされるということになります。さらに、ここからが本領です! このソースをバイナリに置き換えると[ A9 01 2C A9 09 8D FF 07 ]となるのですが、4バイト目から読み込むことで、今度は<09>を$07FFにストアできることにお気づきでしょう。もし分岐によって<01> <09>のどちらかをストアさせたい場合、[ A9 01 4C XX XX A9 09 8D FF 07 ]とするのが妥当です。ところが、bitを用いたソースでは後者に比べて2バイトもの容量を節約することができるのです!!

 ちなみに、これはbitだけでなく、比較命令全般に適用します。2Cはbitの絶対アドレスなので、同じようにcmp絶対アドレスのCDを用いても、問題なく動作します。

備考

bitを用いたソース(8バイト)

バイナリ
A9 01lda #$01
2C A9 09bit $09A9
8D FF 07sta $07FF

bitを用いたソースで4バイト目から読み込んだ場合

バイナリ
A9 09lda #$09
8D FF 07sta $07FF

妥当なソース(10バイト)

アドレスバイナリ
A9 01lda #$01
4C XX XXjmp $XXXX
A9 09lda #$09
XXXX8D FF 07sta $07FF

補足

 昔のゲーム機は、ROMの容量が少なかったため、この様なプログラミング上の工夫によって、少しでもプログラムコードのサイズを小さくしようとする努力が行われていました。

inserted by FC2 system