static int crt_image_create(const imgtool_module *mod, imgtool_stream *f, const ResolvedOption *_options) { crt_header header={ "C64 CARTRIDGE " }; SET_ULONG(header.length, sizeof(header)); SET_UWORD(header.version, 0x100); SET_UWORD(header.hardware_type, _options[C64CRT_CREATEOPTION_HARDWARETYPE].i); header.game_line=_options[C64CRT_CREATEOPTION_GAMELINE].i; header.exrom_line=_options[C64CRT_CREATEOPTION_EXROMLINE].i; if (_options[C64CRT_CREATEOPTION_LABEL].s) strcpy(header.name, _options[C64CRT_CREATEOPTION_LABEL].s); return (stream_write(f, &header, sizeof(crt_header)) == sizeof(crt_header)) ? 0 : IMGTOOLERR_WRITEERROR; }
static int crt_image_writefile(imgtool_image *img, const char *fname, imgtool_stream *sourcef, const ResolvedOption *_options) { crt_image *image=(crt_image*)img; int size; int pos; size=stream_size(sourcef); if (!(pos=crt_image_findfile(image, fname)) ) { // appending pos=image->size; if (!(image->data=realloc(image->data, image->size+size+sizeof(crt_packet))) ) return IMGTOOLERR_OUTOFMEMORY; image->size+=size+sizeof(crt_packet); } else { int oldsize=GET_ULONG(PACKET(image,pos)->packet_length); // overwritting if (!(image->data=realloc(image->data, image->size+size+sizeof(crt_packet)-oldsize) ) ) return IMGTOOLERR_OUTOFMEMORY; if (image->size-pos-oldsize!=0) { memmove(image->data+pos+size+sizeof(crt_packet), image->data+pos+oldsize, image->size-pos-oldsize); } image->size+=size+sizeof(crt_packet)-oldsize; } if (stream_read(sourcef, image->data+pos+sizeof(crt_packet), size)!=size) { return IMGTOOLERR_READERROR; } memset(image->data+pos, 0, sizeof(crt_packet)); memcpy(PACKET(image,pos)->id,"CHIP",4); SET_ULONG( PACKET(image, pos)->packet_length, size+sizeof(crt_packet)); SET_UWORD(PACKET(image, pos)->chip_type, _options[C64CRT_FILEOPTION_FTYPE].i); SET_UWORD( PACKET(image, pos)->address, _options[C64CRT_FILEOPTION_FADDR].i); SET_UWORD( PACKET(image, pos)->bank, _options[C64CRT_FILEOPTION_FBANK].i); SET_UWORD( PACKET(image, pos)->length, size); image->modified=1; return 0; }
static int d64_image_writefile(imgtool_image *img, const char *fname, imgtool_stream *sourcef, const ResolvedOption *options_) { d64_image *image=(d64_image*)img; int fsize, pos, i, b, freespace; int track, sector; D64_ENTRY *entry; fsize=stream_size(sourcef)+1; img_freespace(img, &freespace); if ((entry=d64_image_findfile(image, (const unsigned char *)fname))!=NULL ) { /* overriding */ if ((freespace + GET_UWORD(entry->blocks))*254<fsize) return IMGTOOLERR_NOSPACE; track=entry->track; sector=entry->sector; while (track!=0) { image->free_sector(image, track, sector); pos = image->get_offset(track, sector); track=image->data[pos]; sector=image->data[pos+1]; } } else { if (freespace*254<fsize) return IMGTOOLERR_NOSPACE; // search free entry entry=d64_get_free_entry(image); } entry->type=FILE_TYPE_PRG|0x80; memset(entry->name, 0xa0, sizeof(entry->name)); memcpy(entry->name, fname, strlen(fname)); image->alloc_sector(image, &track, §or); entry->track=track; entry->sector=sector; pos = image->get_offset(track, sector); for (i = 0, b=0; i + 254 < fsize; i += 254, b++) { if (stream_read(sourcef, image->data+pos+2, 254)!=254) return IMGTOOLERR_READERROR; image->alloc_sector(image, &track, §or); image->data[pos]=track; image->data[pos+1]=sector; pos = image->get_offset (track, sector); } b++; image->data[pos]=0; image->data[pos+1]=fsize-i; if (fsize-i-1>0) { if (stream_read(sourcef, image->data+pos+2, fsize-i-1)!=fsize-i-1) return IMGTOOLERR_READERROR; } image->data[pos+2+fsize-i]=0; SET_UWORD(entry->blocks, b); image->modified=1; return 0; }