mirror of
https://github.com/holub/mame
synced 2025-06-09 14:22:41 +03:00

This handler works for both disc-only games and those with overlays. For disc-only games, the base macro is sufficient. For games with overlays, an additional set of configuration macros are provided: MDRV_LASERDISC_OVERLAY - specifies update function, width, height, and bitmap format of the overlay MDRV_LASERDISC_OVERLAY_CLIP - specifies the visible area of the overlay bitmap MDRV_LASERDISC_OVERLAY_POSITION - specifies default x,y position MDRV_LASERDISC_OVERLAY_SCALE - specifies default x,y scale factors The update function provided to MDRV_LASERDISC_OVERLAY is identical to a normal VIDEO_UPDATE callback, so a standard one can be used. All existing laserdisc drivers have been updated to support this new rendering mechanism, removing much duplicated code. Added the ability to configure the overlay position and scale parameters at runtime. Added OSD menus to control them. Added logic to save/restore the data in the game's configuration file. Added new macros MDRV_LASERDISC_SCREEN_ADD_NTSC and _PAL, which defines a standard screen with the correct video timing characteristics and update function for laserdiscs. Updated all drivers to use these macros instead of defining their own screens. Added DISK_REGIONS to all laserdisc drivers. Added DISK_IMAGE_READONLY_OPTIONAL to support games (like Cube Quest) where the disk is non-essential to the game's operation. Fixed bug in identifying the custom sound driver for the laserdisc. Updated ldverify to identify blank regions of the disc for post- processing. Fixed rendering 16bpp with alpha using bilinear filters (fixes screenshots of laserdisc games with overlays). Included support for parsing .gdi files in chdman. [ElSemi] Added new driver for Cube Quest. This includes CPU cores for the three bitslice processors, as well as laserdisc support for the hacked laserdisc that was used to drive the games. [Philip Bennett, Joe Magiera, Warren Ondras] Note that the SHA1/MD5 for the laserdisc will likely undergo at least one more change before being finalized.
297 lines
14 KiB
C
297 lines
14 KiB
C
/*********************************************************************
|
|
|
|
romload.h
|
|
|
|
ROM loading functions.
|
|
|
|
Copyright Nicola Salmoria and the MAME Team.
|
|
Visit http://mamedev.org for licensing and usage restrictions.
|
|
|
|
*********************************************************************/
|
|
|
|
#pragma once
|
|
|
|
#ifndef __ROMLOAD_H__
|
|
#define __ROMLOAD_H__
|
|
|
|
#include "mamecore.h"
|
|
#include "chd.h"
|
|
#include "options.h"
|
|
|
|
|
|
|
|
/***************************************************************************
|
|
CONSTANTS
|
|
***************************************************************************/
|
|
|
|
/* ----- type constants ----- */
|
|
#define ROMENTRY_TYPEMASK 0x0000000f /* type of entry */
|
|
enum
|
|
{
|
|
ROMENTRYTYPE_ROM = 0, /* this entry is an actual ROM definition */
|
|
ROMENTRYTYPE_REGION, /* this entry marks the start of a region */
|
|
ROMENTRYTYPE_END, /* this entry marks the end of a region */
|
|
ROMENTRYTYPE_RELOAD, /* this entry reloads the previous ROM */
|
|
ROMENTRYTYPE_CONTINUE, /* this entry continues loading the previous ROM */
|
|
ROMENTRYTYPE_FILL, /* this entry fills an area with a constant value */
|
|
ROMENTRYTYPE_COPY, /* this entry copies data from another region/offset */
|
|
ROMENTRYTYPE_CARTRIDGE, /* this entry specifies a cartridge (MESS) */
|
|
ROMENTRYTYPE_IGNORE, /* this entry continues loading the previous ROM but throws the data away */
|
|
ROMENTRYTYPE_SYSTEM_BIOS, /* this entry specifies a bios */
|
|
ROMENTRYTYPE_COUNT
|
|
};
|
|
|
|
/* ----- per-region constants ----- */
|
|
#define ROMREGION_WIDTHMASK 0x00000300 /* native width of region, as power of 2 */
|
|
#define ROMREGION_8BIT 0x00000000 /* (non-CPU regions only) */
|
|
#define ROMREGION_16BIT 0x00000100
|
|
#define ROMREGION_32BIT 0x00000200
|
|
#define ROMREGION_64BIT 0x00000300
|
|
|
|
#define ROMREGION_ENDIANMASK 0x00000400 /* endianness of the region */
|
|
#define ROMREGION_LE 0x00000000 /* (non-CPU regions only) */
|
|
#define ROMREGION_BE 0x00000400
|
|
|
|
#define ROMREGION_INVERTMASK 0x00000800 /* invert the bits of the region */
|
|
#define ROMREGION_NOINVERT 0x00000000
|
|
#define ROMREGION_INVERT 0x00000800
|
|
|
|
#define ROMREGION_DISPOSEMASK 0x00001000 /* dispose of the region after init */
|
|
#define ROMREGION_NODISPOSE 0x00000000
|
|
#define ROMREGION_DISPOSE 0x00001000
|
|
|
|
#define ROMREGION_ERASEMASK 0x00002000 /* erase the region before loading */
|
|
#define ROMREGION_NOERASE 0x00000000
|
|
#define ROMREGION_ERASE 0x00002000
|
|
|
|
#define ROMREGION_DATATYPEMASK 0x00004000 /* type of region (ROM versus disk) */
|
|
#define ROMREGION_DATATYPEROM 0x00000000
|
|
#define ROMREGION_DATATYPEDISK 0x00004000
|
|
|
|
#define ROMREGION_ERASEVALMASK 0x00ff0000 /* value to erase the region to */
|
|
#define ROMREGION_ERASEVAL(x) ((((x) & 0xff) << 16) | ROMREGION_ERASE)
|
|
#define ROMREGION_ERASE00 ROMREGION_ERASEVAL(0)
|
|
#define ROMREGION_ERASEFF ROMREGION_ERASEVAL(0xff)
|
|
|
|
|
|
/* ----- per-ROM constants ----- */
|
|
#define DISK_READONLYMASK 0x00000010 /* is the disk read-only? */
|
|
#define DISK_READWRITE 0x00000000
|
|
#define DISK_READONLY 0x00000010
|
|
|
|
#define ROM_OPTIONALMASK 0x00000020 /* optional - won't hurt if it's not there */
|
|
#define ROM_REQUIRED 0x00000000
|
|
#define ROM_OPTIONAL 0x00000020
|
|
|
|
#define ROM_REVERSEMASK 0x00000040 /* reverse the byte order within a group */
|
|
#define ROM_NOREVERSE 0x00000000
|
|
#define ROM_REVERSE 0x00000040
|
|
|
|
#define ROM_INHERITFLAGSMASK 0x00000080 /* inherit all flags from previous definition */
|
|
#define ROM_INHERITFLAGS 0x00000080
|
|
|
|
#define ROM_GROUPMASK 0x00000f00 /* load data in groups of this size + 1 */
|
|
#define ROM_GROUPSIZE(n) ((((n) - 1) & 15) << 8)
|
|
#define ROM_GROUPBYTE ROM_GROUPSIZE(1)
|
|
#define ROM_GROUPWORD ROM_GROUPSIZE(2)
|
|
#define ROM_GROUPDWORD ROM_GROUPSIZE(4)
|
|
|
|
#define ROM_SKIPMASK 0x0000f000 /* skip this many bytes after each group */
|
|
#define ROM_SKIP(n) (((n) & 15) << 12)
|
|
#define ROM_NOSKIP ROM_SKIP(0)
|
|
|
|
#define ROM_BITWIDTHMASK 0x000f0000 /* width of data in bits */
|
|
#define ROM_BITWIDTH(n) (((n) & 15) << 16)
|
|
#define ROM_NIBBLE ROM_BITWIDTH(4)
|
|
#define ROM_FULLBYTE ROM_BITWIDTH(8)
|
|
|
|
#define ROM_BITSHIFTMASK 0x00f00000 /* left-shift count for the bits */
|
|
#define ROM_BITSHIFT(n) (((n) & 15) << 20)
|
|
#define ROM_NOSHIFT ROM_BITSHIFT(0)
|
|
#define ROM_SHIFT_NIBBLE_LO ROM_BITSHIFT(0)
|
|
#define ROM_SHIFT_NIBBLE_HI ROM_BITSHIFT(4)
|
|
|
|
#define ROM_BIOSFLAGSMASK 0xff000000 /* only loaded if value matches global bios value */
|
|
#define ROM_BIOS(n) (((n) & 255) << 24)
|
|
|
|
#define ROM_INHERITEDFLAGS (ROM_GROUPMASK | ROM_SKIPMASK | ROM_REVERSEMASK | ROM_BITWIDTHMASK | ROM_BITSHIFTMASK | ROM_BIOSFLAGSMASK)
|
|
|
|
|
|
|
|
/***************************************************************************
|
|
TYPE DEFINITIONS
|
|
***************************************************************************/
|
|
|
|
typedef struct _rom_entry rom_entry;
|
|
struct _rom_entry
|
|
{
|
|
const char * _name; /* name of the file to load */
|
|
const char * _hashdata; /* hashing informations (checksums) */
|
|
UINT32 _offset; /* offset to load it to */
|
|
UINT32 _length; /* length of the file */
|
|
UINT32 _flags; /* flags */
|
|
};
|
|
|
|
|
|
/* In mamecore.h: typedef struct _rom_load_data rom_load_data; */
|
|
struct _rom_load_data
|
|
{
|
|
int warnings; /* warning count during processing */
|
|
int errors; /* error count during processing */
|
|
|
|
int romsloaded; /* current ROMs loaded count */
|
|
int romstotal; /* total number of ROMs to read */
|
|
|
|
mame_file * file; /* current file */
|
|
|
|
UINT8 * regionbase; /* base of current region */
|
|
UINT32 regionlength; /* length of current region */
|
|
|
|
char errorbuf[4096]; /* accumulated errors */
|
|
UINT8 tempbuf[65536]; /* temporary buffer */
|
|
};
|
|
|
|
|
|
|
|
/***************************************************************************
|
|
MACROS
|
|
***************************************************************************/
|
|
|
|
/* ----- per-entry macros ----- */
|
|
#define ROMENTRY_GETTYPE(r) ((r)->_flags & ROMENTRY_TYPEMASK)
|
|
#define ROMENTRY_ISSPECIAL(r) (ROMENTRY_GETTYPE(r) != ROMENTRYTYPE_ROM)
|
|
#define ROMENTRY_ISFILE(r) (ROMENTRY_GETTYPE(r) == ROMENTRYTYPE_ROM)
|
|
#define ROMENTRY_ISREGION(r) (ROMENTRY_GETTYPE(r) == ROMENTRYTYPE_REGION)
|
|
#define ROMENTRY_ISEND(r) (ROMENTRY_GETTYPE(r) == ROMENTRYTYPE_END)
|
|
#define ROMENTRY_ISRELOAD(r) (ROMENTRY_GETTYPE(r) == ROMENTRYTYPE_RELOAD)
|
|
#define ROMENTRY_ISCONTINUE(r) (ROMENTRY_GETTYPE(r) == ROMENTRYTYPE_CONTINUE)
|
|
#define ROMENTRY_ISFILL(r) (ROMENTRY_GETTYPE(r) == ROMENTRYTYPE_FILL)
|
|
#define ROMENTRY_ISCOPY(r) (ROMENTRY_GETTYPE(r) == ROMENTRYTYPE_COPY)
|
|
#define ROMENTRY_ISIGNORE(r) (ROMENTRY_GETTYPE(r) == ROMENTRYTYPE_IGNORE)
|
|
#define ROMENTRY_ISSYSTEM_BIOS(r) (ROMENTRY_GETTYPE(r) == ROMENTRYTYPE_SYSTEM_BIOS)
|
|
#define ROMENTRY_ISREGIONEND(r) (ROMENTRY_ISREGION(r) || ROMENTRY_ISEND(r))
|
|
|
|
/* ----- per-region macros ----- */
|
|
#define ROMREGION_GETTAG(r) ((r)->_name)
|
|
#define ROMREGION_GETLENGTH(r) ((r)->_length)
|
|
#define ROMREGION_GETFLAGS(r) ((r)->_flags)
|
|
#define ROMREGION_GETWIDTH(r) (8 << ((ROMREGION_GETFLAGS(r) & ROMREGION_WIDTHMASK) >> 8))
|
|
#define ROMREGION_ISLITTLEENDIAN(r) ((ROMREGION_GETFLAGS(r) & ROMREGION_ENDIANMASK) == ROMREGION_LE)
|
|
#define ROMREGION_ISBIGENDIAN(r) ((ROMREGION_GETFLAGS(r) & ROMREGION_ENDIANMASK) == ROMREGION_BE)
|
|
#define ROMREGION_ISINVERTED(r) ((ROMREGION_GETFLAGS(r) & ROMREGION_INVERTMASK) == ROMREGION_INVERT)
|
|
#define ROMREGION_ISDISPOSE(r) ((ROMREGION_GETFLAGS(r) & ROMREGION_DISPOSEMASK) == ROMREGION_DISPOSE)
|
|
#define ROMREGION_ISERASE(r) ((ROMREGION_GETFLAGS(r) & ROMREGION_ERASEMASK) == ROMREGION_ERASE)
|
|
#define ROMREGION_GETERASEVAL(r) ((ROMREGION_GETFLAGS(r) & ROMREGION_ERASEVALMASK) >> 16)
|
|
#define ROMREGION_GETDATATYPE(r) (ROMREGION_GETFLAGS(r) & ROMREGION_DATATYPEMASK)
|
|
#define ROMREGION_ISROMDATA(r) (ROMREGION_GETDATATYPE(r) == ROMREGION_DATATYPEROM)
|
|
#define ROMREGION_ISDISKDATA(r) (ROMREGION_GETDATATYPE(r) == ROMREGION_DATATYPEDISK)
|
|
|
|
|
|
/* ----- per-ROM macros ----- */
|
|
#define ROM_GETNAME(r) ((r)->_name)
|
|
#define ROM_SAFEGETNAME(r) (ROMENTRY_ISFILL(r) ? "fill" : ROMENTRY_ISCOPY(r) ? "copy" : ROM_GETNAME(r))
|
|
#define ROM_GETOFFSET(r) ((r)->_offset)
|
|
#define ROM_GETLENGTH(r) ((r)->_length)
|
|
#define ROM_GETFLAGS(r) ((r)->_flags)
|
|
#define ROM_GETHASHDATA(r) ((r)->_hashdata)
|
|
#define ROM_ISOPTIONAL(r) ((ROM_GETFLAGS(r) & ROM_OPTIONALMASK) == ROM_OPTIONAL)
|
|
#define ROM_GETGROUPSIZE(r) (((ROM_GETFLAGS(r) & ROM_GROUPMASK) >> 8) + 1)
|
|
#define ROM_GETSKIPCOUNT(r) ((ROM_GETFLAGS(r) & ROM_SKIPMASK) >> 12)
|
|
#define ROM_ISREVERSED(r) ((ROM_GETFLAGS(r) & ROM_REVERSEMASK) == ROM_REVERSE)
|
|
#define ROM_GETBITWIDTH(r) (((ROM_GETFLAGS(r) & ROM_BITWIDTHMASK) >> 16) + 8 * ((ROM_GETFLAGS(r) & ROM_BITWIDTHMASK) == 0))
|
|
#define ROM_GETBITSHIFT(r) ((ROM_GETFLAGS(r) & ROM_BITSHIFTMASK) >> 20)
|
|
#define ROM_INHERITSFLAGS(r) ((ROM_GETFLAGS(r) & ROM_INHERITFLAGSMASK) == ROM_INHERITFLAGS)
|
|
#define ROM_GETBIOSFLAGS(r) ((ROM_GETFLAGS(r) & ROM_BIOSFLAGSMASK) >> 24)
|
|
#define ROM_NOGOODDUMP(r) (hash_data_has_info((r)->_hashdata, HASH_INFO_NO_DUMP))
|
|
|
|
|
|
/* ----- per-disk macros ----- */
|
|
#define DISK_GETINDEX(r) ((r)->_offset)
|
|
#define DISK_ISREADONLY(r) ((ROM_GETFLAGS(r) & DISK_READONLYMASK) == DISK_READONLY)
|
|
#define DISK_ISOPTIONAL(r) ((ROM_GETFLAGS(r) & ROM_OPTIONALMASK) == ROM_OPTIONAL)
|
|
|
|
|
|
/* ----- start/stop macros ----- */
|
|
#define ROM_START(name) static const rom_entry rom_##name[] = {
|
|
#define ROM_END { NULL, NULL, 0, 0, ROMENTRYTYPE_END } };
|
|
|
|
|
|
/* ----- ROM region macros ----- */
|
|
#define ROM_REGION(length,tag,flags) { tag, NULL, 0, length, ROMENTRYTYPE_REGION | (flags) },
|
|
#define ROM_REGION16_LE(length,tag,flags) ROM_REGION(length, tag, (flags) | ROMREGION_16BIT | ROMREGION_LE)
|
|
#define ROM_REGION16_BE(length,tag,flags) ROM_REGION(length, tag, (flags) | ROMREGION_16BIT | ROMREGION_BE)
|
|
#define ROM_REGION32_LE(length,tag,flags) ROM_REGION(length, tag, (flags) | ROMREGION_32BIT | ROMREGION_LE)
|
|
#define ROM_REGION32_BE(length,tag,flags) ROM_REGION(length, tag, (flags) | ROMREGION_32BIT | ROMREGION_BE)
|
|
#define ROM_REGION64_LE(length,tag,flags) ROM_REGION(length, tag, (flags) | ROMREGION_64BIT | ROMREGION_LE)
|
|
#define ROM_REGION64_BE(length,tag,flags) ROM_REGION(length, tag, (flags) | ROMREGION_64BIT | ROMREGION_BE)
|
|
|
|
|
|
/* ----- core ROM loading macros ----- */
|
|
#define ROMX_LOAD(name,offset,length,hash,flags) { name, hash, offset, length, ROMENTRYTYPE_ROM | (flags) },
|
|
#define ROM_LOAD(name,offset,length,hash) ROMX_LOAD(name, offset, length, hash, 0)
|
|
#define ROM_LOAD_OPTIONAL(name,offset,length,hash) ROMX_LOAD(name, offset, length, hash, ROM_OPTIONAL)
|
|
|
|
|
|
/* ----- specialized loading macros ----- */
|
|
#define ROM_LOAD_NIB_HIGH(name,offset,length,hash) ROMX_LOAD(name, offset, length, hash, ROM_NIBBLE | ROM_SHIFT_NIBBLE_HI)
|
|
#define ROM_LOAD_NIB_LOW(name,offset,length,hash) ROMX_LOAD(name, offset, length, hash, ROM_NIBBLE | ROM_SHIFT_NIBBLE_LO)
|
|
#define ROM_LOAD16_BYTE(name,offset,length,hash) ROMX_LOAD(name, offset, length, hash, ROM_SKIP(1))
|
|
#define ROM_LOAD16_WORD(name,offset,length,hash) ROM_LOAD(name, offset, length, hash)
|
|
#define ROM_LOAD16_WORD_SWAP(name,offset,length,hash) ROMX_LOAD(name, offset, length, hash, ROM_GROUPWORD | ROM_REVERSE)
|
|
#define ROM_LOAD32_BYTE(name,offset,length,hash) ROMX_LOAD(name, offset, length, hash, ROM_SKIP(3))
|
|
#define ROM_LOAD32_WORD(name,offset,length,hash) ROMX_LOAD(name, offset, length, hash, ROM_GROUPWORD | ROM_SKIP(2))
|
|
#define ROM_LOAD32_WORD_SWAP(name,offset,length,hash) ROMX_LOAD(name, offset, length, hash, ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2))
|
|
#define ROM_LOAD32_DWORD(name,offset,length,hash) ROMX_LOAD(name, offset, length, hash, ROM_GROUPDWORD)
|
|
|
|
|
|
/* ----- additional ROM-related macros ----- */
|
|
#define ROM_CONTINUE(offset,length) { NULL, NULL, offset, length, ROMENTRYTYPE_CONTINUE | ROM_INHERITFLAGS },
|
|
#define ROM_RELOAD(offset,length) { NULL, NULL, offset, length, ROMENTRYTYPE_RELOAD | ROM_INHERITFLAGS },
|
|
#define ROM_IGNORE(length) { NULL, NULL, 0, length, ROMENTRYTYPE_IGNORE | ROM_INHERITFLAGS },
|
|
#define ROM_FILL(offset,length,value) { NULL, (const char *)value, offset, length, ROMENTRYTYPE_FILL },
|
|
#define ROM_COPY(srctag,srcoffs,offset,length) { srctag, (const char *)srcoffs, offset, length, ROMENTRYTYPE_COPY },
|
|
|
|
|
|
/* ----- system BIOS macros ----- */
|
|
#define ROM_SYSTEM_BIOS(value,name,description) { name, description, 0, 0, ROMENTRYTYPE_SYSTEM_BIOS | ROM_BIOS(value+1) },
|
|
|
|
|
|
/* ----- disk loading macros ----- */
|
|
#define DISK_REGION(tag) ROM_REGION(1, tag, ROMREGION_DATATYPEDISK)
|
|
#define DISK_IMAGE(name,idx,hash) ROMX_LOAD(name, idx, 0, hash, DISK_READWRITE)
|
|
#define DISK_IMAGE_READONLY(name,idx,hash) ROMX_LOAD(name, idx, 0, hash, DISK_READONLY)
|
|
#define DISK_IMAGE_READONLY_OPTIONAL(name,idx,hash) ROMX_LOAD(name, idx, 0, hash, DISK_READONLY | ROM_OPTIONAL)
|
|
|
|
|
|
/* ----- hash macros ----- */
|
|
#define CRC(x) "c:" #x "#"
|
|
#define SHA1(x) "s:" #x "#"
|
|
#define MD5(x) "m:" #x "#"
|
|
#define NO_DUMP "$ND$"
|
|
#define BAD_DUMP "$BD$"
|
|
|
|
|
|
|
|
/***************************************************************************
|
|
FUNCTION PROTOTYPES
|
|
***************************************************************************/
|
|
|
|
/* disk handling */
|
|
chd_error open_disk_image(const game_driver *gamedrv, const rom_entry *romp, mame_file **image_file, chd_file **image_chd);
|
|
chd_error open_disk_image_options(core_options *options, const game_driver *gamedrv, const rom_entry *romp, mame_file **image_file, chd_file **image_chd);
|
|
chd_file *get_disk_handle(const char *region);
|
|
void set_disk_handle(const char *region, mame_file *file, chd_file *chd);
|
|
|
|
/* ROM processing */
|
|
void rom_init(running_machine *machine, const rom_entry *romp);
|
|
int rom_load_warnings(void);
|
|
const rom_entry *rom_first_region(const game_driver *drv);
|
|
const rom_entry *rom_next_region(const rom_entry *romp);
|
|
const rom_entry *rom_first_file(const rom_entry *romp);
|
|
const rom_entry *rom_next_file(const rom_entry *romp);
|
|
const rom_entry *rom_first_chunk(const rom_entry *romp);
|
|
const rom_entry *rom_next_chunk(const rom_entry *romp);
|
|
|
|
|
|
#endif /* __ROMLOAD_H__ */
|