ZX Spectrum a PCL tiskárny I.

Úvod

Barevný tisk u ZX Spectra byl snem všech Spectristů, kteří k tisku ZX Spectrum používali a používají. Jenomže dosud moc barevných tiskáren připojeno nebylo. Vlastně se používalo jen několik modelů barevných jehličkových tiskáren, které mají několik nevýhod. Jsou hlučné, páska s barvami se v průběhu tisku znečišťuje - zvláště žlutá a kvalita není oslňující.

Osobně mám celkem dobrý vztah k Hewlett Packard (dále jen HP) tiskárnám, u mého PC se jich vystřídalo několik a nějaký čas jsem pracoval v autorizovaném servisu, kde jsem HP tiskárny (DeskJety a LaserJety) opravoval, ještě v době, než je začali vyměňovat komplet kus za kus. Takže bylo celkem přirozenou volbou takovou tiskárnu zprovoznit i u ZX Spectra.

Jazyk PCL používaný v HP tiskárnách je docela rozumně zpětně kompatibilní, takže pokud je software napsán na starší typ, tak na novějším bude velmi pravděpodobně fungovat bez problémů, jen nedokáže využít všechny možnosti. Jedinou podmínkou je paralelní port, protože k ZX Spectru zatím USB periferie připojit neumíme.

Připojení tiskárny

Inspiroval jsem se zde (místní kopie) a v manuálu k Desktopové utilitě Ultra LX/LQ. Použil jsem zapojení Special Didaktik s invertorem. Invertor je zapojený na signálu /STROBE směrem k tiskárně, ale úprava programu na jakoukoliv jinou variantu je snadná není příliš složitá.

Použité zapojení kabelu Special Didaktik

pin
UR-4
signál rozhraní
8255
signál rozhraní
Centronics
pin
Canon
1port A0data bit 02
2port A1data bit 13
3port A2data bit 24
4port A3data bit 35
5port A4data bit 46
6port A5data bit 57
7port A6data bit 68
8port A7data bit 79
17port C3 + inv./STROBE1
22port C7BUSY11
24,27,29GNDGND18 - 25

Konektor na straně tiskárny je Canon 25 pinů. Není to tedy konektor Centronics, jako je na paralelních portech tiskáren. Canon jsem zvolil proto, protože následně lze vyrobit jednoduchou redukci z plošného spoje a dvou konektorů a k ní pak připojit libovolný Centronics, nebo Bitronics kabel připojující tiskárnu k počítači. Stejný kabel pak lze použít jak k PC, tak k ZX Spectru. U ZX Spectra akorát bude navíc popsaná redukce.

V případě připojování k Didaktikům Gama a disketovým mechanikám Didaktik 40/80 je nutné nezapojit GND na piny 27 a 29. Viz popis UR-4. Pouze na pinu 24 je GND u všech variant na stejné pozici.

Redukce na Canon

Osobně nerad pájím drátové redukce, protože se lze snadno splést a dráty omylem zpřeházet, navíc v průběhu používání se mohou dráty zlámat, utrhat, roztřepit a zkratovat. Proto jsem radši udělal malý plošný spoj a doplnil zapojení o invertor, který invertuje signál STROBE a může a nemusí být zapnut jumperem.

foto

Při připojování buďte opatrní, doporučuju tiskárnu připojovat vypnutou (odpojenou ze zásuvky). Měl jsem problémy s vyrovnávajícími se potenciály GND, protože moje tiskárna není uzemněna napájecím kabelem, kdežto ZX Spectrum ano přes napájecí zdroj disketových mechanik.

Posílání dat do tiskárny

Tiskárna je připojená, ale předtím než je možné posílat data, je potřeba nastavit rozhraní 8255. V případě Didaktik Special A se to provádí takto.

;------------------------------------------------------------------------------
; Inicializace - nastaví 8255 a nastaví řídící signály.

PRINTER_INI8255	ld	a,138			; nastaví rozhraní 8255, port A jako výstup, port B vstup
		out	(127),a
		ld	a,0			; /STROBE s invertorem neaktivní
		out	(95),a
		ret

Pro zapojení Didaktik Special B se bude 8255 inicializovat hodnotou 152 (místo té 138) poslanou na port 127.

Je nutné nějak předávat data z počítače tiskárně. To lze provést následujícím velmi jednoduchým programem.

;------------------------------------------------------------------------------
; Odeslání jednoho bytu s možností přerušení přenosu.
; Stisknutí klávesy Break je po ukončení PRINTER_OUT signalizováno Z = Break, NZ = není Break.
; To proto, aby na toto mohl reagovat kód pro přenos sekvence dat.

PRINTER_OUT	ld	(PRINTER_OUT_DT+1),a	; uschovej data, registr A bude potřeba
PRINTER_OUT_WR	call	8020			; test klávesy BREAK (nutné, protože tiskárna nemusí přijímat data!)
		jr	nc,PRINTER_BREAK	; NC = je BREAK, odskok
		xor	a			; čekej, dokud není tiskárna připravena přijmout data
		in	a,(95)
		bit	7,a
		jr	nz,PRINTER_OUT_WR
PRINTER_OUT_DT	ld	a,0			; obnov data
		out	(31),a			; a pošli na tiskárnu
		ld	a,8			; generuj STROBE nejméně 5 mikrosekund dlouhý pulz
PRINTER_INIT_2	out	(95),a
		nop
		nop
		ld	a,0			; /STROBE s invertorem neaktivní
		out	(95),a
		inc	a			; nastav NZ
		ret

PRINTER_BREAK	xor	a			; nastav Z
		ret

;------------------------------------------------------------------------------
; Pošle sekvenci znaků od adresy v HL dlouhou BC znaků/bytů.

PRINTER_OUTB	ld	a,(hl)			; vytiskne řetězec znaků od adresy v HL, BC = počet znaků
		call	PRINTER_OUT
		jr	z,PRINTER_OUTB_2	; Z = Break
		inc	hl
		dec	bc
		ld	a,b
		or	c
		jr	nz,PRINTER_OUTB
		xor	a			; vše proběhlo korektně, vynuluj kód chyby = ohlaš ok
PRINTER_OUTB_3	ld	(PRINTER_ERROR),a
		ret

PRINTER_OUTB_2	ld	a,1			; do kódu chyby zapiš 1 = Break
		jr	PRINTER_OUTB_3

PRINTER_ERROR	db	0			; 0 = vše ok
						; 1 = Break

Pro zapojení Didaktik Special B nahraďte out (31),a instrukcí out (63),a.

Když lze posílat data, je taky dobré vědět, co poslat a jak na to tiskárna bude reagovat.

PRINTER_START	ld	hl,PRINTER_PCL		; přepne do PCL
		ld	bc,PRINTER_PCL_LEN
		jr	PRINTER_OUTB		; CALL + RET

PRINTER_PCL	db	ESC,"%-12345X"					; UEL - odkudkoliv do výchozího PJL

; následujících 6 řádků vynechte u starších tiskáren, které umí jen PCL3, u PCL5 tiskáren to je jedno
		db	"@PJL JOB NAME = \"screenshot\"",CR,LF
		db	"@PJL JOB RDYMSG = \"ZX Spectrum\"",CR,LF	; hláška na displej kvůli starším tisk. HP
		db	"@PJL JOB DISPLAY = \"ZX Spectrum\"",CR,LF	; hláška na displej kvůli novějším tisk. HP
		db	"@PJL SET COPIES = 1",CR,LF
		db	"@PJL SET RET = OFF",CR,LF			; pro ZX rastry se nehodí
		db	"@PJL ENTER LANGUAGE=PCL",CR,LF			; přepne na PCL

		db	ESC,"E"						; PCL printer reset

PRINTER_PCL_LEN	equ	$-PRINTER_PCL		; spočítá při kompilaci délku sekvence

Tímto je tiskárna připravena přijímat PCL příkazy. Další podrobnosti ve zdrojových kódech, které jsou ke stažení na konci textu.

Proč jsem zvolil PCL?

Všechny HP tiskárny mají jazyk PJL (Printer Job Language), který slouží ke správě tiskových úloh. Což znamená že pomocí tohoto jazyka lze například řídit z jakého zásobníku se vezme papír, kam se umístí vytištěný výsledek, kolik kopií se má vytisknout a v neposlední řadě jakým jazykem je úloha tištěna. Tiskárna to samozřejmě musí umožňovat.

Lepší HP tiskárny umí jazyk PJL vždy, snad jen s výjimkou nějakých GDI M$ Windows only ošizených ultralevných USB modelů. V řadě tiskáren s paralelními porty jsem se s žádnou takovou nesetkal. Což neznamená, že neexistuje, ale prostě o ní nevím. To bohužel není tak úplně pravda, což jsem zjistil při tisku na Deskjet 340, která umí pouze PCL3 a jazyk PJL má redukovaný na naprosté minimum. Více PJL příkazů lze zřejmě očekávat především u tiskáren, kde má smysl např. určení vstupního a výstupního zásobníku papíru, nebo vynucení tisku kopií úlohy, aniž by bylo potřeba posílat data vícekrát. To se týká hlavně větších laserových tiskáren.

Stejně tak tyto tiskárny umí i jazyk PCL (Printer Command Language), přičemž jazyků PCL je spousta verzí podle toho jak se v průběhu času vyvíjel. Aktuálně se prodávají tiskárny s jazykem PCL 6 (většina laserových tiskáren s paralelními porty nejenom HP, ale třeba i Samsungy, Lexmarky a další). Většina inkoustových tiskáren zhruba z období let 2000 - 2005 si poradí s PCL 5. Starší inkoustové tiskárny umí přinejmenším PCL 3.

Jazyk PCL kromě spousty funkcí umožňuje nastavit kvalitu tisku, rozlišení, způsob skládání barev, a hlavně se s jeho pomocí dají tiskárně poslat rastrová data.

U ZX Spectra by byl ještě velmi pěkně využitelný jazyk HPGL, ale bohužel ho umí jen některé dražší laserové tiskárny a snad všechny plotry. Postscript taky není podporovaný všemi tiskárnami, zvláště pak ne domácími inkoustovými a pro ZX Spectrum by asi nebyl vhodný, takže nejlepší volbou zůstává PCL.

Hodně jsem čerpal z referenční příručky HP pro Deskjety 600 až 890. Bohužel už nevím, kde jsem ji získal, nemohu odkázat.

Kompatibilita

Nejčastějším dotazem, se kterým jsem se setkal, je otázka s jakými tiskárnami bude software pracovat a jestli lze použít tiskárny laserové, nebo jenom inkoustové.

Software používající základní příkazy jazyka PCL 3 by měl pracovat prakticky na libovolné HP tiskárně s LPT portem vyrobené v období let 1995 - 2008. Na tom jestli je laserová, nebo inkoustová záleží vlastně jen do té míry jestli umí tisknout barevně, nebo jen černobíle. Pokud tiskárna neumí tisknout barevně, tak nejspíš barevný tisk nebude fungovat vůbec, ani v odstínech šedi. Tiskárny barvy nerastrují, bude fungovat jen černobílý tisk. Screenshoty se tisknou v rozlišení 300x300dpi (barvy i černá), texty z Desktopu v rozlišení pouhých 75x75dpi (jen černá), to by měla zvládnout opravdu každá PCL tiskárna.

Použitelnost také pravděpodobně není omezena jen na HP tiskárny, i jiní výrobci podporují jazyk PCL, např. Samsung, Xerox, Ricoh ... Důležitá je přítomnost LPT portu a shodný způsob přepínání do jazyka PCL. Někdy u takových tiskáren bývá poznámka, že podporují tisk z DOSu (což už se bohužel neuvádí) a umí emulaci PCL. Téměř určitě nebude tisk fungovat na tiskárnách Epson a Canon.

Bohužel jsem neměl zatím příležitost to důkladně vyzkoušet a nemám k dispozici víc než několik málo tiskáren, takže budu rád za jakékoliv informace a zkušenosti, které mi pošlete, užitečné zveřejním.

modeltechnologierozhranífunkčnost
Deskjet 340inkoustLPT plně funkční, jen černobílý tisk, nemám trojbarevný inkoust ok
DeskJet 690CinkoustLPT funkční, testován jen černobílý tisk ok
DeskJet 840CinkoustLPT, USB nefunkční, nepřijímá data přes LPT, zatím nevím proč nefunguje
Deskjet 980cxiinkoustLPT, USB plně funkční barevný i černobílý tisk ok
Deskjet 1220cinkoustLPT, USB funkční, testován jen černobílý tisk ok
LaserJet 4MlaserLPT funkční, jen černobílý tisk, tiskárna není barevná ok
LaserJet 5MPlaserLPT funkční, jen černobílý tisk, tiskárna není barevná ok
LaserJet 4050laserLPT funkční, jen černobílý tisk, tiskárna není barevná ok
LaserJet 3030laserLPT, USB nefunkční, přijme data přes LPT, ale nereaguje na ně nefunguje

První tisk

PCL tiskárny tisknou ASCII automaticky. Netřeba s nimi dělat víc než poslat znaky do tiskárny a úlohu zakončit znakem FormFeed. Nicméně k tomu, aby bylo možné text obarvit, nebo nastavit parametry stránky je nutné tiskárnu přepnout z PJL jazyka do PCL.

Po prvních pokusech s tiskem jsem napsal jednoduchý kód, který umožňuje tisknout screenshoty. Nejprve černobílé - jen pixely bez ohledu na atributy, druhý kód tiskne screenshoty barevné.

Pozor na to, že je v programu nastavena kvalita Draft a černá je úmyslně tisknuta světlejší, je prokládána bílými pixely. To abych při experimentování zbytečně neplýtval inkoustem. Rozlišení tisku je 300dpi v černé i barvách a je použitý velmi jednoduchý rastr, který trochu odlišuje barvy s jasem a bez jasu.

foto tisk foto tisk

Zatím to je bohužel jen taková ukázka možností, zbývá ještě hodně práce než to bude skutečně použitelné. Zvláště nastavení kvality tisku, umístění obrázku na stránce, kvalitní rastrování odstínů a další detaily velmi chybí.

Jednoduchý ovladač pro Desktop

Textový editor Desktop je na ZX Spectru něco jako balík Office programů na PC. Jakmile existuje možnost tisknout, tak Desktop nesmí být opomíjen (snad ještě Calculus, ale ten zdaleka nebyl využíván tak často). Napsání ovladače předcházela důkladná analýza ovladače k plotru Aritma, protože jsem byl jednak zvědavý jak funguje a druhak protože je součástí základní sady ovladačů od Universuma, autora Desktopu. Díky disassemblování a analýze kódu pro Aritmu 0507 jsem mohl některé části kódu použít zcela shodné, především uživatelské rozhraní.

Výsledkem je prozatím značně jednoduchý ovladač, který je originálním velmi podobný a stejně se ovládá. Možnosti nastavení jsou redukované na minimum, protože sice lze volit více kvalit tisku, různá tisková média, ale v kombinaci s grafickým tiskem v rozlišení 75dpi černobíle, což ideálně pokrývá možnosti Desktopu, např. použití fotopapíru, nebo průhledných fólií postrádá smysl. Kdyby byl zájem, tak to samozřejmě realizovatelné je.

Samotný Desktop, pracující s obrázky a proporcionálními fonty, je schopen pracovat s libovolným "dokumentem", který je široký od 64 do 768 pixelů. Na A4 tiskárně se v rozlišení 75 dpi dá tisknout max. asi 600 pixelů v závislosti na šířce okrajů. Některé tiskárny umí tisknout bezokrajově, takže i víc než 600px na řádek, jiné potřebují alespoň 6mm na každé straně papíru. Nicméně rozlišení 480px propagované v Desktopu Proximou zvládnou zcela určitě a limit těch nejhorších s nejširšími okraji by neměl být menší než cca 550px. Optimální je kulatých 512px, protože při zobrazování náhledu zmenšený pohled přesně zaplní jednu obrazovku na šířku.

Z nastavení kvality jsem tedy ponechal pouze možnost nastavit kvalitu Draft (Econo Fast) a Normal. Rozdíl mezi výsledky je viditelný, ale pro ZX Spectrum to není zásadní. Dále je možné nastavit okraje tisku, resp. odsazení od levého a horního okraje. Pravý okraj si hlídá tiskárna a je tak daleko, jak široký je tisk. Dolní okraj je značně závislý na schopnostech tiskárny a jeho nastavení je ponecháno na uživateli jako počet řádků na stránce přímo v Desktopu.

Další velmi důležitou možností je položka "Finish page". Stisknutí Enteru na této položce dokončí tisk právě tisknuté stránky a zajistí vysunutí papíru z tiskárny. Zároveň je vynulováno počítadlo řádků.

To je prakticky vše, co má smysl nastavovat. Ještě se nabízí možnost tisku do sloupců a šířka mezery mezi sloupci, ale to není snadné realizovat, protože další sloupce jsou ve skutečnosti další stránka tištěná znovu od horního okraje papíru, jen posunutá vpravo. Inkoustové ani laserové tiskárny se neumí vracet. Aby to bylo realizovatelné, musel by Desktop poskytovat grafiku všech sloupců současně.

Ostatní nastavení jiných tiskáren se týkalo např. přímého řízení jejich motorů, časování, rychlosti atd... což u tiskárny s vlastním procesorem postrádá smysl a je tedy vynecháno.

foto tisk

Osobně si myslím, že DeskJet 340 je jednou z nejvhodnějších tiskáren, které si uživatel ZX Spectra může přát.

Nastavení okrajů

Aby software mohl být co nejjednodušší a já s ním neměl mnoho práce a zároveň proto, protože komunikace s tiskárnou není obousměrná, není možné zjistit model tiskárny a pak pomocí PJL fyzické okraje tiskové oblasti, ponechal jsem nastavení okrajů v PCL jednotkách.

PCL jednotka je 1/300" - jedna třísetina palce. Tj. chci-li posunout okraj o 10mm, pak je nutné hodnotu změnit o 10*300/25,4 = 118,11 PCL jednotek. Zároveň je potřeba počítat s fyzickými okraji tiskárny, tj. chci-li okraj nikoli jen posunout, ale nastavit na konkrétní vzdálenost, musím PCL jednotky spočítat pro (požadovaný okraj - fyzický okraj), kde fyzický okraj je dán schopnostmi tiskárny.

Například pro mou tiskárnu DeskJet 980cxi budou okraje následující. Fyzický okraj počítám 3mm. Ovšem i hodnoty vyladěné pro konkrétní model tiskárny nutno brát s rezervou, tiskárna vezme papír pokaždé trochu jinak a okraj tak může být +-1mm posunutý.

šířka tiskulevý okrajnastavení PCL
480px (162,6mm)20,7mm245
512px (173,4mm)15,3mm181

Pro Deskjet 340 vychází okraje velmi podobně, minimální levý okraj jsem naměřil asi 3,5mm, ale ještě víc záleží na tom jak je vložený papír, který lze vkládat i ručně bez podavače.

screenshot Desktop screenshot Desktop

Jednoduchý ovladač pro ZX BASIC

Po nějakém čase od chvíle, co jsem zveřejnil ovladač pro Desktop jsem potřeboval vytisknout katalog diskety a nezbylo než napsat ovladač i pro BASIC.

Od Desktopového ovladače, který pouze přijímá rastrová data připravená textovým editorem a přeposílá je na tiskárnu, se BASICový ovladač liší tím, že musí vytvářet rastrovou grafiku z aktuálně nastaveného písma v BASICu (pomocí proměnných na adresách 23606 a 23607) a převádět tokeny na znaky. Aktuální verze má ještě pár nedostatků, ale katalog diskety, nebo výpis programu se jím vytisknout dá.

Po spuštění programu, dejme tomu zkompilovaného a do paměti načteného na adresu [adresa] je nejprve potřeba ho spustit nestalo-li se tak automaticky. Tím je nastaven kanál 3 tak, aby volal při zápisu do něj ovladač tiskárny místo tiskových rutin v ROM pro ZX Printer.

Ve výchozím nastavení je zvolen formát papíru A4 a rozlišení 75dpi. Obojí lze změnit v jednoduchém menu, které se zobrazí příkazem RANDOMIZE USR [adresa]+3. Kromě formátu a rozlišení lze zvolit i kvalitu tisku a ukončit nedokončenou stránku. Viz screenshot.

screenshot menu v BASICu

Ukončení stránky je nutné skoro vždy na konci tisku. ZX Spectrum je orientované znakově/řádkově a během zpracování dat na kanálu 3 není možné rozpoznat, že nic dalšího již tisknuto nebude. To musí říct uživatel. Kromě menu to lze udělat i pomocí RANDOMIZE USR [adresa]. K ukončení stránky a vysunutí papíru v obou případech dojde pouze když byl tisk zahájen, nemělo by nikdy dojít k nabrání a vysunutí prázdného papíru.

scan vytisku scan vytisku

A nakonec dva obrázky výtisků obsahu diskety v různém rozlišení - tisknuto na DeskJet 340. Rozdíl v kvalitě je i na papíře obtížně rozpoznatelný, na první pohled je vidět hlavně velikost čtverečků z nichž jsou znaky složené - poměr velikostí je v obrázcích zachován.

Odkazy

Download

Opravené chyby a aktualizace

  • 4.1.2009 zveřejněno
  • 12.1.2009 aktualizace, doplněn text o kompatibilitě a tabulka tiskáren, zveřejněn ovladač k Desktopu
  • 1.2.2010 zveřejněna první verze ovladače pro tisk z BASICu plus popis použití, nepatrně aktualizován ovladač pro Desktop
  • 28.11.2011 opraveny odkazy na cizí weby

[ 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.