10 REM Vader's Last Stand 20 REM By Jason H. Moore, Ph.D. 30 REM December 21, 2019 40 REM A mini-game programmed in BASIC XE 50 REM to illustrate and teach Atari graphics. 60 REM For educational and instructional purposes only. 70 REM This version has minimal comments. 100 REM *************************************** 101 REM *** EXECUTE INITIALIZATION ROUTINES *** 102 REM *************************************** 110 FAST:REM Precompiles the line numbers for speed 120 POKE 77,0:REM Turn off screen saver 130 GOSUB 4000:REM Setup graphics & title screen 140 GOSUB 5000:REM Move & redefine character set 150 GOSUB 6000:REM Set up game variables 160 GOSUB 7000:REM Draw playfield 170 GOSUB 8000:REM Setup PM graphics 500 REM ***************** 501 REM *** MAIN LOOP *** 502 REM ***************** 510 REM CHECK JOYSTICK, MOVE PLAYER & MISSILES 520 GOSUB 600 530 GOSUB 700 540 GOTO 520 550 END 600 REM PLAYER & MISSILE MOVEMENT 610 P0VS=VSTICK(0)*PSPEED:P0HS=HSTICK(0)*PSPEED 620 P0X=P0X+P0HS 630 PMMOVE 0,P0X;P0VS 640 PMMOVE 6,M2X 650 PMMOVE 7,M3X 660 RETURN 700 REM MISSILE MOVEMENT CALCULATIONS AND DIFFICULTY 710 IF MNEW=0 THEN GOTO 1600 720 PMCLR 4 730 M2Y=INT(RND(1)*140+50):M3Y=INT(RND(1)*140+50) 740 M2SIDE=RND(1):M3SIDE=RND(1) 750 M2X=(M2SIDE<=0.5)*30+(M2SIDE>0.5)*220 760 M3X=(M3SIDE<=0.5)*30+(M3SIDE>0.5)*220 770 MISSILE 2,M2Y,4:MISSILE 3,M3Y,4 780 SOUND 0,225,6,255:SOUND 0,150,6,255:SOUND 0,75,6,255 790 SOUND 0,0,0,0 1000 REM INCREASE DIFFICULTY AS SCORE INCREASES 1010 SCORE=SCORE+1 1020 POKE 87,1:POSITION 6,0:PRINT #6;SCORE 1030 MNEW=0 1040 IF SCORE>5 THEN GOTO 1100 1050 MSPEED=2 1060 GOTO 1600 1100 IF SCORE>10 THEN GOTO 1200 1110 MSPEED=3 1120 GOTO 1600 1200 IF SCORE>15 THEN GOTO 1300 1210 MSPEED=4 1220 POKE 87,2:POSITION 10,7:PRINT #6; "*" 1230 GOTO 1600 1300 IF SCORE>20 THEN GOTO 1400 1310 MSPEED=4 1320 POKE 87,2:POSITION 6,8:PRINT #6; "*" 1330 GOTO 1600 1400 IF SCORE>30 THEN GOTO 1500 1410 MSPEED=5 1420 POKE 87,2:POSITION 8,3:PRINT #6; "*" 1430 GOTO 1600 1500 MSPEED=6 1510 POKE 87,2:POSITION 12,5:PRINT #6; "*" 1600 REM SET NEW MISSILE X POSITIONS 1610 M2X=M2X+MSPEED*((M2SIDE<=0.5)-(M2SIDE>0.5)) 1620 M3X=M3X+MSPEED*((M3SIDE<=0.5)-(M3SIDE>0.5)) 1630 MNEW=((M2X<30)+(M2X>220)) 1700 REM CHECK FOR COLLISIONS 1710 IF BUMP(6,0)=1 THEN GOTO 3000 1720 IF BUMP(7,0)=1 THEN GOTO 3000 1730 IF BUMP(0,8)=1 THEN GOTO 3000 1740 RETURN 3000 REM COLLISION, END THE GAME 3010 PMCLR 4 3020 FOR I=1 TO 15 3030 SOUND 0,250,4,15/I+5 3040 POKE 704,64+I 3050 FOR J=1 TO 100 3060 NEXT J 3070 NEXT I 3080 PMCLR 0 3090 SOUND 0,0,0,0 3100 FOR I=1 to 1000:NEXT I 3110 PRINT #6;CHR$(125) 3120 SETCOLOR 0,4,10 3130 POKE 87,2:POSITION 2,4:PRINT #6;"FINAL SCORE " 3140 POSITION 14,4:PRINT #6;SCORE 3150 POSITION 2,6:PRINT #6;"PRESS START" 3160 IF PEEK(53279)=6 THEN RUN 3170 GOTO 3160 4000 REM ************************************** 4001 REM *** SET UP GRAPHICS & TITLE SCREEN *** 4002 REM ************************************** 4010 GRAPHICS 2+16:POKE 752,1 4020 DL=PEEK(560)+PEEK(561)*256+4 4030 POKE DL-1,70 4040 SETCOLOR 0,12,8:SETCOLOR 2,0,0 4100 POKE 87,2 4110 POSITION 2,2:PRINT #6; " VADER'S" 4120 POSITION 2,3:PRINT #6; " LAST STAND" 4130 POSITION 2,5:PRINT #6; " BY" 4140 POSITION 2,6:PRINT #6; " JASON H. MOORE" 4150 POSITION 2,9:PRINT #6; " GET READY!" 4200 RETURN 5000 REM ************************************* 5001 REM *** MOVE & REDEFINE CHARACTER SET *** 5002 REM ************************************* 5010 MEMTOP=PEEK(106) 5020 CHADDR=(MEMTOP-8)*256 5030 CHROM=PEEK(756)*256 5040 MOVE CHROM,CHADDR,512 5100 REM REDEFINE CHARS # (3) TO ) (9) 5110 REM THEN + (11) to / (15) AND : (26) to = (29) 5120 REM SKIPPING * AND NUMBERS SO WE CAN USE THEM 5130 CHRAM=CHADDR+24:REM Start with # 5140 FOR I=1 to 7 5150 FOR ADDR=CHRAM TO CHRAM+7 5160 READ DAT:POKE ADDR,DAT 5170 NEXT ADDR 5180 CHRAM=CHRAM+8 5190 NEXT I 5200 CHRAM=CHRAM+8:REM Start with +, skip * 5210 FOR I=1 to 5 5220 FOR ADDR=CHRAM TO CHRAM+7 5230 READ DAT:POKE ADDR,DAT 5240 NEXT ADDR 5250 CHRAM=CHRAM+8 5260 NEXT I 5300 CHRAM=CHRAM+80:REM Now do : to @ 5310 FOR I=1 to 7 5320 FOR ADDR=CHRAM TO CHRAM+7 5330 READ DAT:POKE ADDR,DAT 5340 NEXT ADDR 5350 CHRAM=CHRAM+8 5360 NEXT I 5400 CHRAM=CHRAM+208:REM Now do [ to _ 5410 FOR I=1 to 5 5420 FOR ADDR=CHRAM TO CHRAM+7 5430 READ DAT:POKE ADDR,DAT 5440 NEXT ADDR 5450 CHRAM=CHRAM+8 5460 NEXT I 5500 RETURN 6000 REM **************************** 6001 REM *** SETUP GAME VARIABLES *** 6002 REM **************************** 6010 P0X=120:P0Y=120 6020 PSPEED=2:MSPEED=2 6030 MNEW=1 6040 SCORE=0 6100 RETURN 7000 REM ************************** 7001 REM *** DRAW THE PLAYFIELD *** 7002 REM ************************** 7010 PRINT #6;CHR$(125) 7020 POKE 756,CHADDR/256 7030 SETCOLOR 0,0,8 7040 POKE 87,1 7050 POSITION 0,0:PRINT #6; "SCORE 0" 7100 REM Draw Death Star 7110 POKE 87,2 7120 POSITION 3,2:PRINT #6;"#',:" 7130 POSITION 3,3:PRINT #6;"$(-;" 7140 POSITION 3,4:PRINT #6;"%).<" 7150 POSITION 3,5:PRINT #6;"&+/=" 7200 REM Draw Mines 7210 POSITION 1,2:PRINT #6; "*" 7220 POSITION 12,2:PRINT #6; "*" 7230 POSITION 2,8:PRINT #6; "*" 7240 POSITION 14,9:PRINT #6; "*" 7250 POSITION 16,5:PRINT #6; "*" 7300 REM Draw Border 7310 POSITION 0,1:PRINT #6; "\" 7320 POSITION 19,1:PRINT #6; "]" 7330 POSITION 0,10:PRINT #6; "^" 7340 POSITION 19,10:PRINT #6; "_" 7350 POSITION 1,1:PRINT #6; ">>>>>>>>>>>>>>>>>>" 7360 POSITION 1,10:PRINT #6; "??????????????????" 7370 FOR I=2 TO 9 7380 POSITION 0,I:PRINT #6;"@" 7390 POSITION 19,I:PRINT #6;"[" 7400 NEXT I 7500 RETURN 8000 REM ************************************* 8001 REM *** SETUP PLAYER MISSILE GRAPHICS *** 8002 REM ************************************* 8010 PMGRAPHICS 1 8020 PMCLR 0:PMCLR 4 8030 PMWIDTH 0,2:PMWIDTH 6,3:PMWIDTH 7,3 8040 PMCOLOR 0,12,12:PMCOLOR 2,2,12:PMCOLOR 3,2,12 8050 P0ADR=PMADR(0) 8100 REM Load player 0 shape data into memory 8110 FOR I=P0ADR+P0Y TO P0ADR+P0Y+13 8120 READ DAT:POKE I,DAT 8130 NEXT I 8500 RETURN 10000 REM ************************************** 10001 REM *** DATA FOR DEATH STAR CHARACTERS *** 10002 REM ************************************** 10010 DATA 0,0,3,7,15,15,31,31 10020 DATA 63,63,127,127,127,127,127,127 10030 DATA 0,127,127,127,127,127,63,63 10040 DATA 31,31,15,15,7,1,0,0 10050 DATA 0,63,255,255,255,255,255,207 10060 DATA 135,3,3,135,207,255,255,255 10070 DATA 0,255,255,255,255,255,255,255 10080 DATA 255,255,255,255,255,255,63,0 10090 DATA 0,252,255,255,255,255,255,255 10100 DATA 255,255,255,255,255,255,255,255 10110 DATA 0,255,255,255,255,255,255,255 10120 DATA 255,255,255,255,255,255,252,0 10130 DATA 0,0,128,224,240,240,248,248 10140 DATA 252,252,254,254,254,254,254,254 10150 DATA 0,254,254,254,254,254,252,252 10160 DATA 248,248,240,240,224,128,0,0 11000 REM *********************************** 11001 REM *** DATA FOR BORDER AND CORNERS *** 11002 REM *********************************** 11010 DATA 255,255,255,0,0,0,0,0 11020 DATA 0,0,0,0,0,255,255,255 11030 DATA 224,224,224,224,224,224,224,224 11040 DATA 7,7,7,7,7,7,7,7 11050 DATA 255,255,255,224,224,224,224,224 11060 DATA 255,255,255,7,7,7,7,7 11070 DATA 224,224,224,224,224,255,255,255 11080 DATA 7,7,7,7,7,255,255,255 12000 REM **************************** 12001 REM *** DATA FOR TIE FIGHTER *** 12002 REM **************************** 12010 DATA 66,129,129,153,153,255,255 12020 DATA 255,255,153,153,129,129,66