В делении аналогичный фрагмент с не вполне корректным изменением знака
Код:COM R4 ; dividend was negative
NEG R3
Вид для печати
В делении аналогичный фрагмент с не вполне корректным изменением знака
Код:COM R4 ; dividend was negative
NEG R3
Вы оба правы, внёс предложенные исправления.
Заодно подумаю над фиксом MKDOS, чтобы вектор обработки команд расширенной арифметики всегда указывал на драйвер, а не сбрасывался системой постоянно.
Какой всё же должен быть ответ и флаги при MUL #100000,R5 если в R5 число 77777 ?
Результат умножения -32768dec*32767dec=-1073709056dec=30000100000oct=C0008000hex
Кстати, команда ASH ведь работает с 16-битным числом, а сдвиг задаётся 6-ю битами. Значит, если сдвиг больше 15 или меньше -15, то мы сразу знаем ответ? При сдвиге влево это 0, а при сдвиге вправо это SXT от аргумента.
Еще спорный момент с флагом C при умножении.
"C: set if the result is less than -2^15 or greater than or equal to 2^15."
Как я понимаю из этого описания, нужно установить флаг если результат <-2^15 или >=2^15, т.е. текущий вариант процедуры неправильно установит флаг, если результат =-2^15. Или я неправильно понял описание (или описание не совсем корректное). Для проверки можно, например, умножить #1 на #100000
Само умножение можно немного ускорить и сократить
Скрытый текст
Код:...
CLR R4
mov r2,r3
xor r5,r3 ; result's sign
...
BPL 1
NEG R2
1: TST R5
BPL 2
NEG R5
2: ...
CLR R1
CLR R0 ; R0_R1 = R4_R5 * R2
br 31
3: ; main loop
BCC 5
ADD R5,R1
ADC R0
ADD R4,R0
5: ASL R5
ROL R4
31: ROR R2
bne 3 ; end of main loop
ADD R5,R1
ADC R0
ADD R4,R0
7: ...
72: TST R3 ; result's sign
bpl 0
...
[свернуть]
Не проходит тест умножение -7 на 3 и 7 на -3 - ответ получается положительный, 21.
Видимо, не надо было убирать INC R3 и DEC R3. Если их оставить, то тесты проходят.
Впрыгнуть в конец цикла, чтобы избежать лишнего BR в цикле - хорошая идея, действительно ускоряет умножение в среднем на 26 тактов. Спасибо.
Заодно ускорил ASH для сдвига вправо:
Код:3: BIS #177760,R5 ; leave only 4 bits of negative value
ADD #20,R5 ; 16
ASL R5 ; offset
ADD R5,PC
.repeat 16.
{
ASR R4
}
CLV ; bit V should be 0 after right shift