Odyssey Magazine
#02
14 июля 1997 |
|
Почта - Процедура пропорциональной печати.
Итак,последняя рассматриваемая проблема - пропорциональная печать. Она была сделана очень давно и не совсем быстрая, точнее, совсем не быстрая, но все-таки обгоняет печать в ZX-Ревю.(хотя это уже совсем менее удачное сравнение. Там она эмулирует RST#10) Печать ведется с точностью до пиксела, поэтому если ее привязать к строкам по Y, то печать должна значительно оживится. Еще один вариант: использование стека. Первый байт знакогенератора пропорциональ- ной печати содержит ширину символа. Кроме того, символ в знакогенераторе прижат к правой границе для минимизации количества ротаций при печати. Фонт взят из процедуры пропорциональной печати, опубликованной в ZX-Ревю, может быть 1994, не помню точно. ; Процедура пропорциональной печати ; версия 5.13 ; RELEASE DATE 21.09.1996 ; ORG 35000 CALL INIT ;генерация таблицы CALL PROBE ;тест печати RET INIT PUSH IX LD IX,TABST ;начало таблицы LD B,192 ;192 линии в экране INID LD E,B LD A,192 ;расчет адреса (0,Y) SUB E ;по пикселам LD E,A AND A RRA SCF RRA AND A RRA XOR E AND #F8 XOR E LD H,A LD A,0 RLCA RLCA RLCA XOR E AND #C7 XOR E RLCA RLCA LD L,A LD (IX),L ;адрес-в HL INC IX ;заносим в таблицу LD (IX),H INC IX DJNZ INID POP IX RET PROBE EXX ;тестовая печать PUSH HL EXX LD A,32 POWTOR PUSH AF CALL PROC POP AF INC A CP 128 JR C,POWTOR EXX POP HL EXX RET ;------поиск адрес в наборе по коду------ PROC LD L,A XOR A LD H,A LD DE, FONTST-256 ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,DE LD B,(HL) ;ширина INC HL ;hl-указатель в фонт LD C,7 ;высота символа ;------контроль выхода за границы-------- LD A,(XPOS) ADDIT LD E,A ;Е-текущая поз. печ. ADD A,B ;не выйдет ли за пре JR NC,DAL1 ;делы при печати? LD A,(YPOS) ;переводим строку ADD A,C LD (YPOS),A XOR A JR ADDIT DAL1 LD (XPOS),A ;коорд.X-для след. LD A,(YPOS) ;печати CP 192-6 ;есть ли выход за JR C,DAL2 ;низ? XOR A ;есть! принять меры! LD (YPOS),A ;Напр:Печатать с 0,0 ;------Расчет указателя таблицы--------- DAL2 EXX LD DE,TABST LD L,A ;L-координата Y XOR A LD H,A ;почистили H ADD HL,HL ;умножили коорд. ADD HL,DE ;на 2 EX DE,HL ;DE-указатель на EXX ;адреса печати в таб ;расчет адреса знакоместа и позиции в нем LD A,E ;восст А-тек.коорд SRL A ;делить на 8 с остат SRL A SRL A EXX LD C,A ;число знаком. в C' EXX LD A,E AND C ;позиция в знаком. LD E,A ;в регистрах E и A LD D,8 ;----------как печатать будем?----------- ADD A,B ;сумма с шириной CP D ;D=8 JR C,BYT1 ;> -печ.в 1-ом знак. JR Z,NENADO ;ничего крутить не ;надо ;---------печать в 2-х байтах------------ BYT2 LD A,D SUB E ;8-позиция LD D,A LD A,B ;загр. ширину SUB D ;A:=шир.-(8-поз.) LD D,A ;сколько крутить ;в C-счетчик байтов CUC LD A,D LD B,A XOR A LD E,(HL) INC HL RROT RR E ;вращаем с переносом RRA ;из E в A DJNZ RROT EXX LD B,A ;2-ю полов. сохр. B' EXX LD A,E ;1-ю на печать EXX EX AF,AF' ;байт пока не нужен LD A,(DE) ;МБ адр знаком (Y,0) ADD A,C ;приб. знакоместо LD L,A ;МБ адр для печати INC DE LD A,(DE) LD H,A ;адрес в экране INC DE EX AF,AF' ;печатаемый байт OR (HL) LD (HL),A ;печатаь по 'OR' INC HL ;следом и 2-ю полов LD A,B ;инку символа на OR (HL) ;экран LD (HL),A EXX ;1 линия символа DEC C ;готова JR NZ,CUC ;повторим? RET ;печать завершена ;-----печать в пределах одного байта-- BYT1 LD A,D ;А=8 SUB E SUB B ;в A-кол-во вращ LD B,A ;в В--//-//-//-- ;в C-счетчик PRINT LD D,B ;сохранить LD A,(HL) ;читать Байт печ INC HL ;знака ROTOR SLA A DJNZ ROTOR ;крутим LD B,D EXX ;A-байт в печать EX AF,AF' ;далее процесс LD A,(DE) ;аналогичен печати ADD A,C ;в 2-х байтах LD L,A INC DE LD A,(DE) LD H,A INC DE EX AF,AF' OR (HL) LD (HL),A EXX DEC C JR NZ,PRINT RET ;печать завершена ;------------печать без ротации-------- NENADO LD A,C LD B,A ROT1 LD A,(HL) ;читаем байт INC HL EXX ;и печатаем его EX AF,AF' LD A,(DE) ADD A,C LD L,A INC DE LD A,(DE) LD H,A INC DE EX AF,AF' OR (HL) LD (HL),A EXX DJNZ ROT1 RET ;печать завершена XPOS DEFB 0 YPOS DEFB 0 FONTST INCBIN NEWFONT TABST NOP ;Здесь будет таблица. На этом позвольте завершить. Text written in ZxIbm Editor v.1.5 Formatted in IS-Dos Editor. E2 Soft 26.04.1997 __________________________________________
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября