[zxspectrum] R: Re: R: Re: Fra tanti ZX....

  • From: Stefano Bodrato <stefano_bodrato@xxxxxxxxxxx>
  • To: "zxspectrum@xxxxxxxxxxxxx" <zxspectrum@xxxxxxxxxxxxx>
  • Date: Thu, 28 Jan 2016 15:46:33 +0100

Ma abbiamo chi conosce a menadito l’L/M del Microdrive…che è un po’ 
lontanuccio da gestire ;)
Ma ci sto pian piano riuscendo ^_^
 
La questione del Microdrive mi incuriosisce abbastanza..  
tempo fa ho studiato (non senza fatica) il kernel del tool "M-Doc: The 
Microdrive Doctor", di Ray J. Eckersley in z88dk, e ne ho ricavato delle 
funzioni per z88dk, compatibili con qualsiasi versione della Interface 1.

So che EMG si era spinto oltre, controllando direttamente i microdrive senza 
usare nemmeno le parti di basso livello della ROM, comunque ecco quel che avevo 
dedotto con i miei esperimenti:


- La formattazione del microdrive avviene scrivendo 256 settori numerati in 
modo decrescente da 255 a 0 (come sappiamo con i tool opportuni si può cambiare 
l'interleave e aumentare leggermente la capacità totale del cartridge).
- In ogni singolo settore viene registrato il nome del cartridge, il proprio 
numero d'ordine e i flag di stato .
- Visto che spesso il nastro è più corto del necessario, i settori con numero 
più alto verranno sovrascritti al giro successivo (questo significa che i 
settori sono salvati in sequenza).
- Nella seconda fase il "Format" verifica i settori e, nel giro successivo ne 
aggiorna i flag per distinguere i settori buoni da quelli danneggiati o assenti 
(Header Integrity=GOOD).
- Ogni settore può contenere un record, ovvero pezzo di file;   il record è a 
sua volta numerato progressivamente, ma è sempre possibile (per migliorare le 
prestazioni e/o l'affidabilità) salvare più copie dello stesso record in 
settori differenti (questo si può fare anche con una semplice POKE, perchè la 
ROM è predisposta).
- Le routine di lettura caricano ogni settore che passa davanti alla testina e 
confrontano l'header del record in esso contenuto con il nome e tipo di file 
cercato (e naturalmente con il numero record)... naturalmente una volta 
individuato il settore corretto questo viene dato in pasto al loader.
- L'ultimo record di un file è marcato con un flag EOF.
- Il primo record di tutti i file tranne quelli di tipo "PRINT" contiene un 
ulteriore header simile a quello del SAVE che conosciamo, escluso il filename 
che è già descritto a livello di record.
- E' possibile leggere, modificare e riscrivere il singolo settore, anche 
incasinando le checksum (non ricordo bene cosa faccia la ROM in questo caso, 
probabilmente riprova un po' di volte poi da errore, a meno che non trovi una 
seconda copia con la checksum a posto.
- CHR$(0) in testa al nome file nasconde il file al comando CAT, ma 
sostanzialmente non ha altri effetti.. un CAT potenziato non avrà problemi a 
superare questa "protezione"


Le conseguenze logiche di questa situazione:

- Il processo di "ERASE" è lento, perchè viene cercata a tappeto ogni traccia 
di qualsiasi record contenente il nome file da cancellare (che può essere anche 
doppio o orfano).
- Ho realizzato un RENAME secondo lo stesso principio, ed è ancora più lento.  
Il "rename" ufficiale si basa sulla copia del file (MOVE) e successiva 
eliminazione del file di origine, il che naturalmente crea problemi in mancanza 
di spazio libero.
- Z88DK è in grado di gestire l'accesso casuale a file di grosse dimensioni 
utilizzando il numero record.  Questo mi ha permesso il funzionamento 
dell'interprete per giochi Infocom sul gommoso, copiando con un loop BASIC i 
file .DAT originali da seriale.
- Modificando i settori di copie multiple di un programma si possono realizzare 
leggere variazioni dipendenti dal settore che ci si trova davanti: 
probabilmente usabile osservabile solo con programmini brevi e poco sensato.
- Credo che il nome disco non serva a nulla, se non a CAT per dare un titolo 
alla directory.. con un CAT modificato potrebbe essere riutilizzato per 
abbozzare dei folder a livello root.
- E' poco conveniente usare il numero di settore per creare un filesystem 
alternativo, meglio creare un file di tipo "PRINT" lungo quanto tutto il 
cartridge (un qualche linguaggio FORTH o PROLOG lo faceva)..in questo modo si 
saltano automaticamente i settori difettosi e per l'accesso casuale si cerca il 
numero record.
- Come sopra, nulla vieta di inventarsi un formato di record diverso.
- Non c'è nulla di terribile ad avere il primo settore danneggiato  :)


E' inoltre possibile creare un programma che faccia il dump dei settori di un 
microdrive ad esempio per spedirli a un emulatore.
Unica difficoltà è distinguere un settore assente da un settore danneggiato: 
probabilmente un buon trucco sarebbe di tenere una copia dell'ultimo buffer 
caricato e considerare "not found" quando il buffer non cambia.
NON è altrettanto facile riuscire a fare il contrario, perchè ogni cartridge ha 
qualche settore danneggiato e quelli del cartridce sorgente potrebbero non 
corrispondere.. riformattando tante volte si potrebbe però tentare di marcare 
quelli giusti.

Sarebbero state possibili diverse protezioni ad esempio basandosi sulla 
presenza di un particolare settore danneggiato.. ma per le note ragioni di 
instabilità non sono mai stati utilizzate: già il dato del Microdrive stava su 
per miracolo, se ancora ti vietavo la copia...


Stefano




                                          

Other related posts: