16ビットの数値を2で割りたいです。問題に対する私の解決策は以下の通りでした
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
マクロが A から MSB を読み取り、X から LSB を読み取るためです。
オンラインで代替案を確認したところ、私のささやかな除算ルーチンに代わる命令が 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
これはどのように機能しますか?