Speccy
#07
31 декабря 1996 |
|
Программирование - Программа пропорциональной печати и 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. * * *
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября