# |
|
Программирование - Несколько коротких и быстрых процедур.
Этюды 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 Убедились,что вам всю жизнь вешали лап- шу на уши
Похожие статьи:
В этот день... 21 ноября