Как умножать с помощью алгоритма сложения и сдвига в 6502, когда множимое находится в аккумуляторе?

Итак, я пытаюсь умножить, используя сложение и сдвиг. Я хочу сохранить множимое в аккумуляторе и множимое в X-регистре. Я действительно не знаю, почему мой код не работает, но я подозреваю, что это из-за того, что множимое находится в аккумуляторе и помещает произведение в отдельный регистр.

Вот мой код:

      LDA #49
      LDX #8
      LDY #$8
      STA $700
      STX $704
loop:           ; if 1
      BCC  loop2    ; if 0, go to loop2
      CLC       ; clear carry for adc
      ADC $700      ; adc
loop2: ;     if 0
      ROL $700      ; left shift
      CLC
      ROR $704
      DEY
      BNE loop      ; if not 0, go to loop
      STA $700      ; store A in product register

спасибо за помощь


person Ron Borenstein    schedule 09.05.2021    source источник
comment
См. wiki.nesdev.com/w/index.php/8-bit_Multiply для примеров 8x8-битного умножения на 6502.   -  person Michael    schedule 09.05.2021


Ответы (1)


Это исправленная версия. Проверьте двойную точку с запятой для изменений. Самой большой ошибкой было забыть сбросить аккумулятор и поставить флаг перед первым циклом.

      LDA #49
      LDX #8
      LDY #9    ;; you need to increase your loop by 1
      STA $700
      STX $704
      LDA #$00  ;; you need to reset acc
      CLC       ;; and clear carry
loop:           ; if 1
      BCC  loop2    ; if 0, go to loop2
      CLC       ; clear carry for adc
      ADC $700      ; adc
loop2: ;     if 0

      ;ROL $700     ;; these three lines
      ;CLC          ;; are replaced with
      ;ROR $704     ;; the two lines below

      ROR        ;; this is
      ROR $704   ;; faster

      DEY
      BNE loop      ; if not 0, go to loop
      STA $700      ; store A in product register
person Emir Akaydın    schedule 09.05.2021
comment
Большое спасибо! Зачем нам нужно CLC перед циклом и почему мои первые три строки не работают? Еще раз спасибо. - person Ron Borenstein; 10.05.2021
comment
Самая первая инструкция после loop: — это BCC; если вы не ставите перед циклом CLC, тогда флаг переноса изначально будет в неопределенном состоянии. - person Tommy; 11.05.2021