start tok64 d64-IvQHkS 0 REM"{delete*7} p.j.ponzo*83*waterloo/ontario 1 REM"{delete*6} 1000 GOSUB60000:PRINTCHR$(142):PRINT"{clear}{space*15}{reverse on}{blue}sprites-2" 1001 PRINT"{red}{cm a}{sh asterisk*37}{cm s}" 1002 PRINT"{sh -} {reverse on}{blue}{space*10}more on sprites{space*10}{red}{reverse off} {sh -}":ms$="ponzotutor" 1003 PRINT"{red}{cm z}{sh asterisk*37}{cm x}{black}":GOSUB63100:ms$=" welcome!" 1005 GOSUB63100:GOSUB10000 1010 v=53248:POKE2040,13:POKEv+1,150:POKEv,150:POKEv+39,1:POKEv+29,1:POKEv+23,1 1020 POKEv+39,6:POKEv+21,1:PRINT"{home}{down*6}this is a blue sprite.":FORt=1TO900:NEXT 1030 PRINT"{down}a 'sort-of' lunar lander.":FORt=1TO1000:NEXT 1040 PRINT"{down}let's look at it more closely." 1050 ms$="let's look":GOSUB63100:GOSUB63000:POKEv+21,0 1060 PRINT"{clear}{down*6}we'll display the pixels that make" 1070 PRINT"{down}up this sprite{.*3}":GOSUB63000 1075 POKEv,255:POKEv+1,180:POKEv+21,1 1080 PRINT"{clear}":GOSUB10200 1085 FORi=1TO5 1086 PRINTdn$"{reverse on}now, in binary{space*13}":FORt=1TO50:NEXT 1087 PRINTdn$"{reverse on}{space*27}":FORt=1TO50:NEXT 1088 NEXT:GOSUB10400 1090 FORi=1TO5 1091 PRINTdn$"{reverse on}{.*3}and in bit-pairs{space*8}":FORt=1TO50:NEXT 1092 PRINTdn$"{reverse on}{space*27}":FORt=1TO50:NEXT 1093 NEXT 1100 GOSUB10500:GOSUB63000 1110 PRINTps$"now we'll{space*3}" 1120 PRINTps$"{down}choose 4{space*4}" 1130 PRINTps$"{down*2}colours and " 1140 PRINTps$"{down*3}set each{space*4}" 1150 PRINTps$"{down*4}pixel pair{space*2}" 1160 PRINTps$"{down*5}to a colour " 1170 PRINTps$"{down*6}according to" 1180 PRINTps$"{down*8}{reverse on}00{reverse off}=colour #0" 1190 PRINTps$"{down*9}{reverse on}01{reverse off}=colour #1" 1200 PRINTps$"{down*10}{reverse on}10{reverse off}=colour #2" 1210 PRINTps$"{down*11}{reverse on}11{reverse off}=colour #3":GOSUB63000 1215 GOSUB10600:FORi=1TO5:PRINTdn$"base of video chip":FORt=1TO50:NEXT 1216 PRINTdn$"{reverse on}base of video chip":FORt=1TO50:NEXT:NEXT 1220 PRINTps$"v=53248:video":v=53248 1225 GOSUB63000:PRINTdn$"{black}set colour #0=1(white)" 1230 PRINTps$"{down}{reverse on}pokev+33,1 ":POKEv+33,1 1240 GOSUB63000:PRINTdn$"{reverse on}v+33=53281(background)" 1245 GOSUB63000:PRINTdn$"set colour #1=0(black)" 1250 PRINTps$"{down*2}{reverse on}pokev+37,0 ":POKEv+37,0 1260 GOSUB63000:PRINTdn$"{reverse on}v+37=sprite multi-colour reg'r #0" 1265 GOSUB63000:PRINTdn$"set colour #2=2(red)" 1270 PRINTps$"{down*3}{reverse on}pokev+39,2 ":GOSUB63000:POKEv+39,2 1280 GOSUB63000:PRINTdn$"{reverse on}v+39=colour register for sprite #0" 1285 GOSUB63000:PRINTdn$"set colour #3=3(cyan)" 1290 PRINTps$"{down*4}{reverse on}pokev+38,3 ":POKEv+38,3 1300 GOSUB63000:PRINTdn$"{reverse on}v+38=sprite multi-colour reg'r #1" :GOSUB63000 1305 PRINTdn$"{reverse on}please note{!*3}":GOSUB63000 1310 PRINTdn$"{reverse on}pokev+39,2{reverse off} changed sprite to red":GOSUB63000 1320 PRINTdn$"& {reverse on}pokev+33,1{reverse off} changed background":GOSUB63000 1330 FORi=1TO5 1331 PRINTdn$"{reverse on}but where's the black and cyan??":FORt=1TO50:NEXT 1332 PRINTdn$"{reverse on}{space*32}":FORt=1TO50:NEXT 1333 NEXT 1340 ms$=" watch!!":PRINT"{clear}":POKEv+21,0:GOSUB63100:PRINT"{clear}":GOSUB10700 1350 GOSUB60000:ms$="how to do?":GOSUB63100 1360 PRINT"{clear}the {reverse on}00{reverse off} colour was 'background'" 1370 PRINT"{down}(and shared by all visible sprites)" 1380 PRINT"{down}and {reverse on}poke v+33{reverse off} changes this colour." 1390 PRINT"{down}the {reverse on}10{reverse off} colour was the 'sprite colour'" 1400 PRINT"{down}(and can be different for each sprite)" 1410 PRINT"{down}and {reverse on}poke v+39+n{reverse off} changes this colour" 1420 PRINT"{down}(for sprite #n, with n=0 to 7)." 1430 ms$="{reverse on}01{reverse off} & {reverse on}11{reverse off}{?*3}":GOSUB63100:GOSUB63000 1440 PRINT"{clear}then, in registers {reverse on}v+37{reverse off} & {reverse on}v+38{reverse off}" 1450 PRINT"{down}are the {reverse on}sprite multi-colours{reverse off}!!" 1460 PRINT"{down}{reverse on}poke v+37{reverse off} and {reverse on}poke v+38{reverse off} with the" 1470 PRINT"{down}colours you want for the {reverse on}01{reverse off} and {reverse on}11" 1480 PRINT"{down}bit pairs!!":ms$="all shared":GOSUB63100:GOSUB63000 1490 PRINT"{clear}ok..our background changes and so does" 1500 PRINT"{down}our 'sort-of' sprite." 1510 PRINT"{down}now to {reverse on}enable{reverse off} multi-colour for" 1520 PRINT"{down}sprite #n, we: {reverse on}poke v+28,2^n{reverse off}!!":ms$="enable #n":GOSUB63100:GOSUB63000 1530 PRINT"{clear}{down*5}still no change in our sprite!":GOSUB63000 1540 PRINT"{clear}we must put the c64 video chip into:" 1550 PRINT"{down}{reverse on}multi-colour mode":PRINT"{down*2}{reverse on}poke v+22,peek(v+22)or16" 1560 PRINT"{down}setting {reverse on}bit 4{reverse off}={reverse on}m{reverse off}ulti {reverse on}c{reverse off}olour {reverse on}m{reverse off}ode bit" 1570 PRINT"{down}then those sprites which were" 1580 PRINT"{down}{reverse on}multi-colour enabled{reverse off} (pokev+28,2^n)" 1590 PRINT"{down}become 'multi-coloured'!!":ms$="beautiful!":GOSUB63100:GOSUB63000 1600 PRINT"{clear}{down*3}now you{down}{left*3}{cm u*3}{up} change the colours" 1610 PRINT"{down}of out lunar lander!" 1620 PRINT"{down}just hit {reverse on}0{reverse off} or {reverse on}1{reverse off} or {reverse on}2{reverse off} or {reverse on}3{reverse off} to" 1630 PRINT"{down}change colour #0,#1,#2 or #3." 1640 PRINT"{down*3}{.*3}and hit 'q' to quit!":ms$=" ready?":GOSUB63100:GOSUB63000 1645 PRINT"{clear}":v=53248:POKEv+22,216:GOSUB10700 1650 DIM cm$(15):dd$="{home}{down*20}":k=1:d0$=dd$+bl$+dd$:PRINT"{home}{down*2}"; 1651 cm$(1)="video chip base address" 1652 cm$(2)="put 'shape' into a block" 1653 cm$(3)="point chip to block" 1654 cm$(4)="set {reverse on}00{reverse off} colour (background)" 1655 cm$(5)="set {reverse on}01{reverse off} colour (colour reg'r #0)" 1656 cm$(6)="set {reverse on}10{reverse off} colour (sprite colour)" 1657 cm$(7)="set {reverse on}11{reverse off} colour (colour reg'r #1)" 1658 cm$(8)="give sprite #n an x-position" 1659 cm$(9)="give sprite #n a y-position" 1660 cm$(10)="expand in y-direction" 1661 cm$(11)="expand in x-direction" 1662 cm$(12)="put {reverse on}chip{reverse off} into multi-colour mode" 1663 cm$(13)="{reverse on}sprite{reverse off} #n into multi-colour mode" 1700 GOSUB60000:PRINT"{clear}review:":PRINT"{cm u*6}" 1710 PRINT"{reverse on}v=53248{space*26}":GOSUB10900 1720 PRINT"{reverse on}fori=0to62:readx:poke832+i,x:next":GOSUB10900 1730 PRINT"{reverse on}poke2040+n,13{space*20}":GOSUB10900 1740 PRINT"{reverse on}pokev+33,c0{space*22}":GOSUB10900 1750 PRINT"{reverse on}pokev+37,c1{space*22}":GOSUB10900 1760 PRINT"{reverse on}pokev+39+n,c2{space*20}":GOSUB10900 1770 PRINT"{reverse on}pokev+38,c3{space*22}":GOSUB10900 1780 PRINT"{reverse on}pokev+2*n,x{space*22}":GOSUB10900 1790 PRINT"{reverse on}pokev+2*n+1,y{space*20}":GOSUB10900 1800 PRINT"{reverse on}pokev+23,1{space*23}":GOSUB10900 1810 PRINT"{reverse on}pokev+29,1{space*23}":GOSUB10900 1820 PRINT"{reverse on}pokev+22,peek(v+22)or16{space*10}":GOSUB10900 1830 PRINT"{reverse on}pokev+28,2^n{space*21}":GOSUB10900 9999 ms$="au revoir":PRINT"{clear}":GOSUB63100:END 10000 REM lander sprite 10005 FORi=0TO62:READx:POKE832+i,x:NEXT:RETURN 10010 DATA0,119,64,1,189,208,7,191,116 10011 DATA30,170,100,30,170,100,30,170,100 10012 DATA21,21,84,21,21,84,30,170,100 10013 DATA30,170,100,27,187,116,27,187,116 10014 DATA27,187,116,27,163,116,27,163,116 10015 DATA5,85,80,7,227,80,23,35,84 10016 DATA17,97,68,84,85,21,84,0,21 10100 REM sprite border 10105 PRINT"{home}{reverse on}{space*12}{1*10}{2*5}" 10110 PRINT"{reverse on}{space*3}123456789012345678901234" 10120 FORi=1TO21:i$=STR$(i):i$=RIGHT$(" "+i$,2):PRINT"{reverse on}"i$:NEXT:RETURN 10200 REM display pixels 10205 PRINT"{home}{down}":FORi=0TO62STEP3:x=PEEK(832+i) 10210 FORj=7TO0STEP-1 10220 IFxANDp(j)THENPRINTs$(1);:GOTO10240 10230 PRINTs$(0); 10240 NEXT:x=PEEK(832+i+1) 10250 FORj=7TO0STEP-1 10260 IFxANDp(j)THENPRINTs$(1);:GOTO10280 10270 PRINTs$(0); 10280 NEXT:x=PEEK(832+i+2) 10290 FORj=7TO0STEP-1 10300 IFxANDp(j)THENPRINTs$(1);:GOTO10320 10310 PRINTs$(0); 10320 NEXT:PRINT:NEXT:GOSUB10100:RETURN 10400 REM sprite in binary 10405 PRINT"{home}{down*2}{right*3}"; 10410 FORi=0TO20:FORj=3TO26:IFPEEK(1104+40*i+j)=160THENPRINT"1";:GOTO10430 10420 PRINT"0";: 10430 NEXT:PRINT:PRINT"{right*3}";:NEXT:RETURN 10500 REM sprite in bit pairs 10505 PRINT"{home}{down*2}{right*3}";:k=0:a=1104:b=0:c=20:d=3:e=26:f=4:g=49:h=40:a$="1":b$="0" 10510 FORi=bTOc:FORj=dTOe:IFPEEK(a+h*i+j)=gTHENPRINTr$(k)a$;:GOTO10530 10520 PRINTr$(k)b$; 10530 k=k+1:IFk=fTHENk=b 10540 NEXT:PRINT:k=b:PRINT"{right*3}";:NEXT:RETURN 10600 REM clear 10610 FORi=1TO20:PRINTps$"{up}";:FORj=1TOi:PRINT"{down}";:NEXT 10620 PRINT"{space*12}":NEXT:RETURN 10700 REM move sprite 10705 PRINT"{clear}{black}hit 'q' to quit":POKE53281,1 10710 v=53248:POKEv+28,1:POKEv+21,1:POKEv+29,o:POKEv+23,0:f=0:g=255 10720 FORt=fTOg:x=t:y=t:POKEv,x:POKEv+1,y:GETa$:IFa$="q"THEN10795 10725 GOSUB10800:NEXT 10730 POKEv+29,1:POKEv+23,0 10740 FORt=gTOfSTEP-1:x=t:y=t:POKEv,x:POKEv+1,y:GETa$:IFa$="q"THEN10795 10745 GOSUB10800:NEXT 10750 POKEv+29,0:POKEv+23,1 10760 FORt=fTOg:x=t:y=g-t:POKEv,x:POKEv+1,y:GETa$:IFa$="q"THEN10795 10765 GOSUB10800:NEXT 10770 POKEv+29,1:POKEv+23,1 10780 FORt=gTOfSTEP-1:x=t:y=g-t:POKEv,x:POKEv+1,y:GETa$:IFa$="q"THEN10795 10790 GOSUB10800:NEXT:GOTO10710 10792 GOSUB10800:NEXT 10795 POKEv+21,0:RETURN 10800 IFa$=""THENRETURN 10810 a=VAL(a$):cc=cc+1:IFcc>15THENcc=0 10820 ON a+1 GOTO10830,10840,10850,10860 10825 RETURN 10830 POKEv+33,cc:RETURN 10840 POKEv+37,cc:RETURN 10850 POKEv+39,cc:RETURN 10860 POKEv+38,cc:RETURN 10900 REM comment 10905 PRINTd0$cm$(k):GOSUB63000:PRINTLEFT$(dd$,k+3):k=k+1:RETURN 60000 REM initialize 60001 bt$="{home}":FORi=1TO24:bt$=bt$+"{down}":NEXT:PRINTCHR$(142) 60002 pt$="{red}{cm a}{sh asterisk*10}{cm s}{down}{left*12}{sh -}{right*10}{sh -}{down}{left*12}{cm z}{cm r}{sh asterisk*8}{cm r}{cm x}" 60003 pt$=pt$+"{down}{left*13}N{cm t*12}M{down}{left*14}{cm g}{green}{=*12}{black}{cm m}" 60004 pt$=pt$+"{down}{left*14}PO{cm t*10}PO{up*4}{left*12}" 60005 pt$=bt$+"{up*6}{right*26}"+pt$ 60007 ml$="{home}{down*9}{right*27}" 60008 wd=40:crt=1024 60009 POKE53281,15:POKE53280,12:PRINT"{black}" 60010 v=53248:FORi=0TO16:POKEv+i,0:NEXT 60011 POKEv+23,0:POKEv+29,0:FORi=0TO7:POKEv+39+i,0:NEXT:POKEv+22,200:POKEv+28,0 60020 s$(0)=" ":s$(1)="{reverse on} {reverse off}" 60030 dn$="{home}{down*23}" 60035 bl$="{space*39}":dn$=dn$+bl$+dn$ 60040 ps$="{home}{down*2}{right*27}" 60045 r$(0)="{reverse off}":r$(1)="{reverse off}":r$(2)="{reverse on}":r$(3)="{reverse on}" 60100 FORj=0TO7:p(j)=2^j:NEXT 60200 RETURN 62000 GOSUB63000 62001 PRINTsd$cl$:PRINTcl$:PRINTcl$ 62003 RETURN 63000 PRINT"{home}{down*24}{black}hit {reverse on}return{reverse off} to continue"; 63001 GETa$:IFa$<>""THEN63001 63002 GETa$:IFa$=""THEN63002 63003 RETURN 63100 FORt=1TO5:PRINTpt$ms$; 63101 PRINTpt$"{space*10}"; 63102 PRINTpt$ms$;:NEXT 63103 PRINT"{black}":RETURN 63900 sd$="{home}{down*18}":cl$="{reverse off}{space*38}{reverse off}" 63901 sr$="{right*40}" 63902 RETURN stop tok64 (bastext 1.0)