113
113
bmcbowl_state(const machine_config &mconfig, device_type type, const char *tag)
114
: driver_device(mconfig, type, tag) { }
114
: driver_device(mconfig, type, tag) ,
115
m_stats_ram(*this, "stats_ram", 16),
116
m_vid1(*this, "vid1"),
117
m_vid2(*this, "vid2"){ }
119
optional_shared_ptr<UINT8> m_stats_ram;
120
required_shared_ptr<UINT16> m_vid1;
121
required_shared_ptr<UINT16> m_vid2;
118
122
UINT8 *m_bmc_colorram;
120
size_t m_stats_ram_size;
121
123
int m_clr_offset;
125
DECLARE_READ16_MEMBER(bmc_random_read);
126
DECLARE_READ16_MEMBER(bmc_protection_r);
127
DECLARE_WRITE16_MEMBER(bmc_RAMDAC_offset_w);
128
DECLARE_WRITE16_MEMBER(bmc_RAMDAC_color_w);
129
DECLARE_WRITE16_MEMBER(scroll_w);
184
static READ16_HANDLER( bmc_random_read )
191
READ16_MEMBER(bmcbowl_state::bmc_random_read)
186
return space->machine().rand();
193
return machine().rand();
189
static READ16_HANDLER( bmc_protection_r )
196
READ16_MEMBER(bmcbowl_state::bmc_protection_r)
191
switch(cpu_get_previouspc(&space->device()))
198
switch(cpu_get_previouspc(&space.device()))
194
switch(cpu_get_reg(&space->device(), M68K_D2))
201
switch(cpu_get_reg(&space.device(), M68K_D2))
196
203
case 0: return 0x37<<8;
197
204
case 0x1013: return 0;
202
logerror("Protection read @ %X\n",cpu_get_previouspc(&space->device()));
203
return space->machine().rand();
206
static WRITE16_HANDLER( bmc_RAMDAC_offset_w )
208
bmcbowl_state *state = space->machine().driver_data<bmcbowl_state>();
209
state->m_clr_offset=data*3;
212
static WRITE16_HANDLER( bmc_RAMDAC_color_w )
214
bmcbowl_state *state = space->machine().driver_data<bmcbowl_state>();
215
state->m_bmc_colorram[state->m_clr_offset]=data;
216
palette_set_color_rgb(space->machine(),state->m_clr_offset/3,pal6bit(state->m_bmc_colorram[(state->m_clr_offset/3)*3]),pal6bit(state->m_bmc_colorram[(state->m_clr_offset/3)*3+1]),pal6bit(state->m_bmc_colorram[(state->m_clr_offset/3)*3+2]));
217
state->m_clr_offset=(state->m_clr_offset+1)%768;
220
static WRITE16_HANDLER( scroll_w )
209
logerror("Protection read @ %X\n",cpu_get_previouspc(&space.device()));
210
return machine().rand();
213
WRITE16_MEMBER(bmcbowl_state::bmc_RAMDAC_offset_w)
218
WRITE16_MEMBER(bmcbowl_state::bmc_RAMDAC_color_w)
220
m_bmc_colorram[m_clr_offset]=data;
221
palette_set_color_rgb(machine(),m_clr_offset/3,pal6bit(m_bmc_colorram[(m_clr_offset/3)*3]),pal6bit(m_bmc_colorram[(m_clr_offset/3)*3+1]),pal6bit(m_bmc_colorram[(m_clr_offset/3)*3+2]));
222
m_clr_offset=(m_clr_offset+1)%768;
225
WRITE16_MEMBER(bmcbowl_state::scroll_w)
304
309
if (read_or_write)
305
file->write(state->m_stats_ram, state->m_stats_ram_size);
310
file->write(state->m_stats_ram, state->m_stats_ram.bytes());
308
313
#ifdef NVRAM_HACK
309
for (i = 0; i < state->m_stats_ram_size; i++)
314
for (i = 0; i < state->m_stats_ram.bytes(); i++)
310
315
state->m_stats_ram[i] = 0xff;
312
317
init_stats(state,bmc_nv1,ARRAY_LENGTH(bmc_nv1),0);
314
319
init_stats(state,bmc_nv3,ARRAY_LENGTH(bmc_nv3),0xfe2);
317
file->read(state->m_stats_ram, state->m_stats_ram_size);
322
file->read(state->m_stats_ram, state->m_stats_ram.bytes());
320
for (i = 0; i < state->m_stats_ram_size; i++)
325
for (i = 0; i < state->m_stats_ram.bytes(); i++)
321
326
state->m_stats_ram[i] = 0xff;
326
static ADDRESS_MAP_START( bmcbowl_mem, AS_PROGRAM, 16 )
331
static ADDRESS_MAP_START( bmcbowl_mem, AS_PROGRAM, 16, bmcbowl_state )
327
332
AM_RANGE(0x000000, 0x01ffff) AM_ROM
329
334
AM_RANGE(0x090000, 0x090001) AM_WRITE(bmc_RAMDAC_offset_w)
334
339
AM_RANGE(0x091000, 0x091001) AM_WRITENOP
335
340
AM_RANGE(0x091800, 0x091801) AM_WRITE(scroll_w)
337
AM_RANGE(0x092000, 0x09201f) AM_DEVREADWRITE8_MODERN("via6522_0", via6522_device, read, write, 0x00ff)
342
AM_RANGE(0x092000, 0x09201f) AM_DEVREADWRITE8("via6522_0", via6522_device, read, write, 0x00ff)
339
344
AM_RANGE(0x093000, 0x093003) AM_WRITENOP // related to music
340
AM_RANGE(0x092800, 0x092803) AM_DEVWRITE8("aysnd", ay8910_data_address_w, 0xff00)
341
AM_RANGE(0x092802, 0x092803) AM_DEVREAD8("aysnd", ay8910_r, 0xff00)
345
AM_RANGE(0x092800, 0x092803) AM_DEVWRITE8_LEGACY("aysnd", ay8910_data_address_w, 0xff00)
346
AM_RANGE(0x092802, 0x092803) AM_DEVREAD8_LEGACY("aysnd", ay8910_r, 0xff00)
342
347
AM_RANGE(0x093802, 0x093803) AM_READ_PORT("IN0")
343
AM_RANGE(0x095000, 0x095fff) AM_RAM AM_BASE_MEMBER(bmcbowl_state, m_stats_ram) AM_SIZE_MEMBER(bmcbowl_state, m_stats_ram_size) /* 8 bit */
348
AM_RANGE(0x095000, 0x095fff) AM_RAM AM_SHARE("stats_ram") /* 8 bit */
344
349
AM_RANGE(0x097000, 0x097001) AM_READNOP
345
350
AM_RANGE(0x140000, 0x1bffff) AM_ROM
346
AM_RANGE(0x1c0000, 0x1effff) AM_RAM AM_BASE_MEMBER(bmcbowl_state, m_vid1)
351
AM_RANGE(0x1c0000, 0x1effff) AM_RAM AM_SHARE("vid1")
347
352
AM_RANGE(0x1f0000, 0x1fffff) AM_RAM
348
AM_RANGE(0x200000, 0x21ffff) AM_RAM AM_BASE_MEMBER(bmcbowl_state, m_vid2)
353
AM_RANGE(0x200000, 0x21ffff) AM_RAM AM_SHARE("vid2")
350
AM_RANGE(0x28c000, 0x28c001) AM_DEVREADWRITE8_MODERN("oki", okim6295_device, read, write, 0xff00)
355
AM_RANGE(0x28c000, 0x28c001) AM_DEVREADWRITE8("oki", okim6295_device, read, write, 0xff00)
352
357
/* protection device*/
353
358
AM_RANGE(0x30c000, 0x30c001) AM_WRITENOP
439
444
PORT_START("IN3")
440
445
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(1)
441
446
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(1)
442
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_VBLANK )
447
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_VBLANK("screen")
448
453
bmcbowl_state *state = device->machine().driver_data<bmcbowl_state>();
449
454
switch(state->m_bmc_input)
451
case 0x00: return input_port_read(device->machine(), "IN1");
452
case 0x40: return input_port_read(device->machine(), "IN2");
456
case 0x00: return state->ioport("IN1")->read();
457
case 0x40: return state->ioport("IN2")->read();
454
459
logerror("%s:unknown input - %X\n",device->machine().describe_context(),state->m_bmc_input);