'OPTIMIZATIONS '- [DONE] DRAW LINE SEGMENTS INSTEAD OF PIXELS '- [IN PROGRESS] DRAW BLOCKS INSTEAD OF SEGMENTS USING THE FILL COMMAND ' - USES "FILL A,8,C0", WORKS ONLY FOR CENTER BLOCKS (THEY DON'T NEED OVERLAY) ' - IS GOING TO MORE THAN DOUBLE THE SPEED AGAIN ' - BUT IT HAS TO BE INTEGRATED IN EACH SHAPE '- REPEAT A GENERATED SHAPE DOWN (RECTANGLES) 'I GUESS THE HORIZONTAL LINES ARE GOOD FOR FLOOD FILL TOO 'S E T U P 'DEFINE ROM FOR FASTER PIXEL PROCESSING DIM GLOBAL LLINE_ROM(7),RLINE_ROM(7),PIXEL_ROM(7) FOR I=0 TO 7 LLINE_ROM(I)= 255 XOR 2^(7-I)-1 RLINE_ROM(I)= 2^(8-I)-1 PIXEL_ROM(I)= 2^(7-I) NEXT I 'TOUCHSCREEN 'POKE $FF72,80 BG VIEW OFF 1 CALL VIEW_CHARACTERS(2,0,0,255) 'CALL HLINE(30,20,50,3) 'CALL BAR(97,45,13,90,RND(3)) 'CALL BAR(60,80,10,20,1) DO 'TRACE TOUCH.X-80 'CALL BAR(RND(255),RND(255),RND(255),RND(255),RND(3)) 'FOR I=0 TO 27 STEP 10 'CALL BAR(20+I,30+I,40+I,50+I,RND(3)) 'NEXT I 'FOR I=0 TO 27 'CALL HLINE(20+I,0+I,50+I,RND(3)) 'NEXT I 'FOR I=0 TO 256 'CALL HLINE(RND(255),RND(255),RND(255),RND(3)) 'WAIT VBL 'NEXT I CALL BAR(RND(127),RND(127),RND(127),RND(127),RND(2)+1) 'FOR I=0 TO 0 'CALL BAR(RND(127),RND(127),RND(127),RND(127),RND(2)+1) 'NEXT I 'WAIT VBL 'WAIT 10 'FILL $8000,$1000 LOOP 'S U B P R O G R A M S SUB BAR(X1,Y1,X2,Y2,C) DY=-(Y2-Y1>0)*2-1 FOR Y=Y1 TO Y2 STEP DY CALL HLINE(X1,Y,X2,C) NEXT Y END SUB SUB DIAMOND END SUB SUB CIRCLE END SUB SUB OVERLAY2(A0,C0,C1) A1=A0+8 B0=PEEK(A0) B1=PEEK(A1) M=255 XOR (C0 OR C1) POKE A0,(B0 AND M) OR C0 POKE A1,(B1 AND M) OR C1 END SUB SUB XOR_MIX(A0,C0,C1) A1=A0+8 B0=PEEK(A0) B1=PEEK(A1) 'M=255 XOR (C0 OR C1) 'M=255 'POKE A0,(B0 AND M) XOR C0 'POKE A1,(B1 AND M) XOR C1 POKE A0,B0 XOR C0 POKE A1,B1 XOR C1 END SUB SUB PLOT(X,Y,C) A=$8000+(Y\8)*256+(X\8)*16+(Y MOD 8) N=2^(7-(X MOD 8)) 'IF C MOD 2 THEN POKE A ,PEEK(A ) OR N 'IF C\2 THEN POKE A+8,PEEK(A+8) OR N C0=N*(C MOD 2 ) C1=N*(C\2) CALL OVERLAY2(A,C0,C1) 'POKE A ,PEEK(A ) OR (2^N * C MOD 2) 'POKE A+8,PEEK(A+8) OR (2^N * C\2) END SUB SUB HLINE(X0,Y,X1,C) IF X0>X1 THEN SWAP X0,X1 'PREPARE: COLOR, 8-PIXEL SEGMENT, ADDRESS, QUANTIZED COORDINATES C0=C MOD 2 C1=C\2 C0L=C0*255 C1L=C1*255 A0=$8000+(Y\8)*256+(Y MOD 8) X0Q=(X0\8)*8 X1Q=(X1\8)*8 'LEFT SEGMENT: ADDRESS, BINARY LINE, DRAW A=A0+X0Q*2 N=RLINE_ROM(X0 MOD 8) CALL XOR_MIX(A,N*C0,N*C1) 'LINE: ADDRESS, DRAW (DOESN'T NEED OVERLAY AND SEGMENT IS ALWAYS 255) FOR X=X0Q+8 TO X1-8 STEP 8 A=A0+X*2 POKE A ,C0L POKE A+8,C1L NEXT X 'RIGHT SEGMENT A=A0+X1Q*2 N=LLINE_ROM(X1 MOD 8) CALL XOR_MIX(A,N*C0,N*C1) 'REQUIRED ROM DEFINITIONS: 'RLINE_ROM(I MOD 8) = 2^(8-(I MOD 8))-1 'LLINE_ROM(I MOD 8) = 255 XOR 2^(7-(I MOD 8))-1 'BUG MEMORIAL: (X0\8)*8 INSTEAD OF X0, FIRST CASE WAS SHOVED UNDER THE RUG BY OFFSETS 'DEBUGGING TOOL: 'CALL PLOT(X0,Y,3) 'CALL PLOT(X1,Y,3) END SUB SUB HLINE_ORIGINAL(X0,Y,X1,C) 'SPLIT COLOR VALUE C0=C MOD 2 C1=C\2 'PREPARE ADDRESS A0=$8000+(Y\8)*256+(Y MOD 8)-8 'LEFT SEGMENT X=X0 A=A0+X*2 'N=2^(8-(X MOD 8))-1 N=RLINE_ROM(X MOD 8) CALL XOR_MIX(A,N*C0,N*C1) 'LINE (DOESN'T NEED OVERLAY OR SEGMENT GENERATION) FOR X=X0+8 TO X1 STEP 8 A=A0+X*2 POKE A ,255*C0 POKE A+8,255*C1 NEXT X 'RIGHT SEGMENT A=A0+X*2 X=X1 'N=255 XOR 2^(7-(X MOD 8))-1 N=LLINE_ROM(X MOD 8) CALL XOR_MIX(A,N*C0,N*C1) END SUB SUB VIEW_CHARACTERS(X,Y,C0,C1) CY0=C0\16 CY1=C1\16 CX0=C0 MOD 16 CX1=C1 MOD 16 FOR IY=CY0 TO CY1 FOR IX=0-(IY=CY0)*CX0 TO 15-(IY=CY1)*(CX1-15) CELL X+IX,Y+IY-CY0,IX+IY*16 NEXT IX NEXT IY END SUB #0:BYE BYE DEFAULT FONT 00 #2:MAIN CHARACTERS 00000000000000000000000000000000 55110101000000005511010100000000 55110100000000005511010000000000 55110101010000005511010101000000 55110100000000005511010000000000 55110101000000005511010100000000 55110100000000005511010000000000 55110101010100005511010101010000 55110100000000005511010000000000 55110101000000005511010100000000 55110100000000005511010000000000 55110101010000005511010101000000 55110100000000005511010000000000 55110101000000005511010100000000 55110100000000005511010000000000 55110101010101005511010101010100