[CA80] cALo - szeregowe ładowanie Intel HEX do systemu CA80

Kącik dla elektroniki retro - układy, urządzenia, podzespoły, literatura itp.
Awatar użytkownika
tasza
Geek
Geek
Posty: 1082
Rejestracja: czwartek 12 sty 2017, 10:24
Kontaktowanie:

[CA80] cALo - szeregowe ładowanie Intel HEX do systemu CA80

Postautor: tasza » niedziela 20 paź 2019, 00:06

♬ ☘ Moja muzyka do kodowania ♬ ♬ ♬ ☘
♫ ♩ ♪ Michał Jelonek ⚡ ☘ ⚡ A Funeral Of A Provincial Vampire ♪ ♩

https://youtu.be/Mbp3b7uehx0



Dobry wieczór.

Jednym z zagadnień, kóre wypadałoby poruszyć przy okazji omawiania Z80-SIO jest ładowanie programów do pamięci CA80 przy pomocy łącza szeregowego. Nadarzyła się ostatnio okazja, aby i ten temat domknąć - przedstawiam zatem proste rozwiązanie programowe, umożliwiające załadunek kodu do CA80 i bazujące na opisywanych już wariacjach podłączenia Z80-SIO/0 do CA.

calo (z80)

To prosty programik uplasowany pod adresem 0x4000, zajmuje nieco ponad 300 bajtów i odpowiedzialny na odbieranie i interpretację ramek danych w formacie Intel HEX. O IHEX gaweł napisał już wszystko, po szczegóły odsyłam do :arrow: Format pliku Intel-hex.

Uruchomiona aplikacja `cALo` czeka na `:`, po jego wykryciu pracowicie chomikuje nadchodzące znaczki w buforze odbiorczym (górna pamięć RAM, 80 bajtów powyżej stosu użytkownika) - to procedurka loadHex. Po wykryciu znaku LF kończy się faza akwizycji znaków, calo zaczyna ich interpretację. Po pierwsze procedurą checkCRC sprawdzana jest suma kontrolna ramki, to ważne bo przecież nie chcemy załadować do RAM jakiejś lipy. Następnie sprawdzane jest czy załadowany rekord IHEX jest znacznikiem końca zbioru - isEOF, gdy tak, aplikacja kończy pracę.
Dalej, zebrane dane z ramki są wypakowywane do zadanej lokalizacji pamięci, funkcja procHex pilnuje przy okazji, aby wyładunek bajtów nie nadpisał kodu calo, w przypadku wykrycia tego zagrożenia - program kończy pracę odrzucając ramkę. Każda poprawnie obsłużona ramka z danymi potwierdzana jest do PC znaczkiem `.`, ramka z EOF - znaczkiem `-`. Wszelkie błędy sygnalizowane są wysłaniem znaku `!`, oczywiście dopchniętego LF-em, za to wszystko odpowiada funkcja-kameleon sendAck/Err/Done. Podczas ładowania danych adres bieżacego rekordu prezentowany jest na czterech najmłodszych pozycjach wyświetlacza. Nie ma to jakiegoś praktycznego uzasadnienia, w końcu chyba wiemy co i gdzie wgrywamy, ale fajnie wygląda więc zostało.

Program calo akceptuje rekordy IHEX o rozmiarze do 32 bajtów - wynika to długości bufora odbiorczego. Nie ma restrykcji na wielkość cyfr hex - radzi sobie spokojnie zarówno z zestawem a..f jak i A..F.

Aplikacja sama w sobie nie jest skomplikowana, choć starałam się napisać ją jak najoszczędniej, w sensie długości kodu maszynowego. Po prostu - wizja wpalcowania kilkuset bajtów zleceniem *D jest bardzo skutecznym motywatorem aby dłużej pomysleć. Programik obsługuje Z80-SIO na kanale B, ale elementarne funkcje komunikacyjne i ustawienia UART są wyizolowane do sioInit, putChar, getChar, a transmisja nie korzysta z systemu przerwań. Nie ma więc problemu, aby kod zaadaptować do np. układu UART typu Intel 8251 - możliwe nawet, że program nieco się skróci, ponieważ ta akurat kostka ma parę rejestrów na krzyż.

calo (PC)

Drugi koniec kabelka szeregowego obsługuje konsolowy programik ładujący - także nazwany calo. Nabazgrałam go w C i natywnie pod Linux, więc wielbiciele Windows to pewnie nie skorzystają za bardzo. Program jest równie prosty co poprzednik, a robi rzecz dokładnie odwrotną do bliźniaka z CA80 - wysyła ramki IHEX (linie pliku) skonfigurowanym łączem szeregowym stosownie reagując na odpowiedzi CA80 (.-!). W przypadku jakichkolwiek anomalii ładowanie jest przerywane ze stosownym komunikatem o błędzie. Wywołanie z konsoli to jak nietrudno zgadnąć:

konsola pisze:

Kod: Zaznacz cały

calo nazwa_portu scieżka_do_pliku_hex

konsola pisze:

Kod: Zaznacz cały

./calo /dev/ttyUSB1 ../test/8kb_8000.hex


Cały zestaw komunikuje się z szybkością 19200 baud, co jak dalej zobaczymy jest do radosnej dłubaniny przy CA80 w zupełności wystarczające. Testowy wsad - plik z 8kB danych ładuje się około 15 sekund, to chyba dobry wynik.

W ramach usprawnień - zastanawiam się nad podpięciem `calo` do zestawu zleceń systemowych, oczywiście po znalezieniu mu miejsca w oryginalnym EPROM z MIK33, to pewnie będzie wymagało poświęcenia jakiejś mało przydatnej rzeczy - może transmisja z ZX Spectrum? Zobaczymy jeszcze, a póki co siedzi on pod adresem 0x4000 w banku z NVRAM.

Tradycyjnie filmik z pary programików w działaniu - oprócz prezentacji ładowania 8kB kodu mamy też prosty test elementarnej idioto-odporności - błędne ramki są raportowane i zamykają aplikację.

https://youtu.be/JN0cCCYbeJI

A na koniec pożalę się deko - chcąc wprowadzić zabezpieczenie przez nadpisaniem się programu musiałam pozyskać wartość numeru strony z bieżącej wartości licznika rozkazów, czyli po prostu jego starszy bajt. Łomatko, co ja wyczyniałam... i próby z '>' i z przesunięciem bitowym, no nie szło i już. Wreszcie powstał potworek z rejestrem indeksowym IX i sztucznie wprowadzoną stałą na końcu kodu, tam się dla odmiany okazało, że assembler nie rozpoznaje rejestrów połówkowych IXH oraz IXL, no masakra normalnie. Mój ulubiony sbasm3 też w sumie tego nie ogarnia, ale przynajmniej tablice symboli z konkretnymi wartościami potrafi na koniec przygotować. I coś czuję, że finalna wersja `calo` będzie jednak z dialekcie sbasm3...

#slowanawiatr
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
______________________________________________ ____ ___ __ _ _ _ _
Kończysz tworzyć dopiero, gdy umierasz. (Marina Abramović)

Awatar użytkownika
gaweł
Expert
Expert
Posty: 966
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

Re: [CA80] cALo - szeregowe ładowanie Intel HEX do systemu CA80

Postautor: gaweł » niedziela 20 paź 2019, 04:45

tasza pisze:Cały zestaw komunikuje się z szybkością 19200 baud, co jak dalej zobaczymy jest do radosnej dłubaniny przy CA80 w zupełności wystarczające.

Nabierasz prędkości ;) . W porównaniu z poprzednim rozwiązaniem to kosmos.

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse

Awatar użytkownika
tasza
Geek
Geek
Posty: 1082
Rejestracja: czwartek 12 sty 2017, 10:24
Kontaktowanie:

Re: [CA80] cALo - szeregowe ładowanie Intel HEX do systemu CA80

Postautor: tasza » niedziela 20 paź 2019, 19:18

Yyyy, no nie, poprzednie (zakładam że myślisz o Ładowace Do Pamięci) nie jest o wiele szybsze, tylko chińskie Ardu obok CA80 to jest bezguście totalne, stąd loaderek do Z80SIO, aby po niechlubnym epizodzie powrócić do koszernych, klimatycznych rozwiązań.

Zgodnie z zapowiedzią strzelam focha do assemblera w SDCC, `calo` przeportowane na sbasm3 jest na gitHub:
:arrow: https://github.com/bienata/CA80/blob/ma ... lo4000.asm

No i pozbyłam się tych perwersji z wydłubywaniem strony via IX, małe a cieszy bo liczy się samo na poziomie translatora:
calo4000.asm pisze:

Kod: Zaznacz cały

   ; . . .
   cp calo_app_end>>8+1
   ; . . .
calo_app_end:
   ; . . .   
______________________________________________ ____ ___ __ _ _ _ _
Kończysz tworzyć dopiero, gdy umierasz. (Marina Abramović)

Awatar użytkownika
gaweł
Expert
Expert
Posty: 966
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

Re: [CA80] cALo - szeregowe ładowanie Intel HEX do systemu CA80

Postautor: gaweł » poniedziałek 21 paź 2019, 00:08

Rozumiem, ma być klimatycznie.

Chcesz powiedzieć, że to nie da się skompilować w SDCC?

Kod: Zaznacz cały

            ld HL,rx_buffer+2  ; ustaw sie na adres                       
            call ascii2byte           
            cp calo_app_end>>8+1    ; adresy <= 42 - err
            jp C,procHex_err     ; `access violation`, exit
            ld D,A              ; HI address (DE)
            inc HL
            inc HL           

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse

Awatar użytkownika
tasza
Geek
Geek
Posty: 1082
Rejestracja: czwartek 12 sty 2017, 10:24
Kontaktowanie:

Re: [CA80] cALo - szeregowe ładowanie Intel HEX do systemu CA80

Postautor: tasza » poniedziałek 21 paź 2019, 08:35

hmm, tak na spokojnie teraz jeszcze zrobiłam teścik....

Kod: Zaznacz cały

            .module test
                                   
            .area _CODE                   
         cp #etykieta1
         cp #<etykieta1

         cp #>etykieta1
         cp #(etykieta1>>8)
         
etykieta1:


kod linkowany jest od adresu 0x1234 i hex wygląda zdrowo

Kod: Zaznacz cały

:08123400FE3CFE3CFE12FE121E
:08 1234   00     FE3C   FE3C     FE12     FE12     1E

zmodyfikownay calo1.s także.. no to już nie wiem, na co ja się wtedy patrzyłam :?

no nic, w takim razie przepraszam sdcc
i linker i translator asm też
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
______________________________________________ ____ ___ __ _ _ _ _
Kończysz tworzyć dopiero, gdy umierasz. (Marina Abramović)

Awatar użytkownika
gaweł
Expert
Expert
Posty: 966
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

Re: [CA80] cALo - szeregowe ładowanie Intel HEX do systemu CA80

Postautor: gaweł » poniedziałek 21 paź 2019, 12:49

tasza pisze:no nic, w takim razie przepraszam sdcc
i linker i translator asm też

Universum z pewnością ci wybaczy a najważniejsze to dostrzegać własne pomyłki, wtedy będzie dobrze.

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse

Awatar użytkownika
tasza
Geek
Geek
Posty: 1082
Rejestracja: czwartek 12 sty 2017, 10:24
Kontaktowanie:

Re: [CA80] cALo - szeregowe ładowanie Intel HEX do systemu CA80

Postautor: tasza » poniedziałek 21 paź 2019, 21:02

noo, pomyłki to dostrzegam, właśnie w ostatniej wersji jest dane odwłoka i przy odrobinie szczęścia stos pięknie wjedzie w bufor odbiorczy SIO i brzdęk....
więc tak w ramach testów jakby całość mogła jednak w SDCC wyglądać - na github :arrow: https://github.com/bienata/CA80_sdcc/bl ... alo/calo.s
przy okazji makefile wołający na krótko assembler i linker :arrow: https://github.com/bienata/CA80_sdcc/bl ... o/makefile
teraz zaczną się kombinacje nad uniknięciem rozdwojenia jaźni, bo C i asm słabo współdzielą symbole, pewnikiem trzeba będzie *.h generować z *.inc albo odwrotnie, albo oba z innego nadrzędnego pliku z constami...no nic, czas pokaże czy to coś warte
______________________________________________ ____ ___ __ _ _ _ _
Kończysz tworzyć dopiero, gdy umierasz. (Marina Abramović)

Awatar użytkownika
gaweł
Expert
Expert
Posty: 966
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

Re: [CA80] cALo - szeregowe ładowanie Intel HEX do systemu CA80

Postautor: gaweł » poniedziałek 21 paź 2019, 21:58

tasza pisze:noo, pomyłki to dostrzegam, właśnie w ostatniej wersji jest dane odwłoka i przy odrobinie szczęścia stos pięknie wjedzie w bufor odbiorczy SIO i brzdęk....

Jeżeli dostrzegasz własne pomyłki, to jesteś na najlepszej drodze do osiągnięcia sukcesu.

tasza pisze:...no nic, czas pokaże czy to coś warte

Jak nie poczynisz eksperymentu, to się nie dowiesz ;) . Z twoich zapowiedzi wnioskuję, że to jest warte baaaaardzo dużo.

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse


Wróć do „Retro”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 2 gości