MOV 50h, A; Младший байт произведения.
MOV 51h, B; Старший байт произведения.
MOVA, B; Деление старшего байта произведения
MOVB, 53h; на значение скорости или на 100.
DIVAB
MOV 54h, A; Целая часть от деления.
MOV 55h, B; Остаток от деления.
MOVA, 53h; Деление делителя (значение скорости
MOVB, #0Ah; или 100) на 10.
DIVAB
MOV 56h, A; Целая часть от деления делителя на 10.
MOV 57h, B; Остаток от деления делителя на 10.
JZHELP; Если целая часть от деления делителя на 10
; равна нулю, то переход в метку HELP.
MOVA, 57h
MOVB, #4h; Если остаток от деления делителя на 10 равен
SUBBA, B; 4, то переход в метку B5.
JZB5
MOVA, 57h
MOVB, #6h; Если остаток от деления делителя на 10 равен
SUBBA, B; 6, то переход в метку B5.
JZB5
MOVA, #4h; Если остаток от деления делителя на 10
CJNEA, 57h, C1 ; больше 4, то переход в метку B1.
C1: JCB1
JNCB3 ; Если меньше 4, то в метку B3.
B1: MOVA, #6h; Если остаток от деления делителя на 10
CJNEA, 57h, C; больше 6, то переход в метку B7.
C2: JCB7
JNCB2 ; Если равен 5, то в метку B2.
B2: MOVA, 56h; Получено, что остаток от деления делителя
MOVB, #2h; на 10 равен 5, тогда целая часть от деления
MULAB; делителя на 10 умножается на 2.
MOV 52h, A
INC 52h; Увеличение результата на 1. (новый делитель)
MOVA, 55h; Остаток от деления числителя формул
MOVB, 52h; (4) или (6) делится на новый делитель.
DIVAB
MOV 41h, B; Остаток от деления на новый делитель.
MOVB, #2h; Умножение целой части от деления на
MULAB; новый делитель на 2.
MOV 57h, A; В результате получены десятые доли
; деления старшего байта произведения.
MOVA, 41h; Умножение остатка от деления на новый
MOVB, #2h; делитель на 2.
MULAB
MOVB, 52h; Результат этого умножения снова делится
DIVAB; на новый делитель и целая часть этого
ADDA, 57h; деления складывается с десятыми долями
MOV 57h, A; деления старшего байта произведения.
MOV 56h, 52h
MOV 42h, B; Остаток последнего деления фиксируется.
SJMPVPERED; Переход к нахождения сотых долей.
B3: MOVA, #1h; Если остаток от деления делителя на 10
CJNEA, 57h, C3 ; 0 или 1, то переход в метку HELP_1.
C3: JNCHELP_1
JCB4 ; Если больше 1, то в метку B4.
B4: MOVA, #2h; Если остаток от деления делителя на 10
CJNEA, 57h, C4 ; равен 2, то переход в метку B5.
C4: JNCB5
JCB6 ; Если равен 3, то в метку B6.
HELP: JMPD_0 ; Переход в метку D_0.
B5: MOVA, 56h; Если остаток от деления делителя на 10
MOVB, #5h; равен 2, 4, 6 или 8, тогда целая часть от
MULAB; деления делителя на 10 умножается на 5.
MOV 52h, A
MOVA, 57h; Остаток от деления делителя на 10
MOVB, #2h; делится на 2 и складывается с предыдущим
DIVAB; результатом. Получен новый делитель.
ADDA, 52h
MOV 52h, A
MOVA, 55h; Остаток от деления числителя формул
MOVB, 52h; (4) или (6) делится на новый делитель.
DIVAB
MOV 41h, B; Остаток от деления на новый делитель.
MOVB, #5h; Умножение целой части от деления на
MULAB; новый делитель на 5.
MOV 57h, A; В результате получены десятые доли
; деление старшего байта произведения.
MOVA, 41h; Умножение остатка от деления на новый
MOVB, #5h; делитель на 5.
MULAB
MOVB, 52h; Результат этого умножения снова делится
DIVAB; на новый делитель и целая часть этого
ADDA, 57h; деления складывается с десятыми долями
MOV 57h, A; деления старшего байта произведения.
MOV 56h, 52h
MOV 42h, B; Остаток последнего деления фиксируется.
JMP VPERED ; Переход к нахождения сотых долей.
B7: MOVA, #8h; Если остаток от деления делителя на 10
CJNEA, 57h, C5 ; равен 9, то переход в метку HELP_1.
C5: JCDALEE
JNCB8 ; Если меньше или равен 8, то в метку B8.
B8: MOVA, #7h; Если остаток от деления делителя на 10
CJNEA, 57h, C6 ; равен 8, то переход в метку B5.
C6: JCB5
JNCB6 ; Если равен 7, то переход в метку B6.
HELP_1: SJMPDALEE; Переход в метку DALEE.
B6: MOVA, 56h; Если остаток от деления делителя на 10
MOVB, #3h; равен 3 или 7, тогда целая часть от
MULAB; деления делителя на 10 умножается на 3.
MOV 52h, A
MOVA, #5h; Полученный результат в случае, если
CJNEA, 57h, RAZD; остаток от деления делителя на 10 равен 7
RAZD: JCDEL1 ; увеличивается на 2. А если остаток равен
JNCDEL2 ; 3, то - на 1. Получен новый делитель.
DEL1: INC 52h
INC 52h
SJMPRETURN; Переход в метку RETURN.
DEL2: INC 52h
RETURN: MOVA, 55h; Остаток от деления числителя формул
MOVB, 52h; (4) или (6) делится на новый делитель.
DIVAB
MOV 41h, B; Остаток от деления на новый делитель.
MOVB, #3h; Умножение целой части от деления на
MULAB; новый делитель на 3.
MOV 57h, A; В результате получены десятые доли
; деление старшего байта произведения.
MOVA, 41h; Умножение остатка от деления на новый
MOVB, #3h; делитель на 3.
MULAB
MOVB, 52h; Результат этого умножения снова делится
DIVAB; на новый делитель и целая часть этого
ADDA, 57h; деления складывается с десятыми долями
MOV 57h, A; деления старшего байта произведения.
MOV 56h, 52h
MOV 42h, B; Остаток последнего деления фиксируется.
SJMPVPERED; Переход к нахождения сотых долей.
D_0: MOVA, 55h; Если целая часть от деления делителя на
MOVB, #0Ah; 10 равна нулю, то остаток от деления
MULAB; числителя формул (4) или (6) умножается
MOVB, 53h; на 10 и делится на значение скорости.
DIVAB
MOV 56h, 53h; Делитель не меняется(значение скорости).
MOV 57h, A; В результате получены десятые доли
; деления старшего байта произведения.
MOV 42h, B; Остаток последнего деления фиксируется.
SJMPVPERED; Переход к нахождения сотых долей.
DALEE: MOVA, #5h; Остаток от деления делителя на 10
CJNEA, 57h, RAZD2 ; равен 0, 1 или 9. В случае если остаток
RAZD2: JCDEL3 ; равен 9, то целая часть от деления
SJMPRETURN1 ; увеличивается на 1. В противном случае
DEL3: INC 56h; она не меняется.
RETURN1: MOVA, 55h; Остаток от деления числителя формул
MOVB, 56h; (4) или (6) делится на новый делитель.
DIVAB
MOV 57h, A; В результате получены десятые доли
; деления старшего байта произведения.
MOV 42h, B; Остаток последнего деления фиксируется.
VPERED: MOVA, #0Ah; Для нахождения сотых долей деления
MOVB, 42h; старшего байта произведения, остаток
MULAB; предыдущего деления умножается на 10.
MOV 42h, A
MOVA, #0h; Если данное произведение выходит за
CJNEA, B, OSH; рамки одного байта, то в целях
OSH: JCOSH1 ; уменьшения погрешности конечного
MOV 58h, #0h; результата, этот факт учитывается как
SJMPDALSE; 5 сотых долей.
OSH1: MOV 58h, #5h
DALSE: MOVA, 42h; Полученное произведение делится на
MOVB, 56h; делитель.
DIVAB
ADDA, 58h; Учет 5 сотых (если они есть).
MOV 58h, A; В результате получены сотые доли
; деления старшего байта произведения.
MOVA, #0Ah; Для нахождения тысячных долей деления
MULAB; старшего байта произведения, остаток
MOV 42h, A; от деления снова умножается на 10.
MOVA, #0h
CJNEA, B, OSH2 ; Аналогичный способ уменьшения
OSH2: JCOSH4 ; погрешности в результате.
MOV 58h, #0h
SJMP DALSE2
OSH4: MOV 59h, #5h
DALSE2: MOVA, 42h; Полученное произведение делится на
MOVB, 56h; делитель.
DIVAB
ADDA, 59h; Учет 5 тысячных (если они есть).
MOV 59h, A ; В результате получены тысячные доли
; деления старшего байта произведения.
MOVA, 54h; Умножение полученного частного от
; деления старшего байта произведения
MOVB, #0FFh; на 256 (т.к. старший байт).
MULAB; Сначала умножается, целая часть от
ADDA, 54h; деления старшего байта произведения.
JC PER
SJMP NPER
PER: INC B
NPER: MOV 60h, B; Старший байт конечного результата.
MOV 61h, A; Младший байт конечного результата.
MOVA, 57h; Умножаются десятые доли на 25,6 и
MOVB, #19h; результат суммируется с младшим байтом
MULAB; конечного результата.
ADDA, 61h
MOV 61h, A
MOV A, 57h
MOV B, #6h
MUL AB
MOV B, #0Ah
DIV AB
ADDA, 61h
MOV 61h, A
MOVA, #4h; Округление результата. Если остаток
CJNEA, B, OKR1 ; больше 4, то значение увеличивается на 1.
OKR1: JC OKR2
SJMP DALEE1
OKR2: INC 61h
DALEE1: MOVA, 58h; Умножаются сотые доли на 2,6 и
MOVB, #2h; результат суммируется с младшим
MULAB; байтом конечного результата.
ADD A, 61h
MOV 61h, A
MOV A, 58h
MOV B, #6h
MUL AB
MOV B, #0Ah
DIV AB
ADD A, 61h
MOV 61h, A
MOVA, #4h; Округление результата.
CJNE A, B, OKR3
OKR3: JC OKR4
SJMPDALEE2
OKR4: INC 61h
DALEE2: MOVA, 59h; Умножаются тысячные доли на 0,2 и
MOVB, #3h; результат суммируется с младшим
MULAB; байтом конечного результата.
MOV B, #0Ah
DIV AB
ADD A, 61h
JC PER1
SJMP NPER1
PER1: INC 60h
NPER1: MOV 61h, A
MOVA, #4h; Округление результата.
CJNE A, B, OKR5
OKR5 JC OKR6
SJMP DALE
OKR6: INC 61h
DALE: MOV A, 50h ; Делениемладшегобайтапроизведения
MOVB, 53h; на значение скорости или на 100.
DIVAB
ADDA, 61h; Результат суммируется с младшим
; байтом конечного результата.
JCPER2
SJMPNPER2
PER2: INC 60h
NPER2: MOV 61h, A; Для уменьшения погрешности
MOVA, B; конечного результата остаток от
MOVB, #2h; деления младшего байта участвует
MULAB; в округлении.
MOVB, 53h
DIV AB
MOV B, A
MOV A, #0h
CJNE A, B, OK
OK: JC OK1
SJMPDALEE3
OK1: INC 61h
; Преобразование в десятичную форму записи
DALEE3: MOVA, 61h; Разбиваем наше 16-разрядное значение
CLRACC.7 ; на 3 4-разрядных.
CLRACC.6
CLRACC.5
CLRACC.4
MOV 42h, A; Младшее 4-разрядное значение.
MOV A, 61h
CLR ACC.3
CLR ACC.2
CLR ACC.1
CLR ACC.0
SWAPA
MOV 41h, A; Среднее 4-разрядное значение.
MOV 40h, 60h; Старшее 4-разрядное значение.
MOV A, 41h ; Среднее 4-разрядное значение
MOVB, #06h; умножается на 6.
MULAB
MOVB, #0Ah; Затем делится на 10. Целая часть - число
DIVAB; десятков, остаток - число единиц.
MOV 45h, A; Число десятков.
MOV 46h, B; Число единиц.
MOVA, 40h; Старшее 4-разрядное значение
MOVB, #06h; умножается на 6.
MULAB
ADDA, 46h; Результат складывается с числом единиц.
ADDA, 42h
MOVB, #0Ah; Потом делится на 10.
DIVAB
ADDA, 45h; Целая часть от деления складывается с
MOV 45h, A; числом десятков.
MOV 46h, B; Остаток - окончательное число единиц.
MOVA, 40h; Старшее 4-разрядное значение
MOVB, #5h; умножается на 5.
MULAB
ADDA, 41h; Результат складывается с числом десятков
ADDA, 45h
MOVB, #0Ah; Потом делится на 10.
DIVAB
MOV 44h, A; Число сотен.
MOV 45h, B; Окончательное число десятков.
MOVA, 40h; Старшее 4-разрядное значение
MOVB, #2h; умножается на 2.
MULAB
ADD A, 44h ; Результат складывается с числом сотен
MOV 44h, A ; Окончательное число сотен.
; Вывод результата на трехразрядный семисегментный индикатор
MOV 60h, #11000000b ; Цифра 0.
MOV 61h, #11111001b ; Цифра 1.
MOV 62h, #10100100b ; Цифра 2.
MOV 63h, #10110000b ; Цифра 3.
MOV 64h, #10011001b ; Цифра 4.
MOV 65h, #10010010b ; Цифра 5.
MOV 66h, #10000010b ; Цифра 6.
MOV 67h, #11111000b ; Цифра 7.
MOV 68h, #10000000b ; Цифра 8.
MOV 69h, #10010000b ; Цифра 9.
; Определение выводимых на индикатор цифр (т.е. двоичных комбинаций)
MOVR0, #60h; Номер ячейки памяти с цифрой 0.