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;