Speccy #07
31 декабря 1996

Программирование - Программа пропорциональной печати и Windows (позволяет выводить на экран 4 вида окон).

<b>Программирование</b> - Программа пропорциональной печати и Windows (позволяет
 выводить на экран 4 вида окон).
╒══════════════════════════════╕
│▒▒▒▒▒▒ ПРОГРАММИРОВАНИЕ ░░░░░░│
╘══════════════════════════════╛

(С) Кузьма Феськов
──────────────────

   В качестве традиционной прог-
рамки для совершенствования  ва-
шего стиля я  предлагаю  сегодня
программу пропорциональной печа-
ти. Что  такое  пропорциональная
печать - это когда каждая  буква
на экране занимает ровно столько
места, сколько ей надо "М"  -  6
точек, а например "I"  достаточ-
но всего 4. Текст,  напечатанный
таким шрифтом выглядит красиво и
эстетично. Отсутствуют  ненужные
пробелы между буквами.
   В чем отличие этой  программы
от других подобных? В  необычном
формате хранения шрифта. Он хра-
нится в повернутом на 90  граду-
сов виде, каждая буква  занимает
в памяти столько места,  сколько
ей нужно,  в  результате,  полу-
чаем  как  бы   компрессированый
символьный набор, которому  тре-
буется не 768 байтов, а  меньше.
Те из вас, кто  читает  ZX-Ревю,
уже знакомы с подобным  форматом
шрифта, скажу  только,  что  эта
программа разработана  полностью
мной, она гораздо быстрее  пред-
ложенной в журнале,  хотя  и  не
имеет ненужных на мой взгляд до-
полнительных эффектов. Разумеет-
ся, что для этой программы шрифт
надо специально готовить, а пос-
кольку вручную это крайне  слож-
но, на диске вы найдете програм-
му, которая автоматически  пере-
водит  шрифт,  созданный  в  ка-
ком-либо  редакторе,  в  формат,
нужный программе. Те из вас, кто
приобрел у  фирмы  Инфорком  мою
программу   Professional    font
editor, могут  использовать  оп-
цию, встроенную в этот редактор,
что гораздо удобнее. Далее  идет
программа с комментариями. Прог-
рамма подключается  к  4  каналу
печати, для чего вам следует за-
пустить ее с адреса,  в  который
вы ее ассемблировали. После  то-
го,  как  программа  вернется  в
Бейсик вы можете  печатать  про-
порциональным  шрифтом  операто-
ром PRINT  #4;  AT  Y,X;"текст".
Также у вас появляется  три  уп-
равляющих кода: 128-включает ла-
тинский пропорциональный  шрифт,
129-включает русский  пропорцио-
нальный шрифт, 130-включает под-
программу печати ПЗУ.  Это  коды
символов  UDG  графики,  которые
находятся на  цифровых  клавишах
(128-G+8, 129-G+1 - G тип курсо-
ра и др.). Вы можете вводить  их
как CHR$ 128(129) или напрямую с
клавиотуры  как  PRINT   #4;"код
Текст". Код  не  заменяется  при
печати пробелом! Количество  ко-
дов в пределах одного  оператора
PRINT не ограничено. После полу-
чения кода 130  включится  прог-
рамма печати ПЗУ, но в любой мо-
мент можете ее  отключить  подав
коды 128 или 129. Если  програм-
ме попадаются коды с номерами от
131 по 164, то есть символы UDG,
автоматически включится програм-
ма печати ПЗУ, так как  програм-
ма  пропорциональной  печати  не
сможет сама их напечатать. Вклю-
чить  пропорциональную    печать
можно подав коды 128 или 129.
   Если при печати  вы  выходите
за  край  экрана,  то    надписи
SCROLL?  не  будет,  а    печать
приостановится до нажатия  любой
клавиши. Если вы нажмете  BREAK,
программа выйдет в Бейсик.  Мож-
но подавать команду LIST #4,  но
в TR-Dos эта команда завесит ваш
компьютер. О том,  каким  должен
быть шрифт,  как  он  храниться,
читайте в описании к программе -
"Модификатор шрифта".

        ORG 30000
        UNPHASE (или ENT)
;Подключение к 4 каналу печати.
INITPRO LD   DE,(#5C4F)
        LD   HL,#5C25
        SBC  HL,DE
        LD   (#5C1E),HL
        LD   HL,CANINF
        LD   DE,#5C24
        LD   BC,5
        LDIR
        RET
DOWN    INC  H         ;Выдает
        LD   A,H       ;адрес
        AND  7         ;следую-
        RET  NZ        ;щей пик-
        LD   A,L       ;сельной
        ADD  A,32      ;линии
        LD   L,A       ;снизу.
        RET  C
        LD   A,H
        SUB  8
        LD   H,A
        RET
;Обработка поступающих символов.
GENERAL PUSH AF
        LD   A,(CONTROL)
        LD   B,A
        POP  AF
        DEC  B
        JR   Z,PRINTS
        CP   128       ;Код 128,
        JR   C,CODE128 ;переход.
        CP   165       ;Токен
        JP   NC,2548   ;бейсика.
        ;По адресу 2548 в ПЗУ
        ;находится программа,
        ;которая переведет код
        ;токена бейсика в набор
        ;символов для печати.
        CP   129       ;Код 129,
        JR   Z,CODE129 ;переход.
        CP   130       ;Код 130,
        JR   Z,CODE130 ;переход.
        CALL CODE130   ;Если 131
                       ;и далее.
PRINTS  PUSH BC        ;Передача
        PUSH DE        ;символа
        PUSH HL        ;процеду-
        LD   HL,(ADRESS);ре пе-
        CALL L111      ;чати,
        LD   HL,(23633);адрес
        LD   BC,GENERAL;которой
        LD   E,(HL)    ;в пере-
        LD   (HL),C    ;менной
        INC  HL        ;ADRESS.
        LD   D,(HL)
        LD   (HL),B
        LD   A,B
        CP   D
        JR   NZ,CHNG
        LD   A,C
        CP   E
        JR   Z,QUIT
CHNG    LD   (ADRESS),DE
QUIT    POP  HL
        POP  DE
        POP  BC
        RET
L111    JP   (HL)
CODE128 LD   HL,L_PRO
        LD   (FONTS),HL
        LD   HL,PRTPIX
        JR   CODE130+3
CODE129 LD   HL,R_PRO
        LD   (FONTS),HL
        LD   HL,PRTPIX
        JR   CODE130+3
CODE130 LD   HL,2548
        LD   (ADRESS),HL
        RET
;Пропорциодальная печать.
PRTPIX  CP   13        ;Если код
        JP   Z,ENTER1  ;ENTER.
        CP   22        ;Если код
        JP   Z,ATT1    ;AT.
        CP   32        ;Если код
        RET  C         ;< 32.
        LD   HL,(FONTS);Адрес
                       ;шрифта.
        AND  A
        SBC  A,32
        CP   0
        JR   Z,PRTPIX1
        LD   D,0       ;Ищем
        LD   B,A       ;адрес
PRTPIX2 LD   E,(HL)    ;символа.
        ADD  HL,DE
        INC  HL
        DJNZ PRTPIX2
PRTPIX1 CALL PROWER    ;Вызов
        ;проверки координат
        ;печати.
        LD   B,8       ;Очищаем
        LD   DE,FBUF   ;буфер.
PRTPIX5 XOR  A
        LD   (DE),A
        INC  DE
        DJNZ PRTPIX5
        LD   B,(HL)    ;Перено-
        PUSH BC        ;сим сим-
        INC  HL        ;вол в
        LD   DE,FBUF+7 ;буфер.
PRTPIX6 LD   A,(HL)
        LD   (DE),A
        DEC  DE
        INC  HL
        DJNZ PRTPIX6
        CALL ROTATE    ;Повора-
        ;чиваем буфер, после по-
        ;ворота символ будет в
        ;буфере 2 в нормальном
        ;виде, но вверх ногами.
        LD   DE,(COORDY);Высчи-
        LD   B,E       ;тываем
        LD   C,D       ;адрес в
        LD   A,B       ;экране.
        CALL #22B1
        LD   IX,FBUF1+7;Посколь-
        ;символ вверх ногами мы
        ;будем брать данные из
        ;буфера снизу вверх.
        LD   A,(COORDX);Печать
        AND  7         ;символа
        EX   AF,AF'    ;на экра-
        LD   C,8       ;не с на-
PRMS1   LD   DE,0      ;ложением
        EX   AF,AF'    ;по XOR
        LD   B,A       ;т.е. в
        EX   AF,AF'    ;режиме
        DEC  B         ;OVER 1.
        INC  B
        LD   D,(IX+0)
        JR   Z,PRMS21
PRMS2   SRL  D
        RR   E
        DJNZ PRMS2
PRMS21  LD   A,(HL)
        XOR  D
        LD   (HL),A
        INC  L
        LD   A,(HL)
        XOR  E
        LD   (HL),A
        DEC  L
        DEC  IX
        CALL DOWN
        DEC  C
        JR   NZ,PRMS1
        POP  BC
        LD   A,(COORDX);Увеличи-
        ADD  A,B       ;ваем X
        LD   (COORDX),A;на длину
                       ;символа.
        RET
;Если вышли за край экрана.
WAITCLS PUSH BC        ;Если вы-
        PUSH HL        ;шли за
        PUSH DE        ;край эк-
        LD   BC,0      ;рана, то
        CALL 7997      ;ждем на-
        CALL 8020      ;жатия
        JR   NC,BREAK  ;любой
        LD   DE,16385  ;клавиши,
        LD   HL,16384  ;затем
        LD   BC,6143   ;очищаем
        LD   (HL),0    ;экран
        LDIR           ;(без ат-
        POP  DE        ;рибутов)
        POP  HL
        POP  BC
        XOR  A
        LD   (COORDY),A
        LD   (COORDX),A
        RET
;Проверка координат печати.
PROWER  LD   A,(COORDY)
        CP   185
        JR   NC,WAITCLS
        LD   (COORDY),A
        LD   A,(COORDX)
        LD   E,A
        LD   A,(HL)
        ADD  A,E
        RET  NC
        XOR  A
        LD   (COORDX),A
        LD   A,(COORDY)
        ADD  A,8
        LD   (COORDY),A
        RET
;Выход если BREAK.
BREAK   POP  HL
        POP  HL
        POP  HL
        JP   7035
;Поворот буфера на 90 градусов.
ROTATE  SUB  A
        LD   DE,FBUF1+7
        LD   C,8
ROTATE1 LD   HL,FBUF
        LD   B,8
ROTATE2 RR   (HL)
        RRA
        INC  HL
        DJNZ ROTATE2
        LD   (DE),A
        DEC  DE
        DEC  C
        JR   NZ,ROTATE1
        RET
;Обработка кода 13-ENTER.
ENTER1  LD   A,(COORDY)
        CP   185
        JR   NC,WAITCLS
        ADD  A,8
        LD   (COORDY),A
        XOR  A
        LD   (COORDX),A
        RET
;Оператор AT.
ATT1    LD   HL,PRTPIX
AT      LD   (ATCLOSE),HL
        LD   DE,AT1
        LD   A,1
        LD   (CONTROL),A
        JR   L0A80
AT1     LD   DE,AT2
        JR   L0A7D
AT2     LD   DE,(ATCLOSE)
        CALL L0A70
        LD   HL,(23566)
        LD   (COORDY),HL
        XOR  A
        LD   (CONTROL),A
        RET
L0A7D   LD   (#5C0E),A
L0A80   LD   HL,(#5C51)
        LD   (HL),E
        INC  HL
        LD   (HL),D
        RET
L0A70   LD   (#5C0F),A
        JR   L0A80
CONTROL NOP
FBUF    DEFS 8
FBUF1   DEFS 8
FONTS   DEFW L_PRO
COORDY  EQU  23728
COORDX  EQU  23729
ADRESS  DEFW PRTPIX
CANINF  DEFW GENERAL
        DEFB 192,21,83
ATCLOSE DEFW 0
L_PRO   INCBIN l.pro   ;Латин.
                       ;шрифт.
R_PRO   INCBIN r.pro   ;Русский
                       ;шрифт.
   Команда INCBIN позволяет заг-
рузить в  память  блок  кодов  с
диска. После нее должно быть на-
писано имя загружаемого файла, в
данном случае это l.pro для  ла-
тинского шрифта и r.pro для рус-
ского шрифта.  Если  ваш  ассем-
блер  не  имеет  такой   команды
(например GENS, ZEUS)  вам  сле-
дует убрать эти строки  и  после
аасемблирования загрузить  шриф-
ты самостоятельно. Строки  можно
заменить на такие:
L_PRO   DEFS длина шрифта, 0
R_PRO   DEFS длина шрифта, 0
   На этом все, пока, жду  ваших
писем. В следующий раз мы  пого-
ворим с вами о спрайтах.
(C) Феськов Кузьма
──────────────────

 В  программах отечественных ав-
торов  нередко  можно  встретить
оконный  интерфейс,  который,  к
сожалению, не всегда на уровне.

 В  качестве приложения, я пред-
лагаю  вашему вниманию небольшую
программу WINDOWS,которую вы мо-
жете найти на диске в виде текс-
та  для ассемблера с тем же име-
нем. Так же на диске есть демон-
страция  возможностей этой прог-
раммы.

WINDOWS.A

 Программа позволяет выводить на
экран 4 вида окон. Для рисования
окна нужно 6 байт данных:

 1 - координата X окна (в знако-
     местах).
 2 - координата Y окна (в знако-
     местах).
 3 - длина окна (в знакоместах).
 4 - высота  окна  (в  знакомес-
     тах).
 5 - цвет окна (ink, paper,brig-
     ht, flash).
 6 - тип окна:

       0 - наложение, тень.
       1 - наложение, тень, за-
           головок.
       2 - без  наложения,  без
           тени, с  заголовком.
       3 - без  наложения,  без
           тени,  без заголовка.

   Подпрограммы:

 SCRBF - служебная подпрограмма.
Она   сохраняет   часть  экрана,
которая  будет испорчена окном с
типом  0,  1.  Прямому вызову не
подлежит.

 ADR - вычисляет адрес в экране.
 ADRATTR  -  вычисляет  адрес  в
атрибутах.
 BFSCR - восстанавливает  экран,
после рисования окна с типом  0,

1.  Вызывается пользователем.
 COL - X, ROW - Y, LEN -  длина,
 HGT - высота,  ATTR -  атрибут,
 ATTR+1 - тип меню. STEK - прог-
 рамма  может помнить до  8 окон
 с  наложением,  на  каждое окно
 отводится 6 байт. BFSCR восста-
 навливает   окна   по  принципу
 стека - последним пришел,первым
 уйдешь.

 DOWN - адрес  следующей   снизу
пиксельной линии.

 WINDOW  -  рисует  окно.  В  HL
должен  быть  адрес данных меню.
Вызывается на прямую.

 SETW  - заполняет заданное окно
атрибутом. Служебная.

 CLSW - очищает окно. Служебная.

 BOX - рисует рамку и заголовок.
Служебная.

 BUFER1 - начиная с этого адреса
сохраняются   данные  портящиеся
окном. ВНИМАНИЕ! Проследите, что
бы  эта метка находилась в конце
программы   и  свободной  памяти
хватало   на   сохранение  ваших
меню,  иначе  при восстановлении
будет   испорчен   экран.  Экран
сохраняется  не  полностью,  а в
виде спрайта с размерами окна!!!
`ъ  Как пользоваться программой

   Для окон с типом 0, 1.
PROG   LD HL,MENDAT
       CALL WINDOW  ;РИСУЕМ ОКНО
       CALL BFSCR   ; ВОССТАНАВ-
                    ;ЛИВАЕМ ОКНО
       RET
MENDAT DEFW #Y,X, #HGT, LEN,#TIP
       DEFW ATTR
MENDAT DEFW  #0000, #0D06, #0128
;       нарисует окно с  коорди-
;       натами  0, 0 высотой 13,
;       длиной 6, с сохранением,
;       с  тенью,  с заголовком,
;       Paper  -  5,    Ink - 0,
;       Bright - 0,   Flash - 0.
 Для  окон  2,  3 все так же, но
надо убрать команду CALL BFSCR.
             * * *



Другие статьи номера:

От редакции - Критика , информация об авторах.

Авторская программа - Презентация редактора шрифтов размером 16x16 пикселей : Double Font Editor v1.3 и модификатора шрифта.

Авторская программа - программа "Модификатор шрифта".

Авторская программа - демо-версия программы "Formik Acid".

Авторская программа - Программа для катализации дисков : Chemne Base v0.6.

Авторская программа - NET v1.0 - соединение в сеть нескольких компьютеров ZX Spectrum.

Программирование - Программа пропорциональной печати и Windows (позволяет выводить на экран 4 вида окон).

Тусовка - Приветы и высказывания : С.Куксин,К.Феськов,В.Аншуков.

Стиль - Дизайн интерфейса ваших программ.

Игроскоп - Описание игры "Postman Pat-1".

Железо - Самодельное сканирующее устройство : принцип работы.

Новелла - Новелла "НЛО - враг неизвестен или охотничьи угодья на окраине галактики" (часть 3).

Музобоз - Результаты второго тура конкурса на лучшую музыкальную демонстрацию.

Музобоз - Mitchell отпровергает мнение, о том что мелодии быстрее писать в Sound Tracker Pro чем в АSM.

Идея - Каким быть видеоконтролеру для ZX-SPECTRUM'a.

Новости от OMEGA HG - Сценарий новой игры "NAVIGATOR".

Реклама - Реклама и обьявления.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Железо - подвключение модема "АЛЕГРО" (C-DOS) к спектруму.
Demo Party - результаты Millenium Party.
Фэнтези - Айзенк Азимов "Человек, который никогда не мал" (прод.)
Рассказ - делаем бомбу ч. 3.
Реклама - Имеются в продаже черно-белые электронно-лучевые трубки 31ЛМ10Б-2.

В этот день...   24 апреля