78
79
kaneko16_sprite_xoffs = 0x10000 - 0x16c0 + 0xc00;
79
80
kaneko16_sprite_yoffs = 0x000;
80
cpuexec_boost_interleave(machine, attotime_zero, ATTOTIME_IN_USEC(50)); //initial mcu xchk
81
machine.scheduler().boost_interleave(attotime::zero, attotime::from_usec(50)); //initial mcu xchk
83
84
static void galpani2_write_kaneko(device_t *device)
85
address_space *dstspace = cpu_get_address_space(device, ADDRESS_SPACE_PROGRAM);
86
address_space *dstspace = device->memory().space(AS_PROGRAM);
87
88
unsigned char testpattern[] = {0xFF,0x55,0xAA,0xDD,0xBB,0x99};
124
125
cputag_set_input_line(machine, "sub", INPUT_LINE_IRQ7, HOLD_LINE); //MCU Initialised
127
static void galpani2_mcu_nmi1(running_machine *machine)
128
static void galpani2_mcu_nmi1(running_machine &machine)
129
address_space *srcspace = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM);
130
address_space *dstspace = cputag_get_address_space(machine, "sub", ADDRESS_SPACE_PROGRAM);
130
address_space *srcspace = machine.device("maincpu")->memory().space(AS_PROGRAM);
131
address_space *dstspace = machine.device("sub")->memory().space(AS_PROGRAM);
131
132
UINT32 mcu_list, mcu_command, mcu_address, mcu_extra, mcu_src, mcu_dst, mcu_size;
133
134
for ( mcu_list = 0x100021; mcu_list < (0x100021 + 0x40); mcu_list += 4 )
230
static void galpani2_mcu_nmi2(running_machine *machine)
231
static void galpani2_mcu_nmi2(running_machine &machine)
232
galpani2_write_kaneko(machine->device("maincpu"));
233
//logerror("%s : MCU executes CHECKs synchro\n", cpuexec_describe_context(machine));
233
galpani2_write_kaneko(machine.device("maincpu"));
234
//logerror("%s : MCU executes CHECKs synchro\n", machine.describe_context());
236
237
static WRITE8_HANDLER( galpani2_mcu_nmi1_w ) //driven by CPU1's int5 ISR
239
galpani2_state *state = space->machine().driver_data<galpani2_state>();
239
241
//Triggered from 'maincpu' (00007D60),once, with no command, using alternate line, during init
240
242
//Triggered from 'maincpu' (000080BE),once, for unknown command, during init
241
243
//Triggered from 'maincpu' (0000741E),from here on...driven by int5, even if there's no command
242
static UINT16 old_mcu_nmi1 = 0;
243
if ( (data & 1) && !(old_mcu_nmi1 & 1) ) galpani2_mcu_nmi1(space->machine);
244
//if ( (data & 0x10) && !(old_mcu_nmi1 & 0x10) ) galpani2_mcu_nmi1(space->machine);
244
if ( (data & 1) && !(state->m_old_mcu_nmi1 & 1) ) galpani2_mcu_nmi1(space->machine());
245
//if ( (data & 0x10) && !(state->m_old_mcu_nmi1 & 0x10) ) galpani2_mcu_nmi1(space->machine());
245
246
//alternate line, same function?
247
state->m_old_mcu_nmi1 = data;
249
250
static WRITE8_HANDLER( galpani2_mcu_nmi2_w ) //driven by CPU2's int5 ISR
251
static UINT16 old_mcu_nmi2 = 0;
252
if ( (data & 1) && !(old_mcu_nmi2 & 1) ) galpani2_mcu_nmi2(space->machine);
252
galpani2_state *state = space->machine().driver_data<galpani2_state>();
253
if ( (data & 1) && !(state->m_old_mcu_nmi2 & 1) ) galpani2_mcu_nmi2(space->machine());
254
state->m_old_mcu_nmi2 = data;
265
266
static WRITE8_HANDLER( galpani2_coin_lockout_w )
267
coin_counter_w(space->machine, 0, data & 0x01);
268
coin_counter_w(space->machine, 1, data & 0x02);
269
coin_lockout_w(space->machine, 0,~data & 0x04);
270
coin_lockout_w(space->machine, 1,~data & 0x08);
268
coin_counter_w(space->machine(), 0, data & 0x01);
269
coin_counter_w(space->machine(), 1, data & 0x02);
270
coin_lockout_w(space->machine(), 0,~data & 0x04);
271
coin_lockout_w(space->machine(), 1,~data & 0x08);
271
272
// & 0x10 CARD in lockout?
272
273
// & 0x20 CARD in lockout?
273
274
// & 0x40 CARD out
276
277
static WRITE8_DEVICE_HANDLER( galpani2_oki1_bank_w )
278
UINT8 *ROM = device->machine->region("oki1")->base();
279
logerror("%s : %s bank %08X\n",cpuexec_describe_context(device->machine),device->tag(),data);
280
memcpy(ROM + 0x30000, ROM + 0x40000 + 0x10000 * (~data & 0xf), 0x10000);
279
UINT8 *ROM = device->machine().region("oki1")->base();
280
logerror("%s : %s bank %08X\n",device->machine().describe_context(),device->tag(),data);
281
memcpy(ROM + 0x30000, ROM + 0x40000 + 0x10000 * (~data & 0xf), 0x10000);
283
284
static WRITE8_DEVICE_HANDLER( galpani2_oki2_bank_w )
285
okim6295_device *oki = downcast<okim6295_device *>(device);
286
oki->set_bank_base(0x40000 * (data & 0xf) );
287
logerror("%s : %s bank %08X\n",cpuexec_describe_context(device->machine),device->tag(),data);
286
okim6295_device *oki = downcast<okim6295_device *>(device);
287
oki->set_bank_base(0x40000 * (data & 0xf) );
288
logerror("%s : %s bank %08X\n",device->machine().describe_context(),device->tag(),data);
291
static ADDRESS_MAP_START( galpani2_mem1, ADDRESS_SPACE_PROGRAM, 16 )
292
static ADDRESS_MAP_START( galpani2_mem1, AS_PROGRAM, 16 )
292
293
AM_RANGE(0x000000, 0x0fffff) AM_ROM // ROM
293
AM_RANGE(0x100000, 0x10ffff) AM_RAM AM_BASE(&galpani2_ram ) // Work RAM
294
AM_RANGE(0x100000, 0x10ffff) AM_RAM AM_BASE_MEMBER(galpani2_state, m_ram) // Work RAM
294
295
AM_RANGE(0x110000, 0x11000f) AM_RAM // ? corrupted? stack dumper on POST failure, pc+sr on gp2se
295
296
AM_RANGE(0x300000, 0x301fff) AM_RAM // ?
296
297
AM_RANGE(0x302000, 0x303fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) // Sprites
297
298
AM_RANGE(0x304000, 0x30401f) AM_RAM_WRITE(kaneko16_sprites_regs_w) AM_BASE(&kaneko16_sprites_regs ) // Sprites Regs
298
299
AM_RANGE(0x308000, 0x308001) AM_WRITENOP // ? 0 at startup
299
300
AM_RANGE(0x30c000, 0x30c001) AM_WRITENOP // ? hblank effect ?
300
AM_RANGE(0x310000, 0x3101ff) AM_RAM_WRITE(galpani2_palette_0_w) AM_BASE(&galpani2_palette_0 ) // ?
301
AM_RANGE(0x310000, 0x3101ff) AM_RAM_WRITE(galpani2_palette_0_w) AM_BASE_MEMBER(galpani2_state, m_palette_0) // ?
301
302
AM_RANGE(0x314000, 0x314001) AM_WRITENOP // ? flip backgrounds ?
302
303
AM_RANGE(0x318000, 0x318001) AM_DEVREADWRITE("eeprom", galpani2_eeprom_r, galpani2_eeprom_w) // EEPROM
303
304
AM_RANGE(0x380000, 0x387fff) AM_RAM // Palette?
304
305
AM_RANGE(0x388000, 0x38ffff) AM_RAM_WRITE(paletteram16_xGGGGGRRRRRBBBBB_word_w) AM_BASE_GENERIC(paletteram ) // Palette
305
306
AM_RANGE(0x390000, 0x3901ff) AM_WRITENOP // ? at startup of service mode
307
AM_RANGE(0x400000, 0x43ffff) AM_RAM_WRITE(galpani2_bg8_0_w) AM_BASE(&galpani2_bg8_0 ) // Background 0
308
AM_RANGE(0x440000, 0x440001) AM_RAM AM_BASE(&galpani2_bg8_0_scrollx ) // Background 0 Scroll X
309
AM_RANGE(0x480000, 0x480001) AM_RAM AM_BASE(&galpani2_bg8_0_scrolly ) // Background 0 Scroll Y
308
AM_RANGE(0x400000, 0x43ffff) AM_RAM_WRITE(galpani2_bg8_0_w) AM_BASE_MEMBER(galpani2_state, m_bg8_0) // Background 0
309
AM_RANGE(0x440000, 0x440001) AM_RAM AM_BASE_MEMBER(galpani2_state, m_bg8_0_scrollx) // Background 0 Scroll X
310
AM_RANGE(0x480000, 0x480001) AM_RAM AM_BASE_MEMBER(galpani2_state, m_bg8_0_scrolly) // Background 0 Scroll Y
310
311
AM_RANGE(0x4c0000, 0x4c0001) AM_WRITENOP // ? 0 at startup only
311
AM_RANGE(0x500000, 0x53ffff) AM_RAM_WRITE(galpani2_bg8_1_w) AM_BASE(&galpani2_bg8_1 ) // Background 1
312
AM_RANGE(0x540000, 0x540001) AM_RAM AM_BASE(&galpani2_bg8_1_scrollx ) // Background 1 Scroll X
312
AM_RANGE(0x500000, 0x53ffff) AM_RAM_WRITE(galpani2_bg8_1_w) AM_BASE_MEMBER(galpani2_state, m_bg8_1) // Background 1
313
AM_RANGE(0x540000, 0x540001) AM_RAM AM_BASE_MEMBER(galpani2_state, m_bg8_1_scrollx) // Background 1 Scroll X
314
315
AM_RANGE(0x540572, 0x540573) AM_READNOP // ? galpani2 at F0A4
315
316
AM_RANGE(0x54057a, 0x54057b) AM_READNOP // ? galpani2 at F148
321
322
AM_RANGE(0x5405c2, 0x5405c3) AM_READNOP // ? galpani2 at F0A4 and F148
322
323
AM_RANGE(0x5405ca, 0x5405cb) AM_READNOP // ? galpani2 at F148
324
AM_RANGE(0x580000, 0x580001) AM_RAM AM_BASE(&galpani2_bg8_1_scrolly ) // Background 1 Scroll Y
325
AM_RANGE(0x580000, 0x580001) AM_RAM AM_BASE_MEMBER(galpani2_state, m_bg8_1_scrolly) // Background 1 Scroll Y
325
326
AM_RANGE(0x5c0000, 0x5c0001) AM_WRITENOP // ? 0 at startup only
326
327
AM_RANGE(0x600000, 0x600001) AM_WRITENOP // Watchdog
327
328
AM_RANGE(0x640000, 0x640001) AM_WRITE8(galpani2_mcu_init_w, 0x00ff ) // ? 0 before resetting and at startup, Reset mcu ?
347
348
***************************************************************************/
349
static UINT16 *galpani2_rombank;
351
351
static READ16_HANDLER( galpani2_bankedrom_r )
353
UINT16 *ROM = (UINT16 *) space->machine->region( "user1" )->base();
354
size_t len = space->machine->region( "user1" )->bytes() / 2;
353
galpani2_state *state = space->machine().driver_data<galpani2_state>();
354
UINT16 *ROM = (UINT16 *) space->machine().region( "user1" )->base();
355
size_t len = space->machine().region( "user1" )->bytes() / 2;
356
offset += (0x800000/2) * (*galpani2_rombank & 0x0003);
357
offset += (0x800000/2) * (*state->m_rombank & 0x0003);
358
359
if ( offset < len ) return ROM[offset];
359
360
else return 0xffff; //floating bus for absent ROMs
362
static ADDRESS_MAP_START( galpani2_mem2, ADDRESS_SPACE_PROGRAM, 16 )
363
static ADDRESS_MAP_START( galpani2_mem2, AS_PROGRAM, 16 )
363
364
AM_RANGE(0x000000, 0x03ffff) AM_ROM // ROM
364
AM_RANGE(0x100000, 0x13ffff) AM_RAM AM_BASE(&galpani2_ram2) // Work RAM
365
AM_RANGE(0x400000, 0x4fffff) AM_RAM_WRITE(galpani2_bg15_w) AM_BASE(&galpani2_bg15) // bg15
365
AM_RANGE(0x100000, 0x13ffff) AM_RAM AM_BASE_MEMBER(galpani2_state, m_ram2) // Work RAM
366
AM_RANGE(0x400000, 0x4fffff) AM_RAM_WRITE(galpani2_bg15_w) AM_BASE_MEMBER(galpani2_state, m_bg15) // bg15
366
367
AM_RANGE(0x500000, 0x5fffff) AM_RAM // bg15
367
368
AM_RANGE(0x600000, 0x600001) AM_NOP // ? 0 at startup only
368
369
AM_RANGE(0x640000, 0x640001) AM_WRITENOP // ? 0 at startup only
556
557
switch ( cpu_getiloops(device) )
558
case 3: cpu_set_input_line(device, 3, HOLD_LINE); break;
559
case 2: cpu_set_input_line(device, 4, HOLD_LINE); break;
560
case 1: cpu_set_input_line(device, 5, HOLD_LINE); break; // vblank?
561
case 0: cpu_set_input_line(device, 6, HOLD_LINE); break; // hblank?
559
case 3: device_set_input_line(device, 3, HOLD_LINE); break;
560
case 2: device_set_input_line(device, 4, HOLD_LINE); break;
561
case 1: device_set_input_line(device, 5, HOLD_LINE); break; // vblank?
562
case 0: device_set_input_line(device, 6, HOLD_LINE); break; // hblank?
569
570
switch ( cpu_getiloops(device) )
571
case 2: cpu_set_input_line(device, 3, HOLD_LINE); break;
572
case 1: cpu_set_input_line(device, 4, HOLD_LINE); break;
573
case 0: cpu_set_input_line(device, 5, HOLD_LINE); break;
572
case 2: device_set_input_line(device, 3, HOLD_LINE); break;
573
case 1: device_set_input_line(device, 4, HOLD_LINE); break;
574
case 0: device_set_input_line(device, 5, HOLD_LINE); break;
577
static MACHINE_CONFIG_START( galpani2, driver_device )
578
static MACHINE_CONFIG_START( galpani2, galpani2_state )
579
580
/* basic machine hardware */
580
581
MCFG_CPU_ADD("maincpu", M68000, XTAL_27MHz/2) /* Confirmed on galpani2i PCB */