36
36
limenko_state(const machine_config &mconfig, device_type type, const char *tag)
37
: driver_device(mconfig, type, tag) { }
37
: driver_device(mconfig, type, tag) ,
38
m_mainram(*this, "mainram"),
39
m_fg_videoram(*this, "fg_videoram"),
40
m_md_videoram(*this, "md_videoram"),
41
m_bg_videoram(*this, "bg_videoram"),
42
m_spriteram(*this, "spriteram"),
43
m_spriteram2(*this, "spriteram2"),
44
m_videoreg(*this, "videoreg"){ }
41
size_t m_spriteram_size;
46
required_shared_ptr<UINT32> m_mainram;
47
required_shared_ptr<UINT32> m_fg_videoram;
48
required_shared_ptr<UINT32> m_md_videoram;
49
required_shared_ptr<UINT32> m_bg_videoram;
50
required_shared_ptr<UINT32> m_spriteram;
51
required_shared_ptr<UINT32> m_spriteram2;
52
required_shared_ptr<UINT32> m_videoreg;
42
53
tilemap_t *m_bg_tilemap;
43
54
tilemap_t *m_md_tilemap;
44
55
tilemap_t *m_fg_tilemap;
45
UINT32 *m_bg_videoram;
46
UINT32 *m_md_videoram;
47
UINT32 *m_fg_videoram;
50
56
int m_spriteram_bit;
51
57
bitmap_ind16 m_sprites_bitmap;
52
58
bitmap_ind8 m_sprites_bitmap_pri;
53
59
int m_prev_sprites_count;
54
60
UINT8 m_spotty_sound_cmd;
61
DECLARE_WRITE32_MEMBER(limenko_coincounter_w);
62
DECLARE_WRITE32_MEMBER(limenko_paletteram_w);
63
DECLARE_WRITE32_MEMBER(bg_videoram_w);
64
DECLARE_WRITE32_MEMBER(md_videoram_w);
65
DECLARE_WRITE32_MEMBER(fg_videoram_w);
66
DECLARE_WRITE32_MEMBER(spotty_soundlatch_w);
67
DECLARE_WRITE32_MEMBER(spriteram_buffer_w);
68
DECLARE_WRITE8_MEMBER(spotty_sound_cmd_w);
69
DECLARE_READ8_MEMBER(spotty_sound_cmd_r);
70
DECLARE_READ8_MEMBER(spotty_sound_r);
71
DECLARE_READ32_MEMBER(dynabomb_speedup_r);
72
DECLARE_READ32_MEMBER(legendoh_speedup_r);
73
DECLARE_READ32_MEMBER(sb2003_speedup_r);
74
DECLARE_READ32_MEMBER(spotty_speedup_r);
75
DECLARE_CUSTOM_INPUT_MEMBER(spriteram_bit_r);
62
83
*****************************************************************************************************/
64
static WRITE32_HANDLER( limenko_coincounter_w )
85
WRITE32_MEMBER(limenko_state::limenko_coincounter_w)
66
coin_counter_w(space->machine(),0,data & 0x10000);
87
coin_counter_w(machine(),0,data & 0x10000);
69
static WRITE32_HANDLER( limenko_paletteram_w )
90
WRITE32_MEMBER(limenko_state::limenko_paletteram_w)
72
COMBINE_DATA(&space->machine().generic.paletteram.u32[offset]);
93
COMBINE_DATA(&m_generic_paletteram_32[offset]);
74
95
if(ACCESSING_BITS_0_15)
76
paldata = space->machine().generic.paletteram.u32[offset] & 0x7fff;
77
palette_set_color_rgb(space->machine(), offset * 2 + 1, pal5bit(paldata >> 0), pal5bit(paldata >> 5), pal5bit(paldata >> 10));
97
paldata = m_generic_paletteram_32[offset] & 0x7fff;
98
palette_set_color_rgb(machine(), offset * 2 + 1, pal5bit(paldata >> 0), pal5bit(paldata >> 5), pal5bit(paldata >> 10));
80
101
if(ACCESSING_BITS_16_31)
82
paldata = (space->machine().generic.paletteram.u32[offset] >> 16) & 0x7fff;
83
palette_set_color_rgb(space->machine(), offset * 2 + 0, pal5bit(paldata >> 0), pal5bit(paldata >> 5), pal5bit(paldata >> 10));
103
paldata = (m_generic_paletteram_32[offset] >> 16) & 0x7fff;
104
palette_set_color_rgb(machine(), offset * 2 + 0, pal5bit(paldata >> 0), pal5bit(paldata >> 5), pal5bit(paldata >> 10));
87
static WRITE32_HANDLER( bg_videoram_w )
89
limenko_state *state = space->machine().driver_data<limenko_state>();
90
COMBINE_DATA(&state->m_bg_videoram[offset]);
91
state->m_bg_tilemap->mark_tile_dirty(offset);
94
static WRITE32_HANDLER( md_videoram_w )
96
limenko_state *state = space->machine().driver_data<limenko_state>();
97
COMBINE_DATA(&state->m_md_videoram[offset]);
98
state->m_md_tilemap->mark_tile_dirty(offset);
101
static WRITE32_HANDLER( fg_videoram_w )
103
limenko_state *state = space->machine().driver_data<limenko_state>();
104
COMBINE_DATA(&state->m_fg_videoram[offset]);
105
state->m_fg_tilemap->mark_tile_dirty(offset);
108
static WRITE32_HANDLER( spotty_soundlatch_w )
110
soundlatch_w(space, 0, (data >> 16) & 0xff);
113
static CUSTOM_INPUT( spriteram_bit_r )
115
limenko_state *state = field.machine().driver_data<limenko_state>();
116
return state->m_spriteram_bit;
119
static WRITE32_HANDLER( spriteram_buffer_w )
121
limenko_state *state = space->machine().driver_data<limenko_state>();
108
WRITE32_MEMBER(limenko_state::bg_videoram_w)
110
COMBINE_DATA(&m_bg_videoram[offset]);
111
m_bg_tilemap->mark_tile_dirty(offset);
114
WRITE32_MEMBER(limenko_state::md_videoram_w)
116
COMBINE_DATA(&m_md_videoram[offset]);
117
m_md_tilemap->mark_tile_dirty(offset);
120
WRITE32_MEMBER(limenko_state::fg_videoram_w)
122
COMBINE_DATA(&m_fg_videoram[offset]);
123
m_fg_tilemap->mark_tile_dirty(offset);
126
WRITE32_MEMBER(limenko_state::spotty_soundlatch_w)
128
soundlatch_byte_w(space, 0, (data >> 16) & 0xff);
131
CUSTOM_INPUT_MEMBER(limenko_state::spriteram_bit_r)
133
return m_spriteram_bit;
136
WRITE32_MEMBER(limenko_state::spriteram_buffer_w)
122
138
rectangle clip(0, 383, 0, 239);
124
state->m_sprites_bitmap_pri.fill(0, clip);
125
state->m_sprites_bitmap.fill(0, clip);
140
m_sprites_bitmap_pri.fill(0, clip);
141
m_sprites_bitmap.fill(0, clip);
127
143
// toggle spriterams location in the memory map
128
state->m_spriteram_bit ^= 1;
144
m_spriteram_bit ^= 1;
130
if(state->m_spriteram_bit)
132
148
// draw the sprites to the frame buffer
133
draw_sprites(space->machine(),state->m_spriteram2,clip,state->m_prev_sprites_count);
149
draw_sprites(machine(),m_spriteram2,clip,m_prev_sprites_count);
137
153
// draw the sprites to the frame buffer
138
draw_sprites(space->machine(),state->m_spriteram,clip,state->m_prev_sprites_count);
154
draw_sprites(machine(),m_spriteram,clip,m_prev_sprites_count);
141
157
// buffer the next number of sprites to draw
142
state->m_prev_sprites_count = (state->m_videoreg[0] & 0x1ff0000) >> 16;
158
m_prev_sprites_count = (m_videoreg[0] & 0x1ff0000) >> 16;
145
161
/*****************************************************************************************************
147
163
*****************************************************************************************************/
149
static ADDRESS_MAP_START( limenko_map, AS_PROGRAM, 32 )
150
AM_RANGE(0x00000000, 0x001fffff) AM_RAM AM_BASE_MEMBER(limenko_state, m_mainram)
165
static ADDRESS_MAP_START( limenko_map, AS_PROGRAM, 32, limenko_state )
166
AM_RANGE(0x00000000, 0x001fffff) AM_RAM AM_SHARE("mainram")
151
167
AM_RANGE(0x40000000, 0x403fffff) AM_ROM AM_REGION("user2",0)
152
AM_RANGE(0x80000000, 0x80007fff) AM_RAM_WRITE(fg_videoram_w) AM_BASE_MEMBER(limenko_state, m_fg_videoram)
153
AM_RANGE(0x80008000, 0x8000ffff) AM_RAM_WRITE(md_videoram_w) AM_BASE_MEMBER(limenko_state, m_md_videoram)
154
AM_RANGE(0x80010000, 0x80017fff) AM_RAM_WRITE(bg_videoram_w) AM_BASE_MEMBER(limenko_state, m_bg_videoram)
155
AM_RANGE(0x80018000, 0x80018fff) AM_RAM AM_BASE_SIZE_MEMBER(limenko_state, m_spriteram, m_spriteram_size)
156
AM_RANGE(0x80019000, 0x80019fff) AM_RAM AM_BASE_MEMBER(limenko_state, m_spriteram2)
157
AM_RANGE(0x8001c000, 0x8001dfff) AM_RAM_WRITE(limenko_paletteram_w) AM_BASE_GENERIC(paletteram)
168
AM_RANGE(0x80000000, 0x80007fff) AM_RAM_WRITE(fg_videoram_w) AM_SHARE("fg_videoram")
169
AM_RANGE(0x80008000, 0x8000ffff) AM_RAM_WRITE(md_videoram_w) AM_SHARE("md_videoram")
170
AM_RANGE(0x80010000, 0x80017fff) AM_RAM_WRITE(bg_videoram_w) AM_SHARE("bg_videoram")
171
AM_RANGE(0x80018000, 0x80018fff) AM_RAM AM_SHARE("spriteram")
172
AM_RANGE(0x80019000, 0x80019fff) AM_RAM AM_SHARE("spriteram2")
173
AM_RANGE(0x8001c000, 0x8001dfff) AM_RAM_WRITE(limenko_paletteram_w) AM_SHARE("paletteram")
158
174
AM_RANGE(0x8001e000, 0x8001ebff) AM_RAM // ? not used
159
AM_RANGE(0x8001ffec, 0x8001ffff) AM_RAM AM_BASE_MEMBER(limenko_state, m_videoreg)
175
AM_RANGE(0x8001ffec, 0x8001ffff) AM_RAM AM_SHARE("videoreg")
160
176
AM_RANGE(0x8003e000, 0x8003e003) AM_WRITE(spriteram_buffer_w)
161
177
AM_RANGE(0xffe00000, 0xffffffff) AM_ROM AM_REGION("user1",0)
164
static ADDRESS_MAP_START( limenko_io_map, AS_IO, 32 )
180
static ADDRESS_MAP_START( limenko_io_map, AS_IO, 32, limenko_state )
165
181
AM_RANGE(0x0000, 0x0003) AM_READ_PORT("IN0")
166
182
AM_RANGE(0x0800, 0x0803) AM_READ_PORT("IN1")
167
183
AM_RANGE(0x1000, 0x1003) AM_READ_PORT("IN2")
174
190
/* Spotty memory map */
176
static ADDRESS_MAP_START( spotty_map, AS_PROGRAM, 32 )
177
AM_RANGE(0x00000000, 0x001fffff) AM_RAM AM_BASE_MEMBER(limenko_state, m_mainram)
192
static ADDRESS_MAP_START( spotty_map, AS_PROGRAM, 32, limenko_state )
193
AM_RANGE(0x00000000, 0x001fffff) AM_RAM AM_SHARE("mainram")
178
194
AM_RANGE(0x40002000, 0x400024d3) AM_RAM //?
179
AM_RANGE(0x80000000, 0x80007fff) AM_RAM_WRITE(fg_videoram_w) AM_BASE_MEMBER(limenko_state, m_fg_videoram)
180
AM_RANGE(0x80008000, 0x8000ffff) AM_RAM_WRITE(md_videoram_w) AM_BASE_MEMBER(limenko_state, m_md_videoram)
181
AM_RANGE(0x80010000, 0x80017fff) AM_RAM_WRITE(bg_videoram_w) AM_BASE_MEMBER(limenko_state, m_bg_videoram)
182
AM_RANGE(0x80018000, 0x80018fff) AM_RAM AM_BASE_SIZE_MEMBER(limenko_state, m_spriteram, m_spriteram_size)
183
AM_RANGE(0x80019000, 0x80019fff) AM_RAM AM_BASE_MEMBER(limenko_state, m_spriteram2)
184
AM_RANGE(0x8001c000, 0x8001dfff) AM_RAM_WRITE(limenko_paletteram_w) AM_BASE_GENERIC(paletteram)
195
AM_RANGE(0x80000000, 0x80007fff) AM_RAM_WRITE(fg_videoram_w) AM_SHARE("fg_videoram")
196
AM_RANGE(0x80008000, 0x8000ffff) AM_RAM_WRITE(md_videoram_w) AM_SHARE("md_videoram")
197
AM_RANGE(0x80010000, 0x80017fff) AM_RAM_WRITE(bg_videoram_w) AM_SHARE("bg_videoram")
198
AM_RANGE(0x80018000, 0x80018fff) AM_RAM AM_SHARE("spriteram")
199
AM_RANGE(0x80019000, 0x80019fff) AM_RAM AM_SHARE("spriteram2")
200
AM_RANGE(0x8001c000, 0x8001dfff) AM_RAM_WRITE(limenko_paletteram_w) AM_SHARE("paletteram")
185
201
AM_RANGE(0x8001e000, 0x8001ebff) AM_RAM // ? not used
186
AM_RANGE(0x8001ffec, 0x8001ffff) AM_RAM AM_BASE_MEMBER(limenko_state, m_videoreg)
202
AM_RANGE(0x8001ffec, 0x8001ffff) AM_RAM AM_SHARE("videoreg")
187
203
AM_RANGE(0x8003e000, 0x8003e003) AM_WRITE(spriteram_buffer_w)
188
204
AM_RANGE(0xfff00000, 0xffffffff) AM_ROM AM_REGION("user1",0)
191
static ADDRESS_MAP_START( spotty_io_map, AS_IO, 32 )
207
static ADDRESS_MAP_START( spotty_io_map, AS_IO, 32, limenko_state )
192
208
AM_RANGE(0x0000, 0x0003) AM_READ_PORT("IN0")
193
209
AM_RANGE(0x0800, 0x0803) AM_READ_PORT("IN1")
194
210
AM_RANGE(0x0800, 0x0803) AM_WRITENOP // hopper related
197
213
AM_RANGE(0x5000, 0x5003) AM_WRITE(spotty_soundlatch_w)
200
static WRITE8_HANDLER( spotty_sound_cmd_w )
216
WRITE8_MEMBER(limenko_state::spotty_sound_cmd_w)
202
limenko_state *state = space->machine().driver_data<limenko_state>();
203
state->m_spotty_sound_cmd = data;
218
m_spotty_sound_cmd = data;
206
static READ8_HANDLER( spotty_sound_cmd_r )
221
READ8_MEMBER(limenko_state::spotty_sound_cmd_r)
208
223
return 0; //??? some status bit? if set it executes a jump in the code
211
static READ8_HANDLER( spotty_sound_r )
226
READ8_MEMBER(limenko_state::spotty_sound_r)
213
limenko_state *state = space->machine().driver_data<limenko_state>();
214
// check state->m_spotty_sound_cmd bits...
228
// check m_spotty_sound_cmd bits...
216
if(state->m_spotty_sound_cmd == 0xf7)
217
return soundlatch_r(space,0);
230
if(m_spotty_sound_cmd == 0xf7)
231
return soundlatch_byte_r(space,0);
219
return space->machine().device<okim6295_device>("oki")->read(*space,0);
233
return machine().device<okim6295_device>("oki")->read(space,0);
222
static ADDRESS_MAP_START( spotty_sound_io_map, AS_IO, 8 )
223
AM_RANGE(MCS51_PORT_P1, MCS51_PORT_P1) AM_READ(spotty_sound_r) AM_DEVWRITE_MODERN("oki", okim6295_device, write) //? sound latch and ?
236
static ADDRESS_MAP_START( spotty_sound_io_map, AS_IO, 8, limenko_state )
237
AM_RANGE(MCS51_PORT_P1, MCS51_PORT_P1) AM_READ(spotty_sound_r) AM_DEVWRITE("oki", okim6295_device, write) //? sound latch and ?
224
238
AM_RANGE(MCS51_PORT_P3, MCS51_PORT_P3) AM_READWRITE(spotty_sound_cmd_r, spotty_sound_cmd_w) //not sure about anything...
988
static READ32_HANDLER( dynabomb_speedup_r )
990
limenko_state *state = space->machine().driver_data<limenko_state>();
991
if(space->machine().firstcpu->pc() == 0xc25b8)
993
space->machine().firstcpu->eat_cycles(50);
996
return state->m_mainram[0xe2784/4];
999
static READ32_HANDLER( legendoh_speedup_r )
1001
limenko_state *state = space->machine().driver_data<limenko_state>();
1002
if(space->machine().firstcpu->pc() == 0x23e32)
1004
space->machine().firstcpu->eat_cycles(50);
1007
return state->m_mainram[0x32ab0/4];
1010
static READ32_HANDLER( sb2003_speedup_r )
1012
limenko_state *state = space->machine().driver_data<limenko_state>();
1013
if(space->machine().firstcpu->pc() == 0x26da4)
1015
space->machine().firstcpu->eat_cycles(50);
1018
return state->m_mainram[0x135800/4];
1021
static READ32_HANDLER( spotty_speedup_r )
1023
limenko_state *state = space->machine().driver_data<limenko_state>();
1024
if(space->machine().firstcpu->pc() == 0x8560)
1026
space->machine().firstcpu->eat_cycles(50);
1029
return state->m_mainram[0x6626c/4];
1002
READ32_MEMBER(limenko_state::dynabomb_speedup_r)
1004
if(machine().firstcpu->pc() == 0xc25b8)
1006
machine().firstcpu->eat_cycles(50);
1009
return m_mainram[0xe2784/4];
1012
READ32_MEMBER(limenko_state::legendoh_speedup_r)
1014
if(machine().firstcpu->pc() == 0x23e32)
1016
machine().firstcpu->eat_cycles(50);
1019
return m_mainram[0x32ab0/4];
1022
READ32_MEMBER(limenko_state::sb2003_speedup_r)
1024
if(machine().firstcpu->pc() == 0x26da4)
1026
machine().firstcpu->eat_cycles(50);
1029
return m_mainram[0x135800/4];
1032
READ32_MEMBER(limenko_state::spotty_speedup_r)
1034
if(machine().firstcpu->pc() == 0x8560)
1036
machine().firstcpu->eat_cycles(50);
1039
return m_mainram[0x6626c/4];
1032
1042
static DRIVER_INIT( dynabomb )
1034
1044
limenko_state *state = machine.driver_data<limenko_state>();
1035
machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_read_handler(0xe2784, 0xe2787, FUNC(dynabomb_speedup_r) );
1045
machine.device("maincpu")->memory().space(AS_PROGRAM)->install_read_handler(0xe2784, 0xe2787, read32_delegate(FUNC(limenko_state::dynabomb_speedup_r), state));
1037
1047
state->m_spriteram_bit = 1;