Chi ha posseduto un C64, è probabile che avesse anche un drive 1541 e relativi floppy da 5.25", ma che lo usasse semplicemente per caricare e, al massimo, salvare programmi.
In questo articolo cercheremo di andare un pò più a fondo e di vedere da vicino le principali caratteristiche dei dischi del 1541 e, soprattutto, che cosa è possibile fare col drive sui dischi stessi.
Ogni disco memorizza dati su TRACCE e SETTORI.
Una traccia è costituita da un numero variabile di settori, ciascuno dei quali è un blocco di dati lungo 256 byte. Ogni byte è paragonabile ad un singolo dato.
I dischi del 1541 sono formati 40 tracce fisiche, ma solo 35 di queste possono essere usate dal DOS (il sistema operativo del drive 1541 che gestisce i dati sul disco stesso).
Le tracce sono settori circolari concentrici allocati a partire dal bordo esterno del disco (traccia n. 1) fino al bordo interno (traccia n. 35).
Il seguente disegno riassume quanto detto finora:

Chiaramente, le tracce più esterne sono notevolmente più estese di quelle più interne, e, come è facile intuire, sono quelle che contengono il maggior numero di settori.
In particolare, le tracce da 1 a 17 contengono ciascuna 21 settori, le tracce da 18 a 24 ne contengono 19, le tracce da 25 a 30 ne contengono 18, le tracce da 31 a 35 ne contengono 17.
Quindi, i settori gestibili su disco sono 21*17 + 19*7 + 18*6 + 17*5 = 683.
Di questi, però, solo 664 possono essere usati per memorizzare dati e programmi dell'utente. I 19 blocchi riservati vengono usati dal DOS per aggiornare la lista e il tipo dei file contenuti sul disco, e si trovano tutti nella traccia n. 18.
Il primo settore di questa traccia contiene il BAM (block availability map), l'etichetta e l'ID del floppy, e la versione del DOS che è in grado di gestire il disco stesso. Il BAM è un registro di 140 byte che tiene conto dei blocchi liberi presenti sul disco stesso. Ogni volta che si salva un file su disco o lo si cancella, questo registro viene autoticamente aggiornato dal DOS.
L'etichetta e l'ID del disco rappresentano il nome e il codice identificativo del floppy, e possono essere modificati dall'utente. La versione del DOS, invece, non è modificabile.
Ciascuno dei restanti 18 settori è detto "BLOCCO DI GESTIONE FILE" ed è così organizzato:
Ogni campo file (tranne il primo) è allocato lasciando 2 byte vuoti dal campo file che lo precede, in modo da distribuire i dati uniformemente su tutto il settore.
Abbiamo dato una panoramica molto generale della struttura dei dischi 1541. Vediamo ora come scrivere listati Basic con i quali poter gestire efficacemente i dischi.
Si dà per scontata la conoscenza dei rudimenti del Basic, e si rimanda, per eventuali dubbi, alla revisione italiana della 'Guida di Riferimento del Programmatore' presente su questo sito (link temporaneamente sospeso - ndR).
Per scambiare informazioni col drive dovremo porre in testa ai nostri programmi un'istruzione del tipo:
dove
F% assume significati diversi
se A$ è un nome di file, F% è un identificativo di quel file
se A$ è un comando, F% è un canale associato al comando da eseguire per questo parametro useremo un numero compreso tra 1 e 127.
P% rappresenta la periferica con cui vogliamo comunicare; nel nostro caso, siccome vogliamo comunicare col primo drive, sarà sempre uguale a 8.
C% è il tipo di canale di comunicazione da aprire per trasmettere dati alla periferica, in particolare useremo C compreso tra 2 e 14 ogni volta che vogliamo inviare o ricevere byte dal drive useremo C = 15 ogni volta che vogliamo inviare un comando al drive.
Prendiamo un disco vuoto, formattiamolo e assegnamogli un'etichetta e un ID
Alcune osservazioni:nella riga 10 abbiamo definito 2 come canale di comando, e vi abbiamo trasmesso il comando "I" ( inizializza ), che posiziona la testina del drive sulla traccia riservata alla gestione dei file su disco. Questa operazione è svolta in automatico dal DOS ogni volta che si carica o si salva un programma.
La riga 15 invia al canale 2 un'altro comando:quello di formattare il disco. Il DOS posiziona la testina sulla traccia più esterna (la n. 1) e cancella eventuali dati presenti sul disco, spostandosi man mano verso la traccia più interna (la n. 35).
Quando ha finito di cancellare i dati presenti sull'ultima traccia, la testina si riporta sulla traccia riservata al DOS. Infine, la riga 20 chiude il canale di comunicazione per liberare risorse.
Se diamo il comando diretto:
LOAD"$", 8
e LIST
vedremo apparire a schermo quanto segue
0 "PROGRAMMI " 64 2A
664 BLOCKS FREE.
Il DOS ha caricato il direttorio del disco, leggendo il primo settore della traccia 18 e il primo campo file del secondo settore; avendo trovato come primo nome di file una stringa nulla, ha concluso che il disco non ha programmi memorizzati al suo interno, ed è ritornato al Basic. '2A' è la versione del DOS supportata dal floppy.
Ripuliamo la memoria con NEW e passiamo al prossimo listato.
Il seguente programma è un Word Processor che consente di scrivere a schermo stringhe qualsiasi e di memorizzarle in un file sul disco, finchè non viene letta la stringa terminatrice "STOP".
Stavolta abbiamo aperto un canale dati perchè volevamo creare su un file e scriverci sopra dei byte. Alla riga 10, PRG è il tipo di programma che abbiamo creato (un normale file sequenziale), e W è la modalità con cui l'abbiamo utilizzato ( Write=scrittura).
Diamo di nuovo LOAD"$", 8 e LIST. Questo è quel che appare a video:
0 "PROGRAMMI " 64 2A
1 "WORDPROC" PRG
663 BLOCKS FREE.
Se non abbiamo scritto molte stringhe, dovremmo aver occupato un solo blocco dati su disco; ciò significa che ne abbiamo ancora 663 a disposizione. Il DOS ha trovato il nome "WORDPROC" nel primo campo file del secondo settore della traccia 18.
Vogliamo ora conoscere la posizione dei blocchi dati usati dal file "WORDPROC".
Battiamo NEW e digitiamo il seguente programma:
Lanciamo il programma e chiediamo di conoscere i blocchi occupati dal file 'WORDPROC' salvato in precedenza.
NOME FILE? WORDPROC < return >
TRACCIA SETTORE
17 0
Abbiamo scoperto che il file WORDPROC è stato salvato nella traccia 17, al settore 0 ed è quindi composto da un solo blocco dati (come già sapevamo dall'analisi del direttorio).
Il programma è un pò complesso, e necessita di qualche spiegazione. All'inizio, il C64 chiede di immettere il nome del file del quale cercare i blocchi dati; quindi, viene aperto un canale di comando per impostare la traccia, il blocco e la posizione inziale della testina e un canale dati per l'accesso casuale al file attraverso la stringa "#"; questa modalità di accesso è necessaria per poter spostare la testina nella zona voluta all'interno di un singolo blocco del direttorio.
Il programma inizializza la posizione della testina con la routine alle righe 300-315, poi legge la stringa contenuta nel primo campo file del secondo settore del direttorio; appena vi è una discordanza col nome di file cercato controlla se la discordanza si è verificata oltre la lunghezza del nome di file inserito; se ciò non è vero, il programma sposta la testina sul prossimo campo file, eventualmente cambiando settore del direttorio se sono già stati analizzati tutti gli 8 campi file del settore corrente. Se nell'ottavo campo file del 18esimo settore del direttorio non è stato trovato il nome del file cercato, il programma termina segnalando all'utente che il file cercato non è presente sul disco.
Non appena viene trovato il file cercato, la testina viene spostata nella seconda posizione del campo file, dove vengono letti traccia e settore del primo blocco dati; essi vengono quindi stampati a schermo. Una volta spostatasi sul primo blocco dati del file ne vengono letti i primi 2 byte:questi contengono rispettivamente la traccia ed il settore del blocco successivo; se la traccia è diversa da 0, vengono stampati a schermo, e così via... La ricerca termina quando il primo byte del blocco (il puntatore alla traccia del successivo blocco dati) è uguale a 0:questo valore indica al C64 che il file non usa altri blocchi dati.
Il programma elenca i blocchi dati usati da un qualsiasi file su disco: si lascia al lettore la - banalissima! - implementazione di un sistema per visualizzare direttamente a schermo il numero di blocchi usati dal file: questo può essere utile nel caso in cui un file utilizzi molti blocchi dati, e non sia possibile determinarne la quantità perchè il loro elenco occupa più di una schermata.
Concludiamo questa nostra rapida carrellata sulle caratteristiche dei dischi 1541 con la descrizione dei file relativi. I file relativi permettono l'organizzazione dei dati in diversi blocchi dati (lunghi sempre 256 byte) ciascuno dei quali contiene un certo numero di RECORD, di lunghezza variabile a piacere. Come avrai capito, questi file sono utili per gestire liste ed elenchi. Noi, però, faremo qualcosa di più interessante che inserire semplicemente dati all'interno dei record; realizzeremo una 'agenda elettronica'. Vediamo come.
Al solito, ripuliamo la memoria Basic e digitiamo quanto segue:
Per comprendere questo programma dimostrativo è necessario conoscere la struttura dei file relativi. Quando si crea un file relativo, il 1541 scrive sul disco il nome del file ( come per qualsiasi altro file ) e crea un blocco dati, così composto:
Nel listato viene sfruttato questo principio per capire se il record è già occupato da dati (e quindi può essere scritto) oppure no. Infine, il 1541 crea un blocco detto di SIDE SECTOR, che serve a creare i riferimenti per i diversi blocchi dati usati dal file relativo. Il side sector si rivela di vitale importanza per poter scrivere i dati di un record a cavallo tra un blocco e l'altro.
Bene, con questi brevi ma incisivi esempi di listati Basic spero di aver 'stuzzicato' qualcuno di voi nell'approfondire l'argomento programmazione del drive. A scopo didattico, puo' essere utile salvare questi programmi, sperimentari e provare a migliorarli.