ZX Spectrum a tiskárna Aritma 0507 II

nedokončeno

Úvod

Ve starším článku jsem popsal jak se dá s plotrem Aritma tisknout vektorově pomocí dodávaného programu MZXR, nebo rastrově z programu Desktop. Tisknout rastrově na perovém plotru je zoufalost, ale kde vzít data pro kreslení vektorové?

V době vzniku těhle zařízení se zřejmě předpokládalo primární využití pomocí BASICu a programů, které nějak generují výstup pro dodávaný program. To ale znamená pro každou situaci psát program znovu. Může to být datově úsporné, ale rozhodně to je pracné. Zvlášť dnes, kdy tohle vše není nutnost, ale zábava.

Hledal jsem tedy způsob jak do ZX Spectra dostat jednoduše data z nějakého všem dostupného programu s maximem možností. Zvolil jsem Inkscape.

foto

Rozšíření do Inkscape

Inkscape umožňuje instalovat všelijaká rozšíření - pluginy. Prakticky to znamená zkopírování skriptu do určeného adresáře a restart programu, který si při spouštění plugin najde. Vhodným základem k modifikaci se ukázal být plugin pro převod kresby do G kódu, což jsou instrukce pro obráběcí stroje, v tomto případě 2,5D řezací frézy. Plugin jsem získal zde.

Byla nutná poměrně značná modifikace části kódu, který generuje příkazy, zvláště pokud měl program generovat i rozumně sestavené BASICové řádky. Dále jsem přizpůsobil konfigurační rozhraní a odstranil zbytečné části kódu, plus nějaké drobnější změny.

Podrobnosti v readme k pluginu.

Proč ne HPGL?

Protože generovat instrukce pro interpretr MZXR prostým modifikováním existujícího pluginu je snazší. S ohledem na podivné chování kombinace SIF + MZXR to možná byla chyba. Generovat HPGL už Inkscape umí, ale na straně ZX Spectra, kde by bylo nutné celý HPGL interpretr napsat.

Demo kresba na screenshotu je v balíčku s pluginem.

Přenos dat do ZX Spectra

V první řadě jsem se snažil, aby generovaná data byla přímo použitelná s programem MZXR bez jakéhokoli dalšího softwaru, nebo hardwaru. Tuto podmínku splňuje pouze BASICový program, který tiskne přes MZXR stejně, jako je popsáno v manuálu k programu.

Bohužel BASICový program generovaný pomocí pluginu nemůže být o mnoho delší než přibližně 35kB - pokud se má vejít do paměti spolu s nainstalovaným MZXR a funkčním TRDOSem. Velké kresby je tedy nutné rozdělovat na více částí, což kreslení značně komplikuje.

Pro jednoduchost je BASIC generovaný jen jako plaintext program. Pro použití v ZX Spectrum musí být ještě přeložen utilitkou bas2tap.

Další možností je odesílání dat přes sériový port SIF a postupné zpracování tak jak přicházejí. Je to snazší než rozdělování a kompilace BASICu, rychlejší než přenost přes TAP a velikost kresby je prakticky neomezená. Bohužel, zatím to nefunguje správně.

foto

Problémy kombinace MZXR + SIF

Abych mohl snadno kreslit velké a složité kresby, napsal jsem utilitku, která čte instrukce přes SIF a podstrkává je ke zpracování programu MZXR.

MZXR má jakési rozhraní pro volání ze strojového kódu, přesněji v manuálu jsou pouze vypsané adresy rutin a registry, které mají význam. Ale bohužel takové volání nezbytně vyžaduje v registrech hodnoty v krocích a nikoli v mm, jak je lze snadno získat z Inkscape. Jsou tedy dvě možnosti, buď pluginem přepočítávat na kroky a generovat instrukce v souřadnicích pro daný hardware (co kdyby někdo chtěl použít výstup pro jiný plotr s jemnějšími kroky?), nebo instrukce generovat se souřadnicemi v mm a přepočet ponechat na MZXR.

Volil jsem ponechání přepočtu na MZXR, to sebou ovšem nese problém konverze desetinných čísel na "reálná" v kódování jakému rozumí Sinclair BASIC. Čísla rozpoznávám svou utilitkou a uzavírám do BASICového příkazu VAL, který umí MZXR pomocí rutin v Sinclair ROM vyhodnotit a čísla do správné formy převede sám.

  • Problém nastává při přenosu dat. Nedokázal jsem zatím zjistit proč, ale u různých souborů se přenos zastaví před koncem, někde v části řádku a odesílající PC se chová, jako by byla veškerá data přenesena. Žádná chyba není hlášena.
  • Posílám-li jeden soubor vícekrát, pak k zastavení dojde vždy na stejném místě.
  • Když jsem zkrátil soubor asi o 300 řádcích na 200 a zbytek, tak se místo 20 řádků před koncem zastavil přenos cca po prvních 25 řádcích (z těch 200).
  • Když zobrazuji náhled v MZXR (PRINT #7,is;) místo skutečného kreslení na papír, tak se přenos zastaví taky, ale většinou jinde - o několik řádků později.
  • Když ze své utility vyřadím volání MZXR, tak problémy s přenosem nenastanou.
  • Některé soubory se přenesou celé (např. notepad_green.mzxr)
  • Když jsem zkusil soubor notepad.mzxr, který se zastavoval asi na 3500 řádku z celkových cca 3800, prodloužit, tak jsem bez problémů vytisk kritické místo a bylo přeneseno následujících asi 2,5MB dat (necelých 100 000 řádků obsahujících instrukci ma,0.000,0.000) než mne to přestalo bavit a program jsem zastavil. Přenost trval určitě přes hodinu. Bylo jedno jestli tento soubor byl dlouhý 3MB, nebo 64MB. Prostě se přenost nezastavil, ale je pravděpodobné, že by k otmu došlo před koncem, ke kterému jsem přenos nenechal doběhnout.
  • Když jsem zkoušel přenášet vše, ale MZXR jsem předával pouze instrukce PU a PD, tak k zastavení nedošlo nikdy.
foto
  • V žádném případě, kdy se tisk zastavil, jsem na kritickém řádku nenašel chybnou instrukci ani nic podobného.
  • Takto je nastavený sériový port na PC (skutečný sériový port, ne USB převodník), analogicky i SIF na ZX Spectru.
stty -F /dev/ttyS1 115200 cs8 clocal cread -cstopb parenb parodd crtscts raw
  • Problém není závislý na rychlosti přenosu. Zkoušel jsem přenos zpomalit na 9600bps a chovalo se to přesně stejně. K zastavení došlo na stejném řádku jako při 115200bps.
  • Nevěřím, že by byl problém v SIFu. V jiných programech nikdy problém s přenosem nenastal a když vynechám interpretaci instrukce ma v MZXR, tak se taky neprojeví.
  • Moc by mi pomohlo, kdybyste to na příslušném hardwaru prozkoušeli - stačí SIF a program MZXR, plotr potřeba není.
  • V programu MZXR jsou pouze dvě instrukce OUT a žádný IN. První OUT nastavuje 8255 na portu 127 a druhý řídí plotr na portu 63.
  • Při použití originál ROM se projevy problému mírně změnily. Dosud jsem používal ISO ROM aniž by mne napadlo, že by ROM mohla mít vliv. Použití originál Sinclair 48k ROM snížilo četnost výskytu vady, ale problém nezmizel.
  • Zkusil jsem posílat data z jiného PC. Dosud přes onboard RS232 z Gentoo Linuxu (jádro 2.6.26.8), nově přes USB RS232 (SuSE Linux 11.0, jádro defaultní 2.6.25.20 ...). Náhled různých kreseb prošel bez problémů asi 10x, následné kreslení selhalo. Jako by MZXR posílal nesmyslná data do plotru a ten špatně hýbal motory. Spirála byla zubatá a deformovaná blíž kosočtverci. Při kreslení úseček rovnoběžných s osami X a Y motory jen drnčely a neotáčely se. Po znovunačtení MZXR jsem vytiskl bez problémů celou stránku s textem Lorem Ipsum.
  • P.Urbančík zkoušel opakovaně přenášet data na svém hardwaru (PC, SIF, ZX 128k +2) a kreslit náhledy v MZXR na obrazovku. Na problém dosud nenarazil.

  • Zoomovi se párkrát zaseklo kreslení i při tisku z BASICového programu (což se mi sice nestalo nikdy), ale naznačuje to problém spíše na straně MZXR a ZX ROM. Ale proč se potom Linux tváří jako by poslal všechna data? Proč by se chyba ROM a MZXR projevovala přijetím dat bez jediné chyby v dosud nakreslené kresbě? Kombinace více chyb?
scan kresby scan kresby

Pokud budete utilitky zkoušet, tak MZXR musí být instalované před spuštěním SIFPLOT. SIFPLOT má být na adrese 50000 a MZXR 60000. Umístění MZXR je důležité, kdyby bylo jinde, bylo by nutné provést příslušnou změnu i v SIFPLOT. Zkompilované MZXR lze mzxr.tap stáhnout tady.

Download

Ke stažení je plugin pro Inkscape a utilitka usnadňující přesun dat do ZX Spectra přes SIF

Opravené chyby a aktualizace

  • 1.1.2010 zveřejněno

[ Zpět na hlavní stránku ]

Cygnusova stránka o ZX Spectru a kompatibilních počítačích byla napsána (přepsána) výhradně pomocí svobodného Open Source softwaru. V případě že naleznete chybu, nebo byste rádi cokoliv co se ZX Spectrem souvisí, neváhejte mi napsat na některý z mých emailů, nebo pracovně do zaměstnání. Stručně o mém webu se můžete dočíst zde.