Этюды — Abzac


PeriodicalsAbzac2006 No. 26 → Этюды

Этюды

Взято из журнала «Inferno 4». Описание и доказательство алгоритма там же.


;sqr hl
;HL=аргумент N
    OR A
    LD A,L
    LD L,H
    LD DE,64
    LD H,D
    LD B,8
sqr0    SBC HL,DE
    JR NC,$+3
    ADD HL,DE
    CCF
    RL D
    ADD A,A
    ADC HL,HL
    ADD A,A
    ADC HL,HL
    DJNZ sqr0
;D=результат

Переход на одну линию вниз в экране новым методом.

Е.Б. Голяков (Spencer Winset). Более подробно об этом методе читайте в электронной газете «Nicron» № 125.


DOWN_HL+    INC  H
    LD   A,H
    AND  #07
    JR   NZ,BREAK
    LD   A,L
    SUB  #E0
    LD   L,A
    SBC  A,A
    AND  #F8
    ADD  A,H
    LD   H,A
BREAK    ...

15b - 27/56t


Обмен значений двух битов в байте.

Владимир Минин (алгоритм), Александр Шушков (доработка).

Можно освободить регистр B, заменив команды and b и xor b на and X, xor X, тогда пропадет универсальность, но выиграем минимум один такт, максимум четыре.


;B-маска обмениваемых битов
    LD B,%00000101 
BitExch    ld C,A
    and b
    ld a,c
    jp pe,$+4
    xor b
    RET

A=HL/32

Синяков Александр (Sam Style). Использовано в игре «Вера».


HLdiv32    ADD HL,HL
    ADD HL,HL
    ADD HL,HL
    LD A,H
    RET

Ниже предствалены еще более короткие процедуры, по теме затронутой в статье «Направление движения или история одной процедурки» (газета «Абзац» № 20).

Обе процедуры преобразуют значение регистра BC в соответсивии с нижеприведенной таблицей.


    BC=#FFFF => a=0
    BC=#00FF => a=1
    BC=#01FF => a=2
    BC=#FF00 => a=3
    BC=#0100 => a=4
    BC=#FF01 => a=5
    BC=#0001 => a=6
    BC=#0101 => a=7

Вариант от Дмитрия Быстрова (Alone Coder), 8 байт.


Alco    LD A,C
    ADD A,A
    ADD A,C
    ADD A,B
    CP 9
    SBC A,-4
    RET

Вариант от Дмитрия Патютько (Pulsar), 8 байт.


Pulsar    LD A,C
    ADD A,A
    ADD A,C
    ADD A,B
    ADD A,4
    ADC A,-1
    RET

Генератор случайных чисел.

Milos «baze» Bazelides, {baze@stonline.sk}

На выходе: A = псевдослучайное число, период 256.


RANDOM    ld a,SEED ;SEED is usually 0
    ld b,a
    add a,a
    add a,a
    add a,b
    inc a ;you may try also ADD A,7
    ld (RANDOM+1),a
    ret

Короткий способ определить, что оба числа (A и B) не равны нулю. Если хотя бы одно из них равно нулю, то будет установлен флаг Z. Применено в ACEdit для проверки нажатия Extend.

Info Guide 7, Дмитрий Быстров



;(A<>0) AND (B<>0)
    add a,-1
    sbc a,a
    and b

Автор данного сборника этюдов из вышеприведенной конструкции вывел вот какую штуку:


    add a,-1
    sbc a,a
    inc a

После этого если было A=0, то будет A=255, если A<>0, то будет A=0.


Этюды собирал Александр Шушков