static int read_rom_data(romload_private *romdata, const rom_entry *parent_region, const rom_entry *romp) { int datashift = ROM_GETBITSHIFT(romp); int datamask = ((1 << ROM_GETBITWIDTH(romp)) - 1) << datashift; int numbytes = ROM_GETLENGTH(romp); int groupsize = ROM_GETGROUPSIZE(romp); int skip = ROM_GETSKIPCOUNT(romp); int reversed = ROM_ISREVERSED(romp); int numgroups = (numbytes + groupsize - 1) / groupsize; UINT8 *base = romdata->region->base() + ROM_GETOFFSET(romp); UINT32 tempbufsize; int i; LOG(("Loading ROM data: offs=%X len=%X mask=%02X group=%d skip=%d reverse=%d\n", ROM_GETOFFSET(romp), numbytes, datamask, groupsize, skip, reversed)); /* make sure the length was an even multiple of the group size */ if (numbytes % groupsize != 0) mame_printf_warning("Warning in RomModule definition: %s length not an even multiple of group size\n", ROM_GETNAME(romp)); /* make sure we only fill within the region space */ if (ROM_GETOFFSET(romp) + numgroups * groupsize + (numgroups - 1) * skip > romdata->region->bytes()) fatalerror("Error in RomModule definition: %s out of memory region space\n", ROM_GETNAME(romp)); /* make sure the length was valid */ if (numbytes == 0) fatalerror("Error in RomModule definition: %s has an invalid length\n", ROM_GETNAME(romp)); /* special case for simple loads */ if (datamask == 0xff && (groupsize == 1 || !reversed) && skip == 0) return rom_fread(romdata, base, numbytes, parent_region); /* use a temporary buffer for complex loads */ tempbufsize = MIN(TEMPBUFFER_MAX_SIZE, numbytes); dynamic_buffer tempbuf(tempbufsize); /* chunky reads for complex loads */ skip += groupsize; while (numbytes > 0) { int evengroupcount = (tempbufsize / groupsize) * groupsize; int bytesleft = (numbytes > evengroupcount) ? evengroupcount : numbytes; UINT8 *bufptr = tempbuf; /* read as much as we can */ LOG((" Reading %X bytes into buffer\n", bytesleft)); if (rom_fread(romdata, bufptr, bytesleft, parent_region) != bytesleft) return 0; numbytes -= bytesleft; LOG((" Copying to %p\n", base)); /* unmasked cases */ if (datamask == 0xff) { /* non-grouped data */ if (groupsize == 1) for (i = 0; i < bytesleft; i++, base += skip) *base = *bufptr++; /* grouped data -- non-reversed case */ else if (!reversed) while (bytesleft) { for (i = 0; i < groupsize && bytesleft; i++, bytesleft--) base[i] = *bufptr++; base += skip; } /* grouped data -- reversed case */ else while (bytesleft) { for (i = groupsize - 1; i >= 0 && bytesleft; i--, bytesleft--) base[i] = *bufptr++; base += skip; } } /* masked cases */ else { /* non-grouped data */ if (groupsize == 1) for (i = 0; i < bytesleft; i++, base += skip) *base = (*base & ~datamask) | ((*bufptr++ << datashift) & datamask); /* grouped data -- non-reversed case */ else if (!reversed) while (bytesleft) { for (i = 0; i < groupsize && bytesleft; i++, bytesleft--) base[i] = (base[i] & ~datamask) | ((*bufptr++ << datashift) & datamask); base += skip; } /* grouped data -- reversed case */ else while (bytesleft) { for (i = groupsize - 1; i >= 0 && bytesleft; i--, bytesleft--) base[i] = (base[i] & ~datamask) | ((*bufptr++ << datashift) & datamask); base += skip; } } } LOG((" All done\n")); return ROM_GETLENGTH(romp); }
static int read_rom_data(struct rom_load_data *romdata, const struct RomModule *romp) { int datashift = ROM_GETBITSHIFT(romp); int datamask = ((1 << ROM_GETBITWIDTH(romp)) - 1) << datashift; int numbytes = ROM_GETLENGTH(romp); int groupsize = ROM_GETGROUPSIZE(romp); int skip = ROM_GETSKIPCOUNT(romp); int reversed = ROM_ISREVERSED(romp); int numgroups = (numbytes + groupsize - 1) / groupsize; UINT8 *base = romdata->regionbase + ROM_GETOFFSET(romp); int i; debugload("Loading ROM data: offs=%X len=%X mask=%02X group=%d skip=%d reverse=%d\n", ROM_GETOFFSET(romp), numbytes, datamask, groupsize, skip, reversed); /* make sure the length was an even multiple of the group size */ if (numbytes % groupsize != 0) { printf("Error in RomModule definition: %s length not an even multiple of group size\n", ROM_GETNAME(romp)); return -1; } /* make sure we only fill within the region space */ if (ROM_GETOFFSET(romp) + numgroups * groupsize + (numgroups - 1) * skip > romdata->regionlength) { printf("Error in RomModule definition: %s out of memory region space\n", ROM_GETNAME(romp)); return -1; } /* make sure the length was valid */ if (numbytes == 0) { printf("Error in RomModule definition: %s has an invalid length\n", ROM_GETNAME(romp)); return -1; } /* special case for simple loads */ if (datamask == 0xff && (groupsize == 1 || !reversed) && skip == 0) return rom_fread(romdata, base, numbytes); /* chunky reads for complex loads */ skip += groupsize; while (numbytes) { int evengroupcount = (sizeof(romdata->tempbuf) / groupsize) * groupsize; int bytesleft = (numbytes > evengroupcount) ? evengroupcount : numbytes; UINT8 *bufptr = romdata->tempbuf; /* read as much as we can */ debugload(" Reading %X bytes into buffer\n", bytesleft); if (rom_fread(romdata, romdata->tempbuf, bytesleft) != bytesleft) return 0; numbytes -= bytesleft; debugload(" Copying to %08X\n", (int)base); /* unmasked cases */ if (datamask == 0xff) { /* non-grouped data */ if (groupsize == 1) for (i = 0; i < bytesleft; i++, base += skip) *base = *bufptr++; /* grouped data -- non-reversed case */ else if (!reversed) while (bytesleft) { for (i = 0; i < groupsize && bytesleft; i++, bytesleft--) base[i] = *bufptr++; base += skip; } /* grouped data -- reversed case */ else while (bytesleft) { for (i = groupsize - 1; i >= 0 && bytesleft; i--, bytesleft--) base[i] = *bufptr++; base += skip; } } /* masked cases */ else { /* non-grouped data */ if (groupsize == 1) for (i = 0; i < bytesleft; i++, base += skip) *base = (*base & ~datamask) | ((*bufptr++ << datashift) & datamask); /* grouped data -- non-reversed case */ else if (!reversed) while (bytesleft) { for (i = 0; i < groupsize && bytesleft; i++, bytesleft--) base[i] = (base[i] & ~datamask) | ((*bufptr++ << datashift) & datamask); base += skip; } /* grouped data -- reversed case */ else while (bytesleft) { for (i = groupsize - 1; i >= 0 && bytesleft; i--, bytesleft--) base[i] = (base[i] & ~datamask) | ((*bufptr++ << datashift) & datamask); base += skip; } } } debugload(" All done\n"); return ROM_GETLENGTH(romp); }