|
27 ноября 1998 |
|

Этюды
Alone Coder
В этой рубрике мы будем публиковать ко-
роткие и быстрые процедуры,которые рекоме-
ндуем использовать взамен древних и громо-
здких.Также будут включаться небольшие из-
менения старых процедур, дающие какое-либо
преимущество перед последними.
Изменение в казалось бы уже классичес-
кой процедуре DOWN HL,которя,как известно,
рассчитывает адрес байта на экране,лежаще-
го на пиксель ниже указанного в HL:
Было: Стало:
INC H INC H
LD A,H LD A,H
AND 7 AND 7
JR NZ,EXIT JR NZ,EXIT;CY=0
LD A,L LD A,L
ADD A,32 ADD A,32
LD L,A LD L,A
JR C,EXIT JR C,EXIT;CY=1
LD A,H LD A,H
SUB 8 ADD A,-8
LD H,A LD H,A;CY=1
EXIT ... EXIT ...
В этом варианте всё осталось по-прежне-
му, за исключением того,что флаг CY теперь
указывает на пересечение границы текущего
знакоместа. В процедуре UP HL можно произ-
вести аналогичное изменение:вместо ADD A,8
поставить SUB -8.
<Точка Старых>: по координатам,заданным
в регистрах L=y, E=x, в произвольном месте
экрана(и даже за экран)за 58(!)тактов ста-
вится точка.Регистр C равен старшему байту
адреса таблиц('TABLE), регистр D=C+2.
LD H,C
LD A,(DE);x/8┐
INC D ├даёт младший байт
OR (HL);L(y) ┘
INC H
LD H,(HL);H(y)
LD L,A
LD A,(DE);byte(x)
(X)OR (HL);метод постановки точки
LD (HL),A
Если вместо последних 2 команд вставить
AND (HL),то это будет функция POINT. Чтобы
процедура работала многократно, в конце её
поставьте DEC D. Таблицы генерируются сле-
дующей программой:
LD HL,TABLE+256
LD DE,#4000
GEN0 LD (HL),D ┐
DEC H │
LD (HL),E │
INC H │
DOWN DE │1-я
LD A,D ├ и
SUB 88 │2-я
JR NZ,$+3 │
LD D,A │
INC L │
JR NZ,GEN0 ┘
INC H
LD A,128
GEN1 LD (HL),E ┐
INC H │
LD (HL),A │
DEC H │3-я
RRCA ├ и
JR NC,$+3 │4-я
INC E │
INC L │
JR NZ,GEN1 ┘
Фрагмент программы, позволяющий за одни
и те же 19 тактов выполнить / не выполнить
семитактовую команду (Z - выполнять, NZ -
не выполнять):
JR NZ,$+4
JR EXIT
<команда>
EXIT ...
Быстрая печать буквы 6x8 (экран в DE):
PUSH DE
LD L,A
LD B,C
LD A,2
RRCA
DJNZ $-1
LD (PRN+1),A
LD H,'FONT
LD B,8
PRGO PUSH HL
LD L,(HL)
PRN LD H,1
PR1 ADD HL,HL
ADD HL,HL
JR NC,PR1
LD A,(DE)
OR H
LD (DE),A
INC E
LD A,L
LD (DE),A
DEC E
INC D
POP HL
INC H
DJNZ PRGO
POP DE
Если шрифт упирается в 0, то уберите LD
B,8,а DJNZ PRGO замените на JR NZ,PRGO.
Регистр C должен содержать 7,5,3 или 1,
причем 7 соответствует нулевой координате
буквы внутри знакоместа(x mod 8=0). Букв в
шрифте 256,и все они прижаты к левому краю
(можно сдвинутые на одну точку вправо).Как
надо изменять C:
LD A,C
SUB 6
JR NC,$+5
INC E
AND 7
LD C,A
И,наконец,коснусь всем уже задолбавшего
ZXревюшного вычисления адреса буквы в ПЗУ:
Было: Стало:
LD L,A LD L,A
LD H,0 ADD HL,HL
ADD HL,HL LD H,15
ADD HL,HL ADD HL,HL
ADD HL,HL ADD HL,HL
LD BC,15360
ADD HL,BC
Убедились,что вам всю жизнь вешали лап-
шу на уши?
Other articles:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Similar articles:
В этот день... 15 November