* Перемножение 8x8 со знаком.
*
* Ввод: Множитель и множимое находятся в VAR1 и VAR2
* Вывод: Результат, со знаком, в X:A
*
Метка Операция Операнд Комментарий
ORG $50 ; Адресное пространство RAM
* NEG_FLG RMB 1 ; Байт флага знака
* VAR1 RMB 1 ; Множитель
* VAR2 RMB 1 ; Множимое
*
*
ORG $6E00 ; Адресное пространство ROM/EPROM
S_MULT CLR NEG_FLG ; Очистка флага отрицательного значения
TST VAR1 ; Проверка VAR1
BGE POS ; Продолжение, если = >0
INC NEG_FLG ; Иначе установка флага отрицательного
; значения
NEG VAR1 ; Преобразование в положительное число
*
POS TST VAR2 ; Проверка VAR2
BGE POS2 ; Продолжение, если = >0
INC NEG_FLG ; Иначе переключение флага отрицательного
; значения
NEG VAR2 ; Преобразование в положительное число
*
POS2 LDA VAR2 ; Загрузка VAR1
LDX VAR1 ; Загрузка VAR2
MUL ; VAR1 x VAR2, без знака, - > X:A
BRCLR 0, NEG_FLG, EXIT ; Выход, если оба операнда положительны
; или оба операнда отрицательны
COMA ; Иначе дополнение до 1 A и X
COMX
ADD #1 ; Добавление 1 в дополнение до 2 (младший
; байт)
PSHA ; Сохранение младшего байта результата
TXA ; Пересылка старшего байта (без знака)
; результата
ADC #0 ; Добавление результирующего переноса для
; завершения дополнения до 2
TAX ; Возврат к X
PULA ; Восстановление младшего байта
; результата
EXIT RTS ; Возврат
*
|