Итак,последняя рассматриваемая проблема
- пропорциональная печать.
Она была сделана очень давно и не совсем
быстрая, точнее, совсем не быстрая, но
все-таки обгоняет печать в 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
__________________________________________