;
; Procedury biblioteczne dla procesora 8031
;
;--------------------------------------
;przyklad zastosowania ponizszych procedur
;--------------------------------------
org 0 ;
; ;
start: acall BBCD ;
acall BCDB ;
acall MUL ;
acall DZIEL ;
ajmp start ;
;-----------------------
LCZYN equ 4 ;dlugosc czynnikow w bajtach
BCD equ 20h
CZYNIK1 equ BCD+LCZYN+1
CZYNIK2 equ CZYNIK1+LCZYN
AKU1 equ CZYNIK2+LCZYN
AKU2 equ AKU1+LCZYN*2
WYNIK equ AKU2+LCZYN*2
RAKU1 equ WYNIK+LCZYN*2
RAKU2 equ RAKU1+1
;---------------------------------------------------------
;Program mnozenia liczb binarnych urzywa rejestry R0 do R7
;Organizacja pamieci dla procedur
; xxxxx BCD
; xxxx CZYNIK1 oraz BIN
; xxxx CZYNIK2
; xxxxxxxx AKU1 oraz WYNIKD
; xxxxxxxx AKU2 oraz DZIELNIK
; xxxxxxxx WYNIK oraz DZIELNA
; x RAKU1
; x RAKU2
;
MUL: mov r0,#AKU1
mov r2,#WYNIK-AKU1+LCZYN*2
acall ZERO
mov RAKU1,#AKU1+LCZYN*2-1
mov RAKU2,#AKU2+LCZYN*2-2
mov r6,#CZYNIK1+LCZYN-1
mov r3,#LCZYN ;ilosc czynnikow 2
LOOP: mov r7,#CZYNIK2+LCZYN-1
mov r5,RAKU1
mov r4,RAKU2
acall ZER_AKU
acall MUL1
acall D_ABW
dec r6 ;nastepny czynnik 2
dec RAKU1
dec RAKU2
djnz r3,LOOP
ret
;
;Procedura dadawania
;R0 i R1 => R1 w R2 dlugosc
DODAJ1: clr c
DL: mov a,@r0
addc a,@r1
mov @r1,a
dec r0
dec r1
djnz r2,DL
ret
;Procedura dadwania czesciowego
D_ABW: mov r0,#AKU1+LCZYN*2-1 ;7
mov r1,#WYNIK+LCZYN*2-1 ;7
mov r2,#LCZYN*2 ;8
acall DODAJ1
mov r0,#AKU2+LCZYN*2-1 ;7
mov r1,#WYNIK+LCZYN*2-1 ;7
mov r2,#LCZYN*2 ;8
ajmp DODAJ1
;Procedura zerowania akumulatorow
ZER_AKU:
mov r0,#AKU1
mov r2,#LCZYN*4 ;16, AKU1+AKU2
;Procedura zerowania
ZERO: mov @r0,#0
inc r0
djnz r2,ZERO
ret
;Procedura mnozenia
;w R6 czynnik 1
;w R7 czynnik 2
;w R5 AKU1 adres A, w R4 AKU2 adres B
;w R2 dlugosc
MUL1: mov r2,#LCZYN ;4
MLOOP: mov r0,6
mov r1,7
mov a,@r0
mov b,@r1
mul ab
mov r0,5
mov r1,4
mov @r0,a
mov @r1,b
dec r4
dec r5
dec r7
djnz r2,MLOOP
ret
;--------------------------------------------------
; Procedura dzielenia
;
; xxxxxxxx DZIELNA w WYNIKu z mnozenia
; xxxxxxxx DZIELNIK w AKU2
; xxxxxxxx WYNIKD w AKU1
;
DZIELNA equ WYNIK
LDA equ LCZYN*2
LDK equ LDA
DZIELNIK equ AKU2 ;DZIELNA+LDA
WYNIKD equ AKU1
LWY equ LDA
;
DZIEL: acall ZERWYN ;if DZIELNIK=0 then C=1 else C=0
acall CZY_0
jc KONIEC
mov r1,#DZIELNIK+LDK-1
mov r0,#DZIELNA+LDA-1
mov r2,#LDA
acall POROW
jc NEGAT
acall SZUKAJ
DA_DK: acall ODJAC8
mov r0,#WYNIKD+LWY-1
mov r2,#LWY
acall MNOZ2 ;wynik*2
inc WYNIKD+LWY-1 ;+1
DAL: djnz r3,DALEJ
clr c
ajmp KONIEC
DALEJ: acall DZIEL8 ;dzielnik/2
acall PODZIELNE ;czy jest podzielne
jc DA_DK
mov r0,#WYNIKD+LWY-1
mov r2,#LWY
acall MNOZ2 ;wynik*2
ajmp DAL
NEGAT: clr c
KONIEC: ret
;Procedura odejmowania od R1, R0 wynik umieszcza w R1
;w R2 dlugosc bufora w bajtach
ODJAC8: acall USTAW8
ODJAC: clr c
LOOPO: mov a,@r1
subb a,@r0
mov @r1,a
dec r0
dec r1
djnz r2,LOOPO
ret
;Procedura dodawania do R0, R1 wynik umieszcza w R0
;w R2 dlugosc bufora w bajtach
DODAJ8: acall USTAW8
DODAJ: clr c
LOOP1: mov a,@r0
addc a,@r1
mov @r0,a
dec r0
dec r1
djnz r2,LOOP1
ret
;Sprawdzenie if Dzielnik = 0 then C=1 else C=0
CZY_0: mov r0,#DZIELNIK
mov r2,#LDK
setb c
CZY: mov a,@r0
jnz ZERO_C
inc r0
djnz r2,CZY
ret
ZERO_C: clr c
ret
;Sprawdzenie rownosci if R0 = R1 then C=1 else C=0
;w R2 dlugosc bufora w bajtach
PODZIELNE:
acall USTAW8
CZYR: mov a,@r0
mov b,@r1
cjne a,b,ROZNE
dec r0
dec r1
djnz r2,CZYR
setb c
ret
ROZNE: acall POROW8
ret
;Porownanie R0 z R1 wynik umieszczany jest w C
;w R2 dlugosc bufora w bajtach
POROW8: acall USTAW8
POROW: clr c
LOOP2: mov a,@r0
subb a,@r1
dec r0
dec r1
djnz r2,LOOP2
ret
;Mnozenie razy 2 bufora R0 o dlugosci w R2
MNOZ8: mov r0,#DZIELNIK+LDK-1
mov r2,#LDK
MNOZ2: clr c
LOOP3: mov a,@r0
rlc a
mov @r0,a
dec r0
djnz r2,LOOP3
ret
;Dzielenie przez 2 bufora R0 o dlugosci w R2
DZIEL8: mov r0,#DZIELNIK
mov r2,#LDK
DZIEL2: clr c
LOOP4: mov a,@r0
rrc a
mov @r0,a
inc r0
djnz r2,LOOP4
ret
;Ustawia rejestry dla procedur
USTAW8: mov r0,#DZIELNIK+LDK-1
mov r1,#DZIELNA+LDA-1
mov r2,#LDA ;podstawic dluzszy bufor
ret
;Szukanie pozycji dzielnika w stosunku do dzielnej
SZUKAJ: mov r3,#0 ;wskaznik ilosci przesuniec
LOOP5: mov r0,#DZIELNA+LDA-1
mov r1,#DZIELNIK+LDK-1
mov r2,#LDA
acall POROW
jc WROC
inc r3
acall MNOZ8
ajmp LOOP5
WROC: acall DZIEL8
PRZEZ0: ret
;
ZERWYN: mov r0,#WYNIKD
mov r2,#LWY
ZER: mov @r0,#0
inc r0
djnz r2,ZER
ret
;----------------------------------------------------------
; Procedury przeliczeniowe Bin na BCD oraz BCD na Bin
; dla komputera 8031
;/***** ***** ***** ***** *****/***** ***** ***** *****/
;/ BCD / BIN /
;BCD equ 20h ;adres bazowy bufora
LBCD equ LCZYN+1
BIN equ BCD+LBCD
LBIN equ LCZYN
;
; Procedura zamiany liczby BIN na BCD
; Wywolanie przez ACALL BBCD niszczy A,R1,R2,R3
;
BBCD: mov r3,#8*LBIN
acall ZER_BCD
S1: acall KOR
acall ROL
djnz r3,S1
ret
;
KOR: mov r0,#BCD+LBCD-1
mov r1,#LBCD
KOR1: mov a,@r0
cjne a,#50h,KOR2
KOR2: jc NIEKOR
add a,#30h
mov @r0,a
NIEKOR: anl a,#0fh
cjne a,#5,KOR3
KOR3: jc NIEKO
add a,#3
mov r7,a
mov a,@r0
anl a,#0f0h
orl a,r7
mov @r0,a
NIEKO: dec r0
djnz r1,KOR1
ret
;
ROL: clr c
mov r2,#LBCD+LBIN
mov r0,#BIN+LBIN-1
ROL1: mov a,@r0
rlc a
mov @r0,a
dec r0
djnz r2,ROL1
ret
;
ZER_BCD:
mov r0,#BCD
mov r1,#LBCD
ZER1: mov @r0,#0
inc r0
djnz r1,ZER1
ret
;---------------------------------------------------
; Procedura zamiany liczby z kodu BCD na B
; Wywolanie przez ACALL BCDB niszczy A,R1,R2,R3
;
BCDB: MOV R1,#BCD+LBCD
MOV R2,#LCZYN
PBCDB1: MOV @R1,#0
INC R1
DJNZ R2,PBCDB1
CLR C
MOV R2,#LBIN*8 ;ilosc bitow do przesuniecia w B
PP2: MOV R3,#LBCD+LBIN ; -"- bajtow do dzielenia w BCDB
MOV R1,#BCD
PLOP2: MOV A,@R1 ;petla dzielaca BUFBCD/2
RRC A
MOV @R1,A
INC R1
DJNZ R3,PLOP2
DJNZ R2,DAL1
RET ;koniec przeliczenia
DAL1: MOV R3,#LBCD ;ilosc bajtow do korekcji w BCD
MOV R1,#BCD
PLOP5: MOV A,@R1 ;korekcja biezacego bajtu
ANL A,#80H
JZ POMIT1
MOV A,@R1
ANL A,#7FH
ADD A,#50H ;korekcja nibla H
MOV @R1,A
POMIT1: MOV A,@R1
ANL A,#8
JZ POMIT2
MOV A,#0F7H
ANL A,@R1
ADD A,#5 ;korekcja nibla L
MOV @R1,A
POMIT2: INC R1
DJNZ R3,PLOP5 ;do korekcji nastepnego bajtu
AJMP PP2 ;nastepne dzielenie BUFBCD/2
end