|
|
0.32
#ifndef DRIVER_H
#define DRIVER_H
#include "osd_cpu.h"
#include "memory.h"
#include "mamedbg.h"
#include "osdepend.h"
#include "mame.h"
#include "common.h"
#include "drawgfx.h"
#include "palette.h"
#include "cpuintrf.h"
#include "sndintrf.h"
#include "input.h"
#include "inptport.h"
#include "usrintrf.h"
#include "cheat.h"
#include "tilemap.h"
#include "profiler.h"
#ifdef MAME_NET
#include "network.h"
#endif /* MAME_NET */
#define MAX_CPU 8 /* MAX_CPU is the maximum number of CPUs which cpuintrf.c */
/* can run at the same time. Currently, 8 is enough. */
#define MAX_SOUND 5 /* MAX_SOUND is the maximum number of sound subsystems */
/* which can run at the same time. Currently, 5 is enough. */
struct MachineDriver
{
/* basic machine hardware */
const struct MachineCPU cpu[MAX_CPU];
float frames_per_second;
int vblank_duration; /* in microseconds - see description below */
int cpu_slices_per_frame; /* for multicpu games. 1 is the minimum, meaning */
/* that each CPU runs for the whole video frame */
/* before giving control to the others. The higher */
/* this setting, the more closely CPUs are interleaved */
/* and therefore the more accurate the emulation is. */
/* However, an higher setting also means slower */
/* performance. */
void (*init_machine)(void);
#ifdef MESS
void (*stop_machine)(void); /* needed for MESS */
#endif
/* video hardware */
int screen_width,screen_height;
const struct rectangle default_visible_area; /* the visible area can be changed at */
/* run time, but it should never be larger than the */
/* one specified here, in order not to force the */
/* OS dependant code to resize the display window. */
const struct GfxDecodeInfo *gfxdecodeinfo;
unsigned int total_colors; /* palette is 3*total_colors bytes long */
unsigned int color_table_len; /* length in shorts of the color lookup table */
void (*vh_init_palette)(unsigned char *palette, unsigned short *colortable,const unsigned char *color_prom);
int video_attributes; /* ASG 081897 */
void (*vh_eof_callback)(void); /* called every frame after osd_update_video_and_audio() */
/* This is useful when there are operations that need */
/* to be performed every frame regardless of frameskip, */
/* e.g. sprite buffering or collision detection. */
int (*vh_start)(void);
void (*vh_stop)(void);
void (*vh_update)(struct osd_bitmap *bitmap,int full_refresh);
/* sound hardware */
int sound_attributes;
int obsolete1;
int obsolete2;
int obsolete3;
const struct MachineSound sound[MAX_SOUND];
/*
use this to manage nvram/eeprom/cmos/etc.
It is called before the emulation starts and after it ends. Note that it is
NOT called when the game is reset, since it is not needed.
file == 0, read_or_write == 0 -> first time the game is run, initialize nvram
file != 0, read_or_write == 0 -> load nvram from disk
file == 0, read_or_write != 0 -> not allowed
file != 0, read_or_write != 0 -> save nvram to disk
*/
void (*nvram_handler)(void *file,int read_or_write);
};
/* VBlank is the period when the video beam is outside of the visible area and */
/* returns from the bottom to the top of the screen to prepare for a new video frame. */
/* VBlank duration is an important factor in how the game renders itself. MAME */
/* generates the vblank_interrupt, lets the game run for vblank_duration microseconds, */
/* and then updates the screen. This faithfully reproduces the behaviour of the real */
/* hardware. In many cases, the game does video related operations both in its vblank */
/* interrupt, and in the normal game code; it is therefore important to set up */
/* vblank_duration accurately to have everything properly in sync. An example of this */
/* is Commando: if you set vblank_duration to 0, therefore redrawing the screen BEFORE */
/* the vblank interrupt is executed, sprites will be misaligned when the screen scrolls. */
/* Here are some predefined, TOTALLY ARBITRARY values for vblank_duration, which should */
/* be OK for most cases. I have NO IDEA how accurate they are compared to the real */
/* hardware, they could be completely wrong. */
#define DEFAULT_60HZ_VBLANK_DURATION 0
#define DEFAULT_30HZ_VBLANK_DURATION 0
/* If you use IPT_VBLANK, you need a duration different from 0. */
#define DEFAULT_REAL_60HZ_VBLANK_DURATION 2500
#define DEFAULT_REAL_30HZ_VBLANK_DURATION 2500
/* flags for video_attributes */
/* bit 1 of the video attributes indicates whether or not dirty rectangles will work */
#define VIDEO_SUPPORTS_DIRTY 0x0002
/* bit 0 of the video attributes indicates raster or vector video hardware */
#define VIDEO_TYPE_RASTER 0x0000
#define VIDEO_TYPE_VECTOR 0x0001
/* bit 3 of the video attributes indicates that the game's palette has 6 or more bits */
/* per gun, and would therefore require a 24-bit display. This is entirely up to */
/* the OS dependant layer, the bitmap will still be 16-bit. */
#define VIDEO_NEEDS_6BITS_PER_GUN 0x0008
/* ASG 980417 - added: */
/* bit 4 of the video attributes indicates that the driver wants its refresh after */
/* the VBLANK instead of before. */
#define VIDEO_UPDATE_BEFORE_VBLANK 0x0000
#define VIDEO_UPDATE_AFTER_VBLANK 0x0010
/* In most cases we assume pixels are square (1:1 aspect ratio) but some games need */
/* different proportions, e.g. 1:2 for Blasteroids */
#define VIDEO_PIXEL_ASPECT_RATIO_MASK 0x0060
#define VIDEO_PIXEL_ASPECT_RATIO_1_1 0x0000
#define VIDEO_PIXEL_ASPECT_RATIO_1_2 0x0020
#define VIDEO_PIXEL_ASPECT_RATIO_2_1 0x0040
#define VIDEO_DUAL_MONITOR 0x0080
/* Mish 181099: See comments in vidhrdw/generic.c for details */
#define VIDEO_BUFFERS_SPRITERAM 0x0100
/* game wants to use a hicolor or truecolor bitmap (e.g. for alpha blending) */
#define VIDEO_RGB_DIRECT 0x0200
/* automatically extend the palette creating a darker copy for shadows */
#define VIDEO_HAS_SHADOWS 0x0400
/* automatically extend the palette creating a brighter copy for highlights */
#define VIDEO_HAS_HIGHLIGHTS 0x0800
/* generic aspect ratios */
#define VIDEO_ASPECT_RATIO_MASK 0xffff0000
#define VIDEO_ASPECT_RATIO_NUM(a) (((a) >> 24) & 0xff)
#define VIDEO_ASPECT_RATIO_DEN(a) (((a) >> 16) & 0xff)
#define VIDEO_ASPECT_RATIO(n,d) ((((n) & 0xff) << 24) | (((d) & 0xff) << 16))
/* flags for sound_attributes */
#define SOUND_SUPPORTS_STEREO 0x0001
struct GameDriver
{
const char *source_file; /* set this to __FILE__ */
const struct GameDriver *clone_of; /* if this is a clone, point to */
/* the main version of the game */
const char *name;
const char *description;
const char *year;
const char *manufacturer;
const struct MachineDriver *drv;
const struct InputPortTiny *input_ports;
void (*driver_init)(void); /* optional function to be called during initialization */
/* This is called ONCE, unlike Machine->init_machine */
/* which is called every time the game is reset. */
const struct RomModule *rom;
#ifdef MESS
const struct IODevice *dev;
#endif
UINT32 flags; /* orientation and other flags; see defines below */
};
/* values for the flags field */
#define ORIENTATION_MASK 0x0007
#define ORIENTATION_FLIP_X 0x0001 /* mirror everything in the X direction */
#define ORIENTATION_FLIP_Y 0x0002 /* mirror everything in the Y direction */
#define ORIENTATION_SWAP_XY 0x0004 /* mirror along the top-left/bottom-right diagonal */
#define GAME_NOT_WORKING 0x0008
#define GAME_UNEMULATED_PROTECTION 0x0010 /* game's protection not fully emulated */
#define GAME_WRONG_COLORS 0x0020 /* colors are totally wrong */
#define GAME_IMPERFECT_COLORS 0x0040 /* colors are not 100% accurate, but close */
#define GAME_IMPERFECT_GRAPHICS 0x0080 /* graphics are wrong/incomplete */
#define GAME_NO_COCKTAIL 0x0100 /* screen flip support is missing */
#define GAME_NO_SOUND 0x0200 /* sound is missing */
#define GAME_IMPERFECT_SOUND 0x0400 /* sound is known to be wrong */
#define NOT_A_DRIVER 0x4000 /* set by the fake "root" driver_0 and by "containers" */
/* e.g. driver_neogeo. */
#ifdef MESS
#define GAME_COMPUTER 0x8000 /* Driver is a computer (needs full keyboard) */
#define GAME_COMPUTER_MODIFIED 0x0800 /* Official? Hack */
#define GAME_ALIAS NOT_A_DRIVER /* Driver is only an alias for an existing model */
#endif
#define GAME(YEAR,NAME,PARENT,MACHINE,INPUT,INIT,MONITOR,COMPANY,FULLNAME) \
extern const struct GameDriver driver_##PARENT; \
const struct GameDriver driver_##NAME = \
{ \
__FILE__, \
&driver_##PARENT, \
#NAME, \
FULLNAME, \
#YEAR, \
COMPANY, \
&machine_driver_##MACHINE, \
input_ports_##INPUT, \
init_##INIT, \
rom_##NAME, \
MONITOR \
};
#define GAMEX(YEAR,NAME,PARENT,MACHINE,INPUT,INIT,MONITOR,COMPANY,FULLNAME,FLAGS) \
extern const struct GameDriver driver_##PARENT; \
const struct GameDriver driver_##NAME = \
{ \
__FILE__, \
&driver_##PARENT, \
#NAME, \
FULLNAME, \
#YEAR, \
COMPANY, \
&machine_driver_##MACHINE, \
input_ports_##INPUT, \
init_##INIT, \
rom_##NAME, \
(MONITOR)|(FLAGS) \
};
/* monitor parameters to be used with the GAME() macro */
#define ROT0 0
#define ROT90 (ORIENTATION_SWAP_XY|ORIENTATION_FLIP_X) /* rotate clockwise 90 degrees */
#define ROT180 (ORIENTATION_FLIP_X|ORIENTATION_FLIP_Y) /* rotate 180 degrees */
#define ROT270 (ORIENTATION_SWAP_XY|ORIENTATION_FLIP_Y) /* rotate counter-clockwise 90 degrees */
/* this allows to leave the INIT field empty in the GAME() macro call */
#define init_0 0
extern const struct GameDriver *drivers[];
#endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.