Appunti di Gianluca Ghettini
TapeRipper - Recuperiamo le vecchie cassette del C64
TapeRipper e' un mio programma in grado di leggere le normali cassette dati del Commodore64 tramite apposita interfaccia registratore<->PC e di generare il file .TAP corrispondente su hard disk. Il file .TAP puo' quindi essere usato con un qualsiasi emulatore per C64 (tipo CCS64, VICE etc...).
I requisiti minimi per far girare il programma fanno sorridere, ma li metto lo stesso:
- un PC IBM compatibile (dal 386 in su) con almeno 4Mb di memoria
- hard disk
- porta parallela LPT disponibile
Tutto qui. Ovviamente e' necessario possedere un registratore a cassette della Commodore o uno 100% compatibile. Inoltre bisogna costruire una semplice interfaccia per connettere tale periferica alla porta parallela (vedi sezione piu' in basso).
In questa pagina sono disponibili i sorgenti, l'eseguibile, modalita' d'uso, un po' di documentazione varia, lo schema dell'interfaccia da costruire e le specifiche riguardo al formato dei file TAP.
Ghettini Gianluca, Email: giangio82@gmail.com
Sorgenti
TapeRipper e' scritto in C ed e' composto da un unico file sorgente. L'ho scritto e compilato sotto DJGPP senza alcun problema. Per eseguire il programma bisogna assicurarsi di essere in ambiente DOS in modalita' reale dato che sotto windows (9x/NT/ME/XP) non si possono garantire misurazioni di tempo troppo accurate (causa i cambi di contesto improvvisi tra processi). Per l'esecuzione e' necessario inoltre un gestore DPMI come CWSDPMI.EXE localizzato nella stessa directory del programma e avere il loader della memoria alta attivato (tale himem.sys).
tape_ripper.c (4kB)
File binari
Il programma gia' compilato e pronto per essere eseguito: ripper.exe (115kB)
ed il server DPMI: cwsdpmi.zip (53kB)
Utilizzo
- collegare il registratore datassette alla porta parallela del PC tramite l'interfaccia
- avviare il sistema in modalita DOS reale.
- al prompt dei comandi digitare "ripper" e premere invio
- premere PLAY sul registratore su richiesta del programma
- premere STOP sul registatore per interrompere la lettura da cassetta
- importare il file out.tap sul proprio emulatore preferito
Documentazione
Un po' di roba che mi e' tornata utile per realizzare il programma:
Temporizzazione del PC sotto DOS
L'archivio tratta la temporizzazione e varie funzioni correlate sui computer della famiglia IBM compatibili sotto DOS; funzioni DOS e BIOS, BIOS tick count, interruzioni hardware, timer tick interrupts, port B, il timer 8253/8254, velocizzare il conteggio del timer, dynamic tick periods, simulazione dell'interruzione della ritraccia verticale, buffering doppio e triplo, timestamping assoluto, l'RTC (Real Time Clock), altri metodi di misurazione del tempo, lettura della porta joystick, generazione PWM del suono tramite speaker interno. Sono presenti anche programmi di esempio precompilati.
pctim003.zip (350kB)
Autore: Kris Heidenstrom kheidens@actrix.gen.nz
Il timer interrupt
Guida facile e veloce alla riprogrammazione del timer interrupt (detto anche 8253); come settare il registro di controllo, la lettura dai canali e le modalita' di funzionamento. Con esempi in C++.
TimerInterrupt.pdf (18kB)
C64 Programming Reference Manual
Un malloppone ASCII di quasi un MB contenente tutto quello che c'e' da sapere sul Commodore64: programmazione BASIC e linguaggio macchina, memoria, CPU, I/O, etc...
C64manual.zip (253kB)
Teoria e funzionamento delle bande magnetiche
Riguarda le carte magnetiche ma il concetto e' applicabile anche ai normali nastri in cassetta.
P37-06.txt (45kB)
Programmazione della porta parallela
Tutto sulla parallela; enumerazione e disposizione dei pin, registri e modalita' di funzionamento.
part1.html
part2.html
part3.html
part4.html
Autore: Zhahai Stewart zstewart@nyx.cs.du.edu
Interfaccia
L'interfaccia da me realizzata permette di collegare il registratore del C64 al PC. E' abbastanza semplice da realizzare.
In alto e' la porta parallela femmina del PC ed in basso un connettore maschio per la spina del registratore a cassette. Il connettore lo si puo' costruire sagomando con un seghetto una vecchia scheda elettronica di quelle a inserimento stile "cartuccia del nintendo" molto frequenti nei televisori. Per il resto basta un saldatore, stagno, qualche filo elettrico ed una sorgente da 5Volt piu' stabile possibile, ad esempio quella che viene fornita dall'alimentatore del PC stesso, oppure prelevata dalla porta joystick (pin1 +5volt e pin4 massa). Volendo si puo' costruire direttamente l'alimentatore a 5Volt: ecco lo schema:
B1 - ponte diodi rettificatore
C1,C2 - condensatori elettrolitici da 470uF
IC1 - regolatore di tensione 7805
Per quanti vogliano cimentarsi con la modifica diretta dell'hardware del registratore ne riporto lo schema elettrico (cliccare sopra per un ingrandimento):
Formato dei file .TAP
Il formato .TAP, riconosciuto praticamente da qualsiasi emulatore per Commodore64 che si rispetti, e' nato con l'intento di descrivere bit a bit i dati (programmi e/o giochi) memorizzati su nastro. Essendo una semplice rappresentazione dei dati seriali provenienti dal nastro e' in grado di memorizzare qualsiasi codifica dei dati sia stata utilizzata. Le immagini .TAP sono solitamente di dimensioni molto maggiori (in rapporto all'incirca di 8:1) rispetto a quella dei dati che effettivamente vanno a caricarsi in memoria, in quanto ogni singolo byte del file .TAP rappresenta la durata (misurata in cicli CPU) di una pulsazione rilevata dal registratore e corrispondente ad un singolo bit del programma utile. In altri schemi di codifica, invece, due pulsazioni codificano un bit; tali dettagli di codifica, comunque, non sono presi in cosiderazione dal formato TAP in nessun modo in quanto ci si limita unicamente a registrare gli istanti di generazione delle pulsazioni da parte dell'hardware del registratore.
Questo e' un esempio di header per un generico file .TAP:
<HEX> 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F <ASCII>
----------------------------------------------------- ----------------
0000: 43 36 34 2D 54 41 50 45 2D 52 41 57 00 00 00 00 C64-TAPE-RAWúúúú
0010: 51 21 08 00 2F 0F 0D 31 64 1D 26 0D 07 21 0A 12 Q!úú/úú1dú&úú!úú
0020: 4A 2F 2C 34 07 18 0D 31 07 04 23 04 0D 42 0D 1E J/,4úúú1úú#úúBúú
0030: 34 04 42 0D 20 15 5E 04 0D 18 61 0D 26 29 34 0D 4úBúúú^úúúaú&)4ú
0040: 23 0D 07 0A 3F 55 04 0A 13 3F 07 0D 12 2B 18 0A #úúú?Uúúú?úúú+úú
dove:
$0000-000B: rappresentano la scritta in ASCII "C64-TAPE-RAW"
$000C: versione del file TAP
$000D-000F: non usati
$0010-0013: dimensione dell'intero file (in big-endian) meno l'header
$0014-EOF: dati veri e propri
Nella versione 0 del file (quindi con il byte $000C settato a 0x00) ogni singolo byte descrive la durata di una pulsazione. Un byte pari a 0x00 viene interpretato come una pulsazione la cui durata andrebbe a generare un valore superiore a 0xFF. Nella versione 1 del file (0x01 alla locazione $000C) tali pulsazioni che non possono essere codificate con un unico byte sono memorizzate su quattro bytes: il primo posto a 0x00 e i successivi tre che indicano l'effettiva durata in cicli della pulsazione.
La formula che si utilizza e' P = (8 * BYTE) / (CICLI_CPU) dove P e' la durata in secondi della pulsazione, BYTE e' il byte codificato nel file TAP e CICLI_CPU e' il clock del processore in Hz (nel Commodore64 versione PAL vale 985248 Hz). Ad esempio, un valore di 0x2F (47 in decimale) nel file TAP rappresenta una pulsazione di durata pari a (47 * 8) / 985248 = 0.00038975 secondi.
Bug noti e migliorie
- TapeRipper ha un buffer di 4Mbytes fisso; si puo' aumentare solo modificando il sorgente.
- Il file di uscita e' fisso con nome "out.tap". Se un altro file con lo stesso nome e' gia' presente prima dell'avvio del programma, questo verra' sovrascritto.
- Durante la lettura non viene mostrato nulla sullo stato di avanzamento della cassetta.
- Se l'interfaccia e' scollegata il programma attende per la pressione del tasto STOP sul registratore!
- Il formato TAP versione 1.0 non e' implementato.
Foto della mia interfaccia
RSS Feed