;z80
;zx-spectrum
;assembler

;PLASMA ANIMATION  Dark/X-trade
;2 SCREEN USED

;1 SEC TO CREATE PLASMA 64*48
;MAXVALUE=63

IMGOFS  EQU #38

TIME0   EQU 144
TIME1   EQU 98

PMX     EQU 65
PMY     EQU 48
HGT     EQU 48
CHUNKY  EQU #8000;DON'T CHANGE
DTAB    EQU #B000;1K -DITHER TAB
PALTB   EQU #B400;PAL TRANSLATE
SATB    EQU #B500;SCR ADDRESS
DITBASE EQU #B600;DITHER DCR
INT     EQU #BE00;INT TABLE
INT2    EQU INT+#0100+(INT[)+1
MUSIC   EQU #C006

        ORG #6000

;        DI
;        LD A,#51:OUT (#FD)
;        LD HL,LMS,DE,#C000
;        LD BC,10000:LDIR
;        LD A,#CD:LD (#C25F),A
;        LD HL,CHMUS,(#C260),HL
;        CALL #C000
;        LD A,#50:OUT (#FD)

        LD HL,INT
        LD A,H:LD I,A
        IM 2
        INC A
        LD (HL),A:INC L
        JR NZ,$-2
        INC H:LD (HL),A
        LD A,#C3
        LD (INT2),A
        LD HL,INTSRV
        LD (INT2+1),HL
        XOR A:LD (TIME),A

        LD (INTSRV2+1),SP

        CALL CLATTR
        CALL INIT

        EI:HALT

SEQ     XOR A:LD (TIME),A
DTSEQ   LD HL,SEQDAT
        LD A,(HL):INC HL
        CP #FF:JP Z,EXIT
        LD (COLOR),A
        LD A,(HL):INC HL
        LD (COLORN),A
        LD A,(HL):INC HL
        LD (EXTIME),A
        LD E,(HL):INC HL
        LD D,(HL):INC HL
        LD (IMAGE),DE
        LD (DTSEQ+1),HL

NEWPLSM
        LD A,#5F:LD (BANK),A
        XOR #08:OUT (#FD)
        LD HL,COLOR
        LD A,(HL)
.3      RRCA
        AND 7
        LD C,A,(BORDER),A
        OUT (#FE)
        LD A,(HL)
        AND #38
        OR C
        LD HL,#5800
        CALL FLASH
        CALL DRIMAGE
        LD A,(COLOR)
        LD HL,#D800
        CALL FLASH
        CALL DRIMAGE
        LD HL,#4000
        CALL FLASH2
;        SET 7,H
;        CALL FLASH2
        CALL GENPLSM

        LD A,#58+6
        LD (BANK),A
        XOR #08:OUT (#FD)
        LD BC,0
WTP     LD HL,(#C31C)
        LD DE,#CAA3
        OR A:SBC HL,DE
        LD A,L
        AND C:CP B
        JR NZ,WTP1
        LD C,#FF,B,L
        JR WTP

WTP1    XOR A:LD (TIME),A
        LD (#5C00),A

        LD A,#5F:LD (BANK),A
        XOR #08:OUT (#FD)
        CALL DISPLAY

        EI:HALT
        LD A,#55:LD (BANK),A
        XOR #08:OUT (#FD)

        LD A,(COLOR)
        LD HL,#5800
        CALL FLASH
        CALL DRIMAGE

LOOP1   CALL DISPLAY
        LD HL,BANK
        LD A,(HL):XOR #0A:LD (HL),A
        EI:HALT
        JR LOOP1



DRIMAGE LD L,IMGOFS
        LD DE,(IMAGE)
        LD A,(COLORN):LD C,A
        LD B,7
DRIMG   LD A,(DE):INC DE
.7      RLA:JR NC,$+3:LD (HL),C:INC L
        LD A,25:ADD A,L:LD L,A
        DJNZ DRIMG
        SCF
        RET

FLASH   LD DE,HL:INC DE
        LD BC,767
        LD (HL),A
        JR FLASH3
FLASH2  LD DE,HL:INC DE
        LD BC,#17FF
        LD (HL),L
FLASH3  PUSH HL
        LDIR
        POP HL
        RET

DISPLAY LD HL,SATB
        LD B,DTAB[
        EXX
        LD HL,CHUNKY
        LD DE,PALTB
        LD B,HGT
DISP1   EXX
        LD E,(HL):INC L
        LD D,(HL):INC L
        CALL DITBASE
        EXX
        INC H:LD L,0
        DJNZ DISP1
        RET

CLATTR  LD A,#5F
        LD (BANK),A
        EI:HALT
        LD HL,#5AFF
        CALL CLATR
        LD HL,#DAFF
CLATR   LD DE,HL
        DEC DE
        LD BC,#1AFF
        XOR A
        LD (HL),A
        LDDR
        LD HL,BORDER
        LD (HL),A
        RET

INTSRV  PUSH AF,HL,DE,BC,IX
        EXX:EXA
        PUSH AF,HL,DE,BC,IY
;        LD A,#7F:IN (#FE):RRA
;        JP NC,EXT
        LD A,(BORDER)
        OUT (#FE),A
        LD A,#56:OUT (#FD),A
        CALL MUSIC
        LD HL,#5C00:INC (HL)
        LD A,(BANK)
        XOR 8:OUT (#FD),A
        LD A,(TIME)
        INC A
        LD (TIME),A
EXTIME  EQU $+1
        CP 144:JR NC,INTSRV2
        EXA
        POP IY,BC,DE,HL,AF
        EXX:EXA
        POP IX,BC,DE,HL,AF
        EI
        RET

INTSRV2 LD SP,0:EI
        JP SEQ

GENPLSM CALL PLASMA

CONVERT LD HL,CHUNKY
        LD LX,48
CNV1    LD B,32
        LD DE,HL
CNV2    LD A,(HL):INC L
        AND #F0>>2
.2      RLCA
        LD C,A
        LD A,(HL):INC L
        AND #F0>>2
.2      RRCA
        OR C
        LD (DE),A:INC E
        DJNZ CNV2
        INC H:LD L,0
        DEC LX
        JR NZ,CNV1
        RET

DTCD    EXX
        LD E,(HL):LD A,(DE)
        LD (HL),A:INC L
        EXX
        LD C,A
.3      LD A,(BC),(DE),A:INC B,D
        LD A,(BC):LD (DE),A:INC E
        EXX
        LD E,(HL):LD A,(DE)
        LD (HL),A:INC L
        EXX
        LD C,A
.3      LD A,(BC),(DE),A:DEC B,D
        LD A,(BC):LD (DE),A:INC E
EDTCD

INIT    ;INIT PROG

;CREATE DITHER TABLE
        LD HL,DTAB
CRDT0   LD A,L:AND #F0
.2      RRCA
        LD DE,DTDAT
        ADD A,E:LD E,A
        ADC A,D:SUB E:LD D,A
        LD B,4
CRDT1   LD A,(DE):INC DE
        AND #F0
        LD (HL),A:INC H
        DJNZ CRDT1
        LD A,L:AND #0F
.2      RLCA
        LD DE,DTDAT+4
        ADD A,E:LD E,A
        ADC A,D:SUB E:LD D,A
        LD B,4
CRDT2   DEC DE:LD A,(DE)
        AND #0F
        DEC H:OR (HL)
        LD (HL),A
        DJNZ CRDT2
        INC L:JR NZ,CRDT0

;CREATE PALETTE TAB
CRPTB   LD HL,PALTB
        LD DE,#F00F
CPT0    LD A,L:AND E
        INC A
        CP E:JR C,CPT1
        JR Z,CPT1
        XOR A
CPT1    LD C,A
        LD A,L:AND D
        ADD A,#10
        CP D:JR C,CPT2
        JR Z,CPT2
        XOR A
CPT2    OR C
        LD (HL),A
        INC L
        JR NZ,CPT0

;DCR DITHER+INC PROG
DCRDIT  LD DE,DITBASE
        PUSH DE
        LD HL,DTCD
        LD BC,EDTCD-DTCD
        LDIR
        POP HL
        LD BC,(EDTCD-DTCD)*15
        LDIR
        DEC DE
        LD A,#C9
        LD (DE),A

;SCREEN ADR TAB
CRSATB  LD IX,SATB
        LD HL,#C000
        LD B,48
CSAT0   LD (IX+0),L
        LD (IX+1),H
.2      INC IX
        LD A,H:ADD A,4:LD H,A
        AND 7:JR NZ,CSAT1
        LD A,L:ADD A,#20:LD L,A
        JR C,CSAT1
        LD A,H:SUB 8:LD H,A
CSAT1   DJNZ CSAT0
        RET

;PLASMA MAIN ROUTINES

PLASMA  LD (PLSP+1),SP
        LD HL,CHUNKY+PMY*256+PMX-255
        LD DE,0
        LD B,PMY
PLS1    LD SP,HL
.33     PUSH DE
        DEC H
        DJNZ PLS1
PLSP    LD SP,0

        LD IX,X1
        LD HL,0
        LD (X1),HL
        LD HL,(PMY-1)*256!PMX-1
        LD (X2),HL

        LD HL,(X1)
        CALL SETRND
        LD L,(IX+0)
        LD H,(IX+3)
        CALL SETRND
        LD HL,(X2)
        CALL SETRND
        LD L,(IX+2)
        LD H,(IX+1)
        CALL SETRND
        LD HL,(X1)
        LD DE,(X2)
        CALL SUBDIV
        RET

SETRND  SET 7,H
        LD A,R:AND #3F
        JR NZ,$+3:INC A
        LD (HL),A
        RET

;SUBDIVIDE
SUBDIV  LD A,E:SUB L
        CP 2
        RET C
        EXX
        LD HL,(X1):PUSH HL
        LD HL,(X2):PUSH HL
        LD HL,(X):PUSH HL
        EXX

        LD (X1),HL
        LD (X2),DE

        LD (DX),A
        LD A,D:SUB H
        LD (DY),A

        LD A,L
        ADD A,E
        RRA:LD (X),A
        LD L,A
        LD A,H
        ADD A,D
        RRA:LD (Y),A
;L=X
        LD DE,(X1)
        LD H,D,B,D
        LD A,(X2),C,A
        LD A,(DX)
;L=X H=B=D=Y1 E=X1 C=X2 A=DX
        CALL NEWDOT

        LD BC,(X2)
        LD L,C,E,C
        LD A,(Y),H,A
        LD A,(Y1),D,A
        LD A,(DY)
;L=E=C=X2 H=Y D=Y1 B=Y2 A=DY
        CALL NEWDOT

        LD DE,(X2)
        LD H,D,B,D
        LD A,(X),L,A
        LD A,(X1),C,A
        LD A,(DX)

;L=X E=X2 H=B=D=Y2 C=X1 A=DX
        CALL NEWDOT

        LD DE,(X1)
        LD L,E,C,E
        LD A,(Y),H,A
        LD A,(Y2),B,A
        LD A,(DY)
;H=Y D=Y1 L=C=E=X1 B=Y2 A=DY
        CALL NEWDOT

        LD HL,(X)
        SET 7,H:LD A,(HL)
        OR A:JR NZ,SD1
        EX DE,HL
        LD HL,(X1)
        SET 7,H:LD A,(HL)
        LD H,(IX+3);X1,Y2
        SET 7,H:ADD A,(HL)
        LD HL,(X2)
        SET 7,H:ADD A,(HL)
        LD H,(IX+1);X2,Y1
        SET 7,H:ADD A,(HL)
        RRA:SRL A
        EX DE,HL
        JR NZ,$+3:INC A
        LD (HL),A

SD1     LD HL,(X1)
        LD DE,(X)
        CALL SUBDIV

        LD HL,(X),D,H
        LD A,(Y1),H,A
        LD A,(X2),E,A
;L=X H=Y1 E=X2 D=Y
        CALL SUBDIV

        LD HL,(X)
        LD DE,(X2)
        CALL SUBDIV

        LD HL,(X),E,L
        LD A,(X1),L,A
        LD A,(Y2),D,A
;H=Y L=X1 E=X D=Y2
        CALL SUBDIV

        POP HL:LD (X),HL
        POP HL:LD (X2),HL
        POP HL:LD (X1),HL

        RET

;HL=1/2
;DE=3/4 BC=5/6
;A=7
NEWDOT  EXA
        SET 7,H:LD A,(HL)
        OR A:RET NZ
        PUSH HL
        SET 7,B:LD A,(BC)
        EX HL,DE
        SET 7,H:ADD A,(HL)
        RRA:LD B,A
        EXA
.1      ADD A,A;SCALE
        LD E,A

;A-RANDOM. DON'T USE E,B
RND     LD A,#90
        ADD A,A
        JR NC,$+4
        XOR 12
        LD (RND+1),A

;MULS A,E   A(7)-SIGN
.2      RL E
        LD C,0:LD D,C:LD L,C
        BIT 7,A:JR Z,$+5
        NEG:INC C
        LD H,A
.6      ADD HL,HL:JR NC,$+3:ADD HL,DE
        LD A,H
        DEC C:JR NZ,$+4
        NEG
        ADD A,B
        JR NZ,$+3:INC A
        CP #40
        JR C,$+4:LD A,#3F
        POP HL
        LD (HL),A
        RET

EXIT    LD A,#58:LD (BANK),A
        XOR #08:OUT (#FD)
        LD HL,#5800,DE,#5801
        LD BC,#02FF,(HL),L
        LDIR
        EI:HALT
        RET

;EXT     DI
;        XOR A:LD H,A
;        LD DE,#FFBF
;        LD C,#FD
;MFM     LD B,D:OUT (C),A
;        LD B,E:OUT (C),H:INC A
;        CP 14:JR NZ,MFM
;        LD A,#C9:LD (#6000),A
;        LD A,#54:OUT (#FD)
;        JP #C000
;        RET
;
;CHMUS   PUSH BC
;        LD BC,32:ADD HL,BC
;        POP BC:RET

X1      DB 0
Y1      DB 0
X2      DB 0
Y2      DB 0
X       DB 0
Y       DB 0

DX      DB 0
DY      DB 0
COLOR   DB 0
COLORN  DB 0
IMAGE   DW 0
BORDER  DB 0
BANK    DB 0
POSIT   DB 0
TIME    DW 0

SEQDAT
        DB #4D,#29,TIME0
        DW IMG3
        DB #47,#38,TIME0
        DW IMG2
        DB #56,#32,TIME0
        DW IMG1
        DB #43,#18,TIME1
        DW IMG0
        DB #FF

IMG0    DB %11111110
        DB %11111110
        DB %11000110
        DB %11000110
        DB %11000110
        DB %11111110
        DB %11111110

IMG1    DB %11111000
        DB %11111000
        DB %00111000
        DB %00111000
        DB %00111000
        DB %11111110
        DB %11111110

IMG2    DB %11111110
        DB %11111110
        DB %00001110
        DB %11111110
        DB %11100000
        DB %11111110
        DB %11111110

IMG3    DB %11111110
        DB %11111110
        DB %00001110
        DB %00111110
        DB %00001110
        DB %11111110
        DB %11111110


DTDAT   ;16 COLORS DITHER DATA
        DB #00,#00,#00,#00
        DB #00,#00,#00,#00
        DB #88,#00,#00,#00
        DB #88,#00,#22,#00
        DB #AA,#00,#22,#00
        DB #AA,#00,#AA,#00
        DB #AA,#44,#AA,#00
        DB #AA,#44,#AA,#11
        DB #AA,#55,#AA,#55
        DB #AA,#DD,#AA,#77
        DB #AA,#77,#AA,#FF
        DB #AA,#FF,#AA,#FF
        DB #AA,#FF,#BB,#FF
        DB #EE,#FF,#BB,#FF
        DB #EE,#FF,#FF,#FF
        DB #FF,#FF,#FF,#FF

ECODE

;        ORG #8000
;LMS     INCB "M.EXE"
