Передовица » Макулатура » ИиО » Цветная печать на АГАТе

Цветная печать на АГАТе (N5/1987)

Е. ГОПЕНГАУЗ. г. Электросталь, средняя школа N 20, X класс. Группа сайта просит вас связаться с нами! (ЗАЧЕМ ЭТО?)

Имея комплект «Агата» с принтером, трудно удержаться от соблазна печатать на нём рисунки. Система команд принтеров CPA-80, D-100 и EPSON FX-85, которые поставляются обычно с «Агатом», позволяет использовать так называемый растровый режим (bit image mode), в котором поступающий в буфер байт несёт информацию о состоянии всех проволочек печатающей головки. Конечно, хочется использовать этот режим, но:

стандартный драйвер CPAD100 не пропускает 7-й (самый старший) бит, который необходим для передачи как графической, так и некоторой управляющей информации;

удобнее, естественно, распечатывать рисунки, созданные в видеопамяти «Агата», а не задавать отдельные массивы данных.

Эти трудности решает программа ALVPR, преобразующая в данные для принтера чёрно-белую картинку второй страницы в высшем графическом формате и управляющая её выводом на принтер.

На этом можно было бы и успокоиться, но возникло желание печатать и цветные картинки. Естественно, передать цвета можно лишь условно, кодируя полихромные точки совокупностью монохромных (цвета ленты). Предлагаемый алгоритм преобразует 8К байт цветного изображения среднего графического режима в 8К байт высшей графики той же страницы, кодируя каждый цветной пиксел соответствующим чёрно-белым квадратом 2*2.

Для начала вспомним, что одна цветная точка несёт в себе 4 бита информации, а монохромная - только 1 (таким образом, для ГСР и для ГВР нужно 4*(128*128)/(8*1024) = 1*(256*256)/(8*1024)= 8K байт ОЗУ). Задача сводится к следующему: взять одну из тетрад цветного изображения, разбить её на две части по 2 бита и перенести их «друг под другом» в соответствующие байты чёрно-белого формата. Так как области памяти ГСР-2 и ГВР-2 совпадают, то необходим небольшой буфер длиной в одну цветную строку (адреса $6000-$603F). Вот как выглядит преобразование байта с адресом $4000, если условно обозначить каждый бит цифрой:


	-+---------+-
$4000:	 !7654 3210!
	-+---------+-

	-+-----------+-
$4000: 	 !76 32 ** **!
	-+-----------+-
$4020:	 !54 10 ** **!
	-+-----------+-

Таким образом, из двух точек (7654) и (3210) формата ГСР получилось восемь точек в ГВР, условно распределенных по квадратам 2*2.

Детализировать алгоритм вряд ли стоит: любознательный читатель может самостоятельно в нём разобраться по предлагаемой распечатке дизассемблера программы USLPR.

Как её использовать? Поместив во вторую графическую страницу полихромное изображение (созданное, например, программой GREDIT, автор - В.Г. Яблонский), включите принтер, вставьте лист бумаги и запустите USLPR на счёт. Если же вам нужно только преобразование, отделите ALVPR, входящую в её состав, командой RTS: 61B2- 60 RTS

Дизассемблер текста USLPR

*** Инициализация: ***

6100-	A9 01	   LDA	#$01
6102-	85 0F	   STA	$0F
6104-	A9 FF	   LDA	#$FF
6106-	85 09	   STA	$09
6108-	85 0B	   STA	$0B
610А-	A9 3F	   LDA	#$3F
610C-	85 ОС	   STA	$0C
610F-	85 0A	   STA	$0A
6110-	A9 FF	   LDA	#$FF
6112-	85 07	   STA	$07
6114-	A9 5F	   LDA	#$5F
6116-	85 08	   STA	S08
6118-	EA	   NOP	

*** Непосредственно текст: ***

6119-	E6 0B	   INC	$0B
611B-	D0 02	   BNE	$611F
611D-	E6 0C	   INC	$0C
611F-	A0 00	   LDY	#$00
6121-	B1 0B	   LDA	$0B),
6123-	85 00	   STA	$00
6125-	29 C0	   AND	#$C0
6127-	85 01	   STA	$01
6129-	A5 00	   LDA	$00
612B-	29 0C	   AND	#$0C
612D-	2A	   ROL	
612E-	2A	   ROL	
612F-	05 01	   ORA	$01
6131-	85 03	   STA	$03
6133-	A5 00	   LDA	$00
6135-	29 30	   AND	#$30
6137-	6A	   ROR	
6138-	6A	   ROR	
6139-	85 02	   STA	S02
613B-	A5 00	   LDA	$00
613D-	29 03	   AND	#$03
613F-	05 02	   ORA	$02
6141-	R5 04	   STA	$04
6143-	A5 OF	   LDA	$0F
6145-	F0 14	   BEQ	$615B
6147-	A5 03	   LDA	$03
6149-	85 05	   STA	$05
614B-	A5 04	   LDA	$04
614D-	2A	   ROL	
614E-	2A	   ROL	
614F-	2A	   ROL	
6150-	2A	   ROL	
6151-	85 06	   STA	$06
6153-	A9 00	   LDA	#$00
6155-	R5 OF	   STA	$0F
6157-	4C 19 61   JMP	$6119
615A-	EA	   NOP	
615B-	E6 07	   INC	$07
615D-	D0 02	   BNE	$6161
615F-	E6 08	   INC	$08
6161-	A5 03	   LDA	$03
6163-	6A	   ROR	
6164-	6A	   ROR	
6165-	6A	   ROR	
6166-	6A	   ROR	
6167-	05 05	   ORA	$05
6169-	A0 00	   LDY	#$00
616B-	91 07	   STA	($07),Y
616D-	A5 04	   LDA	$04
616F-	05 06	   ORA	$06
6171-	A0 20	   LDY	#$20
6173-	91 07	   STA	($07),Y
6175-	A9 01	   LDA	#$01
6177-	85 OF	   STA	$0F
6179-	A5 07	   LDA	$07
617B-	C9 1F	   CMP	#$1F
617D-	D0 9A	   BNE	$6119
617F-	EA	   NOP	
6180-	А9 FF	   LDA	#$FF
6182-	85 07	   STA	$07
6184-	А9 5F	   LDA	#$5F
6186-	85 08	   STA	$08
6188-	А0 41	   LDY	#$41
618A-	88	   DEY	
618B-	F0 08	   BEQ	$6195
61RD-	B1 07	   LDA	($07),Y
618F-	91 09	   STA	($09),Y
6191-	4C 8A 61   JMP	$618A
6194-	EA	   NOP	
6195-	A5 0A	   LDA	$0A
6197-	C9 5F	   CMP	#$5F
6199-	D0 07	   BNE	$61A2
619B-	A5 09	   LDA	$09
619D-	C9 BF	   CMP	#$BF
619F-	F0 10	   BEQ	$61B1
61A1-	EA	   NOP	
61A2-	18	   CLC	
61A3-	A5 09	   LDA	$09
61A5-	69 40	   ADC  #$40
61A7-	85 09	   STA	$09
61A9-	90 02	   BCC	$61AD
61AB-	E6 0A	   INC	$0A
61AD-	4C 19 61   JMP	$6119
61B0-	FA	   NOP	
61B1-	FA	   NOP	
61B2-	FA	   NOP	

Дизассемблер текста ALVPR (автор - А.Голов, ЛЭМЗ)
	
61BЗ-	А2 03	   LDX	#$03
61B5-	BD 29 61   LDA	$6129, X
61B8-	20 0A 61   JSR	$610A
61BB-	CA	   DFX	
61BC-	10 E7	   BPL	$61B5
61BE-	A9 40	   LDA	#$40
61СО-	85 01	   STA	$01
61C2-	А9 20	   LDA	#$20
61С4-	85 02	   STA	$02
61С6-	А0 00	   LDY	#$00
61C8-	84 00	   STY	$00
61СА-	А2 05	   LDX	#$05
61CC-	BD 2D 62   LDA	$622D,X
61CF-	20 0A 62   JSR	$620A
61D2-	CA	   DEX	
61D3-	10 F7	   BPL	$61CC
61D5-	A9 00	   LDA	#$00
61D7-	85 03	   STA	$03
61D9-	А0 00	   LDY	#$00
61DB-	84 04	   STY	$04
61DD-	А6 03	   LDX	$03
61DF-	B1 00	   LDA	($00),Y
61E1-	0A	   ASL	
61Е2-	CA	   DEX	
61E3-	10 FC	   BPL	$61E1
61E5-	26 04	   ROL	$04
61E7-	18	   CLC	
61E8-	9B	   TYA	
61E9-	69 20	   ADC	#$20
61ЕВ-	A8	   TAY	
61EC-	D0 EF	   BNE	$61DD
61EE-	А5 04	   LDA	$04
61F0-	20 0A 62   JSR	$620A
61F3-	F6 03	   INC	$03
61F5-	А5 03	   LDA	$03
61F7-	С9 08	   CMP	#$08
61F9-	90 DE	   BCC	$61D9
61FB-	Е6 00	   INC	$00
61FD-	А5 00	   LDA	$00
61FF-	С9 20	   CMP	#$20
6201-	90 D2	   BCC	$61D5
6203-	Е6 01	   INC	$01
6205-	С6 02	   DEC	$02
6207-	D0 BD	   BNE	$61C6
6209-	60	   RTS	
620A-	8D D0 C0   STA	$C0D0
620D-	CD D0 C0   CMP	$C0D0
6210-	F0 08	   BEQ	$621A
6212-	A9 89	   LDA	#$89
6214-	8D D3 C0   STA	$C0D3
6217-	20 20 62   JSR	$6220
621A-	AD D2 C0   LDA	$C0D2
621D-	30 FB	   BMI	$621A
621F-	0A	   ASL	
6220-	8D D1 C0   STA	$C0D1
6223-	A9 C0	   LDA	#$C0 
6225-	8D D1 C0   STA	$C0D1
6228-	60	   RTS	

Для программы ALVPR необходимы данные: 6229- 08 41 1В 10 01 00 4В 1В 09 0A F7

Образец работы алгоритма

Примечание. В распечатку вкралась ошибка: во второй и третьей строках программы ALVPR вместо 61 должно стоять 62.

* * *

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

Использование материалов сайта agatcomp.ru без получения предварительного письменного разрешения agatcomp.ru запрещено.