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é