; AMAZING›; BY DAVID PLOTKIN›; ANTIC MAGAZINE››MODULE ››CARD SCRLOC=88,HIMEM=$2E5,› PM_BASEADR,ADRES,ADRESB,SCORE=[0] ››INT DIRX=[2],DIRY=[0],XDIR,YDIR››INT ARRAY PXDR=[0 0 0 0],› PYDR=[0 0 0 0]››BYTE T=$DA,VCOUNT=$D40B,› PMHITCLR=$D01E,DMACTL=$22F,› GRACTL=$D01D,PMBASE=$D407,› PRIORITY=$26F,X0,Y0,COUNT=[0],› LV=[5],FT=[150],CD=[20],› PCLRM=711,COLR0=708,LOUD=[0],› COLR1=709,COLR2=710,COLR4=712,› FATE=53770,CURSH=752,› TXTROW=656,TXTCOL=657,LVL=[1],› SND1=$D20F,SND2=$D208 › ›BYTE ARRAY YLOCL(80),› YLOCH(80),RSH2(160),› PMHPOS(8)=$D000, › PX(4)=[0 0 0 0],PY(4)=[0 0 0 0],› BEGX(4)=[0 52 52 196], › BEGY(4)=[0 38 166 38],› PM_WIDTH(5)=$D008,PLPTR,› PM_MISMASK(4)=[$FC $F3 $CF $3F],› PCOLR(4)=704,PMTOPF(8)=$D000,› PMTOP(8)=$D008,PFCOL(8),PCOL(8)››BYTE ARRAY BM(0)=[$C0 $30 $C $3],› CM(0)=[$0 $55 $AA $FF],› CHMP1(0)=[0 0 129 129 66 66 36 36› 24 24 24 24 36 36 66 66 129 129 0 0],› CHMP2(0)=[0 0 129 129 66 66 60 36 › 36 36 36 36 36 60 66 66 129 129 0 0],› CRT(0)=[0 0 129 129 129 195 90 126› 126 165 165 126 126 90 195 129 129› 129 0 0],› MSTATUS(0)=[0 0 0 0],ESTAT(4),› MX(0)=[0 0 0 0],MY(0)=[0 0 0 0],› BLK(0)=['U'U'U'U'Z'¥'Y'e'Z'¥'Y'e'U› 'U'U'U];WIDTH=2,HEIGHT=8››BYTE ARRAY LINE,DUM›BYTE LOW=LINE,HIGH=LINE+1››PROC DLAY(CARD WAIT)›CARD COUNT›FOR COUNT=0 TO WAIT DO OD RETURN››PROC INIT7()›BYTE LOW1,HIGH1,I CARD SCREEN=LOW1›GRAPHICS(7) COLR0=44 COLR1=196 ›COLR2=106 COLR4=0 SCREEN=SCRLOC I=0›WHILE I<80 DO YLOCL(I)=LOW1›YLOCH(I)=HIGH1 SCREEN=SCREEN+40 I=I+1›OD›I=0 WHILE I<160 DO RSH2(I)=I RSH 2›I=I+1›OD ›RETURN››INT FUNC HSTICK(BYTE PORT)›BYTE ARRAY PORTS(4)=$278›INT ARRAY VALUE(4)=[0 1 $FFFF 0]›RETURN (VALUE((PORTS(PORT)&$C) RSH 2))››INT FUNC VSTICK(BYTE PORT)›BYTE ARRAY PORTS(4)=$278›INT ARRAY VALUE(4)=[0 1 $FFFF 0]›RETURN (VALUE(PORTS(PORT)&3))››PROC UPDATE()›TXTROW=1 TXTCOL=12 PRINTC(SCORE)›RETURN››PROC UPDATESHIP()›BYTE LOOP5›TXTROW=1›FOR LOOP5=1 TO 5 DO TXTCOL=31+LOOP5›IF LV>=LOOP5 THEN PRINT("")› ELSE PRINT(" ")›FI OD RETURN››PROC DRAW7(BYTE X,Y,CLR)›BYTE X1=$A0,Y1=$A1,CLR1=$A2›LOW=YLOCL(Y1)›HIGH=YLOCH(Y1)›T=RSH2(X1)›LINE(T)=(((BM(X1&3)!$FF)&LINE(T))%› (BM(X1&3)&CM(CLR1)))›RETURN››PROC FASTDRAW(BYTE ARRAY PICTURE › BYTE WIDTH,HEIGHT,XX,YY)›BYTE LCTR1,LCTR2 CARD LCTR3›FOR LCTR1=0 TO HEIGHT-1›DO LOW=YLOCL(YY+LCTR1) HIGH=YLOCH(YY+LCTR1)› LCTR2=XX+WIDTH› LCTR3=(LCTR1+1)*WIDTH-1› DO › LINE(LCTR2)=PICTURE(LCTR3)› LCTR3==-1 LCTR2==-1› UNTIL LCTR2=XX › OD›OD RETURN››PROC PMGRAPHICS()›ZERO(PMHPOS,8) ›ZERO(PM_WIDTH,5) ›DMACTL=$3E PCOLR(0)=52›PM_BASEADR=(HIMEM-$800)&$F800›PMBASE=PM_BASEADR RSH 8›HIMEM=PM_BASEADR+768›PRIORITY==&$C0%17 GRACTL=3›RETURN››CARD FUNC PMADR(BYTE N)›IF N>=4 THEN N=0 ELSE N==+1 FI›RETURN(PM_BASEADR+768+(N*$100))››PROC PMCLEAR(BYTE N)›CARD CTR›BYTE ARRAY PLAYADR›PLAYADR=PMADR(N)›IF N<4 THEN ZERO(PLAYADR,$100)› ELSE N==-4›FOR CTR=0 TO $100-1›DO PLAYADR(CTR)==&PM_MISMASK(N) OD›FI›RETURN››PROC WINDOW()›BYTE LOOP5›TXTROW=0 TXTCOL=0 CURSH=1›PRINT›("") ›FOR LOOP5=1 TO 2 DO›TXTROW=LOOP5 TXTCOL=0 PRINT("|")›TXTCOL=38 PRINT("|")›OD TXTROW=3 TXTCOL=0›PRINT›("") ›TXTROW=1 TXTCOL=3 PRINT("SCORE: ")›UPDATE() TXTCOL=20 PRINT("MEN LEFT: ")›UPDATESHIP()›RETURN››PROC MOVEIT(BYTE ARRAY SHAPE BYTE› WHICH,NUM,XX,YY)›ADRES=PMADR(WHICH)+YY›MOVEBLOCK(ADRES,SHAPE,NUM)›PMHPOS(WHICH)=XX›RETURN››PROC PUTMAN()›BYTE LP›FOR LP=0 TO 3 DO›MSTATUS(LP)=0 ESTAT(LP)=0 OD›X0=120 Y0=102 MOVEIT(CHMP1,0,20,X0,Y0)›FOR LP=1 TO 3 DO›PX(LP)=BEGX(LP) PY(LP)=BEGY(LP)›MOVEIT(CRT,LP,20,PX(LP),PY(LP)) OD›RETURN››PROC BORDER()›BYTE L1,L2›FOR L1=0 TO 159 DO› FOR L2=0 TO 3 DO› DRAW7(L1,L2,1) DRAW7(L1,L2+76,1)›OD OD›FOR L1=0 TO 79 DO› FOR L2=0 TO 3 DO› DRAW7(L2,L1,1) DRAW7(L2+156,L1,1)›OD OD›RETURN››PROC DOTS()›BYTE L1,L2›FOR L2=8 TO 72 STEP 16 DO› FOR L1=8 TO 156 STEP 8 DO ›DRAW7(L1,L2,3) OD OD›FOR L2=16 TO 72 STEP 16 DO› FOR L1=8 TO 156 STEP 16 DO›DRAW7(L1,L2,3) OD OD›RETURN››PROC BOARDDRAW()›BYTE L1,L2›BORDER()›FOR L1=2 TO 36 STEP 4 DO› FOR L2=12 TO 68 STEP 16 DO› FASTDRAW(BLK,2,8,L1,L2)OD OD›DOTS()›RETURN››PROC TESTCOL()›BYTE LL›FOR LL=0 TO 7 DO›PFCOL(LL)=0 PCOL(LL)=0 OD›DO UNTIL VCOUNT&128 OD›FOR LL=0 TO 7 DO›PFCOL(LL)=PMTOPF(LL)›PCOL(LL)=PMTOP(LL) OD›PMHITCLR=1 ›RETURN››BYTE FUNC PMHIT(BYTE N,CNUM)›IF N<4 THEN N==+4 ELSE N==-4 FI›IF CNUM<4 THEN › RETURN((PCOL(N) RSH CNUM)&1)› ELSE CNUM==&3› RETURN((PFCOL(N) RSH CNUM)&1)›FI RETURN(0)› ›BYTE FUNC LLOC(BYTE XX,YY,CLR)›BYTE X1=$A0,Y1=$A1,CLR1=$A2,L1,L2 ›LOW=YLOCL(Y1) HIGH=YLOCH(Y1)›T=RSH2(X1) L1=X1&3›L2=LINE(T)&BM(L1)›IF (L2&CM(CLR1))=(BM(L1)&CM(CLR1))THEN›RETURN(1) FI;SOMETHING THERE›RETURN(0)››BYTE FUNC LKAHD(INT XD,YD BYTE XX,YY)›BYTE XA,YA,XB,YB,RS1,RS2›XA=XX-48 YA=(YY-32) RSH 1›IF XD>0 THEN XA==+7+XD XB=XA› YA==+1 YB=YA+7› ELSEIF XD<0 THEN XA==+XD XB=XA› YA==+1 YB=YA+7› ELSEIF YD>0 THEN XB=XA+7› YA==+9 YB=YA› ELSEIF YD<0 THEN XB=XA+7 YB=YA› ELSE RETURN(0)›FI RS1=LLOC(XA,YA,1) RS2=LLOC(XB,YB,1)›IF RS1+RS2=0 THEN RETURN(1)› ELSE RETURN(0);OK›FI RETURN(0);BLOCKED››PROC NEWLEVEL()›BYTE LL›SNDRST() SCORE==+COUNT*LVL›UPDATE() COUNT=0 LVL==+1›FOR LL=0 TO 7 DO PMCLEAR(LL) OD›DOTS() PUTMAN()›DIRX=0 DIRY=0 ›IF LVL<11 THEN FT==-10 CD==+10 FI›RETURN››PROC MSLDROP(INT XD,YD)›BYTE TRIG=644,XA,YA,LP,MASK,LD=[0],TT=[0]›IF LD>1 THEN LD==-2 FI›SOUND(1,LD LSH 3,10,LD)›IF TRIG=1 THEN TT=0 FI›IF TRIG=1 OR (XD=0 AND YD=0) OR TT=1› THEN RETURN FI›FOR LP=0 TO 3 DO›IF MSTATUS(LP)=0 THEN MSTATUS(LP)=1› IF XD>0 THEN XA=X0 YA=Y0+9 › ELSEIF XD<0 THEN XA=X0+7 YA=Y0+9› ELSEIF YD>0 THEN XA=X0+4 YA=Y0› ELSE XA=X0+4 YA=Y0+18› FI MASK=PM_MISMASK(LP)!$FF LD=12 TT=1› MY(LP)=YA MX(LP)=XA› PLPTR(MY(LP))==%MASK› PLPTR(MY(LP)+1)==%MASK› PMHPOS(LP+4)=MX(LP) EXIT›FI OD RETURN››PROC MSLGET()›BYTE LP,LD1=[0]›IF LD1>1 THEN LD1==-2 FI›SOUND(2,LD1 LSH 4,10,LD1)›FOR LP=0 TO 3 DO›IF PMHIT(LP+4,0)=1 THEN›MSTATUS(LP)=0 LD1=12›PLPTR(MY(LP))==&PM_MISMASK(LP)›PLPTR(MY(LP)+1)==&PM_MISMASK(LP)›PMHPOS(LP+4)=0 EXIT FI OD RETURN››PROC GOTBUMPED()›BYTE LQ,LD2=[0],LQ1›IF LD2>0 THEN LD2==-1 FI›SOUND(3,LD2 LSH 3,8,LD2)›FOR LQ=0 TO 3 DO FOR LQ1=1 TO 3 DO›IF PMHIT(LQ+4,LQ1)=1 THEN› LD2=14 ESTAT(LQ1)=1 MSTATUS(LQ)=0› PLPTR(MY(LQ))==&PM_MISMASK(LQ)› PLPTR(MY(LQ)+1)==&PM_MISMASK(LQ)› PMHPOS(LQ+4)=0 ›FI OD OD›FOR LQ=1 TO 3 DO ›IF ESTAT(LQ)>0 THEN ESTAT(LQ)==+1› PCOLR(LQ)=FATE›FI›IF ESTAT(LQ)=FT THEN ESTAT(LQ)=0› PMCLEAR(LQ)› PCOLR(LQ)=(RAND(15) LSH 4)+6› PX(LQ)=BEGX(LQ) PY(LQ)=BEGY(LQ)› MOVEIT(CRT,LQ,20,PX(LQ),PY(LQ))›FI OD RETURN››PROC MUNCH()›BYTE TIME=20,X1,Y1›IF LOUD>1 THEN LOUD==-2 FI›SOUND(0,8,LOUD LSH 3,LOUD)›IF PMHIT(0,10)=0 THEN DLAY(1) RETURN FI›LOUD=12 X1=X0-48 Y1=(Y0-32) RSH 1›DRAW7(X1+3,Y1+4,0) DRAW7(X1+3,Y1+5,0)›DRAW7(X1+4,Y1+4,0) DRAW7(X1+4,Y1+5,0)›COUNT==+1 ›IF COUNT=135 THEN NEWLEVEL() FI›RETURN››PROC CHANGEDIR(BYTE WH)›BYTE F,LP›IF FATE200 THEN LD=200 FI›LC==-2 IF LC<30 THEN LC=30 FI›IF (LC=30 AND LD=200) THEN EXIT FI›SOUND(0,LC,8,8) SOUND(1,LD,8,8)›DUM(LC)=FATE DUM(LD)=FATE ›DLAY(250) DLAY(250) DLAY(250)›OD SNDRST() ›FOR LC=0 TO 7 DO PMCLEAR(LC) OD›LV==-1 UPDATESHIP()›IF LV=0 THEN ENDGAME() ELSE PUTMAN()›PMHITCLR=0 FI RETURN››PROC CHASE()›BYTE LP›FOR LP=1 TO 3 DO SMARTS(LP)›PX(LP)==+PXDR(LP) PY(LP)==+PYDR(LP)›IF ESTAT(LP)=0 THEN›MOVEIT(CRT,LP,20,PX(LP),PY(LP)) FI›OD RETURN››PROC MOVEMAN()›BYTE STCK=632,TIME=20›XDIR=HSTICK(0) LSH 1›YDIR=VSTICK(0) LSH 1›IF XDIR<>0 AND YDIR<>0 THEN YDIR=0 FI›IF STCK=15 THEN XDIR=DIRX YDIR=DIRY FI›IF LKAHD(XDIR,YDIR,X0,Y0)=1 THEN › X0==+XDIR› Y0==+YDIR DIRX=XDIR DIRY=YDIR ELSEIF› LKAHD(DIRX,DIRY,X0,Y0)=1 THEN› X0==+DIRX Y0==+DIRY › ELSE DIRX=0 DIRY=0›FI MOVEIT(CHMP1,0,20,X0,Y0)›RETURN››PROC MAIN()›BYTE XX,COUNT,TIMER=20,ATRACT=$4D›SND1=3 SND2=0 ›INIT7() PMGRAPHICS() PCLRM=50›PLPTR=PMADR(4) DUM=PMADR(0)›FOR XX=0 TO 7 DO PMCLEAR(XX) OD›FOR XX=1 TO 3 DO ›PCOLR(XX)=(RAND(15) LSH 4)+6 OD›WINDOW() BOARDDRAW() PUTMAN() ENDGAME()›DO TESTCOL() MUNCH() MOVEMAN() OUCH()›MSLGET() CHASE() MSLDROP(DIRX,DIRY)›ATRACT=0 GOTBUMPED() OD›RETURN›