;QESPONGTFP››SET 106=144; RESERVE SPACE FOR PM GRAPHICS›BYTE HPOS,VPOS,P0POS,P1POS,HITS=[0],NUMPLAYERS=[2]›BYTE ARRAY PM(2048)=$9800,COLR(9)=704›INT XDIR=[1],YDIR=[2],XINIT=[1],YINIT=[2]›BYTE ARRAY PPL(4)=53260›BYTE ARRAY PPF(4)=53252›BYTE ARRAY BALL=[0 0 0 0 0 0 $C0 $C0 $C0 $C0 0 0 0 0 0 0]›BYTE ARRAY PADDLE=[0 0 0 $E0 $E0 $E0 $E0 $E0 $E0 $E0 $E0 $E0 $E0 $E0 ›$E0 $E0 $E0 $E0 $E0 $E0 $E0 $E0 $E0 $E0 $E0 0 0 0]›CARD PL0SCORE=[0],PL1SCORE=[0]›BYTE HP0,HP1,XX››PROC DELAY(BYTE I); DELAY I/60 SECONDS.› BYTE N18=18,N19=19,N20=20› CARD TIME› IF I=0 THEN I=1 FI› TIME=I+N19*256+N20› WHILE TIME<>(N19*256+N20) DO OD›RETURN››PROC PMOFF(); TURN OFF PM GRAPHICS› BYTE I› POKE(559,34)› POKE(623,4)› POKE(53277,0)› FOR I=0 TO 3 DO› POKE(53248+I,0)› OD›RETURN››PROC PMON(); TURN ON PM GRAPHICS› BYTE I› POKE(559,62) › POKE(54279,$98)› POKE(53277,3)› POKE(623,1)› FOR I=0 TO 3 DO› POKE(53256+I,2)› COLR(I)=(I+1)*16+10› POKE(53248+I,110)› HPOS=110› VPOS=110› POKE(53248+I,HPOS)› OD› POKE(53250,255-HPOS)› HP0=110› HP1=145›RETURN››BYTE FUNC PLPL(BYTE N1,N2)› BYTE I› I=PPL(N1) RSH N2› I=I&1›RETURN(I)›››INT FUNC PSTK(BYTE NUM)› BYTE I=632,J=633,K=633› IF NUM=0 THEN› IF (I & 12)=4 THEN HP0==+2› ELSEIF (I & 12)=8 THEN HP0==-2› FI› IF (I & 3)=2 THEN RETURN(-3)› ELSEIF (I & 3)=1 THEN RETURN(3)› ELSE RETURN(0)› FI› ELSEIF NUM=1 THEN› IF NUMPLAYERS=1 THEN› IF (VPOS-4)>P1POS THEN P1POS==+3› ELSEIF (VPOS-4)197 THEN P0POS==-3 FI› IF P0POS<33 THEN P0POS==+3 FI› P1POS==+PSTK(1)› IF P1POS>197 THEN P1POS==-3 FI› IF P1POS<33 THEN P1POS==+3 FI› IF HP0<55 THEN HP0=55 FI› IF HP0>122 THEN HP0=122 FI› POKE(53249,HP0)› IF HP1<132 THEN HP1=132 FI› IF HP1>200 THEN HP1=200 FI› POKE(53250,HP1)› MOVEBLOCK(PM+1024+256+P0POS,PADDLE,28)› MOVEBLOCK(PM+1024+512+P1POS,PADDLE,28)›RETURN ››PROC MOVEBALL(); MOVE PM› BYTE I,J,K,GPRIOR=623,CONSOLE=53279,HITCLR=53278› CARD A,B,C› ;THE ARRAYS CONTAIN THE SHAPES› HITCLR=255› ;XDIR IS ALWAYS 1 OR -1 HERE, BUT COULD COME FROM JOYSTICK READING› HPOS==+XDIR › IF HPOS<52 THEN› SERVE(0)› PL1SCORE==+1› FI› IF HPOS>202 THEN› SERVE(1)› PL0SCORE==+1› FI› ;HPOS MUST BE IN BOUNDS› POKE(53248,HPOS) › ;SAME COMMENT AS FOR XDIR› VPOS==+YDIR› IF VPOS>210 OR VPOS<34 THEN› YDIR=-YDIR› SOUND(0,150,10,10)› FI› MOVEBLOCK(PM+1024+VPOS,BALL,16)› DELAY(1); IN ORDER TO DETECT COLLISIONS, HEAR SOUNDS ETC. THIS MUST BE HERE. TRY WITHOUT IT !!!› SNDRST()›RETURN › ›INT FUNC SGN(INT X)›RETURN(X & 32768) ››PROC XCHNG()› INT TEMP,TEMP1› IF XDIR>0 AND YDIR>0 THEN› TEMP=XDIR› XDIR=YDIR› YDIR=TEMP› ELSEIF XDIR<0 AND YDIR<0 THEN› TEMP=XDIR› XDIR=YDIR› YDIR=TEMP› ELSE› TEMP=XDIR› XDIR=-YDIR› YDIR=-TEMP› FI›RETURN››PROC BOUNCE(BYTE PL)› BYTE ARRAY STRIG(4)=644› IF STRIG(PL)=0 THEN XCHNG() FI› XDIR=-XDIR › SOUND(0,150,10,10) › MOVEBALL()›RETURN››PROC DRAWNET(BYTE COLS)› BYTE I,J,K› COLOR=1› PLOT(0,0)› DRAWTO(79,0)› PLOT(79,47)› DRAWTO(0,47) › FOR I=0 TO COLS RSH 1 DO › PLOT(39-I,1)› DRAWTO(39-I,46) › PLOT(39+I,1)› DRAWTO(39+I,46)› OD›RETURN› ›PROC INCSPEED()› IF XDIR>0 THEN XDIR==+1› ELSE XDIR==-1› FI› IF YDIR>0 THEN YDIR==+1› ELSE YDIR==-1› FI› HITS=0› IF XDIR>3 OR YDIR>3 OR XDIR<-3 OR YDIR<-3 THEN› PADDLE(3)=0› PADDLE(4)=0› PADDLE(24)=0› PADDLE(23)=0› FI›RETURN››PROC GET_NUMBER_OF_PLAYERS()› GRAPHICS(18)› POSITION(0,6)› PRINTDE(6,"ONE ÏÒ ô÷ï players?")› CLOSE(4)› OPEN(4,"K:",4,0)› DO› XX=GETD(4)› XX==-48› UNTIL (XX=1) OR (XX=2) OD › NUMPLAYERS=XX›RETURN››PROC MAIN(); MAIN CONTROL PROGRAM› BYTE CONSOLE=53279,RGEN=53770,PNUM,SDMCTL=559,J,K,COUNTER,GPRIOR=623› INT X,Y› CARD I › GET_NUMBER_OF_PLAYERS()› POKE(53768,0) POKE(53775,3) POKE(623,1)› ZERO(PM,2048) PNUM=SDMCTL GRAPHICS(21) SDMCTL=PNUM › CONSOLE=8 SDMCTL=PNUM› PMON() COLR(8)=13*16+2 COLR(4)=1*16+10› DRAWNET(0) PL0SCORE=0 PL1SCORE=0› WHILE CONSOLE=7 DO ; CONTINUES UNTIL ANY YELLOW KEY IS PRESSED› IF PLPL(0,1) THEN BOUNCE(0) HITS==+1 FI › IF PLPL(0,2) THEN BOUNCE(1) HITS==+1 FI › IF HITS>9 THEN INCSPEED() FI› MOVEPADL() MOVEBALL()› OD› PMOFF() GRAPHICS(18) PRINTD(6,"LEFT PLAYER:") PRINTCDE(6,PL0SCORE) PRINTD(6,"RIGHT PLAYER:")› PRINTCDE(6,PL1SCORE) DELAY(99) GRAPHICS(0)›RETURN››