Этюды — Abzac


PeriodicalsAbzac2007 No. 31 → Этюды

Этюды

(c) Алексей Червов


Процедура печати 85 символов в строке. Печать происходит на двух экранах при помощи стандартного линейного двухкилобайтного шрифта на 64 символа в строке, прижатого к правому краю. Весь код занимает 256 байт.


font    EQU #60;Старший байт адреса шрифта.
        ORG #8000
        LD A,23
        LD BC,#7ffd
        OUT (C),A
;Очистка двух экранов (c) tiboh
        LD HL,#4000
        LD D,L
        LD E,L
cls        LD (HL),D
        SET 7,H
        LD (HL),E
        RES 7,H
        INC HL
        LD A,H
        CP #58
        JR C,cls
        LD DE,#4445;Атрибуты
        CP #5b
        JR NZ,cls
        LD DE,text; Адрес текста, в конце 0
        LD HL,#4000;Адрес экрана
        CALL print
key        LD A,23
        HALT
        XOR 8
        LD (key+1),A
        LD BC,#7ffd
        OUT (C),A
        LD A,#7f
        IN A,(#fe)
        RRA
        JR C,key
        RET
print    LD B,font+1
        PUSH DE,HL,HL
        EXX
        POP HL
        SET 7,H
        EXX
        CALL pr
        POP HL,DE
        INC H
        LD A,H
        AND 7
        JR NZ,$+11
        LD A,L
        SUB #e0
        LD L,A
        SBC A,A
        AND #f8
        ADD A,H
        LD H,A
        INC B
        LD A,B
        CP font+8
        JR C,print+2
        RET
pr        LD A,(DE)
        OR A
        RET Z
        LD C,A
        LD A,(BC)
        RLCA
        LD C,A
        AND 96
        LD (HL),A
        LD A,C
        EXX
        AND 128
        LD (HL),A
        EXX
        INC DE
        LD A,(DE)
        OR A
        RET Z
        LD C,A
        LD A,(BC)
        RLCA
        RLCA
        LD C,A
        AND 12
        OR (HL)
        LD (HL),A
        LD A,C
        EXX
        AND 16
        OR (HL)
        LD (HL),A
        EXX
        INC DE
        LD A,(DE)
        OR A
        RET Z
        LD C,A
        LD A,(BC)
        RRCA
        LD C,A
        AND 1
        OR (HL)
        LD (HL),A
        LD A,C
        AND 128
        INC L
        LD (HL),A
        LD A,C
        EXX
        AND 2
        OR (HL)
        LD (HL),A
        INC L
        EXX
        INC DE
        LD A,(DE)
        OR A
        RET Z
        LD C,A
        LD A,(BC)
        AND 48
        OR (HL)
        LD (HL),A
        LD A,(BC)
        EXX
        AND 64
        LD (HL),A
        EXX
        INC DE
        LD A,(DE)
        OR A
        RET Z
        LD C,A
        LD A,(BC)
        RLCA
        LD C,A
        AND 6
        OR (HL)
        LD (HL),A
        LD A,C
        EXX
        AND 8
        OR (HL)
        LD (HL),A
        EXX
        INC DE
        LD A,(DE)
        OR A
        RET Z
        LD C,A
        LD A,(BC)
        RLCA
        RLCA
        LD C,A
        AND 192
        INC L
        LD (HL),A
        LD A,C
        EXX
        AND 1
        OR (HL)
        LD (HL),A
        INC L
        EXX
        INC DE
        LD A,(DE)
        OR A
        RET Z
        LD C,A
        LD A,(BC)
        RRCA
        LD C,A
        AND 24
        OR (HL)
        LD (HL),A
        LD A,C
        EXX
        AND 32
        LD (HL),A
        EXX
        INC DE
        LD A,(DE)
        OR A
        RET Z
        LD C,A
        LD A,(BC)
        AND 3
        OR (HL)
        LD (HL),A
        LD A,(BC)
        EXX
        AND 4
        OR (HL)
        LD (HL),A
        INC L
        EXX
        INC L
        INC DE
        JP pr

Печать десятичных чисел без нуля. 59 байт.


        LD IX,Буфер 5 байт
        LD HL,Число
        LD BC,0
        LD DE,0-10000
        CALL num
        LD DE,0-1000
        CALL num
        LD DE,0-100
        CALL num
        LD DE,0-10
        CALL num
        LD A,L
        JR num2
num        ADD HL,DE
        INC B
        JR C,$-2
        DEC B
        SBC HL,DE
        LD A,B
        OR C
        RET Z
        LD C,A
        LD A,B
num2    ADD A,48
        LD (IX),A
        INC IX
        LD B,0
        RET

(c) 2k by groove^tnl

На 0...240 секторов вперед.

IN: DE,текущий_трек/сектор

    B,количество_перепрыгиваемых_секторов

OUT: DE = новые_трек/сектор


        LD    A,B
        ADD    A,E
        LD    B,A
        AND    #F
        LD    E,A
        LD    A,D
        DUP    4 ;Повторить
        SRL    B ;блок 4 раза
        EDUP 
        ADD    A,B
        LD    D,A
        RET

На 0...65520 секторов вперед.

IN: DE,текущий_трек/сектор

    HL,количество_перепрыгиваемых_секторов

OUT: DE = новые_трек/сектор


        LD    B,0
        LD    C,E
        ADD    HL,BC
        LD    A,L
        AND    #F
        LD    E,A
        DUP    4 ;Повторить
        RR    H ;блок 4 раза
        RR    L
        EDUP 
        LD    A,L
        ADD    A,D
        LD    D,A
        RET

(c) SAM style

На 0...256 секторов назад.


        ld de,track_sector
        ld b,delta
        ld a,e
        sub b
        ld e,a
        ret nc
lab1    dec d
        add a,16
        jr nc,lab1
        ld e,a
        ret

На 0...65520 секторов назад.


        ld de,track_sector
        ld hl,delta
        ld a,l
        and 15
        rr h
        rr l
        sra h
        rr l
        sra h
        rr l
        sra h
        rr l
        ld h,l
        ld l,a
        ld a,e
        sub l
        jr nc,lab1
        dec d
lab1    and 15
        ld e,a
        ld a,d
        sub h
        ld d,a
        ret