Newsgroup: it.comp.retrocomputing
Titolo: Da FATa Cluster nell'Atari ST

Sto cercando di fare un programmino per passare da files .ST (quelli
per gli emulatori Atari) a insiemi di directory DOS/Windows e
viceversa. Gemexplorer etc consentono di estrarre da un file .ST dei
files di testo, ma per gli altri sono dolori. Mi sono imbattuto in una
difficolta', non riesco a "tradurre" correttamente le entry della FAT
in numeri di Cluster. Saprete che per ogni file o folder il primo
Cluster viene indicato nella relativa entry della directory principale
o di folder. Nella FAT nella entry corrispondente al primo Cluster si
trova il numero o indirizzo del cluster successivo, finche si trova
$FFF o che cioe' fine del file. $000 vuol dire Cluster disponibile,
non necessariamente vuoto. I primi tre bytes della FAT sono riservati,
quelli successivi vanno considerati a gruppi di tre, ad ogni Cluster
corrisponde un byte e mezzo, cioe' 12 bits. Ovviamente per un FD
standard da 720 KB non ci dovrebbero essere Cluster con numero/
indirizzo superiore a 720, ne' ripetizioni, tranne gli $000 e $FFF. Ho
tentato di trattare la FAT prendendo i gruppi di tre bytes, per
ciascun byte, considerato come variabile stringa o carattere, ho
trovato ASC(A$), dopo di che per ciascuna coppia di Cluster ho
calcolato il primo moltiplicando per 16 lo ASC del primo byte e
sommando i primi quattro bit del secondo byte, con asc div 16, e
analogamente, per il secondo Cluster, ho fatto ASC del secondo byte
MOD 16, l'ho moltiplicato per 256, e sommato allo ASC del terzo byte.
Risulati sballati. Molte ripetizioni, numeri troppo grandi, etc.
Qualcuno saprebbe gentilmente illustrarmi come devo procedere per
superare questo scoglio?
Grazie
Paolo

 corrisponde un byte e mezzo, cioe' 12 bits.
 
Diciamo che da qua in poi ti ho perso, quando sono arrivato agli ASC() mi è tornato in mente il cervello di Homer Simpson con i criceti che correvano intorno.
 
CYA

Trovi moltissima letteratura sulla struttura della FAT12 (pensa ad
esempio alle note guide di Peter Norton)
Dando per scontato che tu sappia leggere le informazioni nel boot record
e calcolare la posizione della FAT e del primo settore dati, ti faccio un esempio.
Se la posizione del puntatore nella FAT è pari, leggi la word (16bit) corrispondente
e tieni i 12 bit più bassi. Se è dispari, tieni i 12 bit più alti.
 
(valori di fantasia)
 
Calcolo della posizione nella FAT: int(cluster#/2)+cluster# .
FAT offset=0x200 .
 
Clusters:
 
0: 0/2 + 0 --> 0 --> 0x200 .
1: 1/2 + 1 --> 1 --> 0x201 .
2: 2/2 + 2 --> 3 --> 0x203 .
3: 3/4 + 3 --> 4 --> 0x204 .
 
 
0x200 4B C0 04 4D F0 FF .
      ^     ^  ^     ^ .
      -------  ------- .
 
Offset 0x200 (pari): leggo 0xC04B e tengo i 12 bit più bassi: 0x04B.
 
Offset 0x201 (dispari): leggo 0x04C0 e tengo i 12 bit più alti: 0x04C.
 
Offset 0x203 (pari): leggo 0xF04D, tengo 0x4D.
 
Offset 0x204 (dispari): leggo 0xFFF0, tengo 0xFFF.
 
Spero sia chiaro... altrimenti 
 
http://www.asmirvine.com/asm/workbook/DecodingFAT12.htm
 
 
Ciao !
 
 
 
-- 
http://www.supervinx.com/Retrocomputer
 


Dopo mi ci ero perso anch'io.
Ciao
Paolo


Il MASM lo usavo un vent'anni fa. Sara' un modo per tornare giovane.
Ho dato un'occhiata anche al sito di Irvine, e purtroppo per ogni
problema che si risolve ne salta fuori un altro. Pare che il MASM giri
bene solo fino a Windows 98, poi ...
Ero riuscito a tirare avanti con il mio amato Atari ST per piu' di
vent'anni, poi ha tirato le cuoia. I due grossi problemi che ho dovuto
affrontare sono stati come recuperare i dati dai vecchi dischetti ST
(al 99% risolto) e decidere come andare avanti, se continuare con il
SW Atari, in emulazione, o passare completamente a Windows. Entrambe
le alternative presentano parecchie difficolta': Steem e' un discreto
emulatore, ma compare uno schermo piccolo (ingrandibile, ma la
risoluzione non cambia) a bassa risoluzione, non 80 colonne, ma solo
40; Pacifist non mi funziona, e sugli ultimi computer nemmeno SainT
(penso dipenda da CPU a 32 o 64 bit).  Usare Excel? Calcola la media
al massimo su 30 numeri. Per andare oltre si deve usare il suo VBA,
con rogne a non finire. Vecchi linguaggi simpatici e che conoscevo non
girano sui nuovi computer, quelli nuovi hanno manuali da 800
pagine ...
Scusa lo sfogo.
Ma non poteva chiudere Microsoft invece che Atari?
Grazie
Ciao
Paolo
 

Se devi leggere un'immagine di un floppy, non ti serve necessariamente
l'assembler.
Funziona in C, in Basic, in Pascal ...
Se devi aver accesso fisico al disco, questa è un'altra cosa, ma ti convien sempre
lavorare con le immagini.
Se ben ricordo, gli Atari utilizzano una sola FAT (mentre il DOS ne scrive due,
ed in caso di errori non usa quella di riserva... chissà a che serve ! Domanda
retorica ...)
Se hai qualche problema specifico di programmazione, puoi chiedere qui o in privato
supervinx
@
libero
.it
 
Preferisco assembler e C, ma digerisco anche Basic, Pascal ed altro ...
 
Io ho un paio di macchine DOS per la creazione/scrittura di immagini particolari,
e poi utilizzo Linux, al limite l'emulatore Dosbox.
Sia aranym, sia hatari o altri emulatori Linux based, hanno lo stesso problema.
Un quadratino al centro del video, ma non può esser altrimenti.
Sul monitor Atari si vedeva bene, ma la risoluzione in pixel era molto bassa,
e sui monitor attuali (per esempio 1280x1024) è delle dimensioni di un
francobollo.
 
 
 
-- 
http://www.supervinx.com/Retrocomputer
 

 francobollo.
Non e' solo questione di dimensioni, e' che righe di 80 caratteri le
spezza in due andando a capo.

Q&D hack
 
5 CLS
10 OPTION BASE 0
15 DIM A(6)
20 FOR I=0 TO 5: READ A(I): NEXT I
30 FOR CLUSTER=0 TO 3
40 OFFSET=(CLUSTER\2)+CLUSTER
50 IF (CLUSTER MOD 2)=0 THEN NEXTCLUSTER=A(OFFSET)+(A(OFFSET+1) AND &H0F)*256:ELSE NEXTCLUSTER=((A(OFFSET))+A(OFFSET+1)*256)/16
70 PRINT CLUSTER;SPC(4);HEX$(NEXTCLUSTER);SPC(4):
80 NEXT CLUSTER
1000 DATA &H4B, &HC0, &H04, &H4D, &HF0, &HFF
 
Output:
0    4B    1    4C    2    4D    3    FFF
 
Very Quick, very Dirty...
Questo, nell'ipotesi di prelevare un byte alla volta, che siano assenti le operazioni bitwise shift-left, shift-right e che
l'operazione (x and &H0FFF) generi overflow se x > 32767.
Altrimenti si potrebbe rendere molto (ma molto) più elegante.
"La morte sua" è in C o in Assembler ...
 
Ovviamente, all'offset calcolato è necessario aggiungere l'offset di partenza della FAT.
 
-- 
http://www.supervinx.com/Retrocomputer
 

5  CLS
 
10 OPTION BASE 0
 
15 DIM A(6)
 
20 FOR I=0 TO 5: READ A(I): NEXT I
 
30 FOR CLUSTER=0 TO 3
 
40 OFFSET=(CLUSTER\2)+CLUSTER\
 
50 IF (CLUSTER MOD 2)=0 THEN NEXTCLUSTER=A(OFFSET)+(A(OFFSET+1) AND &H0F)*256:ELSE NEXTCLUSTER=((A(OFFSET))+A(OFFSET+1)*256)/16 
 
60 PRINT CLUSTER;SPC(4);HEX$(NEXTCLUSTER);SPC(4): 
 
70 NEXT CLUSTER
 
1000 DATA &H4B, &HC0, &H04, &H4D, &HF0, &HFF
 
Errata corrige, dovuta a problemi di CR/LF