1 REM *** BASIC SPRITES *** 2 REM A SHIP AND A ROCKET DEMONSTRATE SPRITE CREATION AND MOVEMENT 9 REM *** SET-UP SUBROUTINES *** 10 GOSUB 600:REM (VIDEO MEMORY) 11 GOSUB 700:REM (BACKGROUND) 12 GOSUB 800:REM (SPRITE SHAPES) 13 GOSUB 900:REM (SPRITE POSITIONS) 15 GOTO 100 98 REM *** ACTION LOOP *** 100 VP=VP+1:IF VP>VZ THEN VP=0 110 HP=HP-1:IF HP<0 THEN HP=HZ 120 POKE VT(1),VV(VP) 130 POKE HT(0),HH(HP):POKE HR,HB(HP):POKE HT(1),HH(HP) 140 WV=WV-1:IF WV<1 THEN WV=8 150 PRINT DD$MID$(ST$,WV,40)""; 196 GOTO 100 198 REM *** WAIT FOR RESPONSE *** 296 RETURN 298 REM *** ENDING ROUTINES *** 300 PRINT "[147]FINAL SCORE: "RT*100+VP*10:PRINT:PRINT:VP=15:POKE VT(0),VV(VP) 310 PRINT "TO PLAY AGAIN, PRESS P":PRINT "TO QUIT, PRESS Q":HP=79 315 HP=79:POKE HR,HB(HP):POKE HT(0),HH(HP):XP=1:POKE LT(0),ST(XP) 320 Z=PEEK(203):IF Z=62 THEN 370 325 POKE HT(0),HH(HP):POKE HR,HB(HP) 330 HP=HP+1:IF HP>HZ THEN HP=0 345 IF Z<>41 THEN 320 350 EG=0:DL=0:DT=1:DS=5:RT=0:RC=0:GOSUB 930:GOTO 100 369 REM ** PUT VIDEO MEMORY BACK TO FIRST BLOCK, AND SCREEN MEMORY TO 1024 370 POKE 56578,PEEK(56578)OR3:POKE 56576,(PEEK(56576)AND 252)OR 3 371 POKE 53272,20:POKE 648,4 379 REM ** REENABLE SHIFT/COMMODORE AND RUN-STOP/RESTORE 380 POKE 657,0:POKE 792,71:POKE 808,237 390 END 598 REM *** ARRANGE MEMORY *** 599 REM USE FIRST VIDEO BLOCK (0 TO 16383) SO NOTHING FANCY HAS TO BE DONE. 600 VB=0 601 REM ** SCREEN MEMORY STAYS WHERE IT IS 608 REM *** REGISTER ADDRESSES *** 609 REM ** SPRITE SHAPE LOCATION TABLE 610 LT(0)=2040:FOR I=1 TO 7:LT(I)=LT(I-1)+1:NEXT 611 REM ** SPRITE COLOR TABLE 612 CT(0)=53287:FOR I=1 TO 7:CT(I)=CT(I-1)+1:NEXT 613 REM ** SPRITE HORIZONTAL POSITION TABLE (LOW BYTES) 614 HT(0)=53248:FOR I=1 TO 7:HT(I)=HT(I-1)+2:NEXT 615 REM ** SPRITE VERTICAL POSITION TABLE 616 VT(0)=53249:FOR I=1 TO 7:VT(I)=VT(I-1)+2:NEXT 617 REM ** SPRITE HORIZONTAL HIGH-BIT REGISTER 618 HR=53264 619 REM ** SPRITE ENABLE REGISTER 620 ES=53269 621 REM ** VERTICAL EXPANSION REGISTER (1=DOUBLE HEIGHT) 622 VE=53271 623 REM ** HORIZONTAL EXPANSION REGISTER (1=DOUBLE WIDTH) 624 HE=53277 625 REM ** SPRITE PRIORITY REGISTER (1=SPRITE IS IN FRONT OF FOREGROUND) 626 PR=53275 627 REM ** MULTICOLOR ENABLE REGISTER (1=MULTI-COLOR ENABLED) 628 EM=53276 629 REM ** SPRITE MULTICOLOR COLOR REGISTERS 630 MR=53285:REM ('01' REGISTER: ADD 1 TO MR FOR '11' REGISTER) 631 REM ** SPRITE-SPRITE COLLISION REGISTER 632 CS=53278 633 REM ** SPRITE-FOREGROUND COLLISION REGISTER 634 CF=53279 635 REM ** SET-BIT AND CLEAR-BIT VALUES 636 BS(0)=1:FOR I=1 TO 7:BS(I)=2*BS(I-1):NEXT 637 FOR I=0 TO 7:BC(I)=255-BS(I):NEXT 638 REM *** INITIALIZE VALUES *** 639 REM ** FOREGROUND COLOR 640 POKE 53281,6:PRINT "[147]";:REM (BLUE) 641 REM ** BACKGROUND COLOR 642 POKE 53281,14:REM (LIGHT BLUE) 643 REM ** BORDER COLOR 644 POKE 53280,0:REM (BLACK) 645 REM ** SPRITE COLORS (DEFAULTS: WHI,RED,L-GRN,PUR,GRN,BLU,YEL,M-GRAY) 646 POKE CT(0),0:POKE CT(1),2:REM (THE SHIP IS BLACK, THE ROCKET RED) 647 REM ** SET PRIORITY 648 POKE PR,255:REM (ALL BEHIND) 649 REM ** SET HORIZONTAL SIZES 650 POKE HE,1:REM (SHIP IS DOUBLE WIDTH, ROCKET IS NORMAL WIDTH) 651 REM ** SET VERTICAL SIZES 652 POKE VE,2:REM (ROCKET IS DOUBLE HEIGHT) 653 REM ** ENABLE SPRITES 654 POKE ES,BS(0) OR BS(1):REM (SPRITES 0 AND 1) 696 RETURN 698 REM *** SET UP OCEAN *** 700 R$=CHR$(18):RX$=CHR$(146):B$=" " 701 FD$=CHR$(162)+CHR$(185)+CHR$(175)+CHR$(228) 703 FU$=B$+CHR$(228)+CHR$(175)+CHR$(185) 705 S$=R$:FOR I=1 TO 40:S$=S$+B$:NEXT:S$=S$+RX$ 706 ST$=FU$+FD$+FU$+FD$+FU$+FD$:ST$=ST$+ST$ 707 DD$="" 708 WV=8 710 PRINT "[147]"DD$MID$(ST$,WV,40)S$S$S$LEFT$(S$,40)""RX$; 711 POKE 2023,160 796 RETURN 798 REM *** SPRITE SHAPES *** 799 REM ** NUMBER OF SPRITE SHAPES (-1);NUMBER OF LINES PER SPRITE SHAPE (-1) 800 NS=1 801 REM ** LOCATE SPRITE SHAPE MEMORY 802 ST(0)=13:ST(1)=14 803 REM ** LOOPS 804 FOR I=0 TO NS:FOR J=0 TO 20:READ SS$:FOR K=0 TO 2:X=0:Y=VB+ST(I)*64+J*3+K 805 REM ** CONVERT STRINGS TO SHAPE BYTES (USE BS(0-7) TO SET BITS) 806 FOR L=1 TO 8:M=L+8*K:M=ASC(MID$(SS$,M,1)):IF M=42 THEN X=X OR BS(8-L) 807 NEXT:POKE Y,X:NEXT:NEXT:NEXT 809 REM SPRITE SHAPE DATA, 21 LINES PER SHAPE: *='ON' .='OFF' 810 DATA ".........*.............." 811 DATA ".........*.............." 812 DATA ".........*..**.........." 813 DATA ".........*..**.........." 814 DATA "........**..**.........." 815 DATA "........**.***.........." 816 DATA ".........*****.........." 817 DATA ".......*********........" 818 DATA "************************" 819 DATA "************************" 820 DATA "..********************.." 821 DATA "...******************..." 822 DATA "...******************..." 823 DATA "...*******************.." 824 DATA "....******************.." 825 DATA ".....*****************.." 826 DATA "........................" 827 DATA "........................" 828 DATA "........................" 829 DATA "........................" 830 DATA "........................" 831 REM ** 2ND SPRITE SHAPE 832 DATA ".....................*.." 833 DATA ".....................*.." 834 DATA "....................***." 835 DATA "....................***." 836 DATA "....................***." 837 DATA "....................***." 838 DATA "....................***." 839 DATA "....................***." 840 DATA "....................*.*." 841 DATA "....................*.*." 842 DATA "........................" 843 DATA "........................" 844 DATA "........................" 845 DATA "........................" 846 DATA "........................" 847 DATA "........................" 848 DATA "........................" 849 DATA "........................" 850 DATA "........................" 851 DATA "........................" 852 DATA "........................" 853 DATA "........................" 896 RETURN 898 REM *** SPRITE POSITIONS *** 899 REM ** POSSIBLE POSITIONS DIM'ED 900 VZ=32:HZ=362:DIM HH(HZ),VV(VZ),HB(HZ) 901 REM ** ASSIGN HORIZONTAL VALUES 902 X=0:B=0:FOR I=0 TO HZ:HH(I)=X:HB(I)=B 903 X=X+1:IF X>255 THEN X=X-256:B=3 904 NEXT 905 REM ** ASSIGN VERTICAL VALUES 906 X=202:FOR I=0 TO 9:VV(I)=X:X=X-1:NEXT:FOR I=10 TO 14:VV(I)=X:X=X-2:NEXT 907 :FOR I=15 TO 18:VV(I)=X:X=X-3:NEXT:FOR I=19 TO 21:VV(I)=X:X=X-6:NEXT 908 FOR I=22 TO VZ:VV(I)=X:X=X-12:NEXT 929 REM ** INITIAL SPRITE POSITIONING 930 HP=160:VP=0 931 POKE VT(0),VV(VP):POKE HT(0),HH(HP):POKE HR,HB(HP) 932 POKE VT(1),VV(VP):POKE HT(1),HH(HP) 939 REM ** TELL VIC-2 WHERE TO FIND SPRITE SHAPES 940 POKE LT(0),ST(0):POKE LT(1),ST(1) 996 RETURN