diff --git a/hash/supracan.xml b/hash/supracan.xml index 5384095a149..1722192b883 100644 --- a/hash/supracan.xml +++ b/hash/supracan.xml @@ -28,7 +28,7 @@ Gameplay logic falls apart once either side attacks (side becomes unresponsive, Panda Entertainment Technology diff --git a/src/mame/funtech/supracan.cpp b/src/mame/funtech/supracan.cpp index 0824bc63d2a..91663528a81 100644 --- a/src/mame/funtech/supracan.cpp +++ b/src/mame/funtech/supracan.cpp @@ -1,5 +1,5 @@ // license: BSD-3-Clause -// copyright-holders: Angelo Salese,Ryan Holtz +// copyright-holders: Angelo Salese, Ryan Holtz /*************************************************************************** Super A'Can (c) 1995 Funtech @@ -48,7 +48,7 @@ STATUS: - All: Priorities are largely unknown. - C.U.G.: Gameplay backgrounds are broken. - Sango Fighter: Possible missing masking on the upper edges of the screen during gameplay. - - Sango Fighter: Raster effects off by 1 line + - Sango Fighter: Raster effects off by 1 line (btanb) - Sango Fighter: Specifies tiles out of range of video ram?? - Speedy Dragon: Backgrounds are broken (wrong tile bank/region). - Super Taiwanese Baseball League: Does not boot, uses an unemulated DMA type @@ -126,7 +126,7 @@ public: , m_sound(*this, "acansnd") , m_gfxdecode(*this, "gfxdecode") , m_screen(*this, "screen") - , m_pads(*this, "P%u", 1U) + , m_pad(*this, "P%u", 1U) { } @@ -138,17 +138,15 @@ protected: virtual void video_start() override; private: - void supracan_mem(address_map &map); - void supracan_sound_mem(address_map &map); + void main_map(address_map &map); + void sound_map(address_map &map); uint16_t _68k_soundram_r(offs_t offset, uint16_t mem_mask = ~0); void _68k_soundram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); uint8_t _6502_soundmem_r(offs_t offset); void _6502_soundmem_w(offs_t offset, uint8_t data); - void dma_w(int offset, uint16_t data, uint16_t mem_mask, int ch); - void dma_channel0_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - void dma_channel1_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + template void dma_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); uint16_t video_r(offs_t offset, uint16_t mem_mask = 0); void video_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); @@ -189,7 +187,7 @@ private: required_device m_gfxdecode; required_device m_screen; - required_ioport_array<2> m_pads; + required_ioport_array<2> m_pad; dma_regs_t m_dma_regs; sprdma_regs_t m_sprdma_regs; @@ -252,7 +250,6 @@ private: TILE_GET_INFO_MEMBER(get_tilemap1_tile_info); TILE_GET_INFO_MEMBER(get_tilemap2_tile_info); TILE_GET_INFO_MEMBER(get_roz_tile_info); - void palette_init(palette_device &palette) const; void sound_timer_irq(int state); void sound_dma_irq(int state); uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); @@ -270,7 +267,7 @@ private: void draw_sprite_tile_masked(bitmap_ind16 &dst, bitmap_ind8 &mask, bitmap_ind8 &priomap, const rectangle &cliprect, gfx_element *gfx, int tile, int palette, bool xflip, bool yflip, int dstx, int dsty, int prio); void draw_sprites(bitmap_ind16 &bitmap, bitmap_ind8 &maskmap, bitmap_ind8 &priomap, const rectangle &cliprect); void mark_active_tilemap_all_dirty(int layer); - void draw_roz_layer(bitmap_ind16 &bitmap, const rectangle &cliprect, tilemap_t *tmap, uint32_t startx, uint32_t starty, int incxx, int incxy, int incyx, int incyy, int wraparound/*, int columnscroll, uint32_t* scrollram*/, int transmask); + void draw_roz_layer(bitmap_ind16 &bitmap, const rectangle &cliprect, tilemap_t *tmap, uint32_t startx, uint32_t starty, int incxx, int incxy, int incyx, int incyy, int wraparound/*, int columnscroll, uint32_t *scrollram*/, int transmask); void set_sound_irq(uint8_t bit, uint8_t state); @@ -311,7 +308,7 @@ int supracan_state::get_tilemap_region(int layer) void supracan_state::get_tilemap_info_common(int layer, tile_data &tileinfo, int count) { - uint16_t* supracan_vram = m_vram; + uint16_t *vram = m_vram; uint32_t base = m_tilemap_base_addr[layer]; int gfx_mode = (m_tilemap_mode[layer] & 0x7000) >> 12; @@ -363,9 +360,9 @@ void supracan_state::get_tilemap_info_common(int layer, tile_data &tileinfo, int palette_shift = 2; } - int tile = (supracan_vram[count] & 0x03ff) + tile_bank; - int flipxy = (supracan_vram[count] & 0x0c00) >> 10; - int palette = ((supracan_vram[count] & 0xf000) >> 12) << palette_shift; + int tile = (vram[count] & 0x03ff) + tile_bank; + int flipxy = (vram[count] & 0x0c00) >> 10; + int palette = ((vram[count] & 0xf000) >> 12) << palette_shift; tileinfo.set(region, tile, palette, TILE_FLIPXY(flipxy)); } @@ -373,7 +370,7 @@ void supracan_state::get_tilemap_info_common(int layer, tile_data &tileinfo, int // I wonder how different this really is.. my guess, not at all. void supracan_state::get_roz_tilemap_info(int layer, tile_data &tileinfo, int count) { - uint16_t* supracan_vram = m_vram; + uint16_t *vram = m_vram; uint32_t base = m_roz_base_addr; @@ -414,9 +411,9 @@ void supracan_state::get_roz_tilemap_info(int layer, tile_data &tileinfo, int co count += base; - int tile = (supracan_vram[count] & 0x03ff) + tile_bank; - int flipxy = (supracan_vram[count] & 0x0c00) >> 10; - int palette = ((supracan_vram[count] & 0xf000) >> 12) + palette_bank; + int tile = (vram[count] & 0x03ff) + tile_bank; + int flipxy = (vram[count] & 0x0c00) >> 10; + int palette = ((vram[count] & 0xf000) >> 12) + palette_bank; tileinfo.set(region, tile, palette, TILE_FLIPXY(flipxy)); } @@ -733,7 +730,7 @@ void supracan_state::draw_sprite_tile_masked(bitmap_ind16 &dst, bitmap_ind8 &mas void supracan_state::draw_sprites(bitmap_ind16 &bitmap, bitmap_ind8 &maskmap, bitmap_ind8 &priomap, const rectangle &cliprect) { - uint16_t *supracan_vram = m_vram; + uint16_t *vram = m_vram; // [0] // -e-- ---- ---- ---- sprite enable? @@ -763,50 +760,50 @@ void supracan_state::draw_sprites(bitmap_ind16 &bitmap, bitmap_ind8 &maskmap, bi for (int i = start_word; i < end_word; i += 4) { - int x = supracan_vram[i + 2] & 0x01ff; - int y = supracan_vram[i + 0] & 0x01ff; + int x = vram[i + 2] & 0x01ff; + int y = vram[i + 0] & 0x01ff; - int sprite_offset = (supracan_vram[i + 3])<< 1; + int sprite_offset = (vram[i + 3])<< 1; - int bank = (supracan_vram[i + 1] & 0xf000) >> 12; - int mask = (supracan_vram[i + 1] & 0x0300) >> 8; - int sprite_xflip = (supracan_vram[i + 1] & 0x0800) >> 11; - int sprite_yflip = (supracan_vram[i + 1] & 0x0400) >> 10; - int prio = (supracan_vram[i + 2] >> 9) & 3; - //int xscale = supracan_vram[i + 2] >> 13; + int bank = (vram[i + 1] & 0xf000) >> 12; + int mask = (vram[i + 1] & 0x0300) >> 8; + int sprite_xflip = (vram[i + 1] & 0x0800) >> 11; + int sprite_yflip = (vram[i + 1] & 0x0400) >> 10; + int prio = (vram[i + 2] >> 9) & 3; + //int xscale = vram[i + 2] >> 13; gfx_element *gfx = m_gfxdecode->gfx(region); // wraparound if (y >= 0x180) y -= 0x200; if (x >= 0x180) x -= 0x200; - if ((supracan_vram[i + 0] & 0x4000)) + if ((vram[i + 0] & 0x4000)) { #if 0 printf("%d (unk %02x) (enable %02x) (unk Y2 %02x, %02x) (y pos %02x) (bank %01x) (flip %01x) (unknown %02x) (x size %02x) (xscale %01x) (unk %01x) (xpos %02x) (code %04x)\n", i, - (supracan_vram[i + 0] & 0x8000) >> 15, - (supracan_vram[i + 0] & 0x4000) >> 14, - (supracan_vram[i + 0] & 0x2000) >> 13, - (supracan_vram[i + 0] & 0x1e00) >> 8, - (supracan_vram[i + 0] & 0x01ff), - (supracan_vram[i + 1] & 0xf000) >> 12, - (supracan_vram[i + 1] & 0x0c00) >> 10, - (supracan_vram[i + 1] & 0x03f0) >> 4, - (supracan_vram[i + 1] & 0x000f), - (supracan_vram[i + 2] & 0xf000) >> 12, - (supracan_vram[i + 2] & 0x0e00) >> 8, - (supracan_vram[i + 2] & 0x01ff) >> 0, - (supracan_vram[i + 3] & 0xffff)); + (vram[i + 0] & 0x8000) >> 15, + (vram[i + 0] & 0x4000) >> 14, + (vram[i + 0] & 0x2000) >> 13, + (vram[i + 0] & 0x1e00) >> 8, + (vram[i + 0] & 0x01ff), + (vram[i + 1] & 0xf000) >> 12, + (vram[i + 1] & 0x0c00) >> 10, + (vram[i + 1] & 0x03f0) >> 4, + (vram[i + 1] & 0x000f), + (vram[i + 2] & 0xf000) >> 12, + (vram[i + 2] & 0x0e00) >> 8, + (vram[i + 2] & 0x01ff) >> 0, + (vram[i + 3] & 0xffff)); #endif - if (supracan_vram[i + 3] & 0x8000) + if (vram[i + 3] & 0x8000) { - uint16_t data = supracan_vram[i + 3]; + uint16_t data = vram[i + 3]; int tile = (bank * 0x200) + (data & 0x03ff); int palette = (data & 0xf000) >> 12; // this might not be correct, due to the & 0x8000 condition above this would force all single tile sprites to be using palette >= 0x8 only - // printf("sprite data %04x %04x %04x %04x\n", supracan_vram[i+0] , supracan_vram[i+1] , supracan_vram[i+2] ,supracan_vram[i+3] ); + // printf("sprite data %04x %04x %04x %04x\n", vram[i+0] , vram[i+1] , vram[i+2] ,vram[i+3] ); if (mask > 1) draw_sprite_tile_mask(maskmap, cliprect, gfx, tile, sprite_xflip, sprite_yflip, x, y); @@ -817,8 +814,8 @@ void supracan_state::draw_sprites(bitmap_ind16 &bitmap, bitmap_ind8 &maskmap, bi } else { - int xsize = 1 << (supracan_vram[i + 1] & 7); - int ysize = ((supracan_vram[i + 0] & 0x1e00) >> 9) + 1; + int xsize = 1 << (vram[i + 1] & 7); + int ysize = ((vram[i + 0] & 0x1e00) >> 9) + 1; // I think the xsize must influence the ysize somehow, there are too many conflicting cases otherwise // there don't appear to be any special markers in the actual looked up tile data to indicate skip / end of list @@ -827,7 +824,7 @@ void supracan_state::draw_sprites(bitmap_ind16 &bitmap, bitmap_ind8 &maskmap, bi { for (int xtile = 0; xtile < xsize; xtile++) { - uint16_t data = supracan_vram[(sprite_offset + ytile * xsize + xtile) & VRAM_MASK]; + uint16_t data = vram[(sprite_offset + ytile * xsize + xtile) & VRAM_MASK]; int tile = (bank * 0x200) + (data & 0x03ff); int palette = (data & 0xf000) >> 12; @@ -883,7 +880,7 @@ void supracan_state::mark_active_tilemap_all_dirty(int layer) /* draws tilemap with linescroll OR columnscroll to 16-bit indexed bitmap */ -void supracan_state::draw_roz_layer(bitmap_ind16 &bitmap, const rectangle &cliprect, tilemap_t *tmap, uint32_t startx, uint32_t starty, int incxx, int incxy, int incyx, int incyy, int wraparound/*, int columnscroll, uint32_t* scrollram*/, int transmask) +void supracan_state::draw_roz_layer(bitmap_ind16 &bitmap, const rectangle &cliprect, tilemap_t *tmap, uint32_t startx, uint32_t starty, int incxx, int incxy, int incyx, int incyy, int wraparound/*, int columnscroll, uint32_t *scrollram*/, int transmask) { bitmap_ind16 &srcbitmap = tmap->pixmap(); const int xmask = srcbitmap.width() - 1; @@ -1061,7 +1058,7 @@ uint32_t supracan_state::screen_update(screen_device &screen, bitmap_ind16 &bitm for (int y = cliprect.min_y; y <= cliprect.max_y; y++) { // these will have to change to uint32_t* etc. once alpha blending is supported - uint16_t* screen = &bitmap.pix(y); + uint16_t *screen = &bitmap.pix(y); int actualy = y & mosaic_mask; int realy = actualy + scrolly; @@ -1070,8 +1067,8 @@ uint32_t supracan_state::screen_update(screen_device &screen, bitmap_ind16 &bitm if (scrolly + y < 0 || scrolly + y > ((ysize * 8) - 1)) continue; - uint16_t* src = &src_bitmap.pix(realy & ((ysize * 8) - 1)); - uint8_t* priop = &m_prio_bitmap.pix(y); + uint16_t *src = &src_bitmap.pix(realy & ((ysize * 8) - 1)); + uint8_t *priop = &m_prio_bitmap.pix(y); for (int x = cliprect.min_x; x <= cliprect.max_x; x++) { @@ -1164,9 +1161,9 @@ uint32_t supracan_state::screen_update(screen_device &screen, bitmap_ind16 &bitm { for (int y = cliprect.min_y; y <= cliprect.max_y; y++) { - uint16_t* dstp = &bitmap.pix(y); - uint8_t* priop = &m_prio_bitmap.pix(y); - uint16_t* spritep = &m_sprite_final_bitmap.pix(y); + uint16_t *dstp = &bitmap.pix(y); + uint8_t *priop = &m_prio_bitmap.pix(y); + uint16_t *spritep = &m_sprite_final_bitmap.pix(y); for (int x = cliprect.min_x; x <= cliprect.max_x; x++) { @@ -1194,7 +1191,7 @@ void supracan_state::sound_dma_irq(int state) set_sound_irq(6, state); } -void supracan_state::dma_w(int offset, uint16_t data, uint16_t mem_mask, int ch) +template void supracan_state::dma_w(offs_t offset, uint16_t data, uint16_t mem_mask) { address_space &mem = m_maincpu->space(AS_PROGRAM); @@ -1264,17 +1261,6 @@ void supracan_state::dma_w(int offset, uint16_t data, uint16_t mem_mask, int ch) } } -void supracan_state::dma_channel0_w(offs_t offset, uint16_t data, uint16_t mem_mask) -{ - dma_w(offset, data, mem_mask, 0); -} - -void supracan_state::dma_channel1_w(offs_t offset, uint16_t data, uint16_t mem_mask) -{ - dma_w(offset, data, mem_mask, 1); -} - - #if 0 void supracan_state::supracan_pram_w(offs_t offset, uint16_t data, uint16_t mem_mask) { @@ -1307,7 +1293,7 @@ void supracan_state::vram_w(offs_t offset, uint16_t data, uint16_t mem_mask) m_gfxdecode->gfx(4)->mark_dirty((offset * 2) / 8); } -void supracan_state::supracan_mem(address_map &map) +void supracan_state::main_map(address_map &map) { map(0x000000, 0x3fffff).view(m_main_loview); m_main_loview[0](0x000000, 0x3fffff).r(m_cart, FUNC(generic_slot_device::read16_rom)); @@ -1315,8 +1301,8 @@ void supracan_state::supracan_mem(address_map &map) m_main_loview[1](0x000000, 0x3fffff).r(m_cart, FUNC(generic_slot_device::read16_rom)); map(0xe80000, 0xe8ffff).rw(FUNC(supracan_state::_68k_soundram_r), FUNC(supracan_state::_68k_soundram_w)); map(0xe90000, 0xe9001f).m(*this, FUNC(supracan_state::host_um6619_map)); - map(0xe90020, 0xe9002f).w(FUNC(supracan_state::dma_channel0_w)); - map(0xe90030, 0xe9003f).w(FUNC(supracan_state::dma_channel1_w)); + map(0xe90020, 0xe9002f).w(FUNC(supracan_state::dma_w<0>)); + map(0xe90030, 0xe9003f).w(FUNC(supracan_state::dma_w<1>)); map(0xe90b3c, 0xe90b3d).noprw(); // noisy during lockout checks @@ -1437,7 +1423,7 @@ void supracan_state::_6502_soundmem_w(offs_t offset, uint8_t data) { if (BIT(lowered, pad + 0)) { - m_latched_controls[pad] = m_pads[pad]->read(); + m_latched_controls[pad] = m_pad[pad]->read(); } if (BIT(lowered, pad + 2)) { @@ -1480,55 +1466,11 @@ void supracan_state::_6502_soundmem_w(offs_t offset, uint8_t data) } } -void supracan_state::supracan_sound_mem(address_map &map) +void supracan_state::sound_map(address_map &map) { map(0x0000, 0xffff).rw(FUNC(supracan_state::_6502_soundmem_r), FUNC(supracan_state::_6502_soundmem_w)).share("soundram"); } -static INPUT_PORTS_START( supracan ) - PORT_START("P1") - PORT_BIT(0x000f, IP_ACTIVE_LOW, IPT_UNUSED) - PORT_BIT(0x0010, IP_ACTIVE_LOW, IPT_BUTTON6) PORT_PLAYER(1) PORT_NAME("P1 Button R") - PORT_BIT(0x0020, IP_ACTIVE_LOW, IPT_BUTTON5) PORT_PLAYER(1) PORT_NAME("P1 Button L") - PORT_BIT(0x0040, IP_ACTIVE_LOW, IPT_BUTTON4) PORT_PLAYER(1) PORT_NAME("P1 Button Y") - PORT_BIT(0x0080, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_PLAYER(1) PORT_NAME("P1 Button X") - PORT_BIT(0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) PORT_PLAYER(1) PORT_NAME("P1 Joypad Right") - PORT_BIT(0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT) PORT_PLAYER(1) PORT_NAME("P1 Joypad Left") - PORT_BIT(0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN) PORT_PLAYER(1) PORT_NAME("P1 Joypad Down") - PORT_BIT(0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_UP) PORT_PLAYER(1) PORT_NAME("P1 Joypad Up") - PORT_BIT(0x1000, IP_ACTIVE_LOW, IPT_UNUSED) - PORT_BIT(0x2000, IP_ACTIVE_LOW, IPT_START1) - PORT_BIT(0x4000, IP_ACTIVE_LOW, IPT_BUTTON3) PORT_PLAYER(1) PORT_NAME("P1 Button B") - PORT_BIT(0x8000, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_PLAYER(1) PORT_NAME("P1 Button A") - - PORT_START("P2") - PORT_BIT(0x000f, IP_ACTIVE_LOW, IPT_UNUSED) - PORT_BIT(0x0010, IP_ACTIVE_LOW, IPT_BUTTON6) PORT_PLAYER(2) PORT_NAME("P2 Button R") - PORT_BIT(0x0020, IP_ACTIVE_LOW, IPT_BUTTON5) PORT_PLAYER(2) PORT_NAME("P2 Button L") - PORT_BIT(0x0040, IP_ACTIVE_LOW, IPT_BUTTON4) PORT_PLAYER(2) PORT_NAME("P2 Button Y") - PORT_BIT(0x0080, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_PLAYER(2) PORT_NAME("P2 Button X") - PORT_BIT(0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) PORT_PLAYER(2) PORT_NAME("P2 Joypad Right") - PORT_BIT(0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT) PORT_PLAYER(2) PORT_NAME("P2 Joypad Left") - PORT_BIT(0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN) PORT_PLAYER(2) PORT_NAME("P2 Joypad Down") - PORT_BIT(0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_UP) PORT_PLAYER(2) PORT_NAME("P2 Joypad Up") - PORT_BIT(0x1000, IP_ACTIVE_LOW, IPT_UNUSED) - PORT_BIT(0x2000, IP_ACTIVE_LOW, IPT_START2) - PORT_BIT(0x4000, IP_ACTIVE_LOW, IPT_BUTTON3) PORT_PLAYER(2) PORT_NAME("P2 Button B") - PORT_BIT(0x8000, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_PLAYER(2) PORT_NAME("P2 Button A") -INPUT_PORTS_END - -void supracan_state::palette_init(palette_device &palette) const -{ - // Used for debugging purposes for now - for (int i = 0; i < 32768; i++) - { - int const r = (i & 0x1f) << 3; - int const g = ((i >> 5) & 0x1f) << 3; - int const b = ((i >> 10) & 0x1f) << 3; - palette.set_pen_color(i, r, g, b); - } -} - void supracan_state::_68k_soundram_w(offs_t offset, uint16_t data, uint16_t mem_mask) { m_soundram[offset * 2 + 1] = data & 0xff; @@ -1555,10 +1497,10 @@ uint16_t supracan_state::_68k_soundram_r(offs_t offset, uint16_t mem_mask) // formduel, jttlaugh & speedyd all wants polling in "direct mode" from 68k if ((offset * 2) == 0x200) - return m_pads[0]->read() ^ 0xffff; + return m_pad[0]->read() ^ 0xffff; if ((offset * 2) == 0x202) - return m_pads[1]->read() ^ 0xffff; + return m_pad[1]->read() ^ 0xffff; if (offset * 2 >= 0x400 && offset * 2 < 0x500) { @@ -1582,14 +1524,14 @@ void supracan_state::host_um6619_map(address_map &map) map(0x04, 0x05).lr8( NAME([this] (offs_t offset) { const u8 res = m_soundram[0x40c + offset]; - LOGMASKED(LOG_SOUND, "%s [host_um6619_map] DMA Request address from 6502 [%04x] %02x\n", machine().describe_context(), offset + 0x404, res); + LOGMASKED(LOG_SOUND, "%s DMA Request address from 6502 [%04x] %02x\n", machine().describe_context(), offset + 0x404, res); return res; }) ); // TODO: verify $b access map(0x0a, 0x0b).lw8( NAME([this] (offs_t offset, u8 data) { - LOGMASKED(LOG_SOUND, "%s [host_um6619_map] Sound CPU IRQ request [%02x]: %02x\n", machine().describe_context(), offset + 0x40a, data); + LOGMASKED(LOG_SOUND, "%s Sound CPU IRQ request [%02x]: %02x\n", machine().describe_context(), offset + 0x40a, data); set_sound_irq(5, 1); }) ); @@ -1597,7 +1539,7 @@ void supracan_state::host_um6619_map(address_map &map) map(0x0c, 0x0d).lr8( NAME([this] (offs_t offset) { const u8 res = m_soundram[0x40a]; - LOGMASKED(LOG_SOUND, "%s: [host_um6619_map] DMA Request flag from 6502, [%02x]: %02x\n", machine().describe_context(), offset + 0x40c, res); + LOGMASKED(LOG_SOUND, "%s: DMA Request flag from 6502, [%02x]: %02x\n", machine().describe_context(), offset + 0x40c, res); return res; }) ); @@ -1609,7 +1551,7 @@ void supracan_state::host_um6619_map(address_map &map) NAME([this] (offs_t offset, u8 data) { // bit 7: enabled by slghtsag after BIOS (would otherwise address error) // other bits tbd (bit 3 doesn't seem irq 3 enable as per speedyd not enabling it) - logerror("irq mask %02x @ VPOS %d\n", data, m_screen->vpos()); + //logerror("irq mask %02x @ VPOS %d\n", data, m_screen->vpos()); m_irq_mask = data; }) ); @@ -1671,7 +1613,7 @@ void supracan_state::host_um6619_map(address_map &map) m_soundcpu->set_input_line(INPUT_LINE_HALT, ASSERT_LINE); } } - LOGMASKED(LOG_SOUND, "%s: [host_um6619_map] Sound CPU ctrl write: %04x\n", machine().describe_context(), data); + LOGMASKED(LOG_SOUND, "%s: Sound CPU ctrl write: %04x\n", machine().describe_context(), data); }) ); } @@ -1780,7 +1722,7 @@ TIMER_CALLBACK_MEMBER(supracan_state::video_callback) } m_hbl_timer->adjust(m_screen->time_until_pos(vpos, 320)); - m_video_timer->adjust(m_screen->time_until_pos((vpos + 1) % 256, 0)); + m_video_timer->adjust(m_screen->time_until_pos((vpos + 1) % 262, 0)); } void supracan_state::video_w(offs_t offset, uint16_t data, uint16_t mem_mask) @@ -1861,7 +1803,7 @@ void supracan_state::video_w(offs_t offset, uint16_t data, uint16_t mem_mask) { mem.write_word(m_sprdma_regs.dst, 0); m_sprdma_regs.dst += 2 * m_sprdma_regs.dst_inc; - //memset(supracan_vram, 0x00, 0x020000); + //memset(vram, 0x00, 0x020000); } else { @@ -1902,6 +1844,7 @@ void supracan_state::video_w(offs_t offset, uint16_t data, uint16_t mem_mask) LOGMASKED(LOG_IRQS, "Raster 'line on' IRQ Trigger write? = %04x\n", data); if (data & 0x8000) { + // NOTE: sangofgt draws a garbage line strip at target line, but this happens on real HW as well m_line_on_timer->adjust(m_screen->time_until_pos((data & 0x00ff), 0)); } else @@ -1993,6 +1936,38 @@ DEVICE_IMAGE_LOAD_MEMBER(supracan_state::cart_load) return std::make_pair(std::error_condition(), std::string()); } +static INPUT_PORTS_START( supracan ) + PORT_START("P1") + PORT_BIT(0x000f, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x0010, IP_ACTIVE_LOW, IPT_BUTTON6) PORT_PLAYER(1) PORT_NAME("P1 Button R") + PORT_BIT(0x0020, IP_ACTIVE_LOW, IPT_BUTTON5) PORT_PLAYER(1) PORT_NAME("P1 Button L") + PORT_BIT(0x0040, IP_ACTIVE_LOW, IPT_BUTTON4) PORT_PLAYER(1) PORT_NAME("P1 Button Y") + PORT_BIT(0x0080, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_PLAYER(1) PORT_NAME("P1 Button X") + PORT_BIT(0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) PORT_PLAYER(1) PORT_NAME("P1 Joypad Right") + PORT_BIT(0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT) PORT_PLAYER(1) PORT_NAME("P1 Joypad Left") + PORT_BIT(0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN) PORT_PLAYER(1) PORT_NAME("P1 Joypad Down") + PORT_BIT(0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_UP) PORT_PLAYER(1) PORT_NAME("P1 Joypad Up") + PORT_BIT(0x1000, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x2000, IP_ACTIVE_LOW, IPT_START1) + PORT_BIT(0x4000, IP_ACTIVE_LOW, IPT_BUTTON3) PORT_PLAYER(1) PORT_NAME("P1 Button B") + PORT_BIT(0x8000, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_PLAYER(1) PORT_NAME("P1 Button A") + + PORT_START("P2") + PORT_BIT(0x000f, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x0010, IP_ACTIVE_LOW, IPT_BUTTON6) PORT_PLAYER(2) PORT_NAME("P2 Button R") + PORT_BIT(0x0020, IP_ACTIVE_LOW, IPT_BUTTON5) PORT_PLAYER(2) PORT_NAME("P2 Button L") + PORT_BIT(0x0040, IP_ACTIVE_LOW, IPT_BUTTON4) PORT_PLAYER(2) PORT_NAME("P2 Button Y") + PORT_BIT(0x0080, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_PLAYER(2) PORT_NAME("P2 Button X") + PORT_BIT(0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) PORT_PLAYER(2) PORT_NAME("P2 Joypad Right") + PORT_BIT(0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT) PORT_PLAYER(2) PORT_NAME("P2 Joypad Left") + PORT_BIT(0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN) PORT_PLAYER(2) PORT_NAME("P2 Joypad Down") + PORT_BIT(0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_UP) PORT_PLAYER(2) PORT_NAME("P2 Joypad Up") + PORT_BIT(0x1000, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x2000, IP_ACTIVE_LOW, IPT_START2) + PORT_BIT(0x4000, IP_ACTIVE_LOW, IPT_BUTTON3) PORT_PLAYER(2) PORT_NAME("P2 Button B") + PORT_BIT(0x8000, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_PLAYER(2) PORT_NAME("P2 Button A") +INPUT_PORTS_END + void supracan_state::machine_start() { @@ -2081,7 +2056,6 @@ void supracan_state::machine_reset() std::fill(std::begin(m_tilemap_base_addr), std::end(m_tilemap_base_addr), 0); } -/* gfxdecode is retained for reference purposes but not otherwise used by the driver */ static const gfx_layout supracan_gfx8bpp = { 8, 8, @@ -2117,7 +2091,6 @@ static const gfx_layout supracan_gfx2bpp = 8*16 }; - static const uint32_t xtexlayout_xoffset[64] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23, 24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44, 45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63 }; @@ -2130,6 +2103,7 @@ static const uint32_t xtexlayout_yoffset[64] = { 0*64,1*64,2*64,3*64,4*64,5*64, 40*64,41*64,42*64,43*64,44*64,45*64,46*64,47*64, 48*64,49*64,50*64,51*64,52*64,53*64,54*64,55*64, 56*64,57*64,58*64,59*64,60*64,61*64,62*64,63*64 }; + static const gfx_layout supracan_gfx1bpp = { 64, 64, @@ -2167,12 +2141,12 @@ void supracan_state::supracan(machine_config &config) { // M68000P10 M68000(config, m_maincpu, U13_CLOCK / 6); - m_maincpu->set_addrmap(AS_PROGRAM, &supracan_state::supracan_mem); + m_maincpu->set_addrmap(AS_PROGRAM, &supracan_state::main_map); // TODO: Verify type and actual clock // /4 makes speedyd to fail booting M65C02(config, m_soundcpu, U13_CLOCK / 6 / 2); - m_soundcpu->set_addrmap(AS_PROGRAM, &supracan_state::supracan_sound_mem); + m_soundcpu->set_addrmap(AS_PROGRAM, &supracan_state::sound_map); config.set_perfect_quantum(m_soundcpu); @@ -2184,7 +2158,7 @@ void supracan_state::supracan(machine_config &config) m_screen->set_palette("palette"); //m_screen->screen_vblank().set(FUNC(supracan_state::screen_vblank)); - PALETTE(config, "palette", FUNC(supracan_state::palette_init)).set_format(palette_device::xBGR_555, 32768); + PALETTE(config, "palette").set_format(palette_device::xBGR_555, 256); GFXDECODE(config, m_gfxdecode, "palette", gfx_supracan);