Ako som čiernobielu tlačiareň farbám priúčal

V tomto článku sa dozviete ako presvedčiť termotlačiareň BL-112 spolupracovať so Spectrom

Na poslednom stretnutí Forever 2024 som zhodou náhod sedel vedľa Pavla, a stoly pred nami zdieľali Ikon a Martin Č. Kým ja som doťahoval veci, na ktoré som v poslednom čase nemal čas a za tmy kódoval Real-time demo (ktoré som aj tak nakoniec nedokončil), Pavel získal od Martina termotlačiareň Sanei BL-112 a pokúšal sa ju donútiť spolupracovať so ZX Spectrum +3. Nakoniec po striedavých úspechoch dokázal na tlačiarni vytlačiť obrazovku Spektra, avšak miestami tlač zlyhávala a miesto grafických dát tlačila len zhluk písmen.

Tlačiareň BL-112 tlačí, ako už uvádza jej názov, na 112mm široký termociltivý papier s hustotou 8 bodov na mm. Celkovo na šírku papiera vie vytlačiť 832 bodov. Posun papiera je 90mm/s pri napájaní z adaptéra a 75mm/s pri práci z batérie. Buffer tlačových dát má veľkosť 8 192 bajtov, z toho pre bitmapové obrazy 2 552 bajtov. Tlačiareň má sériové rozhranie, Bluetooth a niektoré modely aj paralelné rozhranie či IrDA. Návod na obsluhu je len v japončine, ale online translátor pre PDF dokumenty spravil celkom slušnú prácu a preložil text dokumentu, ako aj popisy k obrázkom. Žiaľ, chýba detailnejší popis jednotlivých riadiacich príkazov a tak treba hľadať v návodoch obdobných tlačiarní.

Popis ovládania tlačiarne je po preklade v zrozumiteľnom jazyku
Vnútro tlačiarne BL-112
Pohľad na spodnú časť tlačiarne, kde je vložená batéria

Po skončení súťažnej časti Foreveru som začal Pavlovu prácu viac sledovať a dávať mu svoje múdre rady. Nakoniec som od Martina vyžobral ďalšiu tlačiareň z jeho zásob a rozhodol som sa oživiť ju nezávisle od Pavla. Mal som proti nemu dve výhody: hardvérový sériový interfejs a môj debugger, vďaka ktorému sa ľahšie hľadajú chyby na reálnom hardvéri. Pavel využíval štandardný sériový výstup z +3, ktorým zároveň aj príjmal data zo svojho laptopu, takže pri každej zmene kódu ho čakala rošáda káblov.

Testovacie pracovisko

Tlačiareň som pripojil sériovým káblom ku gumákovi cez SIF3, a cez ROM modul som posielal kód z laptopu priamo do Spektra. Netrvalo dlho a aj moja tlačiareň zvládla vytlačiť obrazovku počítača. Ale s rovnakými ťažkosťami, aké trápili Pavla. Problém sme identifikovali ako neschopnosť tlačiarne príjmať data tak rýchlo, ako ich Spektrum odosiela. Obaja sme začali taktizovať s rôznymi spomaleniami, ktoré síce riešili symptómy vypadanej grafiky, ale tlač prestala byť súvislá a pohyby papiera v tlačiarni boli trhané. Preto som prešiel na stratégiu riadenia prenosu dát RTS/CTS. Tlač sa stala súvislou, nakoľko tlačiareň si sama regulovala prísun dát do svojho bufra. Čakanie na uvoľnenie linky som zobrazil červeným borderom, aby som mal predstavu, koľko času musí stráviť Spektrum čakaním na tlačiareň.

Tlač obrazovky pri 8 bodoch na riadok

Keďže BL-112 emuluje ihličkovú tlačiareň, aj dáta sa odosielajú rovnakým spôsobom, teda 8 resp. 24 bodov zvisle. To znamená, že pokiaľ obrázok bude na papieri horizontálne, je potrebné prekódovanie dát z horizontálnych na vertikálne. Potom, vzhľadom na šírku papiera a počet možných tlačových bodov, je každý bajt odoslaný trikrát, čím sa potlačí 768 bodov horizontálne. Zároveň tým aj obrázok na papieri dosiahne požadovaný pomer strán.

Keď už tlačiareň zvládla tlačiť obrázok, niekto z okoloidúcich utrúsil, že by mohla tlačiť aj farebne. Ale netušil, že ja výzvy milujem a toto bola výzva ako hrom! Keďže každý bod obrazovky je v horizontálnom smere tlačený trojmo, je tu, i keď malý, priestor na dosiahnutie efektu odtieňa modifikáciou týchto bodov. A tak som vytvoril matrice jednotlivých farieb, pre každú farbu 3 bajty primeraného vzoru. Každý z troch po sebe idúcich bajtov sa potom modifikoval pomocou vzoru pre danú farbu. Farba papiera sa následne aplikuje na inverzný bajt a obe hodnoty sa nakoniec spoja:

LD A, (IY+0) ; read source byte
AND D ; apply ink pattern
LD C, A ; store
LD A, (IY+0) ; read again
CPL ; invert
AND E ; apply paper pattern
OR C ; combine with ink pattern

Tieňovanie obrazu podľa atribútov. Nápis JACK zmizol, nakoľko farby papiera a atramentu sú totožné

Obrázok mal zrazu svoje farby a kvalitatívne bol na lepšej úrovni. Avšak niektoré vzory boli dosť viditeľné a kazili výsledok. Forever sa blížil ku koncu a Martin sa rozhodol ponechať mi tlačiareň na ďalšie testy. A tak BL-112 putovala z teplého trnavského vzduchu k úpätiu zasnežených Nízkych Tatier.

Po prelúskaní manuálov k podobným tlačiarňam som skúsil donútiť BL-112 emulovať 24 ihličkovú tlačiareň, teda tlačiť 24 mikroriadkov namiesto 8. Prvé testy vyzerali nádejne. Každý bod na obrazovke Spektra by tak na tlačiarni predstavoval 3×3, teda 9 bodov. V prvej fáze som sa rozhodol obrázok pootočiť a tlačiť vertikálne. Malo to výhodu, bajty z obrazovky nebolo potrebné konvertovať z horizontálnych na vertikálne. Nakoniec som sa však vrátil k horizontálnej tlači.

Porovnanie 8 a 24 bodovej tlače

Pri 24 bodovej tlači sa prenáša trikrát viac dát, vysielajú sa tri bajty predstavujúce 24 bodov pod sebou, horný, najvýznamnejší bit je prvý. Každý bit obrazovky je potrebné zduplikovať trikrát za sebou. Keby to bol zdvojenie, alebo nebodaj vytvorenie štvorice, bolo by to o čosi jednoduchšie. Ale keď sa majú bity strojiť, dochádza k presahu bitov medzi jednotlivými bajtami. Najrýchlejším riešením je použiť vyhľadávaciu tabuľku, ktorá by však mala 768 bajtov. Ďalším riešením je použiť rotácie, napr.:

RLC D
RLA
RRC D
RLA
RLC D
RLA
(36T)

Ja som nakoniec použil vetvenie s pripočítavaním konštanty, ak bit je nenulový:

XOR A
RLC D
JR NC, NEXT1
ADD A, $E0
(22T/20T + 4T)

Pre 24 bodovú tlač som vytvoril nové vzory pre jednotlivé farby. Vďaka väčšej hustote vzoru vo výslednej tlači je tieňovanie rovnomernejšie a pre oko lahodnejšie. K dokonalosti zostáva už jediné, zahrnúť aj bit jasu.

Tieňovanie obrázka pri tlači 24 bodov na riadok
Detail aplikácie vzorov podľa farieb

Keďže výška obrazu je 192 bodov, dal by sa obrázok vo vertikálnom umiestnení dokonca zväčšiť 4-krát, čo predstavuje opäť 768 bodov na jeden mikroriadok. Problémom by bolo generovanie dát, lebo by sa do 24 bitov museli kombinovať susedné stĺpce a to v každom riadku v inom pomere. Príprava dát by už zabrala oveľa viac času a výsledná tlač by bola prerušovaná čakaním na tlačové dáta.

Ako bolo spomenuté na začiatku, šírka papiera je 112mm, teda úplne rovnaká ako má tlačiareň Alphacom 32 / TS 2040. V zásobách mám takmer 40 rokov starý termocitlivý papier sfarbujúci sa do modra, tak som urobil testovaciu tlač aj s týmto papierom. Výsledok bol však o dosť horší.

Tlač na papier z tlačiarne Alphacom 32 / TS 2040

Na testovacej tlači vidieť, že prvý riadok je menej jasný, niekedy sa zobrazia v tlači aj tmavšie pruhy. Je to spôsobené samotnou tlačiarňou a nedá sa to nijako ovplyvniť.

Tlačiareň BL-112 poskytuje dokonalú alternatívu k tlačiarňam ZX Printer, či Alphacom 32. Okrem tlače textov odteraz zvláda aj tlač obrazovky. Podobných tlačiarní je na trhu viacero, a to aj z druhej ruky. Tak prečo si nedopriať pôžitok z tlačenia?

Martin1

Ďalšie testy tieňovanej tlače. Prvý riadok je z neznámych dôvodov bledší

Pridaj komentár