|
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 __________________________________________
Другие статьи номера:
Похожие статьи:
В этот день... 1 января
SibNews #08,
Woot! #01,
Spectrum Magazine #01,
ACNews #25,
Psychoz #14,
ACNews #14,
Last 128 #08,
Last 128 #06,
Last 128 #05,
Last 128 #04,
Last 128 #03,
Last 128 #02,
Last 128 #09,
Last 128 #3.5,
Last 128 #8.025,
Sinclair Club #05,
Last 128 #M!R 01,
Fantadrom #01,
Buzz #20,
Last 128 #01,
DonNews #13,
Nicron #120,
Promised Land #01,
Inferno #01,
Marazm #25,
Ultimathum #01,
Marazm #21,
Hooy Mag #02,
KrNews #11,
Marazm #22,
Marazm #23,
ZX Football 2000 #01,
Codemania #01,
Always #03,
Bugs #02,
IzhNews #08,
Virtual Worlds #01,
Listok #04,
Scenergy #02,
Flash Info #18,
Marazm #16,
Marazm #17,
Zed #01,
Balagan #02,
ZX Format #08,
ZX Power #03,
Shock #01,
Impulse #02,
Deja Vu #03,
ZX Club #08,
ZX Club #06,
Numberology #01,
Marazm #13,
Marazm #12,
Marazm #14,
Gorodok #02,
Zodiac #01,
Marazm #15,
Deja Vu #07,
Marazm #11,
Deja Vu #07,
Playboy #03,
Crazy News #2,
Crazy News #4,
ZX Light #01,
Crazy News #5,
Playboy #02,
ZX News #03,
ZX Review #1-2,
Read Me #02,
Crazy News #3,
Nicron #13,
Read Me #01,
Public Spirit #01,
Faultless #06,
Faultless #05,
ZX Software #01,
Stump #04,
Speccy #07,
Возраждение #0,
Speccy #03,
On-Line #17,
Scene+ #01,
Welcome Press #01,
ZX Konig #04,
Adventurer #01,
Faultless #05,
Faultless #04,
Di Halt #01,
Faultless #01,
Playboy #01,
Crazy News #1,
Faultless #03,
Pioneer #03,
Sinclair Town #02,
ZX Magazine #01,
Eldorado #01,
ZX Magazine #02,
Spectron #01,
ZX News #01,
ZX Konig #02,
200 #W,
Welcome Press #00,
Dune #07,
Subliminal Extacy #01,
Subliminal Extacy #02,
ZX Konig #01,
Subliminal Extacy #00,
Muchomor #01,
Spectrofon #01,
ZX Revija #02,
Outlet #01,
Outlet #1-3