diff options
| author | 2008-10-08 01:00:36 +0000 | |
|---|---|---|
| committer | 2008-10-08 01:00:36 +0000 | |
| commit | b02332f875130663b16b3e394159247ac3630b75 (patch) | |
| tree | e0adfa7fd5bd28a147ab73c9b2df4b17e255509a /src | |
| parent | 7494be5525e0bf6f83346bfd4392ba52afa1d13f (diff) | |
MCU protection now working for lohtb2 (m72.c)
* Hooked up 6751
* Synchronized protection ram writes with timer callbacks
This is not really stable - please refer to my mail to the dev-list.
Diffstat (limited to 'src')
| -rw-r--r-- | src/mame/audio/m72.c | 5 | ||||
| -rw-r--r-- | src/mame/drivers/m72.c | 89 | ||||
| -rw-r--r-- | src/mame/video/m72.c | 4 |
3 files changed, 75 insertions, 23 deletions
diff --git a/src/mame/audio/m72.c b/src/mame/audio/m72.c index b71de3ee337..d41ba5664b5 100644 --- a/src/mame/audio/m72.c +++ b/src/mame/audio/m72.c @@ -98,11 +98,10 @@ static TIMER_CALLBACK( setvector_callback ) if (irqvector == 0) logerror("You didn't call m72_init_sound()\n"); - cpunum_set_input_line_vector(1,0,irqvector); if (irqvector == 0xff) /* no IRQs pending */ - cpunum_set_input_line(machine, 1,0,CLEAR_LINE); + cputag_set_input_line_and_vector(machine, "sound",0,CLEAR_LINE, irqvector); else /* IRQ pending */ - cpunum_set_input_line(machine, 1,0,ASSERT_LINE); + cputag_set_input_line_and_vector(machine, "sound",0,ASSERT_LINE, irqvector); } MACHINE_RESET( m72_sound ) diff --git a/src/mame/drivers/m72.c b/src/mame/drivers/m72.c index eb853b3aa8a..a75b093f287 100644 --- a/src/mame/drivers/m72.c +++ b/src/mame/drivers/m72.c @@ -137,14 +137,14 @@ static TIMER_CALLBACK( m72_scanline_interrupt ) if (scanline < 256 && scanline == m72_raster_irq_position - 128) { video_screen_update_partial(machine->primary_screen, scanline); - cpunum_set_input_line_and_vector(machine, 0, 0, HOLD_LINE, m72_irq_base + 2); + cputag_set_input_line_and_vector(machine, "main", 0, HOLD_LINE, m72_irq_base + 2); } /* VBLANK interrupt */ else if (scanline == 256) { video_screen_update_partial(machine->primary_screen, scanline); - cpunum_set_input_line_and_vector(machine, 0, 0, HOLD_LINE, m72_irq_base + 0); + cputag_set_input_line_and_vector(machine, "main", 0, HOLD_LINE, m72_irq_base + 0); } /* adjust for next scanline */ @@ -541,29 +541,71 @@ static DRIVER_INIT( loht ) /* since we skip the startup tests, clear video RAM to prevent garbage on title screen */ memset(m72_videoram2,0,0x4000); } +#if 0 +int stepping = 0; + +static TIMER_CALLBACK( single_step ) +{ + if (param>0) + timer_set( ATTOTIME_IN_NSEC(20), NULL, param-1, single_step); + else + stepping = 0; +} +static TIMER_CALLBACK( delayed_ram16_w ) +{ + UINT16 val = ((UINT32) param) & 0xffff; + UINT16 offset = (((UINT32) param) >> 16) & 0xffff; + UINT16 *ram = ptr; -static READ16_HANDLER( m72_main_mcu_r) + ram[offset] = val; + + if (!stepping) + { + stepping = 1; + timer_call_after_resynch( NULL, 50, single_step); + } +} +#else +static TIMER_CALLBACK( delayed_ram16_w ) { - return protection_ram[offset]; + UINT16 val = ((UINT32) param) & 0xffff; + UINT16 offset = (((UINT32) param) >> 16) & 0xffff; + UINT16 *ram = ptr; + + ram[offset] = val; } +#endif + static WRITE16_HANDLER( m72_main_mcu_w) { - COMBINE_DATA(&protection_ram[offset]); + UINT16 val = protection_ram[offset]; + + COMBINE_DATA(&val); + + if (offset == 0x0fff/2 && ACCESSING_BITS_8_15) + { + protection_ram[offset] = val; + cputag_set_input_line(machine, "mcu", 0, PULSE_LINE); + } + else + timer_call_after_resynch( protection_ram, (offset<<16) | val, delayed_ram16_w); } static DRIVER_INIT( loht_mcu ) { + int cpunum = mame_find_cpu_index(machine, "main"); - protection_ram = auto_malloc(0x10000); - - memory_install_readwrite16_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0xb0000, 0xb0fff, 0, 0, m72_main_mcu_r, m72_main_mcu_w); + protection_ram = auto_malloc(0x1000); + memset(protection_ram, 0xff, 0x1000); + memory_install_read16_handler(machine, cpunum, ADDRESS_SPACE_PROGRAM, 0xb0000, 0xb0fff, 0, 0, SMH_BANK1); + memory_install_write16_handler(machine, cpunum, ADDRESS_SPACE_PROGRAM, 0xb0000, 0xb0fff, 0, 0, m72_main_mcu_w); + memory_set_bankptr(1, protection_ram); - memory_install_write16_handler(machine, 0, ADDRESS_SPACE_IO, 0xc0, 0xc1, 0, 0, loht_sample_trigger_w); + memory_install_write16_handler(machine, cpunum, ADDRESS_SPACE_IO, 0xc0, 0xc1, 0, 0, loht_sample_trigger_w); } - static DRIVER_INIT( xmultipl ) { install_protection_handler(machine, xmultipl_code,xmultipl_crc); @@ -741,7 +783,7 @@ static ADDRESS_MAP_START( kengo_map, ADDRESS_SPACE_PROGRAM, 16 ) AM_RANGE(0xa0000, 0xa0bff) AM_READWRITE(m72_palette1_r, m72_palette1_w) AM_BASE(&paletteram16) AM_RANGE(0xa8000, 0xa8bff) AM_READWRITE(m72_palette2_r, m72_palette2_w) AM_BASE(&paletteram16_2) AM_RANGE(0xb0000, 0xb0001) AM_WRITE(m72_irq_line_w) -AM_RANGE(0xb4000, 0xb4001) AM_WRITE(SMH_NOP) /* ??? */ + AM_RANGE(0xb4000, 0xb4001) AM_WRITE(SMH_NOP) /* ??? */ AM_RANGE(0xbc000, 0xbc001) AM_WRITE(m72_dmaon_w) AM_RANGE(0xc0000, 0xc03ff) AM_RAM AM_BASE(&spriteram16) AM_SIZE(&spriteram_size) AM_RANGE(0x80000, 0x83fff) AM_RAM_WRITE(m72_videoram1_w) AM_BASE(&m72_videoram1) @@ -1627,8 +1669,17 @@ ADDRESS_MAP_END static WRITE8_HANDLER( m72_mcu_data_w ) { - if (offset&1) protection_ram[offset/2] = (protection_ram[offset/2] & 0x00ff) | (data << 8); - else protection_ram[offset/2] = (protection_ram[offset/2] & 0xff00) | (data&0xff); + UINT16 val; + if (offset&1) val = (protection_ram[offset/2] & 0x00ff) | (data << 8); + else val = (protection_ram[offset/2] & 0xff00) | (data&0xff); + + if (offset == 6 && data == 0xfe) + /* Hack - The v30 overshoots and will not see the unlock written to offset 6 + * We thus delay the lock, i.e. storing an unconditional branch to 6 + * here. This is highly time critical ... */ + timer_set(ATTOTIME_IN_USEC(10), protection_ram, ((offset >>1 ) << 16) | val, delayed_ram16_w); + else + timer_call_after_resynch( protection_ram, ((offset >>1 ) << 16) | val, delayed_ram16_w); } static READ8_HANDLER(m72_mcu_data_r ) @@ -1636,9 +1687,8 @@ static READ8_HANDLER(m72_mcu_data_r ) UINT8 ret; if (offset&1) ret = (protection_ram[offset/2] & 0xff00)>>8; - else ret =(protection_ram[offset/2] & 0x00ff); + else ret = (protection_ram[offset/2] & 0x00ff); -// printf("ret %02x\n",ret); return ret; } @@ -1690,12 +1740,15 @@ static MACHINE_DRIVER_START( m72 ) MACHINE_DRIVER_END static MACHINE_DRIVER_START( m72_8751 ) - MDRV_IMPORT_FROM(m72) - MDRV_CPU_ADD("mcu",I8751, 8000000) + MDRV_IMPORT_FROM(m72) + + MDRV_CPU_ADD("mcu",I8751, 16000000) MDRV_CPU_PROGRAM_MAP(mcu_map,0) MDRV_CPU_DATA_MAP(mcu_data_map,0) - MDRV_CPU_VBLANK_INT("main", irq0_line_pulse) + //MDRV_CPU_VBLANK_INT("main", irq0_line_pulse) + MDRV_INTERLEAVE(1000) + MACHINE_DRIVER_END diff --git a/src/mame/video/m72.c b/src/mame/video/m72.c index 8a1ba6228b7..5811b61cbab 100644 --- a/src/mame/video/m72.c +++ b/src/mame/video/m72.c @@ -354,9 +354,9 @@ WRITE16_HANDLER( m72_port02_w ) /* bit 4 resets sound CPU (active low) */ if (data & 0x10) - cpunum_set_input_line(machine, 1, INPUT_LINE_RESET, CLEAR_LINE); + cputag_set_input_line(machine, "sound", INPUT_LINE_RESET, CLEAR_LINE); else - cpunum_set_input_line(machine, 1, INPUT_LINE_RESET, ASSERT_LINE); + cputag_set_input_line(machine, "sound", INPUT_LINE_RESET, ASSERT_LINE); /* bit 5 = "bank"? */ } |
