Страница Ивана Рощина > Статьи >

© Иван Рощин, Москва

ZXNet: 500:95/462.53
E-mail: bestview@mtu-net.ru
WWW: http://www.ivr.da.ru

Нужно напечатать картинку? Псевдографика поможет!

Радиолюбитель. Ваш компьютер» 10/2000, под псевдонимом BV_Creator)
(Первоначальная версия — в ZX News #50)
Дата последнего редактирования: 4.05.2003.

Иногда возникает необходимость распечатать содержимое монохромного спектрумовского экрана в увеличенном виде. Это очень просто сделать с помощью моей процедуры, которая перекодирует экранный файл в текстовый псевдографический файл, а его уже легко можно распечатать на любом принтере.

При перекодировании каждым двум находящимся друг под другом пикселам исходного изображения ставится в соответствие один из четырёх символов текста: #20 (пробел) — когда оба пиксела выключены, #DC (“рисунок”) — когда включён только нижний пиксел, #DF (“рисунок”) — когда включён только верхний пиксел, и, наконец, #DB (“рисунок”) — когда включены оба пиксела.

После печати полученного таким образом текстового файла у меня получалось изображение формата A2. Изображение можно увеличивать или уменьшать, изменяя размер шрифта.

Кстати, обратите внимание: пикселы, которые были белыми на экране, будут чёрными на бумаге, и наоборот, то есть изображение получится инвертированным. Если это нежелательно, достаточно изменить порядок символов в преобразующей процедуре (метка DECODE) на обратный.

Если печать производится на принтере с узкой кареткой, и изображение не умещается по ширине листа бумаги, его легко можно порезать на куски в любом текстовом редакторе и печатать по частям.

Видно, что печатать изображение в текстовом формате может быть в некоторых случаях гораздо удобнее, чем в графическом, особенно если печать производится не на спектрум-совместимом компьютере, а на PC. Во-первых, формат текста одинаков на ZX Spectrum и PC, а вот графические форматы существенно различны, а значит, пришлось бы использовать программу-преобразователь из одного графического формата в другой. Хорошо, если есть готовая программа, а если нет? Во-вторых, на PC может просто не оказаться программы для печати графических файлов, а для печати текста никакая специальная программа и не нужна: достаточно использовать команду «copy имя_файла prn».

Перед запуском процедуры с адреса #4000 должна располагаться исходная картинка, а после запуска с адреса #8000 будет сформирован текст длиной #6100 байтов. Этот текст нужно записать на диск, а потом (если печать будет производиться на PC) переписать на дискету MS-DOS (рекомендую для этого программу TRMSHOBETA).

Между прочим, эту процедуру можно использовать не только в случаях, когда нужно напечатать картинку. Не секрет, что в текстовых файлах иногда используют псевдографические картинки (обычно создаваемые в текстовом редакторе). Так вот, теперь вы можете нарисовать нужную картинку (разумеется, небольшого размера) в графическом редакторе, со всеми удобствами, а затем преобразовать её в текстовый формат.

Длина процедуры — всего 103 байта, и её можно ещё уменьшить. Я нарочно не стал этого делать, чтобы не затруднить понимание логики работы процедуры.

Вы можете попробовать улучшить эту процедуру, исходя из своих потребностей. Например, можно сделать так, чтобы преобразовывался не весь экран, а лишь его часть с заданными координатами; можно с помощью других псевдографических символов (“рисунок”, рисунок”, рисунок”) получать промежуточные оттенки между белым и чёрным; можно добавить эту процедуру в какой-нибудь графический редактор для выгрузки изображений в текстовом формате… Да мало ли что ещё!

Текст процедуры преобразования:

DESTIN  EQU     #8000

        LD      DE,#00BF  ;Координаты.
        LD      HL,DESTIN ;Адрес txt.

        LD      B,128
LP_MAIN PUSH    BC        ;Главный цикл.

LP_2    CALL    GET_P
        ADD     A,A
        LD      B,A
        INC     D
        CALL    GET_P
        DEC     D
        ADD     A,B

        EXX
        LD      HL,DECODE
        LD      D,0
        LD      E,A
        ADD     HL,DE
        LD      A,(HL)
        EXX

        LD      (HL),A
        INC     HL

        DEC     E
        LD      A,E
        CP      -1
        JR      NZ,LP_2

        INC     D
        INC     D
        LD      E,191

        LD      (HL),13  ;Код
        INC     HL       ;перевода
        LD      (HL),10  ;строки.
        INC     HL

        POP     BC
        DJNZ    LP_MAIN

        RET

;---------------------------------------

DECODE  DB  #20,#DC,#DF,#DB ;Символы.

;---------------------------------------
;Процедура GET_P - узнать цвет точки.
;
;Вход: DE - координаты точки (X,Y).
;Выход: A - цвет (0 или 1).
;
;Значения других регистров не меняются.

GET_P   PUSH    HL
        PUSH    DE
        PUSH    BC

        LD      A,E
        AND     A
        RRA
        SCF
        RRA
        AND     A
        RRA
        XOR     E
        AND     #F8
        XOR     E
        LD      H,A
        LD      A,D
        RLCA
        RLCA
        RLCA
        XOR     E
        AND     #C7
        XOR     E
        RLCA
        RLCA
        LD      L,A
        LD      A,D
        AND     7
        LD      B,A
        INC     B
        LD      A,1
LOOP    RRCA
        DJNZ    LOOP

        LD      B,(HL)
        AND     B

        POP     BC
        POP     DE
        POP     HL

        CP      0
        RET     Z
        LD      A,1
        RET
Страница Ивана Рощина > Статьи >