Edicolac64 forum - il commodore 64 in italia
Convertire le cassette/dischi e effettuare il processo inverso + Programmi e Utility =>
Convertire le cassette/dischi e effettuare il processo inverso + Programmi e Utility => Topic aperto da: Massi cadenti - 22 Agosto 2011, 23:43:21
-
Byte Games n6 C64 Lato A
E il lato C16? :ncomment:
-
Ho provato a convertirlo con audiotap ma dopo innumerevoli tentativi non sono riuscito a far funzionare neppure un gioco. C'è qualche accorgimento e/o settaggio particolare da usare col C16? Se interessa posso ricampionare il nastro e metterlo online a disposizoni di chi vuole cimentarsi nella conversione.
-
Ho messo in condivisione il wav del lato B:
http://www.megaupload.com/?d=WX45SL7T
-
No, con l'audio non si può perché wav2tap non include le halfwaves. Non puoi usare mtap?
La sintassi è
mtap nome.tap -c16pal -h -b 50
Di dove sei? Se sei di Napoli posso dumparle io col DC2N
-
Però Audiotap permette la selezione "C16 with semiwaves" che però con questa cassetta non da alcun risultato. Impostando seplicemente C16 invece nel tap ottenuto parte l'introduzione e i caricamenti sembrano andare(appaiono le linee raser di caricamento) ma poi si blocca tutto alla fine. Purtroppo non ho la possibilità di collegare un datasette e provare con mtap...e sono un po' lontanuccio da Napoli(La Spezia).
-
Se il problema non è il pc, procurati un datassette, ormai te lo tirano dietro in qualunque mercatino, o alla peggio (perché la spedizione rischia di costarti più dell'oggetto) puoi andare su ebay.
-
Il problema non è il datasette(ne ho 2) ma il cavo e la porta parallela che non c'è su notebook(questa penso rimediabile con qualche adattatore usb).
-
Il problema non è il datasette(ne ho 2) ma il cavo e la porta parallela che non c'è su notebook(questa penso rimediabile con qualche adattatore usb).
No, non perdere tempo e soldi, non funziona con adattatori USB, perché chiaramente gira sotto DOS e DOS significa niente supporto USB. Devi allora cercare di recuperare un vecchio PC (va bene anche un Pentium 1 e probabilmente persino un 486), magari prova sul newsgroup it.comp.retrocomputing. La cosa importante è che abbia oltre alla parallela anche qualcosa con cui possa interscambiare i dati con il portatile. Questo significa
- o Windows dal 95 in su (forse anche 3.x ma non sono sicuro) e una scheda di rete (pure ISA va bene) in modo da passare i dati via rete (puoi anche non collegarlo a internet basta collegarlo al portatile con un cavo cross -ma anche se non è cross probabilmente la porta ethernet del portatile ha l'autosense ed è in grado di gestire anche un cavo dritto-)
- oppure un drive per floppy (3.5") che però devi avere anche sul portatile in modo da passare i dati su floppy
- oppure sempre Windows dal 95 in su e un masterizzatore in modo da passare i dati su CD
Non perder tempo con porte parallele su USB e cose del genere.
-
Un pc fisso potrei anche recuperarlo, ma per il cavo c'è modo di comprarne uno già costruito?
-
Se hai un 1531 (quello nero che si collega al C16) puoi chiedere a Joe Forster (http://sta.c64.org/x1541shop.html) di costruirti un X1531 (http://sta.c64.org/x1531.html). Altrimenti se hai un C64 funzionante puoi usare un normale X1541 (quello per collegarci il drive) lo trovi anche su ebay (oltre che da Joe Forster), collegarlo non al drive ma al C64 su cui farai girare il programma TAPSERV, colleghi il normale datassette al C64 e usi MTAP con l'opzione -x.
-
Scusa, che opzioni hai usato in audiotap (senza halfwaves) per fargli creare un tap che veniva letto inizialmente? E per leggerlo hai poi usato VICE o YAPE?
-
Non ricordo che parametri ho usato durante quel tentativo, ma questa mattina ho fatto un po' di prove con quel wav e Audiotap non mi ha piu' generato qualcosa di leggibile(neppure il "found"). Sono riuscito ad ottenere lo stesso risultato dell'altra volta(introduzione e caricamenti) solo usando Ubercassette(che non conoscevo sino a 2 giorni fa) utilizzando il comando "ubercassette nome.wav nome.tap -machine: c16".
-
Ok, ho provato e ti confermo che ha bisogno delle halfwaves perché è lo stesso loader dei byte games che ho già dumpato io (valli a vedere), che se non ci sono le halfwaves i colori della cornice NON cambiano.
Questo UberCassette (http://www.retroreview.com/iang/UberCassette/) che hai trovato e che neanche io conoscevo deve quindi supportare i TAP v2 per generare tap funzionanti con halfwaves.
In alternativa bisogna capire cos'è che non va in audiotap, che parametri avevi usato senza halfwaves e se c'è modo di recuperare un tap funzionante con halfwaves.
Le mie conoscenze sono finite qui, se fossi a La Spezia avrei già risolto dumpando io col DC2N purtroppo da qui non posso fare altro. Mando quindi una mail a Fabrizio Gennari e a Luigi Di Fraia, due guru del formato TAP e dei convertitori, segnalando loro questo thread, sperando che almeno loro riescano a capirci qualcosa.
-
Tra gli altri c'è se ho ben capito anche il gioco dei Puffi che da bambino comprai in edicola e NON FUNZIONAVA LA CASSETTA e anche cambiandola me ne diedero un'altra non funzionante... quindi m'è rimasta sta cosa di volerlo vedere (anche se non m'aspetto granché, anche quello per C64 visto anni dopo mi aveva deluso... per vedere un bel gioco coi Puffi ho dovuto aspettare il SNES)
-
Ubercassette(che pare molto promettente) manca del supporto alle halfwaves e infatti l'autore scrive "C16 support is limited to full-wave at the moment, I'll try and add half-wave support if I can find a half-wave cassette!". Gli ho segnalato il link a quel wav che ho campionato, magari gli può essere utile.
Siamo nelle mani degli esperti ora.
-
Ubercassette(che pare molto promettente) manca del supporto alle halfwaves e infatti l'autore scrive "C16 support is limited to full-wave at the moment, I'll try and add half-wave support if I can find a half-wave cassette!". Gli ho segnalato il link a quel wav che ho campionato, magari gli può essere utile.
Siamo nelle mani degli esperti ora.
Volevo farlo io ma non ho trovato un contatto sul sito... probabilmente era nel readme...
-
Il motivo per cui il TAP v1 (cioè senza semionde) non funziona (o, meglio, solo le parti non turbo funzionano) è semplicemente che questo particolare turbo loader ha bisogno delle semionde. Riconosce i trigger in salita invece di quelli in discesa. In pratica, sarebbe sufficiente una modifica al turbo loader per fargli riconoscere i trigger in discesa, e il TAP v1 funzionerebbe.
I motivi per cui il TAP v2 (cioè con semionde) non funziona sono due, e più sottili:
* il kernal loader (quello senza turbo) è particolarmente sensibile alle variazioni delle lunghezze degli impulsi, e apparentemente l'uso delle semionde lo rende ancora più sensibile. Servirebbe un programma per ripulirlo, tipo Tapclean, che però non supporta i TAP v2
* il supporto per le semionde è stato introdotto in Audiotap abbastanza recentemente, e soltanto dopo ho notato che VICE accetta i TAP v2 solo se la prima semionda è positiva. Audiotap non considera questo fatto e considera la prima semionda che trova, non importa se positiva o negativa.
Ho ottenuto un TAP funzionante:
*scaricando il WAV
*convertendolo con Audiotap usando le semionde e con sensitivity 35 (sennò non va, ci sono brusche variazioni di volume nel WAV)
*cancellando un byte dal TAP con un hex editor, in modo da sfasare tutti i byte successivi (ciascun byte rappresenta alternativamente una semionda positiva o negativa, così facendo si scambiano)
*ripulendolo usando un programma Python che mi sono scritto apposta, che riduce la varianza nelle lunghezze degli impulsi
Per rendere il procedimento più agevole bisogna:
*modificare Audiotap affinché inizi a riconoscere le semionde a partire dalla prima positiva (e magari introdurre l'opzione "inverted waveform" anche per le semionde, così, se l'opzione è attiva,Audiotap inizi a riconoscere le semionde a partire dalla prima negativa)
*introdurre un programma per ripulire i TAP v2 (o aggiungere il supporto a Tapclean)
-
Ho ottenuto un TAP funzionante:
Magari mandalo da qualche parte visto che il procedimento è complicato e ormai l'hai fatto... ;) oltre ovviamente a rendere automatizzabile la cosa, di cui io e i tanti appassionati di C16 non possiamo far altro che ringraziarti visto che non c'è (non c'era) modo di dumpare una cassetta per C16 con halfwaves col metodo audio.
Per rendere il procedimento più agevole bisogna:
*modificare Audiotap affinché inizi a riconoscere le semionde a partire dalla prima positiva (e magari introdurre l'opzione "inverted waveform" anche per le semionde, così, se l'opzione è attiva,Audiotap inizi a riconoscere le semionde a partire dalla prima negativa)
*introdurre un programma per ripulire i TAP v2 (o aggiungere il supporto a Tapclean)
Altri desiderata, riguardanti wav-prg:
- supporto ai loader algasoft non supportati (che sono almeno due e te li ho già mandati)
- supporto ai loader/turbo per C16 (te li posso mandare senza problemi)
la cosa chiaramente dovrebbe avere riflessi anche su audiotap e su tapclean
-
Sarebbe interessante, in attesa di nuove versioni di audiotap e ubercassette(l'autore si è accorto che la gestione C16 effettivamente non è corretta e se ne sta occupando), scrivere una piccola guida sul come ottenere un tape funzionante secondo il metodo di fab. Cambiare un byte con un hexeditor non è complicato, a patto di sapere quale cambiare(ho dato un'occhiata e i .tap iniziano con un header e il problema sta nel sapere quando comincia la semionda da sfasare), e soprattutto avere a disposizione anche il programma in Python.
-
Cambiare un byte con un hexeditor non è complicato, a patto di sapere quale cambiare(ho dato un'occhiata e i .tap iniziano con un header e il problema sta nel sapere quando comincia la semionda da sfasare), e soprattutto avere a disposizione anche il programma in Python.
Il file in un hex editor inizia all'incirca così
0000000 43 31 36 2d 54 41 50 45 2d 52 41 57 02 02 00 00 f6 01 22 00
0000020 00 2f 9e 03 00 ac 90 06 42 21 14 1c 1c 1c 1a 1c 1c 1c 1c 1c
I primi 20 byte sono header. Segue uno 00 seguito da 3 byte (2f, 9e e 03) e un altro 00 seguito da 3 byte (ac, 90 e 06). Questi sono pause. Rimuovi uno qualsiasi dei byte successivi.
avere a disposizione anche il programma in Python.
Eccolo. Gli argomenti sono <nome del file di ingresso> <nome del file di uscita> <offset del primo byte del primo blocco da ripulire> [<offset del primo byte del secondo blocco da ripulire>...]
#!/usr/bin/python3
import io
import sys
def statist(infile,outfile,starts):
inputs = io.open(infile,'rb')
outputs = io.open(outfile,'wb')
pulisci = False
stat = [{},{},{},{},{},{},{},{}]
beginstat = [{},{}]
for start in starts:
startn = int(start)
p =inputs.tell()
print("skip from "+str(p)+" to "+start)
if startn < p:
continue
bytesin = inputs.read(startn-p)
outputs.write(bytesin)
blocchi = 0
while blocchi < 4:
p =inputs.tell()
thisbyte=inputs.read(1)
if len(thisbyte)==0:
break
if not pulisci:
if thisbyte[0]>=0x40 and thisbyte[0]<0xc0:
pulisci = True
inizioblocco = p
print("iniz blocco "+str(blocchi)+" a "+hex(thisbyte[0])+" at "+str(p))
elif thisbyte[0]==0x00:
thisbyte=thisbyte+inputs.read(3)
else:
pass
#clean pilot
#thisbyte=bytes([0x1b])
if pulisci:
if ((p - inizioblocco) % 40) == 0:
if(thisbyte[0]<0x40):
print("fineblocco "+hex(thisbyte[0])+" at "+str(p))
pulisci = False
blocchi = blocchi + 1
thisbyte2=inputs.read(1)
#clean end of block
thisbyte=bytes([0x35,0x35])
if blocchi == 2:
bytesin = inputs.read(2700)
outputs.write(bytesin)
else:
thisbyte=thisbyte+inputs.read(1)
for i in range(2):
if not thisbyte[i] in beginstat[i]:
beginstat[i][thisbyte[i]]=0
beginstat[i][thisbyte[i]]=beginstat[i][thisbyte[i]]+1
toolittle=thisbyte[0]-0x5a
if toolittle<0:
#print("accorc "+hex(thisbyte[0])+" "+hex(thisbyte[1])+" at "+str(p))
thisbyte=bytes([0x5a,thisbyte[1]+toolittle])
#clean start of block
#thisbyte=bytes([0x6c,0x6c])
elif ((p - inizioblocco) % 40) == 1:
print("What?")
elif ((p - inizioblocco) % 40) == 2:
#clean right after start of block
pass
thisbyte=bytes([0x35])
elif ((p - inizioblocco) % 40) == 3:
#clean right after start of block
pass
thisbyte=bytes([0x35])
else:
thisbyte=thisbyte+inputs.read(3)
statbase = 0
resbytes=thisbyte
if (thisbyte[0]+thisbyte[1]<thisbyte[2]+thisbyte[3]):
if(thisbyte[0]>0x28):
resbytes=bytes([0x25])+resbytes[1:4]
if(thisbyte[2]<0x2f):
resbytes=resbytes[0:2]+bytes([0x2f])+resbytes[3:4]
#clean zero bit
#resbytes=bytes([0x17,0x17,0x35,0x35])
else:
statbase = 4
if(thisbyte[0]<0x2f):
resbytes=bytes([0x2f])+resbytes[1:4]
if(thisbyte[2]>0x28):
resbytes=resbytes[0:2]+bytes([0x25])+resbytes[3:4]
#clean one bit
#resbytes=bytes([0x35,0x35,0x17,0x17])
for i in range(4):
if not thisbyte[i] in stat[i+statbase]:
stat[i+statbase][thisbyte[i]]=0
stat[i+statbase][thisbyte[i]]=stat[i+statbase][thisbyte[i]]+1
thisbyte=resbytes
outputs.write(thisbyte)
bytesin=inputs.read()
outputs.write(bytesin)
statbase = 0
for i in stat:
print("stat for byte "+str(int(statbase/4))+" pos "+str(statbase%4))
statbase=statbase+1
for k in sorted(i.keys()):
print("byte "+hex(k)+" occurs "+str(i[k])+" times")
statbase = 0
for i in beginstat:
print("stat for begin "+str(statbase))
statbase=statbase+1
for k in sorted(i.keys()):
print("byte "+hex(k)+" occurs "+str(i[k])+" times")
if len(sys.argv)<3:
print("not enough args")
sys.exit
statist(sys.argv[1],sys.argv[2],sys.argv[3:])
-
Versione migliorata, che prova a riconoscere automaticamente dove iniziano i blocchi, così non bisogna passargli gli offset manualmente. Gli argomenti sono soltanto il file .tap che si vuole ripulire e quello dove salvare i dati ripuliti
#!/usr/bin/python3
import io
import sys
def statist(infile,outfile):
inputs = io.open(infile,'rb')
outputs = io.open(outfile,'wb')
pulisci = False
stat = [{},{},{},{},{},{},{},{}]
beginstat = [{},{}]
lunghpilot = 0
blocchi = 0
while 1:
p =inputs.tell()
thisbyte=inputs.read(1)
if len(thisbyte)==0:
break
if not pulisci:
if thisbyte[0]>=0x0f and thisbyte[0]<0x20:
lunghpilot = lunghpilot + 1
#clean pilot
#thisbyte=bytes([0x1b])
elif thisbyte[0]>=0x40 and thisbyte[0]<0xc0 and lunghpilot > 450:
pulisci = True
inizioblocco = p
print("iniz blocco "+str(blocchi)+" a "+hex(thisbyte[0])+" at "+str(p))
elif thisbyte[0]==0x00:
lunghpilot = 0
thisbyte=thisbyte+inputs.read(3)
else:
lunghpilot = 0
if pulisci:
if ((p - inizioblocco) % 40) == 0:
if(thisbyte[0]<0x40):
print("fineblocco "+hex(thisbyte[0])+" at "+str(p))
lunghpilot = 0
pulisci = False
blocchi = blocchi + 1
thisbyte2=inputs.read(1)
#clean end of block
thisbyte=bytes([0x35,0x35])
else:
thisbyte=thisbyte+inputs.read(1)
for i in range(2):
if not thisbyte[i] in beginstat[i]:
beginstat[i][thisbyte[i]]=0
beginstat[i][thisbyte[i]]=beginstat[i][thisbyte[i]]+1
toolittle=thisbyte[0]-0x5a
if toolittle<0:
#print("accorc "+hex(thisbyte[0])+" "+hex(thisbyte[1])+" at "+str(p))
thisbyte=bytes([0x5a,thisbyte[1]+toolittle])
#clean start of block
#thisbyte=bytes([0x6c,0x6c])
elif ((p - inizioblocco) % 40) == 1:
print("What?")
elif ((p - inizioblocco) % 40) == 2:
#clean right after start of block
pass
thisbyte=bytes([0x35])
elif ((p - inizioblocco) % 40) == 3:
#clean right after start of block
pass
thisbyte=bytes([0x35])
else:
thisbyte=thisbyte+inputs.read(3)
statbase = 0
resbytes=thisbyte
if (thisbyte[0]+thisbyte[1]<thisbyte[2]+thisbyte[3]):
if(thisbyte[0]>0x28):
resbytes=bytes([0x25])+resbytes[1:4]
if(thisbyte[2]<0x2f):
resbytes=resbytes[0:2]+bytes([0x2f])+resbytes[3:4]
#clean zero bit
#resbytes=bytes([0x17,0x17,0x35,0x35])
else:
statbase = 4
if(thisbyte[0]<0x2f):
resbytes=bytes([0x2f])+resbytes[1:4]
if(thisbyte[2]>0x28):
resbytes=resbytes[0:2]+bytes([0x25])+resbytes[3:4]
#clean one bit
#resbytes=bytes([0x35,0x35,0x17,0x17])
for i in range(4):
if not thisbyte[i] in stat[i+statbase]:
stat[i+statbase][thisbyte[i]]=0
stat[i+statbase][thisbyte[i]]=stat[i+statbase][thisbyte[i]]+1
thisbyte=resbytes
outputs.write(thisbyte)
bytesin=inputs.read()
outputs.write(bytesin)
statbase = 0
for i in stat:
print("stat for byte "+str(int(statbase/4))+" pos "+str(statbase%4))
statbase=statbase+1
for k in sorted(i.keys()):
print("byte "+hex(k)+" occurs "+str(i[k])+" times")
statbase = 0
for i in beginstat:
print("stat for begin "+str(statbase))
statbase=statbase+1
for k in sorted(i.keys()):
print("byte "+hex(k)+" occurs "+str(i[k])+" times")
if len(sys.argv)<3:
print("not enough args")
sys.exit
statist(sys.argv[1],sys.argv[2])
-
Ho eseguito tutto alla lettera ma non mi riesce di ottenere un tap funzionante con quel wav postato precedentemente.
Riassumento:
-creo il tap dal wav(provato sia a 8 che a 16bit)con Audiotap(C16 halfwave e sensitivity a 35, il resto di default).
-elimino dal tap il byte indicato(che sarebbe il 29mo, ma ho provato anche con quelli successivi).
-eseguo il programma di pulizia in Python(che pare funzionare perfettamente).
-caricando il tap ripulito col Vice o Yape non viene segnalato alcun "found" per tutta la durata del tape.
-
Hai un messaggio privato
-
*introdurre un programma per ripulire i TAP v2 (o aggiungere il supporto a Tapclean)
Stavo pensando proprio al supporto in TAPClean poco dopo aver aggiunto il supporto per semionde in DC2N e dc2nconv.
Ovviamente un tool scritto in un linguaggio object oriented semplificherebbe di gran lunga l'implementazione. Chissa' se Sp33d e SLC hanno approcciato il problema nei loro tools in Java e C#.
-
Febrizio ha fatto un lavoro eccezionale in questi giorni. Massi cadenti ora potrà finalmente giocare a Smurf(anche se sicuramente non è quello che crede ;) )...
-
Febrizio ha fatto un lavoro eccezionale in questi giorni. Massi cadenti ora potrà finalmente giocare a Smurf(anche se sicuramente non è quello che crede ;) )...
Essendo totalmente estraneo al python e non avendo quindi modo di capirci qualcosa (se avete un binario per Windows potrei fare da betatester), aspetto che bubusan metta il lato C16 sul sito (sperando che gliel'hai mandato), anche se da quanto dici sembrerebbe che "Smurf" non ha a che fare con gli ometti blu. In realtà non sono mai stato molto convinto che esista davvero un qualche gioco dei Puffi per il C16 (è un po' come la preview di Legendary Wings per C64, o Pac-Land per C16, o la conversione di Kick'n'Run per MSX: cose che in pochi giurano di aver visto ma che nessuno sembra avere) quindi non m'aspetto granché ammesso esistesse. Me l'aspettavo a 9 anni quando comprai quella cassetta che non funzionava (non è che non funzionava il gioco dei Puffi, non funzionava nessun gioco) e che infatti uscì solo un numero (ricordo solo che la copertina era scritte nere su foglio rosa, e che la cassetta era stata tutta arancione una volta e tutta nera l'altra volta, ovviamente senza scritte sopra).
Comunque sono molto contento che da questo thread stia venendo fuori un lavoro non indifferente riguardante il C16. Luigi sa quanto ci ho tenuto al supporto delle halfwaves sul DC2N (che era per me una "condicio sine qua non" per comprarglielo) e posso sicuramente dire che ha fatto davvero un ottimo lavoro (e non avevo dubbi). L'unico difetto del DC2N, se così si può dire, è stata l'attesa per averlo ma posso garantire davvero che è tutt'altra cosa rispetto MTAP e metodi poco ortodossi come quelli audio, pur funzionanti, ma ben poco comodi soprattutto se si hanno 500 cassette da dumpare. :D
-
Tra l'altro questo loader è uno dei più facili da fregare per l'autorun: come altri, basta tenere premuto (cominciate a farlo dalle righe colorate, non prima) il tasto run/stop (esc sulla tastiera del pc) per ritrovarsi alla fine con un BREAK READY.
In altri loader, come quelle "simil turbo tape di Senz" (comando :@L) viene messo un RUN nel buffer di tastiera ed in quel caso basta modificarlo in RVN per far apparire un bel syntax error e trovarsi con il programma pronto ad essere salvato. Se usate un Plus4 non ci sono problemi, se state emulando un C16 puro, se salvando su disco con DSAVE"NOME" vi dà out of memory potete comunque salvare da monitor conoscendo i puntatori. :)
Ovviamente, una volta poi che avete il PRG, potete pure crearci un T64 con Star Commander per avere anche (mai "solo", ma "anche") una versione a caricamento immediato.
-
Intanto metto in condivisione bytegames n6 ma c'è ancora qualcosa da sistemare perchè dopo il primo tentativo di ieri notte non sono piu' riuscito a far funzionare i giochi dopo "The Smurf"(scacchi si sapeva che non andava ma gli altri si). Non vorrei aver scambiato le versioni ripulite e ora non ricordo se avevo usato il nuovo script sul tap originale(con byte modificato) o da quello già precedentemente ripulito. Poi riprovo con calma.
http://www.megaupload.com/?d=WX45SL7T
-
Ho risolto esportando e convertendo i singoli giochi. Ora funzionano tutti(compreso scacchi).
L'ho rimesso in download:
http://www.megaupload.com/?d=SJTI7FZO
-
E' errato il nome dell'archivio :P
Poi perché li hai divisi? >:( VICE non fa il parse?
E poi: li hai divisi tu dividendo l'audio? STAP non funziona coi TAP per C16.
Questo The Smurf comunque altro non è che Blagger della Alligata e ovviamente non ha nulla a che fare coi puffi: non è nemmeno blu!
Grazie per aver dato un altro pezzo all'immortalità del C16 :)
-
Si mi sono accorto, nella fretta ho scritto n16, ma tanto devo ancora finire con le immagini e inviarlo a Bubusan. Li ho divisi perchè c'era un problema con i giochi a partire da scacchi(è una question del byte da eliminare o meno all'inizio di ogni caricamento). Prendendoli e modificandoli singolarmente ho risolto, in attesa di un audiotap aggiornato. Li ho divisi a mano a partire dal wav, stap non va col C16.
Per i Puffi cmq sul C64 non eravamo messi meglio(un clone triste dell'ottima versione Colecovision), meglio Blagger ma peccato per il sogno di gioventù infranto ;)
-
Ma tanto non è detto che sia quello quello che avrei dovuto vedere io ;)
La cassetta arancione (o nera) con la copertina rosa che non funzionava aveva il gioco che si chiamava proprio "I Puffi" ed era una roba tipo le Algasoft (insomma diffusa solo qui) solo che faceva schifo e non funzionava, insomma chi li fece non era un pirata era un puro e semplice truffatore. Quasi sicuramente non esiste nulla del genere, però quello 0,1% di possibilità che siano capitate cassette difettose ed esista davvero un gioco dei Puffi per C16 (se c'è è amatoriale, certamente non con licenza ufficiale come lo era quello per Colecovision).
D'altronde, pochi sanno che per Amiga esiste un gioco in cui devi far fuori i Puffi chiamato Smurf Hunting, anche quello ovviamente amatoriale (poco meno di Excalation, che se non fosse per me, nessuno avrebbe mai visto fuori da chi frequentava a Napoli "La Camera Oscura").
-
Tra l'altro questo loader è uno dei più facili da fregare per l'autorun...
Vi e' possibile fare una lista completa dei caricatori conosciuti per C16 con tutti i titoli che usano ciascuno di essi ed alcuni esempi di TAP files al fine di supportarli in tapclean, per favore?
So che Massi cadenti mi ha gia' fatto delle segnalazioni e mandato dei file, ma intendo mettere i pezzi del puzzle a posto dopo aver avuto una visione d'insieme. Niente PM o email con enormi allegati, per favore.
-
Ok nella giornata di domani (oggi) preparo un archivio e lo metto su megaupload con i vari esempi, mettendo qui sul forum la spiegazione di cosa contiene.
-
Ecco qua:
http://www.megaupload.com/?d=GXNTVT68
Attenzione al txt allegato.
-
Copio anche qui il txt allegato.
VARI TURBO PER C16
a cura di Massi cadenti <massi punto cadenti chiocciola gmail punto com>
Archivio, dump e documenti sono rilasciati sotto licenza Creative Commons 3.0-by-nc-sa (Attribuzione, Non uso commerciale, Condividi allo stesso modo).
1 - Turbo con cornice che cambia colore
=======================================
Così com'è necessita delle halfwaves.
A detta di Fabrizio Gennari, è possibile modificarlo in modo che non le necessiti.
E' utilizzato nelle varie cassette *Games (Byte Games ecc.) delle edizioni Computer/Fermont nonché in "Special Vic20/C16" delle edizioni Pubblirome/Edigamma.
La particolarità di questo turbo è l'utilizzo di tutti i 121 colori del C16, per gruppi di 16, nella cornice: in pratica la cornice utilizza uno per volta i 16 colori base e le 16 luminosità contemporaneamente (quando passa il nero è ovviamente tutta nera).
Vedete che ci sono due versioni di Byte Games 5. Una (quella dumpata con MTAP) è stata la prima versione dumpata e rilasciata (e presente su EdicolaC64), l'altra (dumpata con il DC2N) è stata dumpata in seguito. La differenza tra le due è che quella dumpata con MTAP non passa il parse del VICE, pur funzionando correttamente. Vale a dire che in VICE 2.3 (attenzione non nelle versioni precedenti che non hanno nessun parse per il C16), caricando la versione dumpata con DC2N è possibile vedere l'elenco dei programmi, mentre caricando la versione dumpata con MTAP non è possibile. Questo può essere utile anche per cercare di capire le differenze tra le due versioni e come mai una genera questo problema e l'altra no, e magari includere in TapClean o simile qualcosa che permetta di sistemare il problema.
Nella versione usata in Special Vic20/C16, in alcuni giochi (non tutti) è possibile inibire l'autostart dei giochi tenendo premuto il tasto RUN/STOP (tasto ESC della tastiera del PC in VICE, tasto TAB della tastiera del PC in YAPE). Questo non è possibile nella versione usata in Byte Games. Probabilmente dipende dal fatto se i giochi hanno una linea BASIC o se vengono lanciati dal turbo direttamente con la sys. Un esempio di gioco che si può fermare è il primo, "IL LEGIONARIO". Se usate una macchina con più di 16K è possibile anche listare la sys di partenza.
Il loader del turbo parte in automatico anche se caricato dal monitor del C16, quindi per esaminarlo dovremo per forza usare il monitor interno al VICE.
I puntatori sono sballati (stando al buffer di cassetta il loader occuperebbe solo tre byte da $0324 a $0326, il che è impossibile).
Le mie conoscenze finiscono qua. Comunque Fabrizio Gennari sicuramente ne ha capito molto più di me.
Sarebbe bello sapere in realtà dove viene caricato il loader in modo da disassemblarlo.
2 - Turbo con tutto schermo che cambia colore
=============================================
Sembra derivato direttamente dal precedente.
E' utilizzato in Frank Bruno's Boxing (sulla cassetta ci sono due giochi, Frank Bruno's Boxing è quello che si chiama ELITE, quindi NON IL PRIMO).
Ha le stesse caratteristiche (compresi i puntatori sfalsati che darebbero il caricamento da $0324 a $0326), tranne per il fatto che lo schermo è oscurato e segue i colori del bordo.
E' presa da una cassetta originale della Elite, quindi è possibile che sia stato creato dalla Elite stessa.
3 - Turbo con modalità Fast e audio accelerato
==============================================
Non necessita delle halfwaves.
Spiegazione lunga e complessa, già scritta e distribuita in passato.
Vedi file .url allegato in quella cartella, o visita direttamente
https://groups.google.com/group/it.comp.software.emulatori/msg/85f78f5bdfed4e9f
4 - Turbo Jackson
=================
Non c'è poi molto da dire. Anche questo ovviamente necessita delle halfwaves.
Classiche righe colorate a tutto schermo. Simile in questo al turbo202 per C64.
Il loader, chiamato sempre "{clrhome}{flashon}PREMI TASTO C=" è sempre lo stesso e va da $1001 a $119C e contiene la riga BASIC
10 SYS4462
(dove 4462 dec. è $116E).
E' sempre possibile arrestare l'autorun tenendo premuto run/stop (dopo il found del programma in turbo). Il programma si fermerà con un BREAK IN 10 (linea appartenente al loader e non del programma appena caricato).
La parte in L/M disassemblata è la seguente (se qualcuno ha voglia di commentarla è il benvenuto):
. 100d 20 af 06 jsr $06af
. 1010 c9 00 cmp #$00
. 1012 f0 f9 beq $100d
. 1014 85 d1 sta $d1
. 1016 20 dd 06 jsr $06dd
. 1019 91 b6 sta ($b6),y
. 101b c8 iny
. 101c c0 c0 cpy #$c0
. 101e d0 f6 bne $1016
. 1020 f0 2d beq $104f
. 1022 20 af 06 jsr $06af
. 1025 20 dd 06 jsr $06dd
. 1028 c4 93 cpy $93
. 102a d0 02 bne $102e
. 102c 91 b4 sta ($b4),y
. 102e d1 b4 cmp ($b4),y
. 1030 f0 02 beq $1034
. 1032 86 90 stx $90
. 1034 45 d7 eor $d7
. 1036 85 d7 sta $d7
. 1038 e6 b4 inc $b4
. 103a d0 02 bne $103e
. 103c e6 b5 inc $b5
. 103e a5 b4 lda $b4
. 1040 c5 9d cmp $9d
. 1042 a5 b5 lda $b5
. 1044 e5 9e sbc $9e
. 1046 90 dd bcc $1025
. 1048 20 dd 06 jsr $06dd
. 104b 20 42 07 jsr $0742
. 104e 88 dey
. 104f 8c fc 07 sty $07fc
. 1052 58 cli
. 1053 18 clc
. 1054 c8 iny
. 1055 c8 iny
. 1056 4c c8 e8 jmp $e8c8
. 1059 ea nop
. 105a ea nop
. 105b 20 1b e3 jsr $e31b
. 105e 20 42 07 jsr $0742
. 1061 84 d7 sty $d7
. 1063 a9 07 lda #$07
. 1065 8d 04 ff sta $ff04
. 1068 a2 01 ldx #$01
. 106a 20 f0 06 jsr $06f0
. 106d 26 d0 rol $d0
. 106f a5 d0 lda $d0
. 1071 c9 02 cmp #$02
. 1073 d0 f5 bne $106a
. 1075 a0 09 ldy #$09
. 1077 20 dd 06 jsr $06dd
. 107a c9 02 cmp #$02
. 107c f0 f9 beq $1077
. 107e c4 d0 cpy $d0
. 1080 d0 e8 bne $106a
. 1082 20 dd 06 jsr $06dd
. 1085 88 dey
. 1086 d0 f6 bne $107e
. 1088 60 rts
. 1089 a9 08 lda #$08
. 108b 85 d2 sta $d2
. 108d 20 f0 06 jsr $06f0
. 1090 26 d0 rol $d0
. 1092 ea nop
. 1093 ea nop
. 1094 ea nop
. 1095 c6 d2 dec $d2
. 1097 d0 f4 bne $108d
. 1099 a5 d0 lda $d0
. 109b 60 rts
. 109c a9 10 lda #$10
. 109e 24 01 bit $01
. 10a0 d0 fc bne $109e
. 10a2 24 01 bit $01
. 10a4 f0 fc beq $10a2
. 10a6 ad 09 ff lda $ff09
. 10a9 48 pha
. 10aa a9 07 lda #$07
. 10ac 8d 04 ff sta $ff04
. 10af 8e 05 ff stx $ff05
. 10b2 a9 40 lda #$40
. 10b4 8d 09 ff sta $ff09
. 10b7 ad 19 ff lda $ff19
. 10ba 69 33 adc #$33
. 10bc 8d 19 ff sta $ff19
. 10bf 68 pla
. 10c0 0a asl
. 10c1 0a asl
. 10c2 60 rts
. 10c3 00 brk
. 10c4 20 57 07 jsr $0757
. 10c7 4c 37 07 jmp $0737
. 10ca ad 13 ff lda $ff13
. 10cd 09 02 ora #$02
. 10cf 8d 13 ff sta $ff13
. 10d2 20 c3 e3 jsr $e3c3
. 10d5 4c 18 07 jmp $0718
. 10d8 ad 13 ff lda $ff13
. 10db 09 02 ora #$02
. 10dd 8d 13 ff sta $ff13
. 10e0 4c 18 07 jmp $0718
. 10e3 ad 13 ff lda $ff13
. 10e6 29 fd and #$fd
. 10e8 8d 13 ff sta $ff13
. 10eb 4c b7 07 jmp $07b7
. 10ee a0 00 ldy #$00
. 10f0 8c fc 07 sty $07fc
. 10f3 ad 06 ff lda $ff06
. 10f6 29 ef and #$ef
. 10f8 8d 06 ff sta $ff06
. 10fb ca dex
. 10fc d0 fd bne $10fb
. 10fe 88 dey
. 10ff d0 fa bne $10fb
. 1101 78 sei
. 1102 60 rts
. 1103 a2 00 ldx #$00
. 1105 a0 01 ldy #$01
. 1107 a9 10 lda #$10
. 1109 86 0a stx $0a
. 110b 86 93 stx $93
. 110d 84 b4 sty $b4
. 110f 85 b5 sta $b5
. 1111 20 6b a8 jsr $a86b
. 1114 20 71 07 jsr $0771
. 1117 20 0a a8 jsr $a80a
. 111a 4c b7 07 jmp $07b7
. 111d 20 61 06 jsr $0661
. 1120 a5 d1 lda $d1
. 1122 c9 02 cmp #$02
. 1124 f0 06 beq $112c
. 1126 c9 01 cmp #$01
. 1128 d0 f3 bne $111d
. 112a a9 01 lda #$01
. 112c 20 e8 e9 jsr $e9e8
. 112f 20 c0 8c jsr $8cc0
. 1132 a0 00 ldy #$00
. 1134 84 90 sty $90
. 1136 20 89 f1 jsr $f189
. 1139 ad 35 03 lda $0335
. 113c 38 sec
. 113d ed 33 03 sbc $0333
. 1140 08 php
. 1141 18 clc
. 1142 65 b4 adc $b4
. 1144 85 9d sta $9d
. 1146 ad 36 03 lda $0336
. 1149 65 b5 adc $b5
. 114b 28 plp
. 114c ed 34 03 sbc $0334
. 114f 85 9e sta $9e
. 1151 20 76 06 jsr $0676
. 1154 a5 d0 lda $d0
. 1156 45 d7 eor $d7
. 1158 05 90 ora $90
. 115a f0 04 beq $1160
. 115c a9 ff lda #$ff
. 115e 85 90 sta $90
. 1160 4c eb f0 jmp $f0eb
. 1163 a5 9d lda $9d
. 1165 85 2d sta $2d
. 1167 a5 9e lda $9e
. 1169 85 2e sta $2e
. 116b 4c dc 8b jmp $8bdc
. 116e a9 06 lda #$06
. 1170 85 e6 sta $e6
. 1172 a9 61 lda #$61
. 1174 85 e5 sta $e5
. 1176 a9 10 lda #$10
. 1178 85 e8 sta $e8
. 117a a9 0d lda #$0d
. 117c 85 e7 sta $e7
. 117e a0 00 ldy #$00
. 1180 b1 e7 lda ($e7),y
. 1182 91 e5 sta ($e5),y
. 1184 c8 iny
. 1185 c0 70 cpy #$70
. 1187 f0 0a beq $1193
. 1189 c0 00 cpy #$00
. 118b d0 f3 bne $1180
. 118d e6 e6 inc $e6
. 118f e6 e8 inc $e8
. 1191 d0 eb bne $117e
. 1193 a5 e6 lda $e6
. 1195 c9 07 cmp #$07
. 1197 d0 e7 bne $1180
. 1199 4c 1e 07 jmp $071e
. 119c 00 brk
5 - Turbo simile Turbo Tape
===========================
Questo è curiosamente un clone del turbo tape 64 di Stephen Senz, o forse proprio un port ufficiale. Potete vedere il turbo vero e proprio nel T64 "Turbo Tape C16.t64".
Chiaramente (?) necessita delle halfwaves.
La sintassi è :@L (load), :@S (save) e :@V (verify)
Le versioni presenti in Computer Set e in Input sono leggermente modificate.
Partiamo dalla versione presente in Computer Set (ed.Publiflash/Logica 2000).
Esaminiamo il loader di STRIKE EAGLE.
Va da 4097 ($1001) a 4677 ($1245).
Linea BASIC
100 SYS4112
(4112 = $1010)
Disassemblato:
. 1010 20 17 81 jsr $8117
. 1013 20 2e 80 jsr $802e
. 1016 20 c2 80 jsr $80c2
. 1019 20 f4 fc jsr $fcf4
. 101c a2 fb ldx #$fb
. 101e 9a txs
. 101f 20 50 10 jsr $1050
. 1022 a2 0a ldx #$0a <--- metti 10 ($0a) caratteri...
. 1024 86 ef stx $ef <--- ... nel buffer di tastiera
. 1026 bd 60 10 lda $1060,x<--- prendili da $1060 in poi...
. 1029 9d 27 05 sta $0527,x<--- ... e mettili da $0527 in poi
. 102c ca dex
. 102d 10 f7 bpl $1026
. 102f a2 00 ldx #$00
. 1031 bd 7c 10 lda $107c,x
. 1034 9d 7c 05 sta $057c,x
. 1037 bd 45 11 lda $1145,x
. 103a 9d 45 06 sta $0645,x
. 103d e8 inx
. 103e d0 f1 bne $1031
. 1040 4c 16 80 jmp $8016
. 1043 00 brk
. 1044 00 brk
. 1045 00 brk
. 1046 00 brk
. 1047 00 brk
. 1048 00 brk
. 1049 00 brk
. 104a 00 brk
. 104b 00 brk
. 104c 00 brk
. 104d 00 brk
. 104e 00 brk
. 104f 00 brk
. 1050 a9 10 lda #$10
. 1052 8d 08 03 sta $0308
. 1055 a9 07 lda #$07
. 1057 8d 09 03 sta $0309
. 105a 60 rts
. 105b 00 brk
. 105c 00 brk
. 105d 00 brk
. 105e 00 brk
. 105f 00 brk
. 1060 3a ??? <--- carattere :
. 1061 40 rti <--- carattere @
. 1062 4c 22 22 jmp $2222 <--- caratteri L""
. 1065 2c 31 2c bit $2c31 <--- caratteri ,1,
. 1068 31 0d and ($0d),y<--- caratteri 1 e return
. 106a 00 brk
. 106b 00 brk
. 106c 00 brk
. 106d 00 brk
. 106e 00 brk
. 106f 00 brk
. 1070 00 brk
. 1071 00 brk
. 1072 00 brk
. 1073 00 brk
. 1074 00 brk
. 1075 00 brk
. 1076 00 brk
. 1077 00 brk
. 1078 00 brk
. 1079 00 brk
. 107a 00 brk
. 107b 00 brk
. 107c a0 00 ldy #$00
. 107e 8c fc 07 sty $07fc
. 1081 ad 06 ff lda $ff06
. 1084 29 ef and #$ef
. 1086 8d 06 ff sta $ff06
. 1089 ca dex
. 108a d0 fd bne $1089
. 108c 88 dey
. 108d d0 fa bne $1089
. 108f 78 sei
. 1090 60 rts
. 1091 a0 00 ldy #$00
. 1093 a9 02 lda #$02
. 1095 20 b1 05 jsr $05b1
. 1098 a2 07 ldx #$07
. 109a 88 dey
. 109b c0 09 cpy #$09
. 109d d0 f4 bne $1093
. 109f a2 05 ldx #$05
. 10a1 c6 d1 dec $d1
. 10a3 d0 ee bne $1093
. 10a5 98 tya
. 10a6 20 b1 05 jsr $05b1
. 10a9 a2 07 ldx #$07
. 10ab 88 dey
. 10ac d0 f7 bne $10a5
. 10ae ca dex
. 10af ca dex
. 10b0 60 rts
. 10b1 85 d0 sta $d0
. 10b3 45 d7 eor $d7
. 10b5 85 d7 sta $d7
. 10b7 a9 08 lda #$08
. 10b9 85 d2 sta $d2
. 10bb 06 d0 asl $d0
. 10bd a5 01 lda $01
. 10bf 29 fd and #$fd
. 10c1 20 d3 05 jsr $05d3
. 10c4 a2 11 ldx #$11
. 10c6 ea nop
. 10c7 09 02 ora #$02
. 10c9 20 d3 05 jsr $05d3
. 10cc a2 0e ldx #$0e
. 10ce c6 d2 dec $d2
. 10d0 d0 e9 bne $10bb
. 10d2 60 rts
. 10d3 ca dex
. 10d4 d0 fd bne $10d3
. 10d6 90 05 bcc $10dd
. 10d8 a2 0b ldx #$0b
. 10da ca dex
. 10db d0 fd bne $10da
. 10dd 85 01 sta $01
. 10df 60 rts
. 10e0 a2 00 ldx #$00
. 10e2 2c a2 01 bit $01a2
. 10e5 a4 2b ldy $2b
. 10e7 a5 2c lda $2c
. 10e9 86 0a stx $0a
. 10eb 86 93 stx $93
. 10ed 84 b4 sty $b4
. 10ef 85 b5 sta $b5
. 10f1 20 6b a8 jsr $a86b
. 10f4 20 fd 05 jsr $05fd
. 10f7 20 0a a8 jsr $a80a
. 10fa 4c 03 87 jmp $8703
. 10fd 20 61 06 jsr $0661
. 1100 a5 d1 lda $d1
. 1102 c9 02 cmp #$02
. 1104 f0 08 beq $110e
. 1106 c9 01 cmp #$01
. 1108 d0 f3 bne $10fd
. 110a a5 ad lda $ad
. 110c f0 0a beq $1118
. 110e ad 33 03 lda $0333
. 1111 85 b4 sta $b4
. 1113 ad 34 03 lda $0334
. 1116 85 b5 sta $b5
. 1118 20 e8 e9 jsr $e9e8
. 111b ea nop
. 111c ea nop
. 111d ea nop
. 111e ea nop
. 111f ea nop
. 1120 20 c0 8c jsr $8cc0
. 1123 a4 ab ldy $ab
. 1125 f0 0b beq $1132
. 1127 88 dey
. 1128 b1 af lda ($af),y
. 112a d9 38 03 cmp $0338,y
. 112d d0 ce bne $10fd
. 112f 98 tya
. 1130 d0 f5 bne $1127
. 1132 84 90 sty $90
. 1134 20 89 f1 jsr $f189
. 1137 ad 35 03 lda $0335
. 113a 38 sec
. 113b ed 33 03 sbc $0333
. 113e 08 php
. 113f 18 clc
. 1140 65 b4 adc $b4
. 1142 85 9d sta $9d
. 1144 ad 36 03 lda $0336
. 1147 65 b5 adc $b5
. 1149 28 plp
. 114a ed 34 03 sbc $0334
. 114d 85 9e sta $9e
. 114f 20 76 06 jsr $0676
. 1152 a5 d0 lda $d0
. 1154 45 d7 eor $d7
. 1156 05 90 ora $90
. 1158 f0 04 beq $115e
. 115a a9 ff lda #$ff
. 115c 85 90 sta $90
. 115e 4c eb f0 jmp $f0eb
. 1161 20 af 06 jsr $06af
. 1164 c9 00 cmp #$00
. 1166 f0 f9 beq $1161
. 1168 85 d1 sta $d1
. 116a 20 dd 06 jsr $06dd
. 116d 91 b6 sta ($b6),y
. 116f c8 iny
. 1170 c0 c0 cpy #$c0
. 1172 d0 f6 bne $116a
. 1174 f0 2d beq $11a3
. 1176 20 af 06 jsr $06af
. 1179 20 dd 06 jsr $06dd
. 117c c4 93 cpy $93
. 117e d0 02 bne $1182
. 1180 91 b4 sta ($b4),y
. 1182 d1 b4 cmp ($b4),y
. 1184 f0 02 beq $1188
. 1186 86 90 stx $90
. 1188 45 d7 eor $d7
. 118a 85 d7 sta $d7
. 118c e6 b4 inc $b4
. 118e d0 02 bne $1192
. 1190 e6 b5 inc $b5
. 1192 a5 b4 lda $b4
. 1194 c5 9d cmp $9d
. 1196 a5 b5 lda $b5
. 1198 e5 9e sbc $9e
. 119a 90 dd bcc $1179
. 119c 20 dd 06 jsr $06dd
. 119f 20 7c 05 jsr $057c
. 11a2 88 dey
. 11a3 8c fc 07 sty $07fc
. 11a6 58 cli
. 11a7 18 clc
. 11a8 c8 iny
. 11a9 c8 iny
. 11aa 4c c8 e8 jmp $e8c8
. 11ad ea nop
. 11ae ea nop
. 11af 20 1b e3 jsr $e31b
. 11b2 20 7c 05 jsr $057c
. 11b5 84 d7 sty $d7
. 11b7 a9 07 lda #$07
. 11b9 8d 04 ff sta $ff04
. 11bc a2 01 ldx #$01
. 11be 20 f0 06 jsr $06f0
. 11c1 26 d0 rol $d0
. 11c3 a5 d0 lda $d0
. 11c5 c9 02 cmp #$02
. 11c7 d0 f5 bne $11be
. 11c9 a0 09 ldy #$09
. 11cb 20 dd 06 jsr $06dd
. 11ce c9 02 cmp #$02
. 11d0 f0 f9 beq $11cb
. 11d2 c4 d0 cpy $d0
. 11d4 d0 e8 bne $11be
. 11d6 20 dd 06 jsr $06dd
. 11d9 88 dey
. 11da d0 f6 bne $11d2
. 11dc 60 rts
. 11dd a9 08 lda #$08
. 11df 85 d2 sta $d2
. 11e1 20 f0 06 jsr $06f0
. 11e4 26 d0 rol $d0
. 11e6 ea nop
. 11e7 ea nop
. 11e8 ea nop
. 11e9 c6 d2 dec $d2
. 11eb d0 f4 bne $11e1
. 11ed a5 d0 lda $d0
. 11ef 60 rts
. 11f0 a9 10 lda #$10
. 11f2 24 01 bit $01
. 11f4 d0 fc bne $11f2
. 11f6 24 01 bit $01
. 11f8 f0 fc beq $11f6
. 11fa ad 09 ff lda $ff09
. 11fd 48 pha
. 11fe a9 07 lda #$07
. 1200 8d 04 ff sta $ff04
. 1203 8e 05 ff stx $ff05
. 1206 a9 40 lda #$40
. 1208 8d 09 ff sta $ff09
. 120b 68 pla
. 120c 0a asl
. 120d 0a asl
. 120e 60 rts
. 120f 00 brk
. 1210 20 73 04 jsr $0473
. 1213 f0 04 beq $1219
. 1215 c9 40 cmp #$40
. 1217 f0 03 beq $121c
. 1219 4c d9 8b jmp $8bd9
. 121c ad 13 ff lda $ff13
. 121f 09 02 ora #$02
. 1221 8d 13 ff sta $ff13
. 1224 20 c3 e3 jsr $e3c3
. 1227 20 73 04 jsr $0473
. 122a c9 4c cmp #$4c
. 122c f0 03 beq $1231
. 122e 4c a1 94 jmp $94a1
. 1231 20 73 04 jsr $0473
. 1234 20 17 81 jsr $8117
. 1237 a9 e5 lda #$e5 <--- metti byte basso del programma... ($e5 in questo caso)
. 1239 8d 02 03 sta $0302 <--- ... in $0302 (dec.770)
. 123c a9 20 lda #$20 <--- metti byte alto del programma... ($20 in questo caso)
. 123e 8d 03 03 sta $0303 <--- ... in $0303 (dec.771)
. 1241 20 e0 05 jsr $05e0
. 1244 00 brk
La parte che ci interessa è da $1237 in poi, perché lì sono contenuti i byte basso ed alto del programma da lanciare.
Gli altri loader sono simili tranne per questa parte.
Se però il programma da lanciare è in BASIC (es. Music Master sulla stessa cassetta)
. 1022 a2 07 ldx #$07
...
. 1062 4c 0d 52 jmp $520d
. 1065 75 0d adc $0d,x
... e soprattutto
. 1234 a5 2e lda $2e
. 1236 c9 11 cmp #$11
. 1238 90 03 bcc $123d
. 123a 20 17 81 jsr $8117
. 123d 20 e0 05 jsr $05e0
quindi come si vede i puntatori mancano completamente.
Passiamo ora alla versione presente in Input.
La versione presente in Input (ed.Pubblirome/Edigamma) è diversa: c'è un programma BASIC di 3 righe che crea una finestra video e creerà anche problemi al gioco "IL BARO" (scritto in BASIC) che si avvierà nella suddetta finestra.
L'intero loader va da $1001 a $1410 (dec.4097-5136).
1 COLOR0,1:COLOR4,1:PRINT"{clrhome}{black}
230 PRINT"{clrhome}{20down}"chr$(27)"T{white}"
240 CLR:SYS4312
La prima riga mette neri bordo e sfondo e ripulisce il video.
La seconda si occupa di creare la finestra nelle ultime quattro righe.
La terza fa partire la routine in L/M.
Il loader in L/M è il seguente (uguale sempre, per tutti e 5 i giochi):
d 1048
. 1048 41 80 eor ($80,x)
. 104a 01 fd ora ($fd,x)
. 104c fc ???
. 104d 00 brk
. 104e 00 brk
. 104f 13 ???
. 1050 dc ???
. 1051 00 brk
. 1052 a1 41 lda ($41,x)
. 1054 24 3a bit $3a
. 1056 8b ???
. 1057 41 24 eor ($24,x)
. 1059 b2 ???
. 105a 41 80 eor ($80,x)
. 105c 01 fd ora ($fd,x)
. 105e fc ???
. 105f 00 brk
. 1060 00 brk
. 1061 13 ???
. 1062 dc ???
. 1063 00 brk
. 1064 a1 41 lda ($41,x)
. 1066 24 3a bit $3a
. 1068 8b ???
. 1069 41 24 eor ($24,x)
. 106b b2 ???
. 106c 22 ???
. 106d 22 ???
. 106e a7 ???
. 106f 32 ???
. 1070 32 ???
. 1071 30 00 bmi $1073
. 1073 5d 13 e1 eor $e113,x
. 1076 00 brk
. 1077 9c ???
. 1078 3a ???
. 1079 9e ???
. 107a 31 36 and ($36),y
. 107c 31 32 and ($32),y
. 107e 38 sec
. 107f 00 brk
. 1080 00 brk
. 1081 00 brk
. 1082 41 80 eor ($80,x)
. 1084 01 ec ora ($ec,x)
. 1086 97 ???
. 1087 00 brk
. 1088 00 brk
. 1089 f0 58 beq $10e3
. 108b 4c 41 80 jmp $8041
. 108e 01 fd ora ($fd,x)
. 1090 fc ???
. 1091 00 brk
. 1092 00 brk
. 1093 00 brk
. 1094 3f ???
. 1095 bd 00 15 lda $1500,x
. 1098 9d 00 0d sta $0d00,x
. 109b bd 00 16 lda $1600,x
. 109e 9d 00 0e sta $0e00,x
. 10a1 bd 00 17 lda $1700,x
. 10a4 9d 00 0f sta $0f00,x
. 10a7 e8 inx
. 10a8 d0 e2 bne $108c
. 10aa ea nop
. 10ab ea nop
. 10ac ea nop
. 10ad ea nop
. 10ae ea nop
. 10af 4c 50 0c jmp $0c50
. 10b2 ea nop
. 10b3 ea nop
. 10b4 ea nop
. 10b5 ea nop
. 10b6 4c 50 0c jmp $0c50
. 10b9 ea nop
. 10ba ea nop
. 10bb ea nop
. 10bc 4c 50 0c jmp $0c50
. 10bf ea nop
. 10c0 ea nop
. 10c1 ea nop
. 10c2 ea nop
. 10c3 ea nop
. 10c4 ea nop
. 10c5 ea nop
. 10c6 ea nop
. 10c7 ea nop
. 10c8 ea nop
. 10c9 20 a2 00 jsr $00a2
. 10cc bd 00 14 lda $1400,x
. 10cf 9d 00 0c sta $0c00,x
. 10d2 bd 00 15 lda $1500,x
. 10d5 9d 00 0d sta $0d00,x
. 10d8 a2 00 ldx #$00
. 10da bd 00 11 lda $1100,x
. 10dd 9d 00 0c sta $0c00,x
. 10e0 bd 00 12 lda $1200,x
. 10e3 9d 00 0d sta $0d00,x
. 10e6 bd 00 13 lda $1300,x
. 10e9 9d 00 0e sta $0e00,x
. 10ec bd 00 14 lda $1400,x
. 10ef 9d 00 0f sta $0f00,x
. 10f2 e8 inx
. 10f3 d0 e5 bne $10da
. 10f5 20 50 0c jsr $0c50
. 10f8 4c 00 0c jmp $0c00
. 10fb 00 brk
. 10fc 00 brk
. 10fd 00 brk
. 10fe 00 brk
. 10ff 00 brk
. 1100 ea nop
. 1101 ea nop
. 1102 ea nop
. 1103 ea nop
. 1104 ea nop
. 1105 ea nop
. 1106 ea nop
. 1107 ea nop
. 1108 ea nop
. 1109 ea nop
. 110a 20 17 81 jsr $8117
. 110d 20 2e 80 jsr $802e
. 1110 20 c2 80 jsr $80c2
. 1113 20 f4 fc jsr $fcf4
. 1116 a2 fb ldx #$fb
. 1118 9a txs
. 1119 20 50 0c jsr $0c50
. 111c a2 07 ldx #$07 <--- metti 7 ($07) caratteri...
. 111e 86 ef stx $ef <--- ... nel buffer di tastiera
. 1120 bd 40 11 lda $1140,x<--- prendili da $1140 in poi...
. 1123 9d 27 05 sta $0527,x<--- ... e mettili da $0527 in poi
. 1126 ca dex
. 1127 10 f7 bpl $1120
. 1129 4c 16 80 jmp $8016
. 112c 00 brk
. 112d 00 brk
. 112e 00 brk
. 112f 00 brk
. 1130 00 brk
. 1131 00 brk
. 1132 00 brk
. 1133 00 brk
. 1134 00 brk
. 1135 00 brk
. 1136 00 brk
. 1137 00 brk
. 1138 00 brk
. 1139 00 brk
. 113a 00 brk
. 113b 00 brk
. 113c 00 brk
. 113d 00 brk
. 113e 00 brk
. 113f 00 brk
. 1140 3a ??? <--- carattere :
. 1141 40 rti <--- carattere @
. 1142 4c 0d 52 jmp $520d<--- caratteri L, return e R
. 1145 75 0d adc $0d,x<--- carattere "U shiftata" e return
. 1147 00 brk
. 1148 00 brk
. 1149 00 brk
. 114a 00 brk
. 114b 00 brk
. 114c 00 brk
. 114d 00 brk
. 114e 00 brk
. 114f 00 brk
. 1150 a9 5b lda #$5b
. 1152 8d 08 03 sta $0308
. 1155 a9 0c lda #$0c
. 1157 8d 09 03 sta $0309
. 115a 60 rts
. 115b 20 73 04 jsr $0473
. 115e f0 04 beq $1164
. 1160 c9 40 cmp #$40
. 1162 f0 30 beq $1194
. 1164 4c d9 8b jmp $8bd9
. 1167 20 73 04 jsr $0473
. 116a c9 53 cmp #$53
. 116c f0 0b beq $1179
. 116e c9 4c cmp #$4c
. 1170 f0 10 beq $1182
. 1172 c9 56 cmp #$56
. 1174 f0 15 beq $118b
. 1176 4c a1 94 jmp $94a1
. 1179 20 73 04 jsr $0473
. 117c 20 f0 0c jsr $0cf0
. 117f 4c b0 0c jmp $0cb0
. 1182 20 73 04 jsr $0473
. 1185 20 a5 0c jsr $0ca5
. 1188 4c b0 0c jmp $0cb0
. 118b 20 73 04 jsr $0473
. 118e 20 e3 0d jsr $0de3
. 1191 4c b0 0c jmp $0cb0
. 1194 ad 13 ff lda $ff13
. 1197 09 02 ora #$02
. 1199 8d 13 ff sta $ff13
. 119c 20 c3 e3 jsr $e3c3
. 119f 4c 67 0c jmp $0c67
. 11a2 00 brk
. 11a3 00 brk
. 11a4 00 brk
. 11a5 20 17 81 jsr $8117
. 11a8 20 e0 0d jsr $0de0
. 11ab 60 rts
. 11ac 00 brk
. 11ad 00 brk
. 11ae 00 brk
. 11af 00 brk
. 11b0 ad 13 ff lda $ff13
. 11b3 29 fd and #$fd
. 11b5 8d 13 ff sta $ff13
. 11b8 4c dc 8b jmp $8bdc
. 11bb 00 brk
. 11bc 00 brk
. 11bd 00 brk
. 11be 00 brk
. 11bf 00 brk
. 11c0 00 brk
. 11c1 00 brk
. 11c2 00 brk
. 11c3 00 brk
. 11c4 00 brk
. 11c5 00 brk
. 11c6 00 brk
. 11c7 00 brk
. 11c8 00 brk
. 11c9 00 brk
. 11ca 00 brk
. 11cb 00 brk
. 11cc 00 brk
. 11cd 00 brk
. 11ce 00 brk
. 11cf 00 brk
. 11d0 00 brk
. 11d1 00 brk
. 11d2 00 brk
. 11d3 00 brk
. 11d4 00 brk
. 11d5 00 brk
. 11d6 00 brk
. 11d7 00 brk
. 11d8 00 brk
. 11d9 00 brk
. 11da 00 brk
. 11db 00 brk
. 11dc 00 brk
. 11dd 00 brk
. 11de 00 brk
. 11df 00 brk
. 11e0 00 brk
. 11e1 00 brk
. 11e2 00 brk
. 11e3 00 brk
. 11e4 00 brk
. 11e5 00 brk
. 11e6 00 brk
. 11e7 00 brk
. 11e8 00 brk
. 11e9 00 brk
. 11ea 00 brk
. 11eb 00 brk
. 11ec 00 brk
. 11ed 00 brk
. 11ee 00 brk
. 11ef 00 brk
. 11f0 4c 87 ff jmp $ff87
. 11f3 00 brk
. 11f4 00 brk
. 11f5 00 brk
. 11f6 00 brk
. 11f7 00 brk
. 11f8 00 brk
. 11f9 00 brk
. 11fa 00 brk
. 11fb 00 brk
. 11fc 00 brk
. 11fd 00 brk
. 11fe 00 brk
. 11ff 00 brk
. 1200 00 brk
. 1201 00 brk
. 1202 00 brk
. 1203 00 brk
. 1204 00 brk
. 1205 00 brk
. 1206 00 brk
. 1207 00 brk
. 1208 00 brk
. 1209 00 brk
. 120a 00 brk
. 120b 00 brk
. 120c 00 brk
. 120d 00 brk
. 120e 00 brk
. 120f 00 brk
. 1210 00 brk
. 1211 00 brk
. 1212 00 brk
. 1213 00 brk
. 1214 00 brk
. 1215 00 brk
. 1216 00 brk
. 1217 00 brk
. 1218 00 brk
. 1219 00 brk
. 121a 00 brk
. 121b 00 brk
. 121c 00 brk
. 121d 00 brk
. 121e 00 brk
. 121f 00 brk
. 1220 00 brk
. 1221 00 brk
. 1222 00 brk
. 1223 00 brk
. 1224 00 brk
. 1225 00 brk
. 1226 00 brk
. 1227 00 brk
. 1228 00 brk
. 1229 00 brk
. 122a 00 brk
. 122b 00 brk
. 122c 00 brk
. 122d 00 brk
. 122e 00 brk
. 122f 00 brk
. 1230 00 brk
. 1231 00 brk
. 1232 00 brk
. 1233 00 brk
. 1234 00 brk
. 1235 00 brk
. 1236 00 brk
. 1237 00 brk
. 1238 00 brk
. 1239 00 brk
. 123a 00 brk
. 123b 00 brk
. 123c 00 brk
. 123d 00 brk
. 123e 00 brk
. 123f 00 brk
. 1240 00 brk
. 1241 00 brk
. 1242 00 brk
. 1243 00 brk
. 1244 00 brk
. 1245 00 brk
. 1246 00 brk
. 1247 00 brk
. 1248 00 brk
. 1249 00 brk
. 124a 00 brk
. 124b 00 brk
. 124c 00 brk
. 124d 00 brk
. 124e 00 brk
. 124f 00 brk
. 1250 00 brk
. 1251 00 brk
. 1252 00 brk
. 1253 00 brk
. 1254 00 brk
. 1255 00 brk
. 1256 00 brk
. 1257 00 brk
. 1258 00 brk
. 1259 00 brk
. 125a 00 brk
. 125b 00 brk
. 125c 00 brk
. 125d 00 brk
. 125e 00 brk
. 125f 00 brk
. 1260 00 brk
. 1261 00 brk
. 1262 00 brk
. 1263 00 brk
. 1264 00 brk
. 1265 00 brk
. 1266 00 brk
. 1267 00 brk
. 1268 00 brk
. 1269 00 brk
. 126a 00 brk
. 126b 00 brk
. 126c 00 brk
. 126d 00 brk
. 126e 00 brk
. 126f 00 brk
. 1270 00 brk
. 1271 00 brk
. 1272 00 brk
. 1273 00 brk
. 1274 00 brk
. 1275 00 brk
. 1276 00 brk
. 1277 00 brk
. 1278 00 brk
. 1279 00 brk
. 127a 00 brk
. 127b 00 brk
. 127c a0 00 ldy #$00
. 127e 8c fc 07 sty $07fc
. 1281 ad 06 ff lda $ff06
. 1284 29 ef and #$ef
. 1286 8d 06 ff sta $ff06
. 1289 ca dex
. 128a d0 fd bne $1289
. 128c 88 dey
. 128d d0 fa bne $1289
. 128f 78 sei
. 1290 60 rts
. 1291 a0 00 ldy #$00
. 1293 a9 02 lda #$02
. 1295 20 b1 0d jsr $0db1
. 1298 a2 07 ldx #$07
. 129a 88 dey
. 129b c0 09 cpy #$09
. 129d d0 f4 bne $1293
. 129f a2 05 ldx #$05
. 12a1 c6 d1 dec $d1
. 12a3 d0 ee bne $1293
. 12a5 98 tya
. 12a6 20 b1 0d jsr $0db1
. 12a9 a2 07 ldx #$07
. 12ab 88 dey
. 12ac d0 f7 bne $12a5
. 12ae ca dex
. 12af ca dex
. 12b0 60 rts
. 12b1 85 d0 sta $d0
. 12b3 45 d7 eor $d7
. 12b5 85 d7 sta $d7
. 12b7 a9 08 lda #$08
. 12b9 85 d2 sta $d2
. 12bb 06 d0 asl $d0
. 12bd a5 01 lda $01
. 12bf 29 fd and #$fd
. 12c1 20 d3 0d jsr $0dd3
. 12c4 a2 11 ldx #$11
. 12c6 ea nop
. 12c7 09 02 ora #$02
. 12c9 20 d3 0d jsr $0dd3
. 12cc a2 0e ldx #$0e
. 12ce c6 d2 dec $d2
. 12d0 d0 e9 bne $12bb
. 12d2 60 rts
. 12d3 ca dex
. 12d4 d0 fd bne $12d3
. 12d6 90 05 bcc $12dd
. 12d8 a2 0b ldx #$0b
. 12da ca dex
. 12db d0 fd bne $12da
. 12dd 85 01 sta $01
. 12df 60 rts
. 12e0 a2 00 ldx #$00
. 12e2 2c a2 01 bit $01a2
. 12e5 a4 2b ldy $2b
. 12e7 a5 2c lda $2c
. 12e9 86 0a stx $0a
. 12eb 86 93 stx $93
. 12ed 84 b4 sty $b4
. 12ef 85 b5 sta $b5
. 12f1 20 6b a8 jsr $a86b
. 12f4 20 fd 0d jsr $0dfd
. 12f7 20 0a a8 jsr $a80a
. 12fa 4c 03 87 jmp $8703
. 12fd 20 61 0e jsr $0e61
. 1300 a5 d1 lda $d1
. 1302 c9 02 cmp #$02
. 1304 f0 08 beq $130e
. 1306 c9 01 cmp #$01
. 1308 d0 f3 bne $12fd
. 130a a5 ad lda $ad
. 130c f0 0a beq $1318
. 130e ad 33 03 lda $0333
. 1311 85 b4 sta $b4
. 1313 ad 34 03 lda $0334
. 1316 85 b5 sta $b5
. 1318 20 e8 e9 jsr $e9e8
. 131b ea nop
. 131c ea nop
. 131d ea nop
. 131e ea nop
. 131f ea nop
. 1320 20 c0 8c jsr $8cc0
. 1323 a4 ab ldy $ab
. 1325 f0 0b beq $1332
. 1327 88 dey
. 1328 b1 af lda ($af),y
. 132a d9 38 03 cmp $0338,y
. 132d d0 ce bne $12fd
. 132f 98 tya
. 1330 d0 f5 bne $1327
. 1332 84 90 sty $90
. 1334 20 89 f1 jsr $f189
. 1337 ad 35 03 lda $0335
. 133a 38 sec
. 133b ed 33 03 sbc $0333
. 133e 08 php
. 133f 18 clc
. 1340 65 b4 adc $b4
. 1342 85 9d sta $9d
. 1344 ad 36 03 lda $0336
. 1347 65 b5 adc $b5
. 1349 28 plp
. 134a ed 34 03 sbc $0334
. 134d 85 9e sta $9e
. 134f 20 76 0e jsr $0e76
. 1352 a5 d0 lda $d0
. 1354 45 d7 eor $d7
. 1356 05 90 ora $90
. 1358 f0 04 beq $135e
. 135a a9 ff lda #$ff
. 135c 85 90 sta $90
. 135e 4c eb f0 jmp $f0eb
. 1361 20 af 0e jsr $0eaf
. 1364 c9 00 cmp #$00
. 1366 f0 f9 beq $1361
. 1368 85 d1 sta $d1
. 136a 20 dd 0e jsr $0edd
. 136d 91 b6 sta ($b6),y
. 136f c8 iny
. 1370 c0 c0 cpy #$c0
. 1372 d0 f6 bne $136a
. 1374 f0 2d beq $13a3
. 1376 20 af 0e jsr $0eaf
. 1379 20 dd 0e jsr $0edd
. 137c c4 93 cpy $93
. 137e d0 02 bne $1382
. 1380 91 b4 sta ($b4),y
. 1382 d1 b4 cmp ($b4),y
. 1384 f0 02 beq $1388
. 1386 86 90 stx $90
. 1388 45 d7 eor $d7
. 138a 85 d7 sta $d7
. 138c e6 b4 inc $b4
. 138e d0 02 bne $1392
. 1390 e6 b5 inc $b5
. 1392 a5 b4 lda $b4
. 1394 c5 9d cmp $9d
. 1396 a5 b5 lda $b5
. 1398 e5 9e sbc $9e
. 139a 90 dd bcc $1379
. 139c 20 dd 0e jsr $0edd
. 139f 20 7c 0d jsr $0d7c
. 13a2 88 dey
. 13a3 8c fc 07 sty $07fc
. 13a6 58 cli
. 13a7 18 clc
. 13a8 c8 iny
. 13a9 c8 iny
. 13aa 4c c8 e8 jmp $e8c8
. 13ad ea nop
. 13ae ea nop
. 13af 20 1b e3 jsr $e31b
. 13b2 20 7c 0d jsr $0d7c
. 13b5 84 d7 sty $d7
. 13b7 a9 07 lda #$07
. 13b9 8d 04 ff sta $ff04
. 13bc a2 01 ldx #$01
. 13be 20 f0 0e jsr $0ef0
. 13c1 26 d0 rol $d0
. 13c3 a5 d0 lda $d0
. 13c5 c9 02 cmp #$02
. 13c7 d0 f5 bne $13be
. 13c9 a0 09 ldy #$09
. 13cb 20 dd 0e jsr $0edd
. 13ce c9 02 cmp #$02
. 13d0 f0 f9 beq $13cb
. 13d2 c4 d0 cpy $d0
. 13d4 d0 e8 bne $13be
. 13d6 20 dd 0e jsr $0edd
. 13d9 88 dey
. 13da d0 f6 bne $13d2
. 13dc 60 rts
. 13dd a9 08 lda #$08
. 13df 85 d2 sta $d2
. 13e1 20 f0 0e jsr $0ef0
. 13e4 26 d0 rol $d0
. 13e6 ea nop
. 13e7 ea nop
. 13e8 ea nop
. 13e9 c6 d2 dec $d2
. 13eb d0 f4 bne $13e1
. 13ed a5 d0 lda $d0
. 13ef 60 rts
. 13f0 a9 10 lda #$10
. 13f2 24 01 bit $01
. 13f4 d0 fc bne $13f2
. 13f6 24 01 bit $01
. 13f8 f0 fc beq $13f6
. 13fa ad 09 ff lda $ff09
. 13fd 48 pha
. 13fe a9 07 lda #$07
. 1400 8d 04 ff sta $ff04
. 1403 8e 05 ff stx $ff05
. 1406 a9 40 lda #$40
. 1408 8d 09 ff sta $ff09
. 140b 68 pla
. 140c 0a asl
. 140d 0a asl
. 140e 60 rts
. 140f 00 brk
. 1410 00 brk
6 - Turbo tipo Novaload
=======================
Così chiamato perché, come il Novaload, ha una schermata fissa con righe di due colori (sempre gli stessi per tutto il caricamento) nella cornice.
L'ho esaminato poco.
Anche questo ovviamente richiede le halfwaves.
I due esempi allegati (n.2 e n.3) si distinguono per il modo con cui è utilizzato.
I falsi puntatori sono uguali a quelli del "Turbo con cornice che cambia colore" e quindi potrebbe esserne un derivato.
-
1 - Turbo con cornice che cambia colore
Trattasi del turbo usato da un freezer. Nessuno sa dirci quale?
-
"1 - Turbo con cornice che cambia colore
... stando al buffer di cassetta il loader occuperebbe solo tre byte da $0324 a $0326, il che è impossibile"
In realta' solo due bytes (gli end address usati dal SO sono sempre intesi esclusivi)!
Ebbene si, la sezione DATA del file che usa il ROM loader e' costituita da soli 2 bytes. 2 bytes suggeriscono un vettore: infatti si tratta di un valore che sostituisce il vettore alla locazione $0324 (RAM, quindi sovrascrivibile) puntando al turbo loader. Il codice del turbo loader inizia a $0348 ed e' contenuto nel buffer di cassetta. Quindi viene caricato in RAM durante il caricamento della sezione HEADER del file che usa il ROM loader.
$0324 punta alla routine CHROUT, che sul C16 si trova di default a $EC4B, responsabile dell'output a video di un carattere. Alla fine di un caricamento standard, il C16 scriverebbe "READY." proprio usando CHROUT, ma poiche' il file caricato modifica tale vettore, a fine caricamento anziche' produrre la scritta "READY.", il SO esegue il turbo loader: siamo di fronte a quello che si definisce "autostart".
Questa tecnica di autostart e' abbastanza tipica in programmi commerciali, visto che il buffer di cassetta fornisce 171 bytes utili per alloggiare un turbo loader e la sezione dati e' ideale per sovrascrivere il valore di un vettore che causa l'autostart del turbo loader.
-
In effetti il dubbio che il loader fosse tutto nel buffer di cassetta m'era venuto: aprendo il monitor di vice prima dell'inizio delle righe sembrava in effetti l'unica parte di memoria cambiata. E in più notavo che il contenuto del buffer di cassetta non cambiava durante il resto del caricamento, ed in effetti credo venga rilocato dal turbo (giusto?).
Avevo poi fatto una prova salvando (da monitor di vice) l'intero buffer cassetta su disco e poi ricaricandolo a computer resettato (ovviamente con ,8,1) senza però che succedesse nulla (m'aspettavo un press play on tape o almeno un cambio dello schermo), evidentemente dovevo lanciarlo con la sys.
Riguardo l'altra domanda, non so sinceramente quale possa essere il freezer. Sul C16 il modo più semplice per sproteggere i programmi è, tranne nei casi (meno rari di quanto si creda) in cui non sono compatibili, utilizzare il Plus4. L'enorme (in proporzione) quantità di RAM disponibile nel Plus4 agevola non poco la vita. E' un po' come quelle utility per C128 pubblicate a suo tempo su CCC che permettevano di rippare grafica e sprite dai giochi del C64.
Non avendo notizia di cartucce sprotettrici tipo Action Replay per C16/+4, mi viene in mente quindi che il freezer sia un software (ovviamente in L/M) per Plus4. L'unico dubbio è su come si possa attivare un freezer software: il metodo più banale sarebbe un reset o un'entrata in monitor per lanciare il freezer (che magari risiede nella ram sopra i 16K), che però cancellerebbe almeno parte della memoria (sicuramente la pagina zero).
Sei sicuro comunque che si tratti di un freezer? Se così fosse, la linea basic che lancia il gioco dovrebbe o esserci sempre o non esserci mai (non avrebbe senso lasciarla a volte sì e a volte no). Inoltre i programmi freezati, tipicamente, quando vengono lanciati stanno un paio di secondi a decruncharsi prima di partire, almeno così è sul C64.
Io penso che sia stato usato non un freezer, ma, più banalmente, un programma tipo il Disk to Tape+ per C64. Insomma qualcosa che partendo da un PRG su disco generi su cassetta sia il loader sia la parte in turbo.
Ah, per chi non lo sapesse, VICE non è in grado di scrivere un TAPv2 con halfwaves: provate a registrare su un TAP nuovo qualunque cosa con il Turbo Tape (quello di :@L) e poi a ricaricarla.
-
Sei sicuro comunque che si tratti di un freezer? Se così fosse, la linea basic che lancia il gioco dovrebbe o esserci sempre o non esserci mai (non avrebbe senso lasciarla a volte sì e a volte no). ...
Io penso che sia stato usato non un freezer, ma, più banalmente, un programma tipo il Disk to Tape+ per C64. Insomma qualcosa che partendo da un PRG su disco generi su cassetta sia il loader sia la parte in turbo.
Ci potrebbero essere piu' versioni o un freezer flessibile che include il boot BASIC oppure no.
Parlo di freezer in quanto cio' che viene caricato e' di solito uno snapshot del gioco in un punto non convenzionale ma statico, tipo l'inserimento del proprio nome nella tabella dei punteggi o il game over (convenzionali sarebbero per esempio i credits o il logo principale).
-
1 - Turbo con cornice che cambia colore
Trattasi del turbo usato da un freezer. Nessuno sa dirci quale?
C'e' stato un thread su comp.sys.cbm nel quale questo loader e' venuto fuori. http://groups.google.com/group/comp.sys.cbm/browse_thread/thread/e6240a1151675054/46cc8f93d79d5ed2
-
Ci potrebbero essere piu' versioni o un freezer flessibile che include il boot BASIC oppure no.
L'ipotesi delle più versioni sarebbe la più ovvia sulla carta, ma visto che sulla stessa cassetta ci troviamo con giochi con la riga BASIC e altri no, diventa più plausibile l'ipotesi del freezer (ma non sono ancora convinto che lo sia :D) flessibile.
Parlo di freezer in quanto cio' che viene caricato e' di solito uno snapshot del gioco in un punto non convenzionale ma statico, tipo l'inserimento del proprio nome nella tabella dei punteggi o il game over (convenzionali sarebbero per esempio i credits o il logo principale).
Questo è vero tuttavia si tratta di casi singoli (la stragrande maggioranza dei casi NON è così), quindi non ci darei tanta importanza.
Fab, il thread che hai linkato è molto interessante, tuttavia, se non m'è sfuggito qualcosa, non si parla di freezer, ma solo di loader. E su quello credo che siamo tutti d'accordo. :)
-
Fab, il thread che hai linkato è molto interessante, tuttavia, se non m'è sfuggito qualcosa, non si parla di freezer, ma solo di loader. E su quello credo che siamo tutti d'accordo. :)
Una possibilita' sarebbe di trovare un gioco che e' stato salvato usando il mastering tool in questione e i programmatori hanno accidentalmente salvato anche sezioni del masterer (il che e' mi e' capitato di vedere non di rado sul C64 - esempio http://luigidifraia.wordpress.com/2011/05/07/code-leftover/)
-
2 - Turbo con tutto schermo che cambia colore
Identico al Turbo 1, a parte 2 istruzioni (che appunto nel Turbo 2 attivano lo screen blanking).
-
Turbo a tutto schermo che cambia colore
.C:0348 A9 00 LDA #$00
.C:034a 8D 06 FF STA $FF06
.C:034d 38 SEC
.C:034e 78 SEI
.C:034f 08 PHP
.C:0350 20 93 03 JSR $0393
.C:0353 20 B8 03 JSR $03B8
.C:0356 A8 TAY
.C:0357 A9 00 LDA #$00
.C:0359 85 B2 STA $B2
.C:035b 20 B8 03 JSR $03B8
.C:035e 85 B3 STA $B3
.C:0360 20 B8 03 JSR $03B8
.C:0363 85 2D STA $2D
.C:0365 20 B8 03 JSR $03B8
.C:0368 85 2E STA $2E
.C:036a 20 B8 03 JSR $03B8
.C:036d 91 B2 STA ($B2),Y
.C:036f 45 9E EOR $9E
.C:0371 85 9E STA $9E
.C:0373 C8 INY
.C:0374 D0 05 BNE $037B
.C:0376 E6 B3 INC $B3
.C:0378 EE 19 FF INC $FF19
.C:037b C4 2D CPY $2D
.C:037d A5 B3 LDA $B3
.C:037f E5 2E SBC $2E
.C:0381 90 E7 BCC $036A
.C:0383 20 B8 03 JSR $03B8
.C:0386 85 9D STA $9D
.C:0388 A9 08 LDA #$08
.C:038a 85 01 STA $01
.C:038c 28 PLP
.C:038d B0 01 BCS $0390
.C:038f 60 RTS
.C:0390 4C 00 07 JMP $0700
.C:0393 A9 00 LDA #$00
.C:0395 85 01 STA $01
.C:0397 CA DEX
.C:0398 D0 FD BNE $0397
.C:039a 88 DEY
.C:039b D0 FA BNE $0397
.C:039d 84 9E STY $9E
.C:039f A2 00 LDX #$00
.C:03a1 20 C6 03 JSR $03C6
.C:03a4 26 AC ROL $AC
.C:03a6 A5 AC LDA $AC
.C:03a8 C9 10 CMP #$10
.C:03aa D0 F5 BNE $03A1
.C:03ac 20 B8 03 JSR $03B8
.C:03af C9 10 CMP #$10
.C:03b1 F0 F9 BEQ $03AC
.C:03b3 C9 5A CMP #$5A
.C:03b5 D0 EA BNE $03A1
.C:03b7 60 RTS
.C:03b8 A9 01 LDA #$01
.C:03ba 85 AC STA $AC
.C:03bc 20 C6 03 JSR $03C6
.C:03bf 26 AC ROL $AC
.C:03c1 90 F9 BCC $03BC
.C:03c3 A5 AC LDA $AC
.C:03c5 60 RTS
.C:03c6 A9 10 LDA #$10
.C:03c8 24 01 BIT $01
.C:03ca D0 FC BNE $03C8
.C:03cc 24 01 BIT $01
.C:03ce F0 FC BEQ $03CC
.C:03d0 2D 09 FF AND $FF09
.C:03d3 48 PHA
.C:03d4 A9 01 LDA #$01
.C:03d6 A2 78 LDX #$78
.C:03d8 8E 02 FF STX $FF02
.C:03db 8D 03 FF STA $FF03
.C:03de A9 10 LDA #$10
.C:03e0 8D 09 FF STA $FF09
.C:03e3 AD 19 FF LDA $FF19
.C:03e6 18 CLC
.C:03e7 69 10 ADC #$10
.C:03e9 8D 19 FF STA $FF19
.C:03ec 68 PLA
.C:03ed 0A ASL A
.C:03ee 0A ASL A
.C:03ef 0A ASL A
.C:03f0 0A ASL A
.C:03f1 60 RTS
Cambiamenti in turbo con cornice che cambia colore:
.C:0348 AD 19 FF LDA $FF19
.C:034b 85 22 STA $22
-
Turbo a tutto schermo che cambia colore
.C:0348 A9 00 LDA #$00
.C:034a 8D 06 FF STA $FF06
Sono proprio queste le due istruzioni che producono lo screen blanking nel Tipo 2, usando uno dei registri del TED mappato a $FF06.
-
Caricando il turbo "solo cornice" e cambiando le istruzioni "al volo" (da monitor di vice) con quello "tutto schermo", carica a tutto schermo senza problemi.
Facendo invece il contrario, si vede lo schermo (con la cornice che si colora) fino al primo cambio colore, dopodiché diventa a tutto schermo. Curioso.
-
...Facendo invece il contrario, si vede lo schermo (con la cornice che si colora) fino al primo cambio colore, dopodiché diventa a tutto schermo. Curioso.
Il loader carica varie parti di cui alcune eseguite tra un caricamento e l'altro.
-
1 - Turbo con cornice che cambia colore
=======================================
Così com'è necessita delle halfwaves.
A detta di Fabrizio Gennari, è possibile modificarlo in modo che non le necessiti.
Vero anche questo. La ragione per la quale servono le halfwaves e' che il caricatore turbo misura il tempo intercorso tra due fronti di salita, anziche' quelli di discesa come fa il ROM loader. Quindi serve rilevarli entrambi in fase di campionamento, cosa che avviene usando TAP v2. Ovviamente se si modifica il codice sottostante, si puo' fare a meno di TAP v2, ma costruire il TAP v1 funzionante sarebbe una piccola nuova sfida (la diffusione di tape TAP v1 produrrebbe confusione - meglio non farlo).
; Read bit
. 03C6 A9 10 LDA #$10 ; wait for Read Line = 0
. 03C8 24 01 BIT $01
. 03CA D0 FC BNE $03C8
. 03CC 24 01 BIT $01 ; wait for Read Line 0->1 transition
. 03CE F0 FC BEQ $03CC
-
Altri desiderata, riguardanti wav-prg:
- supporto ai loader algasoft non supportati (che sono almeno due e te li ho già mandati)
- supporto ai loader/turbo per C16 (te li posso mandare senza problemi)
Ho guardato il TAP Alga Soft che mi hai mandato, ed è supportato dal plug-in Firebird, con l'eccezione di un gioco che è supportato dal plug-in Poke. Da notare che la versione modificata di Tapclean che si trova qui (http://iancoog.altervista.org/) supporta entrambi i formati, chiamandoli rispettivamente EASYTAPE2 e GALADRIEL_POKE.
Il TAP Best 20 Soccer contiene giochi in formato 108DE0A5, che è supportato sia da Tapclean sia dalla versione 4.0 beta di WAV-PRG.
Riguardo al loader turbo per C16, tempo fa un utente di questo forum, un certo zzzeca, mi aveva mandato degli WAV con lo stesso formato di Byte games per C16. Anche se non avevo capito alcune cose (in particolare, perché i TAP v1 non funzionassero), il loader è di per sé semplice, una variante del Freeload. Gli mandai una DLL ottenuta cambiando di due virgole freeload.c e compilandolo, e lui ne fu soddisfatto. Paradossalmente, funziona con l'impostazione sbagliata di "inverted waveform": questa è una conseguenza del fatto che il loader riconosce i trigger opposti a quelli normali.
-
Sì avevo letto la mail (scusa se non t'ho risposto subito).
A tal proposito, sarebbe molto difficile implementare una sorta di check automatico in wav-prg che riesca ad estrarre tutti i prg creando un T64 nei casi in cui in un nastro ci siano vari loader diversi? Certo è possibile estrarre prima quelli di un tipo e poi quelli di un altro e poi lavorare con lo Star Commander per metterli insieme nel giusto ordine, però potrebbe essere utile qualcosa che funzioni in automatico. Questo dando per buono che il tap sia funzionante. Per quanto riguarda tapclean, stesso discorso. Ma lì mi pare che qualcosa del genere c'è già (ma confesso che l'ho usato poco, quindi potrei sbagliarmi).
-
La discussione è stata divisa e spostata nell'area convertire le cassette... ecc..
Spero di aver fatto cosa gradita.
Aggiornamento :
Se siete tutti d'accordo e mi darete una mano sulla stesura, possiamo creare una nuova guida da pubblicare sul sito, per la conversione delle cassette del c16.
-
Al momento creare una guida con quella procedura usata per quella cassetta non credo serva a molto. Ho provato ad riutilizzare il procedimento e gli script su altri numeri di bytegames ma non ho ottenuto risultati apprezzabili. Ho l'impressione che ogni cassetta sia storia a se. L'unica è attendere un aggiornamento per audiotap.
-
O usare MTAP, o usare un DC2N. O mandarle a chi può usare MTAP o un DC2N.
-
O usare la versione aggiornata di Audiotap che è appena uscita.
-
sarebbe molto difficile implementare una sorta di check automatico in wav-prg che riesca ad estrarre tutti i prg creando un T64 nei casi in cui in un nastro ci siano vari loader diversi? [...]. Per quanto riguarda tapclean, stesso discorso. Ma lì mi pare che qualcosa del genere c'è già (ma confesso che l'ho usato poco, quindi potrei sbagliarmi).
Non è semplice.
La versione 4.0 di WAV-PRG è pensata per questo. Però lo sviluppo è lento: è iniziato a dicembre 2009 ed è ancora indietro.
Tapclean lo fa con 2 metodi. Il primo è l'identificazione del CRC della parte iniziale. Se il CRC è tra quelli noti, lo si usa per decidere quale loader usare. Il secondo è il controllo a tappeto di tutti i loader conosciuti.
L'intenzione è che WAV-PRG 4.0 usi metodi simili ai due descritti sopra per riconoscere automaticamente (entro certi limiti) quale loader è quello giusto per la cassetta. La sorgente della versione alpha è scaricabile con git.
-
Domanda scema perché non ho provato: il Vic20 è già implementato? (Per fortuna non esistono, o non mi risultano almeno, loader non standard per il Vic20)
-
Audiotap può creare TAP col clock VIC20.
-
No, mi riferivo a wav-prg per creare T64 da un TAP
-
Basta che il TAP sia valido, per quale macchina e' stato creato non conta.
I plug-in, comunque, sono fatti per supportare onde intere, non semionde.
-
O usare la versione aggiornata di Audiotap che è appena uscita.
Ho provato la nuova versione con un altro numero di Byte Games ma non sono riuscito ad ottenere un tape funzionante. Se seleziono C16(senza semionde) il vice segnala correttamente i vari found ma carica all'infinito per via della mancanza delle semionde. Se imposto C16 with semiwaves allora dal tape generato non viene trovato piu' nulla e non appare alcun found(provato con e senza onde invertite e vari livelli di sensibilità).
-
Fab, se vuoi fare qualche verifica ho messo in condivisione il .wav della cassetta:
http://www.megaupload.com/?d=RLZATINN
-
Capisco in italiano (anche se non mi piace) ma perché in inglese audiotap usa il termine semiwaves quando ovunque (a cominciare da mtap) vengono chiamate halfwaves? Nessuna vena polemica, voglio solo capire :)
-
Fab, se vuoi fare qualche verifica ho messo in condivisione il .wav della cassetta:
http://www.megaupload.com/?d=RLZATINN
"Il file al quale si sta tentando di accedere è temporaneamente non disponibile. Riprova più tardi."
-
Problema risolto, appena scaricato
-
Fab, se vuoi fare qualche verifica ho messo in condivisione il .wav della cassetta:
http://www.megaupload.com/?d=RLZATINN
Con Audiotap 1.6 bisogna usare "inverted waveform" e le semionde. Poi lo si può ripulire con questa versione ulteriormente migliorata dello script di ripulitura
#!/usr/bin/python3
import io
import sys
import os
def statist(infile,outfile):
inputs = io.open(infile,'rb')
outputs = io.open(outfile,'wb')
pulisci = False
stat = [{},{},{},{},{},{},{},{}]
beginstat = [{},{}]
pilot = bytes([])
impulsi = 0
blocchi = 0
while 1:
p =inputs.tell()
thisbyte=inputs.read(1)
if len(thisbyte)==0:
break
if not pulisci:
flushpilot=True
if thisbyte[0]>=0x0f and thisbyte[0]<0x22:
pilot += thisbyte
flushpilot=False
elif thisbyte[0]>=0x38 and thisbyte[0]<0x66 and len(pilot) > 450:
thisbyte+=inputs.read(1)
if len(thisbyte)==2 and thisbyte[1]>=0x33 and thisbyte[1]<0x9b:
pulisci = True
inizioblocco = p
impulsi=impulsi-1
print("iniz blocco "+str(blocchi)+" a "+hex(thisbyte[0])+" at "+str(p)+" at "+str(impulsi))
p=inputs.seek(-2, os.SEEK_CUR)
#clean pilot
#pilot=bytes([0x1b])*len(pilot)
else:
pilot += thisbyte[0:1]
p=inputs.seek(1-len(thisbyte), os.SEEK_CUR)
elif thisbyte[0]==0x00:
pilot=pilot+thisbyte+inputs.read(3)
flushpilot=True
else:
pilot += thisbyte
if flushpilot:
thisbyte=pilot
pilot=pilot[0:0]
else:
thisbyte=thisbyte[0:0]
impulsi=impulsi+1
else:
impulsi=impulsi+1
if ((p - inizioblocco) % 40) == 0:
if(thisbyte[0]<0x38):
print("fineblocco "+hex(thisbyte[0])+" at "+str(p)+" at "+str(impulsi))
lunghpilot = 0
pulisci = False
blocchi = blocchi + 1
thisbyte+=inputs.read(1)
impulsi=impulsi+1
#clean end of block
#thisbyte=bytes([0x35,0x35])
else:
thisbyte=thisbyte+inputs.read(1)
impulsi=impulsi+1
for i in range(2):
if not thisbyte[i] in beginstat[i]:
beginstat[i][thisbyte[i]]=0
beginstat[i][thisbyte[i]]=beginstat[i][thisbyte[i]]+1
toolittle=thisbyte[0]-0x61
if toolittle<0:
thisbyte=bytes([0x61,thisbyte[1]+toolittle])
#clean start of block
#thisbyte=bytes([0x6c,0x6c])
elif ((p - inizioblocco) % 40) == 1:
print("What?")
elif ((p - inizioblocco) % 40) == 2:
pass
#clean right after start of block
#thisbyte=bytes([0x35])
elif ((p - inizioblocco) % 40) == 3:
pass
#clean right after start of block
#thisbyte=bytes([0x35])
else:
thisbyte=thisbyte+inputs.read(3)
impulsi=impulsi+3
statbase = 0
resbytes=thisbyte
if (thisbyte[0]+thisbyte[1]<thisbyte[2]+thisbyte[3]):
if(thisbyte[0]<0x21 or thisbyte[0]>0x29):
resbytes= bytes([0x21])+resbytes[1:4]
if(thisbyte[1]<0x12 or thisbyte[1]>0x1a):
resbytes=resbytes[0:1]+bytes([0x17])+resbytes[2:4]
if(thisbyte[2]<0x30 or thisbyte[2]>0x3a):
resbytes=resbytes[0:2]+bytes([0x30])+resbytes[3:4]
#clean zero bit
#resbytes=bytes([0x17,0x17,0x35,0x35])
else:
statbase = 4
if(thisbyte[0]<0x30 or thisbyte[0]>0x3a):
resbytes= bytes([0x30])+resbytes[1:4]
if(thisbyte[2]<0x21 or thisbyte[2]>0x29):
resbytes=resbytes[0:2]+bytes([0x21])+resbytes[3:4]
if(thisbyte[3]<0x12 or thisbyte[3]>0x1a):
resbytes=resbytes[0:3]+bytes([0x17])
#clean one bit
#resbytes=bytes([0x35,0x35,0x17,0x17])
for i in range(4):
if not thisbyte[i] in stat[i+statbase]:
stat[i+statbase][thisbyte[i]]=0
stat[i+statbase][thisbyte[i]]=stat[i+statbase][thisbyte[i]]+1
thisbyte=resbytes
outputs.write(thisbyte)
statbase = 0
for i in stat:
print("stat for byte "+str(int(statbase/4))+" pos "+str(statbase%4))
statbase=statbase+1
for k in sorted(i.keys()):
print("byte "+hex(k)+" occurs "+str(i[k])+" times")
statbase = 0
for i in beginstat:
print("stat for begin "+str(statbase))
statbase=statbase+1
for k in sorted(i.keys()):
print("byte "+hex(k)+" occurs "+str(i[k])+" times")
if len(sys.argv)<3:
print("not enough args")
sys.exit
statist(sys.argv[1],sys.argv[2])
-
Ora funziona :) grande Fabrizio, altra cassetta recuperata.
-
Hai provato lo stesso procedimento con l'altra cassetta (la n.16)? In teoria, dovrebbe andare senza bisogno di hex editor o di dividere il TAP.
-
Ho fatto qualche prova, con l'ultima versione dello script(50) funzionano solo alcuni giochi(highway-scacchi-secret mission-space shuttle-skyrock) mentre con la penultima(40) ne funzionano altri(intro-smurf-scacchi-space shuttle).
-
Hai anche provato a rifare il .tap con Audiotap 1.6 e pulire quello?
-
Si sono ripartito da un nuovo .tap fatto col 1.6.
-
Sto facendo prove anche con la serie Go Games ma il Vice mostra il found solo quando imposto Audiotap con sensibilità >46 e in modo C16 senza semionde(e cmq dopo poco arriva il break error). Con semionde e varie puliture non viene trovato nulla.
Metto il .wav in condivisione nel caso volessi fare qualche prova:
http://www.megaupload.com/?d=G02X6ZN8
-
Si sono ripartito da un nuovo .tap fatto col 1.6.
Strano. Con Audiotap 1.6, semionde, inverted waveform e ripulitura, qui funziona tutto tranne la presentazione. Alzando la sensitivity a 35 funziona anche quella.
-
Sto facendo prove anche con la serie Go Games ma il Vice mostra il found solo quando imposto Audiotap con sensibilità >46 e in modo C16 senza semionde(e cmq dopo poco arriva il break error). Con semionde e varie puliture non viene trovato nulla.
Metto il .wav in condivisione nel caso volessi fare qualche prova:
http://www.megaupload.com/?d=G02X6ZN8
Mi dispiace, la qualità del segnale è scarsa. Le onde si abbassano paurosamente a tratti. Con sensitivity 83, inverted waveform e ripuluitura sono riuscito ad ottenere i FOUND, ma poi dà LOAD ERROR o comunque non trova niente dopo.
-
Non ho ancora mollato con Go Games, appena mi riprende la voglia ricampiono un po' di cassette C16(ormai quelle C64 inedite le ho quasi finite, ne devo ancora mandare una ventina al sito che però pare fermo e senza aggiornamenti da un bel po').
-
Che numeri di Go Games stai provando a convertire?
-
Di Go Games ho i numeri 10-19-27-36-38.
-
...E ancora una volta per il numero 22 di Go Games niente :(
-
Che c'era nel numero 22?
-
Il primo gioco per C16, un gioco spaziale bellissimo :cry2:
-
Altri desiderata, riguardanti wav-prg:
[...]
- supporto ai loader/turbo per C16 (te li posso mandare senza problemi)
http://sourceforge.net/projects/wav-prg/files/wav-prg/4.0alpha/wav-prg-4.0alpha5.zip/download (appena uscito). È una versione alpha, quindi preliminare, ma che supporta i TAP v2 e i WAV a semionde. L'ho provato con Byte Games n.6 per C16 con buoni risultati: il TAP ripulito che crea funziona molto meglio su VICE dell'output di Audiotap.
Bisogna scegliere il plug-in "Default C16" per le cassette C16. Inoltre, la cartella loaders contiene un file che si chiama freeload-observers.dll, che è meglio togliere prima di iniziare: se è presente, alcune parti turbo vengono ripulite, ma a scapito di alcune parti non turbo, che hanno più bisogno di ripulitura.
-
Intanto grazie, lo provo su un po' di tap e ti faccio sapere se ci sono problemi :)
-
Ho provato, ma riesco solo a creare tap puliti... non a fare i T64 o i PRG. Dove sbaglio? (ovviamente coi tap per C64 non ho problemi)
-
Ho provato, ma riesco solo a creare tap puliti... non a fare i T64 o i PRG. Dove sbaglio? (ovviamente coi tap per C64 non ho problemi)
Almeno, i T64 o i PRG contengono la parte non turbo?
Togliendo freeload-observers.dll, la parte turbo non viene riconosciuta, e quindi non è presente nei PRG e nei T64, e nei TAP puliti viene copiata così com'è, senza ripulitura.
Con freeload-observers.dll, la parte turbo viene riconosciuta. WAV-PRG ha allo stato attuale una limitazione: se non può dire con certezza che dopo un programma turbo ce n'è sicuramente un altro, non prova a cercarne un altro. Nessun problema se i programmi turbo sono in un pezzo solo. Nel caso di Byte Games n.6, i programmi turbo sono in due parti, e WAV-PRG converte in T64 o PRG solo la prima. Sarebbe bello togliere questa limitazione, ma richiede molto lavoro, perché richiede di rileggere lo stesso TAP (o WAV) più volte, un po' come fa Tapclean.
-
Prova con Byte Games n.5 (non 6)...
-
Con freeload-observers.dll, vengono 18 file PRG. Solo 2 sono utilizzabili (e identici tra loro). Degli altri, 9 sono lunghi 193 byte, e contengono il nome del programma e il codice del caricatore turbo, e 7 sono lunghi 178 byte, e contengono la prima parte turbo del gioco vero e proprio. I giochi veri e propri non ci sono. I motivi sono spiegati sopra.
Senza freeload-observers.dll, vengono 32 file PRG. Solo 2 sono utilizzabili (e identici tra loro, e a quelli di prima).Degli altri, 16 sono lunghi 193 byte, e contengono il nome del programma e il codice del caricatore turbo, e 14 sono lunghi 4 byte.
-
Massi, avevi scritto tempo fa che hai dei TAP contenenti turbo loader C16 che richiedono halfwaves. Li hai ancora?
-
Massi, avevi scritto tempo fa che hai dei TAP contenenti turbo loader C16 che richiedono halfwaves. Li hai ancora?
Sì, li avevo caricati un anno fa, su megaupload... ora però te l'ho aggiornato, ne ho aggiunto qualcuno che ho scoperto in seguito, e li ho messi tutti qui:
http://massicadenti.altervista.org/elenco_dump/Esempi%20di%20Turbo%20per%20C16.rar (7,6 MB)
sono 8 tipi di turbo diversi, o singole varianti l'uno dell'altro.
Non tutti necessitano delle halfwaves ma sono tutti i turbo che ho trovato per C16.
La prima cosa da fare è leggere i TXT allegati, a cominciare da quello nella root, perché in alcune cassette i turbo a cui mi riferisco non sono su tutti i titoli, e lì è spiegato meglio.
-
Un tapclean (e magari un wav-prg) funzionante anche coi turbo per C16 sarebbe semplicemente perfetto (intendo, più di quanto non lo sia già :D)
PS Visto che uno di quei turbo (quello con la cornice che cambia colore) è possibile dumparlo anche senza halfwaves (se n'era parlato proprio in questo thread) magari questo tapclean potrebbe "correggere" i TAP V1 e convertirli in TAP V2 corretti...
-
Sì, li avevo caricati un anno fa, su megaupload... ora però te l'ho aggiornato, ne ho aggiunto qualcuno che ho scoperto in seguito, e li ho messi tutti qui:
http://massicadenti.altervista.org/elenco_dump/Esempi%20di%20Turbo%20per%20C16.rar (7,6 MB)
Oggi ho visto l'ultimo, indicato come "8 - Turbo Novaload". Non è Novaload, ma una variante del Turbo Tape 64 che usa onde invertite. Ho scritto un plug-in per WAV-PRG 4.0 che sembra funzionare (ma non è online).