Код, который вы написали, не делает то, что вы думаете.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