ajax.cpp, parodius.cpp: finders and other minor cleanups

This commit is contained in:
Ivan Vangelista 2022-04-07 18:28:21 +02:00
parent bc88265458
commit df5962a0fb
8 changed files with 705 additions and 748 deletions

View File

@ -2400,9 +2400,6 @@ files {
MAME_DIR .. "src/mame/includes/88games.h",
MAME_DIR .. "src/mame/video/88games.cpp",
MAME_DIR .. "src/mame/drivers/ajax.cpp",
MAME_DIR .. "src/mame/includes/ajax.h",
MAME_DIR .. "src/mame/machine/ajax.cpp",
MAME_DIR .. "src/mame/video/ajax.cpp",
MAME_DIR .. "src/mame/drivers/aliens.cpp",
MAME_DIR .. "src/mame/includes/aliens.h",
MAME_DIR .. "src/mame/video/aliens.cpp",
@ -2567,8 +2564,6 @@ files {
MAME_DIR .. "src/mame/includes/pandoras.h",
MAME_DIR .. "src/mame/video/pandoras.cpp",
MAME_DIR .. "src/mame/drivers/parodius.cpp",
MAME_DIR .. "src/mame/includes/parodius.h",
MAME_DIR .. "src/mame/video/parodius.cpp",
MAME_DIR .. "src/mame/drivers/pingpong.cpp",
MAME_DIR .. "src/mame/includes/pingpong.h",
MAME_DIR .. "src/mame/video/pingpong.cpp",

View File

@ -13,50 +13,433 @@
***************************************************************************/
#include "emu.h"
#include "includes/ajax.h"
#include "includes/konamipt.h"
#include "cpu/z80/z80.h"
#include "includes/konamipt.h"
#include "video/k051316.h"
#include "video/k051960.h"
#include "video/k052109.h"
#include "video/konami_helper.h"
#include "cpu/m6809/hd6309.h"
#include "cpu/m6809/konami.h"
#include "cpu/z80/z80.h"
#include "machine/gen_latch.h"
#include "machine/watchdog.h"
#include "sound/k007232.h"
#include "sound/ymopm.h"
#include "emupal.h"
#include "speaker.h"
void ajax_state::ajax_main_map(address_map &map)
// configurable logging
#define LOG_LS138 (1U << 1)
//#define VERBOSE (LOG_GENERAL | LOG_LS138)
#include "logmacro.h"
#define LOGLS138(...) LOGMASKED(LOG_LS138, __VA_ARGS__)
namespace {
class ajax_state : public driver_device
{
map(0x0000, 0x01c0).rw(FUNC(ajax_state::ls138_f10_r), FUNC(ajax_state::ls138_f10_w)); /* bankswitch + sound command + FIRQ command */
map(0x0800, 0x0807).rw(m_k051960, FUNC(k051960_device::k051937_r), FUNC(k051960_device::k051937_w)); /* sprite control registers */
map(0x0c00, 0x0fff).rw(m_k051960, FUNC(k051960_device::k051960_r), FUNC(k051960_device::k051960_w)); /* sprite RAM 2128SL at J7 */
map(0x1000, 0x1fff).ram().w(m_palette, FUNC(palette_device::write8)).share("palette");/* palette */
map(0x2000, 0x3fff).ram().share("share1"); /* shared RAM with the 6809 */
map(0x4000, 0x5fff).ram(); /* RAM 6264L at K10 */
map(0x6000, 0x7fff).bankr("mainbank"); /* banked ROM */
map(0x8000, 0xffff).rom(); /* ROM N11 */
public:
ajax_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_subcpu(*this, "sub"),
m_watchdog(*this, "watchdog"),
m_k007232(*this, "k007232_%u", 1U),
m_k052109(*this, "k052109"),
m_k051960(*this, "k051960"),
m_k051316(*this, "k051316"),
m_palette(*this, "palette"),
m_soundlatch(*this, "soundlatch"),
m_mainbank(*this, "mainbank"),
m_subbank(*this, "subbank"),
m_system(*this, "SYSTEM"),
m_pl(*this, "P%u", 1U),
m_dsw(*this, "DSW%u", 1U),
m_lamps(*this, "lamp%u", 0U)
{ }
void ajax(machine_config &config);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
private:
// devices
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<cpu_device> m_subcpu;
required_device<watchdog_timer_device> m_watchdog;
required_device_array<k007232_device, 2> m_k007232;
required_device<k052109_device> m_k052109;
required_device<k051960_device> m_k051960;
required_device<k051316_device> m_k051316;
required_device<palette_device> m_palette;
required_device<generic_latch_8_device> m_soundlatch;
required_memory_bank m_mainbank;
required_memory_bank m_subbank;
required_ioport m_system;
required_ioport_array<2> m_pl;
required_ioport_array<3> m_dsw;
output_finder<8> m_lamps;
// video-related
uint8_t m_priority = 0U;
// misc
uint8_t m_firq_enable = 0;
void sound_bank_w(uint8_t data);
uint8_t ls138_f10_r(offs_t offset);
void ls138_f10_w(offs_t offset, uint8_t data);
void sub_bankswitch_w(uint8_t data);
void main_bankswitch_w(uint8_t data);
void lamps_w(uint8_t data);
void k007232_extvol_w(uint8_t data);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void volume_callback0(uint8_t data);
void volume_callback1(uint8_t data);
K051316_CB_MEMBER(zoom_callback);
K052109_CB_MEMBER(tile_callback);
K051960_CB_MEMBER(sprite_callback);
void main_map(address_map &map);
void sound_map(address_map &map);
void sub_map(address_map &map);
};
// video
/***************************************************************************
Callbacks for the K052109
***************************************************************************/
K052109_CB_MEMBER(ajax_state::tile_callback)
{
static const int layer_colorbase[] = { 1024 / 16, 0 / 16, 512 / 16 };
*code |= ((*color & 0x0f) << 8) | (bank << 12);
*color = layer_colorbase[layer] + ((*color & 0xf0) >> 4);
}
void ajax_state::ajax_sub_map(address_map &map)
/***************************************************************************
Callbacks for the K051960
***************************************************************************/
K051960_CB_MEMBER(ajax_state::sprite_callback)
{
map(0x0000, 0x07ff).rw(m_k051316, FUNC(k051316_device::read), FUNC(k051316_device::write)); /* 051316 zoom/rotation layer */
map(0x0800, 0x080f).w(m_k051316, FUNC(k051316_device::ctrl_w)); /* 051316 control registers */
map(0x1000, 0x17ff).r(m_k051316, FUNC(k051316_device::rom_r)); /* 051316 (ROM test) */
map(0x1800, 0x1800).w(FUNC(ajax_state::bankswitch_2_w)); /* bankswitch control */
map(0x2000, 0x3fff).ram().share("share1"); /* shared RAM with the 052001 */
map(0x4000, 0x7fff).rw(m_k052109, FUNC(k052109_device::read), FUNC(k052109_device::write)); /* video RAM + color RAM + video registers */
map(0x8000, 0x9fff).bankr("subbank"); /* banked ROM */
map(0xa000, 0xffff).rom().region("sub", 0x12000); /* ROM I16 */
enum { sprite_colorbase = 256 / 16 };
/* priority bits:
4 over zoom (0 = have priority)
5 over B (0 = have priority)
6 over A (1 = have priority)
never over F
*/
*priority = 0;
if ( *color & 0x10) *priority |= GFX_PMASK_4; // Z = 4
if (~*color & 0x40) *priority |= GFX_PMASK_2; // A = 2
if ( *color & 0x20) *priority |= GFX_PMASK_1; // B = 1
*color = sprite_colorbase + (*color & 0x0f);
}
void ajax_state::ajax_sound_map(address_map &map)
/***************************************************************************
Callbacks for the K051316
***************************************************************************/
K051316_CB_MEMBER(ajax_state::zoom_callback)
{
map(0x0000, 0x7fff).rom(); /* ROM F6 */
map(0x8000, 0x87ff).ram(); /* RAM 2128SL at D16 */
map(0x9000, 0x9000).w(FUNC(ajax_state::sound_bank_w)); /* 007232 bankswitch */
map(0xa000, 0xa00d).rw(m_k007232_1, FUNC(k007232_device::read), FUNC(k007232_device::write)); /* 007232 registers (chip 1) */
map(0xb000, 0xb00d).rw(m_k007232_2, FUNC(k007232_device::read), FUNC(k007232_device::write)); /* 007232 registers (chip 2) */
map(0xb80c, 0xb80c).w(FUNC(ajax_state::k007232_extvol_w)); /* extra volume, goes to the 007232 w/ A11 */
/* selecting a different latch for the external port */
map(0xc000, 0xc001).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write)); /* YM2151 */
enum { zoom_colorbase = 768 / 128 };
*code |= ((*color & 0x07) << 8);
*color = zoom_colorbase + ((*color & 0x08) >> 3);
}
/***************************************************************************
Display Refresh
***************************************************************************/
uint32_t ajax_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_k052109->tilemap_update();
screen.priority().fill(0, cliprect);
bitmap.fill(m_palette->black_pen(), cliprect);
m_k052109->tilemap_draw(screen, bitmap, cliprect, 2, 0, 1);
if (m_priority)
{
// basic layer order is B, zoom, A, F
m_k051316->zoom_draw(screen, bitmap, cliprect, 0, 4);
m_k052109->tilemap_draw(screen, bitmap, cliprect, 1, 0, 2);
}
else
{
// basic layer order is B, A, zoom, F
m_k052109->tilemap_draw(screen, bitmap, cliprect, 1, 0, 2);
m_k051316->zoom_draw(screen, bitmap, cliprect, 0, 4);
}
m_k051960->k051960_sprites_draw(bitmap, cliprect, screen.priority(), -1, -1);
m_k052109->tilemap_draw(screen, bitmap, cliprect, 0, 0, 0);
return 0;
}
// machine
/* main_bankswitch_w:
Handled by the LS273 Octal +ve edge trigger D-type Flip-flop with Reset at H11:
Bit Description
--- -----------
7 MRB3 Selects ROM N11/N12
6 CCOUNT2 Coin Counter 2 (*)
5 CCOUNT1 Coin Counter 1 (*)
4 SRESET Slave CPU Reset?
3 PRI0 Layer Priority Selector
2 MRB2 \
1 MRB1 | ROM Bank Select
0 MRB0 /
(*) The Coin Counters are handled by the Konami Custom 051550
*/
void ajax_state::main_bankswitch_w(uint8_t data)
{
int bank = 0;
// ROM select
if (!(data & 0x80))
bank += 4;
// coin counters
machine().bookkeeping().coin_counter_w(0, data & 0x20);
machine().bookkeeping().coin_counter_w(1, data & 0x40);
// priority
m_priority = data & 0x08;
// bank # (ROMS N11 and N12)
bank += (data & 0x07);
m_mainbank->set_entry(bank);
}
/* lamps_w:
Handled by the LS273 Octal +ve edge trigger D-type Flip-flop with Reset at B9:
Bit Description
--- -----------
7 LAMP7 & LAMP8 - Game over lamps (*)
6 LAMP3 & LAMP4 - Game over lamps (*)
5 LAMP1 - Start lamp (*)
4 Control panel quaking (**)
3 Joystick vibration (**)
2 LAMP5 & LAMP6 - Power up lamps (*)
1 LAMP2 - Super weapon lamp (*)
0 unused
(*) The Lamps are handled by the M54585P
(**)Vibration/Quaking handled by these chips:
Chip Location Description
---- -------- -----------
PS2401-4 B21 ???
UPA1452H B22 ???
LS74 H2 Dual +ve edge trigger D-type Flip-flop with SET and RESET
LS393 C20 Dual -ve edge trigger 4-bit Binary Ripple Counter with Resets
*/
void ajax_state::lamps_w(uint8_t data)
{
m_lamps[1] = BIT(data, 1); // super weapon lamp
m_lamps[2] = BIT(data, 2); // power up lamps
m_lamps[5] = BIT(data, 2); // power up lamps
m_lamps[0] = BIT(data, 5); // start lamp
m_lamps[3] = BIT(data, 6); // game over lamps
m_lamps[6] = BIT(data, 6); // game over lamps
m_lamps[4] = BIT(data, 7); // game over lamps
m_lamps[7] = BIT(data, 7); // game over lamps
}
/* ajax_ls138_f10:
The LS138 1-of-8 Decoder/Demultiplexer at F10 selects what to do:
Address R/W Description
------- --- -----------
0x0000 (r) ??? I think this read is because a CPU core bug
(w) 0x0000 NSFIRQ Trigger FIRQ on the M6809
0x0020 AFR Watchdog reset (handled by the 051550)
0x0040 (w) SOUND Cause interrupt on the Z80
0x0080 (w) SOUNDDATA Sound code number
0x00c0 (w) MBL1 Enables the LS273 at H11 (Banking + Coin counters)
0x0100 (r) MBL2 Enables 2P Inputs reading
0x0140 (w) MBL3 Enables the LS273 at B9 (Lamps + Vibration)
0x0180 (r) MIO1 Enables 1P Inputs + DIPSW #1 & #2 reading
0x01c0 (r) MIO2 Enables DIPSW #3 reading
*/
uint8_t ajax_state::ls138_f10_r(offs_t offset)
{
int data = 0, index;
switch ((offset & 0x01c0) >> 6)
{
case 0x00: // ???
data = machine().rand();
break;
case 0x04: // 2P inputs
data = m_pl[1]->read();
break;
case 0x06: // 1P inputs + DIPSW #1 & #2
index = offset & 0x01;
data = (offset & 0x02) ? m_dsw[index]->read() : index ? m_pl[0]->read() : m_system->read();
break;
case 0x07: // DIPSW #3
data = m_dsw[2]->read();
break;
default:
LOGLS138("%04x: (ls138_f10) read from an unknown address %02x\n", m_maincpu->pc(), offset);
}
return data;
}
void ajax_state::ls138_f10_w(offs_t offset, uint8_t data)
{
switch ((offset & 0x01c0) >> 6)
{
case 0x00: // NSFIRQ + AFR
if (offset)
m_watchdog->watchdog_reset();
else{
if (m_firq_enable) // Cause interrupt on slave CPU
m_subcpu->set_input_line(M6809_FIRQ_LINE, HOLD_LINE);
}
break;
case 0x01: // Cause interrupt on audio CPU
m_audiocpu->set_input_line(0, HOLD_LINE);
break;
case 0x02: // Sound command number
m_soundlatch->write(data);
break;
case 0x03: // Bankswitch + coin counters + priority
main_bankswitch_w(data);
break;
case 0x05: // Lamps + Joystick vibration + Control panel quaking
lamps_w(data);
break;
default:
LOGLS138("%04x: (ls138_f10) write %02x to an unknown address %02x\n", m_maincpu->pc(), data, offset);
}
}
/* sub_bankswitch_w:
Handled by the LS273 Octal +ve edge trigger D-type Flip-flop with Reset at K14:
Bit Description
--- -----------
7 unused
6 RMRD Enable char ROM reading through the video RAM
5 RVO enables 051316 wraparound
4 FIRQST FIRQ control
3 SRB3 \
2 SRB2 |
1 SRB1 | ROM Bank Select
0 SRB0 /
*/
void ajax_state::sub_bankswitch_w(uint8_t data)
{
// enable char ROM reading through the video RAM
m_k052109->set_rmrd_line((data & 0x40) ? ASSERT_LINE : CLEAR_LINE);
// bit 5 enables 051316 wraparound
m_k051316->wraparound_enable(data & 0x20);
// FIRQ control
m_firq_enable = data & 0x10;
// bank # (ROMS G16 and I16)
m_subbank->set_entry(data & 0x0f);
}
void ajax_state::machine_start()
{
uint8_t *main = memregion("maincpu")->base();
uint8_t *sub = memregion("sub")->base();
m_lamps.resolve();
m_mainbank->configure_entries(0, 4, &main[0x00000], 0x2000);
m_mainbank->configure_entries(4, 8, &main[0x10000], 0x2000);
m_subbank->configure_entries(0, 9, &sub[0x00000], 0x2000);
save_item(NAME(m_priority));
save_item(NAME(m_firq_enable));
}
void ajax_state::machine_reset()
{
m_priority = 0;
m_firq_enable = 0;
}
void ajax_state::main_map(address_map &map)
{
map(0x0000, 0x01c0).rw(FUNC(ajax_state::ls138_f10_r), FUNC(ajax_state::ls138_f10_w)); // bankswitch + sound command + FIRQ command
map(0x0800, 0x0807).rw(m_k051960, FUNC(k051960_device::k051937_r), FUNC(k051960_device::k051937_w)); // sprite control registers
map(0x0c00, 0x0fff).rw(m_k051960, FUNC(k051960_device::k051960_r), FUNC(k051960_device::k051960_w)); // sprite RAM 2128SL at J7
map(0x1000, 0x1fff).ram().w(m_palette, FUNC(palette_device::write8)).share("palette");
map(0x2000, 0x3fff).ram().share("main_sub_ram"); // shared RAM with the 6809
map(0x4000, 0x5fff).ram(); // RAM 6264L at K10
map(0x6000, 0x7fff).bankr(m_mainbank); // banked ROM
map(0x8000, 0xffff).rom(); // ROM N11
}
void ajax_state::sub_map(address_map &map)
{
map(0x0000, 0x07ff).rw(m_k051316, FUNC(k051316_device::read), FUNC(k051316_device::write)); // 051316 zoom/rotation layer
map(0x0800, 0x080f).w(m_k051316, FUNC(k051316_device::ctrl_w)); // 051316 control registers
map(0x1000, 0x17ff).r(m_k051316, FUNC(k051316_device::rom_r)); // 051316 (ROM test)
map(0x1800, 0x1800).w(FUNC(ajax_state::sub_bankswitch_w)); // bankswitch control
map(0x2000, 0x3fff).ram().share("main_sub_ram"); // shared RAM with the 052001
map(0x4000, 0x7fff).rw(m_k052109, FUNC(k052109_device::read), FUNC(k052109_device::write)); // video RAM + color RAM + video registers
map(0x8000, 0x9fff).bankr(m_subbank); // banked ROM
map(0xa000, 0xffff).rom().region("sub", 0x12000); // ROM I16
}
void ajax_state::sound_map(address_map &map)
{
map(0x0000, 0x7fff).rom(); // ROM F6
map(0x8000, 0x87ff).ram(); // RAM 2128SL at D16
map(0x9000, 0x9000).w(FUNC(ajax_state::sound_bank_w)); // 007232 bankswitch
map(0xa000, 0xa00d).rw(m_k007232[0], FUNC(k007232_device::read), FUNC(k007232_device::write));
map(0xb000, 0xb00d).rw(m_k007232[1], FUNC(k007232_device::read), FUNC(k007232_device::write));
map(0xb80c, 0xb80c).w(FUNC(ajax_state::k007232_extvol_w)); // extra volume, goes to the 007232 w/ A11 selecting a different latch for the external port
map(0xc000, 0xc001).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write)); // YM2151
map(0xe000, 0xe000).r(m_soundlatch, FUNC(generic_latch_8_device::read));
}
@ -64,7 +447,7 @@ void ajax_state::ajax_sound_map(address_map &map)
static INPUT_PORTS_START( ajax )
PORT_START("DSW1")
KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "No Coin B", SW1)
/* "No Coin B" = coins produce sound, but no effect on coin counter */
// "No Coin B" = coins produce sound, but no effect on coin counter
PORT_START("DSW2")
PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2")
@ -102,10 +485,10 @@ static INPUT_PORTS_START( ajax )
PORT_DIPSETTING( 0x00, "Inverted" )
PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("SYSTEM") /* COINSW & START */
PORT_START("SYSTEM") // COINSW & START
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN3 ) /* service */
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN3 ) // service
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
@ -138,55 +521,53 @@ INPUT_PORTS_END
void ajax_state::sound_bank_w(uint8_t data)
{
int bank_A, bank_B;
// banks # for the 007232 (chip 1)
int bank_A = BIT(data, 1);
int bank_B = BIT(data, 0);
m_k007232[0]->set_bank(bank_A, bank_B);
/* banks # for the 007232 (chip 1) */
bank_A = BIT(data, 1);
bank_B = BIT(data, 0);
m_k007232_1->set_bank(bank_A, bank_B);
/* banks # for the 007232 (chip 2) */
// banks # for the 007232 (chip 2)
bank_A = ((data >> 4) & 0x03);
bank_B = ((data >> 2) & 0x03);
m_k007232_2->set_bank(bank_A, bank_B);
m_k007232[1]->set_bank(bank_A, bank_B);
}
void ajax_state::volume_callback0(uint8_t data)
{
m_k007232_1->set_volume(0, (data >> 4) * 0x11, 0);
m_k007232_1->set_volume(1, 0, (data & 0x0f) * 0x11);
m_k007232[0]->set_volume(0, (data >> 4) * 0x11, 0);
m_k007232[0]->set_volume(1, 0, (data & 0x0f) * 0x11);
}
void ajax_state::k007232_extvol_w(uint8_t data)
{
/* channel A volume (mono) */
m_k007232_2->set_volume(0, (data & 0x0f) * 0x11/2, (data & 0x0f) * 0x11/2);
// channel A volume (mono)
m_k007232[1]->set_volume(0, (data & 0x0f) * 0x11 / 2, (data & 0x0f) * 0x11 / 2);
}
void ajax_state::volume_callback1(uint8_t data)
{
/* channel B volume/pan */
m_k007232_2->set_volume(1, (data & 0x0f) * 0x11/2, (data >> 4) * 0x11/2);
// channel B volume/pan
m_k007232[1]->set_volume(1, (data & 0x0f) * 0x11 / 2, (data >> 4) * 0x11 / 2);
}
void ajax_state::ajax(machine_config &config)
{
/* basic machine hardware */
KONAMI(config, m_maincpu, XTAL(24'000'000)/2/4); /* 052001 12/4 MHz*/
m_maincpu->set_addrmap(AS_PROGRAM, &ajax_state::ajax_main_map);
// basic machine hardware
KONAMI(config, m_maincpu, XTAL(24'000'000) / 2 / 4); // 052001 12/4 MHz
m_maincpu->set_addrmap(AS_PROGRAM, &ajax_state::main_map);
HD6309E(config, m_subcpu, 3000000); /* ? */
m_subcpu->set_addrmap(AS_PROGRAM, &ajax_state::ajax_sub_map);
HD6309E(config, m_subcpu, 3000000); // ?
m_subcpu->set_addrmap(AS_PROGRAM, &ajax_state::sub_map);
Z80(config, m_audiocpu, 3579545); /* 3.58 MHz */
m_audiocpu->set_addrmap(AS_PROGRAM, &ajax_state::ajax_sound_map);
Z80(config, m_audiocpu, 3579545); // 3.58 MHz
m_audiocpu->set_addrmap(AS_PROGRAM, &ajax_state::sound_map);
config.set_maximum_quantum(attotime::from_hz(600));
WATCHDOG_TIMER(config, m_watchdog);
/* video hardware */
// video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_raw(XTAL(24'000'000) / 3, 528, 108, 412, 256, 16, 240);
// 6MHz dotclock is more realistic, however needs drawing updates. replace when ready
@ -214,7 +595,7 @@ void ajax_state::ajax(machine_config &config)
m_k051316->set_bpp(7);
m_k051316->set_zoom_callback(FUNC(ajax_state::zoom_callback));
/* sound hardware */
// sound hardware
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
@ -222,23 +603,23 @@ void ajax_state::ajax(machine_config &config)
YM2151(config, "ymsnd", 3579545).add_route(0, "lspeaker", 1.0).add_route(1, "rspeaker", 1.0);
K007232(config, m_k007232_1, 3579545);
m_k007232_1->port_write().set(FUNC(ajax_state::volume_callback0));
m_k007232_1->add_route(0, "lspeaker", 0.20);
m_k007232_1->add_route(0, "rspeaker", 0.20);
m_k007232_1->add_route(1, "lspeaker", 0.20);
m_k007232_1->add_route(1, "rspeaker", 0.20);
K007232(config, m_k007232[0], 3579545);
m_k007232[0]->port_write().set(FUNC(ajax_state::volume_callback0));
m_k007232[0]->add_route(0, "lspeaker", 0.20);
m_k007232[0]->add_route(0, "rspeaker", 0.20);
m_k007232[0]->add_route(1, "lspeaker", 0.20);
m_k007232[0]->add_route(1, "rspeaker", 0.20);
K007232(config, m_k007232_2, 3579545);
m_k007232_2->port_write().set(FUNC(ajax_state::volume_callback1));
m_k007232_2->add_route(0, "lspeaker", 0.50);
m_k007232_2->add_route(1, "rspeaker", 0.50);
K007232(config, m_k007232[1], 3579545);
m_k007232[1]->port_write().set(FUNC(ajax_state::volume_callback1));
m_k007232[1]->add_route(0, "lspeaker", 0.50);
m_k007232[1]->add_route(1, "rspeaker", 0.50);
}
/*
This set is using 27512 Roms on a sub-board instead of Mask roms
This set is using 27512 ROMs on a sub-board instead of Mask ROMs
-- info from Phil Morris
These are normally on the main board in the form of large mask ROMs, but at one stage
@ -248,18 +629,18 @@ void ajax_state::ajax(machine_config &config)
*/
ROM_START( ajax )
ROM_REGION( 0x20000, "maincpu", 0 ) /* 052001 code */
ROM_LOAD( "770_m01.n11", 0x00000, 0x10000, CRC(4a64e53a) SHA1(acd249bfcb5f248c41b3e40c7c1bce1b8c645d3a) ) /* last 0x8000 fixed, first 0x8000 banked */
ROM_LOAD( "770_l02.n12", 0x10000, 0x10000, CRC(ad7d592b) SHA1(c75d9696b16de231c479379dd02d33fe54021d88) ) /* banked ROM */
ROM_REGION( 0x20000, "maincpu", 0 ) // 052001 code
ROM_LOAD( "770_m01.n11", 0x00000, 0x10000, CRC(4a64e53a) SHA1(acd249bfcb5f248c41b3e40c7c1bce1b8c645d3a) ) // last 0x8000 fixed, first 0x8000 banked
ROM_LOAD( "770_l02.n12", 0x10000, 0x10000, CRC(ad7d592b) SHA1(c75d9696b16de231c479379dd02d33fe54021d88) ) // banked ROM
ROM_REGION( 0x18000, "sub", 0 ) /* 96k */
ROM_LOAD( "770_f04.g16", 0x00000, 0x10000, CRC(e0e4ec9c) SHA1(15ae09c3ad67ec626d8178ec1417f0c57ca4eca4) ) /* banked ROM */
ROM_LOAD( "770_l05.i16", 0x10000, 0x08000, CRC(ed64fbb2) SHA1(429046edaf1299afa7fb9c385b4ef0c244ec2409) ) /* last 0x6000 fixed, first 0x2000 banked */
ROM_REGION( 0x18000, "sub", 0 )
ROM_LOAD( "770_f04.g16", 0x00000, 0x10000, CRC(e0e4ec9c) SHA1(15ae09c3ad67ec626d8178ec1417f0c57ca4eca4) ) // banked ROM
ROM_LOAD( "770_l05.i16", 0x10000, 0x08000, CRC(ed64fbb2) SHA1(429046edaf1299afa7fb9c385b4ef0c244ec2409) ) // last 0x6000 fixed, first 0x2000 banked
ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the SOUND CPU */
ROM_REGION( 0x08000, "audiocpu", 0 )
ROM_LOAD( "770_h03.f16", 0x00000, 0x08000, CRC(2ffd2afc) SHA1(ca2ef684f87bcf9b70b3ec66ec80685edaf04b9b) )
ROM_REGION( 0x080000, "k052109", 0 ) /* tiles */
ROM_REGION( 0x080000, "k052109", 0 ) // tiles
ROM_LOAD32_BYTE( "770c13-a.f3", 0x000000, 0x010000, CRC(4ef6fff2) SHA1(0a2953f6907738b795d96184329431539386a463) )
ROM_LOAD32_BYTE( "770c13-c.f4", 0x000001, 0x010000, CRC(97ffbab6) SHA1(97d9a39600eed918e12908a9abed0d4161c20ef6) )
ROM_LOAD32_BYTE( "770c12-a.f5", 0x000002, 0x010000, CRC(6c0ade68) SHA1(35e4548a37e19210c767ef2ed4c514dbde6806c2) )
@ -269,7 +650,7 @@ ROM_START( ajax )
ROM_LOAD32_BYTE( "770c12-b.e5", 0x040002, 0x010000, CRC(5f221cc6) SHA1(9a7a9c7853a3b582c4034b773cef08aee5391d6e) )
ROM_LOAD32_BYTE( "770c12-d.e6", 0x040003, 0x010000, CRC(f1edb2f4) SHA1(3e66cc711e25cbf6e6a747d43a9efec0710d5b7a) )
ROM_REGION( 0x100000, "k051960", 0 ) /* sprites */
ROM_REGION( 0x100000, "k051960", 0 ) // sprites
ROM_LOAD32_BYTE( "770c09-a.f8", 0x000000, 0x010000, CRC(76690fb8) SHA1(afe267a37b65d63d3765dc3b88d8a8262446f786) )
ROM_LOAD32_BYTE( "770c09-e.f9", 0x000001, 0x010000, CRC(17b482c9) SHA1(3535197956f5bf5b564fec1ddbb3e3ea3bf1f7bd) )
ROM_LOAD32_BYTE( "770c08-a.f10", 0x000002, 0x010000, CRC(efd29a56) SHA1(2a9f138d1242a35162a3f092b0343dff899e3b83) )
@ -287,20 +668,20 @@ ROM_START( ajax )
ROM_LOAD32_BYTE( "770c08-d.c10", 0x0c0002, 0x010000, CRC(91591777) SHA1(53f416a51f7075f070168bced7b6f925f54c7b84) )
ROM_LOAD32_BYTE( "770c08-h.c11", 0x0c0003, 0x010000, CRC(d97d4b15) SHA1(e3d7d7adeec8c8c808acb9f84641fd3a6bf249be) )
ROM_REGION( 0x080000, "k051316", 0 ) /* zoom/rotate */
ROM_REGION( 0x080000, "k051316", 0 ) // zoom/rotate
ROM_LOAD( "770c06.f4", 0x000000, 0x040000, CRC(d0c592ee) SHA1(c1be73dd259f2779d715659b177e47513776a0d4) )
ROM_LOAD( "770c07.h4", 0x040000, 0x040000, CRC(0b399fb1) SHA1(fbe26f9aa9a655d08bebcdd79719d35134ca4dd5) )
ROM_REGION( 0x0200, "proms", 0 )
ROM_LOAD( "63s241.j11", 0x0000, 0x0200, CRC(9bdd719f) SHA1(de98e562080a97714047a8ad17abc6662c188897) ) /* priority encoder (not used) */
ROM_LOAD( "63s241.j11", 0x0000, 0x0200, CRC(9bdd719f) SHA1(de98e562080a97714047a8ad17abc6662c188897) ) // priority encoder (not used)
ROM_REGION( 0x040000, "k007232_1", 0 ) /* 007232 data (chip 1) */
ROM_REGION( 0x040000, "k007232_1", 0 )
ROM_LOAD( "770c10-a.a7", 0x000000, 0x010000, CRC(e45ec094) SHA1(540c56e1d778e6082db23aa3da64f6179b1f3635) )
ROM_LOAD( "770c10-b.a6", 0x010000, 0x010000, CRC(349db7d3) SHA1(210da067038abeb021a77b3bf2664c9a49b3410a) )
ROM_LOAD( "770c10-c.a5", 0x020000, 0x010000, CRC(71cb1f05) SHA1(57399806746b659f52114fb7bd4e11a7992a2c5d) )
ROM_LOAD( "770c10-d.a4", 0x030000, 0x010000, CRC(e8ab1844) SHA1(dc22c4d11d6396a051398ba9ec6380aa3f856e71) )
ROM_REGION( 0x080000, "k007232_2", 0 ) /* 007232 data (chip 2) */
ROM_REGION( 0x080000, "k007232_2", 0 )
ROM_LOAD( "770c11-a.c6", 0x000000, 0x010000, CRC(8cccd9e0) SHA1(73e50a896ed212462046b7bfa04aad5e266425ca) )
ROM_LOAD( "770c11-b.c5", 0x010000, 0x010000, CRC(0af2fedd) SHA1(038189210a73f668a0d913ff2dfc4ffa2e6bd5f4) )
ROM_LOAD( "770c11-c.c4", 0x020000, 0x010000, CRC(7471f24a) SHA1(04d7a69ddc01017a773485fa891711d94c8ad47c) )
@ -312,73 +693,75 @@ ROM_START( ajax )
ROM_END
ROM_START( typhoon )
ROM_REGION( 0x20000, "maincpu", 0 ) /* 052001 code */
ROM_LOAD( "770_k01.n11", 0x00000, 0x10000, CRC(5ba74a22) SHA1(897d3309f2efb3bfa56e86581ee4a492e656788c) ) /* last 0x8000 fixed, first 0x8000 banked */
ROM_LOAD( "770_k02.n12", 0x10000, 0x10000, CRC(3bcf782a) SHA1(4b6127bced0b2519f8ad30587f32588a16368071) ) /* banked ROM */
ROM_REGION( 0x20000, "maincpu", 0 ) // 052001 code
ROM_LOAD( "770_k01.n11", 0x00000, 0x10000, CRC(5ba74a22) SHA1(897d3309f2efb3bfa56e86581ee4a492e656788c) ) // last 0x8000 fixed, first 0x8000 banked
ROM_LOAD( "770_k02.n12", 0x10000, 0x10000, CRC(3bcf782a) SHA1(4b6127bced0b2519f8ad30587f32588a16368071) ) // banked ROM
ROM_REGION( 0x18000, "sub", 0 ) /* 96k */
ROM_LOAD( "770_f04.g16", 0x00000, 0x10000, CRC(e0e4ec9c) SHA1(15ae09c3ad67ec626d8178ec1417f0c57ca4eca4) ) /* banked ROM */
ROM_LOAD( "770_k05.i16", 0x10000, 0x08000, CRC(0f1bebbb) SHA1(012a8867ee0febaaadd7bcbc91e462bda5d3a411) ) /* last 0x6000 fixed, first 0x2000 banked */
ROM_REGION( 0x18000, "sub", 0 )
ROM_LOAD( "770_f04.g16", 0x00000, 0x10000, CRC(e0e4ec9c) SHA1(15ae09c3ad67ec626d8178ec1417f0c57ca4eca4) ) // banked ROM
ROM_LOAD( "770_k05.i16", 0x10000, 0x08000, CRC(0f1bebbb) SHA1(012a8867ee0febaaadd7bcbc91e462bda5d3a411) ) // last 0x6000 fixed, first 0x2000 banked
ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the SOUND CPU */
ROM_REGION( 0x08000, "audiocpu", 0 )
ROM_LOAD( "770_h03.f16", 0x00000, 0x08000, CRC(2ffd2afc) SHA1(ca2ef684f87bcf9b70b3ec66ec80685edaf04b9b) )
ROM_REGION( 0x080000, "k052109", 0 ) /* tiles */
ROM_REGION( 0x080000, "k052109", 0 ) // tiles
ROM_LOAD32_WORD( "770c13.n22", 0x000000, 0x040000, CRC(b859ca4e) SHA1(f58678d503683f78cca0d5ed2d79f6f68ab3495a) )
ROM_LOAD32_WORD( "770c12.k22", 0x000002, 0x040000, CRC(50d14b72) SHA1(e3ff4a5aeefa6c10b5f7fec18297948b7c5acfdf) )
ROM_REGION( 0x100000, "k051960", 0 ) /* sprites */
ROM_REGION( 0x100000, "k051960", 0 ) // sprites
ROM_LOAD32_WORD( "770c09.n4", 0x000000, 0x080000, CRC(1ab4a7ff) SHA1(fa007b41027f95d29d2a9f931a2fe235844db637) )
ROM_LOAD32_WORD( "770c08.k4", 0x000002, 0x080000, CRC(a8e80586) SHA1(0401f59baa691905287cef94427f39e0c3f0adc6) )
ROM_REGION( 0x080000, "k051316", 0 ) /* zoom/rotate */
ROM_REGION( 0x080000, "k051316", 0 ) // zoom/rotate
ROM_LOAD( "770c06.f4", 0x000000, 0x040000, CRC(d0c592ee) SHA1(c1be73dd259f2779d715659b177e47513776a0d4) )
ROM_LOAD( "770c07.h4", 0x040000, 0x040000, CRC(0b399fb1) SHA1(fbe26f9aa9a655d08bebcdd79719d35134ca4dd5) )
ROM_REGION( 0x0200, "proms", 0 )
ROM_LOAD( "63s241.j11", 0x0000, 0x0200, CRC(9bdd719f) SHA1(de98e562080a97714047a8ad17abc6662c188897) ) /* priority encoder (not used) */
ROM_LOAD( "63s241.j11", 0x0000, 0x0200, CRC(9bdd719f) SHA1(de98e562080a97714047a8ad17abc6662c188897) ) // priority encoder (not used)
ROM_REGION( 0x040000, "k007232_1", 0 ) /* 007232 data (chip 1) */
ROM_REGION( 0x040000, "k007232_1", 0 )
ROM_LOAD( "770c10", 0x000000, 0x040000, CRC(7fac825f) SHA1(581522d7a02dad16d2803ff344b4db133f767e6b) )
ROM_REGION( 0x080000, "k007232_2", 0 ) /* 007232 data (chip 2) */
ROM_REGION( 0x080000, "k007232_2", 0 )
ROM_LOAD( "770c11", 0x000000, 0x080000, CRC(299a615a) SHA1(29cdcc21998c72f4cf311792b904b79bde236bab) )
ROM_END
ROM_START( ajaxj )
ROM_REGION( 0x20000, "maincpu", 0 ) /* 052001 code */
ROM_LOAD( "770_l01.n11", 0x00000, 0x10000, CRC(7cea5274) SHA1(8e3b2b11a8189e3a1703b3b4b453fbb386f5537f) ) /* last 0x8000 fixed, first 0x8000 banked */
ROM_LOAD( "770_l02.n12", 0x10000, 0x10000, CRC(ad7d592b) SHA1(c75d9696b16de231c479379dd02d33fe54021d88) ) /* banked ROM */
ROM_REGION( 0x20000, "maincpu", 0 ) // 052001 code
ROM_LOAD( "770_l01.n11", 0x00000, 0x10000, CRC(7cea5274) SHA1(8e3b2b11a8189e3a1703b3b4b453fbb386f5537f) ) // last 0x8000 fixed, first 0x8000 banked
ROM_LOAD( "770_l02.n12", 0x10000, 0x10000, CRC(ad7d592b) SHA1(c75d9696b16de231c479379dd02d33fe54021d88) ) // banked ROM
ROM_REGION( 0x18000, "sub", 0 ) /* 96k */
ROM_LOAD( "770_f04.g16", 0x00000, 0x10000, CRC(e0e4ec9c) SHA1(15ae09c3ad67ec626d8178ec1417f0c57ca4eca4) ) /* banked ROM */
ROM_LOAD( "770_l05.i16", 0x10000, 0x8000, CRC(ed64fbb2) SHA1(429046edaf1299afa7fb9c385b4ef0c244ec2409) ) /* last 0x6000 fixed, first 0x2000 banked */
ROM_REGION( 0x18000, "sub", 0 )
ROM_LOAD( "770_f04.g16", 0x00000, 0x10000, CRC(e0e4ec9c) SHA1(15ae09c3ad67ec626d8178ec1417f0c57ca4eca4) ) // banked ROM
ROM_LOAD( "770_l05.i16", 0x10000, 0x08000, CRC(ed64fbb2) SHA1(429046edaf1299afa7fb9c385b4ef0c244ec2409) ) // last 0x6000 fixed, first 0x2000 banked
ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the SOUND CPU */
ROM_REGION( 0x08000, "audiocpu", 0 )
ROM_LOAD( "770_f03.f16", 0x00000, 0x08000, CRC(3fe914fd) SHA1(c691920402bd859e2bf765084704a8bfad302cfa) )
ROM_REGION( 0x080000, "k052109", 0 ) /* tiles */
ROM_REGION( 0x080000, "k052109", 0 ) // tiles
ROM_LOAD32_WORD( "770c13.n22", 0x000000, 0x040000, CRC(b859ca4e) SHA1(f58678d503683f78cca0d5ed2d79f6f68ab3495a) )
ROM_LOAD32_WORD( "770c12.k22", 0x000002, 0x040000, CRC(50d14b72) SHA1(e3ff4a5aeefa6c10b5f7fec18297948b7c5acfdf) )
ROM_REGION( 0x100000, "k051960", 0 ) /* sprites */
ROM_REGION( 0x100000, "k051960", 0 ) // sprites
ROM_LOAD32_WORD( "770c09.n4", 0x000000, 0x080000, CRC(1ab4a7ff) SHA1(fa007b41027f95d29d2a9f931a2fe235844db637) )
ROM_LOAD32_WORD( "770c08.k4", 0x000002, 0x080000, CRC(a8e80586) SHA1(0401f59baa691905287cef94427f39e0c3f0adc6) )
ROM_REGION( 0x080000, "k051316", 0 ) /* zoom/rotate */
ROM_REGION( 0x080000, "k051316", 0 ) // zoom/rotate
ROM_LOAD( "770c06.f4", 0x000000, 0x040000, CRC(d0c592ee) SHA1(c1be73dd259f2779d715659b177e47513776a0d4) )
ROM_LOAD( "770c07.h4", 0x040000, 0x040000, CRC(0b399fb1) SHA1(fbe26f9aa9a655d08bebcdd79719d35134ca4dd5) )
ROM_REGION( 0x0200, "proms", 0 )
ROM_LOAD( "63s241.j11", 0x0000, 0x0200, CRC(9bdd719f) SHA1(de98e562080a97714047a8ad17abc6662c188897) ) /* priority encoder (not used) */
ROM_LOAD( "63s241.j11", 0x0000, 0x0200, CRC(9bdd719f) SHA1(de98e562080a97714047a8ad17abc6662c188897) ) // priority encoder (not used)
ROM_REGION( 0x040000, "k007232_1", 0 ) /* 007232 data (chip 1) */
ROM_REGION( 0x040000, "k007232_1", 0 )
ROM_LOAD( "770c10", 0x000000, 0x040000, CRC(7fac825f) SHA1(581522d7a02dad16d2803ff344b4db133f767e6b) )
ROM_REGION( 0x080000, "k007232_2", 0 ) /* 007232 data (chip 2) */
ROM_REGION( 0x080000, "k007232_2", 0 )
ROM_LOAD( "770c11", 0x000000, 0x080000, CRC(299a615a) SHA1(29cdcc21998c72f4cf311792b904b79bde236bab) )
ROM_END
} // anonymous namespace
GAME( 1987, ajax, 0, ajax, ajax, ajax_state, empty_init, ROT90, "Konami", "Ajax", MACHINE_SUPPORTS_SAVE )
GAME( 1987, typhoon, ajax, ajax, ajax, ajax_state, empty_init, ROT90, "Konami", "Typhoon", MACHINE_SUPPORTS_SAVE )

View File

@ -9,89 +9,218 @@
***************************************************************************/
#include "emu.h"
#include "includes/parodius.h"
#include "includes/konamipt.h"
#include "includes/konamipt.h"
#include "video/k052109.h"
#include "video/k053244_k053245.h"
#include "video/k053251.h"
#include "video/konami_helper.h"
#include "cpu/m6809/konami.h" // for the callback and the firq irq definition
#include "cpu/z80/z80.h"
#include "machine/bankdev.h"
#include "machine/watchdog.h"
#include "sound/k053260.h"
#include "sound/ymopm.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
void parodius_state::parodius_videobank_w(uint8_t data)
namespace {
class parodius_state : public driver_device
{
public:
parodius_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_bank0000(*this, "bank0000"),
m_k052109(*this, "k052109"),
m_k053245(*this, "k053245"),
m_k053251(*this, "k053251"),
m_mainbank(*this, "mainbank"),
m_view_2000(*this, "view_2000")
{ }
void parodius(machine_config &config);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
private:
// devices
required_device<konami_cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<address_map_bank_device> m_bank0000;
required_device<k052109_device> m_k052109;
required_device<k05324x_device> m_k053245;
required_device<k053251_device> m_k053251;
required_memory_bank m_mainbank;
memory_view m_view_2000;
// video-related
uint8_t m_layer_colorbase[3]{};
uint8_t m_sprite_colorbase = 0;
int m_layerpri[3]{};
// misc
emu_timer *m_nmi_timer = nullptr;
void videobank_w(uint8_t data);
void _3fc0_w(uint8_t data);
void sh_irqtrigger_w(uint8_t data);
void sound_arm_nmi_w(uint8_t data);
TIMER_CALLBACK_MEMBER(nmi_timer);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
K05324X_CB_MEMBER(sprite_callback);
K052109_CB_MEMBER(tile_callback);
void banking_callback(uint8_t data);
void bank0000_map(address_map &map);
void main_map(address_map &map);
void sound_map(address_map &map);
};
// video
/***************************************************************************
Callbacks for the K052109
***************************************************************************/
K052109_CB_MEMBER(parodius_state::tile_callback)
{
*code |= ((*color & 0x03) << 8) | ((*color & 0x10) << 6) | ((*color & 0x0c) << 9) | (bank << 13);
*color = m_layer_colorbase[layer] + ((*color & 0xe0) >> 5);
}
/***************************************************************************
Callbacks for the K053245
***************************************************************************/
K05324X_CB_MEMBER(parodius_state::sprite_callback)
{
int pri = 0x20 | ((*color & 0x60) >> 2);
if (pri <= m_layerpri[2])
*priority = 0;
else if (pri > m_layerpri[2] && pri <= m_layerpri[1])
*priority = 0xf0;
else if (pri > m_layerpri[1] && pri <= m_layerpri[0])
*priority = 0xf0 | 0xcc;
else
*priority = 0xf0 | 0xcc | 0xaa;
*color = m_sprite_colorbase + (*color & 0x1f);
}
/***************************************************************************
Start the video hardware emulation.
***************************************************************************/
uint32_t parodius_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
int bg_colorbase = m_k053251->get_palette_index(k053251_device::CI0);
m_sprite_colorbase = m_k053251->get_palette_index(k053251_device::CI1);
m_layer_colorbase[0] = m_k053251->get_palette_index(k053251_device::CI2);
m_layer_colorbase[1] = m_k053251->get_palette_index(k053251_device::CI4);
m_layer_colorbase[2] = m_k053251->get_palette_index(k053251_device::CI3);
m_k052109->tilemap_update();
int layer[3];
layer[0] = 0;
m_layerpri[0] = m_k053251->get_priority(k053251_device::CI2);
layer[1] = 1;
m_layerpri[1] = m_k053251->get_priority(k053251_device::CI4);
layer[2] = 2;
m_layerpri[2] = m_k053251->get_priority(k053251_device::CI3);
konami_sortlayers3(layer, m_layerpri);
screen.priority().fill(0, cliprect);
bitmap.fill(16 * bg_colorbase, cliprect);
m_k052109->tilemap_draw(screen, bitmap, cliprect, layer[0], 0, 1);
m_k052109->tilemap_draw(screen, bitmap, cliprect, layer[1], 0, 2);
m_k052109->tilemap_draw(screen, bitmap, cliprect, layer[2], 0, 4);
m_k053245->sprites_draw(bitmap, cliprect, screen.priority());
return 0;
}
// machine
void parodius_state::videobank_w(uint8_t data)
{
if (data & 0xf8)
logerror("%04x: videobank = %02x\n", m_maincpu->pc(), data);
/* bit 0 = select palette or work RAM at 0000-07ff */
/* bit 1 = select 052109 or 053245 at 2000-27ff */
/* bit 2 = select palette bank 0 or 1 */
// bit 0 = select palette or work RAM at 0000-07ff
// bit 1 = select 052109 or 053245 at 2000-27ff
// bit 2 = select palette bank 0 or 1
if (data & 1)
m_bank0000->set_bank(2 + ((data & 4) >> 2));
else
m_bank0000->set_bank(0);
m_bank2000->set_bank((data & 2) >> 1);
m_view_2000.select((data & 2) >> 1);
}
void parodius_state::parodius_3fc0_w(uint8_t data)
void parodius_state::_3fc0_w(uint8_t data)
{
if ((data & 0xf4) != 0x10)
logerror("%04x: 3fc0 = %02x\n", m_maincpu->pc(), data);
/* bit 0/1 = coin counters */
// bit 0/1 = coin counters
machine().bookkeeping().coin_counter_w(0, data & 0x01);
machine().bookkeeping().coin_counter_w(1, data & 0x02);
/* bit 3 = enable char ROM reading through the video RAM */
// bit 3 = enable char ROM reading through the video RAM
m_k052109->set_rmrd_line((data & 0x08) ? ASSERT_LINE : CLEAR_LINE);
/* other bits unknown */
// other bits unknown
}
void parodius_state::parodius_sh_irqtrigger_w(uint8_t data)
void parodius_state::sh_irqtrigger_w(uint8_t data)
{
m_audiocpu->set_input_line_and_vector(0, HOLD_LINE, 0xff); // Z80
}
#if 0
void parodius_state::sound_nmi_callback( int param )
TIMER_CALLBACK_MEMBER(parodius_state::nmi_timer)
{
m_audiocpu->set_input_line(INPUT_LINE_NMI, ( m_nmi_enabled ) ? CLEAR_LINE : ASSERT_LINE );
nmi_enabled = 0;
}
#endif
void parodius_state::device_timer(emu_timer &timer, device_timer_id id, int param)
{
switch (id)
{
case TIMER_NMI:
m_audiocpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
break;
default:
throw emu_fatalerror("Unknown id in parodius_state::device_timer");
}
}
void parodius_state::sound_arm_nmi_w(uint8_t data)
{
m_audiocpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
timer_set(attotime::from_usec(50), TIMER_NMI); /* kludge until the K053260 is emulated correctly */
m_nmi_timer->adjust(attotime::from_usec(50)); // kludge until the K053260 is emulated correctly
}
/********************************************/
void parodius_state::parodius_map(address_map &map)
void parodius_state::main_map(address_map &map)
{
map(0x0000, 0x07ff).m(m_bank0000, FUNC(address_map_bank_device::amap8));
map(0x0800, 0x1fff).ram();
map(0x2000, 0x5fff).rw(m_k052109, FUNC(k052109_device::read), FUNC(k052109_device::write));
map(0x2000, 0x27ff).m(m_bank2000, FUNC(address_map_bank_device::amap8));
map(0x2000, 0x27ff).view(m_view_2000);
m_view_2000[0](0x2000, 0x27ff).rw(m_k052109, FUNC(k052109_device::read), FUNC(k052109_device::write));
m_view_2000[1](0x2000, 0x27ff).rw(m_k053245, FUNC(k05324x_device::k053245_r), FUNC(k05324x_device::k053245_w));
map(0x3f8c, 0x3f8c).portr("P1");
map(0x3f8d, 0x3f8d).portr("P2");
map(0x3f8e, 0x3f8e).portr("DSW3");
@ -99,11 +228,11 @@ void parodius_state::parodius_map(address_map &map)
map(0x3f90, 0x3f90).portr("DSW2");
map(0x3fa0, 0x3faf).rw(m_k053245, FUNC(k05324x_device::k053244_r), FUNC(k05324x_device::k053244_w));
map(0x3fb0, 0x3fbf).w(m_k053251, FUNC(k053251_device::write));
map(0x3fc0, 0x3fc0).r("watchdog", FUNC(watchdog_timer_device::reset_r)).w(FUNC(parodius_state::parodius_3fc0_w));
map(0x3fc4, 0x3fc4).w(FUNC(parodius_state::parodius_videobank_w));
map(0x3fc8, 0x3fc8).w(FUNC(parodius_state::parodius_sh_irqtrigger_w));
map(0x3fc0, 0x3fc0).r("watchdog", FUNC(watchdog_timer_device::reset_r)).w(FUNC(parodius_state::_3fc0_w));
map(0x3fc4, 0x3fc4).w(FUNC(parodius_state::videobank_w));
map(0x3fc8, 0x3fc8).w(FUNC(parodius_state::sh_irqtrigger_w));
map(0x3fcc, 0x3fcd).rw("k053260", FUNC(k053260_device::main_read), FUNC(k053260_device::main_write));
map(0x6000, 0x9fff).bankr("bank1"); /* banked ROM */
map(0x6000, 0x9fff).bankr(m_mainbank); // banked ROM
map(0xa000, 0xffff).rom().region("maincpu", 0x3a000);
}
@ -113,13 +242,7 @@ void parodius_state::bank0000_map(address_map &map)
map(0x1000, 0x1fff).ram().w("palette", FUNC(palette_device::write8)).share("palette");
}
void parodius_state::bank2000_map(address_map &map)
{
map(0x0000, 0x07ff).rw(m_k052109, FUNC(k052109_device::read), FUNC(k052109_device::write));
map(0x0800, 0x0fff).rw(m_k053245, FUNC(k05324x_device::k053245_r), FUNC(k05324x_device::k053245_w));
}
void parodius_state::parodius_sound_map(address_map &map)
void parodius_state::sound_map(address_map &map)
{
map(0x0000, 0xefff).rom();
map(0xf000, 0xf7ff).ram();
@ -143,7 +266,7 @@ static INPUT_PORTS_START( parodius )
PORT_START("DSW1")
KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "No Coin B", SW1)
/* "No Coin B" = coins produce sound, but no effect on coin counter */
// "No Coin B" = coins produce sound, but no effect on coin counter
PORT_START("DSW2")
PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2")
@ -193,8 +316,10 @@ INPUT_PORTS_END
void parodius_state::machine_start()
{
membank("bank1")->configure_entries(0, 16, memregion("maincpu")->base(), 0x4000);
membank("bank1")->set_entry(0);
m_mainbank->configure_entries(0, 16, memregion("maincpu")->base(), 0x4000);
m_mainbank->set_entry(0);
m_nmi_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(parodius_state::nmi_timer), this));
save_item(NAME(m_sprite_colorbase));
save_item(NAME(m_layer_colorbase));
@ -211,7 +336,6 @@ void parodius_state::machine_reset()
m_sprite_colorbase = 0;
m_bank0000->set_bank(0);
m_bank2000->set_bank(0);
}
void parodius_state::banking_callback(uint8_t data)
@ -219,31 +343,30 @@ void parodius_state::banking_callback(uint8_t data)
if (data & 0xf0)
logerror("%s: setlines %02x\n", machine().describe_context(), data);
membank("bank1")->set_entry((data & 0x0f) ^ 0x0f);
m_mainbank->set_entry((data & 0x0f) ^ 0x0f);
}
void parodius_state::parodius(machine_config &config)
{
/* basic machine hardware */
KONAMI(config, m_maincpu, 3000000); /* 053248 */
m_maincpu->set_addrmap(AS_PROGRAM, &parodius_state::parodius_map);
// basic machine hardware
KONAMI(config, m_maincpu, 3000000); // 053248
m_maincpu->set_addrmap(AS_PROGRAM, &parodius_state::main_map);
m_maincpu->line().set(FUNC(parodius_state::banking_callback));
Z80(config, m_audiocpu, 3579545);
m_audiocpu->set_addrmap(AS_PROGRAM, &parodius_state::parodius_sound_map); /* NMIs are triggered by the 053260 */
m_audiocpu->set_addrmap(AS_PROGRAM, &parodius_state::sound_map); // NMIs are triggered by the 053260
ADDRESS_MAP_BANK(config, "bank0000").set_map(&parodius_state::bank0000_map).set_options(ENDIANNESS_BIG, 8, 13, 0x800);
ADDRESS_MAP_BANK(config, "bank2000").set_map(&parodius_state::bank2000_map).set_options(ENDIANNESS_BIG, 8, 12, 0x800);
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
// video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
screen.set_size(64*8, 32*8);
screen.set_visarea(14*8, (64-14)*8-1, 2*8, 30*8-1);
screen.set_screen_update(FUNC(parodius_state::screen_update_parodius));
screen.set_screen_update(FUNC(parodius_state::screen_update));
screen.set_palette("palette");
PALETTE(config, "palette").set_format(palette_device::xBGR_555, 2048).enable_shadows();
@ -260,7 +383,7 @@ void parodius_state::parodius(machine_config &config)
K053251(config, m_k053251, 0);
/* sound hardware */
// sound hardware
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
@ -278,85 +401,88 @@ void parodius_state::parodius(machine_config &config)
***************************************************************************/
ROM_START( parodius )
ROM_REGION( 0x40000, "maincpu", 0 ) /* code + banked roms */
ROM_REGION( 0x40000, "maincpu", 0 ) // code + banked ROMs
ROM_LOAD( "955l01.f5", 0x00000, 0x20000, CRC(49a658eb) SHA1(dd53060c4da99b8e1f896ebfec572296ef2b5665) )
ROM_LOAD( "955l02.h5", 0x20000, 0x20000, CRC(161d7322) SHA1(a752f28c19c58263680221ad1119f2fd57df4723) )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the sound CPU */
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "955e03.d14", 0x0000, 0x10000, CRC(940aa356) SHA1(e7466f049be48861fd2d929eed786bd48782b5bb) )
ROM_REGION( 0x100000, "k052109", 0 ) /* tiles */
ROM_REGION( 0x100000, "k052109", 0 ) // tiles
ROM_LOAD32_WORD( "955d07.k19", 0x000000, 0x080000, CRC(89473fec) SHA1(0da18c4b078c3a30233a6f5c2b90032168136f58) )
ROM_LOAD32_WORD( "955d08.k24", 0x000002, 0x080000, CRC(43d5cda1) SHA1(2c51bad4857d1d31456c6dc1e7d41326ea35468b) )
ROM_REGION( 0x100000, "k053245", 0 ) /* graphics */
ROM_LOAD32_WORD( "955d05.k13", 0x000000, 0x080000, CRC(7a1e55e0) SHA1(7a0e04ebde28d1e7b60aef3de926dc0e78662b1e) ) /* sprites */
ROM_LOAD32_WORD( "955d06.k8", 0x000002, 0x080000, CRC(f4252875) SHA1(490f2e19b30cf8724e4b03b8d9f089c470ec13bd) ) /* sprites */
ROM_REGION( 0x100000, "k053245", 0 ) // sprites
ROM_LOAD32_WORD( "955d05.k13", 0x000000, 0x080000, CRC(7a1e55e0) SHA1(7a0e04ebde28d1e7b60aef3de926dc0e78662b1e) )
ROM_LOAD32_WORD( "955d06.k8", 0x000002, 0x080000, CRC(f4252875) SHA1(490f2e19b30cf8724e4b03b8d9f089c470ec13bd) )
ROM_REGION( 0x80000, "k053260", 0 ) /* 053260 samples */
ROM_REGION( 0x80000, "k053260", 0 ) // samples
ROM_LOAD( "955d04.c5", 0x00000, 0x80000, CRC(e671491a) SHA1(79e71cb5212eb7d14d3479b0734ea0270473a66d) )
ROM_END
ROM_START( parodiuse ) /* Earlier version? */
ROM_REGION( 0x40000, "maincpu", 0 ) /* code + banked roms */
ROM_START( parodiuse ) // Earlier version?
ROM_REGION( 0x40000, "maincpu", 0 ) // code + banked ROMs
ROM_LOAD( "2.f5", 0x00000, 0x20000, CRC(26a6410b) SHA1(06de782f593ab0da6d65376b66e273d6410c6c56) )
ROM_LOAD( "3.h5", 0x20000, 0x20000, CRC(9410dbf2) SHA1(1c4d9317f83c33bace929a841ff4093d7178c428) )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the sound CPU */
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "955e03.d14", 0x0000, 0x10000, CRC(940aa356) SHA1(e7466f049be48861fd2d929eed786bd48782b5bb) )
ROM_REGION( 0x100000, "k052109", 0 ) /* tiles */
ROM_REGION( 0x100000, "k052109", 0 ) // tiles
ROM_LOAD32_WORD( "955d07.k19", 0x000000, 0x080000, CRC(89473fec) SHA1(0da18c4b078c3a30233a6f5c2b90032168136f58) )
ROM_LOAD32_WORD( "955d08.k24", 0x000002, 0x080000, CRC(43d5cda1) SHA1(2c51bad4857d1d31456c6dc1e7d41326ea35468b) )
ROM_REGION( 0x100000, "k053245", 0 ) /* graphics */
ROM_LOAD32_WORD( "955d05.k13", 0x000000, 0x080000, CRC(7a1e55e0) SHA1(7a0e04ebde28d1e7b60aef3de926dc0e78662b1e) ) /* sprites */
ROM_LOAD32_WORD( "955d06.k8", 0x000002, 0x080000, CRC(f4252875) SHA1(490f2e19b30cf8724e4b03b8d9f089c470ec13bd) ) /* sprites */
ROM_REGION( 0x100000, "k053245", 0 ) // sprites
ROM_LOAD32_WORD( "955d05.k13", 0x000000, 0x080000, CRC(7a1e55e0) SHA1(7a0e04ebde28d1e7b60aef3de926dc0e78662b1e) )
ROM_LOAD32_WORD( "955d06.k8", 0x000002, 0x080000, CRC(f4252875) SHA1(490f2e19b30cf8724e4b03b8d9f089c470ec13bd) )
ROM_REGION( 0x80000, "k053260", 0 ) /* 053260 samples */
ROM_REGION( 0x80000, "k053260", 0 ) // samples
ROM_LOAD( "955d04.c5", 0x00000, 0x80000, CRC(e671491a) SHA1(79e71cb5212eb7d14d3479b0734ea0270473a66d) )
ROM_END
ROM_START( parodiusj )
ROM_REGION( 0x40000, "maincpu", 0 ) /* code + banked roms */
ROM_REGION( 0x40000, "maincpu", 0 ) // code + banked ROMs
ROM_LOAD( "955e01.f5", 0x00000, 0x20000, CRC(49baa334) SHA1(8902fbb2228111b15de6537bd168241933df134d) )
ROM_LOAD( "955e02.h5", 0x20000, 0x20000, CRC(14010d6f) SHA1(69fe162ea08c3bd4b3e78e9d10d278bd15444af4) )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the sound CPU */
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "955e03.d14", 0x0000, 0x10000, CRC(940aa356) SHA1(e7466f049be48861fd2d929eed786bd48782b5bb) )
ROM_REGION( 0x100000, "k052109", 0 ) /* tiles */
ROM_REGION( 0x100000, "k052109", 0 ) // tiles
ROM_LOAD32_WORD( "955d07.k19", 0x000000, 0x080000, CRC(89473fec) SHA1(0da18c4b078c3a30233a6f5c2b90032168136f58) )
ROM_LOAD32_WORD( "955d08.k24", 0x000002, 0x080000, CRC(43d5cda1) SHA1(2c51bad4857d1d31456c6dc1e7d41326ea35468b) )
ROM_REGION( 0x100000, "k053245", 0 ) /* graphics */
ROM_LOAD32_WORD( "955d05.k13", 0x000000, 0x080000, CRC(7a1e55e0) SHA1(7a0e04ebde28d1e7b60aef3de926dc0e78662b1e) ) /* sprites */
ROM_LOAD32_WORD( "955d06.k8", 0x000002, 0x080000, CRC(f4252875) SHA1(490f2e19b30cf8724e4b03b8d9f089c470ec13bd) ) /* sprites */
ROM_REGION( 0x100000, "k053245", 0 ) // sprites
ROM_LOAD32_WORD( "955d05.k13", 0x000000, 0x080000, CRC(7a1e55e0) SHA1(7a0e04ebde28d1e7b60aef3de926dc0e78662b1e) )
ROM_LOAD32_WORD( "955d06.k8", 0x000002, 0x080000, CRC(f4252875) SHA1(490f2e19b30cf8724e4b03b8d9f089c470ec13bd) )
ROM_REGION( 0x80000, "k053260", 0 ) /* 053260 samples */
ROM_REGION( 0x80000, "k053260", 0 ) // samples
ROM_LOAD( "955d04.c5", 0x00000, 0x80000, CRC(e671491a) SHA1(79e71cb5212eb7d14d3479b0734ea0270473a66d) )
ROM_END
ROM_START( parodiusa )
ROM_REGION( 0x40000, "maincpu", 0 ) /* code + banked roms */
ROM_REGION( 0x40000, "maincpu", 0 ) // code + banked ROMs
ROM_LOAD( "b-18.f5", 0x00000, 0x20000, CRC(006356cd) SHA1(795011233059472c841c30831442a71579dff2b9) )
ROM_LOAD( "b-19.h5", 0x20000, 0x20000, CRC(e5a16417) SHA1(a49567817fd4948e33913fab66106b8e16100b6a) )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the sound CPU */
ROM_LOAD( "955e03.d14", 0x0000, 0x10000, CRC(940aa356) SHA1(e7466f049be48861fd2d929eed786bd48782b5bb) ) /* Labeled as D-20 */
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "955e03.d14", 0x0000, 0x10000, CRC(940aa356) SHA1(e7466f049be48861fd2d929eed786bd48782b5bb) ) // Labeled as D-20
ROM_REGION( 0x100000, "k052109", 0 ) /* tiles */
ROM_REGION( 0x100000, "k052109", 0 ) // tiles
ROM_LOAD32_WORD( "955d07.k19", 0x000000, 0x080000, CRC(89473fec) SHA1(0da18c4b078c3a30233a6f5c2b90032168136f58) )
ROM_LOAD32_WORD( "955d08.k24", 0x000002, 0x080000, CRC(43d5cda1) SHA1(2c51bad4857d1d31456c6dc1e7d41326ea35468b) )
ROM_REGION( 0x100000, "k053245", 0 ) /* graphics */
ROM_LOAD32_WORD( "955d05.k13", 0x000000, 0x080000, CRC(7a1e55e0) SHA1(7a0e04ebde28d1e7b60aef3de926dc0e78662b1e) ) /* sprites */
ROM_LOAD32_WORD( "955d06.k8", 0x000002, 0x080000, CRC(f4252875) SHA1(490f2e19b30cf8724e4b03b8d9f089c470ec13bd) ) /* sprites */
ROM_REGION( 0x100000, "k053245", 0 ) // sprites
ROM_LOAD32_WORD( "955d05.k13", 0x000000, 0x080000, CRC(7a1e55e0) SHA1(7a0e04ebde28d1e7b60aef3de926dc0e78662b1e) )
ROM_LOAD32_WORD( "955d06.k8", 0x000002, 0x080000, CRC(f4252875) SHA1(490f2e19b30cf8724e4b03b8d9f089c470ec13bd) )
ROM_REGION( 0x80000, "k053260", 0 ) /* 053260 samples */
ROM_REGION( 0x80000, "k053260", 0 ) // samples
ROM_LOAD( "955d04.c5", 0x00000, 0x80000, CRC(e671491a) SHA1(79e71cb5212eb7d14d3479b0734ea0270473a66d) )
ROM_END
} // anonymous namespace
/***************************************************************************
Game driver(s)

View File

@ -1,81 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Manuel Abadia
#ifndef MAME_INCLUDES_AJAX_H
#define MAME_INCLUDES_AJAX_H
#pragma once
#include "machine/gen_latch.h"
#include "machine/watchdog.h"
#include "sound/k007232.h"
#include "video/k052109.h"
#include "video/k051960.h"
#include "video/k051316.h"
#include "video/konami_helper.h"
#include "emupal.h"
class ajax_state : public driver_device
{
public:
ajax_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_subcpu(*this, "sub"),
m_watchdog(*this, "watchdog"),
m_k007232_1(*this, "k007232_1"),
m_k007232_2(*this, "k007232_2"),
m_k052109(*this, "k052109"),
m_k051960(*this, "k051960"),
m_k051316(*this, "k051316"),
m_palette(*this, "palette"),
m_soundlatch(*this, "soundlatch"),
m_lamps(*this, "lamp%u", 0U)
{ }
void ajax(machine_config &config);
private:
void sound_bank_w(uint8_t data);
uint8_t ls138_f10_r(offs_t offset);
void ls138_f10_w(offs_t offset, uint8_t data);
void bankswitch_2_w(uint8_t data);
void bankswitch_w(uint8_t data);
void lamps_w(uint8_t data);
void k007232_extvol_w(uint8_t data);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void volume_callback0(uint8_t data);
void volume_callback1(uint8_t data);
K051316_CB_MEMBER(zoom_callback);
K052109_CB_MEMBER(tile_callback);
K051960_CB_MEMBER(sprite_callback);
void ajax_main_map(address_map &map);
void ajax_sound_map(address_map &map);
void ajax_sub_map(address_map &map);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
/* video-related */
uint8_t m_priority = 0U;
/* misc */
int m_firq_enable = 0;
/* devices */
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<cpu_device> m_subcpu;
required_device<watchdog_timer_device> m_watchdog;
required_device<k007232_device> m_k007232_1;
required_device<k007232_device> m_k007232_2;
required_device<k052109_device> m_k052109;
required_device<k051960_device> m_k051960;
required_device<k051316_device> m_k051316;
required_device<palette_device> m_palette;
required_device<generic_latch_8_device> m_soundlatch;
output_finder<8> m_lamps;
};
#endif // MAME_INCLUDES_AJAX_H

View File

@ -1,75 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Nicola Salmoria
/*************************************************************************
Parodius
*************************************************************************/
#ifndef MAME_INCLUDES_PARODIUS_H
#define MAME_INCLUDES_PARODIUS_H
#pragma once
#include "cpu/m6809/konami.h" /* for the callback and the firq irq definition */
#include "machine/bankdev.h"
#include "video/k052109.h"
#include "video/k053244_k053245.h"
#include "video/k053251.h"
#include "video/konami_helper.h"
class parodius_state : public driver_device
{
public:
enum
{
TIMER_NMI
};
parodius_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_bank0000(*this, "bank0000"),
m_bank2000(*this, "bank2000"),
m_k052109(*this, "k052109"),
m_k053245(*this, "k053245"),
m_k053251(*this, "k053251")
{ }
/* video-related */
int m_layer_colorbase[3]{};
int m_sprite_colorbase = 0;
int m_layerpri[3]{};
/* misc */
//int m_nmi_enabled;
/* devices */
required_device<konami_cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<address_map_bank_device> m_bank0000;
required_device<address_map_bank_device> m_bank2000;
required_device<k052109_device> m_k052109;
required_device<k05324x_device> m_k053245;
required_device<k053251_device> m_k053251;
void parodius_videobank_w(uint8_t data);
void parodius_3fc0_w(uint8_t data);
void parodius_sh_irqtrigger_w(uint8_t data);
void sound_arm_nmi_w(uint8_t data);
virtual void machine_start() override;
virtual void machine_reset() override;
uint32_t screen_update_parodius(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
K05324X_CB_MEMBER(sprite_callback);
K052109_CB_MEMBER(tile_callback);
void banking_callback(uint8_t data);
void parodius(machine_config &config);
void bank0000_map(address_map &map);
void bank2000_map(address_map &map);
void parodius_map(address_map &map);
void parodius_sound_map(address_map &map);
protected:
virtual void device_timer(emu_timer &timer, device_timer_id id, int param) override;
};
#endif // MAME_INCLUDES_PARODIUS_H

View File

@ -1,215 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Manuel Abadia
/***************************************************************************
ajax.cpp
Functions to emulate general aspects of the machine (RAM, ROM, interrupts,
I/O ports)
***************************************************************************/
#include "emu.h"
#include "cpu/m6809/m6809.h"
#include "cpu/z80/z80.h"
#include "cpu/m6809/konami.h"
#include "includes/ajax.h"
/* bankswitch_w:
Handled by the LS273 Octal +ve edge trigger D-type Flip-flop with Reset at H11:
Bit Description
--- -----------
7 MRB3 Selects ROM N11/N12
6 CCOUNT2 Coin Counter 2 (*)
5 CCOUNT1 Coin Counter 1 (*)
4 SRESET Slave CPU Reset?
3 PRI0 Layer Priority Selector
2 MRB2 \
1 MRB1 | ROM Bank Select
0 MRB0 /
(*) The Coin Counters are handled by the Konami Custom 051550
*/
void ajax_state::bankswitch_w(uint8_t data)
{
int bank = 0;
/* rom select */
if (!(data & 0x80))
bank += 4;
/* coin counters */
machine().bookkeeping().coin_counter_w(0, data & 0x20);
machine().bookkeeping().coin_counter_w(1, data & 0x40);
/* priority */
m_priority = data & 0x08;
/* bank # (ROMS N11 and N12) */
bank += (data & 0x07);
membank("mainbank")->set_entry(bank);
}
/* lamps_w:
Handled by the LS273 Octal +ve edge trigger D-type Flip-flop with Reset at B9:
Bit Description
--- -----------
7 LAMP7 & LAMP8 - Game over lamps (*)
6 LAMP3 & LAMP4 - Game over lamps (*)
5 LAMP1 - Start lamp (*)
4 Control panel quaking (**)
3 Joystick vibration (**)
2 LAMP5 & LAMP6 - Power up lamps (*)
1 LAMP2 - Super weapon lamp (*)
0 unused
(*) The Lamps are handled by the M54585P
(**)Vibration/Quaking handled by these chips:
Chip Location Description
---- -------- -----------
PS2401-4 B21 ???
UPA1452H B22 ???
LS74 H2 Dual +ve edge trigger D-type Flip-flop with SET and RESET
LS393 C20 Dual -ve edge trigger 4-bit Binary Ripple Counter with Resets
*/
void ajax_state::lamps_w(uint8_t data)
{
m_lamps[1] = BIT(data, 1); /* super weapon lamp */
m_lamps[2] = BIT(data, 2); /* power up lamps */
m_lamps[5] = BIT(data, 2); /* power up lamps */
m_lamps[0] = BIT(data, 5); /* start lamp */
m_lamps[3] = BIT(data, 6); /* game over lamps */
m_lamps[6] = BIT(data, 6); /* game over lamps */
m_lamps[4] = BIT(data, 7); /* game over lamps */
m_lamps[7] = BIT(data, 7); /* game over lamps */
}
/* ajax_ls138_f10:
The LS138 1-of-8 Decoder/Demultiplexer at F10 selects what to do:
Address R/W Description
------- --- -----------
0x0000 (r) ??? I think this read is because a CPU core bug
(w) 0x0000 NSFIRQ Trigger FIRQ on the M6809
0x0020 AFR Watchdog reset (handled by the 051550)
0x0040 (w) SOUND Cause interrupt on the Z80
0x0080 (w) SOUNDDATA Sound code number
0x00c0 (w) MBL1 Enables the LS273 at H11 (Banking + Coin counters)
0x0100 (r) MBL2 Enables 2P Inputs reading
0x0140 (w) MBL3 Enables the LS273 at B9 (Lamps + Vibration)
0x0180 (r) MIO1 Enables 1P Inputs + DIPSW #1 & #2 reading
0x01c0 (r) MIO2 Enables DIPSW #3 reading
*/
uint8_t ajax_state::ls138_f10_r(offs_t offset)
{
int data = 0, index;
static const char *const portnames[] = { "SYSTEM", "P1", "DSW1", "DSW2" };
switch ((offset & 0x01c0) >> 6)
{
case 0x00: /* ??? */
data = machine().rand();
break;
case 0x04: /* 2P inputs */
data = ioport("P2")->read();
break;
case 0x06: /* 1P inputs + DIPSW #1 & #2 */
index = offset & 0x01;
data = ioport((offset & 0x02) ? portnames[2 + index] : portnames[index])->read();
break;
case 0x07: /* DIPSW #3 */
data = ioport("DSW3")->read();
break;
default:
logerror("%04x: (ls138_f10) read from an unknown address %02x\n",m_maincpu->pc(), offset);
}
return data;
}
void ajax_state::ls138_f10_w(offs_t offset, uint8_t data)
{
switch ((offset & 0x01c0) >> 6)
{
case 0x00: /* NSFIRQ + AFR */
if (offset)
m_watchdog->watchdog_reset();
else{
if (m_firq_enable) /* Cause interrupt on slave CPU */
m_subcpu->set_input_line(M6809_FIRQ_LINE, HOLD_LINE);
}
break;
case 0x01: /* Cause interrupt on audio CPU */
m_audiocpu->set_input_line(0, HOLD_LINE);
break;
case 0x02: /* Sound command number */
m_soundlatch->write(data);
break;
case 0x03: /* Bankswitch + coin counters + priority*/
bankswitch_w(data);
break;
case 0x05: /* Lamps + Joystick vibration + Control panel quaking */
lamps_w(data);
break;
default:
logerror("%04x: (ls138_f10) write %02x to an unknown address %02x\n", m_maincpu->pc(), data, offset);
}
}
/* bankswitch_w_2:
Handled by the LS273 Octal +ve edge trigger D-type Flip-flop with Reset at K14:
Bit Description
--- -----------
7 unused
6 RMRD Enable char ROM reading through the video RAM
5 RVO enables 051316 wraparound
4 FIRQST FIRQ control
3 SRB3 \
2 SRB2 |
1 SRB1 | ROM Bank Select
0 SRB0 /
*/
void ajax_state::bankswitch_2_w(uint8_t data)
{
/* enable char ROM reading through the video RAM */
m_k052109->set_rmrd_line((data & 0x40) ? ASSERT_LINE : CLEAR_LINE);
/* bit 5 enables 051316 wraparound */
m_k051316->wraparound_enable(data & 0x20);
/* FIRQ control */
m_firq_enable = data & 0x10;
/* bank # (ROMS G16 and I16) */
membank("subbank")->set_entry(data & 0x0f);
}
void ajax_state::machine_start()
{
uint8_t *MAIN = memregion("maincpu")->base();
uint8_t *SUB = memregion("sub")->base();
m_lamps.resolve();
membank("mainbank")->configure_entries(0, 4, &MAIN[0x00000], 0x2000);
membank("mainbank")->configure_entries(4, 8, &MAIN[0x10000], 0x2000);
membank("subbank")->configure_entries(0, 9, &SUB[0x00000], 0x2000);
save_item(NAME(m_priority));
save_item(NAME(m_firq_enable));
}
void ajax_state::machine_reset()
{
m_priority = 0;
m_firq_enable = 0;
}

View File

@ -1,98 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Manuel Abadia
/***************************************************************************
ajax.cpp
Functions to emulate the video hardware of the machine.
***************************************************************************/
#include "emu.h"
#include "includes/ajax.h"
/***************************************************************************
Callbacks for the K052109
***************************************************************************/
K052109_CB_MEMBER(ajax_state::tile_callback)
{
static const int layer_colorbase[] = { 1024 / 16, 0 / 16, 512 / 16 };
*code |= ((*color & 0x0f) << 8) | (bank << 12);
*color = layer_colorbase[layer] + ((*color & 0xf0) >> 4);
}
/***************************************************************************
Callbacks for the K051960
***************************************************************************/
K051960_CB_MEMBER(ajax_state::sprite_callback)
{
enum { sprite_colorbase = 256 / 16 };
/* priority bits:
4 over zoom (0 = have priority)
5 over B (0 = have priority)
6 over A (1 = have priority)
never over F
*/
*priority = 0;
if ( *color & 0x10) *priority |= GFX_PMASK_4; /* Z = 4 */
if (~*color & 0x40) *priority |= GFX_PMASK_2; /* A = 2 */
if ( *color & 0x20) *priority |= GFX_PMASK_1; /* B = 1 */
*color = sprite_colorbase + (*color & 0x0f);
}
/***************************************************************************
Callbacks for the K051316
***************************************************************************/
K051316_CB_MEMBER(ajax_state::zoom_callback)
{
enum { zoom_colorbase = 768 / 128 };
*code |= ((*color & 0x07) << 8);
*color = zoom_colorbase + ((*color & 0x08) >> 3);
}
/***************************************************************************
Display Refresh
***************************************************************************/
uint32_t ajax_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_k052109->tilemap_update();
screen.priority().fill(0, cliprect);
bitmap.fill(m_palette->black_pen(), cliprect);
m_k052109->tilemap_draw(screen, bitmap, cliprect, 2, 0, 1);
if (m_priority)
{
/* basic layer order is B, zoom, A, F */
m_k051316->zoom_draw(screen, bitmap, cliprect, 0, 4);
m_k052109->tilemap_draw(screen, bitmap, cliprect, 1, 0, 2);
}
else
{
/* basic layer order is B, A, zoom, F */
m_k052109->tilemap_draw(screen, bitmap, cliprect, 1, 0, 2);
m_k051316->zoom_draw(screen, bitmap, cliprect, 0, 4);
}
m_k051960->k051960_sprites_draw(bitmap, cliprect, screen.priority(), -1, -1);
m_k052109->tilemap_draw(screen, bitmap, cliprect, 0, 0, 0);
return 0;
}

View File

@ -1,78 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Nicola Salmoria
#include "emu.h"
#include "includes/parodius.h"
#include "screen.h"
/***************************************************************************
Callbacks for the K052109
***************************************************************************/
K052109_CB_MEMBER(parodius_state::tile_callback)
{
*code |= ((*color & 0x03) << 8) | ((*color & 0x10) << 6) | ((*color & 0x0c) << 9) | (bank << 13);
*color = m_layer_colorbase[layer] + ((*color & 0xe0) >> 5);
}
/***************************************************************************
Callbacks for the K053245
***************************************************************************/
K05324X_CB_MEMBER(parodius_state::sprite_callback)
{
int pri = 0x20 | ((*color & 0x60) >> 2);
if (pri <= m_layerpri[2])
*priority = 0;
else if (pri > m_layerpri[2] && pri <= m_layerpri[1])
*priority = 0xf0;
else if (pri > m_layerpri[1] && pri <= m_layerpri[0])
*priority = 0xf0 | 0xcc;
else
*priority = 0xf0 | 0xcc | 0xaa;
*color = m_sprite_colorbase + (*color & 0x1f);
}
/***************************************************************************
Start the video hardware emulation.
***************************************************************************/
uint32_t parodius_state::screen_update_parodius(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
int layer[3], bg_colorbase;
bg_colorbase = m_k053251->get_palette_index(k053251_device::CI0);
m_sprite_colorbase = m_k053251->get_palette_index(k053251_device::CI1);
m_layer_colorbase[0] = m_k053251->get_palette_index(k053251_device::CI2);
m_layer_colorbase[1] = m_k053251->get_palette_index(k053251_device::CI4);
m_layer_colorbase[2] = m_k053251->get_palette_index(k053251_device::CI3);
m_k052109->tilemap_update();
layer[0] = 0;
m_layerpri[0] = m_k053251->get_priority(k053251_device::CI2);
layer[1] = 1;
m_layerpri[1] = m_k053251->get_priority(k053251_device::CI4);
layer[2] = 2;
m_layerpri[2] = m_k053251->get_priority(k053251_device::CI3);
konami_sortlayers3(layer, m_layerpri);
screen.priority().fill(0, cliprect);
bitmap.fill(16 * bg_colorbase, cliprect);
m_k052109->tilemap_draw(screen, bitmap, cliprect, layer[0], 0,1);
m_k052109->tilemap_draw(screen, bitmap, cliprect, layer[1], 0,2);
m_k052109->tilemap_draw(screen, bitmap, cliprect, layer[2], 0,4);
m_k053245->sprites_draw(bitmap, cliprect, screen.priority());
return 0;
}