Я хочу разделить 16-битное число на два. Мое решение проблемы было следующим
lda $17 ;set high byte
ldx $32 ;set low byte
divide:
PHA ;push A to stack
TXA ;X > A
LSR ;divide low byte by 2
TAX ;A > X
PLA ;pull A from stack
LSR ;divide high byte by 2
BCC + ;C=0, skip
PHA ;while C=1
TXA ;add $80 to the lsb
ADC #$80
TAX
PLA
+
+printDecimal $0400+120
Вся хитрость PHA/PLA
связана с тем, что мой макрос printDecimal
считывает MSB из A и LSB из X.
Когда я искал альтернативы в Интернете, я нашел альтернативу 4 инструкциям для моей скромной процедуры деления. Но я не понял.
div2:
LDA counter_hi ;Load the MSB
ASL ;Copy the sign bit into C
ROR counter_hi ;And back into the MSB
ROR counter_lo ;Rotate the LSB as normal
LDA counter_hi
LDX counter_lo
+printDecimal $0400+40
Как это работает?