diff --git a/hash/supracan.xml b/hash/supracan.xml index b12fd7a8dd18a..dea4dbe489b2c 100644 --- a/hash/supracan.xml +++ b/hash/supracan.xml @@ -9,9 +9,8 @@ license:CC0-1.0 1995 AV Artisan Corp. @@ -29,8 +28,11 @@ Gameplay logic falls apart once either side attacks (side becomes unresponsive, + @@ -44,12 +46,15 @@ Gameplay logic falls apart once either side attacks (side becomes unresponsive, Funtech + @@ -63,7 +68,7 @@ Broken [video] sprites during gameplay @@ -79,13 +84,12 @@ Broken [video] sprites during gameplay 1995 C&E Soft + @@ -96,6 +100,9 @@ Unresponsive [joy] inputs Journey to the Laugh ~ Xi You Ji 1995 Funtech + @@ -110,13 +117,13 @@ Unresponsive [joy] inputs 1996 Kingformation + @@ -131,6 +138,7 @@ Wrong [video] layer 1 priority and colors during intro + @@ -142,8 +150,9 @@ Wrong [video] layer 1 priority and colors during intro 1996 Funtech @@ -156,15 +165,14 @@ Too fast in gameplay, controls [irq 3] as FRC Magical Pool ~ Mo Bang Zhuang Qiu - 199? + 1996 Funtech diff --git a/src/mame/funtech/supracan.cpp b/src/mame/funtech/supracan.cpp index da26a6bcdf6e1..ead2bedaa848e 100644 --- a/src/mame/funtech/supracan.cpp +++ b/src/mame/funtech/supracan.cpp @@ -1251,7 +1251,24 @@ template void supracan_state::dma_w(offs_t offset, uint16_t data, for (int i = 0; i <= m_dma_regs.count[ch]; i++) { - if (data & 0x1000) + // staiwbbl wants to fill both VRAM and work RAM at startup, + // and expects to transfer word for VRAM, byte for work RAM. + // Not providing this will cause all kinds of video and logic glitches. + // TODO: pinpoint DMA modes here (at least upper bits 14-13 should do) + if (data == 0xa800) + { + if ((m_dma_regs.dest[ch] & 0xfe0000) == 0xf40000) + { + mem.write_word(m_dma_regs.dest[ch], 0); + m_dma_regs.dest[ch] += dest_dec ? -2 : 2; + } + else + { + mem.write_byte(m_dma_regs.dest[ch], mem.read_byte(m_dma_regs.source[ch])); + m_dma_regs.dest[ch] += dest_dec ? -1 : 1; + } + } + else if (data & 0x1000) { mem.write_word(m_dma_regs.dest[ch], mem.read_word(m_dma_regs.source[ch])); m_dma_regs.dest[ch] += dest_dec ? -2 : 2; @@ -1270,6 +1287,9 @@ template void supracan_state::dma_w(offs_t offset, uint16_t data, m_dma_regs.source[ch] += src_dec ? -1 : 1; } } + // TODO: are these DMA cycle steal? + // There's no indication of a DMA status read so far that would indicate burst. + //m_maincpu->spin_until_time(m_maincpu->cycles_to_attotime(m_dma_regs.count[ch] * 2)); } else if (data != 0x0000) // fake DMA, used by C.U.G. { @@ -1568,7 +1588,7 @@ void supracan_state::update_frc_state() // magipool: sets 0xa201 / 0x0104 at startup, sometimes flips frequency to 0x0046 // - causes a crash at boot if too fast; - // - takes roughly 6 seconds for a title screen kanji to move right-to-left; + // - takes roughly 6 seconds for a title screen individual kanji to move right-to-left; case 1: m_frc_timer->adjust(attotime::from_hz(30)); break;