home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Ahoy 1985 September
/
Ahoy_Magazine_85-09_1985_Double_L.d64
/
pig
(
.txt
)
< prev
next >
Wrap
Commodore BASIC
|
2022-10-26
|
7KB
|
197 lines
1 rem *** pig in a poke ***
2 rem an example of game programming with a sprite
4 rem ** move top of memory to make room for video block at 32768
5 poke 55,255:poke 56,127:poke 643,255:poke 644,127
9 rem *** set-up subroutines ***
10 gosub 600:rem (video memory)
11 gosub 700:rem (background string)
12 gosub 800:rem (sprite shapes)
13 gosub 900:rem (sprite positions)
15 goto 100
98 rem *** action loop ***
100 k=kp(peek(653)):if k>2 or eg=1 then 300
105 if k>1 then 130
110 hp=hp+k(k):if hp<0 then hp=hz
115 if hp>hz then hp=0
120 if k<>xk then xk=k:poke lt(0),st(xk)
125 poke ht(0),hh(hp):poke hr,hb(hp)
130 if val(ti$)>=dt then gosub 500
135 if peek(cf)>0 then gosub 400
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
398 rem *** collision handler ***
399 rem ** end game?
400 vp=vp-1:if vp<0 then eg=1:return
401 rem ** move up
402 poke vt(0),vv(vp)
403 rem ** clear collision register
404 z=peek(cs):z=peek(cf)
405 rem ** new collision?
406 if peek(cf)>0 then 400
496 return
498 rem *** scroll routine ***
499 rem ** new row or simple jump?
500 if rc=ds then 506
501 rem ** simple jump
502 print "";
503 rc=rc+1:goto 520
505 rem ** put new row on screen
506 print ""mid$(ws$,wl(dl)+int(19*rnd(9)),40)"";
508 rc=0:rt=rt+1:dl=dl+1:if dl>8 then dl=0:ds=ds-1
509 rem ** end of game?
510 if rt>49 then eg=1
520 if peek(cf)>0 then gosub 400:rem ** collision
580 poke 217,l1:poke 218,l2
589 rem ** reset timer
590 ti$="000000"
596 return
598 rem *** arrange memory ***
599 rem use third video block (32768 to 49151), so rom character set is usable.
600 vb=32768:poke 56578,peek(56578)or3:poke 56576,(peek(56576)and 252)or 1
601 rem ** tell vic-2 where screen is without changing character set location
602 sb=0:poke 53272,(sb*16)+4:sb=vb+1024*sb
603 rem ** tell basic where screen is
604 bb=sb/256:poke 648,bb
608 rem *** register addresses ***
609 rem ** sprite shape location table
610 lt(0)=sb+1016: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,9:print "[147][149]";:rem (brown)
641 rem ** background color
642 poke 53281,5 :rem (green)
643 rem ** border color
644 poke 53280,9:rem (brown)
645 rem ** sprite colors (defaults: whi,red,l-grn,pur,grn,blu,yel,m-gray)
646 poke ct(0),1:rem (the pig is white)
647 rem ** set priority
648 poke pr,0:rem (all in front)
649 rem ** set horizontal sizes
650 poke he,0:rem (all normal width)
651 rem ** set vertical sizes
652 poke ve,0:rem (all normal height)
653 rem ** enable sprites
654 poke es,bs(0):rem (sprite 0 only)
689 rem *** safety procedures ***
690 poke 657,128:rem disable shift/commodore character set switch
691 poke 808,234:poke 792,193:rem disable stop and stop/restore
696 return
698 rem *** background string ***
700 wc$="[214]":bc$=" "
709 rem set up wall string
710 for i=1 to 12
714 rem each wall unit is wider, each gap narrower
715 for j=1 to 5+i:ws$=ws$+wc$:next
720 for j=1 to 15-i:ws$=ws$+bc$:next
725 next
729 rem set wall starting points
730 wl(0)=1:for i=1 to 9:wl(i)=wl(i-1)+20:next
739 rem set difficulty levels (dl=spacing; dt=timing; ds=vertical spacing)
740 dl=0:dt=1:ds=5
796 return
798 rem *** sprite shapes ***
799 rem ** number of sprite shapes (-1);number of lines per sprite shape (-1)
800 ns=1:ts=9
801 rem ** locate sprite shape memory
802 st(0)=16:for i=1 to ns:st(i)=st(i-1)+1:next
803 rem ** loops
804 for i=0 to ns:for j=0 to ts: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:print ss$:next
808 z=64-(ts*3+2):for j=y+1 to y+z:poke j,0: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 rem ** 2nd shape
821 data ".**..............*......"
822 data "*.....******....**......"
823 data ".*.****************....."
824 data "..****************.*...."
825 data ".**********************."
826 data ".**********************."
827 data "..*****************....."
828 data "...**************......."
829 data "....**.*.....*.**......."
830 data "....**.**...**..**......"
896 return
898 rem *** sprite positions ***
899 rem ** possible positions dim'ed
900 vz=19:hz=147:dim hh(hz),vv(vz),hb(hz)
901 rem ** assign horizontal values
902 x=24:b=0:for i=0 to hz:hh(i)=x:hb(i)=b
903 x=x+2:if x>255 then x=x-256:b=1
904 next
905 rem ** assign vertical values
906 x=53:for i=0 to vz:vv(i)=x:x=x+8:next
919 rem ** keypress matrix
920 dim kp(7),k(2)
921 for i=0 to 7:kp(i)=2:next:kp(1)=1:kp(2)=0:kp(7)=3
922 k(0)=-1:k(1)=1:k(2)=0
929 rem ** initial sprite positioning
930 hp=79:vp=vz:xk=1
931 poke vt(0),vv(vp):poke ht(0),hh(hp):poke hr,hb(hp)
939 rem ** tell vic-2 where to find sprite shape
940 poke lt(0),st(xk)
949 rem ** create screen display
950 print "[147]";:for i=0 to 5:for j=0 to ds:print "";:next
955 print mid$(ws$,1+int(19*rnd(9)),40);:next:print "";
959 rem ** clear screen line link table
960 l1=peek(217)or 128:l2=peek(218)or 128:poke 217,l1:poke 218,l2
969 rem ** clear collision registers
970 z=peek(cf):z=peek(cs)
989 rem ** set clock
990 ti$="000000"
996 return