Загрузка данных


; 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