С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Код:TST R0 BPL 10$ NEG R0 10$:
Это очевидный вариант.Код:TST R0 BPL 10$ NEG R0 10$:
Нужно без ветвлений - "борьба за скорость"
Например при расчете AABB этих ABS будет много.
- - - Добавлено - - -
Скоро проверю в "реальной жизни" несколько вариантов.. там видно будет.
Последний раз редактировалось S_V_B; 18.05.2021 в 12:48.
БK 0010-01, БК 11М, БК11М+,МС 0511 (УКНЦ)х3, Atari 65XE, Commodore 64, AMIGA 500 (HDD), ZX EVO
Заменил конструкцию:
на эквивалентнуюКод:MOV R3,R2 ASR R2 ASR R2 ASR R2 MUL #40.,R2 ;Y/8*40 ADD R3, R0 ; адрес под спрайтом в тайлбуфере
Код:BIC #7, R3 MOV R3,R2 ASL R3 ASL R3 ADD R2,R3 ADD R3, R0 ; адрес под спрайтом в тайлбуфере
БK 0010-01, БК 11М, БК11М+,МС 0511 (УКНЦ)х3, Atari 65XE, Commodore 64, AMIGA 500 (HDD), ZX EVO
Она не эквивалентная.
ADD R3, R0 после команды MUL, к R0 прибавляет не R2*5, а старшую часть умножения на 40., то, что за 16 бит из R2 вылезло.
У меня эквивалентный код получается такой:
- - - Добавлено - - -Код:mov R3, R2 bic #7, R2 clr R3 mov R2, -(SP) asl R2 rol R3 asl R2 rol R3 add (SP)+, R2 adc R3 add R3, R0
Ну, либо в первом примере опечатка.
Последний раз редактировалось gid; 20.05.2021 в 13:35.
БK 0010-01, БК 11М, БК11М+,МС 0511 (УКНЦ)х3, Atari 65XE, Commodore 64, AMIGA 500 (HDD), ZX EVO
Вот только MUL #40.,R2 - это, внезапно, не умножение R2 на 40, а умножение 32-ух битного числа (R2 старшая часть и R3 младшая часть) на 40, так что по результату - тупо умножить R3 на 40 с усечением до 16 бит
Он был бы эквивалентный, если бы в оригинале было бы
к R0 прибавляли бы R2Код:MOV R3,R2 ASR R2 ASR R2 ASR R2 MUL #40.,R2 ;Y/8*40 ADD R2, R0 ; адрес под спрайтом в тайлбуфере
В 1801ВМ2 и ВМ3 - нет, MUL там умножение Rn:Rn+1 = Rn * (SS), т.е. умножение 16-битного числа на 16 битное число, с сохранением результата в 32-х битное число
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)