Косвенная индексация по регистру X - Ассемблер 6502

Итак, я пытаюсь выяснить, как обойти тот факт, что LDX не имеет опции для косвенной индексации, но мне все не повезло. (Довольно новый для ассемблера) Я использую LDA (arrPoint), Y для загрузки и получения MSB из массива int, и я хочу использовать 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

Спасибо


person F.Wigarde    schedule 20.11.2013    source источник
comment
Если вы не против уничтожить регистр A, вы можете использовать недокументированную инструкцию LAX (arrPoint),Y (загружает одно и то же значение как в A, так и в X). Код операции - $B3 на случай, если ваш ассемблер не поддерживает недокументированные инструкции.   -  person Michael    schedule 20.11.2013
comment
Ну, похоже, я не мог использовать LAX, но разве я не мог сначала загрузить один байт в Accumilator, а затем написать TAX, чтобы передать его в регистр X, а затем просто загрузить второй байт в Accumilator?   -  person F.Wigarde    schedule 20.11.2013
comment
LAX на 1 байт и на 1 цикл меньше, чем LDA + TAX, если я считаю правильно. Но в остальном это было бы то же самое.   -  person Michael    schedule 20.11.2013
comment
Спасибо, проблема решена!   -  person F.Wigarde    schedule 21.11.2013


Ответы (2)


Рассмотрите возможность преобразования массива в

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

позволяя

LDA lsb, Y
TAX                ;; faster alternative to STA $36 + LDX $36
LDA msb, Y
RTS
person Aki Suihkonen    schedule 20.11.2013

Как описал Майкл в комментариях OP, 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 в ноль - это занимает 2 байта и 2 цикла вместо 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...
person Eight-Bit Guru    schedule 21.11.2013