Znalezienie bibliotek arytmetycznych i konwersji do BCD w 8051 w asemblerze
RATUNQ ! - konwersja do BCD w 8051
From: Olgierd Cybulski <cybulski_at_nospam_pkpf.if.uj.edu.pl>
Subject: RATUNQ ! - konwersja do BCD w 8051
Date: Fri, 05 Jun 1998 00:12:12 +0200
Gdzie mozna znalezc biblioteki arytmetyczne do 8051
napisane w asemblerze ?
Albo przynajmniej procedure konwersji liczby dwubajtowej
na 5 cyfr BCD ?
Do tej pory programowalem wszystko w asemblerze, wiec
nawet nie mam kompilatorow C. Gdybym mial, pewnie
napisalbym procedure dzielenia w C i potem uzywal
skompilowanych (via Asembler) fragmentow kodu.
Gdybym sie uparl, to pewnie wymyslilbym sam metode,
ale nie mam czasu. Bede wdzieczny za wszelka pomoc.
O.C.
----------------------------------------
pies pileon kameleon
----------------------------------------
From: "Michał Rudewicz" <michal_rudewicz_at_nospam_bigfoot.com>
Subject: Re: RATUNQ ! - konwersja do BCD w 8051
Date: Fri, 05 Jun 1998 06:51:44 GMT
Olgierd Cybulski napisał(a) w wiadomości:
<35771BBC.54C9_at_nospam_pkpf.if.uj.edu.pl>...
|Albo przynajmniej procedure konwersji liczby dwubajtowej
|na 5 cyfr BCD ?
Jeśli to zadowoli, podrzucam algorytm binarnego dzielenia liczby 16-bitowej
przez 10 z odrzuceniem części ułamkowej. Napisałem go na kolanie, więc mam
nadzieję, że się nie pomyliłem.
X/10 = X*1,6/16 =
= (X + X/2 + X/16 + X/32 + X/256 + X/512 + X/4096 + X/8192) / 16
gdzie wszystkie dzielenia są przesunięciami bitowymi.
Pozdrawiam,
Michał
-----------------------------------------------------------------------
Michał Rudewicz michal_rudewicz_at_nospam_bigfoot.com
Little Shark tel./faks: (0 22) 813 77 92
09-320 Bieżuń, ul. Zamoyskiego 18 tel.:(0 602) 799 257
-----------------------------------------------------------------------
From: Olgierd Cybulski <cybulski_at_nospam_pkpf.if.uj.edu.pl>
Subject: Re: RATUNQ ! - konwersja do BCD w 8051
Date: Fri, 05 Jun 1998 13:12:50 +0200
Michał Rudewicz wrote:
Jeśli to zadowoli, podrzucam algorytm binarnego dzielenia liczby 16-bitowej
przez 10 z odrzuceniem części ułamkowej. Napisałem go na kolanie, więc mam
nadzieję, że się nie pomyliłem.
X/10 = X*1,6/16 =
= (X + X/2 + X/16 + X/32 + X/256 + X/512 + X/4096 + X/8192) / 16
Dziekuje wszystkim ktorzy odpowiedzieli na moj post, a takze tym,
ktorzy przyslali procedury na konto prywatne.
Przetestuje procedury, ktore wydaja sie wzglednie szybkie.
Obawiam sie jednak, ze zadna sie nie nada (sadzac po dlugosci kodu).
Procedura, ktorej potrzebuje, bedzie uzywana przez przerwanie czasowe,
i z pewnych wzgledow powinna byc jak najkrotsza.
Zwykle, uniwersalne algorytmy dzielenia nie nadaja sie w tym przypadku,
bowiem procedura dzielenia przez konkretna liczbe (100) moze byc
krotsza od procedury ogolnej.
Wyspalem sie, powrocila sprawnosc umyslu i pracuje nad procedura
korzystajaca z rozkladu :
X=100*5 a2 + 6*a + b
gdzie a jest starszym bajtem x, b - mlodszym.
Olgierd Cybulski
Raz jeszcze dziekuje za szybkie odpowiedzi.
Pozdrawiam wszystkich ludzi dobrej woli :-))))
----------------------------------------
pies pileon kameleon
----------------------------------------
From: Olgierd Cybulski <cybulski_at_nospam_pkpf.if.uj.edu.pl>
Subject: Re: RATUNQ ! - (szybka) konwersja do BCD w 8051
Date: Sat, 06 Jun 1998 20:23:26 +0200
Uff.
Napisalem (wreszcie) szybka procedure konwersji liczby binarnej
na BCD. Jest znacznie szybsza od procedur, ktore szanowni koledzy
przyslali mi na PRIVA (za co raz jeszcze dziekuje),
lecz ma jedna wade - liczby konwertowane musza zawierac sie
w przedziale: 0 - 9999, tak, by po konwersji otrzymac cztery cyfry.
Uwagi:
1) adres wejscia do procedury to SplitBCD
2) argument zawarty jest pod adresami Lower i Higher
w dowolnym miejscu pamieci wewn. RAM, przy czym
lower jest mlodszym bajtem, higher - starszym
bajtem liczby przeznaczonej do konwersji
3) wynik zostaje umieszczony w rejestrach R4 R5 R6 R7
w aktualnym banku rejestrow, przy czym w R4 jest
najmlodsza cyfra BCD, w R7 - najstarsza,
wszystkie cztery cyfry zawieraja sie w przedziale 0-9.
4) procedura nie zmienia zadnych rejestrow procz
tych, do ktorych wpisuje wynik
higher data 104 ; przykladowy adres starszego argumentu
lower data 103 ; przykladowy adres mlodszego argumentu
-------------------------------------------------
SplitBCD: ; wywolywac przez ACALL lub LCALL
push acc
push b
push psw
mov r4,#0
mov a,higher
rl a
rl a
add a,higher
jnb acc.0,pass1
mov r4,#50
pass1:
mov r5,a
rrc a
xch a,r5
add a,higher
add a,lower
rrc a
jnc pass2
inc r4
pass2:
mov b,#50
div ab
add a,r5
xch a,b
rl a
add a,r4
mov r4,a
add a,#156
jnc pass3
inc b
mov r4,a
pass3:
mov a,b
mov b,#10
div ab
mov r6,b
mov r7,a
mov a,r4
mov b,#10
div ab
mov r4,b
mov r5,a
pop psw
pop b
pop acc
ret
----------------------------------------
P.S. - procedura nie wyglada na specjalnie szybka,
lecz prosze zauwazyc, ze nie zawiera zadnych petli !
Procedura zostala sprawdzona przy wszystkich mozliwych
wartosciach liczby konwertowanej.
Oczywiscie dziala poprawnie tylko dla liczb mniejszych
od 10000.
O.C.
----------------------------------------
pies pileon kameleon
----------------------------------------
From: "mk" <mk_at_nospam_cbk.pan.wroc.pl>
Subject: Re: RATUNQ ! - konwersja do BCD w 8051
Date: Fri, 5 Jun 1998 12:47:29 +0200
Olgierd Cybulski napisał(a) w wiadomości:
<35771BBC.54C9_at_nospam_pkpf.if.uj.edu.pl>...
Gdzie mozna znalezc biblioteki arytmetyczne do 8051
napisane w asemblerze ?
Albo przynajmniej procedure konwersji liczby dwubajtowej
na 5 cyfr BCD ?
Do tej pory programowalem wszystko w asemblerze, wiec
nawet nie mam kompilatorow C. Gdybym mial, pewnie
napisalbym procedure dzielenia w C i potem uzywal
skompilowanych (via Asembler) fragmentow kodu.
Gdybym sie uparl, to pewnie wymyslilbym sam metode,
ale nie mam czasu. Bede wdzieczny za wszelka pomoc.
O.C.
----------------------------------------
pies pileon kameleon
----------------------------------------
Podsylam Ci taki kawalek na 8 cyfr.
Na pewno nie jest optymalny (dopiero uczylem sie wtedy) ale chodzi.
Czesc Mirek.
begin 666 BCD.txt
M.RHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ
M*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BH-"CLJ(" _at_nospam_(" _at_nospam_(" _at_nospam_(" _at_nospam_(" _at_nospam_(%I!
M34E!3D$_at_nospam_2$58+T)#1" _at_nospam_(" _at_nospam_(" _at_nospam_(" _at_nospam_(" _at_nospam_(" _at_nospam_(" _at_nospam_(" _at_nospam_(" _at_nospam_(" _at_nospam_(" _at_nospam_
M(" J#0HZ*B!$04Y%(%=%2E-#24]712!7(%(S*'-T*2!2-"!2-2!2-B!2-RAM
M;"D_at_nospam_0D%.2R R(" _at_nospam_(" _at_nospam_(" _at_nospam_(" _at_nospam_(" _at_nospam_(" _at_nospam_*_at_nospam_T*.RH_at_nospam_1$%.12!764I30TE/
M5T4_at_nospam_5R!2,"AS="DN+BY2-RAM;"D_at_nospam_($)!3DL_at_nospam_,2 _at_nospam_(" _at_nospam_(" _at_nospam_(" _at_nospam_(" _at_nospam_(" _at_nospam_
M(" _at_nospam_(" _at_nospam_("H-"CLJ(%5:65=!3D4_at_nospam_4D5*15-44EDZ($)!3DLQ+"!"04Y+,BP_at_nospam_
M0D%.2S,L($$L($(L(%-0+" _at_nospam_(" _at_nospam_(" _at_nospam_(" _at_nospam_(" _at_nospam_(" J#0H[*BHJ*BHJ*BHJ
M*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ
M*BHJ*BHJ*BHJ*BHJ*_at_nospam_T*.T1:245,14Y)12!04EI%6B!$6DE%4TE%0PT*"4Y/
M4 T*2$58._at_nospam_E-3U8),3A(+",P1D_at_nospam_[($Q)0UI.24L_at_nospam_0UE&4B!$6DE%4TE%5$Y9
M0T_at_nospam_-"E)45#H)0TQ2"4,-"B _at_nospam_"4U/5_at_nospam_DP1#!(+",Q.$_at_nospam_).R _at_nospam_0D%.2R S( T*
M"4U/5_at_nospam_E!+",P, T*"4U/5_at_nospam_E2,RQ!.R!35$%24UI9($)!2E0-"_at_nospam_E-3U8)4C0L
M02 [(%=93DE+( T*"4U/5_at_nospam_E2-2Q!#0H)34]6"5(V+$$-"_at_nospam_E-3U8)4C<L00T*
M"4U/5_at_nospam_DP1#!(+",Q,$_at_nospam__at_nospam_.T)!3DL_at_nospam_,_at_nospam_T*"4U/5_at_nospam_E"+",R,4_at_nospam_[($Q)0UI"02!0
M4EI%4U5.245#(%<_at_nospam_3$573PT*"4U/5_at_nospam_E2,2PC,#!!2" _at_nospam_.T1:245,3DE+#0I2
M5#(Z"4U/5_at_nospam_E!+$(-"_at_nospam_E*6_at_nospam_E25" [($M/3DE%0R!04EI%4U5704Y)00T*"4U/
M5_at_nospam_E!+%(S#0H)4U5"0_at_nospam_E!+%(Q#0H)2D,)4E0Q.R!764Y)2R!/1$5*34]704Y)
M02 \, T*"3M764Y)2R!/1$5*34]704Y)03XP#0H)34]6"5(S+$$-"_at_nospam_E-3U8)
M4C L00T*"4U/5_at_nospam_DP1#!(+",Q.$_at_nospam_[($)!3DLS#0H)4T540_at_nospam_E##0H)04-!3$P)
M4%),15<Q.R!764Y)2R!$6DE%3$5.24$-"_at_nospam_E#3%()0PT*"41%0PE"#0H)34]6
M"4$L0_at_nospam_T*"4I:"5)4(#M+3TY)14,_at_nospam_4%):15-55T%.24$-"_at_nospam_E!0T%,3 E04DQ%
M5S$[(%)%4UI402!:($1:245,14Y)00T*"4Q*35 )4E0R"0D-"E)4,3H)3D]0
M#0H)34]6"3!$,$_at_nospam_L(S$X2#L_at_nospam_0D%.2R S#0H)0TQ2"4,-"_at_nospam_E!0T%,3 E04DQ%
M5S$[(%=93DE+($1:245,14Y)00T*"41%0PE"#0H)34]6"4$L0_at_nospam_T*"4I:"5)4
M#0H)0TQ2"4,-"_at_nospam_E!0T%,3 E04DQ%5S$[(%)%4UI402!$6DE%3$5.24$-"_at_nospam_E,
M2DU0"5)4,_at_nospam_T*4E0Z"4U/5_at_nospam_E2,"PQ,T_at_nospam_-"_at_nospam_E-3U8)4C,L,4)(#0H)34]6"5(T
M+#%#2" _at_nospam_.U!26D5354Y)14-)12!764Y)2U4_at_nospam_1%I)14Q%3DE!($Y!($U)14I3
M0T4_at_nospam_1%I)14Q.14H)#0H)34]6"5(U+#%$2 T*"4U/5_at_nospam_E2-BPQ14_at_nospam_-"_at_nospam_E-3U8)
M4C<L,49(#0H)34]6"4$L4C [4D536E1!($1/($%+54T-"_at_nospam_E-3U8),$0P2"PC
M,3A(.R!"04Y+(#,-"_at_nospam_E-3U8)0%(P+$$-"_at_nospam_E-3U8)02Q2, T*"41%0PE!.R!,
M24-:3DE+($-91E(_at_nospam_1%I)15-)151.64-(#0H)34]6"3$X2"Q!#0H)4U5"0_at_nospam_E!
M+",P-T_at_nospam_-"_at_nospam_E*3EH)4E14#0H)4D54#0H)3D]0#0H)3D]0#0I04DQ%5S$Z"4U/
M5_at_nospam_E!+%(W#0H)4DQ#"4$-"_at_nospam_E-3U8)4C<L00T*"4U/5_at_nospam_E!+%(V.R!04EI%4U5.
M245#244_at_nospam_5R!,15=/(%(W(%(V(%(U(%(T(%(S#0H)4DQ#"4$-"_at_nospam_E-3U8)4C8L
M00T*"4U/5_at_nospam_E!+%(U#0H)4DQ#"4$-"_at_nospam_E-3U8)4C4L00T*"4U/5_at_nospam_E!+%(T#0H)
M4DQ#"4$-"_at_nospam_E-3U8)4C0L00T*"4U/5_at_nospam_E!+%(S#0H)4DQ#"4$-"_at_nospam_E-3U8)4C,L
700T*"4U/5_at_nospam_DP1#!(+",Q,$_at_nospam_-"_at_nospam_E2150`
`
end