TECNO-CORNER: CODIFICA DELL'INFORMAZIONE SUI FILE TAP

1 OVERVIEW
----------

Il vecchio datassette invia dati al C64 sottoforma di impulsi: il C64 usa i registri
timer locati nei chip CIA per determinare la distanza temporale tra due impulsi consecutivi
e la confronta con un intervallo di riferimento (detto treshold,o soglia).

1.1 IL KERNAL

Il kernal è il sistema operativo del C64 e decodifica le informazioni sul nastro in accordo
alle seguenti regole:

-- prima treshold   (t1):  ~446 usecondii (PAL),~430 usecondi (NTSC)
-- seconda treshold (t2):  ~617 usecondii (PAL),~594 usecondi (NTSC)

-- ogni intervallo temporale inferiore aa t1 		     viene definito "corto" (s)
-- ogni intervallo temporale superiore aa t1 e inferiore a t2 viene definito "medio" (m)
-- ogni intervallo temporale superiore aa t2 		     viene definito "lungo" (l)

Per il kernal due intervalli temporali consecutivi formano un bit

-- s+m equivale a un bit 0
-- m+s equivale a un bit 1

1.2 FORMATO DI UN NASTRO PER C64

  1   2     3      4                            5   6     7    8
[s*][ss1][header][l+s] (ripete 1-4 con [ss2]) [s*][ss1][data][l+s] (ripete 5-8 con [ss2])

s*  = una sequenza variabile di intervalli corti usati come separatore tra i vari blocchi
ss1 = sequenza di sincronizzazione

> è una serie di nove byte: in sequenza 137,136,135...129.Ogni byte inizia con l+m e
> termina con un bit di parità dispari:per esempio,il primo byte (137) viene codificato
> come

l+m m+s s+m s+m m+s s+m s+m s+m m+s s+m
     1   0   0   1   0   0   0   1  (0=parità)

> da notare che il bit meno significativo viene codificato per primo.

header = intestazione (max 193 bytes)

> il primo byte dell'intestazione contiene informazioni riguardanti il tipo di programma,
> i quattro byte successivi contengono il segmento di memoria in cui caricare i dati,il byte
> meno significativo viene codificato per primo.I 16 bytes a seguire contengono il nome del
> programma in ASCII

01 01 08 09 97 47 41 4D 45 20 20 20 20 20 20 20 20 20 20 20 20

> la sequenza soprastante codifica un programma rilocabile (1,tipicamente BASIC),da caricare
> nel segmento di memoria da 2049(0801h) a 38664(9709h-1).

> Il programma si chiama GAME (47h è il codice ASCII di G,41h è il codice ASCII di A,
> 4Dh è il codice ASCII di M,45h è il codice ASCII di E,20h è il codice ASCII dello spazio).

> Nei 171 byte rimanenti ci può essere del codice in linguaggio macchina per gli scopi
> più disparati,seguito dal byte somma di controllo (xor logico di tutti i byte precedenti).

ss2 = come ss1,ma la sequenza è 9,8,7...1.

data = codice del programma (o del caricatore turbo)

> questo blocco codifica il programma vero e proprio,oppure un caricatore turbo:questo è
> generalmente molto più rapido del kernal e permette di caricare anche programmi multifile.

l+s = usato come marcatore di fine blocco (intestazione o dati).

2 IL FORMATO TAP
----------------

I commenti su un hexdump d'esempio valgono più di mille sproloqui :-)

00000000  43 36 34 2d 54 41 50 45 2d 52 41 57 01 00  C64-TAPE-RAW..
0000000e  00 00 32 9e 07 00 30 30 30 30 30 30 30 30  ..2...00000000

byte  0-11: "magic-label" del file: C64-TAPE-RAW codificata in ASCII

byte    12: versione del file

- se 0,i byte di dati 00h rappresentano  intervalli di tempo superiori al massimo
  intervallo rappresentabile con 8 bit (vedere sotto)

- se 1,i byte di dati 00h sono seguiti dda 3 byte che,presi con la codifica "byte meno
  significativo per primo",rappresentano l'intervallo di tempo associato.Per esempio,
  la sequenza

  00 54 03 00

  su un C64 PAL rappresenta un intervallo di tempo di 6,91 millisecondi (vedere sotto)

byte 13-15: espansione futura (sempre 0)

byte 16-19: byte di dati del file TAP (byte meno significativo codificato per primo)

> nell'esempio, 00079e32h = 499250 byte di dati.

byte 20-..: byte di dati.Ciascun byte rappresenta l'intervallo di tempo tra due impulsi
consecutivi,ad eccezione dei byte 00h (vedere sopra)

Vale la seguente formula

tt = (by * 8) / ck

dove

tt = intervallo di tempo tra due impulsi consecutivi (in secondi)
by = valore decimale del byte associato
ck = frequenza di clock della CPU:per i C64 europei (sistema PAL) vale 985248 cicli/secondo,
per i C64 americani (sistema NTSC) vale 1022730 cicli/secondo.

Turna indré