summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mame/drivers/volfied.cpp25
-rw-r--r--src/mame/includes/volfied.h31
-rw-r--r--src/mame/machine/volfied.cpp29
-rw-r--r--src/mame/video/volfied.cpp20
4 files changed, 53 insertions, 52 deletions
diff --git a/src/mame/drivers/volfied.cpp b/src/mame/drivers/volfied.cpp
index 39fb13bfbc6..0f5c67c481b 100644
--- a/src/mame/drivers/volfied.cpp
+++ b/src/mame/drivers/volfied.cpp
@@ -20,7 +20,8 @@ Volfied (c) 1989 Taito Corporation
OSC: 32MHz, 26.686MHz & 20MHz
-TC0030CMD is a custom Z80 with embedded 8K ram + 8k rom (20MHz OSC is next to chip, 20MHz/4 = 5MHz(?))
+TC0030CMD is a hybrid package ASIC containing NEC D78C11
+(with 4k internal ROM) + 8k EPROM + 8k DRAM + logic.
Stephh's notes (based on the game M68000 code and some tests) :
@@ -34,7 +35,7 @@ Stephh's notes (based on the game M68000 code and some tests) :
- These 3 games are 100% the same, only region differs !
- Coinage relies on the region (code at 0x00666a) :
* 0x0001 (Japan) uses TAITO_COINAGE_JAPAN_OLD
- * 0x0002 (US) uses slighlty different TAITO_COINAGE_US :
+ * 0x0002 (US) uses slightly different TAITO_COINAGE_US :
in fact, as there is no possibility to continue a game,
what are used to be "Continue Price" Dip Switches are unused
* 0x0003 (World) uses TAITO_COINAGE_WORLD
@@ -70,16 +71,16 @@ static ADDRESS_MAP_START( main_map, AS_PROGRAM, 16, volfied_state )
AM_RANGE(0x080000, 0x0fffff) AM_ROM /* tiles */
AM_RANGE(0x100000, 0x103fff) AM_RAM /* main */
AM_RANGE(0x200000, 0x203fff) AM_DEVREADWRITE("pc090oj", pc090oj_device, word_r, word_w)
- AM_RANGE(0x400000, 0x47ffff) AM_READWRITE(volfied_video_ram_r, volfied_video_ram_w)
+ AM_RANGE(0x400000, 0x47ffff) AM_READWRITE(video_ram_r, video_ram_w)
AM_RANGE(0x500000, 0x503fff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette")
- AM_RANGE(0x600000, 0x600001) AM_WRITE(volfied_video_mask_w)
- AM_RANGE(0x700000, 0x700001) AM_WRITE(volfied_sprite_ctrl_w)
- AM_RANGE(0xd00000, 0xd00001) AM_READWRITE(volfied_video_ctrl_r, volfied_video_ctrl_w)
+ AM_RANGE(0x600000, 0x600001) AM_WRITE(video_mask_w)
+ AM_RANGE(0x700000, 0x700001) AM_WRITE(sprite_ctrl_w)
+ AM_RANGE(0xd00000, 0xd00001) AM_READWRITE(video_ctrl_r, video_ctrl_w)
AM_RANGE(0xe00000, 0xe00001) AM_DEVWRITE8("tc0140syt", tc0140syt_device, master_port_w, 0x00ff)
AM_RANGE(0xe00002, 0xe00003) AM_DEVREADWRITE8("tc0140syt", tc0140syt_device, master_comm_r, master_comm_w, 0x00ff)
- AM_RANGE(0xf00000, 0xf007ff) AM_READWRITE(volfied_cchip_ram_r, volfied_cchip_ram_w)
- AM_RANGE(0xf00802, 0xf00803) AM_READWRITE(volfied_cchip_ctrl_r, volfied_cchip_ctrl_w)
- AM_RANGE(0xf00c00, 0xf00c01) AM_WRITE(volfied_cchip_bank_w)
+ AM_RANGE(0xf00000, 0xf007ff) AM_READWRITE(cchip_ram_r, cchip_ram_w)
+ AM_RANGE(0xf00802, 0xf00803) AM_READWRITE(cchip_ctrl_r, cchip_ctrl_w)
+ AM_RANGE(0xf00c00, 0xf00c01) AM_WRITE(cchip_bank_w)
ADDRESS_MAP_END
static ADDRESS_MAP_START( z80_map, AS_PROGRAM, 8, volfied_state )
@@ -210,12 +211,12 @@ GFXDECODE_END
void volfied_state::machine_start()
{
- volfied_cchip_init();
+ cchip_init();
}
void volfied_state::machine_reset()
{
- volfied_cchip_reset();
+ cchip_reset();
}
static MACHINE_CONFIG_START( volfied, volfied_state )
@@ -237,7 +238,7 @@ static MACHINE_CONFIG_START( volfied, volfied_state )
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MCFG_SCREEN_SIZE(320, 256)
MCFG_SCREEN_VISIBLE_AREA(0, 319, 8, 247)
- MCFG_SCREEN_UPDATE_DRIVER(volfied_state, screen_update_volfied)
+ MCFG_SCREEN_UPDATE_DRIVER(volfied_state, screen_update)
MCFG_SCREEN_PALETTE("palette")
MCFG_GFXDECODE_ADD("gfxdecode", "palette", volfied)
diff --git a/src/mame/includes/volfied.h b/src/mame/includes/volfied.h
index fcd3f4ef6e0..651e6ef3c9e 100644
--- a/src/mame/includes/volfied.h
+++ b/src/mame/includes/volfied.h
@@ -37,6 +37,7 @@ public:
uint8_t m_current_flag;
uint8_t m_cc_port;
uint8_t m_current_cmd;
+ emu_timer *m_cchip_timer;
/* devices */
required_device<cpu_device> m_maincpu;
@@ -44,25 +45,25 @@ public:
required_device<pc090oj_device> m_pc090oj;
required_device<screen_device> m_screen;
- DECLARE_WRITE16_MEMBER(volfied_cchip_ctrl_w);
- DECLARE_WRITE16_MEMBER(volfied_cchip_bank_w);
- DECLARE_WRITE16_MEMBER(volfied_cchip_ram_w);
- DECLARE_READ16_MEMBER(volfied_cchip_ctrl_r);
- DECLARE_READ16_MEMBER(volfied_cchip_ram_r);
- DECLARE_READ16_MEMBER(volfied_video_ram_r);
- DECLARE_WRITE16_MEMBER(volfied_video_ram_w);
- DECLARE_WRITE16_MEMBER(volfied_video_ctrl_w);
- DECLARE_READ16_MEMBER(volfied_video_ctrl_r);
- DECLARE_WRITE16_MEMBER(volfied_video_mask_w);
- DECLARE_WRITE16_MEMBER(volfied_sprite_ctrl_w);
+ DECLARE_WRITE16_MEMBER(cchip_ctrl_w);
+ DECLARE_WRITE16_MEMBER(cchip_bank_w);
+ DECLARE_WRITE16_MEMBER(cchip_ram_w);
+ DECLARE_READ16_MEMBER(cchip_ctrl_r);
+ DECLARE_READ16_MEMBER(cchip_ram_r);
+ DECLARE_READ16_MEMBER(video_ram_r);
+ DECLARE_WRITE16_MEMBER(video_ram_w);
+ DECLARE_WRITE16_MEMBER(video_ctrl_w);
+ DECLARE_READ16_MEMBER(video_ctrl_r);
+ DECLARE_WRITE16_MEMBER(video_mask_w);
+ DECLARE_WRITE16_MEMBER(sprite_ctrl_w);
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
- uint32_t screen_update_volfied(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- TIMER_CALLBACK_MEMBER(volfied_timer_callback);
+ uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ TIMER_CALLBACK_MEMBER(timer_callback);
void refresh_pixel_layer( bitmap_ind16 &bitmap );
- void volfied_cchip_init();
- void volfied_cchip_reset();
+ void cchip_init();
+ void cchip_reset();
protected:
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
diff --git a/src/mame/machine/volfied.cpp b/src/mame/machine/volfied.cpp
index 93887ccaecd..83534e37181 100644
--- a/src/mame/machine/volfied.cpp
+++ b/src/mame/machine/volfied.cpp
@@ -5,9 +5,8 @@
Volfied C-Chip Protection
=========================
- The C-Chip (Taito TC0030CMD) is an unidentified mask programmed
- microcontroller of some sort with 64 pins. It probably has
- about 2k of ROM and 8k of RAM.
+ The C-Chip (Taito TC0030CMD) contains a NEC D78C11 (with 4k internal ROM) +
+ 8k EPROM + 8k DRAM + logic.
Cheat:
volfied:0:100191:00:001:Complete level with 99.9% Now!
@@ -284,14 +283,14 @@ void volfied_state::device_timer(emu_timer &timer, device_timer_id id, int param
switch (id)
{
case TIMER_VOLFIED:
- volfied_timer_callback(ptr, param);
+ timer_callback(ptr, param);
break;
default:
assert_always(false, "Unknown id in volfied_state::device_timer");
}
}
-TIMER_CALLBACK_MEMBER(volfied_state::volfied_timer_callback)
+TIMER_CALLBACK_MEMBER(volfied_state::timer_callback)
{
// Palette commands - palette data written to bank 0: $10 - $af
if (m_current_cmd >= 0x1 && m_current_cmd < 0x12)
@@ -339,17 +338,17 @@ TIMER_CALLBACK_MEMBER(volfied_state::volfied_timer_callback)
*
*************************************/
-WRITE16_MEMBER(volfied_state::volfied_cchip_ctrl_w)
+WRITE16_MEMBER(volfied_state::cchip_ctrl_w)
{
/* value 2 is written here */
}
-WRITE16_MEMBER(volfied_state::volfied_cchip_bank_w)
+WRITE16_MEMBER(volfied_state::cchip_bank_w)
{
m_current_bank = data & 7;
}
-WRITE16_MEMBER(volfied_state::volfied_cchip_ram_w)
+WRITE16_MEMBER(volfied_state::cchip_ram_w)
{
m_cchip_ram[(m_current_bank * 0x400) + offset] = data;
@@ -400,12 +399,12 @@ WRITE16_MEMBER(volfied_state::volfied_cchip_ram_w)
// Palette request cmd - verified to take around 122242 68000 cycles to complete
if (m_current_cmd >= 0x1 && m_current_cmd < 0x12)
{
- timer_set(downcast<cpu_device *>(&space.device())->cycles_to_attotime(122242), TIMER_VOLFIED);
+ m_cchip_timer->adjust(m_maincpu->cycles_to_attotime(122242));
}
// Unknown cmd - verified to take around 105500 68000 cycles to complete
else if (m_current_cmd >= 0x81 && m_current_cmd < 0x92)
{
- timer_set(downcast<cpu_device *>(&space.device())->cycles_to_attotime(105500), TIMER_VOLFIED);
+ m_cchip_timer->adjust(m_maincpu->cycles_to_attotime(105500));
}
else
{
@@ -429,7 +428,7 @@ WRITE16_MEMBER(volfied_state::volfied_cchip_ram_w)
*
*************************************/
-READ16_MEMBER(volfied_state::volfied_cchip_ctrl_r)
+READ16_MEMBER(volfied_state::cchip_ctrl_r)
{
/*
Bit 2 = Error signal
@@ -438,7 +437,7 @@ READ16_MEMBER(volfied_state::volfied_cchip_ctrl_r)
return 0x01; /* Return 0x05 for C-Chip error */
}
-READ16_MEMBER(volfied_state::volfied_cchip_ram_r)
+READ16_MEMBER(volfied_state::cchip_ram_r)
{
/* Check for input ports */
if (m_current_bank == 0)
@@ -491,8 +490,10 @@ READ16_MEMBER(volfied_state::volfied_cchip_ram_r)
*
*************************************/
-void volfied_state::volfied_cchip_init( )
+void volfied_state::cchip_init()
{
+ m_cchip_timer = timer_alloc(TIMER_VOLFIED);
+
m_cchip_ram = make_unique_clear<uint8_t[]>(0x400 * 8);
save_item(NAME(m_current_bank));
@@ -502,7 +503,7 @@ void volfied_state::volfied_cchip_init( )
save_pointer(NAME(m_cchip_ram.get()), 0x400 * 8);
}
-void volfied_state::volfied_cchip_reset( )
+void volfied_state::cchip_reset()
{
m_current_bank = 0;
m_current_flag = 0;
diff --git a/src/mame/video/volfied.cpp b/src/mame/video/volfied.cpp
index bd4181c6a22..bc61f879cf6 100644
--- a/src/mame/video/volfied.cpp
+++ b/src/mame/video/volfied.cpp
@@ -24,24 +24,24 @@ void volfied_state::video_start()
READ AND WRITE HANDLERS
*******************************************************/
-READ16_MEMBER(volfied_state::volfied_video_ram_r)
+READ16_MEMBER(volfied_state::video_ram_r)
{
return m_video_ram[offset];
}
-WRITE16_MEMBER(volfied_state::volfied_video_ram_w)
+WRITE16_MEMBER(volfied_state::video_ram_w)
{
mem_mask &= m_video_mask;
COMBINE_DATA(&m_video_ram[offset]);
}
-WRITE16_MEMBER(volfied_state::volfied_video_ctrl_w)
+WRITE16_MEMBER(volfied_state::video_ctrl_w)
{
COMBINE_DATA(&m_video_ctrl);
}
-READ16_MEMBER(volfied_state::volfied_video_ctrl_r)
+READ16_MEMBER(volfied_state::video_ctrl_r)
{
/* Could this be some kind of hardware collision detection? If bit 6 is
set the game will check for collisions with the large enemy, whereas
@@ -52,12 +52,12 @@ READ16_MEMBER(volfied_state::volfied_video_ctrl_r)
return 0x60;
}
-WRITE16_MEMBER(volfied_state::volfied_video_mask_w)
+WRITE16_MEMBER(volfied_state::video_mask_w)
{
COMBINE_DATA(&m_video_mask);
}
-WRITE16_MEMBER(volfied_state::volfied_sprite_ctrl_w)
+WRITE16_MEMBER(volfied_state::sprite_ctrl_w)
{
m_pc090oj->set_sprite_ctrl((data & 0x3c) >> 2);
}
@@ -69,8 +69,6 @@ WRITE16_MEMBER(volfied_state::volfied_sprite_ctrl_w)
void volfied_state::refresh_pixel_layer( bitmap_ind16 &bitmap )
{
- int x, y;
-
/*********************************************************
VIDEO RAM has 2 screens x 256 rows x 512 columns x 16 bits
@@ -98,9 +96,9 @@ void volfied_state::refresh_pixel_layer( bitmap_ind16 &bitmap )
if (m_video_ctrl & 1)
p += 0x20000;
- for (y = 0; y < height; y++)
+ for (int y = 0; y < height; y++)
{
- for (x = 1; x < width + 1; x++) // Hmm, 1 pixel offset is needed to align properly with sprites
+ for (int x = 1; x < width + 1; x++) // Hmm, 1 pixel offset is needed to align properly with sprites
{
int color = (p[x] << 2) & 0x700;
@@ -121,7 +119,7 @@ void volfied_state::refresh_pixel_layer( bitmap_ind16 &bitmap )
}
}
-uint32_t volfied_state::screen_update_volfied(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+uint32_t volfied_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
screen.priority().fill(0, cliprect);
refresh_pixel_layer(bitmap);