diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mame/drivers/volfied.cpp | 25 | ||||
-rw-r--r-- | src/mame/includes/volfied.h | 31 | ||||
-rw-r--r-- | src/mame/machine/volfied.cpp | 29 | ||||
-rw-r--r-- | src/mame/video/volfied.cpp | 20 |
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); |