6 min readGalencia su Magic Cart C64 con l’utilizzo di Linker e Crunchers
Un po’ di nozioni sui packer e cruncher su C64
Quando avevamo necessità di organizzare al meglio i nostri file sui floppy disk, era molto importante avere riguardo dello spazio utilizzato. Spesso però avevamo bisogno di utilizzare il minor ingombro possibile per ogni file così da salvare spazio su disco e poter inserire altri programmi.
Venivano in aiuto i Packer ed i Cruncher, tool di vasto utilizzo quasi un must per la creazione dei nostri floppy di utility ad esempio.
Ma quale è la differenza tra un Packer ed un Cruncher? Bhè, i primi, sono fondamentalmente programmi che comprimono altri programmi, considerando i dati scritti e i dati non scritti. Nello specifico, un packer verifica lo spazio sprecato con indirizzamento $00 e quindi riduce il programma alla minima grandezza possibile eliminando appunto ciò che non contiene dati significativi.
Esistono due tipologie di packer in realtà: quelli chiamati “double disk checkin packer”, che lavorano in due passate, la prima fa una scansione degli op-code, la seconda legge nuovamente e verifica gli zeri. Un esempio di packer che fanno questo è il byg compactor+ e l’ unipacker.
La seconda tipologia è quella relativa ai packer singola passata: il programma viene caricato ed il packer comprime al volo usando tecniche di base. Chiaramente questo tipo di tool non sono potenti come i predecessori, ma sono comunque utili. Un esempio è lo sledgehammer.
Le tecniche di compressione adottate dai packer, sono comunque piu’ deboli rispetto ai cruncher, ad esempio la tecnica RLE, run lenght compression, agisce su sequenze di caratteri rimpiazzando queste sequenze con un singolo byte ed il numero di volte che il carattere viene ripetuto. Ad esempio AAAAAA verrà sostituito da xA6 dove x è il carattere di controllo che dirà allo scompattatore che i prossimi due byte rappresentano una RUN.
Cosa è invece un Crucher? Non ci discostiamo molto dai packer in realtà, ma troviamo un ratio di compressione migliore. Confrontati ai primi, questi sono più lenti e possono comprimere un programma singolo fino ad un massimo di 242 blocchi.
Il funzionamento è simile, il cruncher analizzerà il vostro programma, verificherà lo spazio sprecato che il programma ha lasciato e ridurrà ulteriormente la misura del file. I cruncher possono essere di diversi tipi, vi sonno i singlefile che utilizzano la tecnica one-pass, i quali compattano in modo veloce e diretto il vostro file. Alcuni esempi sono : time cruncher, equal sequence, power cruncher ed altri. Poi ci sono i cruel cruncher, che usano un sistema two-pass e questo fornisce risultati di compressione migliore, ma il tempo necessario era allora il doppio al confronto del singlefile cruncher.
Un tipo Cruel scansiona prima il codice e poi lo compatta in modalità second-pass. Esempi di alcuni tool di questo tipo sono: cross crueller, crestcrueller, the cruncher ab, byteboiler e molti altri.
A questo punto abbiamo visto le basi dei packer/cruncher ma dobbiamo conoscere bene un pò di esadecimale in quanto comunque si fa sempre riferimento ad indirizzi esadecimali, start address di un prg, nozioni base per utilizzare al meglio i compattatori.
Inserire un’immagine prima del caricamento del gioco utlizzando la Magic Cart
Un’altra cosa che si puo’ fare con le nostre Magic Cart o Magic Desk, e’ quella di prendere un gioco in formato prg, quindi singolo file, e convertirlo in bin. Questa conversione ci permettera’ di programmare la nostra cartuccia Magic e, al primo lancio veder partire il nostro gioco preferito.
Ora, per questo procedimento abbiamo bisogno che del programma PRG2CRT, approfondiremo poi come fare. Ma se avessimo anche il desiderio di aggiungere un’immagine all’inizio del caricamento ? Ebbene si, possiamo farlo con alcune routine assembler.
Per facilitarci il compito pero’, un membro di lemon64, pugsy , ha fornito un linker particolare chiamato Koalalinker.
Con il Koalalinker e’ possibile unire un’immagine Koala in formato prg ottenuta con l’action replay (abbiamo usato l’AR MK4) ed il nostro gioco in formato prg compresso con il tool Exomizer. Il risultato finale offerto è quello di avere un file prg che una volta caricato mostrerà una’immagine, quella che noi abbiamo scelto e dopo la pressione di un tasto caricherà il gioco che abbiamo voluto associare.
Le specifiche di utilizzo prevedono esattamente questa procedura, quindi il tutto non funzionera’ usando un metodo diverso oppure un compattatore alternativo come PUcruncher, che seppur ottimo, non predispone il file compresso con gli indirizzi di caricamento che il linker si aspetta.
Exomizer v3 lo trovare su CSDb, mentre per l’Action replay avrete bisogno del bin specifico della cartridge facilmente scaricabile da Pokefinder. Per le prove abbiamo usato la Action Replay MK4 1988 PAL.
Una volta che abbiamo il nostro file compresso ed il nostro file immagine in formato PRG, procediamo ad assemblare il tutto con il comando successivo, sempre da CMD:
KOALALINK.exe FileCompressoConExomizer.prg FileKoalaFormatoPRG.prg NomeFinaledelPRG.prg |
Il KoalaLinker e’ recuperabile dal thread di Lemon64 scene. Grazie a Pugsy per lo sviluppo.
Per un utilizzo diverso invece, allo scopo di comprimere i nostri prg per salvare spazio, ricordiamo anche una sintassi veloce del PUCrunch, altro packer molto noto e molto apprezzato. Potete trovarlo su CSDb in versione Amiga e Win32.
pucrunch.exe ProgrammaDaComprimere.prg ProgrammaCompresso.prg |
Qui una breve lista dei maggiori packer con le rispettive percentuali di ottimizzazione.
Packer | Size | Left | Comment |
---|---|---|---|
bs.bin | 41537 | ||
ByteBonker 1.5 | 27326 | 65.8% | Mode 4 |
Cruelcrunch 2.2 | 27136 | 65.3% | Mode 1 |
The AB Cruncher | 27020 | 65.1% | |
ByteBoiler (REU) | 26745 | 64.4% | |
RLE + ByteBoiler (REU) | 26654 | 64.2% | |
PuCrunch | 26300 | 63.3% | -m5 -fdelta |
delenn.bin | 47105 | ||
The AB Cruncher | N/A | N/A | Crashes |
ByteBonker 1.5 | 21029 | 44.6% | Mode 3 |
Cruelcrunch 2.2 | 20672 | 43.9% | Mode 1 |
ByteBoiler (REU) | 20371 | 43.2% | |
RLE + ByteBoiler (REU) | 19838 | 42.1% | |
PuCrunch | 19710 | 41.8% | -p2 -fshort |
sheridan.bin | 47105 | ||
ByteBonker 1.5 | 13661 | 29.0% | Mode 3 |
Cruelcrunch 2.2 | 13595 | 28.9% | Mode H |
The AB Cruncher | 13534 | 28.7% | |
ByteBoiler (REU) | 13308 | 28.3% | |
PuCrunch | 12502 | 26.6% | -p2 -fshort |
RLE + ByteBoiler (REU) | 12478 | 26.5% | |
ivanova.bin | 47105 | ||
ByteBonker 1.5 | 11016 | 23.4% | Mode 1 |
Cruelcrunch 2.2 | 10883 | 23.1% | Mode H |
The AB Cruncher | 10743 | 22.8% | |
ByteBoiler (REU) | 10550 | 22.4% | |
PuCrunch | 9820 | 20.9% | -p2 -fshort |
RLE + ByteBoiler (REU) | 9813 | 20.8% | |
LhA | 9543 | 20.3% | Decompressor not included |
gzip -9 | 9474 | 20.1% | Decompressor not included |
Ultimo passo per la creazione del file da programmare su Eprom
L’ultimo passo che ci consentirà di costruire il nostro gioco su cartuccia è quello di convertire il PRG ottenuto in un file BIN. Ci viene in aiuto il programma PRG2CRT che potete trovare sul sito di DDI Project.
La sintassi di utilizzo è semplice, basta avere a disposizione il file prg assemblato ed un sistema Windows XP per poter usare anche cartconv. Nota: il nome file da convertire non deve avere l’estensione PRG.
prg2crt.bat NomePRGdaConvertire |
Una volta effettuata l’operazione avrete in output due file, un bin ed un CRT. Quest’ultimo vi sarà utile per eseguire un test su Vice e verificare che il gioco parta correttamente, l’immagine si veda e la pressione della barra spaziatrice consenta il caricamento del secondo modulo ossia il gioco vero e proprio.
Risultato finale delle nostre operazioni
Il risultato su Galencia versione personale, sulla base del software acquistato da Protovision. La produzione si intende per uso personale a fini didattici e non utile alla rivendita nè in toto nè in parte.
Fasi di caricamento e decompattazione dei moduli che compongono la cartridge.
Quest’opera è distribuita con Licenza Creative Commons Attribuzione – Non commerciale – Non opere derivate 4.0 Internazionale.