Обращаясь в 6502 - PullRequest
       62

Обращаясь в 6502

0 голосов
/ 28 сентября 2018

Я недавно начал программировать на сборке 6502 и столкнулся с проблемой.Я хотел бы иметь возможность хранить 16-разрядный адрес памяти, начиная с адреса $ 0300, затем я хотел бы сохранить значение по этому адресу.

Например, при сохранении адреса $ 2016 будет $ 0300: #$ 20, $ 0301: # $ 16.Затем я хотел бы прочитать эти два байта и сохранить значение в $ 2016.Кажется, я не могу найти режим адресации, который позволяет это, есть ли что-то подобное или мне нужно использовать нулевую подкачку.

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

0300 $: # 20 $, 0301 $: # 16 $.Затем я хотел бы прочитать эти два байта и сохранить значение в $ 2016.

Существует другой, менее рекомендуемый способ, если код доступен для записи: можно поместить адрес в байты операндов абсолютной инструкции хранения..

 LDA $301
 STA stins+1
 LDA $300
 STA stins+2
stins:
 STX $FFFF ; value in X; FFFF is placeholder for address
0 голосов
/ 28 сентября 2018

Вам нужно найти два нулевых местоположения страницы и проиндексировать их.Косвенная адресация доступна только через нулевую страницу.И, на самом деле, не существует косвенного режима с нулевой страницей, который также не использует индекс.

При условии, что доступны $02 и $03.Скопируйте туда байты.

; Store the address you want to access in zp memory
lda $300
sta $03     ; Note I'm swapping the bytes (see below)
lda $301
sta $02
; access the address indirectly through zero page
ldx #0
lda $data
sta ($02,x) ; x is zero so address used is $02

Причина, по которой я переставил байты при копировании их на нулевую страницу, заключается в том, что вы сохранили адрес (в вашем вопросе) в $300 в порядке с прямым порядком байтов, т.е.байт по младшему адресу.6502 является прямым порядком байтов, что означает, что он ожидает младший байт по младшему адресу.Вы должны действительно следовать 6502 соглашениям и хранить свои байты так, чтобы $300 содержал $16, а $301 содержал $20.

...