10 REM Combining a redefined character set with player-missile graphics 20 REM By Jason H. Moore, Ph.D. 30 REM November 10, 2019 40 REM Thanks to character set code example from The Creative Atari 50 REM Thanks to machine language example from Atari Graphics & Arcade Design 60 REM see CH5, p164 of Compute's First Book of Atari for PMG code 70 REM This version has verbose comments 100 REM INITIALIZE MEMORY MAP AND GRAPHICS 110 MEMTOP=PEEK(106):REM Find top of RAM 120 GRTOP=MEMTOP-4:REM Make room for character set 130 POKE 106,GRTOP:REM New top of RAM 140 PM=GRTOP-20:REM Make room for player-missile graphics 150 PMBASE=256*PM:REM Address for PMG 160 CHRAM=GRTOP*256:REM Address for character set 170 GRAPHICS 2+16:POKE 752,1 180 SETCOLOR 0,0,4:REM Dark grey playfield 190 SETCOLOR 2,0,0:REM Black background 200 REM INITIALIZE PLAYER 0 COLOR AND POSITION 210 PCOL0=216:REM Player 0 color green 220 POKE 704,PCOL0:REM Set color for player 0 230 PXMEM=53248:PYMEM=1780:PHMEM=1784:REM Player position memory 240 P0X=120:P0Y=80:REM Initial position of player 0 250 POKE 756,GRTOP:REM Tell ANTIC where new character set is 300 REM SET UP PLAYFIELD AND PLAYER MISSILE GRAPHICS 400 GOSUB 5000:REM Redefine the character set and draw the playfield 500 GOSUB 6000:REM Setup vertical blank movement routine & PM graphics 600 REM *** MAIN LOOP *** 610 REM SET PLAYER POSITION AND HEIGHT & CHECK JOYSTICK 620 POKE PHMEM,14:REM Height 630 POKE PXMEM,P0X:POKE PYMEM,P0Y:REM P0 Position 640 GOSUB 700:REM Check joystick 650 GOTO 620:REM Loop forever 660 END 700 REM PLAYER MOVEMENT CALCULATIONS 710 JOY = STICK(0):REM Read joystick value 720 IF JOY=15 THEN RETURN:REM Return if not pressed 730 IF JOY=11 THEN P0X=P0X-2:REM Left? Decrease X 740 IF JOY=7 THEN P0X=P0X+2:REM Right? Increase X 750 IF JOY=13 THEN P0Y=P0Y+2:REM Up? Increase Y 760 IF JOY=14 THEN P0Y=P0Y-2:REM Down? Decrease Y 770 IF P0X>190 THEN P0X=50:REM Screen wrap right 780 IF P0X<50 THEN P0X=190:REM Screen wrap left 790 IF P0Y>205 THEN P0Y=45:REM Screen wrap down 800 IF P0Y<45 THEN P0Y=205:REM Screen wrap up 810 RETURN:REM Back to main loop 5000 REM READ IN MACHINE LANGUAGE ROUTINE FOR MOVING CHAR SET 5010 FOR I=0 TO 49:REM 49 machine language commands to read 5020 READ DAT:POKE 1536+I,DAT:REM Store code on page 6 5030 NEXT I:REM Loop 5040 M=USR(1536,GRTOP,1,4):REM Execute machine code 5050 REM REDEFINE CHARS A TO J 5060 CHRAM=CHRAM+264:REM Jump ahead to letter A to J 5070 FOR I=1 to 16:REM There are 16 characters to redefine 5080 FOR ADDR=CHRAM TO CHRAM+7:REM Each character 8 bytes 5090 READ DAT:POKE ADDR,DAT:REM Poke new characters 5100 NEXT ADDR:REM Loop 5110 CHRAM=CHRAM+8:REM Jump ahead 8 bytes for next one 5120 NEXT I:REM Loop 5130 REM DRAW DEATH STAR 5140 POSITION 3,2 5150 PRINT #6; "AEIM" 5160 POSITION 3,3 5170 PRINT #6; "BFJN" 5180 POSITION 3,4 5190 PRINT #6; "CGKO" 5200 POSITION 3,5 5210 PRINT #6; "DHLP" 5220 POSITION 3,6 5230 REM DRAW STARS 5240 POSITION 1,1 5250 PRINT #6; "*" 5260 POSITION 12,2 5270 PRINT #6; "*" 5280 POSITION 3,10 5290 PRINT #6; "*" 5300 POSITION 14,8 5310 PRINT #6; "*" 5320 POSITION 18,5 5330 PRINT #6; "*" 5340 POSITION 18,5 5350 PRINT #6; "*" 5400 RETURN 6000 REM INITIALIZE VBLANK FAST PLAYER MOVEMENT ROUTINE 6010 FOR I=1536 TO 1706:REM Read in ML code 6020 READ A:POKE I,A 6030 NEXT I 6040 FOR I=1774 TO 1787:REM Clear out memory used by ML code 6050 POKE I,0 6060 NEXT I 6100 REM INITIALIZE PLAYER-MISSILE GRAPHICS 6110 REM First zero out the player memory area 6120 FOR I=PMBASE+1023 TO PMBASE+2047 6130 POKE I,0 6140 NEXT I 6150 REM Next load the player 0 shape data into memory 6160 FOR I=PMBASE+1025 TO PMBASE+1038 6170 READ A:POKE I,A 6180 NEXT I 6200 REM Initialize the player-missle graphics options 6210 POKE 559,62:REM 62 here for single-line resolution 6220 POKE 623,1:REM Set playfield priorities 6230 POKE 1788,PM+4:REM Specify first page with PM data 6240 POKE 53277,3:REM 3 enables PM graphics 6250 POKE 53256,1:REM P0 size, 1=double 6260 POKE 54279,PM:REM Tell ANTIC where the start of PM memory is 6270 X=USR(1696):REM Execute VBLANK machine language code 6300 RETURN 7000 REM MACHINE LANGUAGE ROUTINE FOR MOVING CHAR SET 7010 DATA 104,169,224,133,206,104,104,133,204,104,104,201,1,240,4,230 7020 DATA 206,230,204,104,104,141,176,6,169,0,133,205 7030 DATA 133,203,168,177,205,145,203,200,208,249,230 7040 DATA 206,230,204,206,176,6,208,240,96,0,0 7100 REM DATA FOR REDEFINED CHARACTERS (DEATH STAR) 7110 DATA 0,0,3,7,15,15,31,31 7120 DATA 63,63,127,127,127,127,127,127 7130 DATA 0,127,127,127,127,127,63,63 7140 DATA 31,31,15,15,7,1,0,0 7150 DATA 0,63,255,255,255,255,255,207 7160 DATA 135,3,3,135,207,255,255,255 7170 DATA 0,255,255,255,255,255,255,255 7180 DATA 255,255,255,255,255,255,63,0 7190 DATA 0,252,255,255,255,255,255,255 7200 DATA 255,255,255,255,255,255,255,255 7210 DATA 0,255,255,255,255,255,255,255 7220 DATA 255,255,255,255,255,255,252,0 7230 DATA 0,0,128,224,240,240,248,248 7240 DATA 252,252,254,254,254,254,254,254 7250 DATA 0,254,254,254,254,254,252,252 7260 DATA 248,248,240,240,224,128,0,0 8000 REM VBLANK INTERRUPT ROUTINE (FAST PLAYER MOVEMENT) 8010 DATA 162,3,189,244,6,240,89,56,221,240,6,240,83,141,254,6,106,141 8020 DATA 255,6,142,253,6,24,169,0,109,253,6,24,109,252,6,133,204,133 8030 DATA 206,189,240,6,133,203,173,254,6,133,205,189,248,6,170,232,46,255 8040 DATA 6,144,16,168,177,203,145,205,169,0,145,203,136,202,208,244,76,87 8050 DATA 6,160,0,177,203,145,205,169,0,145,203,200,202,208,244,174,253,6 8060 DATA 173,254,6,157,240,6,189,236,6,240,48,133,203,24,138,141,253,6 8070 DATA 109,235,6,133,204,24,173,253,6,109,252,6,133,206,189,240,6,133 8080 DATA 205,189,248,6,170,160,0,177,203,145,205,200,202,208,248,174,253,6 8090 DATA 169,0,157,236,6,202,48,3,76,2,6,76,98,228,0,0,104,169 8100 DATA 7,162,6,160,0,32,92,228,96 9000 REM PLAYER SHAPE DATA (DARTH VADER TIE FIGHTER) 9010 DATA 66,129,129,153,153,255,255,255,255,153,153,129,129,66