Ovladač pro HPGL plotry

Úvod

Jazyk HPGL (Hewlett-Packard Graphics Language) byl vyvinutý firmou Hewlett Packard někdy kolem roku 1977 pro jejich plotry a stal se velmi rozšířeným, oblíbeným a používaným i v mnoha jiných plotrech. Např. v tuzemském plotru Laboratorní Přístroje XY-4160 a v Aritma Colorgraf. Já použil základ z jazyka HPGL ve své vlastní konstrukci - modernizovaném Alfigrafu.

S jazykem HPGL se lze dodnes setkat v řezacích plotrech (na řezání reklamních polepů), býval a snad ještě je podporován inkoustovými plotry. V HPGL umí uložit kresbu i některé vektorové kreslící programy, např.Inkscape, čehož jsem využil při vytváření kreseb pro Aritma Minigraf 0507.

Inkscape byl pro mě zvlášť užitečný, protože nevyužívá žádné komplexnější příkazy jazyka, ale vystačí si pouze se čtyřmi instrukcemi IN, SP, PU, PD. To mi usnadnilo programování mého plotru. Nemusel jsem se zabývat mnohem komplikovanějším programováním kreslení písmen, kružnic, vyplňovaných ploch a dalších věcí, které jazyk podporuje.

Jenomže absence příkazu LB a tedy možnosti kreslení písmen mi chyběla. Ani ne tak u PC, jako spíš u ZX Spectra, kde bych rád plotr používal i pro výpis BASICových programů, nebo výpis obsahu diskety. Stejně, jako to umí ovladač MZXR k plotru Aritma Minigraf. V mezičase jsem měl možnost se seznámit s fungováním původního merkurového Alfi a usoudil jsem, že se mi písmo používané jeho ovladačem nelíbí. Písmo používané MZXR je lepší. Jenže jsem objevil písma ještě mnohem lepší a zároveň mnohem starší, objevil jsem písma Dr. Allena Vincenta Hersheyho, která digitalizoval v 60. letech a zveřejnil v roce 1967 (v knize Calligraphy for Computers), tedy 15 let před uvedením ZX Spectra na trh, před uvedením jazyka HPGL a vůbec mnoha dalších věcí. Dr. Hershey ta písma vytvářel pro tiskárny General Dynamics S-C 4020, General Dynamics S-C 4060 a zmiňuje i tiskárny Linotron, které používaly CRT obrazovku k prosvětlování šablony s písmeny. Obrazovce se říkalo charactron. A jestli jsem pochopil souvislosti správně, tak tam bylo možné v některém z režimů kreslit paprskem na obrazovku vektorově, podobně, jako to dělá herní konzole Vectrex, čímž se mu dařilo rozšířit znakovou sadu prakticky o libovolné další tvary a nebýt tak závislý na znacích dodaných od výrobce stroje.

Jinými slovy, písma pana Hersheyho jsou pro plotry doslova stvořená. Ač jsou znaky složené z úseček, nevypadají tak, dají se škálovat v určitém rozsahu aniž by to bylo zřejmé a stále vypadají pěkně. Písma nejsou datově příliš objemná. Největší sady se vejdou do 16kB, což může být mnoho, ale pořád je to na poměry ZX Spectra zvládnutelné a můžeme použít rozšířenou paměť, kdyby základních 48kB nestačilo.

foto ZX Spectrum a plotr

Kódování písem Dr. A. V. Hersheyho

Kódování je neobvyklé, souřadnice vektorů jsou zapsané jako vzdálenost od písmene R. Domnívám se, že to je tak proto, že při digitalizaci byla značná část práce provedena na papíře bez počítače a bylo potřeba vše zapisovat čitelné a zpracovatelné i člověkem.

Pro pochopení viz následující obrázky. Každý znak je v souboru uložen na jednom řádku. Prvních pět cifer dává dohromady číslo znaku (glyfu). Pro nás není moc užitečné, ale v různých sadách se mohou vyskytovat glyfy stejné, jako v jiných. Typicky interpunkční znaménka (závorky, plus, mínus...). Některé znaky číslované nejsou, ty mají všechny stejné číslo 12345.

screenshot Inkscape screenshot Inkscape

Po pětimístném "katalogovém číslu" glyfu následuje třímístný počet párů. Úmyslně neříkám souřadnic, protože hned první pár obsahuje šířku glyfu definovanou začátkem a koncem (na obrázcích vyznačené červenými úsečkami) a některé páry mohou obsahovat kód pro zdvižení pera složený ze znaků mezera a R.

Souřadnice RR určuje střed znaku. To možná bylo vhodné pro kreslení paprskem na střed obrazovky, ale při kreslení na papír je vhodnější pracovat s účařím. A pro zpracování v assembleru Z80 je ještě snazší zkonvertovat znak tak, aby všechny souřadnice byly kladné a prostě je přičítat k souřadnicím levého dolního rohu.

Bohužel se zdá, že některá písma obsahují chyby. Takže je potřeba konvertovat s trochou opatrnosti, kontrolovat výsledek, občas je nutný ruční zásah a oprava. Některé sady jsou bez problémů. Pořadí znaků v sadě obvykle odpovídá ASCII.

Jak kreslit vlastní znaky?

Ke kreslení vlastních znaků jsem si připravil šablonu v Inkscape. Šablona je ve skutečnosti jen prosté SVG se správně nastaveným rastrem a vyznačenými souřadnicemi. Pod šablonu lze případně umístit předlohu a kreslit podle ní, nebo kreslit dle libosti. Konverzní skript neexistuje, nutno přepsat ručně. Což dosud nebyl problém, znaků jsem vytvářel jen několik a opis při troše cviku jde docela rychle.

cislo sedum v hersheyho rastru znak britska libra v hersheyho rastru cislo sedum v hersheyho rastru

Pro potřeby ZX Spectra jsem musel dokreslit např. znak britské libry a copyright. Číslo 7 jsem upravoval tak, aby ho plotr kreslil jedním tahem bez zbytečného zdvihání pera, písmeno malé m jsem zužoval, aby lépe zapadalo do neproporcionálního písma.

Lze znaky zobrazit i na ZX Spectru?

Ano lze. Napsal jsem si pro ten účel dva jednoduché programy v BASICu. Je nutné v nich zadat adresu fontu, kam je font načtený v paměti ZX Spectra, zadat číslo znaku a program znak vyhledá a nakreslí.

   10 PAPER 7: INK 0: BRIGHT 0: BORDER 6
   20 LET addr=62835
   25 LET char=CODE "@"
   30 REM  search for glyph
   35 LET a=addr: LET c=char
   40 LET c=c-32
   50 LET b=PEEK a
   60 IF c=0 THEN LET glyph=a: GO TO 1000
   70 LET c=c-1: LET a=a+1+2*b
   90 GO TO 50
 1000 REM  plot glyph on screen
 1005 BORDER 5
 1010 PRINT AT 0,0; BRIGHT 1;CHR$ (char)
 1015 LET pairs=PEEK glyph
 1020 PRINT AT 1,0;"pairs=";pairs
 1021 PRINT AT 2,0;"addr=";glyph
 1025 LET glyph=glyph+1
 1030 LET pen=0: LET s=5
 1035 LET x=80: LET y=0
 1040 LET px=PEEK glyph
 1041 LET py=PEEK (glyph+1)
 1045 REM PRINT AT 0,10;px;" ";py;" ": BEEP .5,1
 1050 IF px=128 THEN GO TO 1100
 1055 IF pen=1 THEN DRAW (px-mx)*s,(py-my)*s: GO TO 1080
 1060 PLOT x+px*s,y+py*s: LET pen=1
 1080 LET glyph=glyph+2
 1090 LET pairs=pairs-1
 1092 LET mx=px: LET my=py
 1095 IF pairs>0 THEN GO TO 1040
 1099 STOP
 1100 REM  pen up
 1110 LET pen=0
 1120 GO TO 1080

První program je určený ke kreslení zkonvertovaného znaku pro potřeby mého ovladače. Druhý program zobrazuje znaky přímo z originálního formátu od pana Hersheyho. Program napsaný v BASICu je samozřejmě pomalý, jak už BASIC bývá, ale protože jsem potřeboval jen párkrát nakouknout, jestli je znak definovaný správně, nestálo mi za námahu tomu věnovat víc úsilí.

ZX screenshot ZX screenshot ZX screenshot

Třeba někdy někdo napíše skutečný prohlížeč a možná i editor?

Konverze pro ZX Spectrum

Pro potřeby tiskového ovladače jsem písma konvertoval do binární podoby. Přišlo mi jednodušší pracovat s binárními souřadnicemi, které jsou vždy kladné, než komplikovaně vše přepočítávat. V ovladači nepotřebuji číslo glyfu a počet párů může být v jednom bytu, ne ve třech, čímž se ušetří místo v paměti.

Samozřejmě mě napadlo, jestli by se souřadnice nevešly do 4 bitů a tedy jeden pár do bytu, ale bohužel nevešly a to ani u jednoduchého písma, jako je zvolené rowmans. V současné podobě mi zůstává rezerva i pro mnohem složitejší písma.

Původně jsou všechna písma proporcionální, ale to se pro výpis BASICu nehodí. Vybrané písmo rowmans proto používám s drobnými úpravami jako monospace. Bude-li ovšem někdo tvořit ovladač pro tisk z textového editoru, stálo by použití proporcionálního písma za úvahu.

Tiskový ovladač

BASIC na ZX Spectru předává data k vytištění ovladači skrz kanál #3 tak, že skočí na adresu uvedenou v tabulce dat o kanálech a v registru A je uložený byte k vytištění. Děje se tak stejně pro ovladač tiskárny ZX Printer, který už je součástí ZX ROM i pro jakýkoli jiný ovladač. Jak s takto předaným bytem ovladač naloží, je na něm. Některé ovladače mohou ASCII znaky předávat přímo tiskárně, jiné musí znaky převést na rastr, nebo HPGL příkazy, či jiný tiskový jazyk a až takto upravená data posílají tiskárně.

Přesměrování kanálu #3 je první věc, co ovladač udělá po svém spuštění. Nejprve si ze systémových proměnných zjistí adresu informací o kanálech, protože jejich umístění se mění, pokud připojená periferie přidává vlastní systémové proměnné, jako to dělá Betadisk, nebo Interface 1. Potom do položky odpovídající kanálu #3 zapíše adresu ovladače. Tím je přesměrováno.

K tisku na ZX Spectru slouží příkazy LPRINT a LLIST, podobně jako v BASICu jiných počítačů, LPRINT je přitom ekvivalentní příkazu PRINT #3 a LLIST příkazu LIST #3. S některými diskovými zařízeními, jako třeba s Betadiskem lze používat i příkaz CAT #3 a LIST #3 v příkazové řádce TRDOSu. Tím lze tisknout obsah diskety.

Přesměrování kanálu #3 se netýká příkazu COPY, který se občas používá k tisku screenshotů. To obvykle ovladač řeší jinak, nejčastěji prostým RANDOMIZE USR adresa. Někdy bývá pro tisk screenshotů samostatný program.

Příkaz LPRINT se v některých ohledech chová stejně jako PRINT, apostrof pošle odřádkování, čárka se chová jako tabulátor, středník naopak zabrání odřádkování na konci řetězce. Vše, co je vytištěno příkazem LPRINT je předáno ovladači včetně semigrafických znaků, UDG a tokenů. Analogicky LLIST při tisku předává skrz kanál #3 všechny řetězce a čísla, jako při výpisu příkazem LIST na obrazovku, ale BASICové příkazy předává jako token s kódem 165 až 255, nepřevádí je na řetězec ASCII znaků, to musí zajistit tiskový ovladač. Ovladač neví a nemusí vědět, kterým příkazem byla data vytvořena. Bere pouze znaky přicházející skrz kanál #3 a zpracovává je, byte po bytu.

Kódování znaků na ZX Spectru je shrnuto v přehledné tabulce zde.

Jak přesně to ovladač dělá, viz komentáře ve zdrojovém kódu ovladače.

Jak má být plotr připojen?

Sériovým portem na AY-3-8912 - viz článek o RS232. Zjednodušeně, k připojení je potřeba AY-3-8912 s konvertorem TTL-RS232 napěťových úrovní zapojený stejně, jako je to v ZX Spectrum 128k, nebo ZX Spectrum 128k +2. Realizovat totéž v ZX Spectrum 48k s AY, nebo Didaktiku Gama 192k je relativně snadné.

signál počítače signál na plotru
RxD TxD
TxD RxD
GND GND
RTS CTS
CTS RTS

Jako u každého propojení RS232 portů - datový výstup z počítače připojit na datový vstup do periferie a naopak (i když počítač z periferie data číst nebude, ovladač data jen posílá). Analogicky u řídících signálů. Víc to v tomto článku rozvádět nebudu, protože pinout může být odlišný podle použitého konektoru, počítače i plotru - např. DSUB 9, DSUB 25, BT631W... A aby toho nebylo málo, na periferii s RS232 se občas značí signály obráceně, např. TxD (transmit data) nemusí být výstup, ale vstup, kam se připojuje TxD z počítače. Musíte si holt poradit sami, podle svého hardwaru.

Použití ovladače z pohledu uživatele

Po načtení ovladače BASICový zavaděč kód spustí a tím automaticky provede přesměrování kanálu #3, ovladač je tak připraven k použití.

Se správně nastaveným RAMTOP, což BASICový zavaděč nastavuje, je možné použít i příkaz NEW. Ale i když ovladač v paměti zůstane zachován, resetuje se tím přesměrování kanálu #3. Příkazem RANDOMIZE USR startovní_adresa je potřeba přesměrování obnovit.

Ovladač si pamatuje, jestli byl, nebo nebyl zahájen tisk stránky. Pokud nebyl, pošle krátkou HPGL sekvenci a barevným efektem v BORDERu si vyžádá vložení papíru do plotru. Výchozí poloha pera by měla být [0,0], na mém plotru tomu odpovídá levý dolní roh papíru na výšku. U jiných plotrů tomu může být jinak, může být nutné před zahájením tisku poslat instrukci RO90, nebo něco takového, co přizpůsobí souřadnicovou soustavu.

Tiskne se na stránku shora dolů, dokud není stránka zaplněna, což ovladač pozná tak, že už nemůže zmenšit souřadnici Y o výšku řádku (která se mění s velikostí písma). Na mém plotru s výchozí velikostí písma 4 se na stránku vejde 55 řádků a na každý řádek 64 znaků. Po zaplnění stránky ovladač opět pošle krátkou HPGL sekvenci, nastaví pero na [0,0] a opět si zvukovým efektem vyžádá vložení dalšího papíru.

Ukončení stránky lze kdykoli vyvolat pomocí RANDOMIZE USR startovní_adresa. Je-li stránka zahájena, ovladač provede ukončení. Není-li zahájena, nic se nestane.

screenshot zdrojáku s nastavením

V ovladači je několik parametrů měnitelných uživatelem. Je to velikost potisknutelné oblasti v HPGL jednotkách, šířka levého okraje, počet kroků (HPGL jednotek) na jednotku fontu, čímž se určuje velikost písma, a rozestup znaků/řádků v jednotkách fontu. Viz obrázek výše.

Rozměry stránky jsou dány schopnostmi plotru a budou proto pro každý plotr trochu jiné. Velikost písma (STEPS) je na uživateli, co se mu líbí a zároveň dobře vypadá na použitém plotru. Rozestup znaků a řádků je odvozen od vlastností písma. Používáte-li písmo rowmans, nebude potřeba hodnoty měnit ani pro odlišný plotr.

A jak to teda vlastně tiskne?

Docela dobře, ale relativně pomalu. Výpis plné A4 textu může trvat klidně i půl hodiny. Písmo rowmans se určitě pro výpis z Sinclair BASICu osvědčilo. Jako monospace funguje velmi dobře. Datově je jedno z nejmenších a přesto pěkně vypadá a je dobře čitelné. Zajímavé by mohly být další varianty rowman, možná některá z variant futura a times. Tisk jinými písmy je zábavný, ale spíš nepraktický. Příp. navrhnout jiné bezpatkové písmo, lépe odpovídající ZX Spectru. Možnosti jsou, jde jen o to, jestli tomu někdo věnuje čas.

foto výpisů textu foto výpisů písmem rowmans

Kvalita tisku je závislá na mnoha detailech, nejenom na samotném písmu, ale i na mechanické kvalitě plotru, na velikosti kroku plotru a přesnosti polohování pera, na použitém papíru i na použitém pisátku. Stejně jako u ostatních plotrů i tentokrát se mi osvědčily náplně Pilot G-2, které se dají koupit samostatně. Celé pero plotr nepotřebuje, naopak, vůle mezi náplní a obalem může zhoršit kvalitu kresby.

Asi největší problém plotrů je výška pera nad papírem, tu je třeba trefit správně, jinak se může stát, že pero v některých oblastech papíru nekreslí, nebo se v jiných oblastech dotýká papíru i když nemá a dělá šmouhy v místech, která mají zůstat nepokreslená. Je to trochu vidět na posledním foto.

foto výpisů písmem rowmans a sriptc foto detailu písma scriptc

Potěšilo by, kdyby někdo vyzkoušel tisk ze ZX Spectra na skutečném perovém plotru Hewlett Packard. Některé modely mají RS232. Já žádný HP (perový) plotter bohužel nemám.

Co dál?

Stálo by za úvahu upravit ovladač tak, aby fungoval ve stránce ZX Spectra 128k a nezabíral místo pro BASICový program. Není to nijak těžké, jen mě k tomu zatím nic nenutí. Vše jsem zprovozňoval a testoval na ZX Spectrum 48k+.

TODO: Bylo by fajn, napsat i ovladač pro tisk screenshotů. Tím se možná zabývat budu.

TODO: Bylo by zajímavé pro ZX Spectrum přízpůsobit více písem.

TODO: Bylo by fajn, napsat program pro tisk textů z dalších rozšířených editorů (D-Text,. Tasword, R-Text...), ideálně s možností volby písma a jeho parametrů.

TODO: Napsal by někdo program, který by dokázal kreslit vektorově a proporcionálně s identickou šířkou znaků, jako používá Desktop? Něco jako je Ultra LQ pro 24 jehlové Epsonky, ale pro HPGL plotry.

Odkazy

Download

Historie změn článku

  • 2020-08-22 zveřejněno

[ Zpět na hlavní stránku ]

Tento web je převážně o ZX Spectru, kompatibilních počítačích a jiném zajímavém hardwaru. Naleznete-li chybu, nebo byste rádi cokoliv co s tímto souvisí, můžete mi napsat email. Stručně o mém webu zde.