konwersja 24-bit to BCD w '51



Masz problem? Zapytaj na forum elektroda.pl

Poprzedni Następny
Wiadomość
Spis treści
From: "Jakub Nawrot" <chceszbyc_at_nospam_wp.pl>
Subject: konwersja 24-bit to BCD w '51
Date: Sat, 4 Jan 2003 21:07:25 +0100



..mam problem...(jak w temacie) ...siedze juz jakis czas...i czesciowo
wymyslilem z kolegą algorytm dla 51...
ale...jestem ciekaw czy to mozna zrobic prosciej, krocej, szybciej....
chce to napisac sobie w asemblerze (wiec jezyki wysokiego poziomu odpadają)
...czy ktoś pisał cos takiego? nie chodzi mi tu nawet o to żeby kod otrzymac
gotowy tylko jakąś podpowiedz....

Kubek...



=========
Path: news-archive.icm.edu.pl!news.icm.edu.pl!news.onet.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: Janusz Raniszewski <rniski_at_nospam_man.koszalin.pl>
Subject: Re: konwersja 24-bit to BCD w '51
Date: Sat, 04 Jan 2003 21:56:35 +0100


..mam problem...(jak w temacie) ...siedze juz jakis czas...i czesciowo
wymyslilem z kolegą algorytm dla 51...
ale...jestem ciekaw czy to mozna zrobic prosciej, krocej, szybciej....
chce to napisac sobie w asemblerze (wiec jezyki wysokiego poziomu odpadają)
...czy ktoś pisał cos takiego? nie chodzi mi tu nawet o to żeby kod otrzymac
gotowy tylko jakąś podpowiedz....

Kubek...

Witam,
Mam na to taki sposób. 24bit to max 16.777.215. Dzielę więc naszą liczbę przez
100000 otrzymuję 167 (musi się mieścić w jednym bajcie), resztę tj 77215 dzielę
przez 1000 otrzymuję resztę 215, którą dzielę przez 100 czyli otrzymuję w
pierwszym bajcie 167, w drugim 77. trzecim 2 i resztę 15 w czwartym czyli naszą
liczbę dziesiątkowo. Najgorszym przypadkiem jest 15999999 czyli otrzymam 159,
99, 9, 99. Potrzebna jest szybka procedura dzielenia najlepiej oparta na
przesuwaniu rejestrów albo łatwiej wykorzystane polecenie dzielenia DIV z
dodawaniem podobnie jak dzielimy liczby dziesiątkowe pisemnie. Oczywiście w
przypadku konwersji liczb dłuższych podzielniki (100000, 1000, 100) musimy
dobrać inne.
Pozdr. JanuszR


=========
Path: news-archive.icm.edu.pl!news.icm.edu.pl!news.atman.pl!newsfeed.gazeta.pl!newsfeed.tpinternet.pl!news.tpi.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "Latocha Grzegorz" <glatocha_at_nospam_poczta.onet.pl>
Subject: Re: konwersja 24-bit to BCD w '51
Date: Sat, 4 Jan 2003 23:32:24 +0100



Użytkownik "Janusz Raniszewski" <rniski_at_nospam_man.koszalin.pl> napisał w
wiadomości news:3E174A83.A9B0125B_at_nospam_man.koszalin.pl...
..mam problem...(jak w temacie) ...siedze juz jakis czas...i czesciowo
wymyslilem z kolegą algorytm dla 51...
ale...jestem ciekaw czy to mozna zrobic prosciej, krocej, szybciej....
chce to napisac sobie w asemblerze (wiec jezyki wysokiego poziomu
odpadają)
...czy ktoś pisał cos takiego? nie chodzi mi tu nawet o to żeby kod
otrzymac
gotowy tylko jakąś podpowiedz....

Kubek...

Witam,
Mam na to taki sposób. 24bit to max 16.777.215. Dzielę więc naszą liczbę
przez
100000 otrzymuję 167 (musi się mieścić w jednym bajcie), resztę tj 77215
dzielę
przez 1000 otrzymuję resztę 215, którą dzielę przez 100 czyli otrzymuję w
pierwszym bajcie 167, w drugim 77. trzecim 2 i resztę 15 w czwartym czyli
naszą
liczbę dziesiątkowo. Najgorszym przypadkiem jest 15999999 czyli otrzymam
159,
99, 9, 99. Potrzebna jest szybka procedura dzielenia najlepiej oparta na
przesuwaniu rejestrów albo łatwiej wykorzystane polecenie dzielenia DIV z
dodawaniem podobnie jak dzielimy liczby dziesiątkowe pisemnie. Oczywiście
w
przypadku konwersji liczb dłuższych podzielniki (100000, 1000, 100) musimy
dobrać inne.
Pozdr. JanuszR

Albo ja czegoś nie zrozumiałem, albo to nie jest konwersja na BCD.
Liczba 16.777.215 powinna po konwersji zajmować 8 bajtów kolejno 1, 6, 7, 7,
7, 2, 1, 5,
albo jeśli ma to być spakowane BCD to cztery bajty, ale 1 i 6 w pierwszym
bajcie to będzie 16H czyli 24.

Trzeba by dzielić kolejno przez 10 000 000, 1 000 000, 100 000 itd. I tu
leży chyba problem jak to na 51 szybko zrobić




=========
Path: news-archive.icm.edu.pl!news.icm.edu.pl!news.onet.pl!agh.edu.pl!news.agh.edu.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "Jakub Nawrot" <chceszbyc_at_nospam_wp.pl>
Subject: Re: konwersja 24-bit to BCD w '51
Date: Sat, 4 Jan 2003 23:59:00 +0100


Trzeba by dzielić kolejno przez 10 000 000, 1 000 000, 100 000 itd. I tu
leży chyba problem jak to na 51 szybko zrobić

hehe, i tu właśnie ten ból...ale z kolegą wymyslilismy kod ktory dziala
calkiem jak standardowe dzielenie na kartce, poslugujemy sie kolejnymi
tetradami trzech zapisanych bajtow naszej nieszczesnej liczby, kolejne
dzielenia od gory przez dziesięć...a zresztą pisze ten kod teraz....jak
wyjdzie, to opisze na grupie...ale wiecie, przydalobysie jakies maszynowe
rozwiązanie, takie jakie jest wykorzystane sprzetowo do umozliwienia
dzielenia, niestety nie mam ksiazki ani jednej pomocnej pod reką do matmy
bitowej...bo jesli 51 moze to robic na 8 bitach, to zasada musi byc
identyczna w przypadku10, 15, 16, ...24 bitow tylko "roszadowanie" po
rejestrach i akumulatorach by zostalo...

[Kubek]



=========
Path: news-archive.icm.edu.pl!mat.uni.torun.pl!news.man.torun.pl!news.icm.edu.pl!news.onet.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: Janusz Raniszewski <rniski_at_nospam_man.koszalin.pl>
Subject: Re: konwersja 24-bit to BCD w '51
Date: Sun, 05 Jan 2003 02:16:26 +0100


Albo ja czegoś nie zrozumiałem, albo to nie jest konwersja na BCD.
Liczba 16.777.215 powinna po konwersji zajmować 8 bajtów kolejno 1, 6, 7, 7,
7, 2, 1, 5,
albo jeśli ma to być spakowane BCD to cztery bajty, ale 1 i 6 w pierwszym
bajcie to będzie 16H czyli 24.

Trzeba by dzielić kolejno przez 10 000 000, 1 000 000, 100 000 itd. I tu
leży chyba problem jak to na 51 szybko zrobić

Fakt nie jest to konwersja albo jest konwersją inaczej bo coś tam w końcu
konwerutjemy :-). Hexa na BCD najczęściej potrzebujemy aby wyświetlić wynik. Nie
potrzebujemy zatem pełnej reprezentacji dziesiątkowej dodatkowo az w 8 bajtach i
wielu dzieleniach, szkoda czasu i zasobów. Wyniku nie wyświetlamy częściej niż
co 0,1 sek. Obrabiamy powolutku naszą liczbę i kolejny wynik zajmuje 1 bajt krok
operacji i 1 bajt wyniku, który wyrzucamy na wyświetlacz (też wolny bo
najczęściej matryca LCD) i zwalniamy. Nie konwertujemy od razu całości i nie
przechowujemy w cennym RAMie (pewnie podwójnie raz w hexie i raz decymalnie).
Poza tym operacje podałem dla jasności wywodu dziesiątkowo. W poszczególnych
bajtach otrzymujemy po podzieleniu oczywiście wyniki hexadecymalne czyli 167 w
pierwszym bajcie będzie reprezentowane przez 0xA7. Teraz taką liczbę
jednobajtową przekształcamy prostą procedurą w rzeczywiste BCD i wywalamy na
odpowiednie (trzy najstarsze) pole wyświetlacza. No może nie taką prostą
procedurą - musi wykrywać ilość cyfr znaczących w liczbie czyli badać czy po
przekształceniu na polach "od góry" nie występują zera, aby w środku liczby nie
wyświelić zamiast np. 2 liczby 02. Przepraszam za niejasność liczyłem, że reszty
nie trzeba dopowiadać.
Pozdt. JanuszR


=========
Path: news-archive.icm.edu.pl!news.icm.edu.pl!news.onet.pl!agh.edu.pl!news.agh.edu.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "Jakub Nawrot" <chceszbyc_at_nospam_wp.pl>
Subject: Re: konwersja 24-bit to BCD w '51
Date: Sun, 5 Jan 2003 10:55:06 +0100


Poza tym operacje podałem dla jasności wywodu dziesiątkowo. W
poszczególnych
bajtach otrzymujemy po podzieleniu oczywiście wyniki hexadecymalne czyli
167 w
pierwszym bajcie będzie reprezentowane przez 0xA7. Teraz taką liczbę...

no tak tak, tylko ja nie wiem np jak otrzymac to 167 z jakiegokolwiek
dzielenia w 51...
...jak podzielic w '51 przez 100000? ...bo takie ma byc to pierwsze
dzielenie żeby uzyskać 167...???

[Kubek]
ps..to cholerne dzielenie paru bajtow przez pere bajtow....



=========
Path: news-archive.icm.edu.pl!news.icm.edu.pl!news.atman.pl!newsfeed.tpinternet.pl!news.tpi.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "Piotr Wyderski" <piotr.wyderskiREMOVE_at_nospam_hoga.pl>
Subject: Re: konwersja 24-bit to BCD w '51
Date: Sun, 5 Jan 2003 13:59:38 +0100



Jakub Nawrot wrote:

ps..to cholerne dzielenie paru bajtow przez pere bajtow....

Jest pare fajnych algorytmow rekurencyjnych rozwiazania
tego, ale dla trzech czy czterech bajtow chyba nie oplaci
sie ich uzywac -- zwykle dzielenie przesunieciami binarnymi
moze sie okazac szybsze, a na pewno krotsze. Na czym
Ci zalezy, na wielkosci kodu, wydajnosci, prostocie
implementacji czy jeszcze czyms innym? Bo prawde mowiac,
to Ty wcale nie potrzebujesz dzielenia kilku bajtow przez
kilka bajtow, tylko dzielenia kilku bajtow przez 10. A to
juz jest trywialne, IMO wygodnie zrobic to mnozac przez
odwrotnosc, zakodowana jako liczba staloprzecinkowa.
Dla przykladu, jezeli x jest liczba 32-bitowa, to

(hi:lo) := 0xcccccccd * x;
x / 10 == hi / 8 (albo >> 0x03, jak wolisz);

Dzielac liczbe iteracyjnie, az do uzyskania 0; reszta
z dzielenia da Ci na wyjsciu kolejne cyfry z BCD, tyle,
ze zapisane "od konca". Jezeli z mnozeniem sa problemy,
to da sie wymyslic podobny algorytm dla przesuniec.

Pozdrawiam
Piotr Wyderski

=========
Path: news-archive.icm.edu.pl!news.icm.edu.pl!lublin.pl!news.onet.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: Janusz Raniszewski <rniski_at_nospam_man.koszalin.pl>
Subject: Re: konwersja 24-bit to BCD w '51
Date: Mon, 06 Jan 2003 01:41:09 +0100


no tak tak, tylko ja nie wiem np jak otrzymac to 167 z jakiegokolwiek
dzielenia w 51...
...jak podzielic w '51 przez 100000? ...bo takie ma byc to pierwsze
dzielenie żeby uzyskać 167...???

[Kubek]
ps..to cholerne dzielenie paru bajtow przez pere bajtow....

Aby podzielić 24 bit liczbę przez 100000 dzielimy ją pięciokrotnie przez 10
(0xA) zawsze tą samą procedurą zgodnie z zasadą liczba/100000 =
liczba/10/10/10/10/10 = liczba/10*10*10*10*10 (zapis nie uwzględnia głównej
linii ułamkowej).

Aby podzielić naszą liczbę przez 10 najprościej zrobić to pisemnie
analogicznie do ręcznego dzielenia. Niestety dzielenie mamy tylko ośmiobitowe
i musimy operować na połówkach bajtów czyli załóżmy, że mamy liczbę 0x123456

0 - do rejestru B wpisujemy 0x00
1 - bierzemy bajt do akumulatora 0x12 (kolejny w tym wypadku pierwszy
najstarszy)
2 - SWAP B i dodatkowo wycinamy młodsze czyli AND 0xf0
4 - robimy SWAP A (otrzymujemy 0x21) dodatkowo wycinamy starsze czyli AND
0x0f (otrzymujemy 0x01)
5 - maskujemy OR A z rejestrem B (otrzymujemy 0x01)
6 - dzielimy DIV 0x01/0x0a = 0 w rejestrze B mamy resztę 0x01
7 - zawartość akumulatora przekazujemy do pamięci jako kolejna starsza połówka
wyniku procesu dzielenia
8 - SWAP B i dodatkowo wycinamy młodsze czyli AND 0xf0
9 - bierzemy bajt do akumulatora 0x12 (kolejny w tym wypadku pierwszy
najstarszy)
10 - wycinamy starsze czyli AND 0x0f (otrzymujemy 0x02)
11 - maskujemy OR A z rejestrem B (otrzymujemy 0x012)
12 - dzielimy DIV 0x12/0x0a = 1 w rejestrze B mamy resztę 0x08
13 - zawartość akumulatora przekazujemy do pamięci jako kolejna młodsza
połówka wyniku procesu dzielenia
14 - skaczemy na pozycję 1 aż do wyczerpania cyfr

Pozdr. JanuszR


=========
Path: news-archive.icm.edu.pl!mat.uni.torun.pl!news.man.torun.pl!news.icm.edu.pl!news.onet.pl!newsfeed.tpinternet.pl!news.dialog.net.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "Bartosz Sarama" <quasimod_at_nospam_poczta.usun.onet.pl>
Subject: Re: konwersja 24-bit to BCD w '51
Date: Sat, 4 Jan 2003 22:11:25 +0100


Użytkownik "Jakub Nawrot" <chceszbyc_at_nospam_wp.pl> napisał w wiadomości
news:av7et0$prf$1_at_nospam_galaxy.uci.agh.edu.pl...

..mam problem...(jak w temacie) ...siedze juz jakis czas...i
czesciowo
wymyslilem z kolegą algorytm dla 51...
ale...jestem ciekaw czy to mozna zrobic prosciej, krocej,
szybciej....
...czy ktoś pisał cos takiego? nie chodzi mi tu nawet o to żeby kod
otrzymac
gotowy tylko jakąś podpowiedz....


Witam.
Pisałem onegdaj taką procedurę dla liczb 32 bitowych ze znakiem i 21
bitami po przecinku :-)
Wychodziła liczba zapisana w BCD na 8 bajtach (czyli 16 cyfrowa).

Dla "krótkich" liczb można sobie oczywiście dzielić po kolei przez 10
i zapisywać wyniki w kolejnych polach BCD, dla dużych znacznie
szybciej jest zrobić tak:

cyfrową), jaka wynika z 2^n, gdzie n to numer aktualnie wysuniętego do
C bitu.

korekcję BCD (instrukcja DA A)

Taka operacja powoduje wygenerowanie wyniku "piorunem" w stosunku do
zwykłego dzielenia /nawet i dla liczb 2 bajtowych/.


Pozdrawiam
Bartosz Sarama


=========
Path: news-archive.icm.edu.pl!news.icm.edu.pl!news.onet.pl!agh.edu.pl!news.agh.edu.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "Jakub Nawrot" <chceszbyc_at_nospam_wp.pl>
Subject: Re: konwersja 24-bit to BCD w '51
Date: Sun, 5 Jan 2003 10:59:40 +0100


- przesunięcie w lewo całej liczby przez C
- jeśli C == 1 to
- do wyniku BCD dodajemy taką liczbę kodowaną w BCD (nawet i 6
cyfrową), jaka wynika z 2^n, gdzie n to numer aktualnie wysuniętego do
C bitu.
- i tak aż do wyczerpania wszystkich bitów liczby wejściowej
- dodawanie należy prowadzić oczywiście uwzględniając za każdym razem
korekcję BCD (instrukcja DA A)
Taka operacja powoduje wygenerowanie wyniku "piorunem" w stosunku do
zwykłego dzielenia /nawet i dla liczb 2 bajtowych/.

..no i to mi sie wydaje calkiem fajne i szybkie...tylko zajmuje troche
pamięci,
bo w koncu <"dodajemy taką liczbę kodowaną w BCD ">...przeciez one zajmą
kupę miejsca w pamieci, bo trzeba je sobie juz wczesniej przekodować i
zapisac w pamięci (np. w instrukcjach MOV xx, #YYh)...

[Kubek]





=========
Path: news-archive.icm.edu.pl!mat.uni.torun.pl!news.man.torun.pl!news.icm.edu.pl!mimuw.edu.pl!news.mimuw.edu.pl!newsfeed.tpinternet.pl!news.dialog.net.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "Bartosz Sarama" <quasimod_at_nospam_poczta.usun.onet.pl>
Subject: Re: konwersja 24-bit to BCD w '51
Date: Sun, 5 Jan 2003 11:20:35 +0100


..no i to mi sie wydaje calkiem fajne i szybkie...tylko zajmuje
troche
pamięci,
bo w koncu <"dodajemy taką liczbę kodowaną w BCD ">...przeciez one
zajmą
kupę miejsca w pamieci, bo trzeba je sobie juz wczesniej przekodować
i
zapisac w pamięci (np. w instrukcjach MOV xx, #YYh)...

Nie taką znowu kupę...
Zauważ, że im mniej znaczący bit, tym więcej znaczących zer w wyniku,
więc przestajesz je zapisywać.

Spróbujmy oszacować:

acall rl_24 //2 + 16
jnc, skok_dalej //2 bajty
mov r0, #016h //2
mov r1, #077h //2
mov r2, #072h //2
mov r3, #016h //2
acall add_bcd //2 + 17

rl_24: // 16 bajtów
push psw
rbank 1 //2bajty - zmienna wejściowa w banku 1
mov a, r2
rlc a
mov r2, a
mov a, r1
rlc a
mov r1, a
mov a, r1
rlc a
mov r1, a
pop psw
ret

add_bcd: //17 bajtów
mov a, r7
add a, r3
da a
mov r7, a
mov a, r6
add a, r2
da a
mov r6, a
mov a, r5
add a, r1
da a
mov r5, a
mov a, r4
add a, r0
da a
mov r4, a
ret

Jeśli się nie pomyliłem to daje to 33 bajty na funkcje rl_24 i add_bcd
oraz max 14bajtów na każdy bit /max, bo jak już napisałem - im niższy
bit, tym więcej starszych bajtów wyniku są zerami i nie trzeba ich
pisać za każdym razem.

Daje to max 369bajtów na całą funkcję konwersji 24 bitowej i coś koło
tego cykli maszynowych.
Już samo dzielenie /zwłaszcza kilkakrotne/, nawet metodą przesuwania
bitów będzie trwało duuużo dłużej.


Pozdrawiam
Bartosz Sarama


=========
Path: news-archive.icm.edu.pl!news.icm.edu.pl!news.onet.pl!agh.edu.pl!news.agh.edu.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "Jakub Nawrot" <chceszbyc_at_nospam_wp.pl>
Subject: Re: konwersja 24-bit to BCD w '51
Date: Sun, 5 Jan 2003 13:06:37 +0100


rl_24: // 16 bajtów
push psw
rbank 1 //2bajty - zmienna wejściowa w banku 1
mov a, r2
rlc a
mov r2, a
mov a, r1
rlc a
mov r1, a
mov a, r1
rlc a
mov r1, a
pop psw
ret

tak mi sie rzucilo w oczy....czemu w RL_24 jest push i pop PSW...przeciez
tam jest przechowywany ten nieszcesny bit C ktory jest tak wazny poza tym
podprogramem...a takim POP PSW to my go chyba zamazujemy jakimis starymi
danymi...???

[Kubek]



=========
Path: news-archive.icm.edu.pl!news.icm.edu.pl!news.onet.pl!agh.edu.pl!news.agh.edu.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "Jakub Nawrot" <chceszbyc_at_nospam_wp.pl>
Subject: Re: konwersja 24-bit to BCD w '51
Date: Sun, 5 Jan 2003 13:15:20 +0100


...a poza tym czy nie lepiej przesuwać w prawo...bo wagi w bcd musimy
wpisywać chamsko bezposrednio...a te pierwsze wagi sa malobajtowe (z tytulu
tych zerowych warosci wyzej, np waga 4 wyglada tak 0000 .... 0000 0100),
wiec te wyzsze sa zerami, a to pociaga za soba nastepujacy zysk...nie trzeba
kasowac wyzszych bajtow gdy dopisujemy coraz wieksze wagi...a w procesie
sumowania i dzialania metodą..."w lewo" i badania najstarszych bitow te wagi
sa 8-mio bajtowe a kolejne coraz mniejsze, wiec umieszczając zapisana w BCD
wage mniejsza trzeba zadbac o to zeby wyzerowac "wyzsze" niepotrzebne w tym
sumowaniu bajty (coby podprogram sumujacy nie sumowal glupot)

...no tak jest czy nie?
[Kubek]



=========
Path: news-archive.icm.edu.pl!news.icm.edu.pl!news.onet.pl!newsfeed.tpinternet.pl!news.dialog.net.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "Bartosz Sarama" <quasimod_at_nospam_poczta.usun.onet.pl>
Subject: Re: konwersja 24-bit to BCD w '51
Date: Sun, 5 Jan 2003 16:24:41 +0100


Użytkownik "Jakub Nawrot" <chceszbyc_at_nospam_wp.pl> napisał w wiadomości
news:av97jq$n0l$1_at_nospam_galaxy.uci.agh.edu.pl...
...a poza tym czy nie lepiej przesuwać w prawo...bo wagi w bcd
musimy
wpisywać chamsko bezposrednio...a te pierwsze wagi sa malobajtowe (z
tytulu
tych zerowych warosci wyzej, np waga 4 wyglada tak 0000 .... 0000
0100),
wiec te wyzsze sa zerami, a to pociaga za soba nastepujacy
zysk...nie trzeba
kasowac wyzszych bajtow gdy dopisujemy coraz wieksze wagi...a w
procesie
sumowania i dzialania metodą..."w lewo" i badania najstarszych bitow
te wagi
sa 8-mio bajtowe a kolejne coraz mniejsze, wiec umieszczając
zapisana w BCD
wage mniejsza trzeba zadbac o to zeby wyzerowac "wyzsze"
niepotrzebne w tym
sumowaniu bajty (coby podprogram sumujacy nie sumowal glupot)

...no tak jest czy nie?
[Kubek]


Można oczywiście i tak. Ja proponowałem tylko pomiędzy badaniem
kolejnych bitów w funkcji "głównej" wpisywać w odpowiednie rejestry 0
i dalej już ich nie ruszać więcej, bo zawsze będą 0.

To, co proponujesz jest zdaje mi się tym samym, ale w "drugą" stronę.
Wynik jednakowy, więc każda metoda dobra :-)


Pozdrawiam
Bartosz Sarama


=========
Path: news-archive.icm.edu.pl!news.icm.edu.pl!news.onet.pl!agh.edu.pl!news.agh.edu.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "Jakub Nawrot" <chceszbyc_at_nospam_wp.pl>
Subject: Re: konwersja 24-bit to BCD w '51
Date: Sun, 5 Jan 2003 17:44:21 +0100


To, co proponujesz jest zdaje mi się tym samym, ale w "drugą" stronę.
Wynik jednakowy, więc każda metoda dobra :-)

ha! "wpisywać w odpowiednie rejestry 0"
...a to przeciez kosztuje zawsze te pare bajtów i troszke czasu...prawda? (o
to mi chodziło)

...ale generalnie ta metoda jest dobra...ma ta zaletę, że gdy mało jedynek w
bajtach, to śmiga jak burza...
[Kubek]




=========
Path: news-archive.icm.edu.pl!news.icm.edu.pl!news.onet.pl!newsfeed.tpinternet.pl!news.dialog.net.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "Bartosz Sarama" <quasimod_at_nospam_poczta.usun.onet.pl>
Subject: Re: konwersja 24-bit to BCD w '51
Date: Sun, 5 Jan 2003 16:21:23 +0100


rl_24: // 16 bajtów
push psw
rbank 1 //2bajty - zmienna wejściowa w banku 1
mov a, r2
rlc a
mov r2, a
mov a, r1
rlc a
mov r1, a
mov a, r1
rlc a
mov r1, a
pop psw
ret

tak mi sie rzucilo w oczy....czemu w RL_24 jest push i pop
PSW...przeciez
tam jest przechowywany ten nieszcesny bit C ktory jest tak wazny
poza tym
podprogramem...a takim POP PSW to my go chyba zamazujemy jakimis
starymi
danymi...???


Racja. Chciałem tylko powrotu do banku rejestrów 0
Powinno być
rbank 1
...
rbank 0

bez push i pop psw


Pozdrawiam
Bartosz Sarama


=========
Path: news-archive.icm.edu.pl!news.icm.edu.pl!news.nask.pl!newnews.cyf-kr.edu.pl!agh.edu.pl!news.agh.edu.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "Jakub Nawrot" <chceszbyc_at_nospam_wp.pl>
Subject: Re: konwersja 24-bit to BCD w '51
Date: Sun, 5 Jan 2003 16:05:15 +0100


...np wg pomyslu Pana Bartosza Saramy - 315 bajtów...
dziala perfekcyjnie...tylko duzo rejestrow trzeba uzyc...
ale mysle ze da sie to skrocic jeszcze skomplikowanymi pętlami...ale czy
warto?

pozdrawiam, dziekuję....

[Kubek]



=========
Path: news-archive.icm.edu.pl!news.icm.edu.pl!news.nask.pl!newsfeed.tpinternet.pl!news.tpi.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: jfox_at_nospam_poczta.onet.pl (J.F.)
Subject: Re: konwersja 24-bit to BCD w '51
Date: Mon, 06 Jan 2003 21:16:04 GMT


On Sat, 4 Jan 2003 22:11:25 +0100, Bartosz Sarama wrote:
dla dużych znacznie szybciej jest zrobić tak:
- przesunięcie w lewo całej liczby przez C
- jeśli C == 1 to
- do wyniku BCD dodajemy taką liczbę kodowaną w BCD (nawet i 6
cyfrową), jaka wynika z 2^n, gdzie n to numer aktualnie wysuniętego do
C bitu.
- i tak aż do wyczerpania wszystkich bitów liczby wejściowej
- dodawanie należy prowadzić oczywiście uwzględniając za każdym razem
korekcję BCD (instrukcja DA A)

Proponuje mala modyfikacje - przesuwamy liczbe binarna w lewo [tzn
MSB->C], a potem liczbe BCD dodajemy do samej siebie + C - czyli
tez "przesuwamy w lewo", ale w BCD [mnozenie przez 2].

Nie trzeba bedzie zapamietywac liczb 2^n w BCD.

J.


=========
Path: news-archive.icm.edu.pl!news.icm.edu.pl!news.atman.pl!newsfeed.gazeta.pl!newsfeed.tpinternet.pl!news.tpi.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: Milosz Skowyra <miloszek_at_nospam_fidonet.org.pl>
Subject: Re: konwersja 24-bit to BCD w '51
Date: Sun, 05 Jan 2003 18:56:39 +0100


Jakub Nawrot wrote:

..mam problem...(jak w temacie) ...siedze juz jakis czas...i czesciowo
wymyslilem z kolegą algorytm dla 51...

Liczbę binarna o wagach calkowitych mozna zamienic na liczbę w kodzie
BCD stosując metode mnozenia przez 2 w kodzie BCD. Ze względu na uzycie
rozkazu korekcji dziesietnej operacje mnozenia zastepujemy rozkazem
dodawania.
Wyrzniete z jakiegos programu, ale pamietam ze nie potrzebowalem calej
liczby 32 bitowej tylko afair 10 bitowa.

;--------------------------------------------------------------
; KONWERSJA DEC NA BCD
; WE R0 - R3 -> WY R4 - R7
;--------------------------------------------------------------
DEC2BCD:MOV PETLA,#32
MOV R4,#0
MOV R5,#0
MOV R6,#0
MOV R7,#0
BCD: CLR C
MOV A,R0
RLC A
MOV R0,A
MOV A,R1
RLC A
MOV R1,A
MOV A,R2
RLC A
MOV R2,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R5
ADDC A,R5
DA A
MOV R5,A
MOV A,R6
ADDC A,R6
DA A
MOV R6,A
MOV A,R7
ADDC A,R7
DA A
MOV R7,A
DJNZ PETLA,BCD
RET
--
Regards. Przy odpowiedzi usun "." przed "net" z adresu!!!
|-----------------------------------------------------|
| Milosz Skowyra GSM Mobile +48 600 95 35 72 |
| miloszek_at_nospam_fido.net.org.pl 2:484/2.47 on fidonet |
|-----------------------------------------------------|
"Zaprojektowany do lubudubu" - (C) Marek Dzwonnik ;->>>

=========
Path: news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.silweb.pl!newsfeed.tpinternet.pl!szmaragd.futuro.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: Romuald Bialy <romek_b_at_nospam_o2.pl>
Subject: Re: konwersja 24-bit to BCD w '51
Date: Sun, 05 Jan 2003 19:00:07 +0100


Jakub Nawrot wrote:

..mam problem...(jak w temacie) ...siedze juz jakis czas...i czesciowo
wymyslilem z kolegą algorytm dla 51...
ale...jestem ciekaw czy to mozna zrobic prosciej, krocej, szybciej....
chce to napisac sobie w asemblerze (wiec jezyki wysokiego poziomu odpadają)
...czy ktoś pisał cos takiego? nie chodzi mi tu nawet o to żeby kod otrzymac
gotowy tylko jakąś podpowiedz....

Kubek...

Kurde, pisalem cos takiego jakies 10 lat temu... zaraz poszukam...
O jest, tyle ze dla cyfry 28 bitowej. Ale nie moge se przypomniec jak to
dokladnie dziala... dawno to bylo.
Algorytm byl z jakiejs knigi. Oto wynik:

OUTBCD4 EQU 56H
OUTBCD3 EQU 57H
OUTBCD2 EQU 58H
OUTBCD1 EQU 59H
OUTBCD0 EQU 5AH
INBCD3 EQU 5BH ;MSB
INBCD2 EQU 5CH
INBCD1 EQU 5DH
INBCD0 EQU 5EH ;LSB

BCD: MOV R2,#4 ;POMIN 4 NAJSTARSZE BITY
MOV R1,#OUTBCD0
BCD1: MOV _at_nospam_R1,#0
DEC R1
LCALL ROTL ;PRZESUN O 1 BIT
DJNZ R2,BCD1 ;4 RAZY
MOV OUTBCD4,#0 ;WYZEROWANIE NAJSTARSZEJ POZYCJI
MOV R2,#28 ;28 BITOW DO KONWERSJI
BCD2: MOV R0,#OUTBCD0 ;ADRES DANYCH WYJSCIOWYCH
MOV R1,#4 ;4 BAJTY
COR1: MOV A,_at_nospam_R0 ;POBIERZ BAJT
MOV B,A ;DANA W B
LCALL COR2 ;PROCEDURA KOREKCJI MLODSZYCH 4 BITOW
MOV _at_nospam_R0,A ;ZAPIANIE SPOWROTEM 4 MLODSZYCH BITOW
MOV A,B ;ODTWORZ BAJT
SWAP A ;4 STARSZE NA MLODSZA POZYCJE
MOV B,A ;DANA W B
LCALL COR2 ;KOREKCJA 4 MLODSZYCH BITOW
SWAP A ;SKORYGOWANE NA STARSZA POZYCJA
ORL A,_at_nospam_R0 ;DODAJ DO ZAPISANYCH 4 MLODSZYCH
MOV _at_nospam_R0,A ;ZAPISZ CALY SKORYGOWANY BAJT
DEC R0 ;NASTEPNY BAJT
DJNZ R1,COR1 ;POWTORZ 4 RAZY
LCALL ROTL ;PRZESUN CALOSC O 1 BIT W LEWO
DJNZ R2,BCD2 ;POWTORZ 28 RAZY
RET ;KONIEC KONWERSJI

COR2: MOV A,B ;KOREKCJA MLODSZYCH 4 BITOW Z B ZAPISANA DO A
ANL A,#0FH ;MASKA NA MLODSZE
CLR C
SUBB A,#5 ;SPRAWDZ CZY > 4
MOV A,B
ANL A,#0FH ;ODTWORZ AKUMULATOR
JC COR3 ;JEZELI NIE > 4 TO NIE KORYGUJ
ADD A,#3 ;KOREKCJA POPRZEZ DODANIE 3
COR3: RET

ROTL: MOV R0,#INBCD0 ;ADRES DANYCH DO PRZESUNIECIA
MOV B,#9 ;PRZESUNIECIE O 1 BIT W LEWO WSZYSTKICH DANYCH
CLR C
ROT1: MOV A,_at_nospam_R0 ;(WEJSCIOWYCH I WYJSCIOWYCH), RAZEM 9 BAJTOW
RLC A
MOV _at_nospam_R0,A
DEC R0
DJNZ B,ROT1
RET



--
Pozdrawiam Romuald Bialy
E'mail: romek_b_at_nospam_o2.pl
yampp-WWW: http://www.yamppsoft.prv.pl


=========
Path: news-archive.icm.edu.pl!news.icm.edu.pl!news.onet.pl!newsfeed.gazeta.pl!newsfeed.tpinternet.pl!news.tpi.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: jfox_at_nospam_poczta.onet.pl (J.F.)
Subject: Re: konwersja 24-bit to BCD w '51
Date: Sun, 05 Jan 2003 21:15:03 GMT


On Sat, 4 Jan 2003 21:07:25 +0100, Jakub Nawrot wrote:
..mam problem...(jak w temacie) ...siedze juz jakis czas...i czesciowo
wymyslilem z kolegą algorytm dla 51...
ale...jestem ciekaw czy to mozna zrobic prosciej, krocej, szybciej....
chce to napisac sobie w asemblerze (wiec jezyki wysokiego poziomu odpadają)
...czy ktoś pisał cos takiego? nie chodzi mi tu nawet o to żeby kod otrzymac
gotowy tylko jakąś podpowiedz....

na '51 moze byc sensowne najpierw odejmowanie miliona, potem po 100k,
potem po 10k, po 1000, a potem skorzystanie z dzielenia.

Tzn za kazdym razem liczyc ile razy da sie odjac.

J.



=========
Path: news-archive.icm.edu.pl!news.icm.edu.pl!news.onet.pl!newsgate.onet.pl!newsgate.p