:: СОДЕРЖАНИЕ НОМЕРА
:: Газетные рубрики
:: АВТОРЫ
:: Поиск
:: Поддержка проекта
Webmoney:
|
:: №6 (05.07.2001) Просмотров: 4654
Рубрика: Этюды. Номер: №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 RET P.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] |