Абзац
:: Поиск
:: Поддержка проекта
Webmoney:
  • Z610389805629
  • R427996570517
  • E023541002978
  • :: №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]


    © 2004-2013 Perspective group