#include <stdio.h> // Posted by Karri unsigned char micro_loader_fb68_stage1[52]={ 0xff, 0x81, 0xca, 0x33, 0xbe, 0x80, 0xa2, 0xc4, 0x6d, 0x98, 0xfe, 0x8d, 0xbc, 0x66, 0xc0, 0x7a, 0x09, 0x50, 0x23, 0x28, 0x18, 0xc8, 0x06, 0x70, 0x58, 0x4f, 0x1b, 0xe1, 0xc7, 0x90, 0x08, 0xcd, 0x1a, 0x6e, 0x5a, 0x45, 0x32, 0xd7, 0x6d, 0xc6, 0x8a, 0xe5, 0xd8, 0x5c, 0xa0, 0xe8, 0x4f, 0x7a, 0x5f, 0x73, 0x8d, 0x22 }; // and the secondary loader that follows the encrypted loader unsigned char micro_loader_fb68_stage2[128+12+11]={ 0xa2, 0x00, 0xa0, 0x08, 0xad, 0xb2, 0xfc, 0x95, 0x26, 0xe8, 0x88, 0xd0, 0xf7, 0xa5, 0x26, 0x85, 0x2e, 0x20, 0xca, 0xfb, 0xa5, 0x28, 0x49, 0xff, 0xa8, 0xa5, 0x27, 0x49, 0xff, 0xaa, 0x20, 0xa1, 0xfb, 0xa5, 0x2a, 0xa6, 0x2b, 0x85, 0x31, 0x86, 0x32, 0xa5, 0x2d, 0x49, 0xff, 0xa8, 0xa5, 0x2c, 0x49, 0xff, 0xaa, 0x20, 0xac, 0xfb, 0x6c, 0x2a, 0x00, 0xe8, 0xd0, 0x03, 0xc8, 0xf0, 0x57, 0x20, 0xbf, 0xfb, 0x80, 0xf5, 0xe8, 0xd0, 0x03, 0xc8, 0xf0, 0x4c, 0x20, 0xbf, 0xfb, 0x92, 0x31, 0xe6, 0x31, 0xd0, 0xf1, 0xe6, 0x32, 0x80, 0xed, 0xad, 0xb2, 0xfc, 0xe6, 0x2f, 0xd0, 0x38, 0xe6, 0x30, 0xd0, 0x34, 0x48, 0xda, 0x5a, 0xa5, 0x1a, 0x29, 0xfc, 0xa8, 0x09, 0x02, 0xaa, 0xa5, 0x2e, 0xe6, 0x2e, 0x38, 0x80, 0x0b, 0x90, 0x04, 0x8e, 0x8b, 0xfd, 0x18, 0xe8, 0x8e, 0x87, 0xfd, 0xca, 0x8e, 0x87, 0xfd, 0x2a, 0x8c, 0x8b, 0xfd, 0xd0, 0xec, 0xa5, 0x1a, 0x8d, 0x8b, 0xfd, 0x64, 0x2f, 0xa9, 0xfe, 0x85, 0x30, 0x7a, 0xfa, 0x68, 0x60 };// ^^^^ // After the secondary loader you need one directory entry: // // 00 = block number // d3 00 = offset $00d3 // 88 = dummy byte // 00 02 = start address in RAM $0200 // 07 10 = length of binary to load $1007 // // Then you just append your binary code you want to load. // // You can change the start address and length to match your code. // // The last fe in the secondary loader should be different for different cart types. // // fe = 128k cart // fc = 256k cart // f8 = 512k cart void main(int argv,char **argc) { FILE *fh_in; FILE *fh_out; int a, b; if(argv==3){ fh_in =fopen(argc[1],"rb"); fh_out=fopen(argc[2],"wb+"); for (int i=0; i< 52; i++) fputc( micro_loader_fb68_stage1[i], fh_out); for (int i=0; i<151; i++) fputc( micro_loader_fb68_stage2[i], fh_out); // now comes the first dir entry in EPYX format! @ 203 fputc( 0x00, fh_out); fputc( 0xd3, fh_out); fputc( 0x00, fh_out); fputc( 0x88, fh_out); // data[203+0] = 0x00; // block nr =0 (fix) // data[203+1] = 0xd3; // offset lo = 211 (203+8) (fix) // data[203+2] = 0x00; // offset hi = 0 (fix) // data[203+3] = 0x88; // flag executeable (fix) fgetc( fh_in); // skip fgetc( fh_in); // skip a=fgetc( fh_in); b=fgetc( fh_in); fputc( b, fh_out); // inverse fputc( a, fh_out); // data[203+4] = file_data[3]; // load addr lo // data[203+5] = file_data[2]; // load addr hi a=fgetc( fh_in); // actually, we have to subtract 10 here (headerlength!) buts does it matter if he load 10 bytes more!? b=fgetc( fh_in); fputc( b, fh_out); // inverse fputc( a, fh_out); // data[203+6] = file_date[5];// length lo should be (size-8) // data[203+7] = file_date[4];// length hi should be (size-8) fgetc( fh_in); // skip fgetc( fh_in); // skip fgetc( fh_in); // skip fgetc( fh_in); // skip while(!feof( fh_in)){ a=fgetc( fh_in); if( feof( fh_in)) break; fputc( a, fh_out); } fclose( fh_in); fclose( fh_out); } }