; 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