1 DIM P0$(1),P1$(1),P2$(1),P3$(1),M$(1),X(3),Y(3),L(3),XM(3),YM(3),LM(3)›10 GRAPHICS 17:POSITION 2,3:? #6;"A SELF-MODIFYING":POSITION 3,6:? #6;"PLAYER-MISSILE"›11 POSITION 2,9:? #6;"GRAPHICS UTILITY":POSITION 6,16:? #6;"ken grace"›12 FOR T=1 TO 2000:NEXT T›13 GRAPHICS 0:? :? "THIS UTILITY ASKS SEVERAL QUESTIONS ABOUT THE P-M GRAPHICS SITUATION YOU WANT TO SET UP."›14 ? :? "IT THEN MODIFIES ITSELF INTO A PROGRAMSKELETON.":? :? "SUBROUTINES FOR PLAYER AND MISSILE "›15 ? "MOTION ARE INCLUDED.":? :? "YOU ADD THE REST OF THE PROGRAM.":? :? "ANIMATION IS POSSIBLE BY COPYING NEW "›16 ? "SHAPE STRINGS INTO THE STRINGS":? "DEFINING THE PLAYERS.":? :? :? "PRESS ำิมาิ TO BEGIN."›17 X=PEEK(53279):IF X<>6 THEN 17›18 GOSUB 150:FOR I=10 TO 17:? I:NEXT I:GOSUB 155›20 ? CHR$(125):? :? "ENTER THE ยมำษร GRAPHICS MODE FOR THE PLAYFIELD":? "GR. ";:INPUT X›22 GOSUB 150:? "9000 GR. ";X:GOSUB 155›24 ? "RESOLUTION DESIRED FOR PLAYERS:":? "0 = DOUBLE-LINE":? "1 = SINGLE-LINE (FINER)":INPUT R›26 Y=INT(X/16):X=X-16*Y:IF X<=4 THEN S=8*(1+R)›28 IF X=5 THEN S=12+4*R›30 IF X=6 THEN S=16+8*R›32 IF X=7 THEN S=24+8*R›34 IF X=8 THEN S=36+4*R›36 GOSUB 150:? "9010 RES=";R;":S=";S:GOSUB 155:S=128*(1+R)›38 GOSUB 150:FOR I=18 TO 36 STEP 2:? I:NEXT I:GOSUB 155›40 ? "NUMBER OF PLAYERS TO BE DEFINED";:INPUT NP›42 IF NP<4 THEN GOSUB 150:FOR I=NP TO 3:? 9085+50*I:? 9090+50*I:NEXT I:GOSUB 155›44 IF NP<4 THEN GOSUB 150:FOR I=NP TO 3:? 9600+10*I:NEXT I:GOSUB 155›48 GOSUB 150:FOR I=38 TO 44 STEP 2:? I:NEXT I:GOSUB 155›50 FOR I=0 TO NP-1›52 ? CHR$(125):? :? "COLOR (0 - 15) AND INTENSITY (0 - 15) FOR PLAYER ";I;:INPUT X,Y›54 GOSUB 150:? 9050+I;" POKE ";704+I;",";16*X+Y:GOSUB 155›56 ? "WIDTH OF PLAYER ";I;":":? "0 = NORMAL":? "1 = TWICE NORMAL":? "3 = FOUR TIMES NORMAL":INPUT X›58 GOSUB 150:? 9060+I;" POKE ";53256+I;",";X:GOSUB 155›60 ? "INITIAL HORIZONTAL POSITION (0 - 255) FOR LEFT EDGE OF PLAYER ";I;" (45 TO 210ON SCREEN)";:INPUT X›62 GOSUB 150:? 9080+50*I;"X(";I;")=";X;":REM HORIZ POS OF PLAYER ";I:GOSUB 155›64 ? "VERTICAL LENGTH (BYTES) OF PLAYER ";I;:INPUT X:? CHR$(125):? ›66 ? "INITIAL VERTICAL POSITION OF TOP OF PLAYER (1 TO ";S-X-1;")";:INPUT Y›68 GOSUB 150:? 9082+50*I;"Y(";I;")=";Y;":L(";I;")=";X+4;":REM VERT POS AND LENGTH":GOSUB 155›70 ? "USE LINES ";9100+50*I;" TO ";9120+50*I;" TO ENTER DATA STATEMENTS WITH THE ";X;" BYTES DEFINING PLAYER ";›72 ? :? "TYPE รฯฮิ WHEN FINISHED.":STOP ›74 NEXT I›78 GOSUB 150:FOR I=48 TO 74 STEP 2:? I:NEXT I:GOSUB 155›80 ? :? "HOW MANY MISSILES TO BE DEFINED (0 TO 4)";:INPUT NM›82 IF NM=0 THEN GOSUB 150:FOR I=180 TO 188:? I:NEXT I:GOSUB 155›84 IF NM=0 THEN GOSUB 150:FOR I=190 TO 198:? I:NEXT I:GOSUB 155›86 IF NM<4 THEN GOSUB 150:FOR I=NM TO 3:? 9285+50*I:? 9290+50*I:NEXT I:GOSUB 155›88 GOSUB 150:FOR I=78 TO 86 STEP 2:? I:NEXT I:GOSUB 155›90 IF NM=0 THEN ? CHR$(125):GOTO 119›92 S=0:FOR I=0 TO NM-1›94 ? CHR$(125):? :? "WIDTH OF MISSILE ";I:? "0 = NORMAL":? "1 = TWICE NORMAL"›96 ? "3 = FOUR TIMES NORMAL":INPUT X:S=INT(4^I+0.1)*X+S›98 GOSUB 150:? "9064 POKE 53260,";S:GOSUB 155›100 ? "INITIAL HORIZONTAL POSITION OF MISSILE ";I;:INPUT X›102 GOSUB 150:? 9280+50*I;"XM(";I;")=";X;":REM MISSILE ";I;" HORIZ POS":GOSUB 155›104 ? "VERTICAL LENGTH (BYTES) OF MISSILE ";I:INPUT X:? CHR$(125)›106 ? :? "INITIAL VERTICAL POSITION OF TOP OF MISSILE (1 TO ";128*(1+R)-X-1;")":INPUT Y›108 GOSUB 150:? 9282+50*I;" YM(";I;")=";Y;":LM(";I;")=";X+4;":REM VERT POS AND LENGTH":GOSUB 155›110 ? "USE LINE ";9300+50*I;" (TO ";9320+50*I;") TO ENTER DATA STATEMENTS WITH THE ";X;" 'BYTES' DEFINING"›112 ? "MISSILE ";I:X=INT(4^I+0.1):? :? "ALLOWED VALUES ARE 0, ";X;", ";2*X;", OR ";3*X:? :STOP ›114 NEXT I›119 GOSUB 150:FOR I=88 TO 114 STEP 2:? I:NEXT I:GOSUB 155›120 IF NM<4 THEN GOSUB 150:FOR I=NM TO 3:? 9650+10*I:NEXT I:GOSUB 155›125 IF NM=0 THEN GOSUB 150:FOR I=0 TO 4:? 9700+10*I:NEXT I:GOSUB 155›129 GOSUB 150:? "119":? "120":? "125":GOSUB 155›130 ? "PRIORITY SCHEDULE :":? :? "1 - PLAYERS 0-3,PLAYFLDS 0-3,BACKGND"›131 ? :? "2 - PLAYERS 0-1,PLAYFLDS 0-3,PLAYERS 2-3,BACKGND"›132 ? :? "4 - PLAYFLDS 0-3,PLAYERS 0-,BACKGND"›133 ? :? "8 - PLAYFLDS 0-1,PLAYERS 0-3,PLAYFLDS 2-3,BACKGND"›134 ? :? "ALSO, THE NUMERICAL SUMS OF THE ABOVE CHOICES ARE ALLOWED, GIVING BLACK FOR OVERLAPS."›135 ? :? "ABOVE +32 GIVES COLOR IN OVERLAPS":? :? "CHOICE";:INPUT X›136 GOSUB 150:? "9045 POKE 623,";X:GOSUB 155›137 ? :? "WHEN YOU SEE าลมฤู YOU MAY LIST OR RUN":FOR X=1 TO 900:NEXT X›140 GOSUB 150:FOR I=129 TO 137:? I:NEXT I:GOSUB 155›145 ? :? :? "140":? "145":? "150":? "155":? "156":? "POKE 842,12:? CHR$(125)":POSITION 0,0:POKE 842,13:STOP ›150 SETCOLOR 1,9,4:? CHR$(125):? :RETURN ›155 ? :? :? "CONT":POSITION 0,0:POKE 842,13:STOP ›156 POKE 842,12:? CHR$(125):? :SETCOLOR 1,9,10:RETURN ›159 GOTO 9000›160 REM MOTION OF PLAYER P. X(P) AND Y(P) ARE X,Y POSITIONS. DX AND DY ARE CHANGES. USE FOR DY=-2,-1,O,1 OR 2.›161 TRAP 168:IF DY=0 THEN 167›162 ON P+1 GOTO 163,164,165,166›163 P0$(Y(P)+DY)=D0$:GOTO 167›164 P1$(Y(P)+DY)=D1$:GOTO 167›165 P2$(Y(P)+DY)=D2$:GOTO 167›166 P3$(Y(P)+DY)=D3$›167 POKE 53248+P,X(P)+DX:X(P)=X(P)+DX:Y(P)=Y(P)+DY:DX=0:DY=0:RETURN ›168 DX=0:DY=0:GOTO 161›170 REM MOTION OF PLAYER P. USE FOR DY >2 OR <-2 (OR 0).›171 TRAP 177:ON P+1 GOTO 172,173,174,175›172 P0$=B$:POKE 53248,X(P)+DX:P0$(Y(P)+DY)=D0$:GOTO 176›173 P1$=B$:POKE 53249,X(P)+DX:P1$(Y(P)+DY)=D1$:GOTO 176›174 P2$=B$:POKE 53250,X(P)+DX:P2$(Y(P)+DY)=D2$:GOTO 176›175 P3$=B$:POKE 53251,X(P)+DX:P3$(Y(P)+DY)=D3$›176 X(P)=X(P)+DX:Y(P)=Y(P)+DY:DX=0:DY=0:RETURN ›177 DX=0:DY=0:GOTO 171›180 REM MOTION OF MISSILE P. XM(P),YM(P) ARE X,Y COORDS. DX,DY ARE CHANGES.USE FOR DY=-2,-1,0,1 OR 2.›181 TRAP 158:IF YM(P)+DY<1 OR YM(P)+DY+LM(P)>S OR DY=0 THEN DY=0:GOTO 187›182 ON P+1 GOTO 183,184,185,186›183 Z=USR(MOVE,M+YM(P)+DY,DM0,LM(0),252):GOTO 187›184 Z=USR(MOVE,M+YM(P)+DY,DM1,LM(1),243):GOTO 187›185 Z=USR(MOVE,M+YM(P)+DY,DM2,LM(2),207):GOTO 187›186 Z=USR(MOVE,M+YM(P)+DY,DM3,LM(3),63)›187 POKE 53252+P,XM(P)+DX:XM(P)=XM(P)+DX:YM(P)=YM(P)+DY:DX=0:DY=0:RETURN ›188 DX=0:DY=0:POKE 53252+P,XM(P):RETURN ›190 REM MOTION OF MISSILE P. USE FOR DY>2 OR <-2 (OR 0).›191 TRAP 198:IF YM(P)+DY<1 OR YM(P)+DY+LM(P)>S OR DY=0 THEN DY=0›192 ON P+1 GOTO 193,194,195,196›193 Z=USR(MOVE,M+YM(P),B,LM(P),252):POKE 53252,XM(P)+DX:Z=USR(MOVE,M+YM(P)+DY,DM0,LM(P),252):GOTO 197›194 Z=USR(MOVE,M+YM(P),B,LM(P),243):POKE 53253,XM(P)+DX:Z=USR(MOVE,M+YM(P)+DY,DM1,LM(P),243):GOTO 197›195 Z=USR(MOVE,M+YM(P),B,LM(P),207):POKE 53254,XM(P)+DX:Z=USR(MOVE,M+YM(P)+DY,DM2,LM(P),207):GOTO 197›196 Z=USR(MOVE,M+YM(P),B,LM(P),63):POKE 53255,XM(P)+DX:Z=USR(MOVE,M+YM(P)+DY,DM3,LM(P),63)›197 YM(P)=YM(P)+DY:XM(P)=XM(P)+DX:DX=0:DY=0:RETURN ›198 DX=0:DY=0:GOTO 191›200 GOTO 200›9015 POKE 559,46+16*RES›9020 PMBASE=PEEK(106)-S:POKE 54279,PMBASE:PMBASE=PMBASE*256›9030 POKE 53277,3:S=128:IF RES=1 THEN S=255›9070 DIM B$(S):B=ADR(B$):B$(1)=CHR$(0):B$(S)=CHR$(0):B$(2)=B$›9085 DIM D0$(L(0)):D0$=B$(1,L(0)):POKE 53248,X(0)›9090 RESTORE 9100:FOR I=3 TO L(0)-2:READ BYTE:D0$(I,I)=CHR$(BYTE):NEXT I›9135 DIM D1$(L(1)):D1$=B$(1,L(1)):POKE 53249,X(1)›9140 RESTORE 9150:FOR I=3 TO L(1)-2:READ BYTE:D1$(I,I)=CHR$(BYTE):NEXT I›9185 DIM D2$(L(2)):D2$=B$(1,L(2)):POKE 53250,X(2)›9190 RESTORE 9200:FOR I=3 TO L(2)-2:READ BYTE:D2$(I,I)=CHR$(BYTE):NEXT I›9235 DIM D3$(L(3)):D3$=B$(1,L(3)):POKE 53251,X(3)›9240 RESTORE 9250:FOR I=3 TO L(3)-2:READ BYTE:D3$(I,I)=CHR$(BYTE):NEXT I›9285 DIM DM0$(LM(0)):DM0$=B$(1,LM(0)):POKE 53252,XM(0)›9290 RESTORE 9300:FOR I=3 TO LM(0)-2:READ BYTE:DM0$(I,I)=CHR$(BYTE):NEXT I:DM0=ADR(DM0$)›9335 DIM DM1$(LM(1)):DM1$=B$(1,LM(1)):POKE 53253,XM(1)›9340 RESTORE 9350:FOR I=3 TO LM(1)-2:READ BYTE:DM1$(I,I)=CHR$(BYTE):NEXT I:DM1=ADR(DM1$)›9385 DIM DM2$(LM(2)):DM2$=B$(1,LM(2)):POKE 53254,XM(2)›9390 RESTORE 9400:FOR I=3 TO LM(2)-2:REM READ BYTE:DM2$(I,I)=CHR$(BYTE):NEXT I:DM2=ADR(DM2$)›9435 DIM DM3$(LM(3)):DM3$=B$(1,LM(3)):POKE 53255,XM(3)›9440 RESTORE 9450:FOR I=3 TO LM(3)-2:READ BYTE:DM3$(I,I)=CHR$(BYTE):NEXT I:DM3=ADR(DM3$)›9500 VTAB=PEEK(134)+256*PEEK(135):ATAB=PEEK(140)+256*PEEK(141)›9505 OFFSET=PMBASE+512*(1+RES)-ATAB›9510 FOR I=0 TO 4›9520 V3=INT(OFFSET/256):V2=OFFSET-256*V3›9530 POKE VTAB+2,V2:POKE VTAB+3,V3›9540 POKE VTAB+4,128*(1-RES):POKE VTAB+5,RES›9550 POKE VTAB+6,128*(1-RES):POKE VTAB+7,RES›9560 VTAB=VTAB+B:OFFSET=OFFSET+128*(1+RES)›9570 IF I=3 THEN OFFSET=PMBASE+384*(1+RES)-ATAB›9580 NEXT I›9600 P0$=B$:P0$(Y(0))=D0$›9610 P1$=B$:P1$(Y(1))=D1$›9620 P2$=B$:P2$(Y(2))=D2$›9630 P3$=B$:P3$(Y(3))=D3$›9650 M$=B$:M$(YM(0))=DM0$:M$(YM(0)+LM(0))=B$›9660 FOR I=1 TO LM(1):J=YM(1)+I-1:M$(J,J)=CHR$(ASC(M$(J,J))+ASC(DM1$(I,I))):NEXT I›9670 FOR I=1 TO LM(2):J=YM(2)+I-1:M$(J,J)=CHR$(ASC(M$(J,J))+ASC(DM2$(I,I))):NEXT I›9680 FOR I=1 TO LM(3):J=YM(3)+I-1:M$(J,J)=CHR$(ASC(M$(J,J))+ASC(DM3$(I,I))):NEXT I›9700 DIM MOVE$(38):MOVE=ADR(MOVE$):M=ADR(M$)-1›9710 RESTORE 9730›9720 FOR I=1 TO 37:READ BYTE:MOVE$(I,I)=CHR$(BYTE):NEXT I›9730 DATA 104,104,133,204,104,133,203,104,133,206,104,133,205,104,104,133,207,104,104,133,208›9740 DATA 160,0,177,203,37,208,113,205,145,203,200,196,207,208,243,96›9999 GOTO 200›