1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
|
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
/***************************************************************************
Sega System 16A/16B/18/Outrun/Hang On/X-Board/Y-Board hardware
***************************************************************************/
#include "cpu/m68000/m68000.h"
#include "cpu/mcs51/mcs51.h"
#include "cpu/z80/z80.h"
#include "machine/nvram.h"
#include "machine/segaic16.h"
#include "machine/315_5296.h"
#include "video/315_5313.h"
#include "video/segaic16.h"
#include "video/sega16sp.h"
// ======================> segas18_state
class segas18_state : public sega_16bit_common_base
{
public:
// construction/destruction
segas18_state(const machine_config &mconfig, device_type type, const char *tag)
: sega_16bit_common_base(mconfig, type, tag),
m_mapper(*this, "mapper"),
m_maincpu(*this, "maincpu"),
m_soundcpu(*this, "soundcpu"),
m_mcu(*this, "mcu"),
m_vdp(*this, "gen_vdp"),
m_io(*this, "io"),
m_nvram(*this, "nvram"),
m_sprites(*this, "sprites"),
m_segaic16vid(*this, "segaic16vid"),
m_gfxdecode(*this, "gfxdecode"),
m_workram(*this, "workram"),
m_romboard(ROM_BOARD_INVALID),
m_grayscale_enable(false),
m_vdp_enable(false),
m_vdp_mixing(0),
m_mcu_data(0),
m_lghost_value(0),
m_lghost_select(0)
{
memset(m_wwally_last_x, 0, sizeof(m_wwally_last_x));
memset(m_wwally_last_y, 0, sizeof(m_wwally_last_y));
}
// driver init
DECLARE_DRIVER_INIT(ddcrew);
DECLARE_DRIVER_INIT(lghost);
DECLARE_DRIVER_INIT(generic_shad);
DECLARE_DRIVER_INIT(generic_5874);
DECLARE_DRIVER_INIT(wwally);
DECLARE_DRIVER_INIT(generic_5987);
DECLARE_DRIVER_INIT(hamaway);
// memory mapping
void memory_mapper(sega_315_5195_mapper_device &mapper, UINT8 index);
UINT8 mapper_sound_r();
void mapper_sound_w(UINT8 data);
// read/write handlers
DECLARE_WRITE8_MEMBER( rom_5874_bank_w );
DECLARE_WRITE16_MEMBER( rom_5987_bank_w );
DECLARE_WRITE16_MEMBER( rom_837_7525_bank_w );
DECLARE_WRITE8_MEMBER( misc_outputs_w );
DECLARE_READ16_MEMBER( misc_io_r );
DECLARE_WRITE16_MEMBER( misc_io_w );
DECLARE_WRITE8_MEMBER( soundbank_w );
DECLARE_WRITE8_MEMBER( mcu_data_w );
DECLARE_WRITE_LINE_MEMBER(ym3438_irq_handler);
// custom I/O
DECLARE_READ16_MEMBER( ddcrew_custom_io_r );
DECLARE_READ16_MEMBER( lghost_custom_io_r );
DECLARE_WRITE8_MEMBER( lghost_gun_recoil_w );
DECLARE_WRITE16_MEMBER( lghost_custom_io_w );
DECLARE_READ16_MEMBER( wwally_custom_io_r );
DECLARE_WRITE16_MEMBER( wwally_custom_io_w );
// video rendering
UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(vdp_sndirqline_callback_s18);
DECLARE_WRITE_LINE_MEMBER(vdp_lv6irqline_callback_s18);
DECLARE_WRITE_LINE_MEMBER(vdp_lv4irqline_callback_s18);
DECLARE_READ16_MEMBER( genesis_vdp_r ) { return m_vdp->vdp_r(space, offset, mem_mask); }
DECLARE_WRITE16_MEMBER( genesis_vdp_w ) { m_vdp->vdp_w(space, offset, data, mem_mask); }
DECLARE_WRITE16_MEMBER( sega_tileram_0_w ) { m_segaic16vid->segaic16_tileram_0_w(space, offset, data, mem_mask); }
DECLARE_WRITE16_MEMBER( sega_textram_0_w ) { m_segaic16vid->segaic16_textram_0_w(space, offset, data, mem_mask); }
DECLARE_WRITE_LINE_MEMBER(set_grayscale);
DECLARE_WRITE_LINE_MEMBER(set_vdp_enable);
protected:
// timer IDs
enum
{
TID_INITIAL_BOOST
};
// rom board types
enum segas18_rom_board
{
ROM_BOARD_INVALID,
ROM_BOARD_171_SHADOW, // 171-???? -- used by shadow dancer
ROM_BOARD_171_5874, // 171-5874
ROM_BOARD_171_5987, // 171-5987
ROM_BOARD_837_7525 // Hammer Away proto
};
// device overrides
virtual void machine_reset();
virtual void video_start();
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
// internal helpers
void init_generic(segas18_rom_board rom_board);
void set_vdp_mixing(UINT8 mixing);
void draw_vdp(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority);
// devices
required_device<sega_315_5195_mapper_device> m_mapper;
required_device<m68000_device> m_maincpu;
required_device<z80_device> m_soundcpu;
optional_device<i8751_device> m_mcu;
required_device<sega315_5313_device> m_vdp;
required_device<sega_315_5296_device> m_io;
required_device<nvram_device> m_nvram;
required_device<sega_sys16b_sprite_device> m_sprites;
required_device<segaic16_video_device> m_segaic16vid;
required_device<gfxdecode_device> m_gfxdecode;
// memory pointers
required_shared_ptr<UINT16> m_workram;
// configuration
segas18_rom_board m_romboard;
read16_delegate m_custom_io_r;
write16_delegate m_custom_io_w;
// internal state
int m_grayscale_enable;
int m_vdp_enable;
UINT8 m_vdp_mixing;
bitmap_ind16 m_temp_bitmap;
UINT8 m_mcu_data;
// game-specific state
UINT8 m_wwally_last_x[3];
UINT8 m_wwally_last_y[3];
UINT8 m_lghost_value;
UINT8 m_lghost_select;
};
|