Asteroidi – C64 – BASIC/LM

Rivista: Commodore Computer Club (IT) – N.ro: 14 / ottobre 1984 – Trascrizione: David La Monaca

Tra le pagine del numero 14 di Commodore Computer Club che stiamo sfogliando e digitalizzando in questo periodo, spicca un gioco completo che potrebbe tranquillamente essere definito come un “classico” di questo periodo per il C64. Il joystick in porta 2, un’astronave colorata che sfreccia negli spazi siderali, tanti asteroidi pericolosi da evitare e pacchetti di energia supplementare da raccogliere durante il viaggio interstellare verso la prossima stazione, mèta della nostra missione.

Asteroidi è un gioco a scorrimento verticale, scritto in BASIC, che fa ampio uso di routine in linguaggio macchina per lo scrolling fine, la generazione del suono e il movimento degli sprite. Insomma, tutte le caratteristiche grafiche del C64 (e del VIC-II) vengono sfruttate per confezionare un gioco piacevole ed impegnativo.

Alla partenza, il programma vi chiede di inserire la velocità di spostamento dell’astronave inserendo un numero fra 0 e 255 (cominciate con 15, 25 e 50) e, dopo una breve presentazione, il livello di difficoltà da 1 a 10, che equivale alla rapidità di scorrimento e all’intelligenza della posizione degli asteroidi che ostacoleranno il vostro viaggio. L’area di gioco ci immerge nello spazio profondo nella parte sinistra dello schermo dove siamo impegnati con la nostra astronave a schivare grossi asteroidi che ci vengono incontro a velocità differenti. Nella parte destra un radar ci mostra in tempo reale la nostra posizione rispetto al termine di ogni settore, rappresentato dal top dello schermo. Comandi semplicissimi per evitare le collisioni con gli asteroidi (sinistra, destra, avanti e indietro e tasto Fire per raddoppiare la velocità). Anche spostando il più avanti possibile la posizione dell’astronave farà aumentare la velocità dello scrolling verticale. Il vostro compito è raggiungere la fine del settore in cui vi trovate nel più breve tempo possibile e facendo attenzione alla barra dell’energia che pian piano diminuisce fino a decretare la fine del gioco.

La schermata di game over vi mostrerà il punteggio accumulato ed il numero del settore raggiunto durante la partita. Potrete poi ritentare la missione ripartendo da zero e rispondendo affermativamente con “S” alla richiesta di replay.

Asteroidi non è soltanto un gioco accattivante che potrà tenervi impegnati per un bel po’, ma è anche un gioco didattico, nel senso che il suo listato può essere studiato e, in alcune sue parti, riutilizzato in altri giochi, come consigliato anche dall’autore originale nell’articolo che accompagna il listato nella rivista Commodore Computer Club n. 14 (a partire da pag. 34). In particolare le routine in linguaggio macchina che all’inizio del gioco vengono caricate in memoria possono essere estratte e inserite e adattate facilmente in altri programmi. I dettagli di come fare li trovate nell’articolo.

Titolo: Asteroidi
Piattaforma: Commodore 64
Genere: Gioco
Linguaggio: BASIC/LM
Autore versione originale: Andrea Scelsa
Pubblicazione: Commodore Computer Club n. 14, ottobre 1984

Digitazione/Elaborazione: David La Monaca
Anno: 2026 (marzo)
Download: file .PRG completo
Note: —

Splash screen del gioco
Un asteroide ci ha appena colpito in pieno!

Qui di seguito trovate il codice in linguaggio BASIC da copiare sul vostro Commodore 64 originale oppure su un emulatore. Per PC Windows 10/11 suggeriamo VICE con il supporto dell’editor e compilatore CBM Prg Studio.

Di seguito le istruzioni per caricare il listato sull’emulatore VICE:
– Copiare il listato qui sotto e incollatelo in CBM Prg Studio.
– I codici dei caratteri speciali presenti nel listato saranno trattati da CBM Prg Studio e convertiti nei corrispondenti simboli del BASIC V2.
– Selezionare Generate .prg (current file) per ottenere il file programma con estensione .prg (ad es. asteroidi.prg)
– Lanciare l’emulatore VICE e dal menu File > Smart attach… > asteroidi.prg
– Digitare RUN e premere il tasto Return per attivare le routine in RAM

Buon divertimento!
Download link: ccc14-asteroidi.prg

Attenzione – Nel listato i caratteri ‘>’ e ‘<‘ potrebbero essere stati sostituiti dai rispettivi codici di encoding HTML ‘&gt;’ e ‘&lt;’. Nel caso siano presenti, sostituite questi valori nel listato prima di caricarlo nell’emulatore.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
100 rem******************************
110 rem***   a s t e r o i d i    ***
120 rem***   per  commodore 64    ***
130 rem***          by            ***
140 rem***     enrico scelsa      ***
150 rem***    via magenta 180     ***
160 rem***        milano          ***
170 rem***   tel.02/24 75 129     ***
180 rem******************************
185 rem*** type-in/testing by dlm/rmw
188 rem*** checking/fixing by amigos
190 input"{clear}veloc.astronave (0-255)";x:poke676,x
200 data173,183,2,56,205,0,208,176,3,141,0,208,56,173,184,2,205,0,208
210 data144,3,141,0,208,173,185,2,56,205,1,208,144,3,141,1,208,173,186
220 data2,56,205,1,208,176,3,141,1,208,173,30,208,41,1,240,3,76,215
230 data192,173,0,220,41,31,141,163,2,169,16,44,163,2,240,9,173,164
240 data2,24,74,168,76,86,192,173,164,2,168,169,2,44,163,2,208,6,238
250 data1,208,76,109,192,169,1,44,163,2,208,3,206,1,208,169,8,44,163
260 data2,208,6,238,0,208,76,132,192,169
270 data4,44,163,2,208,3,206,0,208,136,208
280 data207,173,162,2,201,2,208,3,32,242,193,173,165,2,201,2,208
290 data3,32,226,192,173,1,208,73,255,141,0,212,169,4,141,1,212,169,15
300 data141,24,212,169,240,141,6,212,141,13,212,169,129,141,4,212,169
310 data4,141,7,212,169,12,141,8,212,173,1,208,141,5,220,173,188,2,201
320 data2,208,3,32,136,194,76,49,234,32,213,193,169,2,141,182,2,76
330 data49,234,173,27,212,141,190,2,96,0
340 rem*******************************
350 rem*******asteroidi move**********
360 rem*******************************
370 rem*******************************
380 data173,188,2,201,2,208,45,173,189
390 data2,56,201,15,176,37,173,176,2,201,2,208,6,173,0,208,141,190,2
400 data172,191,2,174,189,2,254,1,208,208,6,173,190,2,157,0,208,202
410 data202,208,241,136,208,235,96,0
420 rem******************************
430 rem**     scroll       **********
440 rem**   al contrario   **********
450 rem******************************
460 rem******************************
470 data173,179,2,56,201,25,144,5,169,24,141,179,2,201,0,208,5,169,24
480 data141,179,2,173,178,2,56,201,41
490 data144,5,169,40,141,178,2,201,0,208,5,169,40,141,178,2,169,191
500 data133,249,133,253,169,151,133,247
510 data133,251,169,7,133,248,133,250,169
520 data219,133,252,133,254,174,179,2,172,178
530 data2,177,247,145,249,177,251
540 data145,253,136,208,245,202,240,27,134,2,162,0,181,247,56,233,40
550 data149,247,176,2,214,248,232,232,56
560 data224,8,144,238,166,2,76,57,194,96,0
570 rem*******************************
580 rem*********explode***************
590 rem****and interrupts*************
600 rem*******************************
610 data169,0,162,24,157,0,212,202,208
620 data250,169,15,141,24,212,169,240,141,6,212,141,13,212,141,20,212
630 data169,129,141,4,212,141,11,212,141,18,212,169,0,141,181,2,169,5
640 data141,182,2,169,0,141,180,2,162,255,160,255,169,13,141,248,7,173
650 data181,2,238,181,2,141,0,212,141,7,212,141,14,212,136,208,233,238
660 data182,2,173,182,2,141,1,212,141
670 data8,212,141,15,212,238,180,2,201
680 data15,208,5,169,0,141,180,2,173,180,2,141,39,208,202,208,195,169
690 data11,141,248,7,234,120,169,49,141,20,3,169,234,141,21,3,88,96
700 data120,169,0,141,20,3,169,192,141,21,3,88,96,0
710 forx=49152to49385:reada:pokex,a:cs=cs+a:next
720 forx=49800to49853:reada:pokex,a:cs=cs+a:next
730 forx=49650to49766:reada:pokex,a:cs=cs+a:next
740 forx=49500to49647:reada:pokex,a:cs=cs+a:next:printcs
750 ifcs<>67472thenprint"{clear}{reverse on}{down*7}{right*4}errore nei data:controllare"
760 rem*************************
770 rem***sprite astronave******
780 rem*************************
790 data0,40,0,0,40,0,0,40,0,0,170,0,0
800 data170,0,0,170,0,2,190,128,2,190,128,10,255
810 data160,10,255,160,10,235,160,42,235
820 data168,42,235,168,170,170,170,170,40,170
830 data170,40,170,169,20,106,161,86,74,0,0,0,0,0,0,0,0,0
840 rem*************************
850 rem***sprite asteroidi******
860 rem*************************
870 data0,255,0,2,175,192,15,223,128,11,31,224,127,255,240,63,11,208
880 data63,211,224,31,255,192,15,213,224,27,237,224,25,255,240,127,248
890 data248,170,197,252,255,255,254,255
900 data255,255,127,106,248,53,255,232,31
910 data206,240,15,255,224,7,255,192,15,129,128
920 rem********************************
930 rem****sprite in memoria **********
940 rem********************************
950 forx=704to766:reada:pokex,a:next
960 forx=960to1022:reada:pokex,a:next
970 forx=896to958:reada:pokex,a:next
980 forx=832to894:reada:pokex,a:next
990 sc=0:cs=1:v=53248:si=54272
1000 gosub1610:rem *** fine present. e prepar. schermata ***
1010 ti$="000000"
1020 ad$="{reverse off} ":as$="{home}{reverse on}{space*31}":rem 31 spazi
1030 rem****abilita gli*****
1040 rem**** sprites   *****
1050 pokev+28,1:pokev+37,7:pokev+38,14:pokev+39,2
1060 poke2040,11:forx=2041to2044:pokex,15:next
1070 le=1:forx=v+40tov+43:pokex,le:le=le+1:next:rem *** col.asteroidi
1080 pokev+32,0:pokev+33,0:pokev,120:pokev+1,225:rem**posiz. astron.
1090 forx=2to8step2:pokev+x,70:next:rem*** asteroidi***
1100 forx=3to9step2:pokev+x,x*28:next:rem*** y asteroidi***
1110 poke700,2:poke701,8:poke688,0:poke703,di:rem***registri [rout 1]
1120 poke695,240:poke696,30:poke697,30:poke698,240:rem *** limiti astron.
1130 gosub2010
1140 pokev+30,0
1150 poke690,32:poke691,23:rem**limiti scroll contrario
1160 sys49634:poke674,0:poke694,0:poke677,2:pokev+21,31
1170 pokesi+18,129:pokesi+15,12:rem*** inizializza rnd ***
1180 forx=22to2step-1:di=di+.2:poke703,di
1190 as$=left$(as$,len(as$)-1):printas$+ad$
1200 iflen(as$)<3then1470
1210 fory=0to20:ifpeek(694)=2then1370
1220 poke1024+(x*40)+35,113:poke55296+(x*40)+35,1
1230 rn=rnd(1)*32:poke1104+rn,46:poke55376+rn,7:sys49650
1240 ifrn>31thenfl=1
1250 iffl=1thengosub1910
1260 sc=sc+12+di-peek(v+1)/32:ifpeek(56320)and16=0thensc=sc-3
1270 iffl=1thengosub1910
1280 nexty:gosub2100:nextx
1290 sys49621:pokev+21,0
1300 rem******************
1310 rem**** fine ********
1320 rem******************
1330 print"{clear}{right*9}{down*8}fine settore "cs
1340 print"{right*9}punteggio "int(sc):cs=cs+1
1350 forde=0to3000:next
1360 goto1020
1370 sys49621:poke56325,55:ifpeek(v+30)=129then1820
1380 pokev+28,0:sys49500:poke2040,13:pokev+23,1:pokev+29,1
1390 forx=15to0step-1:pokesi+24,x:forde=0to60:nextde,x
1400 pokev+23,0:pokev+29,0:pokev+21,0:forp=0to8
1410 print"{home}{right*10}{down*8}{reverse on}collisione{reverse off}"
1420 forpp=0to40:next
1430 print"{home}{right*10}{down*8}collisione":forpp=0to40:nextpp,p
1440 as$=left$(as$,len(as$)-1):iflen(as$)<3then1470
1450 print"{clear}"
1460 goto1030
1470 print"{clear}{down*8}{right*6}{yellow}{cm q}CCCCCCCCCCCCCCCCC{cm w}"
1480 print"{down*6}{right*10}{cm q}CCCCCCCCCCCCCCCCC{cm w}"
1490 sys49621:poke56325,55:pokev+21,0:forp=0to20
1500 t1$=left$(t1$,2)+":"+mid$(t1$,3,2)+":"+right$(t1$,2):forp=0to20
1510 print"{orange}{home}{right*8}{down*10}{reverse on} fine{space*6}score "int(sc)
1520 print"{right*10}{reverse on} tempo "ti$"{space*2}settore "cs:forpp=0to70:next
1530 print"{home}{right*8}{down*10} fine{space*6}score "int(sc)
1540 print"{right*10}{reverse off} tempo "ti$"{space*2}settore "cs:forpp=0to70:nextpp,p
1550 print"{home}{right*9}{down*12}{reverse on}vuoi ritentare{reverse off}":forc=0to60:next
1560 geta$:ifa$<>""then1590
1570 print"{home}{right*9}{down*12}vuoi ritentare":forc=0to60:next
1580 geta$:ifa$=""then1550
1590 ifa$="s"then990
1600 end
1610 pokev+39,3:poke2040,11
1620 print"{clear}":pokev+21,1:pokev,0:pokev+1,0
1630 sys49621:gosub1740
1640 pokev+32,6:pokev+33,6:ford=0to10
1650 print"{black}{home}{right*9}{down*9}{reverse on}asteroid{right}race"
1660 forde=0to40:next
1670 print"{black}{home}{right*9}{down*9}asteroid race"
1680 forde=0to40:nextde,d:forc=0to255:pokev,c:pokev+1,c:next
1690 input"{right*5}{down}dificolta(1-8)";di:ifdi>8ordi<1then1690
1700 pokesi+24,15:pokesi+7,3:pokesi+8,4:pokesi+13,240
1710 forc=255to0step-1:pokev+1,c:next
1720 pokesi+24,15:pokesi+7,3:pokesi+8,4:pokesi+13,240:pokesi+18,129
1730 pokev+21,31:return
1740 print"{home}OP{space*3}OP{space*4}OP{space*4}OP{space*4}OP{space*4}OP{space*4}OP{space*3}";
1750 print"{cm h}{cm m}{space*3}{cm h}{cm m}{space*4}{cm h}{cm m}{space*4}{cm h}{cm m}{space*4}{cm h}{cm m}{space*4}{cm h}{cm m}{space*4}{cm h}{cm m}{space*3}";
1760 print"L{sh @}{space*3}L{sh @}{space*4}L{sh @}{space*4}L{sh @}{space*4}L{sh @}{space*4}L{sh @}{space*4}L{sh @}{space*3}"
1770 print"{home}{down*20}";
1780 print"OP{space*3}OP{space*4}OP{space*4}OP{space*4}OP{space*4}OP{space*4}OP{space*3}";
1790 print"{cm h}{cm m}{space*3}{cm h}{cm m}{space*4}{cm h}{cm m}{space*4}{cm h}{cm m}{space*4}{cm h}{cm m}{space*4}{cm h}{cm m}{space*4}{cm h}{cm m}{space*3}";
1800 print"L{sh @}{space*3}L{sh @}{space*4}L{sh @}{space*4}L{sh @}{space*4}L{sh @}{space*4}L{sh @}{space*4}L{sh @}{space*2}{up*5}"
1810 return
1820 rem***********************
1830 rem*** aumento energia ***
1840 rem***********************
1850 fort=0to12
1860 ford=0to15step4:pokev+37,d:pokev+38,d+1:pokev+39,d+2:pokev+46,d+3
1870 pokesi+8,d*17:nextd,t:as$=as$+" "
1880 iflen(as$)>33thenas$=left$(as$,33)
1890 pokev+15,0:pokev+30,0:poke694,0
1900 sys49634:goto1220
1910 rem************************
1920 rem*** muove sprite *******
1930 rem***  energetico ********
1940 rem************************
1950 pokev+21,peek(v+21)or128
1960 poke2047,14
1970 ifpeek(v+15)=0thenpokev+14,rnd(1)*255:fl=0
1980 ifpeek(v+15)<255thenpokev+15,peek(v+15)+1:goto2000
1990 pokev+15,0
2000 return
2010 rem*************************
2020 rem****     radar     ******
2030 rem*************************
2040 sp$="{right*33}":rem<cur-right>32volte
2050 print"{clear}"+sp$+"{reverse on}{orange}{space*7}";
2060 forx=1to23:printsp$+"{orange}{reverse on} {reverse off}{space*5}{reverse on} {reverse off}";:next
2070 printsp$+"{orange}{reverse on}{space*6}{reverse off}{up*6}";:print
2080 poke2023,160:poke56295,8
2090 print"{home}"sp$"{down*5}{reverse on}{space*7}{reverse off}":return
2100 rem******************
2110 rem** "beeper"  *****
2120 rem******************
2130 poke1024+(x*40)+35,113:poke55296+(x*40)+35,0
2140 pokesi+11,33:forde=0to20:sys49650:next:pokesi+11,0
2150 return
2160 rem*************************
2170 rem*** continuazione *******
2180 rem***  data sprite  *******
2190 rem*************************
2200 rem***sprite energia *******
2210 rem*************************
2220 data0,0,0,0,0,0,0,255,0,1,129,128,1,129,128,1,129,128,3,0,192
2230 data3,0,192,3,126,192,3,96,192,6,96,96,6,124,96,6,96,96,6,96,96
2240 data6,126,96,12,0,48,24,0,24,48,0,12,96,0,6,192,0,3,255,255,255
2250 rem*************************
2260 rem*** sprite - bum  *******
2270 rem*************************
2280 data0,0,0,30,99,0,243,99,0,131,51,128,193,177,128,193,177,192,67
2290 data24,192,110,24,192,120,24,224
2300 data111,15,224,32,195,152,48,192,56,48
2310 data192,112,48,193,176,19,206,48,30,24,48,0,48,63,0,192,7,1,128
2320 data15,0,0,28,0,0,56

Share

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.