Ako už mike spomenul v zápiskoch, na poslednom SinDiKATe som sa venoval
sériovému prenosu dát z a do NewBrainu. Keďže sa v internetoch príliš často o
tomto počítači nepíše, rozpíšem tu trochu viac čo konkrétne som vlastne
riešil.
Trocha teórie na úvod
Štandartný nerozšírený NewBrain (verzia A aj AD) obsahuje 2 sériové porty.
Jeden je určený pre tlačiareň, ten je jednosmerný, druhý je obojsmerný. Oba
sú softvérové, rýchlosť je volitelná v rozmedzí 75 až 19200 baudov. Oba porty
sú plne využitelné priamo operačným systémom a netreba žiadny ďalší softvér na
ich obsluhu. Predvolená rýchlosť po zapnutí počítača je 9600 baudov.
Skvelá vlastnosť systému je, že umožňuje LOAD aj SAVE z / na užívateľom zvolený
stream. Druhá skvelá vlastnosť systému je, že LOAD dokáže nahrať nie len
klasický tokenizovaný BASIC (výstup z príkazu SAVE), ale aj BASIC v ASCII
formáte. Ten musí mať nasledovný tvar:
- prvý riadok programu je prázdny (0x0D alebo 0x0A)
- každý ďalší riadok programu začína číslom riadku (čísla riadku sú v
rozmedzí 1 až 65535) - každý riadok končí 0x0D 0x0A
- súbor končí riadkom, ktorý obsahuje len 0x04
- riadky nemusia ísť po poradí, systém si ich v pamäti poupratuje
Rýchlosť LOAD a SAVE je vždy 1200 baudov a tomu musíme prispôsobiť aj rýchlosť
sériového portu.
Na opačnej strane mám obyčajné PC s Linuxom a prevodník USB-to-RS232 (FT232
USB-Serial (UART) IC). Ako softvér používam Picocom, ale Minicom či akýkoľvek
iný program na obsluhu sériového portu bude samozrejme fungovať rovnako dobre. Nemám prístup k Windows a ani sa v nich neorientujem, takže situáciu tam popísať nemôžem.
Predpokladám, že s modernými Apple systémami to bude podobné ako s Linuxom.
Zapojenie
Signály na konektore NewBrainu sú nasledovné (pohľad na konektor zozadu
počítača):
+----------+----------+----------+
| clear | data | signal |
| to | out | ground |
| send | (TX) | |
| PIN 2 | PIN 4 | PIN 6 |
+----------+----------+----------+
| data | | ready |
| in | | to |
| (RX) | | send |
| PIN 1 | | PIN 5 |
+----------+ +----------+
Signály na konektore USB prevodníka sú tieto:
+----------+----------+----------+----------+----------+
| carrier | data | data | data | signal |
| detect | in | out | terminal | ground |
| | (RX) | (TX) | ready | |
| PIN 1 | PIN 2 | PIN 3 | PIN 4 | PIN 5 |
+-----+----+-----+----+-----+----+-----+----+-----+----+
| data | request | clear | ring |
| set | to | to | indicator|
| ready | send | send | |
| PIN 6 | PIN 7 | PIN 8 | PIN 9 |
+----------+----------+----------+----------+
Zapojenie signálov je teda toto:
NewBrain <----------> PC serial PIN 1 (RX) ------ PIN 3 (TX) PIN 2 (CTS) ----- PIN 6 (RTS) PIN 4 (TX) ------ PIN 2 (RX) PIN 5 (RTS) ----- PIN 8 (CTS) PIN 6 (G) ------- PIN 5 (G)
Poznámka ku konektorom: NewBrain síce používa proprietárne káble a konektory, rozteč pinov je ale štandardná a je možné použiť skrátený obyčajný dvojradový eurokonektor (DIN 41612).
Prenos dát
Snáď ako úplne prvý krok by som doporučil presvedčiť sa, že nič neblokuje
sériový port na strane PC. To sa presne stalo mne. Testoval som USB2RS232 prevodník tak, že
som si spustil sériovú konzolu a prihlásil sa cez ňu. Všetko fungovalo, tak
som to znova porozpájal a pustil to z hlavy. Samozrejme, že som konzolu
zabudol vypnúť a strávil som dosť veľa času zisťovaním, prečo mi dáta tečú len
jedným smerom a aj to nie úplne spoľahlivo. Tu ďakujem Pavlovi Vymetálkovi,
ktorému debug problému trval asi 1 minútu (spočívalo to v spojení pinu 2 a 3 na
prevodníku, tým pádom som dostal login prompt a videl kde je problém).
Keďže máme zapojených všetkých 5 signálov, využijeme hardvérové riadenie toku
dát. NewBrain používa 2 stopbity a rýchlosť musíme obmedziť na 1200 baudov.
Na PC teda používam Picocom (znova vďaka Pavlovi, je to sériový
guru!), je jednoduchý a rýchlo sa naň zvyká. Ako prvé je treba nastaviť čím sa
budú prenášať súbory, to sa robí pri samotnom štarte:
$ picocom /dev/ttyUSB0 --send-cmd "ascii-xfr -e -d -s -v -n" --receive-cmd "ascii-xfr -r -v -d -n"
Po spustení treba nastaviť port na rýchlosť 1200 baudov, 2 stop bity,
hardvérovú kontrolu toku. Pre istotu nastavujem aj lokálne echo, to sa hodí ak
si nie som istý v akom stave je prenos (vrátim sa k tomu neskôr). Výpis nastavenia portu z Picocomu:
*** baud: 1200
*** flow: RTS/CTS
*** parity: none
*** databits: 8
*** stopbits: 2
*** dtr: up
*** rts: up
*** mctl: DTR:1 DSR:0 DCD:0 RTS:1 CTS:0 RI:0
Nastavenie na strane NewBrainu je nasledovné:
OPEN #9,9,"T1200R1200"
Týmto otvoríme stream 9 (môže to byť ľubovolný volný stream) na zariadenie 9 (to je sériový port), parametre sú vysielanie 1200 baudov (úvodné T sa ale môže vynechať) a príjem tiež 1200 baudov
To je aj celá konfigurácia na strane NewBrainu a môžeme nahrávať:
LOAD #9
Keď z PC pošleme súbor, obraz na NewBraine zažne blikať. Je to znak toho, že
sa prenášajú dáta (dôvod blikania je ten, že o vstup a výstup sa stará druhý
procesor, COP420. Ten sa však stará aj o obsluhu video obvodu a keďže nevie
robiť viac vecí naraz, pri prenose vypne obraz). Po skončení prenosu sa vráti
blikajúci kurzor a môžeme spustiť program (systém nepozná autoštart po nahraní).
Čo ďalej?
Ak máme zapnuté lokálne echo, nemusíme BASIC posielať ako hotový súbor, ale
môžeme ho pohodlne písať priamo do terminálu. Vždy po odENTERovaní riadku ho NewBrain
príjme a čaká na ďalší. Keď program dopíšeme, pošleme koniec súboru (CTRL+D) a
ENTER. Podobne vieme plniť aj premenné bežiacemu programu (INPUT aj
LINPUT vedia čítať aj zo streamov), GET# môzeme použiť na čítanie dát. Vyšší
level je potom použitie OPEN IN# a OPEN OUT# ktoré vedia pracovať so súbormi.
Týmto tému sériového prenosu na NewBraine určite nekončím, zámer je použiť
Linux ako spoľahlivé záznamové médium a vyhnúť sa použitiu kaziet. Keď sa tak
stane, určite sa tu o tom objaví článok.
A čo vy, ako ste na tom so sériovým prenosom na vašich počítačoch?
ellvis/zeroteam