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