; Q2 = (сумма Q2i)/N + K, вариант 1: Q2i = N5i + N6i
n equ 10 ; количество чисел (10..128)
k equ 100 ; константа K
dseg at 30h
n5: ds 2*n ; массив N5i по 2 байта
n6: ds 2*n ; массив N6i по 2 байта
xseg
Q2: ds 2
cseg
jmp start
org 0040h
start: call otl
mov r2,#n ; счетчик
mov r0,#n5
mov r1,#n6
mov r5,#0 ; сумма r7:r6:r5
mov r6,#0
mov r7,#0
m1: mov a,@r0 ; ст. байт N5i
mov r3,a
inc r0
mov a,@r1 ; ст. байт N6i
mov r4,a
inc r1
mov a,@r0 ; мл. N5i + мл. N6i
add a,@r1
inc r0
inc r1
xch a,r4 ; r4 = мл. Q2i, a = ст. N6i
addc a,r3 ; a = ст. Q2i
mov r3,a
mov a,r5 ; сумма = сумма + Q2i
add a,r4
mov r5,a
mov a,r6
addc a,r3
mov r6,a
mov a,r3
jb acc.7,minus
mov a,r7
addc a,#0
sjmp m2
minus: mov a,r7
addc a,#0ffh
m2: mov r7,a
djnz r2,m1
call del ; сумма / N
mov a,r5 ; + K
add a,#low(k)
mov r5,a
mov a,r6
addc a,#high(k)
mov r6,a
mov dptr,#Q2 ; запись во внешнюю память
mov a,r6
movx @dptr,a
inc dptr
mov a,r5
movx @dptr,a
nop
sjmp $
; деление r7:r6:r5 на n со знаком, r4 - остаток, r3 - счетчик
del: clr f0
mov a,r7
jnb acc.7,d1
setb f0 ; число отрицательное
call neg ; делим модуль
d1: mov r4,#0
mov r3,#24
d2: clr c ; сдвиг r4:r7:r6:r5 влево
mov a,r5
rlc a
mov r5,a
mov a,r6
rlc a
mov r6,a
mov a,r7
rlc a
mov r7,a
mov a,r4
rlc a
mov r4,a
clr c
subb a,#n ; остаток >= n ?
jc d3
mov r4,a ; да: остаток = остаток - n
inc r5 ; бит частного = 1
d3: djnz r3,d2
jnb f0,d4
call neg ; вернуть знак
d4: ret
; r7:r6:r5 = -r7:r6:r5
neg: mov a,r5
cpl a
add a,#1
mov r5,a
mov a,r6
cpl a
addc a,#0
mov r6,a
mov a,r7
cpl a
addc a,#0
mov r7,a
ret
tabl: dw 1000,-2000,1500,-500,2000,-1200,300,-50,750,1999 ; N5i
dw 2000,-1500,-800,400,1700,-2000,-300,600,-1000,500 ; N6i
otl: mov r0,#n5
mov r2,#4*n
mov dptr,#tabl
m4: clr a
movc a,@a+dptr
mov @r0,a
inc r0
inc dptr
djnz r2,m4
ret
end