mame/src/mame/includes/cps1.h
2012-12-05 11:39:11 +00:00

276 lines
8.5 KiB
C++

#ifndef _CPS1_H_
#define _CPS1_H_
#include "sound/msm5205.h"
struct gfx_range
{
// start and end are as passed by the game (shift adjusted to be all
// in the same scale a 8x8 tiles): they don't necessarily match the
// position in ROM.
int type;
int start;
int end;
int bank;
};
struct CPS1config
{
const char *name; /* game driver name */
/* Some games interrogate a couple of registers on bootup. */
/* These are CPS1 board B self test checks. They wander from game to */
/* game. */
int cpsb_addr; /* CPS board B test register address */
int cpsb_value; /* CPS board B test register expected value */
/* some games use as a protection check the ability to do 16-bit multiplies */
/* with a 32-bit result, by writing the factors to two ports and reading the */
/* result from two other ports. */
/* It looks like this feature was introduced with 3wonders (CPSB ID = 08xx) */
int mult_factor1;
int mult_factor2;
int mult_result_lo;
int mult_result_hi;
/* unknown registers which might be related to the multiply protection */
int unknown1;
int unknown2;
int unknown3;
int layer_control;
int priority[4];
int palette_control;
/* ideally, the layer enable masks should consist of only one bit, */
/* but in many cases it is unknown which bit is which. */
int layer_enable_mask[5];
/* these depend on the B-board model and PAL */
int bank_sizes[4];
const struct gfx_range *bank_mapper;
/* some C-boards have additional I/O for extra buttons/extra players */
int in2_addr;
int in3_addr;
int out2_addr;
int bootleg_kludge;
};
class cps_state : public driver_device
{
public:
cps_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_gfxram(*this, "gfxram"),
m_cps_a_regs(*this, "cps_a_regs"),
m_cps_b_regs(*this, "cps_b_regs"),
m_qsound_sharedram1(*this, "qsound_ram1"),
m_qsound_sharedram2(*this, "qsound_ram2"),
m_objram1(*this, "objram1"),
m_objram2(*this, "objram2"),
m_output(*this, "output") { }
/* memory pointers */
// cps1
required_shared_ptr<UINT16> m_gfxram;
required_shared_ptr<UINT16> m_cps_a_regs;
required_shared_ptr<UINT16> m_cps_b_regs;
UINT16 * m_scroll1;
UINT16 * m_scroll2;
UINT16 * m_scroll3;
UINT16 * m_obj;
UINT16 * m_other;
UINT16 * m_buffered_obj;
optional_shared_ptr<UINT8> m_qsound_sharedram1;
optional_shared_ptr<UINT8> m_qsound_sharedram2;
// cps2
optional_shared_ptr<UINT16> m_objram1;
optional_shared_ptr<UINT16> m_objram2;
optional_shared_ptr<UINT16> m_output;
UINT16 * m_cps2_buffered_obj;
// game-specific
UINT16 * m_gigaman2_dummyqsound_ram;
/* video-related */
tilemap_t *m_bg_tilemap[3];
int m_scanline1;
int m_scanline2;
int m_scancalls;
int m_scroll1x;
int m_scroll1y;
int m_scroll2x;
int m_scroll2y;
int m_scroll3x;
int m_scroll3y;
int m_stars_enabled[2]; /* Layer enabled [Y/N] */
int m_stars1x;
int m_stars1y;
int m_stars2x;
int m_stars2y;
int m_last_sprite_offset; /* Offset of the last sprite */
int m_cps2_last_sprite_offset; /* Offset of the last sprite */
int m_pri_ctrl; /* Sprite layer priorities */
int m_objram_bank;
/* misc */
int m_dial[2]; // forgottn
int m_readpaddle; // pzloop2
int m_cps2networkpresent;
/* fcrash sound hw */
int m_sample_buffer1;
int m_sample_buffer2;
int m_sample_select1;
int m_sample_select2;
/* video config (never changed after VIDEO_START) */
const struct CPS1config *m_game_config;
int m_scroll_size;
int m_obj_size;
int m_cps2_obj_size;
int m_other_size;
int m_palette_align;
int m_palette_size;
int m_stars_rom_size;
UINT8 m_empty_tile[32*32];
int m_cps_version;
/* fcrash video config */
UINT8 m_layer_enable_reg;
UINT8 m_layer_mask_reg[4];
int m_layer_scroll1x_offset;
int m_layer_scroll2x_offset;
int m_layer_scroll3x_offset;
int m_sprite_base;
int m_sprite_list_end_marker;
/* devices */
cpu_device *m_maincpu;
cpu_device *m_audiocpu;
msm5205_device *m_msm_1; // fcrash
msm5205_device *m_msm_2; // fcrash
DECLARE_READ16_MEMBER(cps1_hack_dsw_r);
DECLARE_READ16_MEMBER(forgottn_dial_0_r);
DECLARE_READ16_MEMBER(forgottn_dial_1_r);
DECLARE_WRITE16_MEMBER(forgottn_dial_0_reset_w);
DECLARE_WRITE16_MEMBER(forgottn_dial_1_reset_w);
DECLARE_WRITE8_MEMBER(cps1_snd_bankswitch_w);
DECLARE_WRITE16_MEMBER(cps1_soundlatch_w);
DECLARE_WRITE16_MEMBER(cps1_soundlatch2_w);
DECLARE_WRITE16_MEMBER(cpsq_coinctrl2_w);
DECLARE_READ16_MEMBER(qsound_rom_r);
DECLARE_READ16_MEMBER(qsound_sharedram2_r);
DECLARE_WRITE16_MEMBER(qsound_sharedram2_w);
DECLARE_WRITE8_MEMBER(qsound_banksw_w);
DECLARE_READ16_MEMBER(sf2mdt_r);
DECLARE_READ16_MEMBER(sf2rb_prot_r);
DECLARE_READ16_MEMBER(sf2rb2_prot_r);
DECLARE_READ16_MEMBER(cps1_dsw_r);
DECLARE_WRITE16_MEMBER(cps1_coinctrl_w);
DECLARE_READ16_MEMBER(qsound_sharedram1_r);
DECLARE_WRITE16_MEMBER(qsound_sharedram1_w);
DECLARE_WRITE16_MEMBER(cps1_cps_a_w);
DECLARE_READ16_MEMBER(cps1_cps_b_r);
DECLARE_WRITE16_MEMBER(cps1_cps_b_w);
DECLARE_WRITE16_MEMBER(cps1_gfxram_w);
DECLARE_WRITE16_MEMBER(cps2_objram_bank_w);
DECLARE_READ16_MEMBER(cps2_objram1_r);
DECLARE_READ16_MEMBER(cps2_objram2_r);
DECLARE_WRITE16_MEMBER(cps2_objram1_w);
DECLARE_WRITE16_MEMBER(cps2_objram2_w);
DECLARE_WRITE8_MEMBER(cps1_oki_pin7_w);
DECLARE_DRIVER_INIT(sf2rb);
DECLARE_DRIVER_INIT(sf2rb2);
DECLARE_DRIVER_INIT(sf2thndr);
DECLARE_DRIVER_INIT(dinohunt);
DECLARE_DRIVER_INIT(forgottn);
DECLARE_DRIVER_INIT(sf2hack);
DECLARE_DRIVER_INIT(slammast);
DECLARE_DRIVER_INIT(pang3b);
DECLARE_DRIVER_INIT(pang3);
DECLARE_DRIVER_INIT(sf2ee);
DECLARE_DRIVER_INIT(cps1);
DECLARE_DRIVER_INIT(sf2mdt);
DECLARE_DRIVER_INIT(dino);
DECLARE_DRIVER_INIT(punisher);
DECLARE_DRIVER_INIT(wof);
DECLARE_DRIVER_INIT(cps2_video);
DECLARE_DRIVER_INIT(cps2);
DECLARE_DRIVER_INIT(cps2crpt);
DECLARE_DRIVER_INIT(ssf2tb);
DECLARE_DRIVER_INIT(pzloop2);
DECLARE_DRIVER_INIT(gigaman2);
TILEMAP_MAPPER_MEMBER(tilemap0_scan);
TILEMAP_MAPPER_MEMBER(tilemap1_scan);
TILEMAP_MAPPER_MEMBER(tilemap2_scan);
TILE_GET_INFO_MEMBER(get_tile0_info);
TILE_GET_INFO_MEMBER(get_tile1_info);
TILE_GET_INFO_MEMBER(get_tile2_info);
DECLARE_MACHINE_START(cps1);
DECLARE_VIDEO_START(cps1);
DECLARE_MACHINE_START(common);
DECLARE_MACHINE_START(cps2);
DECLARE_VIDEO_START(cps2);
DECLARE_MACHINE_START(qsound);
DECLARE_MACHINE_RESET(cps);
DECLARE_VIDEO_START(cps);
UINT32 screen_update_cps1(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void screen_eof_cps1(screen_device &screen, bool state);
INTERRUPT_GEN_MEMBER(cps1_interrupt);
INTERRUPT_GEN_MEMBER(cps1_qsound_interrupt);
TIMER_DEVICE_CALLBACK_MEMBER(cps2_interrupt);
/* fcrash handlers */
DECLARE_DRIVER_INIT(kodb);
DECLARE_DRIVER_INIT(cawingbl);
DECLARE_MACHINE_START(fcrash);
DECLARE_MACHINE_RESET(fcrash);
DECLARE_MACHINE_START(kodb);
DECLARE_MACHINE_START(cawingbl);
DECLARE_WRITE16_MEMBER(kodb_layer_w);
DECLARE_WRITE16_MEMBER(cawingbl_soundlatch_w);
UINT32 screen_update_fcrash(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
};
/*----------- defined in drivers/cps1.c -----------*/
ADDRESS_MAP_EXTERN( qsound_sub_map, 8 );
GFXDECODE_EXTERN( cps1 );
/*----------- defined in video/cps1.c -----------*/
void cps1_get_video_base(running_machine &machine);
void cps2_set_sprite_priorities(running_machine &machine);
void cps2_objram_latch(running_machine &machine);
/*************************************
* Encryption
*************************************/
/*----------- defined in machine/kabuki.c -----------*/
void mgakuen2_decode(running_machine &machine);
void pang_decode(running_machine &machine);
void cworld_decode(running_machine &machine);
void hatena_decode(running_machine &machine);
void spang_decode(running_machine &machine);
void spangj_decode(running_machine &machine);
void sbbros_decode(running_machine &machine);
void marukin_decode(running_machine &machine);
void qtono1_decode(running_machine &machine);
void qsangoku_decode(running_machine &machine);
void block_decode(running_machine &machine);
void wof_decode(running_machine &machine);
void dino_decode(running_machine &machine);
void punisher_decode(running_machine &machine);
void slammast_decode(running_machine &machine);
#endif