ПРОГРАММА ПЕЧАТИ КРУПНОФОРМАТНЫХ ИЗОБРАЖЕНИЙ
(С) Харлов Александр,1996г. Дмитровград
В одном из номеров ZX-РЕВЮ была напечатана статья "Печать крупноформатных
изображений". Я предлагаю аналогичную программу. Ее отличие в том, что печать
происходит без поворота изображения. Так же возможна печать до шести экранов в
ряд, можно изменять плотность печати.
Перед печатью экранные файлы должны быть переименованы. Первые шесть символов
имен файлов должны быть одинаковыми. Последние два символа - координаты экрана
при печати X и Y. Программа на бейсике автоматически загружает необходимые
файлы. Во время процесса печати в дисководе всегда должен быть диск с
печатаемыми файлами.
Программа в машинных кодах рассчитана на интерфейс принтера на основе порта
ВВ55. Для ZX LPRINT III надо изменить строки 900 - 930 и 1120 - 1230, как в
предыдущей статье. Программа отслеживает пустые строки и пропускает их. Если
Ваш принтер не поддерживает режим изменения плотности (27,*,x), то надо
изменить бейсик-программу и 150 - 180 строки в программе в машинных кодах.
Автоматическая загрузка файлов позволяет печатать в каждом ряду разное
количество экранов.
00010 ; BIGPRINT
00020 ; Kharlov A. 1996
00030 ENT
00040 ORG 26500
00050 DI
00060 LD HL,(graph)
00070 LD B,3 ; количество третей экрана.
00080 loop1 LD C,8 ; количество строк в 1 трети.
00090 loop2 PUSH BC
00100 PUSH HL
00110 LD DE,(bufer) ; инициализация
00120 LD (buf),DE ; буфера.
00130 LD A,27 ; установка графического режима.
00140 CALL wbuf
00150 LD A,42
00160 CALL wbuf
00170 LD A,(dens)
00180 CALL wbuf
00190 XOR A
00200 CALL wbuf
00210 LD A,(kx)
00220 LD E,A
00230 CALL wbuf
00240 XOR A ; обнуление контрольного байта.
00250 LD (opt),A
00260 lp1 LD D,32 ; количество байт в строке.
00270 lp2 LD B,8 ; "перевертывание" восьми байт
00280 lp3 LD A,1 ; блока экрана с занесением
00290 lp4 RLC (HL) ; в буфер.
00300 INC H
00310 RLA
00320 JR NC,lp4
00330 CALL wbuf
00340 LD A,H
00350 SUB 8
00360 LD H,A
00370 DJNZ lp3
00380 INC HL
00390 DEC D
00400 JR NZ,lp2
00410 LD BC,6112 ; переход на следующий экран.
00420 ADD HL,BC
00430 DEC E
00440 JR NZ,lp1
00450 LD A,(opt) ; проверка на пустую строку.
00460 OR A
00470 JR NZ,op
00480 LD HL,(bufer) ; инициализация буфера.
00490 LD (buf),HL
00500 op LD A,13 ; возврат каретки и перевод строки.
00510 CALL wbuf
00520 LD A,10
00530 CALL wbuf
00540 CALL prbuf ; печать буфера.
00550 POP HL
00560 LD DE,32 ; переход на следующую строку экрана.
00570 ADD HL,DE
00580 POP BC
00590 DEC C
00600 JR NZ,loop2
00610 LD DE,1792 ; переход на следующую треть экрана.
00620 ADD HL,DE
00630 DEC B
00640 JR NZ,loop1
00650 EI
00660 RET
00670 wbuf PUSH HL ; запись в буфер.
00680 LD HL,(buf)
00690 LD (HL),A
00700 LD A,(opt) ; получение байта для проверки
00710 OR (HL) ; на пустую строку.
00720 LD (opt),A
00730 INC HL
00740 LD (buf),HL
00750 POP HL
00760 RET
00770 prbuf LD DE,(buf) ; печать буфера.
00780 LD HL,(bufer) ; начало буфера.
00790 next LD A,(HL)
00800 CALL print ; вывод байта на принтер.
00810 INC HL
00820 LD A,L ; сравнение HL и DE, если не равны,
00830 XOR E ; то продолжать.
00840 JR NZ,next
00850 LD A,H
00860 XOR D
00870 JR NZ,next
00880 RET
00890 init DI ; инициализация принтера.
00900 LD A,#98 ; управляющее слово для ВВ55.
00910 OUT (#7F),A
00920 LD A,1 ; STROBE = 1.
00930 OUT (#5F),A
00940 LD A,27 ; установка интервала 24/216.
00950 CALL print
00960 LD A,51
00970 CALL print
00980 LD A,(inter)
00990 CALL print
01000 LD A,13 ; перевод строки.
01010 CALL print
01020 LD A,10
01030 CALL print
01040 LD A,27 ; возврат назад на одну строку.
01050 CALL print
01060 LD A,106
01070 CALL print
01080 LD A,(inter)
01090 CALL print
01100 EI
01110 RET
01120 print OUT (#3F),A ; байт данных.
01130 wait LD A,127 ; проверка "пробела".
01140 IN A,(254)
01150 RRA
01160 RET NC
01170 IN A,(#5F) ; контроль BUSY.
01180 RLA
01190 JR C,wait
01200 XOR A
01210 OUT (#5F),A ; STROBE = 0.
01220 LD A,1
01230 OUT (#5F),A ; STROBE = 1.
01240 RET
01250 graph DEFW 27000 ; адрес данных.
01260 bufer DEFW 63900 ; адрес буфера.
01270 buf DEFW 0 ; текущий адрес буфера.
01280 kx DEFB 1 ; количество экранов по X.
01290 inter DEFB 24 ; интервал между строками.
01300 dens DEFB 0 ; плотность.
01310 opt DEFB 0
Машинокодовая процедура работает под управлением бейсик программы.
10 BORDER 1: PAPER 1: INK 7: CLEAR 26499
20 RANDOMIZE USR 15619: REM: LOAD "bigprint" CODE
30 LET n$="screen": LET x=1: LET y=1: LET d=0
50 CLS: PRINT AT 5,5;"1. Cat"'" 2. File:";n$;"**"'" 3
. Density:";d;'" 0-60 1-120"'" 2-120' 3-240"'"
4-80 5-72"'" 6-90"'" 4. Print"
60 LET k$=INKEY$: IF k$="" THEN GO TO 60
100 IF k$="2" THEN GO TO 200
110 IF k$="3" THEN GO TO 250
120 IF k$="4" THEN GO TO 300
130 IF k$<>"1" THEN GO TO 60
140 RANDOMIZE USR 15619: REM: CAT
150 PAUSE 0: GO TO 50
200 INPUT " Name:";n$: IF LEN n$>6 THEN GO TO 200
210 IF LEN n$<6 THEN LET n$=n$+" ": GO TO 210
220 GO TO 50
250 INPUT " Density:";d: IF d>6 OR d<0 THEN GO TO 250
260 GO TO 50
300 INPUT " Print (y/n)? ";k$: IF k$<>"y" AND k$<>"Y" THEN GO TO 50
310 POKE 26745,d: RANDOMIZE USR 26663
350 LET y=1
370 LET a=27000: LET x=1
380 LET f$=n$+CHR$ (y+48)+CHR$ (x+48): LET er=USR 15619: REM: LOAD
f$CODE a,6144
390 IF er<>0 AND x<>1 THEN GO TO 430
400 IF er<>0 AND x=1 THEN GO TO 50
410 LET a=a+6144: LET x=x+1
420 IF x<7 THEN GO TO 380
430 POKE 26743,(x-1): RANDOMIZE USR 26500
440 LET y=y+1: GO TO 370
9999 RANDOMIZE USR 15619: REM: SAVE "BIGPRINT" LINE 10