![]() |
|
:: СОДЕРЖАНИЕ НОМЕРА
:: Газетные рубрики
:: АВТОРЫ
:: Поиск
:: Поддержка проекта
Webmoney:
|
:: №6 (05.07.2001) Просмотров: 4955
Рубрика: Этюды. Номер: №6 (05.07.2001). ЭтюдыАлександр ФИЛИППОВ, г. ВладивостокПриветствую уважаемую редакцию «Абзаца». Решил послать вам небольшую программку в раздел этюдов, а также добавить, что этюды могут быть разными, либо очень быстрыми, либо очень короткими, а если и то и другое, ну что ж, - это бриллиант среди кучи пыли. ; Процедура знакового
; умножения D*E=HL
; На входе: DE=множители,
; BIT 7,D(E) знаковый
; На выходе: HL=результат,
; BIT 7,H знаковый
ORG #C000
MULTI LD A,D
XOR E
AND #80
EX AF,AF'
RES 7,D
RES 7,E
LD L,D
LD B,8
XOR A
RR L
L1 JR NC,$+3
ADD A,E
RRA
RRL
DJNZ L1
LD H,A
EX AF,AF'
OR H
LD H,A
RETДлина процедуры всего 27 байт, и, на мой взгляд, она одна из самых быстрых, а вам уважаемые читатели, слабо сделать круче? < < < Александр УДОТОВ/ZX-PATRIOT Купил четвертый номер... Круто! Молодцы! Особенно порадовало меня возрождение «этюдов». Ну а я как раз недавно начал писать игрушку, для которой потребовалось сделать редактор этапов, а для него, в свою очередь, сделать процедуру вывода спрайтов кнопочек, да такую, чтобы, когда на кнопочку «жмешь», она «продавливалась». Идея «продавливания» кнопочек нагло взята из BGE/Delirium Tremens, так что посмотрев на сей продукт, вы поймете, как это будет у вас работать. Спрайты кнопочек должны быть нарисованы в квадратике 16х16 пикселей (32 байта) и, как и в BGE, быть квадратной формы (я, например, не мудрствуя лукаво, взял кнопки из файла, который прилагается к тому самому BGE). Формат спрайтов как всегда построчный. На начало спрайтов указывает константа BUTT_BF (адрес «ровный»). В HL пишем координаты кнопки на экране (H-X,L-Y), координаты в символах (!!! в процедуре проверок выхода за экран нет). Кстати, об экране... SCR_PG=#4000. Ну и, наконец, в аккумулятор пишите номер спрайта (от 0 до 127), 7-ой бит: если 0 - то кнопка отпущена, 1 - нажата. ; Печать кнопки с номером
; в A (0...127)
; 7-ой бит:
; 0-кнопка не нажата
; 1-кнопка нажата
; в HL - координаты
; в символах
BUTTON LD B,A
AND #7F ; Находим адрес спрайта нужной
RRCA ; нам кнопки (адрес в DE)
RRCA
RRCA
LD C,A
AND #1F
ADD A,BUTT_BF/256
LD D,A
LD A,C
AND #E0
LD E,A
RLC B ; модифицируем код
SBC A,A
AND #1F
LD (BUTT_2),A
LD (BUTT_3),A
LD A,L ; вычисление экр. адреса в симв.
RRCA ; (адрес в HL)
RRCA
RRCA
AND #E0
OR H
LD H,A
LD A,L
AND #18
ADD A,SCR_PG/256
LD L,H
LD H,A
XOR A ; на всякий случай чистим
LD (HL),A ; верхнюю строчку спрайта
INC L
LD (HL),A
DEC L
RRC B ; корректируем HL с учетом 7-го
LD A,H ; бита номера спрайта кнопки
ADC A,0 ; и устанавливаем в B кол-во
LD H,A ; выводимыхстрок спрайта
RLC B
LD A,16
SBC A,0
LD B,A
BUTT_1 LD A,(DE) ; вывод спрайта
OR A
BUTT_2 NOP
LD (HL),A
INC E ; (потому что адрес "ровный")
INC L
LD A,(DE)
BUTT_3 NOP
LD (HL),A
INC E
DEC L
INC H ;DOWN HL
LD A,H
AND 7
JR NZ,$+12
LD A,L
ADD A,32
LD L,A
JR C,$+6
LD A,H
SUB 8
LD H,A
DJNZ BUTT_1
RETP.S. Чуть не забыл... По поводу конкурса «этюдов» в 4-ом номере... Ну и задачу подкинул Xor! Сократил я процедуру всего на 2 байта, да и то за счет того, что Xor поспешил и зачем-то сделал, CALL DOWN_HL, вместо того, чтобы это вставить в тело процедурки. Ну ладно, посмотрим что народ придумает. < < < Александр ШУШКОВ/Alex XOR А народ так ничего и не придумал... Поэтому редактору делать было нечего, как снова сесть за ассемблер. А получилось вот что: ORG 40000
; HL - Адрес в экране
; D - Высота прямоугольника в пикселях (3...192)
; E - Ширина прямоугольника в знакоместах ;(1...32)
LD HL,#4001 ; Для примера
LD DE,#600A
RECTANGLE ; Прямоугольник
CALL rect_ln
; Горизонтальная линия
DEC L
DEC D
LD B,D
DOWN_HL INC H ; На строку ниже
LD A,H
AND 7
JR NZ,loop_rc
LD A,L
ADD A,32
LD L,A
JR C,loop_rc
LD A,H
SUB 8
LD H,A
loop_rc LD D,L
LD (HL),1+2
; Правая граница
LD A,L ; Расчет приращения
SUB E ; по ширине
INC A
LD L,A
LD (HL),128+64
; Левая граница
LD L,D
DJNZ DOWN_HL
LD L,A
rect_ln LD B,E ; Ширина
loop_ln LD (HL),255
INC L
DJNZ loop_ln
RETТаким образом, длина процедуры стала 42 байта (без учета переменных), что на 4 байта меньше первоначального варианта. Но так как Александр УДОТОВ - единственный, кто откликнулся на этот конкурс, мы, все же, решили наградить его бесплатным номером «Абзаца». Поздравляем! Ссылки по теме:Конкурс на самую короткую процедуру прямоугольника. [№4]Конкурс по процедуре прямоугольника продолжается [№7] |