[#1] HEX - BCD
Czy zna ktos jakis sprytny algorytm zamiany zapisu z szesnastkowego na BCD?

Uprzedzajac porady asemblerowcow: znam instrukcje PACK i UNPACK z ktorych moglbym skorzystac,
ale w ogole nie interesuja mnie rozwiazania procesorowe (jakiegokolwiek).
[#2] Re: HEX - BCD

@Phibrizzo, post #1

Jeśli chodzi o asembler 68000, to mam opracowane różne procedury konwersji: link.
[#3] Re: HEX - BCD

@Phibrizzo, post #1

np. tu jest:
link
[#4] Re: HEX - BCD

@RomanWorkshop, post #2

Dzieki, ale koszt instrukcji dzielenia jest dla mnie nie do przeskoczenia.

@Docent:
Nie wiem co ktos mial na mysli ale wg mnie to nie jest konwerter do BCD. A tym bardziej z HEX.

Ogolnie, troche przemyslalem swoj problem i chyba zrobie to inaczej niz myslalem. Tz bez konwersji, bo widze ze to jest trudny temat.

Ostatnia aktualizacja: 28.02.2023 14:05:01 przez Phibrizzo
[#5] Re: HEX - BCD

@Phibrizzo, post #4

W jakiej formie masz ten HEX, masz zapisane jako ASCII ??? Czy to na przykład bajt i chcesz wartość tego bajta przerobić na kod BCD.
Jeśli chcesz ominąć dzielenie, to zostaje odejmowanie. Napisz coś więcej ...
[#6] Re: HEX - BCD

@Phibrizzo, post #1

Ale chodzi Ci o jakiej wielkosci wartosci? Bo to troche przypomina konwersje z hex do ascii, ale bez dodawania $30. Jesli tak to mozesz uzyc odejmowania w petli, zamiast dzielenia. Gdzies w tym watku sa rozne wersje, ale w ASM 68k.


link
[#7] Re: HEX - BCD

@asman, post #5

Faktycznie moglem byc zle zrozumiany.
Chodzilo mi o konwersje zapisu binarnego, dajmy na to: 16 bit na cztery cyfry w BCD tez zapisane na 16 bitach.
[#8] Re: HEX - BCD

@Phibrizzo, post #7

W 16 bitach mieszczą się też liczby 5 cyfrowe (więc 2,5 bajta BCD). Dla 8 bitów to bez dzielenia (ale tracąc dużo pamięci) byłaby najszybsza tablica konwersji gdzie wartość binarna wskazywałaby na adres pod którym jest odpowiadająca wartość bcd. Ale dla większych wartości jest to już... bez sensu.
[#9] Re: HEX - BCD

@Phibrizzo, post #7

To Ci sie nie zmiesci. Musialby byc BCD w 32 bitach minimum. Choc zalezy jaka wartosc 16 bit bylaby maksymalna. Najszybsza bylaby tablica lub tablice (jesli wielkosc tablicy ma znaczenie). Pozniej metoda odejmujaca 10000, 1000, 100 i 10. A najwolniejsza dzielenie.
[#10] Re: HEX - BCD

@Phibrizzo, post #7

jak bys skonwertowal np do liczby dziesietnej w postaci stringu, to kazda cyfra bedzie kodem bcd, ktory mozesz zmapowac na nibbla 4 bitowego i odpowiednio upchac w tych 16 bitach ...
[#11] Re: HEX - BCD

@Phibrizzo, post #1

Spotkałem artykuł na ten temat lata temu, w Tajemnicach Atari.
Ja tego nie ogarniam, ale w razie gdyby się przydało, to zostawiam link do artykułu:

https://tajemnice.atari8.info/11-12_92/11-12_92_6502.html
[#12] Re: HEX - BCD

@karolb, post #11

Phibrizzo w pierwszym poście napisał, że nie interesują go rozwiązania "procesorowe", a takim jest procedura z linku. Wykorzystuje tryb BCD procesora 6502 (instrukcja SED go włącza, a CLD wyłącza).
[#13] Re: HEX - BCD

@Phibrizzo, post #7

Kilka pomysłów:
  • Tablica 9999 liczb 16-bitowych w kodzie BCD. Sprawdzasz najpierw czy wartość jest mniejsza od 10000, jeżeli tak czytasz BCD z tablicy. Szybkie, ale zje 20 kB pamięci na tablicę.
  • Zamiast dzielenia przez 1000, 100, 10 możesz zrobić mnożenie przez przeskalowaną odwrotność i shift. To może być najszybsze, jeżeli masz mnożenie 16×16 z wynikiem 32-bitowym. Division of Integers by Constants.
  • Możesz mieć tablicę z wartościami binarnymi 1000, 100, 10, 1 i odejmować je kolejno w pętli. W najgorszym przypadku 40 odejmowań, ale żadnego mnożenia. Żeby było szybciej można zrobić unroll zewnętrznej pętli. Pewną wadą może być to, że czas konwersji będzie zależał od konwertowanej liczby.


Ostatnia aktualizacja: 28.02.2023 19:38:57 przez Krashan
1
[#14] Re: HEX - BCD

@Krashan, post #13

A ja może nieśmiało tylko zasugeruję/zapytam że/czy być może taka funkcja istnieje gdzieś w bibliotekach matematycznych?
[#15] Re: HEX - BCD

@Don_Adan, post #9

W ASM 68k to cos takiego mogloby chyba byc. O ile nie ma bledow. Mozesz sobie przerobic na jakis wyzszy jezyk, o ile znasz ASM 68k. Choc nie wiem czy to takie proste by bylo.

; input D0 (word)
; output D1 (longword)
; D2,D3 temp

move.l #$FFFF00FF,D1 ; wartosci poczatkowe to $FF dla kazdej z 5 cyfr
move.w #$FFFF,D2 ; wartosci poczatkowe to $FF dla kazdej z 5 cyfr
move.w #10000,D3

B10000
addq.b #1,D1
sub.w D3,D0
bcc.b B10000
add.w D3,D0
swap D1 ; pierwsza cyfra ustawiona
move.w #1000,D3

B1000
addq.b #1,D2
sub.w D3,D0
bcc.b B1000
add.w D3,D0
rol.w #8,D2 ; druga cyfra (high byte, nieustawiona)
moveq #100,D3

B100
addq.b #1,D1
sub.w D3,D0
bcc.b B100
add.w D3,D0
rol.w #8,D1 ; trzecia cyfra (high byte, ustawiona)
moveq #10,D3

B10
addq.b #1,D2
sub.w D3,D0
bcc.b B10
add.w D3,D0
lsl.w #4,D2 ; czwarta i druga cyfra ustawiona
move.b D0,D1 ; piata cyfra ustawiona
or.w D2,D1 ; ustawienie wszystkich cyfr po kolei


Ostatnia aktualizacja: 28.02.2023 22:08:11 przez Don_Adan
[#16] Re: HEX - BCD

@Don_Adan, post #15

Dzieki wielkie :)
Przyjrze sie temu.

Wiedzialem ze to nie bedzie trywialny temat ale zeby az tak?
Swoja droga, ciekawe jak to procesory robia. Bo z tego co wiem to nawet Z80 ma taka konwersje (DAA).
[#17] Re: HEX - BCD

@Phibrizzo, post #16

Poszukalem jeszcze w Google i wyplulo mi taka odpowiedz:
Idea jest prosta: przesuwamy w lewo po 1 bicie konwertowaną liczbę pakując wysuwany bit w szereg kolejnych pozycji BCD. Jeśli w każdej iteracji wartość w kolumnie (danym miejscu dziesiętnym) jest większe lub równe 5 to zwiększamy wartość tej liczby o 3
[#18] Re: HEX - BCD

@Phibrizzo, post #17

Ok. Aby zakonczyc temat znalazlem cos takiego:
link
1
[#19] Re: HEX - BCD

@Don_Adan, post #15

Jeszcze o 2 bajty mozna ta wersje skrocic.

; input D0 (word)
; output D1 (longword)
; D2,D3 temp

 move.l #$FFFF00FF,D1 ; wartosci poczatkowe to $FF dla kazdej z 5 cyfr
; move.w #$FFFF,D2 ; wartosci poczatkowe to $FF dla kazdej z 5 cyfr
 move.w #10000,D3

B10000
 addq.b #1,D1
 sub.w D3,D0
 bcc.b B10000
 add.w D3,D0
 swap D1 ; pierwsza cyfra ustawiona
 move.w D1,D2 ; +
 move.w #1000,D3

B1000
 addq.b #1,D2
 sub.w D3,D0
 bcc.b B1000
 add.w D3,D0
 rol.w #8,D2 ; druga cyfra (high byte, nieustawiona)
 moveq #100,D3

B100
 addq.b #1,D1
 sub.w D3,D0
 bcc.b B100
 add.w D3,D0
 rol.w #8,D1 ; trzecia cyfra (high byte, ustawiona)
 moveq #10,D3

B10
 addq.b #1,D2
 sub.w D3,D0
 bcc.b B10
 add.w D3,D0
 lsl.w #4,D2 ; czwarta i druga cyfra ustawiona
 move.b D0,D1 ; piata cyfra ustawiona
 or.w D2,D1 ; ustawienie wszystkich cyfr po kolei
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem