static void crt_image_info(imgtool_image *img, char *string, const int len) { crt_image *image=(crt_image*)img; sprintf(string, "%-32s\nversion:%.4x type:%d:%s exrom:%d game:%d", HEADER(image)->name, GET_UWORD(HEADER(image)->version), GET_UWORD(HEADER(image)->hardware_type), hardware_types[GET_UWORD(HEADER(image)->hardware_type)], HEADER(image)->exrom_line, HEADER(image)->game_line); return; }
static void lynx_image_info(imgtool_image *img, char *string, const int len) { lynx_image *image=(lynx_image*)img; char dostext_with_null[33]= { 0 }; char name_with_null[25]={ 0 }; strncpy(dostext_with_null, HEADER(image)->dostext, 32); strncpy(name_with_null, HEADER(image)->description, 24); sprintf(string,"%s\n%s\nversion:%.4x max entries:%d", dostext_with_null, name_with_null, GET_UWORD(HEADER(image)->version), HEADER(image)->max_entries); }
static int crt_image_nextenum(imgtool_directory *enumeration, imgtool_dirent *ent) { crt_iterator *iter=(crt_iterator*)enumeration; ent->corrupt=0; if (!(ent->eof=(iter->pos>=iter->image->size))) { sprintf(ent->fname,"%d", iter->number); ent->filesize=GET_UWORD( PACKET(iter->image, iter->pos)->length ); if (ent->attr) { unsigned crc=crc32(0, iter->image->data+iter->pos+sizeof(crt_packet), ent->filesize); sprintf(ent->attr,"%-4s %s bank:%-2d addr:%.4x crc:%8x", (char*)PACKET(iter->image, iter->pos), chip_types[GET_UWORD(PACKET(iter->image,iter->pos)->chip_type)], GET_UWORD( PACKET(iter->image,iter->pos)->bank), GET_UWORD( PACKET(iter->image,iter->pos)->address), crc); } iter->number++; iter->pos+=GET_ULONG( PACKET(iter->image, iter->pos)->packet_length ); } return 0; }
static int crt_image_readfile(imgtool_image *img, const char *fname, imgtool_stream *destf) { crt_image *image=(crt_image*)img; int size; int pos; if (!(pos=crt_image_findfile(image, fname)) ) return IMGTOOLERR_MODULENOTFOUND; size=GET_UWORD( PACKET(image, pos)->length ); if (stream_write(destf, image->data+pos+sizeof(crt_packet), size)!=size) { return IMGTOOLERR_WRITEERROR; } 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; }