OldComp.cz

Komunitní diskuzní fórum pro fanoušky historických počítačů


Právě je 29.03.2024, 10:13

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 56 ]  Přejít na stránku Předchozí  1, 2, 3, 4
Autor Zpráva
PříspěvekNapsal: 14.06.2020, 23:56 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
lukz píše:
Chtěl jsem si taky vyzkoušet implementaci tohohle CRC algoritmu. Ale z toho popisu tady mi nebylo moc jasné, jak to funguje, tak jsem hledal nějaké zdroje, a pro mě srozumitelnější popis programu jsem nakonec našel na
https://www.ccsinfo.com/forum/viewtopic.php?t=24977 .

A když jsem to pochopil, tak jsem se vrátil k tomu, co proběhlo tady, a po porovnání myslím, že je to úplně to samé. Zkusil jsem si to tedy také převést na i8080 assembler, třeba se to bude hodit jako alternativní verze. Napadlo mě vícekrát využít některé společné podvýrazy, což by mělo pomoci ke kratšímu kódu.

https://gist.githubusercontent.com/lukq ... ci8080.asm

Jeee, ani jsem si nevsiml, ze si dal kod do odkazu. Koukam ze jsi tam rovnou pridal inc HL, pokud dobre ctu tu syntaxi. Ale podle me tam mas jeste chybku kdy si zapomnel pri x ^= x >> 4 vynulovat horni 4 bity.

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
PříspěvekNapsal: 15.06.2020, 01:32 
Offline
Kecálek

Registrován: 28.10.2016, 21:03
Příspěvky: 122
Has thanked: 13 times
Been thanked: 50 times
Ano, inc hl jsem tam přidal taky.
_dworkin píše:
Ale podle me tam mas jeste chybku kdy si zapomnel pri x ^= x >> 4 vynulovat horni 4 bity.
A to je naprostá pravda. Ten kód jsem nezkoušel, a při přepisu z C jsem tady zapomněl maskovat hodnotu. Díky za kontrolu.

Tady je opravená verze:
https://gist.githubusercontent.com/lukq ... ci8080.asm


Nahoru
 Profil  
 
PříspěvekNapsal: 15.06.2020, 02:12 
Offline
Kecálek

Registrován: 28.10.2016, 21:03
Příspěvky: 122
Has thanked: 13 times
Been thanked: 50 times
Radši jsem si to odsimuloval, jestli tam ještě není nějaká zrada, a vychází mi to stejně, jako tu psal EC1045.01 .

[0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39]
dává 0x31c3
[0xfc,0x5,0x4a]
dává 0x8048


Nahoru
 Profil  
 
PříspěvekNapsal: 15.06.2020, 15:09 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Overena varianta ( zvolil jsem tu o takt pomalejsi, protoze jsem usetril jeden registr )
Kód:
; In:  HL = Data addr, DE old crc
; Out: DE new crc
; Pollutes: AF, DE, HL, C
crc16_byte:
    ld    A, (HL)   ; 1:7
    xor   D         ; 1:4
    ld    C, A      ; 1:4   x = ((old_crc>>8) ^ data) & 0xff;
    rrca            ; 1:4
    rrca            ; 1:4
    rrca            ; 1:4
    rrca            ; 1:4
    and  0x0F       ; 2:7
    xor   C         ; 1:4
    ld    C, A      ; 1:4   x ^= x>>4
                    ;11:46
   
    add   A, A      ; 1:4
    add   A, A      ; 1:4
    add   A, A      ; 1:4
    add   A, A      ; 1:4   1111 0000
    xor   E         ; 1:4
    ld    D, A      ; 1:4   crc_hi = (old_crc << 8) ^ (x << 12)

    xor   E         ; 1:4
    add   A, A      ; 1:4   1110 0000
    xor   C         ; 1:4
    ld    E, A      ; 1:4   crc_lo = (x << 5) ^ x

    ld    A, C      ; 1:4
    rrca            ; 1:4
    rrca            ; 1:4
    rrca            ; 1:4
    and  0x1F       ; 2:7   0001 1111
    xor   D         ; 1:4
    ld    D, A      ; 1:4   crc_hi = (old_crc << 8) ^ (x << 12) ^ (x << 5)
                    ;18:71

Mimochodem to mame pry vsichni spatne.
http://srecord.sourceforge.net/crc16-ccitt.html

Ale v podstate se asi jedna jen o to ze na https://crccalc.com/ mame shodu s CRC-16/CCITT-FALSE a ta stranka ma shodu s CRC-16/AUG-CCITT. Jak je to s prazdnym retezcem kde se maji pridavat nejake bajty netusim.

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
PříspěvekNapsal: 15.06.2020, 15:24 
Offline
Kecálek

Registrován: 06.04.2020, 16:24
Příspěvky: 222
Bydliště: Opava
Has thanked: 31 times
Been thanked: 70 times
_dworkin píše:
Overena varianta ( zvolil jsem tu o takt pomalejsi, protoze jsem usetril jeden registr )

Konečně nějaký použitelný hotový kód pro Z80. Jen tak dále. :clap:


Nahoru
 Profil  
 
PříspěvekNapsal: 15.06.2020, 17:44 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Cely kod je na https://pastebin.com/bpNza70p
Provedl jsem tam takovy osklivy hack, pro 16bitovou smycku kdyz mas jen volny B registr. Pokud by ty bloky ktere to ma pocitat byly 1..256 bajtu dlouhe tak to jde hodne zkratit.

PS: Pocita to jak CRC-16/CCITT-FALSE tak CRC-16/AUG-CCITT. Rozdil je jen v pocatecnim nastaveni crc. Jednou 0xFFFF a podruhe 0x1D0F. Takze ta stranka asi trochu kecala, protoze ten jejich 100% spravny algoritmus se pocita pro kazdy bit bajtu a jeste se musi prodluzovat pri nulovem retezci aby jim tam vysel ten 0x1D0F.

PPS: Ukazka je pro prazdny retezec, "A", "123456789" a 256x "A".

PPPS: Jeste lepsi by bylo, pokud by data mela promenlivou delku, kdyby ta data neobsahovala treba nulu, takze by sla pouzit jako zarazka konce.


Přílohy:
crc.png
crc.png [ 2.87 KiB | Zobrazeno 7920 krát ]

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH
Nahoru
 Profil  
 
PříspěvekNapsal: 15.06.2020, 17:54 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Hmm... jak to clovek da na net tak hned vidi co by slo jeste vylepsit... :D Tisk cisla.
Kód:
;===============================
;TISK OBSAHU <DE> V HEXA KODU
PRINT_DE:
    ld    A, D
    call  PRINT_A
    ld    A,E
    ; fall

PRINT_A:
    push AF
    rrca
    rrca
    rrca
    rrca
    call A2HEX      ; vypise horni nible registru A
    pop  AF
    ; fall

A2HEX:
    or   0xF0       ; reset H flag
    daa             ; $F0..$F9 + $60 => $50..$59; $FA..$FF + $66 => $60..$65
    add   A, 0xA0   ; $F0..$F9, $100..$105
    adc   A, 0x40   ; $30..$39, $41..$46   = '0'..'9', 'A'..'F'       
    rst  0x10       ; vypis znaku z registru A
    ret

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
PříspěvekNapsal: 15.06.2020, 20:30 
Offline
Profík

Registrován: 15.01.2014, 20:08
Příspěvky: 783
Bydliště: Šlapanice
Has thanked: 129 times
Been thanked: 97 times
Zapomněl jsem dodat, že ty takty jsou pro kód, co jsem dal a to bez optimalizace, aneb ten kód byl psán tak aby přesně odpovídal tomu, jak to popsal Panda38.

Po prvním zhlédnutí jsem myslel, že tam nemáš to přehození registru ale ono tam a dost fikaně schované.

Jo ten převod na HEXa jsem měl dost neefektivní ale to že i vlastí převod na HEXa znak se dá nepsat jinak a efektivněji to koukám … ten původní převod není můj výmysl, ale jen jsem to opsal. Nejsem v programování takoví guru.

MTs ten kód používá jen instrukce 8080A takže je plně použitelný i pro stroje s 8080A a 8085.


Přílohy:
CRC.rar [5.41 KiB]
425 krát

_________________
Ne všichni jsme měli z češtiny za jedna, aneb jsem dyslektik a dysgrafik.

http://www.sapi.cz/
Nahoru
 Profil  
 
PříspěvekNapsal: 15.06.2020, 21:43 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Jestli to bylo na me, tak tu cast
Kód:
    or   0xF0       ; reset H flag
    daa             ; $F0..$F9 + $60 => $50..$59; $FA..$FF + $66 => $60..$65
    add   A, 0xA0   ; $F0..$F9, $100..$105
    adc   A, 0x40   ; $30..$39, $41..$46   = '0'..'9', 'A'..'F'
jsem pouzil z https://github.com/DW0RKiN/Floating-point-Library-for-Z80/blob/master/binary16/print_hex.asm. Kde jsem se na tom nadrel a proste to zkousel prepisovat zleva zprava tak dlouho az to lepe neslo. Ja ani s "daa" nezacinal. Protoze to neni zrovna instrukce co se bezne pouziva. Takze si to musel (znovu) nastudovat co vlastne dela.
Kdyz pak dostanes do ruky cizi kod a kouknes se jak si se s tim popral ty (protoze ani svuj si nepamatujes :D ). Tak bud vidis ze jsi na tom lepe, nebo se chytnes za hlavu a prepises svuj. .)

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
PříspěvekNapsal: 15.06.2020, 22:36 
Offline
Profík

Registrován: 15.01.2014, 20:08
Příspěvky: 783
Bydliště: Šlapanice
Has thanked: 129 times
Been thanked: 97 times
Ještě to zkusím spustit na reálné MHB8080A co ta instrukce DAA bude dělat, mám pocit že DAA se na 8080A chová trochu jinak než na Z80 tj. u 8080A by měla DAA zabrat jen po „skrytém přenosu“ při sčítaní ale u Z80 zabere vždy. Aneb to aspoň tak vyplivá z dokumentace.

_________________
Ne všichni jsme měli z češtiny za jedna, aneb jsem dyslektik a dysgrafik.

http://www.sapi.cz/


Nahoru
 Profil  
 
PříspěvekNapsal: 16.06.2020, 00:38 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 24.05.2018, 22:32
Příspěvky: 1972
Bydliště: Most, Praha
Has thanked: 864 times
Been thanked: 697 times
Co vzpomínám, tak se převod na HEX dělával takto:
Kód:
      and      0fh      ; je potreba jen u nizsiho nibble

      add      a,90h
      daa
      adc      a,40h
      daa
Svým kódem jsi _dworkin zjevně ušetřil 1 instrukci pro maskování dolního nibble. Zkusil jsem obě metody projet na PC (x86 má kompatibilní daa), 256 variant bajtu s dekódováním 2 nibble, a výsledky sedí.

_________________
i++ (INC) increment
i-- (DEC) decrement
i@@ (EXC) excrement


Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 56 ]  Přejít na stránku Předchozí  1, 2, 3, 4

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 4 návštevníků


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz