Converted the NMK112 to be a device and updated drivers using it accordingly

This commit is contained in:
Fabio Priuli 2009-12-29 09:38:40 +00:00
parent f10aebf237
commit 60fd368f25
8 changed files with 285 additions and 111 deletions

View File

@ -506,7 +506,7 @@ static ADDRESS_MAP_START( donpachi_map, ADDRESS_SPACE_PROGRAM, 16 )
/**/AM_RANGE(0xa08000, 0xa08fff) AM_RAM AM_BASE_GENERIC(paletteram) AM_SIZE(&cave_paletteram_size) // Palette
AM_RANGE(0xb00000, 0xb00003) AM_DEVREADWRITE8("oki1", okim6295_r, okim6295_w, 0x00ff) // M6295
AM_RANGE(0xb00010, 0xb00013) AM_DEVREADWRITE8("oki2", okim6295_r, okim6295_w, 0x00ff) //
AM_RANGE(0xb00020, 0xb0002f) AM_WRITE(NMK112_okibank_lsb_w) //
AM_RANGE(0xb00020, 0xb0002f) AM_DEVWRITE("nmk112", nmk112_okibank_lsb_w) //
AM_RANGE(0xc00000, 0xc00001) AM_READ_PORT("IN0") // Inputs
AM_RANGE(0xc00002, 0xc00003) AM_READ_PORT("IN1") // Inputs + EEPROM
AM_RANGE(0xd00000, 0xd00001) AM_DEVWRITE("eeprom", cave_eeprom_msb_w) // EEPROM
@ -1053,7 +1053,7 @@ static ADDRESS_MAP_START( pwrinst2_sound_portmap, ADDRESS_SPACE_IO, 8 )
ADDRESS_MAP_GLOBAL_MASK(0xff)
AM_RANGE(0x00, 0x00) AM_DEVREADWRITE("oki1", okim6295_r, okim6295_w) // M6295
AM_RANGE(0x08, 0x08) AM_DEVREADWRITE("oki2", okim6295_r, okim6295_w) //
AM_RANGE(0x10, 0x17) AM_WRITE(NMK112_okibank_w) // Samples bank
AM_RANGE(0x10, 0x17) AM_DEVWRITE("nmk112", nmk112_okibank_w) // Samples bank
AM_RANGE(0x40, 0x41) AM_DEVREADWRITE("ymsnd", ym2203_r, ym2203_w) //
AM_RANGE(0x50, 0x50) AM_WRITE(soundlatch_ack_w) // To Main CPU
// AM_RANGE(0x51, 0x51) AM_WRITENOP // ?? volume
@ -1653,7 +1653,6 @@ static const ym2203_interface ym2203_config =
irqhandler
};
/***************************************************************************
Dangun Feveron
***************************************************************************/
@ -1697,6 +1696,7 @@ MACHINE_DRIVER_END
Dodonpachi
***************************************************************************/
static MACHINE_DRIVER_START( ddonpach )
/* basic machine hardware */
@ -1736,6 +1736,11 @@ MACHINE_DRIVER_END
Donpachi
***************************************************************************/
static const nmk112_interface donpachi_nmk112_intf =
{
"oki1", "oki2", 1 << 0 // chip #0 (music) is not paged
};
static MACHINE_DRIVER_START( donpachi )
/* basic machine hardware */
@ -1773,6 +1778,8 @@ static MACHINE_DRIVER_START( donpachi )
MDRV_SOUND_CONFIG(okim6295_interface_pin7high) // clock frequency & pin 7 not verified
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
MDRV_NMK112_ADD("nmk112", donpachi_nmk112_intf)
MACHINE_DRIVER_END
@ -2101,6 +2108,11 @@ MACHINE_DRIVER_END
/* X1 = 12 MHz, X2 = 28 MHz, X3 = 16 MHz. OKI: / 165 mode A ; / 132 mode B */
static const nmk112_interface pwrinst2_nmk112_intf =
{
"oki1", "oki2", 0
};
static MACHINE_DRIVER_START( pwrinst2 )
/* basic machine hardware */
@ -2153,6 +2165,8 @@ static MACHINE_DRIVER_START( pwrinst2 )
MDRV_SOUND_CONFIG(okim6295_interface_pin7low)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.00)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.00)
MDRV_NMK112_ADD("nmk112", pwrinst2_nmk112_intf)
MACHINE_DRIVER_END
@ -3820,10 +3834,9 @@ static void init_cave(running_machine *machine)
time_vblank_irq = 100;
irq_level = 1;
NMK112_init(0, "oki1", "oki2");
}
static DRIVER_INIT( agallet )
{
init_cave(machine);
@ -3878,10 +3891,9 @@ static DRIVER_INIT( donpachi )
ddonpach_unpack_sprites(machine);
cave_spritetype = 1; // "different" sprites (no zooming?)
time_vblank_irq = 90;
NMK112_init(1<<0, "oki1", "oki2"); // chip #0 (music) is not paged
}
static DRIVER_INIT( esprade )
{
init_cave(machine);

View File

@ -192,12 +192,6 @@ static WRITE16_HANDLER( nmk16_mainram_strange_w )
}
static MACHINE_RESET( nmk16 )
{
NMK112_init(0, "oki1", "oki2");
}
static MACHINE_RESET( NMK004 )
{
NMK004_init(machine);
@ -1082,16 +1076,16 @@ static WRITE8_HANDLER( raphero_sound_rombank_w )
}
static ADDRESS_MAP_START( raphero_sound_mem_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE( 0x0000, 0x7fff ) AM_ROM
AM_RANGE( 0x8000, 0xbfff ) AM_ROMBANK( "bank1" )
AM_RANGE( 0xc000, 0xc001 ) AM_DEVREADWRITE("ymsnd", ym2203_r, ym2203_w )
AM_RANGE( 0xc800, 0xc800 ) AM_DEVREADWRITE( "oki1", okim6295_r, okim6295_w )
AM_RANGE( 0xc808, 0xc808 ) AM_DEVREADWRITE( "oki2", okim6295_r, okim6295_w )
AM_RANGE( 0xc810, 0xc817 ) AM_WRITE( NMK112_okibank_w )
// AM_RANGE( 0xc810, 0xc817 ) AM_WRITE( okibank_w )
AM_RANGE( 0xd000, 0xd000 ) AM_WRITE( raphero_sound_rombank_w )
AM_RANGE( 0xd800, 0xd800 ) AM_READWRITE( soundlatch_r, soundlatch2_w ) // main cpu
AM_RANGE( 0xe000, 0xffff ) AM_RAM
AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank1")
AM_RANGE(0xc000, 0xc001) AM_DEVREADWRITE("ymsnd", ym2203_r, ym2203_w)
AM_RANGE(0xc800, 0xc800) AM_DEVREADWRITE("oki1", okim6295_r, okim6295_w)
AM_RANGE(0xc808, 0xc808) AM_DEVREADWRITE("oki2", okim6295_r, okim6295_w)
AM_RANGE(0xc810, 0xc817) AM_DEVWRITE("nmk112", nmk112_okibank_w)
// AM_RANGE(0xc810, 0xc817) AM_WRITE(okibank_w)
AM_RANGE(0xd000, 0xd000) AM_WRITE(raphero_sound_rombank_w)
AM_RANGE(0xd800, 0xd800) AM_READWRITE(soundlatch_r, soundlatch2_w) // main cpu
AM_RANGE(0xe000, 0xffff) AM_RAM
ADDRESS_MAP_END
static ADDRESS_MAP_START( macross2_sound_map, ADDRESS_SPACE_PROGRAM, 8 )
@ -1108,7 +1102,7 @@ static ADDRESS_MAP_START( macross2_sound_io_map, ADDRESS_SPACE_IO, 8 )
AM_RANGE(0x00, 0x01) AM_DEVREADWRITE("ymsnd", ym2203_r, ym2203_w)
AM_RANGE(0x80, 0x80) AM_DEVREADWRITE("oki1", okim6295_r, okim6295_w)
AM_RANGE(0x88, 0x88) AM_DEVREADWRITE("oki2", okim6295_r, okim6295_w)
AM_RANGE(0x90, 0x97) AM_WRITE(NMK112_okibank_w)
AM_RANGE(0x90, 0x97) AM_DEVWRITE("nmk112", nmk112_okibank_w)
ADDRESS_MAP_END
static ADDRESS_MAP_START( bjtwin_map, ADDRESS_SPACE_PROGRAM, 16 )
@ -1120,7 +1114,7 @@ static ADDRESS_MAP_START( bjtwin_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x080014, 0x080015) AM_WRITE(nmk_flipscreen_w)
AM_RANGE(0x084000, 0x084001) AM_DEVREADWRITE8("oki1", okim6295_r,okim6295_w, 0x00ff)
AM_RANGE(0x084010, 0x084011) AM_DEVREADWRITE8("oki2", okim6295_r,okim6295_w, 0x00ff)
AM_RANGE(0x084020, 0x08402f) AM_WRITE(NMK112_okibank_lsb_w)
AM_RANGE(0x084020, 0x08402f) AM_DEVWRITE("nmk112", nmk112_okibank_lsb_w)
AM_RANGE(0x088000, 0x0887ff) AM_RAM_WRITE(paletteram16_RRRRGGGGBBBBRGBx_word_w) AM_BASE_GENERIC(paletteram)
AM_RANGE(0x094000, 0x094001) AM_WRITE(nmk_tilebank_w)
AM_RANGE(0x094002, 0x094003) AM_WRITENOP /* IRQ enable? */
@ -3529,6 +3523,10 @@ static INTERRUPT_GEN( nmk_interrupt )
else cpu_set_input_line(device, 2, HOLD_LINE);
}
static const nmk112_interface nmk16_nmk112_intf =
{
"oki1", "oki2", 0
};
static MACHINE_DRIVER_START( tharrier )
@ -3544,7 +3542,6 @@ static MACHINE_DRIVER_START( tharrier )
MDRV_MACHINE_RESET(mustang_sound)
/* video hardware */
MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(56)
@ -3963,8 +3960,6 @@ static MACHINE_DRIVER_START( ssmissin )
MDRV_CPU_ADD("audiocpu", Z80, 8000000/2) /* 4 Mhz */
MDRV_CPU_PROGRAM_MAP(ssmissin_sound_map)
MDRV_MACHINE_RESET(nmk16)
/* video hardware */
MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(56)
@ -3986,6 +3981,8 @@ static MACHINE_DRIVER_START( ssmissin )
MDRV_SOUND_ADD("oki1", OKIM6295, 8000000/8) /* 1 Mhz, pin 7 high */
MDRV_SOUND_CONFIG(okim6295_interface_pin7high)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MDRV_NMK112_ADD("nmk112", nmk16_nmk112_intf)
MACHINE_DRIVER_END
static MACHINE_DRIVER_START( strahl )
@ -4221,8 +4218,6 @@ static MACHINE_DRIVER_START( macross2 )
MDRV_CPU_PROGRAM_MAP(macross2_sound_map)
MDRV_CPU_IO_MAP(macross2_sound_io_map)
MDRV_MACHINE_RESET(nmk16)
/* video hardware */
MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(56)
@ -4252,6 +4247,8 @@ static MACHINE_DRIVER_START( macross2 )
MDRV_SOUND_ADD("oki2", OKIM6295, 16000000/4)
MDRV_SOUND_CONFIG(okim6295_interface_pin7low)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.20)
MDRV_NMK112_ADD("nmk112", nmk16_nmk112_intf)
MACHINE_DRIVER_END
static MACHINE_DRIVER_START( tdragon2 )
@ -4266,8 +4263,6 @@ static MACHINE_DRIVER_START( tdragon2 )
MDRV_CPU_PROGRAM_MAP(macross2_sound_map)
MDRV_CPU_IO_MAP(macross2_sound_io_map)
MDRV_MACHINE_RESET(nmk16)
/* video hardware */
MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(56)
@ -4297,6 +4292,8 @@ static MACHINE_DRIVER_START( tdragon2 )
MDRV_SOUND_ADD("oki2", OKIM6295, 16000000/4)
MDRV_SOUND_CONFIG(okim6295_interface_pin7low)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.08)
MDRV_NMK112_ADD("nmk112", nmk16_nmk112_intf)
MACHINE_DRIVER_END
static MACHINE_DRIVER_START( raphero )
@ -4310,8 +4307,6 @@ static MACHINE_DRIVER_START( raphero )
MDRV_CPU_ADD("audiocpu",TMP90841, 8000000)
MDRV_CPU_PROGRAM_MAP(raphero_sound_mem_map)
MDRV_MACHINE_RESET(nmk16)
/* video hardware */
MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(56) // measured
@ -4341,6 +4336,8 @@ static MACHINE_DRIVER_START( raphero )
MDRV_SOUND_ADD("oki2", OKIM6295, 16000000/4)
MDRV_SOUND_CONFIG(okim6295_interface_pin7low)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.20)
MDRV_NMK112_ADD("nmk112", nmk16_nmk112_intf)
MACHINE_DRIVER_END
static MACHINE_DRIVER_START( bjtwin )
@ -4351,8 +4348,6 @@ static MACHINE_DRIVER_START( bjtwin )
MDRV_CPU_VBLANK_INT("screen", irq4_line_hold)
MDRV_CPU_PERIODIC_INT(irq1_line_hold,112)/* ?? drives music */
MDRV_MACHINE_RESET(nmk16)
/* video hardware */
MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(56)
@ -4378,6 +4373,8 @@ static MACHINE_DRIVER_START( bjtwin )
MDRV_SOUND_ADD("oki2", OKIM6295, 16000000/4) /* verified on pcb */
MDRV_SOUND_CONFIG(okim6295_interface_pin7low) /* verified on pcb */
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.20)
MDRV_NMK112_ADD("nmk112", nmk16_nmk112_intf)
MACHINE_DRIVER_END

View File

@ -143,7 +143,7 @@ static ADDRESS_MAP_START( powerins_sound_io_map, ADDRESS_SPACE_IO, 8 )
AM_RANGE(0x00, 0x01) AM_DEVREADWRITE("ym2203", ym2203_r, ym2203_w)
AM_RANGE(0x80, 0x80) AM_DEVREADWRITE("oki1", okim6295_r, okim6295_w)
AM_RANGE(0x88, 0x88) AM_DEVREADWRITE("oki2", okim6295_r, okim6295_w)
AM_RANGE(0x90, 0x97) AM_WRITE(NMK112_okibank_w)
AM_RANGE(0x90, 0x97) AM_DEVWRITE("nmk112", nmk112_okibank_w)
ADDRESS_MAP_END
static ADDRESS_MAP_START( powerinb_sound_io_map, ADDRESS_SPACE_IO, 8 )
@ -152,7 +152,7 @@ static ADDRESS_MAP_START( powerinb_sound_io_map, ADDRESS_SPACE_IO, 8 )
AM_RANGE(0x01, 0x01) AM_NOP
AM_RANGE(0x80, 0x80) AM_DEVREADWRITE("oki1", okim6295_r, okim6295_w)
AM_RANGE(0x88, 0x88) AM_DEVREADWRITE("oki2", okim6295_r, okim6295_w)
AM_RANGE(0x90, 0x97) AM_WRITE(NMK112_okibank_w)
AM_RANGE(0x90, 0x97) AM_DEVWRITE("nmk112", nmk112_okibank_w)
ADDRESS_MAP_END
@ -334,10 +334,8 @@ GFXDECODE_END
static MACHINE_RESET( powerins )
{
oki_bank = -1; // samples bank "unitialised"
NMK112_init(0, "oki1", "oki2");
}
static void irqhandler(const device_config *device, int irq)
{
cputag_set_input_line(device->machine, "soundcpu", 0, irq ? ASSERT_LINE : CLEAR_LINE);
@ -353,6 +351,12 @@ static const ym2203_interface ym2203_config =
irqhandler
};
static const nmk112_interface powerins_nmk112_intf =
{
"oki1", "oki2", 0
};
static MACHINE_DRIVER_START( powerins )
/* basic machine hardware */
@ -394,6 +398,8 @@ static MACHINE_DRIVER_START( powerins )
MDRV_SOUND_ADD("ym2203", YM2203, 12000000 / 8)
MDRV_SOUND_CONFIG(ym2203_config)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 2.0)
MDRV_NMK112_ADD("nmk112", powerins_nmk112_intf)
MACHINE_DRIVER_END
static MACHINE_DRIVER_START( powerina )

View File

@ -57,7 +57,7 @@ static ADDRESS_MAP_START( quizpani_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x100016, 0x100017) AM_WRITENOP /* IRQ enable? */
AM_RANGE(0x100018, 0x100019) AM_WRITE(quizpani_tilesbank_w)
AM_RANGE(0x104000, 0x104001) AM_DEVREADWRITE8("oki", okim6295_r,okim6295_w, 0x00ff)
AM_RANGE(0x104020, 0x104027) AM_WRITE(NMK112_okibank_lsb_w)
AM_RANGE(0x104020, 0x104027) AM_DEVWRITE("nmk112", nmk112_okibank_lsb_w)
AM_RANGE(0x108000, 0x1083ff) AM_RAM_WRITE(paletteram16_RRRRGGGGBBBBRGBx_word_w) AM_BASE_GENERIC(paletteram)
AM_RANGE(0x108400, 0x1085ff) AM_WRITENOP
AM_RANGE(0x10c000, 0x10c007) AM_RAM AM_BASE(&quizpani_scrollreg)
@ -234,10 +234,11 @@ static GFXDECODE_START( quizpani )
GFXDECODE_END
static MACHINE_RESET( quizpani )
static const nmk112_interface quizpani_nmk112_intf =
{
NMK112_init(0, "oki", "oki");
}
"oki", "oki", 0
};
static MACHINE_DRIVER_START( quizpani )
MDRV_CPU_ADD("maincpu", M68000, 10000000)
@ -245,12 +246,9 @@ static MACHINE_DRIVER_START( quizpani )
MDRV_CPU_VBLANK_INT("screen", irq4_line_hold)
MDRV_CPU_PERIODIC_INT(irq1_line_hold,164) // music tempo
MDRV_MACHINE_RESET( quizpani )
MDRV_GFXDECODE(quizpani)
MDRV_PALETTE_LENGTH(0x200)
MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(60)
MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
@ -266,6 +264,8 @@ static MACHINE_DRIVER_START( quizpani )
MDRV_SOUND_ADD("oki", OKIM6295, 16000000/4)
MDRV_SOUND_CONFIG(okim6295_interface_pin7low)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MDRV_NMK112_ADD("nmk112", quizpani_nmk112_intf)
MACHINE_DRIVER_END
ROM_START( quizpani )

View File

@ -353,10 +353,6 @@ static MACHINE_RESET( bgaregga )
memory_configure_bank(machine, "bank1", 0, 16, Z80, 0x4000);
memory_set_bank(machine, "bank1", 4);
if (memory_region(machine, "oki1") != NULL)
NMK112_init(0, "oki1", "oki2");
else
NMK112_init(0, "oki", "oki");
MACHINE_RESET_CALL(toaplan2);
}
@ -1091,26 +1087,34 @@ static WRITE8_HANDLER( bgaregga_bankswitch_w )
static WRITE8_HANDLER( raizing_okim6295_bankselect_0 )
{
NMK112_okibank_w(space, 0, data & 0x0f); // chip 0 bank 0
NMK112_okibank_w(space, 1, (data >> 4) & 0x0f); // chip 0 bank 1
const device_config *nmk112 = devtag_get_device(space->machine, "nmk112");
nmk112_okibank_w(nmk112, 0, data & 0x0f); // chip 0 bank 0
nmk112_okibank_w(nmk112, 1, (data >> 4) & 0x0f); // chip 0 bank 1
}
static WRITE8_HANDLER( raizing_okim6295_bankselect_1 )
{
NMK112_okibank_w(space, 2, data & 0x0f); // chip 0 bank 2
NMK112_okibank_w(space, 3, (data >> 4) & 0x0f); // chip 0 bank 3
const device_config *nmk112 = devtag_get_device(space->machine, "nmk112");
nmk112_okibank_w(nmk112, 2, data & 0x0f); // chip 0 bank 2
nmk112_okibank_w(nmk112, 3, (data >> 4) & 0x0f); // chip 0 bank 3
}
static WRITE8_HANDLER( raizing_okim6295_bankselect_2 )
{
NMK112_okibank_w(space, 4, data & 0x0f); // chip 1 bank 0
NMK112_okibank_w(space, 5, (data >> 4) & 0x0f); // chip 1 bank 1
const device_config *nmk112 = devtag_get_device(space->machine, "nmk112");
nmk112_okibank_w(nmk112, 4, data & 0x0f); // chip 1 bank 0
nmk112_okibank_w(nmk112, 5, (data >> 4) & 0x0f); // chip 1 bank 1
}
static WRITE8_HANDLER( raizing_okim6295_bankselect_3 )
{
NMK112_okibank_w(space, 6, data & 0x0f); // chip 1 bank 2
NMK112_okibank_w(space, 7, (data >> 4) & 0x0f); // chip 1 bank 3
const device_config *nmk112 = devtag_get_device(space->machine, "nmk112");
nmk112_okibank_w(nmk112, 6, data & 0x0f); // chip 1 bank 2
nmk112_okibank_w(nmk112, 7, (data >> 4) & 0x0f); // chip 1 bank 3
}
@ -4043,6 +4047,17 @@ static const UINT8 ts007spy_decryption_table[256] = {
static const nec_config ts007spy_config ={ ts007spy_decryption_table, };
static const nmk112_interface bgaregga_nmk112_intf =
{
"oki", "oki", 0
};
static const nmk112_interface batrider_nmk112_intf =
{
"oki1", "oki2", 0
};
static MACHINE_DRIVER_START( batsugun )
/* basic machine hardware */
@ -4247,6 +4262,8 @@ static MACHINE_DRIVER_START( bgaregga )
MDRV_SOUND_ADD("oki", OKIM6295, XTAL_32MHz/16)
MDRV_SOUND_CONFIG(okim6295_interface_pin7high)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MDRV_NMK112_ADD("nmk112", bgaregga_nmk112_intf)
MACHINE_DRIVER_END
@ -4293,6 +4310,8 @@ static MACHINE_DRIVER_START( batrider )
MDRV_SOUND_ADD("oki2", OKIM6295, XTAL_32MHz/10)
MDRV_SOUND_CONFIG(okim6295_interface_pin7low)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MDRV_NMK112_ADD("nmk112", batrider_nmk112_intf)
MACHINE_DRIVER_END
static MACHINE_DRIVER_START( bbakraid )

View File

@ -5,30 +5,30 @@
#define FM_CHANNELS 6
#define PSG_CHANNELS 3
#define EFFECTS_CHANNELS 8
#define FM_CHANNELS 6
#define PSG_CHANNELS 3
#define EFFECTS_CHANNELS 8
#define FM_FLAG_NEED_INITIALIZATION (1<<0)
#define FM_FLAG_UNKNOWN2 (1<<1)
#define FM_FLAG_NOTE_IS_PAUSE (1<<2)
#define FM_FLAG_UNKNOWN3 (1<<3)
#define FM_FLAG_MODULATE_NOTE (1<<4)
#define FM_FLAG_MUST_SEND_KEYON (1<<5)
#define FM_FLAG_MUST_SEND_CONFIGURATION (1<<6)
#define FM_FLAG_ACTIVE (1<<7)
#define FM_FLAG_NEED_INITIALIZATION (1<<0)
#define FM_FLAG_UNKNOWN2 (1<<1)
#define FM_FLAG_NOTE_IS_PAUSE (1<<2)
#define FM_FLAG_UNKNOWN3 (1<<3)
#define FM_FLAG_MODULATE_NOTE (1<<4)
#define FM_FLAG_MUST_SEND_KEYON (1<<5)
#define FM_FLAG_MUST_SEND_CONFIGURATION (1<<6)
#define FM_FLAG_ACTIVE (1<<7)
#define PSG_FLAG_ACTIVE (1<<0)
#define PSG_FLAG_NOTE_IS_PAUSE (1<<1)
#define PSG_FLAG_NEED_INITIALIZATION (1<<2)
#define PSG_FLAG_INITIALIZE_VOLUME (1<<3)
#define PSG_FLAG_NOTE_IS_NOISE (1<<5)
#define PSG_FLAG_NOISE_NOT_ENABLED (1<<6)
#define PSG_FLAG_ACTIVE (1<<0)
#define PSG_FLAG_NOTE_IS_PAUSE (1<<1)
#define PSG_FLAG_NEED_INITIALIZATION (1<<2)
#define PSG_FLAG_INITIALIZE_VOLUME (1<<3)
#define PSG_FLAG_NOTE_IS_NOISE (1<<5)
#define PSG_FLAG_NOISE_NOT_ENABLED (1<<6)
#define EFFECTS_FLAG_NEED_INITIALIZATION (1<<0)
#define EFFECTS_FLAG_ACTIVE (1<<7)
#define EFFECTS_FLAG_NEED_INITIALIZATION (1<<0)
#define EFFECTS_FLAG_ACTIVE (1<<7)
#define NOTE_PAUSE 0x0c
#define NOTE_PAUSE 0x0c
struct psg_control
{

View File

@ -10,40 +10,65 @@
#include "driver.h"
#include "nmk112.h"
#define MAXCHIPS 2
#define TABLESIZE 0x100
#define BANKSIZE 0x10000
#define TABLESIZE 0x100
#define BANKSIZE 0x10000
/* which chips have their sample address table divided into pages */
static UINT8 page_mask;
static UINT8 current_bank[8];
static const char *region[2];
void NMK112_init(UINT8 disable_page_mask, const char *rgn0, const char *rgn1)
typedef struct _nmk112_state nmk112_state;
struct _nmk112_state
{
region[0] = rgn0;
region[1] = rgn1;
memset(current_bank, ~0, sizeof(current_bank));
page_mask = ~disable_page_mask;
/* which chips have their sample address table divided into pages */
UINT8 page_mask;
UINT8 current_bank[8];
UINT8 last_bank[2];
UINT8 *rom0, *rom1;
int size0, size1;
};
/*****************************************************************************
INLINE FUNCTIONS
*****************************************************************************/
INLINE nmk112_state *get_safe_token( const device_config *device )
{
assert(device != NULL);
assert(device->token != NULL);
assert(device->type == NMK112);
return (nmk112_state *)device->token;
}
WRITE8_HANDLER( NMK112_okibank_w )
INLINE const nmk112_interface *get_interface( const device_config *device )
{
int chip = (offset & 4) >> 2;
int banknum = offset & 3;
int paged = (page_mask & (1 << chip));
assert(device != NULL);
assert((device->type == NMK112));
return (const nmk112_interface *) device->static_config;
}
UINT8 *rom = memory_region(space->machine, region[chip]);
int size = memory_region_length(space->machine, region[chip]) - 0x40000;
int bankaddr = (data * BANKSIZE) % size;
/*****************************************************************************
DEVICE HANDLERS
*****************************************************************************/
if (current_bank[offset] == data) return;
current_bank[offset] = data;
WRITE8_DEVICE_HANDLER( nmk112_okibank_w )
{
nmk112_state *nmk112 = get_safe_token(device);
int chip = (offset & 4) >> 2;
int banknum = offset & 3;
int paged = (nmk112->page_mask & (1 << chip));
UINT8 *rom = chip ? nmk112->rom1 : nmk112->rom0;
int size = chip ? nmk112->size1 : nmk112->size0;
int bankaddr = (data * BANKSIZE) % size;
if (nmk112->current_bank[offset] == data)
return;
nmk112->current_bank[offset] = data;
/* copy the samples */
if ((paged) && (banknum == 0))
memcpy(rom + 0x400, rom + 0x40000 + bankaddr+0x400, BANKSIZE-0x400);
memcpy(rom + 0x400, rom + 0x40000 + bankaddr + 0x400, BANKSIZE - 0x400);
else
memcpy(rom + banknum * BANKSIZE, rom + 0x40000 + bankaddr, BANKSIZE);
@ -53,12 +78,87 @@ WRITE8_HANDLER( NMK112_okibank_w )
rom += banknum * TABLESIZE;
memcpy(rom, rom + 0x40000 + bankaddr, TABLESIZE);
}
nmk112->last_bank[chip] = offset & 3;
}
WRITE16_HANDLER( NMK112_okibank_lsb_w )
WRITE16_DEVICE_HANDLER( nmk112_okibank_lsb_w )
{
if (ACCESSING_BITS_0_7)
{
NMK112_okibank_w(space, offset, data & 0xff);
nmk112_okibank_w(device, offset, data & 0xff);
}
}
static STATE_POSTLOAD( nmk112_postload_bankswitch )
{
nmk112_state *nmk112 = (nmk112_state *)param;
int i;
for (i = 0; i < 2; i++)
{
int banknum = nmk112->last_bank[i];
int paged = (nmk112->page_mask & (1 << i));
UINT8 *rom = i ? nmk112->rom1 : nmk112->rom0;
int size = i ? nmk112->size1 : nmk112->size0;
int bankaddr = (nmk112->current_bank[nmk112->last_bank[i] + i * 4] * BANKSIZE) % size;
/* copy the samples */
if ((paged) && (banknum == 0))
memcpy(rom + 0x400, rom + 0x40000 + bankaddr + 0x400, BANKSIZE - 0x400);
else
memcpy(rom + banknum * BANKSIZE, rom + 0x40000 + bankaddr, BANKSIZE);
/* also copy the sample address table, if it is paged on this chip */
if (paged)
{
rom += banknum * TABLESIZE;
memcpy(rom, rom + 0x40000 + bankaddr, TABLESIZE);
}
}
}
/*****************************************************************************
DEVICE INTERFACE
*****************************************************************************/
static DEVICE_START( nmk112 )
{
nmk112_state *nmk112 = get_safe_token(device);
const nmk112_interface *intf = get_interface(device);
nmk112->rom0 = memory_region(device->machine, intf->rgn0);
nmk112->size0 = memory_region_length(device->machine, intf->rgn0) - 0x40000;
nmk112->rom1 = memory_region(device->machine, intf->rgn1);
nmk112->size1 = memory_region_length(device->machine, intf->rgn1) - 0x40000;
nmk112->page_mask = ~intf->disable_page_mask;
state_save_register_device_item_array(device, 0, nmk112->current_bank);
state_save_register_device_item_array(device, 0, nmk112->last_bank);
state_save_register_postload(device->machine, nmk112_postload_bankswitch, nmk112);
}
static DEVICE_RESET( nmk112 )
{
nmk112_state *nmk112 = get_safe_token(device);
int i;
for (i = 0; i < 8; i++)
nmk112->current_bank[i] = ~0;
}
/*****************************************************************************
DEVICE DEFINITION
*****************************************************************************/
static const char DEVTEMPLATE_SOURCE[] = __FILE__;
#define DEVTEMPLATE_ID(p,s) p##nmk112##s
#define DEVTEMPLATE_FEATURES DT_HAS_START | DT_HAS_RESET
#define DEVTEMPLATE_NAME "NMK 112"
#define DEVTEMPLATE_FAMILY "NMK 112 Bankswitch IC"
#include "devtempl.h"

View File

@ -1,9 +1,49 @@
#ifndef NMK112_H
#define NMK112_H
/*************************************************************************
void NMK112_init(UINT8 disable_page_mask, const char *rgn0, const char *rgn1);
nmk112.h
WRITE8_HANDLER( NMK112_okibank_w );
WRITE16_HANDLER( NMK112_okibank_lsb_w );
**************************************************************************/
#endif
#ifndef __NMK112_H__
#define __NMK112_H__
#include "devcb.h"
/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
typedef struct _nmk112_interface nmk112_interface;
struct _nmk112_interface
{
const char *rgn0, *rgn1;
UINT8 disable_page_mask;
};
/***************************************************************************
FUNCTION PROTOTYPES
***************************************************************************/
DEVICE_GET_INFO( nmk112 );
/***************************************************************************
DEVICE CONFIGURATION MACROS
***************************************************************************/
#define NMK112 DEVICE_GET_INFO_NAME( nmk112 )
#define MDRV_NMK112_ADD(_tag, _interface) \
MDRV_DEVICE_ADD(_tag, NMK112, 0) \
MDRV_DEVICE_CONFIG(_interface)
/***************************************************************************
DEVICE I/O FUNCTIONS
***************************************************************************/
WRITE8_DEVICE_HANDLER( nmk112_okibank_w );
WRITE16_DEVICE_HANDLER( nmk112_okibank_lsb_w );
#endif /* __NMK112_H__ */