Сборка: проблемы приращения памяти - PullRequest
0 голосов
/ 26 декабря 2018

Я только начинаю сборку 6502, и я пытаюсь понять основы.Я использую эмулятор JavaScript на своем телефоне для сборки кода.Я пытаюсь заставить его увеличить p (место в моей памяти) и сохранить A в обоих адресах (как прелюдия к циклу позже).Но при запуске он хранит только A до 0205 долларов, а не 0206 (что я и пытаюсь сделать).Любая помощь приветствуется.

LDA #$01
define p $0205
STA p
INC p
STA p

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Код, который вы написали, не делает то, что вы думаете.p - это просто определенное имя для числа $205.По сути, ваша программа имеет значение

LDA #$01
; define p $0205
STA $0205
INC $0205
STA $0205

Инструкция INC увеличивает содержимое местоположения $0205, но затем она немедленно перезаписывается вторым STA.

Есть несколько способов сделать то, что вы хотите.Во-первых, если это всегда местоположение p, а следующее, в зависимости от вашего ассемблера, вы должны написать

LDA #$01
define p $0205
STA p
STA p+1

, который поместит 1 в $0205 и $0206.Альтернатива, если вы хотите сделать приращение во время выполнения, это использовать регистр индекса, из которых есть два X и Y.

LDA #$01
define p $0205
LDY #0
STA p,Y
INY 
STA p,Y

Это не совсем лучше, чем предыдущий, но его можно использовать в цикле.

define p $0205
define count 10

    LDA #$01
    LDY #count
loop:
    DEY        ; Decrement Y by 1 setting the zero flag if zero
    STA p,Y    ; Store the result in p + Y (flags are unaffected)
    BNE loop   ; Go round the loop if the zero flag is not set

Приведенное выше заполнит места от p до p + 9 константой1. Обратите внимание, что он делает это, перемещаясь вниз по памяти.

Если p неизвестен до времени выполнения, вы можете сделать то же самое, но используя косвенный адрес нулевой страницы.

define p $0205
define count 10
define ptr $50 ; A random zero page location

    LDA #$01
    LDY #count

; First load the address in the zero page location

    LDA <p     ; < is a common notation for the low byte of a 16 bit number ($05 in this case)
    STA ptr
    LDA >p     ; and > is for the high byte ($02 in this case)
    STA ptr+1

; Now a similar loop to before

loop:
    DEY        ; Decrement Y by 1 setting the zero flag if zero
    STA (ptr),Y; Store the result in p + Y (flags are unaffected)
    BNE loop   ; Go round the loop if the zero flag is not set
0 голосов
/ 26 декабря 2018

Я думаю, что вы поместили адрес (0205) в индексный регистр (я думаю, что 6502 имеет 2 из них).Сохраните A в адрес, на который указывает индексный регистр, увеличьте индексный регистр и сохраните A в адрес, на который указывает индексный регистр.

...