Конкурс на самую короткую процедуру прямоугольника. — Abzac


PeriodicalsAbzac2001 No. 4 → Конкурс на самую короткую процедуру прямоугольника.

Конкурс на самую короткую процедуру прямоугольника.

Так как от читателей на данный момент ничего не поступило, то мне самому пришлось сесть за ассемблер и представить вашему вниманию небольшую процедуру, которая в основном используется в оконном интерфейсе. Моей целью было сделать наиболее короткую процедуру, чего, в принципе, и должны придерживаться этюды. Длина процедуры составила всего 46 байт (без переменных). Естественно, что кто-то сможет написать еще короче, поэтому у нас возникла идея - объявить конкурс по этой процедуре. Человек, написавший самую короткую процедуру, получит один номер газеты бесплатно. Итак, дерзайте, и, может быть у вас что-то получится. А моя процедура выглядит так:

       

ORG 40000
; HL - Адрес в экране
; D - Высота прямоугольника в пикселях (3...192)
; E - Ширина прямоугольника в знакоместах (1...32)

        LD HL,#4000    ; Для примера
        LD DE,#640A    ;
RECTANGLE
        PUSH HL
        CALL rect_ln   ; Горизонтальная линия
        POP HL:INC H
        DEC D          ; Уменьшаем, т.к.
        DEC D          ; в первой и последней
                       ; строке рисуем
                       ; горизонтальные линии

        LD B,D
loop_rc PUSH HL
        LD (HL),128    ; Левая граница
        LD A,E         ; Расчет приращения
        DEC A          ; по ширине
        ADD A,L
        LD L,A
        LD (HL),1      ; Правая граница
        POP HL
        CALL DOWN_HL   ; На строку ниже
        DJNZ loop_rc
rect_ln LD B,E         ; Ширина
loop_ln LD (HL),255
        INC L
        DJNZ loop_ln
        RET

DOWN_HL INC H:LD A,H:AND 7
        RET NZ:LD A,L:ADD A,32
        LD L,A:RET C:LD A,H:SUB 8:LD H,A
        RET

P.S. Естественно никаких проверок на выход за пределы экрана и т.п. не делается.