;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"