LICENZA D'USO DI QUESTO DOCUMENTO
=================================
Questo documento è rilasciato con licenza Creative Commons v2.5, del
tipo "Attribuzione - Non Commerciale - Condividi allo stesso modo":
http://creativecommons.org/licenses/by-nc-sa/2.5/it/deed.it
DISCLAIMER
==========
Le operazioni qui elencate non possono causare problemi o perdite di
dati (al massimo i giochi non vi funzionano), tuttavia per evitare
problemi e per evitare di dover rifare tutto daccapo, è fortemente
consigliato lavorare su delle copie dei file
CONVERTIAMO IL LATO PER COMMODORE 16: SPIEGAZIONE TECNICA
=========================================================
In queste cassette quasi tutti i programmi, tranne la presentazione e
quelli in BASIC, caricano con un turbo molto particolare, che in
pratica attiva il modo "fast" del processore, e di fatto alza le
frequenze ma in realtà si tratta di una normale registrazione con SAVE
semplicemente accelerata del 128%. Questo turbo ha tre particolarità:
1) La prima è che è molto schizzinoso con le macchine originali, un
minimo problema di allineamento o di testina sporca (molto più che con
altri turbo, anche più veloci di questo, tipo quelli di videobasic o
quelli di byte games, che però sfruttano le halfwaves) manda a donnine
il caricamento costringendovi a ricominciarlo daccapo
2) La seconda è che NON FUNZIONA CON GLI EMULATORI, non c'è stato
verso di farcelo andare, e non mi stupisco visto quanto è schizzinoso
anche sulle macchine originali
3) La terza è che grazie a questa particolarità possiamo intervenire
tranquillamente sul wave.
INGREDIENTI PER UNA PERSONA (CHE ABBIA *TANTA* PAZIENZA)
========================================================
1) Il dump in formato tap del nastro (potete crearlo con MTAP, con un
DC2N, o con un registratore audio)
2) Star Commander http://sta.c64.org/sc.html
3) Tap2Wav e Wav2Tap, entrambi qui
http://sourceforge.net/projects/c64tapedecode/ anche se esiste una
versione migliore (per quanto più vecchia) di Tap2Wav: migliore perché
permette la conversione in wav dei tap con halfwaves, la trovate qui
http://plus4world.powweb.com/tools
Purtroppo al momento non esiste un wav2tap che supporti gli halfwaves
(ed è il motivo per cui i nastri per C16 che richiedono halfwaves non
si possono dumpare a tutt'oggi con un registratore audio). Comunque,
questi nastri NON vanno dumpati con le halfwaves, quindi è possibile
dumparli anche con un registratore audio.
4) Un editor audio avanzato (io uso Cool Edit Pro) che abbia funzioni
di modifica della velocità (avete presente quando fate andare un
vinile da 45 giri a 33 giri o viceversa? dovete essere in grado di
creare quell'effetto lì). La modifica deve agire sulla durata E sulla
frequenza (quindi come un normale rallentamento analogico). L'ideale è
un editor che permetta la modifica anche solo di parti di wav.
L'editor dev'essere buono, nel senso che non deve modificare l'onda
oltre naturalmente alla frequenza e alla durata, in pratica non deve
inserire effetti spuri che non farebbero caricare correttamente.
5) Un po' di conoscenza del C= BASIC 3.5, della mappa di memoria del
C16 (reperibile qui
http://www.zimmers.net/anonftp/pub/cbm/maps/C16.MemoryMap ), del
monitor L/M, e soprattutto dell'uso di VICE e YAPE (come inserire i
tap nel registratore virtuale, eccetera), nonché delle funzioni
dell'editor audio indicato al punto 4.
6) Un certo orecchio musicale per riconoscere i toni audio standard
del C16 (che potete tranquillamente ascoltare sentendo l'inizio della
cassetta). Mi rendo conto che non tutti possono averlo, ma in tal caso
potrebbe venirvi in aiuto lo stesso editor audio del punto 4, che (se
è come Cool Edit) dovrebbe includere anche un (blando) analizzatore di
spettro.
PASSIAMO ALLA PRATICA
=====================
Aprite il wav con l'editor audio e analizzate attentamente l'audio. Vi
accorgerete che ci sono parti che si ripetono, si tratta semplicemente
dei vari programmi della cassetta. Non mi soffermerò ora della
trattazione dei segnali di header e dati, quello che ci interessa è
che i giochi in turbo hanno frequenze notevolmente più alte rispetto
al normale.
Il trucco sta nel prendere queste parti turbizzate e riportarle alle
frequenze standard del C16.
Come fare? RALLENTATE TUTTA QUELLA PARTE DELL'AUDIO (dal sibilo
iniziale al sibilo corto finale). La percentuale dovrebbe essere circa
il 128%. In realtà questa percentuale può dipendere dal vostro sistema
di dumpaggio, quindi dopo aver rallentato verificate che sia uguale (o
almeno estremamente simile) a quella delle parti non turbizzate. Se
notate che è più grave, avete rallentato troppo. Se invece fosse più
acuta, avete rallentato troppo poco. In entrambi i casi, l'esperienza
mi insegna che NON VI CONVIENE RI-RALLENTARE/ACCELERARE LA PARTE GIA'
RALLENTATA/ACCELERATA, ma piuttosto rimettetela com'era prima (tanto
state lavorando su una copia del file e comunque non avete salvato la
modifica, VERO? :D) e modificate il valore di rallentamento. In questo
modo, avrete un valore standard che (salvo casi estremi) dovrebbe
valere per tutta la cassetta. Le parti turbizzate degli altri giochi
quindi riuscirete a rallentarle senza problemi.
Quando avete finito e tutte le parti sono ora con le stesse frequenze
(quelle standard del C16, corrispondenti alle parti non "turbizzate"
della cassetta), salvate il file e riconvertitelo in tap con wav2tap.
ABBIAMO FINITO? MACCHE', ABBIAMO APPENA COMINCIATO
==================================================
A questo punto create un file D64 (con Star Commander o con VICE),
CARICATE *YAPE* (non VICE!) e "montatelo" nel drive virtuale. Passare
dai floppy vi eviterà di andare avanti e indietro con la cassetta, che
la gestione del registratore di YAPE è penosa (ho detto di usare YAPE
perché VICE non caricherebbe il file se, com'è probabile, vi siete
solo avvicinati alle frequenze reali... potete pure provare, ma se
trovate solo dei LOAD ERROR non prendetevela con me).
Mettete il file TAP nel registratore virtuale e date il LOAD.
Quasi certamente caricherà il primo programma, che è la presentazione
e non ha né turbo né autorun. Salvatela direttamente su disco con
DSAVE"NOME PROGRAMMA"
(chi lo chiama "NOME PROGRAMMA" gli tiro un pugno :D).
Ora attenzione, resettate (soft o hard reset) il C16 emulato, provate
a caricare il programma successivo, che quasi certamente è il loader
di un turbo. Se è così, ve ne accorgete facilmente perché poco dopo il
found lo schermo comincerà a "ballare". In questo caso, ritornate
indietro, superate la presentazione (senza risalvarla stavolta), e
mettiamoci al lavoro.
Siete quindi posizionati col nastro subito prima del loader di una
parte in turbo.
ENTRATE IN MONITOR (comando MONITOR)
caricate il loader in questione col comando
L
(sì non è sbagliato è solo L, sta per LOAD in ambiente monitor)
Questa volta, noterete che poco dopo il found lo schermo NON ballerà e
vi ritroverete col cursore pronti a salvare questo benedetto loader.
NON fatevi prendere dalla tentazione di scrivere X e uscire dal
monitor perché lo schermo inizierebbe a ballare e dovrete ripetere
tutto. Restiamo in ambiente monitor: ci troviamo col loader
sicuramente in memoria, ma come facciamo a salvarlo?
In realtà non siamo neanche obbligati a salvarlo, ci basterebbe
disassemblarlo subito, ma diciamo pure che vogliamo salvarlo per
guardarcelo con calma.
Il loader in decimale si trova da 688 a 772 (in hex da $02B0 a $0304).
Queste due locazioni le trovate, facilmente, nel buffer di cassetta
(che non mente mai... o quasi) e cioè
peek(820)*256+peek(819) (inizio)
peek(822)*256+peek(821) (fine)
ossia
peek($0334)*$0100+peek($0333) (inizio)
peek($0336)*$0100+peek($0335) (fine)
naturalmente siamo in ambiente monitor e dobbiamo ragionare come tali,
quindi in esadecimale. Per sapere le locazioni ci basterà fare
M 0333
e i primi quattro valori che vedremo dopo l'indirizzo, cioè dopo >0333
saranno i 4 byte (prima il basso, poi l'alto), divisi in coppie di due
byte, che ci interessano.
Per fare i calcoli potremo farli tranquillamente con la calcolatrice
di Windows impostando la modalità scientifica e scrivendo i valori
direttamente in esadecimale (naturalmente dopo averla impostata in
esadecimale).
Se, com'è stato nel mio caso, il loader si trova da $02B0 a $0304,
potremo salvarlo su disco con il comando
S"LOADER GIOCO 1",08,02B0,0304
Non credo ci sia bisogno di spiegare questo comando, ma comunque per i
profani S sta per SAVE, seguito tra virgolette dal nome del file
(obbligatorio nel caso del disco, ovviamente), seguito dal numero di
device (08 cioè il floppy), l'indirizzo iniziale e l'indirizzo finale.
Ah, questo comando mi ha risolto tanti problemi ai bei tempi quando
non sapevo come uscirmene da una protezione e in più, su C16, permette
di salvare in un colpo solo schermata testuale, colori e programma...
La potenza del C16... ma sto divagando :D Torniamo al nostro loader.
Ora che l'abbiamo salvato esaminiamolo un attimino: dando per scontato
che il programma si trovi da $02B0 a $0304, disassembliamo una parte
particolare del programma, in particolare tre byte, che vengono
richiamati dal loader quando ha finito il caricamento:
D 02CD 02CF
Fate attenzione a cosa c'è scritto: se vedete un JMP <indirizzo> vuol
dire che il programma che il loader va a caricare è in linguaggio
macchina e NON può partire con RUN perché non ha una linea BASIC con
SYS. Annotatevi attentamente il valore che vi viene segnato, perché ci
servirà dopo.
Se invece di JMP vedete altri comandi, i casi sono due: o il loader
non va da $02B0 a $0304 (in tal caso dovete cercare di disassemblarlo
e cercare se ci sono dei JMP a fine caricamento) oppure, se il loader
è in quell'area, forse siete fortunati e il gioco ha una linea che
permette di lanciarlo direttamente con RUN da BASIC.
A questo punto il loader non ci serve più (ma tenetelo salvato sul
floppy perché se qualcosa va storto vi risparmiate il fastidio di
tornare indietro sulla cassetta).
FINITO IL LOADER, PENSIAMO AL GIOCO
===================================
Facciamo un bel SOFT RESET (o HARD RESET se il risultato non è quello
atteso) e proviamo a dare un bel LOAD da BASIC come se niente fosse.
In condizioni normali il computer non caricherebbe nulla fino al
prossimo loader, ma noi abbiamo sfruttato due assi nella manica:
1) Stiamo usando YAPE, non VICE e non la macchina originale, che è
molto meno sensibile di VICE e della macchina originale alle
variazioni di velocità del caricamento
2) Abbiamo rallentato la parte velocizzata, o almeno dovremmo averlo
fatto: quindi le frequenze sono quelle standard, e YAPE dovrebbe
caricare senza troppe storie
Scritto LOAD e premuto return, alla richiesta PRESS PLAY ON TAPE
eseguite e incrociate le dita (ovviamente velocizzate impostando il
full throttle con ALT+W, ricordatevi solo di toglierlo a caricamento
terminato).
Se dopo poco visualizzate FOUND GAME (o qualunque altra cosa) e
riuscite a far partire il LOADING, siete a cavallo.
Se così non fosse, avete sbagliato qualcosa nel rallentare: o avete
rallentato troppo, o troppo poco, o avete rallentato solo una parte
della parte velocizzata e non tutta. Se vedete BREAK ERROR, LOAD
ERROR, o altri comportamenti anomali, quasi certamente dipende da
questo.
Se tutto andrà bene, comunque, alla fine dovreste trovarvi con il
classico READY.
Se avete anche il cursore sotto, fate un bel
PRINTHEX$(PEEK(820)*256+PEEK(819))
PRINTHEX$(PEEK(822)*256+PEEK(821))
Quasi certamente il primo numero sarà $1001 (4097 in decimale) o,
taltolva, $1000 (4096 in decimale), comunque segnateveli entrambi.
Entrate in monitor e per ora salvate il gioco scrivendo
S"NOME",08,INIZIO,FINE
dove ovviamente INIZIO e FINE sono i due valori che i due PRINT appena
dati hanno tirato fuori.
Perché abbiamo caricato da BASIC e non direttamente da MONITOR? Perché
da MONITOR non avremmo avuto alcuna notizia di eventuali errori di
caricamento, cosa molto importante perché abbiamo caricato una parte
"rieditata".
Naturalmente, se a fine caricamento per qualche motivo (capita)
avessimo avuto il READY. (importante che sia senza LOAD ERROR) ma
SENZA il cursore, l'unico modo era caricare da monitor (e scoprire le
locazioni come avete fatto prima per il loader).
ANNOTATEVI GLI INDIRIZZI DI INIZIO E FINE PROGRAMMA IN ESADECIMALE.
Visto che ormai abbiamo salvato, proviamo a vedere se il gioco
funziona: vi ricordate la JMP vista nel passaggio precedente quando
abbiamo disassemblato il loader? Scrivete, sempre da monitor,
G INDIRIZZO
Naturalmente senza il $ prima dell'indirizzo (ma sempre in
esadecimale): se tutto andrà bene, il gioco dovrebbe partire.
Si ottiene lo stesso effetto da BASIC con la riga
SYS DEC("INDIRIZZO")
In questo caso l'indirizzo (in esadecimale) va tra virgolette e tra
parentesi.
POTREMMMO FINIRE QUI? SI', MA...
================================
Noi siamo perfezionisti, o almeno io lo sono.
Vorremmo che il gioco partisse con un classico RUN da BASIC.
Inoltre il gioco è su disco, e noi lo vogliamo su un T64, perché è più
immediato, perché è più figo ecc.ecc., tanto il turbo l'abbiamo già
perso salvandolo su disco, almeno teniamolo su un T64 che almeno
carica immediatamente.
Pensiamo al problema numero 1: la soluzione che avevo pensato era di
scrivere una riga
10 SYS indirizzo (preconvertito in decimale per risparmiare spazio)
Purtroppo, sebbene ci sia in effetti lo spazio in memoria, questo
sistema non funzionerebbe, perché altererebbe i puntatori; ma non
solo: per via della gestione della memoria, rilocherebbe tutto il
programma in L/M, causandone il non funzionamento.
Come fare allora?
Carichiamo il programma (visto che l'avevamo lanciato :D) e ricorriamo
ancora una volta al MONITOR.
Scriviamo
M 1001
Vedete l'inizio dell'area BASIC, e probabilmente anche la fine, perché
poi comincia la parte in L/M.
La fine dell'area del BASIC è segnalata da tre zeri consecutivi (00 00
00) che possono anche essere seguiti da altri zeri (non è importante,
basta che ce ne sono almeno tre).
Se questi tre 00 si trovassero da $100A (il secondo valore della
seconda riga, che inizia da $1009) o addirittura da prima, allora non
c'è nulla da fare.
Se però, com'è probabile e com'è sempre stato nel mio caso, i tre zeri
si trovano dopo $100A, già da $100B, oppure, bontà vostra, non vedete
in quella prima schermata sequenze di tre 00 consecutivi (ma è molto
difficile che sia così), allora quello che vogliamo fare è
perfettamente fattibile.
Cioè le prime due righe devono essere così:
>1001 XX XX XX XX XX XX XX XX
>1009 XX XX XX XX
Se in questi valori non ci sono tre 00 consecutivi (se ce ne sono due
negli ultimi due va bene, anche se quello subito dopo -non presente in
queste due righe- fosse il terzo 00) allora possiamo andare avanti.
Resettate il C16 (HARD RESET non soft reset) e scrivete la seguente
linea BASIC:
0 SYS indirizzo
dove l'indirizzo corrisponde all'indirizzo IN DECIMALE della JMP (se
non sapete qual è usate la calcolatrice del PC oppure fatevelo dire
dal C16 con PRINT DEC("INDIRIZZO").
Entrate in monitor e scrivete
M 1001
COPIATEVI TUTTI I VALORI DELLA PRIMA RIGA CHE VEDETE e i valori della
seconda fino ai tre 00 consecutivi della seconda riga (probabilmente
seguiti da altri zeri, ignorate dal quarto 00 in poi).
Uscite dal monitor, tornate al BASIC, fate un HARD RESET, caricate il
gioco, entrate di nuovo in monitor, scrivete sempre
M 1001
ed andate a scrivere la prima riga e parte (SOLTANTO PARTE) della
seconda scrivendola in modo simile a questo (naturalmente dovete
sostituirlo con i valori che vi siete segnati prima per le vostre due
righe: la vostra seconda riga è sicuramente diversa, può essere anche
più corta, ma non sarà più lunga di questa)
>1001 0C 10 0A 00 9E 33 32 37
>1009 36 38 00 00 00
FERMATEVI AI TRE 00 e non inserite altro dopo.
Ridate un M 1001 per un'ultima volta, ora dovreste vedere la prima
riga inserita ora da voi riga "ibrida", dopo i tre 00 dovrebbe esserci
quello che c'era prima.
Se tutto è a posto, salvate di nuovo (ricordate i valori di inizio e
fine che c'erano prima, ma ATTENZIONE! Se il valore di inizio era più
in alto di $1001, dovrete salvare da $1001 in poi) la versione
definitiva del file, uscite al BASIC e provate a dare il RUN. Il gioco
dovrebbe partire.
Proseguite così per tutti i giochi che seguono (di solito non sono più
di 5 o 7 quindi quest'operazione per quanto laboriosa è in realtà più
rapida di quanto possa sembrare).
E COME LO PORTO SU UN T64?
==========================
Usando Star Commander, in questo modo fate anche pulizia dei file che
non vi servono più (naturalmente fatelo solo dopo aver abbondantemente
testato il tutto). I file dei loader non vi servono più. Tenetevi solo
la presentazione e i giochi.
CONVERTIAMO IL LATO PER VIC 20: SPIEGAZIONE TECNICA
===================================================
Il Vic20 non dispone di un monitor in L/M e la ridotta capacità di
memoria (sia pur espandibile ma con problemi che dirò tra poco) non
permette un facile uso del SAVE da BASIC
In questo caso ci viene in aiuto il VICE: xvic dispone di un comodo
monitor del tutto simile a quello che abbiamo usato prima col C16,
soltanto "esterno" alla finestra dell'emulatore e forse un pochino
meno pratico.
Tuttavia il VIC20 proprio per la poca memoria non ha mai avuto
turbotape, anche perché i giochi essendo da 3.5 KB (almeno per la
versione inespansa) non prendevano molto tempo nel caricarsi.
Visto che il cassette buffer potrebbe essere rilocato a seconda
dell'espansione inserita o meno, stavolta fidiamoci dei puntatori del
BASIC.
Caricato il programma scriviamo
PRINT(PEEK(44)*256)+PEEK(43),(PEEK(46)*256)+PEEK(45)
Quasi certamente il primo numero sarà 4097 quindi il solito $1001
Convertiamo con la solita calcolatrice di Windows i numeri in
esadecimale.
A questo punto entriamo nel monitor del VICE (Notate che la sintassi è
leggermente diversa da quella del Monitor del C16)
scriviamo
s"nome" 8 1001 XXXX
Esempio: se il secondo numero è 7680 quindi $1E00, scrivete
s"nome" 8 1001 1e00
Andate avanti così per tutto il resto del nastro.
Naturalmente per riportare su T64 i file PRG del floppy, usate il
solito Star Commander.
THAT'S ALL FOLKS
================
Si ringrazia:
- Chi se ne fotte se sono esperto o inesperto
- Chi considererà utile questa guida
- EdicolaC64 su cui finiscono e finiranno buona parte dei miei dump
- Le persone umili e non supponenti
Se avete trovato utile questa guida, rilasciate i vostri dump
gratuitamente alla comunità.
Io e tutto il resto del mondo ve ne saremo grati.
Bella guida Massi, grazie.
L'unico dump che feci fu oltre 10 anni fa (non ricordo come, so che
campionai le cassette collegato un vecchio stereo al portatile e poi,
con un programma, lo convertii in tap). Quando avevo 12 anni, con mio
cugino e un suo vicino di casa, scrissi uno stupidissimo gioco in
basic per il 64. Mi faceva piacere recuperarlo e l'ho convertito.
Tutto mi riuscì al primo colpo.
Cmq non te la prendere per chi critica. Criticare è molto facile,
anche offendere, ma chi è criticato spesso significa che è oggetto di
attenzioni. Meglio essere oggetto di attenzioni piuttosto che il
niente.
MASTER
Ma che bella coppia, voi sì che sapete tenere alta la partecipazione di
questo newsgroup
ahahahhaahah