Grafico – Commodore 64 Basic V2

32 Programmi con il Commodore 64 – Gennaio 1985 – Basic V2

Continua la nostra avventura alla scoperta dei listati pubblicati nel libro “32 Programmi con il Commodore 64” della collana Il piacere del computer edita da Franco Muzzio & C. Editore. Il libro e’ stato pubblicato nel Gennaio 1985.
Questa volta vi propongo un listato che disegna, utilizzando la modalita’ a caratteri del Commodore 64, il grafico della funzione definita dalla riga 5000 (in poi) del programma. Non a caso il listato si intitola Grafico. 🙂

Una figura vale più di mille parole? Nel caso delle funzioni matematiche, la risposta spesso è sì. Una figura, cioè un grafico, vi permette di vedere velocemente e con esattezza quali sono le caratteristiche di una funzione.
Andamento, minimi, massimi ecc., diventano così facili da determinare.
“Grafico” esegue il disegno a colori su due dimensioni della funzione da voi fornita. La funzione deve essere nella forma: Y=(funzione di X). La variabile indipendente X sarà disegnata sull’asse delle ascisse (asse oriz-zontale); la variabile dipendente Y sull’asse delle ordinate (asse verticale).
Potete voi stessi stabilire le scale usate per gli assi X e Y.

Prima di far girare il programma, dovete fornirgli la funzione da visualizzare graficamente, sotto forma di subroutine, a partire dalla linea 5000. La subroutine dovrà definire la Y come funzione di X e verrà richiamata, nel corso del programma, dopo che alla X sono stati assegnati i valori stabiliti: in tal modo vengono calcolati i valori corrispondenti della Y. La subroutine può essere semplice o complessa, in relazione alla necessità di definire la funzione. Può richiedere una sola o varie centinaia di linee.
Alla linea 5999 è presente l’istruzione RETURN, perciò non dovete aggiungerne un’altra.

Titolo: Grafico
Piattaforma: Commodore 64
Linguaggio: Basic
Versione originale: Tom Rugg e Phil Feldman
Pubblicazione: 32 Programmi con il Commodore 64
Anno: 1985
Trascrizione: Francesco Fiorentini
Anno: 2025
Note: N/A

Istruzioni
Fornite la funzione da visualizzare graficamente, sotto forma di subroutine, a partire dalla linea 5000. La funzione deve essere nella forma: Y=(funzione di X). Dopodiche’, una volta lanciato il programma dovrete specificare il campo di definizione della X, cioe’ i valori massimo e minimo di X da visualizzare graficamente. Ripetete lo stesso per la Y e poi aspettate che il programma calcoli i valori per il grafico e li visualizzi a video.

Qui di seguito trovate il codice da copiare sul vostro Commodore 64.
Il codice originale é modificato per essere copiato su CBM prg Studio. Gli Screen Codes presenti nel listato originale, sono stati manualmente sostituiti da quelli standard utilizzati da CBM prg Studio.

Attenzione – Ci siamo resi conto che nel listato i caratteri ‘>’ e ‘<‘ potrebbero venir sostituiti dai rispettivi encoding html ‘&gt’ e ‘&lt’. Nel caso, sostituite questi valori direttamente su CBM prg Studio.

Listato: Grafico – Commodore 64 – Basic V2


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
100 rem: grafico
110 rem: copyright 1983
111 rem: phil feldman, tom kugg, and
112 rem: western systems group
150 c=1876:xv=12:poke 53280,1:poke 53281,0
160 pb=102:c1=56148:c0=1:c2=5:c3=8
170 w=221
200 poke 53281,1:print chr$(147);:poke 53281,0
201 print tab(15); chr$(18) ;"grafico": print
210 print:gosub 1000
220 print:print:input "valore minimo di x";xl
225 print:input"valore massimo di x";xu
230 if xu=xl then print:print"---campo di x errato---"
235 if xu<=xl then goto 220
240 gosub 800:gosub 300:gosub 500
245 print chr$(19):print:print:print:print
250 print" premi un":print:print" tasto per" :print
255 print" continuare"
260 get q$:if q$="" then 260
270 gosub 900
280 end
300 poke 53281,1:printchr$(147);
301 poke 53281,0:poke c,91
310 for j=1 to 20:poke c+j,114
320 poke c-40*j,115:next
330 for j=0 to 20 step 10
340 poke c+40+j,93:poke c-1-40*j,64
350 next:poke c+21,24:poke c-840,25
360 xm=(xl+xu)/2:ym=(yl+yu)/2
370 a$=str$(xl):a=len(a$):tb=xv-a+1
375 if tb<1 then tb=xv:a$="xl"
380 gosub 460:a$=str$(xm):a=len(a$):tb=xv+10-a/2+1
385 gosub 460:a$=str$(xu):tb=xv+19
390 if tb+len(a$)>39 then tb=xv+20:a$="xu"
400 gosub 460:a$=str$(yu):a=len(a$):tb=xv-a-1
405 if tb<0 then td=xv-3:a$="yu"
410 nl=1:gosub 480
415 a$=str$(ym):a=len(a$):tb=xv-a-1:nl=11
420 if tb<0 then tb=xv-3:a$="ym"
430 gosub 480:a$=str$(yl):a=len(a$):tb=xv-a-1
435 if tb<0 then tb=xv-3:a$="yl"
440 nl=21:gosub 480:return
460 print chr$(19)
463 for j=1 to 22:print chr$(17);:next
466 print tab(tb);a$: return
480 print chr$(19);
483 for j=1 to nl:print chr$(17);:next
486 print tab(tb);a$:return
500 dx=(xu-xl)/20: dy=(yu-yl)/20
510 x=xl:gosub 700:pc=124:if f=0 then pc=108
520 if d<0 then d=0:pc=pb
530 if d>20 then d=20:pc=pb
532 c0=c2:if pc=pb then c0=c3
535 poke c1-40*d,c0
540 poke c-40*d,pc
550 for j=1 to 20:x=xl+dx*(j-0.5):gosub 700
555 pc=126: if f=0 then pc=123
560 if d<0 then d=0:pc=pb
570 if d>20 then d=20:pc=pb
575 c0=c2:if pc = pb then c0=c3
580 poke c1+j-40*d,c0
585 poke c+j-40*d,pc
590 x=xl+dx*j: gosub 700:pk=peek(c+j-40*d)
595 if d<0 then d=0:pc=pb:goto 660
600 if d>20 then d=20:pc=pb:goto 660
610 pc=226:if f=0 then pc=127
620 if pk=126 then 660
630 pc=255:if f=0 then pc=98
640 if pk=123 then 660
650 pc=124:if f=0 then pc=108
655 c0=c2:if pc=pb then c0=c3
660 poke c1+j-40*d,c0
665 poke c+j-40*d,pc
670 next: return
700 gosub 5000:v=(y-yl)/dy:d=int(v)
710 if yyu then d=25
730 f=1:if (v-d)>=0.5 then d=d+1:f=0
740 return
800 dx=(xu-xl)/40:x=xl:gosub 5000:mn=y:mx=y
805 for j=1 to 40:x=xl+j*dx:gosub 5000
810 if y>mx then mx=y
820 if y< mn then mn=y
830 next
840 print:print"in questo campo della x"
845 print"  y massimo =";mx
850 print"  y minimo =" ;mn:print
855 print"scegli la scala per la y":print
860 input"valore minimo di y";yl
865 print: input"valore massimo di y";yu
870 if yu<=yl then print
873 if yu<=yl then print"---campo di y errato ---"
876 if yu<=yl then goto 840
880 return
900 print chr$(147); "scala della x"
910 print"   minimo  - ";xl
913 print"   medio   - ";xm
916 print"   massimo - ";xu
920 print:print" ogni suddivisione della scala - ";dx
925 print:print: print"scala della y"
930 print"   minimo  - ";yl
933 print"   medio   - ";ym
936 print"   massimo - ";yu
940 print:print" ogni suddivisione della scala - ";dy
945 print: print
950 print"premi 'g' per rivedere il grafico"
955 print"un altro tasto per finire"
960 get q$:if q$="" then 960
970 if q$="g" then gosub 300:gosub 500
980 return
1000 print chr$(176);:for j = 1 to 11
1010 print chr$(192);:next:print" attento! ";
1015 for j = 1 to 11
1020 print chr$(192); : next
1025 print chr$(174) :gosub 1100:print chr$(w);
1030 print"    la subroutine alle linee    ";
1035 print chr$(w): gosub 1100
1040 print chr$(w);
1043 print"    5000-5999 deve definire     ";
1046 print chr$(w): gosub 1100
1050 print chr$(w);
1053 print"    y in funzione di x          ";
1056 print chr$(w): gosub 1100
1060 print chr$(173);:for j = 1 to 32
1070 print chr$(192);:next:print chr$(184)
1080 return
1100 print chr$(w);spc(32);chr$(w):return
4970 rem
4980 rem devi definire la subroutine alla linea 5000
4990 rem
5000 rem * qui definisc1 y=f(x)
5010 y=cos(x)
5999 return
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.