Autore Topic: Discussione per DUMPARE CASSETTE C16 (nata per la cassetta byte games n6)  (Letto 28982 volte)

Massi cadenti

  • Non dimenticatevi *MAI* nei vostri dump del Vic20 e soprattutto del C16/+4!!!
  • Administrator
  • Utente di edicolac64.com
  • *****
  • Post: 884
    • http://massicadenti.altervista.org/algasoft.html
Re:Re:NUOVI DUMP: hit parade n38, trainer games n5, byte games n6
« Risposta #15 il: 26 Agosto 2011, 19:38:02 »
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...
I'M *DC2N* POWERED (tnx Luigi Di Fraia) - La mia collezione di cassette (non per vendita né scambio)
PER GLI ACQUISTI NEL MERCATINO IO PAGO SOLO CON PAYPAL E LA COMMISSIONE E' A CARICO VOSTRO

fab

  • Utente di edicolac64.com
  • *
  • Post: 424
Re:Re:NUOVI DUMP: hit parade n38, trainer games n5, byte games n6
« Risposta #16 il: 27 Agosto 2011, 19:11:26 »
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)

Massi cadenti

  • Non dimenticatevi *MAI* nei vostri dump del Vic20 e soprattutto del C16/+4!!!
  • Administrator
  • Utente di edicolac64.com
  • *****
  • Post: 884
    • http://massicadenti.altervista.org/algasoft.html
Re:Re:NUOVI DUMP: hit parade n38, trainer games n5, byte games n6
« Risposta #17 il: 27 Agosto 2011, 20:38:18 »
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
I'M *DC2N* POWERED (tnx Luigi Di Fraia) - La mia collezione di cassette (non per vendita né scambio)
PER GLI ACQUISTI NEL MERCATINO IO PAGO SOLO CON PAYPAL E LA COMMISSIONE E' A CARICO VOSTRO

Astaroth

  • Dumper the value
  • Utente di edicolac64.com
  • **
  • Post: 97
Re:Re:NUOVI DUMP: hit parade n38, trainer games n5, byte games n6
« Risposta #18 il: 28 Agosto 2011, 10:39:10 »
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.

fab

  • Utente di edicolac64.com
  • *
  • Post: 424
Re:Re:NUOVI DUMP: hit parade n38, trainer games n5, byte games n6
« Risposta #19 il: 28 Agosto 2011, 13:34:44 »
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ì
Codice: [Seleziona]
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>...]
Codice: [Seleziona]
#!/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:])

fab

  • Utente di edicolac64.com
  • *
  • Post: 424
Re:Re:NUOVI DUMP: hit parade n38, trainer games n5, byte games n6
« Risposta #20 il: 28 Agosto 2011, 19:37:04 »
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
Codice: [Seleziona]
#!/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])

Astaroth

  • Dumper the value
  • Utente di edicolac64.com
  • **
  • Post: 97
Re:Re:NUOVI DUMP: hit parade n38, trainer games n5, byte games n6
« Risposta #21 il: 28 Agosto 2011, 23:32:19 »
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.

fab

  • Utente di edicolac64.com
  • *
  • Post: 424
Re:Re:NUOVI DUMP: hit parade n38, trainer games n5, byte games n6
« Risposta #22 il: 29 Agosto 2011, 08:26:37 »
Hai un messaggio privato

luigidifraia

  • Utente di edicolac64.com
  • *
  • Post: 19
    • http://www.luigidifraia.com
Re:Re:NUOVI DUMP: hit parade n38, trainer games n5, byte games n6
« Risposta #23 il: 29 Agosto 2011, 23:52:32 »
*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#.

Astaroth

  • Dumper the value
  • Utente di edicolac64.com
  • **
  • Post: 97
Re:Re:NUOVI DUMP: hit parade n38, trainer games n5, byte games n6
« Risposta #24 il: 30 Agosto 2011, 01:12:31 »
Febrizio ha fatto un lavoro eccezionale in questi giorni. Massi cadenti ora potrà finalmente giocare a Smurf(anche se sicuramente non è quello che crede ;) )...

Massi cadenti

  • Non dimenticatevi *MAI* nei vostri dump del Vic20 e soprattutto del C16/+4!!!
  • Administrator
  • Utente di edicolac64.com
  • *****
  • Post: 884
    • http://massicadenti.altervista.org/algasoft.html
Re:Re:NUOVI DUMP: hit parade n38, trainer games n5, byte games n6
« Risposta #25 il: 30 Agosto 2011, 01:37:31 »
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
« Ultima modifica: 30 Agosto 2011, 01:41:12 da Massi cadenti »
I'M *DC2N* POWERED (tnx Luigi Di Fraia) - La mia collezione di cassette (non per vendita né scambio)
PER GLI ACQUISTI NEL MERCATINO IO PAGO SOLO CON PAYPAL E LA COMMISSIONE E' A CARICO VOSTRO

Massi cadenti

  • Non dimenticatevi *MAI* nei vostri dump del Vic20 e soprattutto del C16/+4!!!
  • Administrator
  • Utente di edicolac64.com
  • *****
  • Post: 884
    • http://massicadenti.altervista.org/algasoft.html
Re:Re:NUOVI DUMP: hit parade n38, trainer games n5, byte games n6
« Risposta #26 il: 30 Agosto 2011, 02:11:40 »
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.
I'M *DC2N* POWERED (tnx Luigi Di Fraia) - La mia collezione di cassette (non per vendita né scambio)
PER GLI ACQUISTI NEL MERCATINO IO PAGO SOLO CON PAYPAL E LA COMMISSIONE E' A CARICO VOSTRO

Astaroth

  • Dumper the value
  • Utente di edicolac64.com
  • **
  • Post: 97
Re:Re:NUOVI DUMP: hit parade n38, trainer games n5, byte games n6
« Risposta #27 il: 30 Agosto 2011, 11:22:22 »
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

Astaroth

  • Dumper the value
  • Utente di edicolac64.com
  • **
  • Post: 97
Re:Re:NUOVI DUMP: hit parade n38, trainer games n5, byte games n6
« Risposta #28 il: 30 Agosto 2011, 12:37:44 »
Ho risolto esportando e convertendo i singoli giochi. Ora funzionano tutti(compreso scacchi).
L'ho rimesso in download:
http://www.megaupload.com/?d=SJTI7FZO

Massi cadenti

  • Non dimenticatevi *MAI* nei vostri dump del Vic20 e soprattutto del C16/+4!!!
  • Administrator
  • Utente di edicolac64.com
  • *****
  • Post: 884
    • http://massicadenti.altervista.org/algasoft.html
Re:Re:NUOVI DUMP: hit parade n38, trainer games n5, byte games n6
« Risposta #29 il: 30 Agosto 2011, 15:10:40 »
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 :)
« Ultima modifica: 30 Agosto 2011, 15:12:25 da Massi cadenti »
I'M *DC2N* POWERED (tnx Luigi Di Fraia) - La mia collezione di cassette (non per vendita né scambio)
PER GLI ACQUISTI NEL MERCATINO IO PAGO SOLO CON PAYPAL E LA COMMISSIONE E' A CARICO VOSTRO