1

そのため、LDX には間接インデックスのオプションがないという事実を回避する方法を見つけようとしていますが、すべてうまくいきません。(アセンブラではかなり新しい) LDA (arrPoint)、Y を使用して int 配列から MSB を取得し、LDX (arrPoint)、Y を使用して LSB を取得したい。

Xレジスタで間接インデックスを使用できるように、これを作成する方法に関するヒントはありますか?

これが私のコードの一部です。arrPoint はメモリ $1000 にあり、slask は 2 データバイトです。

getInt: 
    ASL
    STA $36
    LDY $36
    LDX arrPoint, Y
    INY
    LDA (arrPoint), Y

    RTS

setInt:
    STY slask
    ASL slask
    LDY slask
    STX arrPoint, Y
    INY
    STA (arrPoint), Y

    RTS

ありがとう

4

2 に答える 2

2

OPコメントでMichaelが説明したように、LAXはここでの優れたソリューションです。

  1. 元のNMOS 6502のために書いている、
  2. 文書化されていないオペコードを使用することに哲学的な異議を唱えないこと、および
  3. アキュムレータ (.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...
于 2013-11-21T10:37:53.333 に答える
2

配列を次のように変換することを検討してください

 uint8_t lsb[N];
 uint8_t msb[N];

許可する

LDA lsb, Y
TAX                ;; faster alternative to STA $36 + LDX $36
LDA msb, Y
RTS
于 2013-11-20T20:02:28.820 に答える