SUB SAVE_IT(N) 'UNCOMMENT TO BE ABLE TO SAVE IT SAVE 7,"ANIMATION V2.1 SP4CEBAR",$A000+OFFSET,N END SUB OFFSET=1024 GLOBAL OFFSET 'A SET OF RESERVED CHARACTERS 'ONE OR TWO LAYERS OF SPRITES '256 = 4 CHARACTERS '- 16X16 1:1 'RAM: ANIMATION 'A BYTE FOR EACH PIXEL '256 BYTES 'FIRST TEST 'RAM: IMAGE MAP - 2-BIT COLOR '256*2 BIT = 64 BYTES 'CHARACTER CODEX: 4 CHARACTERS '2ND VERSION 'RAM: IMAGE MAP - 4-BIT COLOR '256*4 BIT = 128 BYTES 'CHARACTER CODEX: 8 CHARACTERS 'ANIMATION 2 '3 BYTES PER BLOCK 'P0,P1,P2 'POSITION 0 TO POSITION 1 ON THE MAP (RECTANGLE) GET COPIED TO POSITION 2 ON THE OUTPUT IMAGE 'THE STOP CODE REPEATS THE LAST COMMAND (COMMANDS ARE ALL UNIQUE) 'TOOL TO COPY IT OVER 'ENCODE CHARACTER 'IMPORT COWBOY MAN AS A TEST 'THE CHARACTER MAP IMAGES ARE DRAWN IN GFX DESIGNER 'THE ANIMATION IS DEFINED WITH DATA TOUCHSCREEN BG 0 'DISP CHARS FOR IY=8 TO 15 FOR IX=0 TO 7 CELL IX,IY-8,0+IX+IY*16 NEXT IX NEXT IY 'DISP CHARS FIELD 2 FOR IY=8 TO 15 FOR IX=8 TO 15 CELL IX,IY-8,0+IX+IY*16 NEXT IX NEXT IY BG 1 PAL 2 'DISP CHARS FIELD 3 FOR IY=0 TO 7 FOR IX=8 TO 15 CELL IX,IY,0+IX+IY*16 NEXT IX NEXT IY PAL 0 IF 0 THEN FOR IY=0 TO 15 FOR IX=0 TO 15 CELL IX,IY,IX+IY*16 NEXT IX NEXT IY END IF BG 0 'CALL SCALE_DISP(0,0,1,128,1,2) CALL SCALEX4(1,128,1) CALL CLEAR_C($8000,4,3) 'FIRST COLLUMN (X=0) OF OUTPUT IS MISSING 'FILES N=0 DO CALL BOX(-3,-3,58,58) IF TAP AND TOUCH.Y>63 THEN 'CLEAR BUTTON (NEXT FRAME) CALL CHAR_ID_COPY($8000,136,8,7) CALL CLEAR_C($8000,4,3) CALL CLEAR_C($8000,136,7) CALL WRITEEND(N) CALL SAVE_IT(N) ELSE IF TAP AND TOUCH.X>72 THEN X0=SPRITE.X(0)\4+1 Y0=SPRITE.Y(0)\4+1 X1=SPRITE.X(1)\4+1 Y1=SPRITE.Y(1)\4+1 'X2=((TOUCH.X-64)\4)-1 'Y2=((TOUCH.Y )\4)+1 X2=((TOUCH.X-64)\2)-1 Y2=((TOUCH.Y )\2)+1 'X2=((TOUCH.X-64)) 'Y2=((TOUCH.Y )) CALL COPYO3(X0,Y0,X1,Y1,X2,Y2-8,1,4) 'CALL SCALEX4(20,136,1) CALL SCALE_UP($8000,$8000,4,3,136) TRACE N,X0,Y0,X1,Y1,X2,Y2 CALL WRITEDOWN(N,X0,Y0) CALL WRITEDOWN(N,X1,Y1) CALL WRITEDOWN2(N,X2,Y2) CALL SAVE_IT(N) END IF WAIT VBL LOOP SUB WRITEDOWN(N,X,Y) POKE $A000+OFFSET+N,(X MOD 16)+16*(Y MOD 16) INC N END SUB SUB WRITEDOWN2(N,X,Y) POKE $A000+OFFSET+N,X INC N POKE $A000+OFFSET+N,Y INC N END SUB SUB WRITEEND(N) 'REPEAT THE LAST COMMAND IF N<4 THEN EXIT SUB COPY $A000+OFFSET+N-4,4 TO $A000+OFFSET+N ADD N,4 END SUB 'S U B P R O G R A M S SUB CHAR_ID_COPY(A00,C0,C1,S) FOR IY=0 TO S COPY A00+C0*16+IY*256,(S+1)*16 TO A00+C1*16+IY*256 NEXT IY END SUB SUB TRASH 'CALL CHAR_COPY(1,X0,Y0,X1,Y1,136,X2,Y2) 'CALL CHAR_COPY2(1,X0,Y0,X1,Y1,136,X2,Y2) END SUB SUB CHAR_COPY2(C0,X0,Y0,X1,Y1,C1,X2,Y2) 'FOR I=0 TO 2 'CALL CLEAR_C($8000,4+I,2) 'NEXT I CALL CCOP6(C0,X0,Y0,C1,X2,Y2,1,0,0,X1,Y1) END SUB SUB SCALEX4(C0,C1,S) S1=(S+1)*2-1 'TEMPORARY CHARACTERS START 'CT=76 CT=0 CALL SCALE_UP($8000,$A000,C0,S,CT) CALL SCALE_UP($A000,$8000,CT,S1,C1) CALL CLEAR_C($A000,CT,S1) 'USE WORKING RAM FOR THE TEMPORARY SIZE IN BETWEEN END SUB SUB COPYO3(X0,Y0,X1,Y1,X2,Y2,C0,C1) 'PARAMETER EXCHANGE BOX TO PATCH UP THE MESS W=31 H=31 'W=15 'H=15 CALL CCOP6(C0,C1,X2+1-X0,Y2+8-Y0,W,H,X0+7,Y0,W-X1,H-Y1) 'CCOP6(C0,C22,X22,Y22,W,H,CXXX0,CY0,CXXX1,CY1) END SUB 'SIZE UP AND X,Y SHIFTING AND CROPPING FROM THE END AND CROPPING FROM THE START SUB CCOP6(C0,C22,X22,Y22,W,H,CXXX0,CY0,CXXX1,CY1) 'CROP 1: SHIFT UP-LEFT, CROP 'CROP 2: CROP FROM BOTTOM-RIGHT 'BITWISE CROPPING (BITWISE AND) FOR X 'LOGICAL CROPPING FOR UPY 'CX0=4 'CY0=4 'CX1=4 'CY1=4 C2=C22+INT(X22/8)+INT(Y22/8)*16 X2=X22-INT(X22/8)*8 Y2=Y22-INT(Y22/8)*8 CX1=CXXX1-INT(CXXX1/8)*8 CX0=7-(CXXX0-INT(CXXX0/8)*8) X3=X2 E0=2^( -X3) 'E1=2^(8-X3) E1=E0*256 CXX0=CX0-X2 CXX1=CX1-X2 'ADD CXX1,-INT(CXX1/8)*8 M0A=2^(CXX0 )-1 M0B=2^(CXX0+8)-1 M1A=255 XOR (2^MAX(0,MIN(7,CXX1 ))-1) M1B=255 XOR (2^MAX(0,MIN(8,CXX1+8))-1) 'M1A=255 XOR (2^CXX1 -1) 'M1B=255 XOR (2^CXX1+8-1) 'S=W\8 -MAX(0,INT(CXXX1\8)) S=W\8 -INT(CXXX1\8) S00=-1+INT(CXXX0\8) FOR X=S00 TO S FOR YY=CY0 TO H-CY1 YYY=YY+Y2 A0=$8000+(C0+X)*16+YY+(YY\8)*(256-8) A1=$8000+(C2+X)*16+YYY+(YYY\8)*(256-8) IF (MIN(A0,A1)>=$8000) AND MAX(A0,A1)<$9000 THEN IF X=S AND X=S00 THEN M2=M0A AND M1A M3=M0B AND M1B ELSE IF X=S THEN 'IT SHOULD MOVE TOGETHER WITH X2 M2=M1A M3=M1B ELSE IF X=S00 THEN M2=M0A M3=M0B ELSE M2=255 M3=255 END IF POKE A1 ,PEEK(A1 ) OR ((PEEK(A0 )*E0) AND M2) POKE A1+8 ,PEEK(A1+8 ) OR ((PEEK(A0+8)*E0) AND M2) POKE A1+16,PEEK(A1+16) OR ((PEEK(A0 )*E1) AND M3) POKE A1+24,PEEK(A1+24) OR ((PEEK(A0+8)*E1) AND M3) END IF NEXT YY NEXT X END SUB SUB CHAR_COPY(C0,X0,Y0,X1,Y1,C2,X2,Y2) DX=X2-X0 DY=Y2-Y0 E0=2^(X0\8) E1=2^(X2\8) E2=E0/E1 E3=1/E2 FOR XX=X0\8 TO X1\8 FOR YY=Y0 TO Y1 Y=YY+(YY\16)*(256-16) A=$8000+Y+(C2+XX)*16 A1=$8000+Y+(C0+XX)*16 POKE A,PEEK(A) OR PEEK(A1) 'POKE 'POKE 'POKE NEXT YY NEXT XX END SUB SUB CLEAR_C(A00,C,S) 'A00=$8000 A=A00+C*16 FOR IY=0 TO S FILL A+IY*256,16*(S+1) NEXT IY END SUB SUB BOX(X0,Y0,X1,Y1) IF TOUCH AND TOUCH.X<=63 THEN WHILE TOUCH X=MAX(X0,MIN(X1,(TOUCH.X\4)*4-2)) Y=MAX(Y0,MIN(Y1,(TOUCH.Y\4)*4-2)) SPRITE TAP+1,X,Y,16 SPRITE 3,SPRITE.X(0),Y,16 SPRITE 2,X,SPRITE.Y(0),16 DX=(TOUCH.X-SPRITE.X(0)<0)+1 DY=(TOUCH.Y-SPRITE.Y(0)<0)+1 SPRITE 0 PAL 1 FLIP 1-DX,1-DY SPRITE 1 PAL 1 FLIP DX, DY SPRITE 2 PAL 1 FLIP DX,1-DY SPRITE 3 PAL 1 FLIP 1-DX, DY WAIT VBL WEND END IF END SUB SUB SCALE_DISP(X,Y,C0,C1,S0,S1) 'S=(S0+1)*8-1 'DIM BMAP(S,S) 'CALL R_CHAR2(C0,BMAP()) 'CALL W_CHAR_S(C1,S1,BMAP()) 'DISP CHARS FOR IY=Y TO Y+3 FOR IX=X TO X+3 CELL IX,IY,C1+IX+IY*16 NEXT IX NEXT IY 'CALL DISP_BMP(X,Y,BMAP()) END SUB SUB W_CHAR2(C0,BMAP()) FOR Y=0 TO UBOUND(BMAP,2) STEP 8 FOR X=0 TO UBOUND(BMAP,1) STEP 8 C=C0+X*0.125+Y*2 A=$8000+C*16 FOR IY=0 TO 7 V0=0 V1=0 FOR IX=0 TO 7 E=2^(7-IX) V=BMAP(IX+X,IY+Y) V0=V0 OR (V AND 1)*E V1=V1 OR (V AND 2)*E NEXT IX POKE A+IY ,V0 POKE A+IY+8,V1*0.5 NEXT IY NEXT X NEXT Y END SUB SUB SCALE_UP(A00,A01,C0,S0,C1) 'A00=$8000 'A01=$8000 S=(S0+1)*8-1 FOR Y=0 TO S STEP 8 FOR X=0 TO S STEP 8 C=C0+X*0.125+Y*2 CC=C1+X*0.25+Y*4 A =A00+C *16 AA=A01+CC*16 FOR IY=0 TO 7 V0=PEEK(A+IY ) V1=PEEK(A+IY+8) FOR IX=0 TO 7 A0=AA+(IY MOD 4)*2+(IX\4)*16+(IY\4)*256 A1=A0+8 A2=A0+1 A3=A1+1 E=2^(7-IX) E0=2^(7-2*(IX MOD 4))/E V2=PEEK(A0) OR (V0 AND E)*E0*1.5 V3=PEEK(A1) OR (V1 AND E)*E0*1.5 POKE A0,V2 POKE A1,V3 POKE A2,V2 POKE A3,V3 NEXT IX NEXT IY NEXT X NEXT Y END SUB SUB W_CHAR(C,BMAP()) A=$8000+C*16 FOR IY=0 TO 7 V0=0 V1=0 FOR IX=0 TO 7 E=2^(7-IX) V=BMAP(IX,IY) V0=V0 OR (V AND 1)*E V1=V1 OR (V AND 2)*E NEXT IX POKE A+IY ,V0 POKE A+IY+8,V1*0.5 NEXT IY END SUB SUB R_CHAR2(C0,BMAP()) FOR Y=0 TO UBOUND(BMAP,2) STEP 8 FOR X=0 TO UBOUND(BMAP,1) STEP 8 C=C0+X*0.125+Y*2 A=$8000+C*16 FOR IY=0 TO 7 V0=PEEK(A+IY ) V1=PEEK(A+IY+8)*2 FOR IX=0 TO 7 E=2^(7-IX) BMAP(IX+X,IY+Y)=((V0 AND 1*E) OR (V1 AND 2*E))/E NEXT IX NEXT IY NEXT X NEXT Y END SUB SUB R_CHAR(C,BMAP()) TRACE C A=$8000+C*16 FOR IY=0 TO 7 V0=PEEK(A+IY ) V1=PEEK(A+IY+8)*2 FOR IX=0 TO 7 E=2^(7-IX) BMAP(IX,IY)=((V0 AND 1*E) OR (V1 AND 2*E))/E NEXT IX NEXT IY END SUB SUB DISP_BMP(X0,Y0,IMG()) FOR Y=0 TO UBOUND(IMG,1) FOR X=0 TO UBOUND(IMG,2) CELL X0+X,Y0+Y,48+IMG(X,Y) NEXT X NEXT Y END SUB 'TEST PALETTE 0 '#6:ANIMATION #0:DATA 00 #1:MAIN PALETTES 2F392400000B0601003E3A2A003F3C00 003F2A15003F2A15003F2A15003F2A15 #2:MAIN CHARACTERS 00000000000000000000000000000000 0000003C3C3C1C0000387E4014000000 00000000D8D80000D8D8D8D800000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 70808080000000000070404000000000 08081818080800B63C3C3C3C3C0C00DB F8F8D8D8D80000B6F8F8D8D8D8D8D8DB 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 FFFFFFFFFFFFFFFF0000000000000000 0000000000000000FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF