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 ‘>’ e ‘<’. 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 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
