OPコメントでMichaelが説明したように、LAXはここでの優れたソリューションです。
- 元のNMOS 6502のために書いている、
- 文書化されていないオペコードを使用することに哲学的な異議を唱えないこと、および
- アキュムレータ (.A) の内容を保持する (または保護する) 必要はありません。
LAX は、.A と .X の両方に、メモリ位置からの値、または即値ゼロをロードします(以下を参照)。アドレッシング モード:
Mnemonic Bytes Cycles
LAX #00 AB 00 2
LAX abcd AF cd ab 4
LAX abcd,Y BF cd ab 4 (+1 if crossing page boundary)
LAX ab A7 ab 3
LAX ab,Y B7 ab 4
LAX (ab,X) A3 ab 6
LAX (ab),Y B3 ab 5 (+1 if crossing page boundary)
LAX は即時アドレス指定モードを欠いていると文書化されています ( LAX #nn
) が、実際LAX #$00
には安定しており、.A と .X の両方をゼロに設定したい場合に便利です。それぞれ 4 つ ( LDA #$00; LDX #$00
) または 3 バイト/ 4 サイクル ( LDA #$00; TAX
)。
この DASM マクロは、カスタム ニーモニック ( ZAX
、Zero .A および .X)に応答してバイト シーケンスを挿入します。
MAC ZAX
DC.W #$00AB ; [2] LAX Immediate Zero (only stable when operand is zero)
ENDM
これは、LAX を使用してバイトペア アドレス テーブルにインデックスを付ける、私が作成したテキスト ビットマップ レンダリング ルーチンからの短い抜粋です。
.dodraw LAX (_TEXTADDR),Y ; [5] get first character of pair from text-buffer
LDA _CHARTABL,X ; [4] get first glyph data address lo-byte
STA _GLYPADD1 ; [3] ZP set first glyph data address lo-byte
LDA _CHARTABH,X ; [4] get first glyph data address hi-byte
STA _GLYPADD1+1 ; [3] ZP set first glyph data address hi-byte
etc...