Я хочу разделить число 16 бит на два. Мое решение проблемы было нижеКак разделить число 16 бит на 2 в 6502 asm?
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
Как это работает?
LSR = CLC + ROR – i486
этом. Умножение и деление на (кратные) два являются не более чем бит-сдвигами влево или вправо. «LIB hi-byte, ROR lo-byte» достигнет вашей цели с 16-разрядным делением без повторений кода цикла, регистрации свопов и т. Д. –
@ i486. Спасибо i486. Я отредактировал ответ. – Hoopje