2013-11-20 1 views
1

Итак, я пытаюсь понять, как обойти тот факт, что LDX не имеет возможности для косвенного индексирования, но мне все не повезло. (Довольно новый с ассемблером) Я использую LDA (arrPoint), Y для загрузки MSB из массива int, и я хочу использовать LDX (arrPoint), Y для получения LSB.Непрямое индексирование по регистру X - Assembler 6502

Любые советы о том, как я могу написать это, поэтому я могу использовать косвенные индексы с регистром X?

Вот некоторые из моего кода, где arrPoint находится в памяти 1000 $, а slask - 2 databytes.

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 

Благодаря

+2

Если вы не возражаете, крушить 'A' регистр вы можете использовать недокументированные инструкции' LAX (arrPoint), Y' (загружает ту же величину, чтобы как 'A', так и' X'). Код операции - '$ B3', если ваш ассемблер не поддерживает недокументированные инструкции. – Michael

+0

Ну, похоже, я не мог использовать LAX, но не мог ли я сначала загрузить один байт в Accumilator, а затем написать TAX, чтобы перенести его в регистр X, а затем загрузить второй байт в Accumilator? –

+0

'LAX' 1 байт и 1 цикл меньше, чем' LDA' + 'TAX', если я правильно рассчитываю. Но кроме этого было бы одно и то же. – Michael

ответ

2

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

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

позволяя

LDA lsb, Y 
TAX    ;; faster alternative to STA $36 + LDX $36 
LDA msb, Y 
RTS 
2

Как описано Майклом в комментариях О.П., 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, Нулевая .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... 

 Смежные вопросы

  • Нет связанных вопросов^_^