Из журнала Deja Vu #06, Кемерово, 01.10.98



(C) Max/Cyberax Software/BD
__________________________________________

            Генерилка шариков
            -----------------

   Вот такие симпатичные шарики  (всего 16
фаз по #200 байт) генерирует нижеприведен-
ная процедура. Написана  она может быть не
совсем оптимально,  но работает неплохо.
   Вот и листинг:

        ORG   #6000
        ENT
;Written by Max/CBX/BD (1997).

PHASES  EQU   #8000; Фазы лежат здесь.
SIN     EQU   #6C00
        LD    HL,PHASES
        LD    DE,PHASES+1
        LD    BC,8*8*8*16-1
        LD    (HL),L
        LDIR
        LD    HL,S_DATA
        LD    DE,SIN
        LD    C,65
        LDIR
        LD    H,D
        LD    L,E
        DEC   L
        DEC   L
MK_SIN  LD    A,(HL)
        LD    (DE),A
        INC   E
        DEC   L
        JR    NZ,MK_SIN
        LD    C,#80
        LDIR
        CALL  CH_GEN
        LD    A,16
        LD    HL,PHASES+8
GEN_LP  PUSH  HL,AF
        SLA   A
        CALL  BALL
        POP   AF,HL
        LD    DE,8*8*8
        ADD   HL,DE
        DEC   A
        JR    NZ,GEN_LP
        LD    HL,10072
        EXX
        RET

BALL    LD    (CHESS+1),A
        EXX
        LD    B,#80
        LD    HL,SIN
        LD    DE,SIN+64
BALL1   LD    A,(DE)
        DEC   E
        SLA   A
        EXX
        LD    E,A
        LD    D,64
        LD    A,D
        PUSH  HL,DE
        SUB   E
        SRL   A
        LD    E,A
        SRL   E
        SRL   E
        SRL   E
        LD    D,0
        ADD   HL,DE
        POP   DE
        AND   7
        INC   A
        LD    B,A
        LD    A,1
ROLL    RRCA
        DJNZ  ROLL
        LD    B,A
CHESS   LD    C,0
        LD    A,(HL)
        OR    B
        LD    (HL),A
        CALL  CHAIN
        LD    A,(HL)
        OR    B
        LD    (HL),A
        POP   HL
        EXX
        LD    A,(HL)
        INC   L
        SUB   (HL)
        EXX
        JR    Z,C1
        LD    A,L
        ADD   A,8
        LD    L,A
        JR    NC,C1
        INC   H
C1      EXX
        LD    A,B
        AND   16
OLD     CP    0
        JR    Z,ENDL
        LD    (OLD+1),A
        LD    A,(CHESS+1)
        XOR   16
;Здесь можно воткнуть команду ADD A,5.
        LD    (CHESS+1),A
ENDL    DJNZ  BALL1
        RET

CH_GEN  LD    DE,CHAIN
        LD    B,#80
        EXX
        LD    HL,SIN
        EXX
CH_LP   PUSH  BC
        LD    HL,CH_EXMP
        LD    BC,NODOT-CH_EXMP
        LDIR
        LD    C,CHAIN-NODOT
        EXX
        LD    A,(HL)
        INC   L
        SUB   (HL)
        EXX
        JR    Z,JR_OK
        DEC   C
        DEC   C
        INC   HL
        INC   HL
JR_OK   LDIR
        POP   BC
        DJNZ  CH_LP
        LD    A,201
        LD    (DE),A
        RET

S_DATA  DB    #1F,#1F,#1F,#1F,#1F,#1F,#1F
        DB    #1F,#1E,#1E,#1E,#1E,#1E,#1D
        DB    #1D,#1D,#1D,#1C,#1C,#1C,#1B
        DB    #1B,#1B,#1A,#1A,#19,#19,#18
        DB    #18,#17,#17,#16,#16,#15,#15
        DB    #14,#14,#13,#12,#12,#11,#11
        DB    #10,#0F,#0F,#0E,#0D,#0D,#0C
        DB    #0B,#0A,#0A,#09,#08,#08,#07
        DB    #06,#05,#05,#04,#03,#02,#02
        DB    #01,#00

CH_EXMP BIT   4,C
        JR    Z,NODOT
        LD    A,(HL)
        OR    B
        LD    (HL),A
NODOT   JR    NOSTEP
        LD    A,D
        SUB   E
        JR    NC,NOADD
        ADD   A,64
        RRC   B
        JR    NC,NOADD
        INC   HL
NOADD   LD    D,A
NOSTEP  INC   C
CHAIN   EQU   $