Creative Computing – Anno 1999 – Versione originale: GW-Basic – Adattamento: Amstrad CPC
Continua il nostro viaggio alla scoperta di listati che hanno fatto la storia dell’informatica.
Ho trovato un interessante repository di codice GW-Basic a questo indirizzo: https://github.com/robhagemans/hoard-of-gwbasic
Il programma che vi presento in questa pagina e’ un’estensione di un listato trovato proprio in questo repository. Si tratta del gioco DRAG, contenuto nel file DRAG.BAS.
Il gioco, originariamente sviluppato in GW-Basic, quindi per PC, e’ stato adattato per girare sul computer Amstrad CPC tramite il Locomotive Basic. Ovviamente non mi sono limitato a fare un semplice porting, non sarebbe stato divertente, ma ho aggiunto alcune finizze che spero possano rendere il gioco un po’ piu’ attraente.
Porting e aggiunte al gioco
Il gioco girava in 80 colonne, quindi era ideale per il MODE 2 del CPC. Il codice GW-Basic non utilizzava comandi speciali e/o grafica, quindi girava gia’ bene sul CPC senza modifiche particolari. Per questo motivo ho deciso di aggiungere un’animazione ed uno splash screen.
Scopo del gioco
Il gioco era (ed e’) completamente testuale. Dobbiamo creare un dragster impostando alcuni parametri e farlo gareggiare con quello del computer per cercare di batterlo. Una volta impostati i parametri il computer genera tutti i calcoli necessari, decisamente pesanti per il povero Amstrad CPC, e alla fine decreta il vincitore della corsa. Per rendere la cosa piu’ carina, ho deciso di aggiungere l’animazione di due macchinine che, in cima allo schermo, si sfidano in un testa a testa ad alta (sulla carta…) velocita’.
Per fare questo ho diviso lo schermo utilizzando la funzione WINDOW del Locomotive Basic. Date un’occhiata al codice, e’ piuttosto interessante.
Ho anche aggiunto ulteriori informazioni alla fine della corsa: la distanza percorsa dal vincitore ed il gap tra le due auto al foto-finish.
Infine, ho deciso di aggiungere un loader con una schermata grafica per rendere il tutto piú carino visivamente (spero): le istruzioni per realizzare lo splash screen e importarlo sul vostro Amstrad CPC le trovate nell’articolo“Uno splash screen per Amstrad CPC in formato SCR” su RMW 24.

Titolo: Dragster
Piattaforma: Amstrad CPC
Linguaggio: Locomotive Basic
Versione originale: GW-Basic – Adlor de Bard
Pubblicazione: Creative Computing
Anno: 1999
Adattamento: Francesco Fiorentini
Anno: 2025
Download: dragster.dsk
Note: Questa versione é l’adattatamento per Amstrad CPC del gioco DRAG.BAS originariemente sviluppato per PC in GW-Basic.

Scopo del gioco
Costruisci il tuo dragster e gareggia contro il computer in una folle corsa ad alta velocita’. I parametri da impostare sono:
– Horsepower: la potenza della macchina
– Rear end ratio: il rapporto tra le rotazioni dell’albero di trasmissione e quelle delle ruote
– Tire width: la larghezza dei pneumatici
– Tire diameter: il diametro dei pneumatici
Suggerisco di aumentare la velocita’ dell’emulatore durante la corsa; i calcoli sono decisamente pesanti per il CPC e richiedono diverso tempo.


Qui di seguito trovate il codice del gioco e del loader da copiare sul vostro Amstrad CPC.
Altrimenti potete usare direttamente il dischetto che ho preparato per voi: dragster.dsk
Attenzione – Ci siamo resi conto che nel listato i caratteri ‘>’ e ‘<‘ potrebbero venir sostituiti dai rispettivi encoding html ‘>’ e ‘<’. Nel caso, sostituite questi valori direttamente su CBM prg Studio.
Listato: Dragster – Amstrad CPC – Locomotive Basic
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 1 CLS: MODE 2 : INK 1,26
2 GOSUB 2000
3 PRINT #2,TAB(27); "DRAG"
5 PRINT #2,TAB(20); "CREATIVE COMPUTING"
7 PRINT #2,TAB(19); "MORRIS TOWN NEW JERSEY"
20 DIM P(2), E(2), W(2), S(2), X(2), M(2), C(2), B(2), Y(21)
25 DIM Q(2)
30 PRINT #2,: PRINT #2,: PRINT
35 PRINT #2,"WELCOME TO DRAG STRIP."
40 PRINT #2,"WOULD YOU LIKE THE INSTRUCTIONS"
50 INPUT #2,I$
60 IF I$ = "NO" THEN 110
70 PRINT #2,"YOU MAY RACE AGAINST ONE OF YOUR FRIENDS OR YOU MAY RACE"
80 PRINT #2,"AGAINST NY DRAGSTER. TOO WILL BE ASKED TO DESIGN YOUR"
90 PRINT #2,"OWN MACHINE. SPECIFYING HORSEPOWER. READ END RATIO (X: I),"
100 PRINT #2,"TIRE WIDTH IN INCHES AND TIRE DIAMETER IN FEET."
110 PRINT #2,: PRINT #2,"DO YOU WANT TO RACE AGAINST ME ";
120 INPUT #2,I$
130 IF I$ = "NO" THEN 200
140 PRINT #2,: PRINT #2,"I WILL HAVE CAR #1."
150 P(1) = 600
160 E(1) = 5.9
170 W(1) = 22
180 D(1) = 3.9
190 GOTO 290
200 PRINT #2,"DESIGN CAR #1:"
210 PRINT #2,"HORSEPOWER"; ":"
220 INPUT #2,P(1)
230 PRINT #2,"REAR END RATIO"; ";"
240 INPUT #2,E(1)
250 PRINT #2,"TIRE WIDTH"; ";"
260 INPUT #2,W(1)
270 PRINT #2,"TIRE DIAMETER";
280 INPUT #2,D(1)
290 PRINT #2,: PRINT #2,"DESIGN CAR #2:"
300 PRINT #2,"HORSEPOWER=";
310 INPUT #2,P(2)
320 PRINT #2,"REAR END RATIO";
330 INPUT #2,E(2)
340 PRINT #2,"TIRE WIDTH";
350 INPUT #2,W(2)
360 PRINT #2,"TIRE DIAMETER";
370 INPUT #2,D(2)
380 PRINT #2
390 PRINT #2,"GO!"
400 K1 = 500
410 K2 = 1.6
420 K3 = 2
430 K4 = .0006
440 K5 = .00006
450 K6 = .2
460 K7 = 4
478 K8 = .00015
480 Q(1) = 0: Q(2) = 0
490 S(1) = 0: S(2) = 0
500 X(1) = 0: X(2) = 0
510 REM: M IS MASS
520 FOR J = 1 TO 2
530 M(J) = (K1 + K2 * P(J) + K3 * W(J) * D(J) + K7 * D(J) ^ 2) / 32.2
540 REM: C IS DRAG FROM WIND.
550 C(J) = K4 * M(J) ^ (2 / 3) + K8 * W(J) * D(J)
560 REM: B IS THE MAX ACCELERATION WITHOUT BURNING
570 B(J) = 15 + 28 * W(J) * D(J) / ((W(J) + 6) * (D(J) + 1))
580 REM: Y IS THE SCALE FACTOR FOR RPM V.S. POWER.
590 Y(J) = 3.7 - .0033 * P(J)
600 NEXT J
605 CLS #2: CLS #1
606 LOCATE #1,1,1: PRINT #1,"#1:"
607 LOCATE #1,1,2: PRINT #1,"#2:"
608 x1=4: x2=4
610 PRINT #2
620 PRINT #2
630 PRINT #2,"ELAPSED "; TAB(15); "CAR #1"; TAB(39); "CAR #2"
640 PRINT #2,"TIRE SPEED DISTANCE SPEED DISTANCE"
650 PRINT #2,"(SEC) (MPH) (FT) (MPH) (FT)"
660 PRINT #2
670 FOR T = 0 TO 100
680 FOR T1 = 1 TO 100
690 FOR J = 1 TO 2
700 REM: R IS RPM
710 R = 60*S(K)*E(J)/(3.14*D(J)) : REM IT WAS 3.1415926
720 REM: LO IS ENGINE TORQUE.
730 LO = (P(J) / 42.5) * (50 + .0078 * (R / Y(J)) - 4E-10 * (R / Y(J)) ^ 3)
740 REM: L1 IS TORQUE FROM FRICTION
750 L1 = P(J) * (K5 * R + K6)
760 REM: R2 IS REAR AXLE TORQUE
770 L2 = E(J) * (LO - L1)
780 REM: F IS FORCE ON ROAD FROM TIRES.
790 F = 2 * L2 / D(J)
800 REM: TEST FOR BURN
810 IF F > M(J) * B(J) THEN 880
820 REM: A= ACCELERATION
830 IF Q(J) <> 0 THEN 860
840 PRINT #2,"Car #"; J; "STOPS BURNING RUBBER"
850 Q(J) = 1
860 A = (F - C(J) * S(J) ^ 2) / M(J)
870 GOTO 900
880 A = B(J) - C(J) * S(J) ^ 2 / M(J)
890 REM: S is Feet in FT/SEC
900 S(J) = S(J) + A * .01
910 REM: X IS DISTANCE IN FT.
920 X(J) = X(J) + S(J) * .01
930 NEXT J
935 GOSUB 4000
949 REM: TEST FOR FINISH.
950 IF X < 5280 / 4 AND X(2)<5280/4 THEN GOTO 1160
960 IF X(1) > X(2) THEN 1080
970 T3 = (X(2) - 5280 / 4) / S(2)
980 T = T + T1 / 100 - T3
990 X(2) = 5280 / 4
1000 X(1) = X(1) - S(1) * T3
1010 rem PRINT #2,T; " "; S(1) * 3600 / 5200; " ";X(1)
1015 rem PRINT #2,S(2) * 3600 / 5280; " "; X(1)
1020 PRINT #2,TAB(40); "CAR #2 IS THE WINNER"
1025 PRINT #2,TAB(40); "DISTANCE: "; x(2)
1028 PRINT #2,TAB(40); "GAP: "; x(2)-x(1)
1030 PRINT #2
1040 PRINT #2,"DO YOU WANT TO TRY AGAIN ";
1050 INPUT #2,I$
1060 IF I$ = "YES" THEN 110
1070 END
1080 T3 = (X(1) - 5280 / 4) / S(1)
1090 T = T + T1 / 100 - T3
1100 X(1) = 5280 / 4
1110 X(2) = X(2) - S(2) * T3
1120 REM PRINT #2,T; " "; S(1) * 3600 / 5260; " "; X(1);
1125 REM PRINT #2,S(2) * 3600 / 5280; " "; X(2)
1130 PRINT #2,TAB(10); " CAR #1 IS THE WINNER"
1135 PRINT #2,TAB(10); "DISTANCE: "; x(1)
1138 PRINT #2,TAB(10); "GAP: "; x(1)-x(2)
1140 PRINT #2
1150 GOTO 1040
1160 NEXT T1
1170 PRINT #2,T + 1; " "; S(1) * 3600 / 5280; " "; X(1);
1175 PRINT #2,S(2) * 3600 / 5280; " "; X(2)
1180 NEXT T
1200 END
2000 REM DEFINE CARS CHARACTERS
2005 REM CAR#1
2010 SYMBOL 240,0, 0, 48, 8, 110, 255, 255, 96
2020 SYMBOL 241,0, 0, 0, 0, 192, 252, 254, 12
2025 REM CAR #2 (REAR IS THE SAME AS CAR #1)
2030 SYMBOL 242,0, 0, 0, 0, 7, 127, 127, 48
2040 WINDOW #2,1,80,3,25
2050 WINDOW #1,1,80,1,2
2100 RETURN
4000 REM DRAW CARS
4005 REM --- ERASE OLD POSITIONS ---
4006 IF x1>=78 GOTO 4011
4010 LOCATE #1,x1,1:PRINT #1," "
4011 IF x2>=78 GOTO 4500
4015 LOCATE #1,x2,2:PRINT #1," "
4020 REM --- MOVE CARS ---
4025 x1=4+x(1)*75/1320
4030 x2=4+x(2)*75/1320
4035 REM --- DRAW CAR A ---
4040 LOCATE #1,x1,1: PRINT #1,CHR$(240);CHR$(241);
4050 REM --- DRAW CAR B ---
4055 LOCATE #1,x2,2 : PRINT #1,CHR$(242);CHR$(241);
4500 RETURN
Listato: Loader – Amstrad CPC – Locomotive Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 10 MODE 1: INK 0,0
11 INK 1,13
12 INK 2,12
13 INK 3,26
14 PEN 3: BORDER 0
15 CLS
20 LOAD "dragster.SCR",&C000
22 LOCATE 18,2:PRINT">>>> DRAGSTER <<<<"
24 LOCATE 18,5:PRINT"an AMSTRAD CPC port"
25 LOCATE 18,6:PRINT"by F.Fiorentini - 2025"
30 LOCATE 18,9:PRINT" original code:"
35 LOCATE 18,10:PRINT" CREATIVE COMPUTING"
37 LOCATE 18,11:PRINT" MORRIS TOWN NJ"
50 FOR I=1 TO 5000
60 NEXT I
70 RUN "dragster.bas"
