Mikrokomputer CA80

ładowanie programów z plików audio
konwerter Intel Hex do WAV



charakterystyka i informacje ogólne
książki / dokumentacja (literatura)
ulotki i broszurki MIK (literatura)
skany artykułów z prasy (literatura)
programator EPROM (aplikacje)
dwupunktowy termometr (aplikacje)
licznik-timer Z80-CTC i dioda RGB (aplikacje)
Direct Memory Loader - ładowarka do pamięci (akcesoria)
próbnik stanów logicznych MIK03C (akcesoria)
zdalnie sterowana klawiatura (akcesoria)
przegląd procedur systemowych (programowanie)
interfejs RS-232 z układem Z80-SIO/0
hex2wav - ładowanie programów do CA80 z plików audio
sterownik mikroprocesorowy CA82

☘☘☘☘☘☘☘☘☘☘☘☘☘

Poniżej opis prostego przydasia umożliwiającego konwersję plików wynikowych Intel Hex do formatu WAV, które możemy potem odegrać kartą dźwiękową naszemu CA80 niczym z magnetofonu. Programik konwertuje nie tylko surowe dane z pliku *.hex, potrafi też spreparować dla CA80 rekord EOF o zadanych cechach. Dokładne parametry transmisyjne CA80 (czułość, zdolność detekcji sygnału nośnego, etc/itd) są sprawą indywidualną danego egzemplarza komputera, stąd kilka parametrów sygnału można ustalić na etapie konwersji, minimializując ryzyko błędnego wczytywania.
-- ♠ --


hex2wav - kompilacja

Pliki źródłowe oczywiście na GitHub hex2wav, z mojej strony słowa uznania dla autorów mini-biblioteki wavfile na bazie której powstała ta pocieszna aplikacja. Kompilacja pod Linux jest trywialna i sprowadza się sklonowania repozytorium, a następnie do:

gcc hex2wav.c wavfile.c -o hex2wav -lm

Powstały plik hex2wav dobrze umieścić gdzieś w folderze objętym zmienną PATH, będzie zawsze pod ręką.

hex2wav - parametry

Na początek akapitu odeślę do tomiku MIK05, do rozdziału 1.9 Współpraca CA80 z magnetofonem tam znajdziemy wszelkie teoretyczne wyjaśnienia na temat kodowania sygnału i jego parametrów. A tu zaprezentuję tylko te cechy, na którem mamy wpływ z linii poleceń i wyjaśnię - skąd taka potrzeba. Wywołanie hex2wav w formie ogólnej przedstawia się następująco:

hex2wav [-v] [-i input_file] -n NN [-e AAAA ] [-m MM] [-s SS] [-f FREQ] -o output_file

gdzie:
  •  -i input_file - wejściowy plik w formacie Intel Hex o rozmiarze rekordów 16 lub 32 bajty; nazwę pliku podajemy, gdy konwertujemy *.hex, gdy chcemy utworzyć dźwiękowy obraz samego rekordu EOF nie jest ona konieczna

  •  -n NN - określa dwucyfrową (w hex) nazwę/identyfikator zbioru, parametr jest obowiązkowy zarówno dla konwersji z *.hex jak i podczas kreowania rekordu EOF

  •  -e AAAA - określa czterocyfrowy (w hex) adres wejścia do programu w rekordzie EOF; jest opcjonalny podczas konwersji z *.hex - gdy go nie podamy rekord EOF nie zostanie dopisany do materiału audio; adres AAAA jest obowiązkowy gdy nie podamy nazwy pliku wejściowego ponieważ program zakłada wtedy tylko i wyłacznie generację EOF-a, tam adres jest podstawowym parametrem; gdy planujemy ładować programy w locie procedura OMAG/0x071B, to można rozważyć podawanie jako AAAA wartości (adresu) procedury SPEC/0x0065 zawierającej rozkaz ret; mechanizm OMAG załaduje dane, wykona skok zgodnie z adresem wejścia czyli finalnie przez SPEC zawróci sterowanie do programu głównego, bez wykonania załadowanego kodu; podanie jako AAAA wartości od czapki może skutkować pójściem CA80 w maliny, to oczywiste.

  •  -m MM - określa wartość prędkości transmisji podczas współpracy z magnetofonem, w tym przypadku jest to ilość efektywnych bitów danych na sekundę kodowanych w Manchester do materiału audio; operujemy wartociami z MIK05 czyli odpowiednio: 15 to 240 bitów/sek (szybka, błędogenna transmisja), 25 oznacza 140 bitów/sek i jest wartością domyślną 35 to 100 bitów na sekunde, ślamazarnie, ale za to z dużą odpornością na zakłócenia; podanie innych niż 15/25/35 wartości jest przez programik kodujący ignorowane;

  •  -s SS - definiuje ilość bajtów synchronizacji (o wartości 0x00) poprzedzających rekord danych (zaczynający się sekwencją 0xFD,0xE2); bajty synchronizacji są odczytywane (via RBYT) i pomijane w procedurze OMAG aż do chwili znalezienia znacznika rekordu, stąd dobrze jest zostawić choć kilka (sensownie min.2) aby CA80 miał szansę 'zaskoczyć'; detale OMAG i tego procesu to tomik MIK08 od strony 1-41, polecam w wolnej chwili

  •  -f FREQ - parametr ustawiający częstotliwość sygnału nośnego, który podlega kodowaniu Manchesterem; domyślna wartośc to 3.5 kHz ponieważ taka wartością operuje poprawnie zbudowany i wyregulowany interfejs magnetofonowy przy zapisie i odczycie; jak łatwo zgadnąć w praktyce jest różnie, więc dodałam parametr pozwalający dostroić podawany sygnał do kaprysów naszego egzemplarza CA80, sensowne wartości są z przedziału od około 2.8 kHz do 4 kHz, zależnie jak nam się polutował układ odczytujący.

  •  -o output_file - wynikowy plik *.wav, na stałe wbita jest częstotliwość próbkowania audio - 44.1 kHz, sygnał jest monofoniczny (jeden kanał)

  •  -v - opcja verbose, czyli tryb gadatliwy, wypisuje na terminal zarówno podsumowanie ustawień konwersji jak i sekwencje kodowanych bajtów

    hex2wav - konwersja

    Nie będe tu wypisywała wszelkich możliwych wariantów uruchomienia aplikacji, może tylko kilka codziennych i raczej typowych zastosowań:

  • generowanie audio dla programu lub danych, bez rekordu EOF

    program o nazwie 0x55 do odcztu z typowymi (zainicjowanymi via [7][=]) parametrami transmisji, załadowanie zleceniem [6][55][=], uruchomienie [G][C000][=]
    hex2wav -v -i print_LOAD.hex -n 55 -o print_LOAD.55.prg.wav
    
    Informacje z konsoli:
    hex2wav, simple CA80 hex to audio converter, tasza (c) 2019
    input file name:      print_LOAD.hex
    program ID     :      55 
    EOF address    :      none (no EOF at all)
    tape bit rate  :      140
    synch seq. len :      32 
    carrier freq.  :      3500  (by default)
    samples per bit:      315
    samples total  :      239085
    output file    :      print_LOAD.55.prg.wav
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    FD E2 55 10 00 C0 DB 31 66 FF 21 0C C0 CD D4 01 80 18 FE 38 5C 77 5E DC 
    FD E2 55 05 10 C0 D6 40 23 1C 40 FF 42 
    Done.
    
    Materiał audio: print_LOAD.55.prg.wav

  • generowanie audio dla programu i jego rekordu EOF

    program o nazwie 0x66 do odcztu z typowymi (zainicjowanymi via [7][=]) parametrami transmisji, załadowanie zleceniem [6][66][=], uruchomienie [G][=]
    hex2wav -v -i print_LOAD.hex -n 66 -e c000 -o print_LOAD.66.prg.eof.wav
    
    Informacje z konsoli:
    hex2wav, simple CA80 hex to audio converter, tasza (c) 2019
    input file name:      print_LOAD.hex
    program ID     :      66 
    EOF address    :      C000
    tape bit rate  :      140
    synch seq. len :      32 
    carrier freq.  :      3500  (by default)
    samples per bit:      315
    samples total  :      374220
    output file    :      print_LOAD.66.prg.eof.wav
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    FD E2 66 10 00 C0 CA 31 66 FF 21 0C C0 CD D4 01 80 18 FE 38 5C 77 5E DC 
    FD E2 66 05 10 C0 C5 40 23 1C 40 FF 42 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    FD E2 66 00 00 C0 DA 
    Done.
    
    Materiał audio: print_LOAD.66.prg.eof.wav

  • generowanie audio dla programu i jego rekordu EOF - rekordy 32 bajtowe (lub o zmiennej długości)

    program o nazwie 0xFF do odcztu z typowymi (zainicjowanymi via [7][=]) parametrami transmisji, załadowanie zleceniem [6][FF][=]
    plik *.hex to wynik pracy linkera z pakietu SDCC, przed obróbką przez packihx skracającym rekordy do 16 bajtów
    hex2wav -v -i nmi_spy_1.hex -n FF -e 8000 -o nmi_spy_1.wav
    
    Informacje z konsoli:
    hex2wav, simple CA80 hex to audio converter, tasza (c) 2019
    input file name:      nmi_spy_1.hex
    program ID     :      FF 
    EOF address    :      8000
    tape bit rate  :      140
    synch seq. len :      32 
    carrier freq.  :      3500  (by default)
    samples per bit:      315
    samples total  :      1656270
    output file    :      nmi_spy_1.wav
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    FD E2 FF 0C 00 80 75 31 66 FF CD 2B 81 CD C5 80 C3 09 80 93 
    FD E2 FF 10 2B 81 45 01 01 00 78 B1 28 08 11 00 C0 21 2A 81 ED B0 C9 A2 
    FD E2 FF 0D 10 80 64 CD C3 FF 2E FF D0 6F C9 CD C6 FF 6F C9 72 
    FD E2 FF 20 1D 80 44 FD 21 02 00 FD 39 FD 56 00 5A 15 7B B7 C8 76 76 76 76 76 18 F4 C9 FD 21 02 00 FD 39 FD 7E 00 CD 2D 
    FD E2 FF 20 3D 80 24 11 00 C9 FD 21 02 00 FD 39 FD 7E 00 21 F6 FF 77 FD 6E 01 FD 66 02 CD 21 00 C9 FD 21 02 00 FD 39 EA 
    FD E2 FF 20 5D 80 04 FD 7E 00 21 F6 FF 77 FD 7E 01 CD 1B 00 C9 21 00 C0 34 3A 00 C0 D6 96 C0 21 00 C0 36 00 DB E0 3C 82 
    FD E2 FF 20 7D 80 E4 D3 E0 C9 21 00 C0 34 3A 00 C0 D6 96 C0 21 00 C0 36 00 DB E0 C6 FF D3 E0 C9 DD E5 DD 21 00 00 DD 99 
    FD E2 FF 20 9D 80 C4 39 DD 5E 04 DD 56 05 3E C9 12 6B 62 23 DD 46 06 DD 4E 07 70 23 71 3E C3 12 DD E1 C9 C1 E1 E5 C5 02 
    FD E2 FF 20 BD 80 A4 36 C9 23 AF 77 23 77 C9 11 CC FF 3E 80 D3 E3 3E 00 D3 E0 D5 CD 10 80 D1 7D 3C 28 32 7D 3D 28 07 15 
    FD E2 FF 20 DD 80 84 7D D6 02 28 10 18 1C D5 21 80 80 E5 D5 CD 96 80 F1 F1 D1 18 19 D5 21 6B 80 E5 D5 CD 96 80 F1 F1 68 
    FD E2 FF 20 FD 80 64 D1 18 0B D5 D5 CD B9 80 F1 D1 3E 00 D3 E0 D5 3E 80 F5 33 CD 33 80 33 DB E0 DB E0 57 1E 20 D5 CD 8E 
    FD E2 FF 0E 1D 81 55 57 80 26 01 E3 33 CD 1D 80 33 D1 18 A6 00 C0 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    FD E2 FF 00 00 80 81 
    Done.
    

  • generowanie EOF, zmiana sekwencji synchronizacji

    wygenerowanie samego EOF-a o nazwie 0xAA i wskazującym na 0xC000, skrócona do 4 zer sekwencja synchronizacji
    hex2wav -v -n AA -s 4 -e c000 -o aa.c000.eof.wav
    
    Informacje z konsoli:
    hex2wav, simple CA80 hex to audio converter, tasza (c) 2019
    input file name:      empty (!) EOF only mode
    program ID     :      AA 
    EOF address    :      C000
    tape bit rate  :      140
    synch seq. len :      4 
    carrier freq.  :      3500  (by default)
    samples per bit:      315
    samples total  :      135135
    output file    :      aa.c000.eof.wav
    00 00 00 00 
    FD E2 AA 00 00 C0 96 
    Done.
    
    Materiał audio: aa.c000.eof.wav

  • zmiana szybkości transmisji

    program o nazwie 0x55 do pooowolnego odcztu (zainicjowanie transmisji 100 bit/sek via [7][3510][=]), skrócona do minimum sekwencja synchronizacji, załadowanie zleceniem [6][55][=], uruchomienie [G][=]
    hex2wav -v -i print_LOAD.hex -m 35 -s 2 -n 55 -e c000 -o print_LOAD.55.slow35.synch2.prg.eof.wav
    
    Informacje z konsoli:
    hex2wav, simple CA80 hex to audio converter, tasza (c) 2019
    input file name:      print_LOAD.hex
    program ID     :      55 
    EOF address    :      C000
    tape bit rate  :      100
    synch seq. len :      2 
    carrier freq.  :      3500  (by default)
    samples per bit:      441
    samples total  :      523908
    output file    :      print_LOAD.55.slow35.synch2.prg.eof.wav
    00 00 
    FD E2 55 10 00 C0 DB 31 66 FF 21 0C C0 CD D4 01 80 18 FE 38 5C 77 5E DC 
    FD E2 55 05 10 C0 D6 40 23 1C 40 FF 42 
    00 00 
    FD E2 55 00 00 C0 EB 
    Done.
    
    Materiał audio: print_LOAD.55.slow35.synch2.prg.eof.wav
    Zwróćmy uwagę na wyliczoną wartość `samples per bit` - 441 względem poprzednich 315 dla szybkości 140 bitów/sek.
    Zmniejszenie szybkości transmisji magnetofonowej zwiększa objętość materiału audio (samples total), zwiększenie - powoduje, że materiał jest krótszy.

  • zmiana częstotliwości sygnału nośnego

    a. program o nazwie 0x28 do odcztu z typowymi (zainicjowanymi via [7][=]) parametrami transmisji, nośna 2.8 kHz

    hex2wav -v -i print_LOAD.hex -n 28 -f 2800 -o print_LOAD.28.prg.wav
    
    Informacje z konsoli:
    hex2wav, simple CA80 hex to audio converter, tasza (c) 2019
    input file name:      print_LOAD.hex
    program ID     :      28 
    EOF address    :      none (no EOF at all)
    tape bit rate  :      140
    synch seq. len :      32 
    carrier freq.  :      2800 
    samples per bit:      315
    samples total  :      239085
    output file    :      print_LOAD.28.prg.wav
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    FD E2 28 10 00 C0 08 31 66 FF 21 0C C0 CD D4 01 80 18 FE 38 5C 77 5E DC 
    FD E2 28 05 10 C0 03 40 23 1C 40 FF 42 
    Done.
    
    Materiał audio: print_LOAD.28.prg.wav

    b. program o nazwie 0x40 do odcztu z typowymi (zainicjowanymi via [7][=]) parametrami transmisji, nośna 4 kHz
    hex2wav -v -i print_LOAD.hex -n 40 -f 4000 -o print_LOAD.40.prg.wav
    
    Informacje z konsoli:
    hex2wav, simple CA80 hex to audio converter, tasza (c) 2019
    input file name:      print_LOAD.hex
    program ID     :      40 
    EOF address    :      none (no EOF at all)
    tape bit rate  :      140
    synch seq. len :      32 
    carrier freq.  :      4000 
    samples per bit:      315
    samples total  :      239085
    output file    :      print_LOAD.40.prg.wav
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    FD E2 28 10 00 C0 08 31 66 FF 21 0C C0 CD D4 01 80 18 FE 38 5C 77 5E DC 
    FD E2 28 05 10 C0 03 40 23 1C 40 FF 42 
    Done.
    
    Materiał audio: print_LOAD.40.prg.wav

    Porównianie widm wyliczonych przez Audacity, okno Hanninga na 128 próbek.



    Zmiana częstotliwości nośniej nie wpływa na rozmiar wynikowego materiału audio.

    I kończąc ten wątek - bardzo proszę nie traktować obecności tego parametru jako obejścia badziewnie zestrojonego układu obsługi magnetofonu. Jeżeli programy nie wczytują się do CA80 na standardowej szybkości 140 bitów/sek (zainicjowanej [7][=]) to naprawdę mamy problem, zatem próbnik logiczny w dłoń i szukamy błedu w układzie.

    hex2wav - obróbka końcowa

    Generowane pliki *.wav mogą być naprawdę zacnych rozmiarów, niech za przykład posłuży konwersja testowego wsadu 8kb_8000.hex
    to pliczek hex niosący 8192 bajty surowych danych. Jego przetworzenie na audio ze standardowymi ustawieniami i rekordem EOF

    $  hex2wav -v -i 8kb_8000.hex -n 88 -e 8000 -o 8kb_8000.wav
    hex2wav, simple CA80 hex to audio converter, tasza (c) 2019
    input file name:      8kb_8000.hex
    program ID     :      88 
    EOF address    :      8000
    tape bit rate  :      140
    synch seq. len :      32 
    carrier freq.  :      3500  (by default)
    samples per bit:      315
    samples total  :      42823935
    output file    :      8kb_8000.wav
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    FD E2 88 10 00 80 E8 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 88 
    FD E2 88 10 10 80 D8 0F 0E 0D 0C 0B 0A 09 08 07 06 05 04 03 02 01 00 88 
    . . . . 
    . . . .
    FD E2 88 10 F0 9F D9 0F 0E 0D 0C 0B 0A 09 08 07 06 05 04 03 02 01 00 88 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    FD E2 88 00 00 80 F8 
    Done.
    

    da plik 8kb_8000.wav o rozmiarze około 86MB! Troszkę jakby dużo, każdy zauważy. I dlatego można się pokusić o spreparowanie z wav pliku *.mp3, wprawdzie ten format jest kompresją stratną i wnosi drobne zniekształacenia, ale cyt. `jak doświadczalnie stwierdzono` pliki *.mp3 całkiem dobrze wczytują się do CA80 na typowych ustawieniach. Sama konwersja pod Linux wygląda następująco:

    $  ffmpeg -i 8kb_8000.wav -hide_banner -y -vn -ar 44100 -ac 1 -b:a 192k 8kb_8000.mp3
    Guessed Channel Layout for Input Stream #0.0 : mono
    Input #0, wav, from '8kb_8000.wav':
      Duration: 00:16:11.06, bitrate: 705 kb/s
        Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, mono, s16, 705 kb/s
    Stream mapping:
      Stream #0:0 -> #0:0 (pcm_s16le (native) -> mp3 (libmp3lame))
    Press [q] to stop, [?] for help
    Output #0, mp3, to '8kb_8000.mp3':
      Metadata:
        TSSE            : Lavf57.83.100
        Stream #0:0: Audio: mp3 (libmp3lame), 44100 Hz, mono, s16p, 192 kb/s
        Metadata:
          encoder         : Lavc57.107.100 libmp3lame
    size=   22761kB time=00:16:11.07 bitrate= 192.0kbits/s speed=45.6x    
    video:0kB audio:22760kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.002879%
    

    Dla ciekawości możemy zerknąć na przykładowe przebiegi, widać zniekształcenia, ale tak na oko (i w praktyce) nie wnoszą one zaburzeń w procesie odczytu.



    Wynikowy plik 8kb_8000.mp3 ma już `tylko` 23MB i otwiera pole do eksperymentów z konwersją via ffmpeg to znaczy - szybkością strumienia (tu:192kb/s) czy rozmiarem próbek, proszę znaleźć optimum dla swojej karty dźwiękowej i osobistego CA80.

    hex2wav - odtwarzanie plików / ładowanie do CA80

    Tu, choć zagadnienie niby proste - jest kilka zdań do napisania. Jeżeli ktoś jest z gatunku okienkowych, plik czy to *.wav czy *.mp3 można odegrać praktycznie dowolnym odtwarzaczem, wejście magnetofonowe CA80 podłączamy do wyjścia słuchawkowego karty dźwiękowej do wybranego kanału lub spreparowanym wtykiem Jack 3.5 mm ze zwartymi L+P (sprzętowe mono). Pewnych eksperymentów może wymagać ustawienie poziomu głośności, tu nie ma porady innej niż seria prób, aż uzyskamy bezbłędne załadowanie dłuższego niż kilkaset bajtów zbioru. Problem powstanie z zapamiętaniem jakie ustawiliśmy sobie suwakami w okienkach parametry, no cóż - to ta niemiła strona GUI.

    Ja ze swej strony proponuję odtwarzanie wsadowe, z konsoli. Dla Linux przygotowano wiele różnych programów manipulujących strumieniami audio z linii poleceń, do odtwarzania doskonale nadaje się na przykład programik sox z pakietu SoX(Sound eXchange). Materiał w formacie *.wav odtwarza bez miałczenia zaraz po instalacji, jeżeli checmy grać pliki *.mp3, to proszę doinstalować pakiet libsox-fmt-all. Pewną zachwostką może być określenie na której karcie dźwiękowej chcemy pracować z CA80, to szczególnie w przypadku gdy mamy więcej niż jedną. U mnie do takich zabaw oddelegowana została osobna (na PCI) tania karta, sztuka polega na odgrywaniu nią właśnie plików dla CA80, nie robiąc zamieszania w grającej na wzmacniaczu muzyce, a więc - lista kart dźwiękowych w naszym komputerze:

    $ pacmd list-sinks | grep -e 'name:' -e 'index:'
      * index: 0
    	name: <alsa_output.pci-0000_00_1b.0.analog-stereo>
        index: 1
    	name: <alsa_output.pci-0000_04_00.0.analog-stereo>
    
    Programik pacmd (z pakietu pulseaudio-utils) wylistuje nam bieżące aktywne wyjścia, oznaczy też gwiazdką to domyślne, u mnie akurat to karta wbudowana w płyte główną, do muzyki. Wykonanie dla odmiany polecenia
    $ lspci | grep -i audio
    00:1b.0 Audio device: Intel Corporation NM10/ICH7 Family High Definition Audio Controller (rev 01)
    01:00.1 Audio device: NVIDIA Corporation High Definition Audio Controller (rev a1)
    04:00.0 Multimedia audio controller: Creative Labs CA0106/CA0111 [SB Live!/Audigy/X-Fi Series]
    04:01.1 Multimedia controller: Brooktree Corporation Bt878 Audio Capture (rev 11)
    
    pokaże wszystko z kompuera mające związek z audio, po odrzuceniu grajka Intela (płyta), NVIDIA (HDMI karty graficznej) oraz tunera TV od Brooktree - pozostaje `04:00.0 Multimedia audio controller: Creative Labs CA0106/CA0111 [SB Live!/Audigy/X-Fi Series]` co jest zbieżne z drugim wyświetlonym przez pacmd wpisem. Czyli zidentyfikowaliśmy urządzenie, do wyjścia którego można podłączyć CA80! A zatem:

    $ sox -v 3 8kb_8000.mp3 -t pulseaudio alsa_output.pci-0000_04_00.0.analog-stereo
    
    8kb_8000.mp3:
    
     File Size: 23.3M     Bit Rate: 192k
      Encoding: MPEG audio    
      Channels: 1 @ 16-bit   
    Samplerate: 44100Hz      
    Replaygain: off         
      Duration: 00:16:11.22  
    
    In:1.49% 00:00:14.49 [00:15:56.73] Out:639k  [!=====|=====!] Hd:0.0 Clip:199k 
    sox WARN sox: `8kb_8000.mp3' balancing clipped 199464 samples; decrease volume?
    Aborted.
    
    W przypadku tego pliku - 8kB danych ładuje się do CA80 nieco ponad kwadrans, niektórzy zapewne przypomną sobie stare dobre czasy Commodore C64. No i oczywiście jak źle zidentyfikujemy kanały dźwiękowe to cały pisk pójdzie w głośniki, mamy spore szanse na szybkie wypisanie z rodziny, proszę zatem uważać z głośnością.
    BTW głośności - tryb odtwarzania sox ma jak widać powyżej parametr -v, to od volume, z parametrami >1 jest głośniej, z <1 ciszej, a głośność należy dobrać sobie eksperymentalnie, zależnie od parametrów całej instalacji.

    Na koniec opowieści - konwersja i ładowanie programów na żywo. Najpierw wspomniany wcześniej plik nmi_spy_1.hex, linker SDCC przygotował hex tak jak przygotował, niemniej jednak program daje się przetworzyć i załadować do CA80. I nawet po wykonaniu *G coś tam na wyświetlaczu się pokazuje, snać kod sprawia wrażenie działania, a przynajmniej się stara.



    Drugi programik to dawca zdjęcia tytułowego - print_LOAD.hex. Teraz na żywo widzimy kolejno - konwersję, załadunek oraz z racji dołożonego EOF-a - błyskawiczne uruchomienie.




    #slowanawiatr, listopad 2019

  • Natasza Biecek 2004-2019/~, e-mail