Этюды — Abzac


PeriodicalsAbzac2006 No. 27 → Этюды

Этюды

Владислав Ювженко, г. Красноярск


№ 1. Быстрая переброска байт между страницами.

На входе:

HL - адрес «откуда»

DE - адрес «куда»

BC - какие страницы переключать

A - сколько байт перебросить.

Например, необходимо перебросить блок размером 6144 байта, тогда A = 12. Вычисляется по Формуле: 6144/2/256. Можно перебрасывать только «круглые» и четные числа.


;41 байт
    EXX
    LD B,A
    LD C,0
    EXX
    LD A,B
    EX AF,AF
    LD A,C
    LD BC,#7ffd
    DI
    LD (stak+1),SP
    LD SP,HL
    EX DE,HL
    EXX
    EXX
    EX AF,AF
    OUT (C),A
    EX AF,AF
    POP DE
    OUT (C),A
    LD (HL),E
    INC HL
    LD (HL),D
    INC HL
    EXX
    DEC C
    JR NZ,$-14
    DJNZ $-16
stak    LD SP,0
    EI

№ 2. Обмен байтами между страницами.

На входе:

HL - откуда

DE - страницы

BC - куда

A - сколько (только «круглые» числа)


;35 байт.
    PUSH BC
    EXX
    POP HL
    LD B,A
    LD C,0
    EXX
    LD BC,#7ffd
    OUT (C),D
    EXX
    EXX
    LD A,(HL)
    EX AF,AF
    OUT (C),E
    EXX
    LD A,(HL)
    EX AF,AF
    LD (HL),A
    INC HL
    EXX
    OUT (C),D
    EX AF,AF
    LD (HL),A
    INC HL
    EXX
    DEC C
    JR NZ,$-18
    DJNZ $-20

№ 3. Быстрая печать текста на 32 символа в строке.

На входе:

DE - куда печатать (адрес экрана)

BC - адрес текста (конец 0)


;49 байт
    DI
    LD (stk+1),SP
print    LD A,(BC)
    OR A
    JR Z,stk
    LD L,A
    ADD HL,HL
    LD H,15
    ADD HL,HL
    ADD HL,HL
    LD SP,HL
    EX DE,HL
    !ASSM 4
    POP DE
    LD (HL),E
    INC H
    LD (HL),D
    INC H
    !CONT
    ORG $-1
    EX DE,HL
    LD A,D
    SUB 7
    LD D,A
    INC BC
    INC E
    JR print
stk    LD SP,0
    EI

№ 4. Процедура предназначена для распаковки картинок формата multi studio 2. 1 (с расширением «p») в более приемлемый вид. На авторство я не претендую, процедуру написал Disabler/OHG/DPL, но я неплохо ее оптимизировал.


;44 байта.
    LD HL,адрес 
        пакованной 
        картинки
    LD B,L
    EXX
    LD HL, куда распаковывать (буфер размером 12288 байт (3 RGB спрайта размером 4096 байт.)
    LD C,6
mu02    PUSH HL
    LD B,8
mu03    EXX
    DEC B
    INC B
    JR NZ,mu04
    LD A,(HL)
    CP 154
    INC HL
    JR NZ,mu05
    LD C,(HL)
    INC HL
    LD B,(HL)
    INC HL
mu04    DEC B
    LD A,C
mu05    EXX
    LD (HL),A
    INC H
    DJNZ mu03
    LD D,H
    POP HL
    INC L
    JR NZ,mu02
    LD H,D
    DEC C
    JR NZ,mu02

* * *


Максим Торгунаков (TMA), г. Красноярск


№ 1. Обмен байтов между областями памяти. Без учета страниц.

На входе:

HL - откуда

DE - куда

BC - сколько


;9 байт.
    LD A,(DE)
    LDI
    DEC HL
    LD (HL),A
    INC HL
    JP PE,$-6

№ 2. Заполнение памяти, произвольным байтом.

На входе:

DE - адрес конца области + 1

B - длинна области*256

C - байт заполнения


;144 байта.
    DI
    LD HL,0
    ADD HL,SP
    EX DE,HL
    LD SP,HL
    EX DE,HL
    LD D,C
    LD E,C
    !ASSM 128
    PUSH DE
    !CONT
    DEC B
    JP NZ,$-129
    LD SP,HL
    EI

№ 3. Генератор случайных чисел. На один байт больше чем в «Абзаце» #26 и медленнее работает, зато лучше «перемешивает».


;11 байт
rnd    LD A,53
    ADD A,A
    JR NC,$+5
    LD C,51
    XOR C
    LD (rnd+1),A

№ 4. Быстрое рисование окружности.

Сначала декранч.


    LD HL, адрес килобайтной таблички.
    LD DE,#57e0
    LD BC,#80
l0    LD (HL),E
    INC H
    LD (HL),D
    DEC H
    LD A,D
    DEC D
    AND 7
    JR NZ,l1
    LD A,E
    ADD A,#e0
    LD E,A
    SBC A,A
    AND 8
    ADD A,D
    LD D,A
l1    INC L
    LD A,L
    XOR #c0
    JR NZ,l0
l2    LD (HL),A
    INC H
    LD (HL),A
    DEC H
    INC L
    JR NZ,l2
    INC H
    INC H
l3    LD (HL),A
    INC H
    LD (HL),C
    RRC C
    ADC A,B
    DEC H
    INC L
    JR NZ,l3

Сама процедура.

На входе:

HL - координаты Y,X

A - радиус (нельзя задавать 0)


    EXX
    LD B,#60
    EXX
    LD B,A
    LD C,0
    RRA
loop EX    AF,AF
    LD A,H
    ADD A,B
    JR C,skip0
    CP #c0
    JR NC,skip0
    LD LX,A
    LD A,L
    ADD A,C
    CALL NC,plot
    LD A,L
    SUB C
    CALL NC,plot
skip0    LD A,H
    SUB B
    JR C,skip1
    LD LX,A
    LD A,L
    ADD A,C
    CALL NC,plot
    LD A,L
    SUB C
    CALL NC,plot
skip1    LD A,H
    ADD A,C
    JR C,skip2
    CP #c0
    JR NC,skip2
    LD LX,A
    LD A,L
    ADD A,B
    CALL NC,plot
    LD A,L
    SUB B
    CALL NC,plot
skip2    LD A,H
    SUB C
    JR C,skip3
    LD LX,A
    LD A,L
    ADD A,B
    CALL NC,plot
    LD A,L
    SUB B
    CALL NC,plot
skip3    EX AF,AF
    INC C
    SUB C
    JR NC,loop
    DEC B
    ADD A,B
    EX    AF,AF
    LD A,B
    CP C
    JR NC,loop+1
    RET
plot    EXX
    LD E,A
    LD D,LX
    LD H,B
    LD L,D
    LD A,(HL)
    INC H
    LD D,(HL)
    INC H
    LD L,E
    OR (HL)
    LD E,A
    INC H
    LD A,(DE)
    OR (HL)
    LD (DE),A
    EXX
    RET

Совокупный размер декранча и процедуры 166 байт.


* * *



;by Axor
;HL=HL*128, 35 тактов
    LD A,L 
    RRC H
    RRA
    LD H,A
    LD L,0
    RR L