Power C – il miglior compilatore C per C64/128?

RetroMagazine nr. 46 – Anno: 2024 – Autore: David La Monaca

Note personali
Devo essere sincero: nel periodo d’oro della diffusione del Commodore 64, la seconda metà degli anni 80, non avevo mai sentito parlare di Power C, né (mea culpa) di altri compilatori per il linguaggio C per quello che era il mio primo computer. Una combinazione di motivi sono alla base di questa mia lacuna: consideravo, a torto, il C64 troppo poco potente per un compilatore del linguaggio C che invece associavo, anche qui erroneamente, a macchine più evolute come Amiga o PC 386. Quegli anni furono per me gli ultimi del liceo ed i primi dell’università e tutto ciò che conoscevo per esperienza diretta era la programmazione in BASIC e assembly per C64. Quando passai ad Amiga, il C mi sembrava molto complesso da programmare per creare qualcosa di utile sotto Workbench, per cui la mia prima vera esperienza di codice in C fu su un PC 386 con il famigerato Turbo C di Borland. Nei primi due anni di Ingegneria Elettronica i soli corsi che prevedevano l’uso di un linguaggio di programmazione trattavano

Fig. 1 – Copertina originale del package Power C

soltanto il Fortran (Analisi Numerica) e Pascal (Calcolatori Elettronici). Del C neppure l’ombra. Per esercitarmi in Pascal avevo rimediato l’ottimo Oxford Pascal per C64 ed usavo a volte il C1 Pascal sul Sinclair QL di un mio caro amico che frequentava la facoltà di matematica. Quando cominciai ad esplorare sul serio il C, il PC DOS con scheda VGA ed il Turbo C 1.0, con il suo comodo ambiente integrato, semplificarono moltissimo il processo di scrittura, editing, compilazione e linking dei piccoli programmi con cui mi cimentavo.
Oggi, dopo aver scoperto il Power C per Commodore 64, pubblicato in realtà nel lontano 1986 da Spinnaker Software Corporation, devo ammettere che se l’avessi conosciuto all’epoca, difficilmente l’avrei mollato a favore del Turbo C o comunque l’avrei fatto con maggiore fatica e senso di nostalgia. Sì, perché il Power C, a mio avviso, rappresenta davvero una piccola stella brillante nella galassia del software esistente per Commodore 64. Un esempio formidabile di tool di programmazione completo e dalle mille possibilità. Un Commodore 64/128 base dotato di drive ed il dischetto di base del package di Power C sono tutto ciò che serve per iniziare a programmare in C e, aggiungo, iniziare alla grande! Il sistema di sviluppo proposto da Power C è semplice, ben progettato e ottimamente reso disponibile all’utente. È un sistema DOS-based, ossia tutti i componenti della catena di sviluppo sono programmi residenti su disco che di volta in volta vengono chiamati ad agire sul nostro codice sorgente, sul codice oggetto e sulle librerie di funzioni necessarie al nostro progetto, al fine di ottenere un programma finito che può girare anche indipendentemente dalla shell di Power C. Ed è proprio la shell l’elemento innovativo e centrale di questo compilatore che fornisce un prompt molto simile a quello che si può trovare su un sistema Unix.

Il pacchetto software
Il manuale che accompagna il software di Spinnaker mostra in bella vista la sua caratteristica principale, cioè di essere un compilatore completo del linguaggio C per

Fig. 2 – Schermata Shell C

C64/128 interamente basato su disco. Oltre al Commodore 64 è supportato anche il Commodore 128, di cui sfrutta la maggiore quantità di memoria e le caratteristiche hardware. Sulle piattaforme più popolari a 8-bit di casa Commodore Power C promette di generare programmi dieci volte più veloci del BASIC, producendo codice oggetto nativo in linguaggio macchina, compatto e riutilizzabile. I componenti del compilatore (shell, editor a tutto schermo, compilatore su linea di comando, linker flessibile, libreria completa di 95 funzioni per i più svariati campi di applicazione, librerie aggiuntive in C di utilità generale per ordinamento, ricerca e formattazione di testi) si combinano perfettamente per offrire al programmatore un ambiente efficace e snello oltre ad un’esperienza di sviluppo proficua.
Lo standard C, per capirci l’ANSI C di Kernighan e Ritchie, è pienamente supportato e per chi vuole sfruttare le potenzialità del processore, della grafica e dell’audio dei computer Commodore, le librerie di supporto, anche quelle fornite da appassionati utenti nel tempo, offrono tutta una serie di funzioni specifiche per interagire facilmente con i chip custom del C64. Il pacchetto di base, come già ricordato, consiste di un solo dischetto 5.25” doppia faccia. Il primo lato chiamato System Disk include la C Shell, l’Editor, il Compilatore, il Translator, il Linker, le librerie standard Stdio e Math e 5 esempi di listati di codice sorgente C. L’altro lato del floppy disk è il Library Disk e contiene le librerie di funzioni Stdlib.l e Syslib.l, utili durante la fase di compilazione e linking dei progetti. Il manuale include anche un comodo tutorial per velocizzare i tempi d’apprendimento nell’uso dei vari strumenti offerti dal compilatore.

Passare all’azione (nel 2023)
Se fossimo ancora negli anni 80, per procedere all’uso del compilatore avremmo effettuato una copia di backup del dischetto originale e avremmo cominciato con il classico comando LOAD”*”,8,1 seguito dal tasto RETURN per avviare la Shell di Power C e cominciare il nostro primo progetto. In caso disponessimo di un drive 1571, cosa piuttosto rara per i possessori di C64, meno per gli utenti di C128 (e ovviamente di C128D che l’avevano integrato), il dischetto sarebbe letto da entrambe le facce, mentre per tutti gli altri drive (1541, 1541-II, 1570, ecc.) la fase di compilazione avrebbe comportato alcuni cambi di disco (o, meglio, cambio di lato) per portare a termine la procedura ed ottenere il programma eseguibile su Shell o caricabile dal BASIC. Poiché era raccomandato l’utilizzo di un disco vuoto formattato come disco di lavoro in cui memorizzare i sorgenti dei file in C, i codici oggetto ed i file eseguibili, il numero di cambi di dischetto sarebbe salito vertiginosamente. Naturalmente i fortunati possessori di un drive 1581 avrebbero avuto vita più facile: sarebbe bastato riversare il contenuto dei due lati del dischetto in dotazione su un unico floppy disk 3.5” da 800 KB. E avrebbero avuto ancora tanto spazio a disposizione per molti progetti. Questo è proprio ciò che abbiamo fatto noi per provare Power C sia su un emulatore per PC sia su hardware reale, grazie alla grande quantità di periferiche moderne disponibili sul mercato del retrocomputing per C64. In particolare abbiamo utilizzato VICE 3.7 su PC Windows 10 configurandolo con un singolo drive 1581 e con una cartuccia Action Replay per velocizzare i caricamenti da disco. Il floppy disk virtuale da 800 KB è stato creato con DirMaster (un tool utilissimo per la gestione di dischetti immagine D64, D71, D81, ecc.). Sul dischetto D81 abbiamo poi trasferito il contenuto dei due D64 originali di Power C. Per i test su hardware reale lo stesso file .D81 è stato copiato su chiavetta USB, poi collegata ad una Ultimate II+ connessa ad un Commodore 64 PAL originale. Anche l’interfaccia Ultimate II+ è stata configurata con una versione di cartuccia Action Replay (file CRT) per fornire una spinta decisa alla velocità di trasferimento sulla porta seriale del C64.

Fig. 3 – Editor in azione

Il solito programma di esempio? No, stavolta no!
Potevamo usare il solito “hello_world.c” o il file “test.c” incluso per mettere alla prova la catena di sviluppo di un programma in C utilizzando Power C, ma sinceramente, spero siate d’accordo con me, non se ne può più! 😊 E allora abbiamo scelto un breve programma per il calcolo di pi greco secondo il metodo Montecarlo, che, se avete familiarità con le pagine di RMW dedicate alla programmazione, non vi suonerà per niente nuovo. In passato è stato usato come esempio di algoritmo e programmazione in BASIC, Forth e altri linguaggi di varie piattaforme a 8-bit. Di seguito mostriamo le operazioni compiute sull’emulatore o sulla macchina reale per illustrare l’uso del compilatore. Non ci sono grandi differenze tra i due contesti, ma naturalmente vedere dal vivo il modesto C64 macinare dati e sputare fuori il programma eseguibile perfettamente funzionante in relativo poco tempo è una soddisfazione notevole per chi, come il sottoscritto, ha mosso i primi passi nel settore proprio su questo computer.

Fig. 4 – Compilazione in corso

Cominciamo allora col caricare la Shell, vero e proprio centro nevralgico del pacchetto software e per farlo digitiamo il classico comando:
LOAD”*”,8
Al termine del breve caricamento, dopo il RUN, avremo a disposizione il simbolo $ della Shell, pronto a ricevere i comandi di gestione del file system e lanciare programmi di Power C. Tra i vari comandi disponibili segnaliamo i più importanti rimandando alla documentazione ufficiale per la lista completa:
$ l (oppure ls) [pattern] ; elenca i file del disco corrente, es. ls *.c
$ rm filename ; cancella il file specificato
$ mv file1 file2 ; sposta o rinomina il file1 su file2 sul disco di lavoro
$ pr [filename] ; mostra il contenuto del file sullo schermo
$ pr >> [filename] ; stampa il contenuto di un file sul device 4 (stampante)
$ disk [command string] ; manda un comando al drive: es. disk n0:[headername],[id#] formatta il disco di lavoro
$ ed [filename] ; esegue l’editor a tutto schermo del file indicato
$ ced [filename] ; come sopra ma l’editor effettua il controllo della sintassi
$ cc [-p] [filename.c] ; compila il codice sorgente contenuto nel file filename.c. L’opzione -p specifica al compilatore che vi sono due drive in uso
$ link [-s [address]] ; lancia il linker per finalizzare la produzione di un eseguibile. L’opzione -s specifica che il programma risultante sarà eseguibile senza l’uso della Shell, quindi direttamente dal BASIC del C64. Se specificato, [address] indica la locazione di memoria di partenza del codice eseguibile, default = $0801 inizio del BASIC
Il nostro primo step è dunque di aprire l’editor per creare il nostro programma in C per il calcolo di pi greco con il metodo Montecarlo. Nel riquadro 1 potete consultare il codice sorgente adeguatamente commentato. Quindi digitiamo nella Shell:
$ ed pimc.c ; oppure $ ced pimc.c
Verrà lanciato l’editor dove sarà possibile scrivere riga dopo riga l’intero programma. L’editor è molto flessibile

Fig. 5 – Processo di linking

e offre diversi comandi di modifica, ricerca e formattazione del codice. Premendo il tasto Run/Stop sulla tastiera l’editor entrerà in command mode per poter impartire diversi comandi di gestione, inclusi quelli per leggere (GET filename), salvare (PUT filename), stampare (PRINT filename), listare la directory del disco (DIR), ricercare testo (/searchstring), ecc. All’interno dell’editor alcuni simboli speciali molto utilizzati in C si possono ottenere sulla tastiera del C64 mediante la combinazione di tasti. Ad esempio le parentesi graffe {} si ottengono con + e -, back-slash “\” con il tasto “£”, underscore “_” con la combinazione Commodore+@, pipe “|” con Commodore+*. I comandi BYE o QUIT terminano il programma di editing e tornano alla Shell.
Dopo aver digitato e salvato il file con il nome pimc.c, siamo ora pronti a compilarlo con il comando:
$ cc pimc.c
Inizierà il processo di compilazione, durante il quale verranno segnalati eventuali errori di sintassi del linguaggio e altre anomalie del codice. Al termine, se tutto sarà andato per il meglio, otterremo il codice oggetto nella forma di un file chiamato con lo stesso nome del file sorgente e con estensione “.o”.
A questo punto non resta che effettuare il linking del file oggetto con le eventuali librerie non standard utilizzate nel codice sorgente. La fase di linking è forse la procedura meno lineare di quelle previste nella toolchain di sviluppo di Power C, ma nulla di impraticabile. Lanciamo quindi il programma linker specificando il parametro -s se vogliamo che il nostro programma possa essere eseguito al di fuori della Shell di Power C, altrimenti il linker produrrà automaticamente un file con estensione “.sh” che potrà essere eseguito solo nella Shell.

$ link [-s]
Il programma produrrà un prompt che ci consentirà di specificare nell’ordine: il codice oggetto, le librerie non standard da includere e infine il carattere/comando di avvio del processo effettivo. Per il nostro esempio, dal momento che nel programma abbiamo fatto uso di funzioni matematiche, oltre al codice oggetto pimc.o includeremo anche la libreria math.l.
pimc.o
math.l
Il tasto/carattere (“freccia in alto”, non il tasto “cursore su”) serve ad avviare il processo di linking al termine del quale otterremo il programma eseguibile. Nel nostro caso avremo il file pimc.sh (eseguibile via shell) oppure pimc.prg (caricabile ed eseguibile dall’ambiente BASIC del C64). Il nome del file eseguibile può essere indicato in questa fase quando il linker ne farà richiesta. In caso di errore sarà necessario fornire al linker le necessarie librerie di funzioni non standard. Naturalmente, nel test che abbiamo condotto, il drive 1581 emulato ci consente di evitare tutti i cambi di dischetto che invece dovremmo affrontare nel caso di un sistema con due drive 1541 o con drive singolo.
Il pacchetto Power C fornisce molti altri programmi di utilità per semplificare e ottimizzare tutte le fasi dello sviluppo di programmi in C. Inoltre offre librerie aggiuntive fornite da terze parti per gestire efficacemente le capacità grafiche, sonore e di I/O (user port e porte joystick) peculiari della piattaforma C64.

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.