╒══════════════════════════════╕
│▒▒▒▒▒▒ ПРОГРАММИРОВАНИЕ ░░░░░░│
╘══════════════════════════════╛
(С) Кузьма Феськов
──────────────────
В качестве традиционной прог-
рамки для совершенствования ва-
шего стиля я предлагаю сегодня
программу пропорциональной печа-
ти. Что такое пропорциональная
печать - это когда каждая буква
на экране занимает ровно столько
места, сколько ей надо "М" - 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.
* * *