Данная библиотека арифметических функций составлена Сергеем Вакуленко по материалам сайта Ангстрем http://www.angstrem.ru/product/risc.htm.
Беззнаковое умножение 8×8
movl %a0,0Fh ; Исходные... movl %a1,0Fh ; ...данные jsr mul8u ; Вызов рабочей подпрограммы
Знаковое умножение 8×8
movl %a0,0Fh ; Исходные... movl %a1,0Fh ; ...данные jsr mul8s ; Вызов рабочей подпрограммы
Беззнаковое умножение 16×16
movl %a0,0Fh ; Исходные... movl %a1,0Fh ; ...данные movl %a2,0Fh ; Исходные... movl %a3,0Fh ; ...данные jsr mul16u ; Вызов рабочей подпрограммы
Знаковое умножение 16×16
movl %a0,0Fh ; Исходные... movl %a1,0Fh ; ...данные movl %a2,0Fh ; Исходные... movl %a3,0Fh ; ...данные jsr mul16s ; Вызов рабочей подпрограммы
Беззнаковое деление 8×8
movl %a0,0Fh ; Исходные... movl %a1,02h ; ...данные jsr div8u ; Вызов рабочей подпрограммы
Знаковое деление 8×8
movl %a0,0Fh ; Исходные... movl %a1,02h ; ...данные jsr div8s ; Вызов рабочей подпрограммы
Беззнаковое деление 16×16
movl %a0,0Fh ; Исходные... movl %a1,03h ; ...данные movl %a2,03h ; Исходные... movl %a3,00h ; ...данные jsr div16u ; Вызов рабочей подпрограммы
Вход:
Выход:
Используется:
mul8u: xor %a2, %a2 ; Инициализация ст. байта результата и CF movl %a3, 9 ; Число битов в байте + 1 jmp $4f ; На нулевой сдвиг 2-го множителя $2: add %a2, %a0 ; Сложение ст. байта результата с 1-ым множителем $3: rrc %a2 ; Циклич. сдвиг вправо ст. байта результата $4: rrc %a1 ; Циклич. сдвиг вправо мл. байта результата и 2-го множителя jc $5f ; Если CF=1 dec %a3 ; Пока не все jnz $3b ; сдвиги rts ; Выход из подпрограммы $5: dec %a3 ; Пока не все sst 1 ; CF=1 jnz $2b ; сдвиги rts ; Выход из подпрограммы
Вход:
Выход:
Используется:
mul8s: xor %a2, %a2 ; Инициализация ст. байта результата и CF movl %a3, 8 ; Число битов в байте jmp $3f ; На битовую проверку $2: add %a2, %a0 ; Сложение ст. байта результата с 1-ым множителем $3: bttl %a1, 0001b ; Установлен бит 0 в мл. байте результата и 2-го множителе? jz .+1 ; Нет sub %a2, %a0 ; Восстановление ст. байта результата shra %a2 ; Арифметич. сдвиг вправо ст. байта результата rrc %a1 ; Циклич. сдвиг вправо мл. байта результата и 2-го множителя jc $5f ; Если CF=1 dec %a3 ; Пока не все jnz $3b ; сдвиги rts ; Выход из подпрограммы $5: dec %a3 ; Пока не все sst 1 ; CF=1 jnz $2b ; сдвиги rts ; Выход из подпрограммы
Вход:
Выход:
Используется:
mul16u: clr %a5 ; Инициализация байта 3 результата xor %a4, %a4 ; Инициализация байта 2 результата и CF movl %a6, 17 ; Число битов в байте + 1 jmp $4f ; На нулевой сдвиг 2-го множителя $2: add %a4, %a0 ; Сложение байта 2 результата с мл. байтом 1-го множителя adc %a5 ; Сложение байта 3 результата с CF jnc $100f ; Если не установлен CF add %a5, %a1 ; Сложение байта 3 результата с ст. байтом 1-го множителя sst 1 ; Восстановление jmp $3f ; CF $100: add %a5, %a1 ; Сложение байта 3 результата с ст. байтом 1-го множителя $3: rrc %a5 ; Циклич. сдвиг вправо байта 3 результата rrc %a4 ; Циклич. сдвиг вправо байта 2 результата $4: rrc %a3 ; Циклич. сдвиг вправо байта 1 результата и мл.б. 2 множителя rrc %a2 ; Циклич. сдвиг вправо байта 0 результата и ст.б. 2 множителя jc $5f ; Если CF=1 dec %a6 ; Пока не все jnz $3b ; сдвиги rts ; Выход из подпрограммы $5: dec %a6 ; Пока не все sst 1 ; CF=1 jnz $2b ; сдвиги rts ; Выход из подпрограммы
Вход:
Выход:
Используется:
Недоделано - пока оставляю эту п/программу, займусь лучше следующими
mul16s:
clr %a5 ; Инициализация байта 3 результата
xor %a4, %a4 ; Инициализация байта 2 результата и CF
movl %a6, 16 ; Число битов в байте
$1: JNC $3f
$2: add %a4, %a0 ; Сложение байта 2 результата с мл. байтом 1-го множителя
adc %a5 ; Сложение байта 3 результата с CF
jnc $100f ; Если не установлен CF
add %a5, %a1 ; Сложение байта 3 результата с ст. байтом 1-го множителя
sst 1 ; Восстановление
jmp $3f ; CF
$100: add %a5, %a1 ; Сложение байта 3 результата с ст. байтом 1-го множителя
$3:
jsr RBTTL
jz .+1 ; Нет
sub %a4, %a0 ; Восстановление байта 2 результата
jsr RBTTL
jz $4f ; Нет
sbc %a5 ; Восстановление
jnc $200f ; Если не установлен CF
sub %a5, %a1 ; байта 3 результата
sst 1 ; Восстановление
jmp $4f ; CF
$200: sub %a5, %a1 ; байта 3 результата
$4:
shra %a5 ; Арифметич.сдвиг вправо байта 3 результата
rrc %a4 ; Циклич. сдвиг вправо байта 2 результата
rrc %a3 ; Циклич. сдвиг вправо байта 1 результата и мл.б. 2 множителя
rrc %a2 ; Циклич. сдвиг вправо байта 0 результата и ст.б. 2 множителя
JSR RDEC ; {Это}
jnz $1b ; {всё}
rts ; {временно}
;???
jc $5f ; Если CF=1
dec %a6 ; Пока не все
jnz $3b ; сдвиги
rts ; Выход из подпрограммы
$5: dec %a6 ; Пока не все
sst 1 ; CF=1
jnz $2b ; сдвиги
rts ; Выход из подпрограммы
;
; П/программки для сохранения бита C
;
RDEC: jc $1f
dec %a6
rts
$1: dec %a6
sst 1
rts
RBTTL: jc $1f
bttl %a2, 0001b
rts
$1: bttl %a2, 0001b
sst 1
rts
;RBTTH: jc $1f
; btth %a4, 1000b
; rts
;$1: btth %a4, 1000b
; sst 1
; rts
;
;CBTTH1:
; jc .+2
; btth %a1, 1000b
; rts
; btth %a1, 1000b
; sst 1
; rts
Вход:
Выход:
Используется:
div8u: xor %a2, %a2 ; Инициализация остатка и CF movl %a3, 9 ; Число битов в байте + 1 $1: rlc %a0 ; Циклич. сдвиг влево делимого и частного jc $4f ; Если CF=1 dec %a3 ; Пока не все jnz $2f ; сдвиги rts ; Выход из подпрограммы $4: dec %a3 ; Пока не все sst 1 ; CF=1 jnz $2f ; сдвиги rts ; Выход из подпрограммы $2: rlc %a2 ; Циклич. сдвиг влево остатка sub %a2, %a1 ; Вычитание из остатка делителя jnc $3f ; Если разность >0 add %a2, %a1 ; Иначе - восстанавливается остаток cst 1 ; CF=0 jmp $1b ; Следующий цикл $3: sst 1 ; CF=1 jmp $1b ; Следующий цикл
Вход:
Выход:
Используется:
div8s: mov %a4, %a0 ; Делимое - в знаковый регистр xor %a4, %a1 ; XOR знакового регистра с делителем btth %a1, 1000b ; Делитель <0? jz .+1 ; Нет neg %a1 ; Смена знака делителя btth %a0, 1000b ; Делимое <0? jz .+1 ; Нет neg %a0 ; Смена знака делимого clr %a2 ; Инициализация остатка movl %a3, 9 ; Число битов в байте + 1 $1: rlc %a0 ; Циклич. сдвиг влево делимого и частного jc $4f ; Если CF=1 dec %a3 ; Пока не все jnz $2f ; сдвиги jmp $5f ; $4: dec %a3 ; Пока не все sst 1 ; CF=1 jnz $2f ; сдвиги $5: btth %a4, 1000b ; Знаковый регистр <0? jz .+1 ; Нет neg %a0 ; Смена знака знакового регистра rts ; Выход из подпрограммы $2: rlc %a2 ; Циклич. сдвиг влево остатка sub %a2, %a1 ; Вычитание из остатка делителя jnc $3f ; Если разность >0 add %a2, %a1 ; Иначе - восстанавливается остаток cst 1 ; CF=0 jmp $1b ; Следующий цикл $3: sst 1 ; CF=1 jmp $1b ; Следующий цикл
Вход:
Выход:
Используется:
div16u: clr %a4 ; Инициализация мл. байта остатка xor %a5, %a5 ; Инициализация ст. байта остатка и CF movl %a6, 17 ; Число битов в байте + 1 $1: rlc %a0 ; Циклич. сдвиг влево мл.б. делимого и мл.б. частного rlc %a1 ; Циклич. сдвиг влево ст.б. делимого и ст.б. частного jc $4f ; Если CF=1 dec %a6 ; Пока не все jnz $2f ; сдвиги rts ; Выход из подпрограммы $4: dec %a6 ; Пока не все sst 1 ; CF=1 jnz $2f ; сдвиги rts ; Выход из подпрограммы $2: rlc %a4 ; Циклич. сдвиг влево мл. байта остатка rlc %a5 ; Циклич. сдвиг влево ст. байта остатка sub %a4, %a2 ; Вычитание из мл.б. остатка мл.б. делителя sbc %a5 ; Вычитание из ст.б. остатка CF jc $5f ; Если разность <0 sub %a5, %a3 ; Вычитание из ст.б. остатка ст.б. делителя jnc $3f ; Если разность >0 add %a4, %a2 ; Иначе - adc %a5 ; восстанавливается add %a5, %a3 ; остаток cst 1 ; CF=0 jmp $1b ; Следующий цикл $3: sst 1 ; CF=1 jmp $1b ; Следующий цикл $5: add %a4, %a2 ; Восстанавливается adc %a5 ; остаток cst 1 ; CF=0 jmp $1b ; Следующий цикл