Il Fortran sul Commodore 64

RetroMagazine nr. 45 – Anno: 2023 – Autore: Francesco Fiorentini

Fig. 1 – Abacus Fortran-64

Chi segue i miei articoli su RetroMagazine World sa che preferisco recensire applicazioni e linguaggi, seppur di tanto in tanto non disdegni di provare e commentare anche i giochi. In questo mio ennesimo articolo voglio peró rimanere fedele alla mia passione parlandovi di un linguaggio di programmazione: il Fortran.
Il Fortran è uno dei primi linguaggi di programmazione ad essere stato sviluppato, la sua progettazione risale addirittura alla prima metá degli anni ’50, quando, verso la fine del 1953, John W. Backus propose ai suoi superiori dell’IBM di sviluppare un’alternativa più pratica al linguaggio assembly per la programmazione del computer mainframe IBM 704.
Da allora sono passati esattamente 70 anni, ma questo linguaggio è tuttora utilizzato dalle comunità scientifiche e ingegneristiche; ovviamente in tutti questi anni il linguaggio ha subito diverse modifiche per cercare di adattarsi alle rinnovate esigenze del mercato e degli sviluppatori.

Il Fortran ed il Commodore 64
Come abbiamo già avuto modo di toccare con mano, il Commodore 64 ha ospitato qualsiasi tipo di software, ludico e non, ed ovviamente, nella lista dei linguaggi di programmazione disponibili per questo home computer, non poteva mancare il Fortran.
Dalle mie ricerche risultano disponibili almeno due versioni di Fortran per l’8-bit più venduto di casa Commodore, il Nevada Fortran e l’Abacus Fortran-64. La mia scelta, per motivi di praticità, è ricaduta appunto su quest’ultimo, dato che il Nevada Fortran richiede la cartuccia CP/M per funzionare. Ho quindi ipotizzato che il prodotto Abacus fosse più accessibile a chi volesse provare a testarlo su macchina reale. Questo non vuol dire che in futuro non farò anche un test del Nevada Fortran.
Ah, chiunque fosse a conoscenza di altre versioni di Fortran è pregato di farmelo sapere. Adoro mettere le mani su software semi-sconosciuto. 🙂

Abacus Fortran-64
Il linguaggio Fortran di Abacus è stato rilascito nel 1988 ad opera di Bob Stovere e Tim Adams. Il pacchetto si compone di un disco contenente il compilatore, il linker, le librerie, un comodo traduttore (vedremo successivamente a cosa serve) ed un manuale che, in perfetto stile Abacus del periodo, è ridotto all’essenziale.
Una volta caricato il Fortran-64 verremo accolti da un menú che contiene tutte le opzioni per creare il nostro primo programma in Fortran, compilarlo, linkarlo e generarne un eseguibile. Quello che balza subito agli occhi però è la mancanza di un editor di testo per creare il file sorgente: come fare quindi?
Il file sorgente può essere creato in due modi differenti. Il primo consiste nell’utilizzare un qualsiasi elaboratore di testi che produca file di output ASCII sequenziali, mentre il secondo è quello di utilizzare l’editor integrato

Fig. 2 – Caricamento di Abacus Fortran-64

nel BASIC V2. Utilizzando l’opzione F2 – Back to Basic, torneremo al prompt del BASIC e potremo cominciare a scrivere il codice. Ogni riga deve essere inserita come nel BASIC, ma con una piccola eccezione: i due punti (:) devono apparire nella riga tra il numero di riga e l’istruzione Fortran. Dopo che il programma è stato scritto potrá essere salvato su disco con il classico comando SAVE del BASIC.
A questo punto, tornando al menú dell’Abacus Fortran-64 tramite il comando SYS49152 (attenzione, leggete la nota sotto), potremo procedere a trasformare il file BASIC PRG in un file SEQ (sequenziale) tramite il comando F6 – Translator.
Nota bene: per consentire il rientro in Fortran-64 senza ricaricare, è necessario eseguire un SYS49152 subito dopo il ritorno al BASIC. Dopo aver salvato il file, è possibile eseguire un secondo SYS49152 per tornare al menù principale.

Il nostro primo programma in Fortran-64
Data la possibilitá di utilizzare l’editor in Basic, ho scelto proprio quest’opzione per scrivere il mio primo programma in Fortran con il Commodore 64.
Una volta tornato al Basic ho digitato quindi SYS49152 e dopodiché ho scritto il seguente programma:

Fig. 3 – Il menú principale

10 : program test
15 :* this program will write a
16 :* list of the odd numbers
16 :* from 1 to 10 to screen
20 : integer a,b
30 : open 3,3
40 : do 10 i = 1, 10, 2
50 : write (3,100) i
60 : 10 continue
65 : close 3
70 : stop
80 : 100 format(i5)

90 : end

lvato con il comando: SAVE “ODDNUM”,8
In seguito ho digitato di nuovo SYS49152 per tornare al menú dell’Abacus Fortran-64 e l’ho trasformato in un file sequenziale tramite il comando F6 – Translator.
Il programma Translator ci richiede il nome del file che abbiamo creato e salvato in ambiente BASIC:
enter program file name: oddnum
Poi ci viene chiesto con quale nome vogliamo salvare il file sequenziale:
enter sequential file name: oddseq
A questo punto siamo pronti per compilare il nostro programma.

E adesso compiliamo…
Dal menú principale sceglieremo la voce F1 – Compiler.

Fig. 4 – Il programma appena digitato
Fig. 5 – Il programma ‘tradotto’ con il translator

Il compilatore ci chiederá di fornire il nome del nostro programma, cioè il file sequenziale che abbiamo creato con il traduttore e poi di fornire il nome del file oggetto che vogliamo creare:
enter source file name: oddseq
enter object file name: oddobj2

A questo punto inizierà la fase di compilazione del programma e verranno segnalati a video tutti gli eventuali errori cheil compilatore avrá individuato. Ho trovato veramente interessante questa opzione perché ogni errore viene indicato esattamente sotto la riga che lo contiene, facilitando decisamente la vita del programmatore.
Gli errori verranno segnalati usando il seguente formato:

* ERROR xxx yyy ****
xxx = codice dell’errore
yyy = posizione del carattere nella riga che ha causato l’errore (esclusi gli spazi)
Per la lista dei 64 codici errore, si veda il manuale alla pagina 47: Appendice D – Error Description.

Fig. 6 – La compilazione

Tutto fatto? Certo che no, manca ancora un passaggio fondamentale prima di poter testare l’esecuzione del nostro programma. Utilizzando il linker dovremo collegare il codice oggetto, cioè la traduzione del codice sorgente in linguaggio macchina, con le librerie del linguaggio necessarie per poter eseguire il programma.
…e finalmente il Linker!
Per utilizzare il linker non dovremo fare altro che scegliere F3 – Linker dal menú principale e poi comunicare il nome del nostro programma oggetto, nel nostro caso ODDOBJ2.

Il linker automaticamente collegherà tutti i moduli necessari all’esecuzione del nostro codice e questi, a scelta, saranno anche visualizzati. Infine il linker ci informerá a quale indirizzo si trova il nostro codice eseguibile:
modules loaded:
test $0850
clwbuf $0903
set-up $0915
in2as $09d3
fiwbuf $0abf
wformt $0c2d
faterr $11f6

runable code resides
from $0850 to $1230

Al termine del processo di linking, il programma eseguibile sará residente in memoria. Utilizzando il comando BASIC LIST, vedremo sulla prima riga un comando REM con il nome del programma Fortran, mentre nella seconda riga un comando SYS con l’indirizzo di esecuzione del programma. Il resto del programma è in linguaggio macchina. A questo punto il programma può essere salvato su disco o essere eseguito con il comando BASIC RUN.

L’output del comando LIST:
10 rem program test
20 sys02128
Da notare che la SYS punta all’indirizzo 2128, in esadecimale $850. Sì, proprio lo stesso indirizzo di partenza indicato dal linker.

Un’occhiata al codice

Fig. 7 – Il programma linkato!

10 : program test
Semplicemente il nome del programma
15 :* this program will write a
16 :* list of the odd numbers
16 :* from 1 to 10 to screen
Righe di commento
20 : integer a,b
Definisce due variabili di tipo intero (non utilizzate)
30 : open 3,3
Apre una connessione con un device. Personalmente per identificare il video ho fatto riferimento a questa tabella:
Dispositivo numero 0 | tastiera (non contato come primo dispositivo!)
Dispositivo numero 1 | datasette | numero secondario 0 = per il caricamento; 1 = per la scrittura; 2 = per la scrittura di un file seguito da un segno EOT (End Of Tape)
Dispositivo numero 2 | modem / RS-232 | numero secondario 0
Dispositivo numero 3 | schermo | numero secondario 0 o 1
Numero dispositivo 4 o 5 | stampante | numero secondario 0 = lettere maiuscole/simboli grafici 7 = lettere maiuscole/minuscole
Numero dispositivo 8 fino a 15 | unità disco | numero secondario 2-14 = canali dati[1]; 15 canale per i comandi
40 : do 10 i = 1, 10, 2
DO label varnam = is,if [,ic]
dove: label è un numero intero senza segno
varnam è una variabile semplice
is è una costante o una variabile intera (valore iniziale)

Fig. 8 – Il programma in esecuzione

if è una costante o variabile intera (valore finale)
ic è una costante intera firmata (incremento)
Ciclo DO da 1 a 10 con step 2


50 : write (3,100) i
Stampa a video la variabile i (formattata alla riga 80)


60 : 10 continue
Fine del loop DO


65 : close 3
Chiude la connessione con il device (vedi linea 30)


70 : stop
Termina l’esecuzione del programma e torna al Basic


80 : 100 format(i5)
Formatta la stampa di un intero a 5 cifre


90 : end
Indica la fine di un’unità di programma


Adesso tocca a voi! Provate a scrivere il vostro primo programma e compilatelo allo stesso modo.
Buon divertimento!

Links Utili

Download di Abacus Fortran-64 e del manuale:

https://www.lyonlabs.org/commodore/onrequest/ collections.html

Pagina WIKI sul Fortran:

https://it.wikipedia.org/wiki/Fortran

Share

Lascia un commento

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.