diff options
author | David Haywood <mamehaze@gmail.com> | 2019-05-30 19:32:30 +0100 |
---|---|---|
committer | R. Belmont <rb6502@users.noreply.github.com> | 2019-05-30 14:32:30 -0400 |
commit | c596c2c4b7a5b39e3f51e9d428934c0e750d0db6 (patch) | |
tree | 94eb306589646c548c5ea545eeec6a2121635f67 | |
parent | 2da86cda04731e3aa4e59b1ee0c7ff73929897aa (diff) |
trkfldch / my1stddr - some heavy refactor / reorganization based on current knowledge (nw) (#5124)
* note updates (nw)
* no (nw)
* refactors (nw)
* more refactor (nw)
* fix log (nw)
* bit use note (nw)
* note about use (nw)
* register use notes (nw)
* notes, possible timer irq (nw)
-rw-r--r-- | src/mame/drivers/trkfldch.cpp | 971 |
1 files changed, 538 insertions, 433 deletions
diff --git a/src/mame/drivers/trkfldch.cpp b/src/mame/drivers/trkfldch.cpp index 180678f7147..f2467b0e165 100644 --- a/src/mame/drivers/trkfldch.cpp +++ b/src/mame/drivers/trkfldch.cpp @@ -76,10 +76,42 @@ private: uint8_t m_which_vector; + uint8_t tilemap_scroll_window_r(int which, uint8_t reg, uint16_t real_base); + + DECLARE_READ8_MEMBER(tmap0_scroll_window_r); + DECLARE_READ8_MEMBER(tmap1_scroll_window_r); + + void tilemap_scroll_window_w(int which, uint8_t reg, uint8_t data, uint16_t real_base); + + DECLARE_WRITE8_MEMBER(tmap0_scroll_window_w); + DECLARE_WRITE8_MEMBER(tmap1_scroll_window_w); + + uint8_t m_dmaregs[0xe]; + + DECLARE_READ8_MEMBER(dmaregs_r); + DECLARE_WRITE8_MEMBER(dmaregs_w); + + uint8_t m_modebank[0xb]; + + DECLARE_READ8_MEMBER(modebankregs_r); + DECLARE_WRITE8_MEMBER(modebankregs_w); + + uint8_t m_tilemapbase[0x3]; + + DECLARE_READ8_MEMBER(tilemapbase_r); + DECLARE_WRITE8_MEMBER(tilemapbase_w); + + uint8_t m_sysregs[0x10]; + + DECLARE_READ8_MEMBER(sysregs_r); + DECLARE_WRITE8_MEMBER(sysregs_w); + + uint8_t m_unkregs[0x90]; + DECLARE_READ8_MEMBER(unkregs_r); DECLARE_WRITE8_MEMBER(unkregs_w); - uint8_t m_unkregs[0x100]; + uint8_t m_tmapscroll_window[2][0x12]; uint8_t m_unkdata[0x100000]; int m_unkdata_addr; @@ -96,30 +128,45 @@ void trkfldch_state::render_tile_layer(screen_device& screen, bitmap_ind16& bitm // tilemap 1= my1stddr HUD layer -// why does this use a different set of scroll registers? maybe global (applies to both layers?) as only one is enabled at this point. -// uint16_t xscroll = (m_unkregs[0x26] << 0) | (m_unkregs[0x27] << 8); // trkfld tilemap 0, race top -// uint16_t xscroll = (m_unkregs[0x28] << 0) | (m_unkregs[0x29] << 8); // trkfld tilemap 0, race bot (window?) - -// uint16_t xscroll = (m_unkregs[0x2a] << 0) | (m_unkregs[0x2b] << 8); // trkfld tilemap 0?, javelin -// uint16_t yscroll = (m_unkregs[0x30] << 0) | (m_unkregs[0x31] << 8); // trkfld tilemap 0, javelin, holes, hammer throw -// uint16_t xscroll = (m_unkregs[0x3a] << 0) | (m_unkregs[0x3b] << 8); // trkfld tilemap 1?, javelin -// uint16_t yscroll = (m_unkregs[0x42] << 0) | (m_unkregs[0x43] << 8); // my1stddr tilemap 1 scroller, trkfld tilemap 1 holes (both window) - -// for left / right on tilemap 1 -// 0x14 & 0x28 (20 and 40) on trkfld hurdle the holes (resets to 0x00 & 0x28 after event - possible default values) -// 0x29 & 0x29 when unused on my1stddr, 0x25 & 0x29 when used -// uint8_t windowleft = m_unkregs[0x36]; -// uint8_t windowright = m_unkregs[0x37]; - -// for top/bottom on tilemap 1 -// uint8_t windowtop = m_unkregs[0x33]; -// uint8_t windowbottom = m_unkregs[0x34]; - +// first group of tile scroll registers starting at 7820 + +// none of these written by hammer throw in trkfld or ddr +// uint8_t unk20 = m_tmapscroll_window[0][0x00]; // 0f - 100 meters 00 - javelin, long jump, triple 00 after events, 1e high jump -- hurdle holes -- ddr (assume default of 00?) +// uint8_t unk21 = m_tmapscroll_window[0][0x01]; // 1f - 100 meters 00 - javelin, long jump, triple 00 after events, 00 high jump 00 hurdle holes -- ddr (assume default of 00?) +// uint8_t unk22 = m_tmapscroll_window[0][0x02]; // 1f - 100 meters 1e - javelin, long jump, triple 1e after events, 1e high jump 1e hurdle holes -- ddr (assume default of 1e?) +// uint8_t unk23 = m_tmapscroll_window[0][0x03]; // -- - 100 meters, 1e - javelin, long jump, triple -- after events, -- high jump -- hurdle holes -- ddr (assume default of 1e?) +// uint8_t unk24 = m_tmapscroll_window[0][0x04]; // 00 after events 00 hurdle holes -- ddr (assume default of 00?) +// uint8_t unk25 = m_tmapscroll_window[0][0x05]; // 28 after events 14 hurdle holes -- ddr (assume default of 28?) + +// uint16_t xscroll = (m_tmapscroll_window[0][0x06] << 0) | (m_tmapscroll_window[0][0x07] << 8); // trkfld tilemap 0, race top // why do the split screen races use a different set of scroll registers? maybe global (applies to both layers?) as only one is enabled at this point. +// uint16_t xscroll = (m_tmapscroll_window[0][0x08] << 0) | (m_tmapscroll_window[0][0x09] << 8); // trkfld tilemap 0, race bot (window?) +// uint16_t xscroll = (m_tmapscroll_window[0][0x0a] << 0) | (m_tmapscroll_window[0][0x0b] << 8); // trkfld tilemap 0?, javelin +// 0c,0d never written +// 0e,0f never written +// uint16_t yscroll = (m_tmapscroll_window[0][0x10] << 0) | (m_tmapscroll_window[0][0x11] << 8); // trkfld tilemap 0, javelin, holes, hammer throw + +// second group of tile scroll registers starting at 7832 + +// 32 never written (assume default of 00? to fit 20-25 pattern?) +// uint8_t windowtop = m_tmapscroll_window[1][0x01]; // 0x00 - on trkfld hurdle the holes (also resets to 0x00 & after event - possible default values) (assume default of 00?) +// uint8_t windowbottom = m_tmapscroll_window[1][0x02]; // 0x1e ^ 0x1e (assume default of 1e?) +// uint8_t unk35 = m_tmapscroll_window[1][0x03]; set to 1e (30) (30*8=240) by trkfld high jump otherwise uninitialized always - something to do with bottom (assume default of 1e?) +// for left / right on tilemap 1 +// uint8_t windowleft = m_tmapscroll_window[1][0x04]; //0x29 when unused on my1stddr, 0x25 when used 14 when used on hurdle holes, resets to 00 after event (assume default of 00?) +// uint8_t windowright = m_tmapscroll_window[1][0x05]; //0x29 0x29 28 when used on hurdle holes, resets to 28 after event (assume default of 28?) + +// 06,076never written +// uint16_t xscroll = (m_tmapscroll_window[1][0x08] << 0) | (m_tmapscroll_window[1][0x09] << 8); // trkfld tilemap 1?, javelin +// 0a,0b never written +// 0c,0d never written +// 0e,0f never written +// uint16_t yscroll = (m_tmapscroll_window[1][0x10] << 0) | (m_tmapscroll_window[1][0x11] << 8); // my1stddr tilemap 1 scroller, trkfld tilemap 1 holes (both window) + +// printf("window %02x %02x %02x %02x %02x %02x\n", unk20, unk21, unk22, unk23, unk24, unk25); // printf("xscroll %04x\n", xscroll); // printf("yscroll %04x\n", yscroll); // printf("window left/right %02x %02x\n", windowleft, windowright); - // printf("window top/bottom %02x %02x\n", windowtop, windowbottom); @@ -128,16 +175,16 @@ void trkfldch_state::render_tile_layer(screen_device& screen, bitmap_ind16& bitm if (which == 0) { - base = (m_unkregs[0x54] << 8); - gfxbase = (m_unkregs[0x11] * 0x2000); + base = (m_tilemapbase[0x00] << 8); + gfxbase = (m_modebank[0x01] * 0x2000); } else //if (which == 1) { - base = (m_unkregs[0x55] << 8); - gfxbase = (m_unkregs[0x13] * 0x2000); + base = (m_tilemapbase[0x01] << 8); + gfxbase = (m_modebank[0x03] * 0x2000); } - if (m_unkregs[0x10] & 1) // seems like it might be a global control for bpp? + if (m_modebank[0x00] & 1) // seems like it might be a global control for bpp? { gfxbase -= 0x200; gfxregion = 0; @@ -193,7 +240,7 @@ void trkfldch_state::render_text_tile_layer(screen_device& screen, bitmap_ind16& if (0) { // guess, but it fits with where the other tilegfxbase registers are, and is only written on my1stddr when this layer is enabled - int tilegfxbase = (m_unkregs[0x17] * 0x80) - 0x100; + int tilegfxbase = (m_modebank[0x07] * 0x80) - 0x100; int offs = 0; for (int y = 0; y < 4; y++) @@ -238,7 +285,7 @@ void trkfldch_state::draw_sprites(screen_device& screen, bitmap_ind16& bitmap, c continue; // logerror("entry %02x %02x %02x %02x %02x\n", m_spriteram[i + 0], m_spriteram[i + 1], m_spriteram[i + 2], m_spriteram[i + 3], m_spriteram[i + 4]); - int tilegfxbase = (m_unkregs[0x15] * 0x800); + int tilegfxbase = (m_modebank[0x05] * 0x800); // --pp tt-y yyyy yyyy tttt tttt yyyy yyyy --zf -t-x @@ -275,7 +322,7 @@ void trkfldch_state::draw_sprites(screen_device& screen, bitmap_ind16& bitmap, c gfx_element* gfx; - if (m_unkregs[0x10] & 1) // seems like it might be a global control for bpp? + if (m_modebank[0x00] & 1) // seems like it might be a global control for bpp? { gfx = m_gfxdecode->gfx(1); tilegfxbase -= 0x80; @@ -322,30 +369,339 @@ uint32_t trkfldch_state::screen_update_trkfldch(screen_device& screen, bitmap_in m_palette->set_pen_color(i, r, g, b); } - if (1) // one of the m_unkregs[0x10] bits almost certainly would enable / disable this + if (1) // one of the m_modebank[0x00] bits almost certainly would enable / disable this { render_tile_layer(screen, bitmap, cliprect, 0); } draw_sprites(screen, bitmap, cliprect, 0); - if (m_unkregs[0x10] & 0x10) // definitely looks like layer enable + if (m_modebank[0x00] & 0x10) // definitely looks like layer enable { render_tile_layer(screen, bitmap, cliprect, 1); } draw_sprites(screen, bitmap, cliprect, 1); - if (m_unkregs[0x10] & 0x20) // this layer is buggy and not currently drawn + if (m_modebank[0x00] & 0x20) // this layer is buggy and not currently drawn { - int base = (m_unkregs[0x56] << 8); + int base = (m_tilemapbase[0x02] << 8); render_text_tile_layer(screen, bitmap, cliprect, base); } return 0; } +uint8_t trkfldch_state::tilemap_scroll_window_r(int which, uint8_t reg, uint16_t real_base) +{ + uint8_t ret = m_tmapscroll_window[which][reg]; + logerror("%s: tilemap_scroll_window_r (tilemap %d) reg: %02x (returning %02x) (real address %04x)\n", machine().describe_context(), which, reg, ret, real_base + reg); + return ret; +} + +READ8_MEMBER(trkfldch_state::tmap0_scroll_window_r) +{ + uint8_t ret = tilemap_scroll_window_r(0, offset, 0x7820); + return ret; +} + +READ8_MEMBER(trkfldch_state::tmap1_scroll_window_r) +{ + uint8_t ret = tilemap_scroll_window_r(1, offset, 0x7832); + return ret; +} + +void trkfldch_state::tilemap_scroll_window_w(int which, uint8_t reg, uint8_t data, uint16_t real_base) +{ + m_tmapscroll_window[which][reg] = data; + + switch (reg) + { + case 0x00: + logerror("%s: tilemap_scroll_window_w (tilemap %d) reg: %02x (window top reg0?) (data %02x) (real address %04x)\n", machine().describe_context(), which, reg, data, real_base + reg); + break; + + case 0x01: + logerror("%s: tilemap_scroll_window_w (tilemap %d) reg: %02x (window top reg1?) (data %02x) (real address %04x)\n", machine().describe_context(), which, reg, data, real_base + reg); + break; + + case 0x02: + logerror("%s: tilemap_scroll_window_w (tilemap %d) reg: %02x (window bottom reg0?) (data %02x) (real address %04x)\n", machine().describe_context(), which, reg, data, real_base + reg); + break; + + case 0x03: + logerror("%s: tilemap_scroll_window_w (tilemap %d) reg: %02x (window bottom reg1?) (data %02x) (real address %04x)\n", machine().describe_context(), which, reg, data, real_base + reg); + break; + + case 0x04: + logerror("%s: tilemap_scroll_window_w (tilemap %d) reg: %02x (window left reg) (data %02x) (real address %04x)\n", machine().describe_context(), which, reg, data, real_base + reg); + break; + + case 0x05: + logerror("%s: tilemap_scroll_window_w (tilemap %d) reg: %02x (window right reg) (data %02x) (real address %04x)\n", machine().describe_context(), which, reg, data, real_base + reg); + break; + + case 0x06: + logerror("%s: tilemap_scroll_window_w (tilemap %d) reg: %02x (non-window X scroll low) (data %02x) (real address %04x)\n", machine().describe_context(), which, reg, data, real_base + reg); + break; + + case 0x07: + logerror("%s: tilemap_scroll_window_w (tilemap %d) reg: %02x (non-window X scroll high) (data %02x) (real address %04x)\n", machine().describe_context(), which, reg, data, real_base + reg); + break; + + case 0x08: + logerror("%s: tilemap_scroll_window_w (tilemap %d) reg: %02x (window X scroll low) (data %02x) (real address %04x)\n", machine().describe_context(), which, reg, data, real_base + reg); + break; + + case 0x09: + logerror("%s: tilemap_scroll_window_w (tilemap %d) reg: %02x (window X scroll high) (data %02x) (real address %04x)\n", machine().describe_context(), which, reg, data, real_base + reg); + break; + + case 0x0a: + logerror("%s: tilemap_scroll_window_w (tilemap %d) reg: %02x (another X scroll low) (data %02x) (real address %04x)\n", machine().describe_context(), which, reg, data, real_base + reg); + break; + + case 0x0b: + logerror("%s: tilemap_scroll_window_w (tilemap %d) reg: %02x (another X scroll high) (data %02x) (real address %04x)\n", machine().describe_context(), which, reg, data, real_base + reg); + break; + + case 0x0c: + // unused, probably unknown Y scroll low + logerror("%s: tilemap_scroll_window_w (tilemap %d) reg: %02x (unknown) (data %02x) (real address %04x)\n", machine().describe_context(), which, reg, data, real_base + reg); + break; + + case 0x0d: + // unused, probably unknown Y scroll low + logerror("%s: tilemap_scroll_window_w (tilemap %d) reg: %02x (unknown) (data %02x) (real address %04x)\n", machine().describe_context(), which, reg, data, real_base + reg); + break; + + case 0x0e: + // unused, probably unknown Y scroll low + logerror("%s: tilemap_scroll_window_w (tilemap %d) reg: %02x (unknown) (data %02x) (real address %04x)\n", machine().describe_context(), which, reg, data, real_base + reg); + break; + + case 0x0f: + // unused, probably unknown Y scroll low + logerror("%s: tilemap_scroll_window_w (tilemap %d) reg: %02x (unknown) (data %02x) (real address %04x)\n", machine().describe_context(), which, reg, data, real_base + reg); + break; + + case 0x10: + logerror("%s: tilemap_scroll_window_w (tilemap %d) reg: %02x (window Y scroll low) (data %02x) (real address %04x)\n", machine().describe_context(), which, reg, data, real_base + reg); + break; + + case 0x11: + logerror("%s: tilemap_scroll_window_w (tilemap %d) reg: %02x (window Y scroll high) (data %02x) (real address %04x)\n", machine().describe_context(), which, reg, data, real_base + reg); + break; + } +} + +WRITE8_MEMBER(trkfldch_state::tmap0_scroll_window_w) +{ + tilemap_scroll_window_w(0, offset, data, 0x7820); +} + +WRITE8_MEMBER(trkfldch_state::tmap1_scroll_window_w) +{ + tilemap_scroll_window_w(1, offset, data, 0x7832); +} + + + + +READ8_MEMBER(trkfldch_state::dmaregs_r) +{ + uint8_t ret = m_dmaregs[offset]; + logerror("%s: dmaregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret); + return ret; +} + +WRITE8_MEMBER(trkfldch_state::dmaregs_w) +{ + m_dmaregs[offset] = data; + + switch (offset) + { + + case 0x00: // sprite list location (dma source?) + logerror("%s: dmaregs_w %04x %02x (dma source low )\n", machine().describe_context(), offset, data); + break; + + case 0x01: // sprite list location (dma source?) + logerror("%s: dmaregs_w %04x %02x (dma source med )\n", machine().describe_context(), offset, data); + break; + + case 0x02: + logerror("%s: dmaregs_w %04x %02x (dma source high)\n", machine().describe_context(), offset, data); + break; + + case 0x03: + logerror("%s: dmaregs_w %04x %02x (dma dest low )\n", machine().describe_context(), offset, data); + break; + + case 0x04: + logerror("%s: dmaregs_w %04x %02x (dma dest high)\n", machine().describe_context(), offset, data); + break; + + case 0x05: + logerror("%s: dmaregs_w %04x %02x (dma length low ) (and trigger)\n", machine().describe_context(), offset, data); + { + address_space& mem = m_maincpu->space(AS_PROGRAM); + uint16_t dmalength = (m_dmaregs[0x06] << 8) | m_dmaregs[0x05]; + uint32_t dmasource = (m_dmaregs[0x02] << 16) | (m_dmaregs[0x01] << 8) | m_dmaregs[0x00]; + uint16_t dmadest = (m_dmaregs[0x04] << 8) | m_dmaregs[0x03]; + + //if (dmadest != 0x6800) + logerror("%s: performing dma src: %06x dst %04x len %04x and extra params %02x %02x %02x %02x %02x %02x\n", machine().describe_context(), dmasource, dmadest, dmalength, m_dmaregs[0x07], m_dmaregs[0x08], m_dmaregs[0x09], m_dmaregs[0x0b], m_dmaregs[0x0c], m_dmaregs[0x0d]); + + int writeoffset = 0; + int writedo = m_dmaregs[0x0d]; + + int readoffset = 0; + int readdo = m_dmaregs[0x09]; + + if ((m_dmaregs[0x08] != 0x00) || (m_dmaregs[0x0c] != 0x00)) + { + fatalerror("unhandled dma params\n"); + } + + for (uint32_t j = 0; j < dmalength; j++) + { + uint8_t byte = mem.read_byte(dmasource + readoffset); + readdo--; + if (readdo < 0) + { + readdo = m_dmaregs[0x09]; + readoffset += m_dmaregs[0x07]; + } + else + { + readoffset++; + } + + mem.write_byte(dmadest + writeoffset, byte); + writedo--; + if (writedo < 0) + { + writedo = m_dmaregs[0x0d]; + writeoffset += m_dmaregs[0xb]; + } + else + { + writeoffset++; + } + + } + } + break; + + case 0x06: + logerror("%s: dmaregs_w %04x %02x (dma length high)\n", machine().describe_context(), offset, data); + break; + + case 0x07: // after a long time + logerror("%s: dmaregs_w %04x %02x (dma source read skip size)\n", machine().describe_context(), offset, data); + break; + + case 0x08: // rarely (my1stddr) + logerror("%s: dmaregs_w %04x %02x (dma source unknown)\n", machine().describe_context(), offset, data); + break; + + case 0x09: // after a long time + logerror("%s: dmaregs_w %04x %02x (dma source read group size)\n", machine().describe_context(), offset, data); + break; + + case 0x0a: // unused? + logerror("%s: dmaregs_w %04x %02x (dma unused)\n", machine().describe_context(), offset, data); + break; + + case 0x0b: // after a long time + logerror("%s: dmaregs_w %04x %02x (dma dest write skip size)\n", machine().describe_context(), offset, data); + break; + + case 0x0c: // rarely (my1stddr) + logerror("%s: dmaregs_w %04x %02x (dma dest unknown)\n", machine().describe_context(), offset, data); + break; + + case 0x0d: // after a long time + logerror("%s: dmaregs_w %04x %02x (dma dest write group size)\n", machine().describe_context(), offset, data); + break; + + } +} + + +READ8_MEMBER(trkfldch_state::modebankregs_r) +{ + uint8_t ret = m_modebank[offset]; + logerror("%s: modebankregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret); + return ret; +} + +WRITE8_MEMBER(trkfldch_state::modebankregs_w) +{ + m_modebank[offset] = data; + + switch (offset) + { + case 0x00: // gfxmode select (4bpp / 8bpp) and layer enables + logerror("%s: unkregs_w (enable, bpp select) %04x %02x\n", machine().describe_context(), offset, data); + break; + + case 0x01: // tilegfxbank 1 + logerror("%s: unkregs_w %04x %02x (tilegfxbank 1)\n", machine().describe_context(), offset, data); + break; + case 0x02: // 00 - startup (probably more tilegfxbank 1 bits) + logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); + break; + + case 0x03: // tilegfxbank 2 + logerror("%s: unkregs_w %04x %02x (tilegfxbank 2)\n", machine().describe_context(), offset, data); + break; + + case 0x04: // 00 - startup (probably more tilegfxbank 2 bits) + logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); + break; + + case 0x05: // spritegfxbank + logerror("%s: unkregs_w %04x %02x (spritegfxbank)\n", machine().describe_context(), offset, data); + break; + + case 0x06: // 00 (probably more spritegfxbank bits) + logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); + break; + + case 0x07: // gfxbank for weird layer + logerror("%s: unkregs_w %04x %02x (weird gfx bank)\n", machine().describe_context(), offset, data); + break; + + case 0x08: // more gfxbank for weird layer? + logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); + break; + + case 0x09: // unknowns? another unknown layer? + logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); + break; + + case 0x0a: // unknowns? another unknown layer? + logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); + break; + } +} + + +READ8_MEMBER(trkfldch_state::tilemapbase_r) +{ + uint8_t ret = m_tilemapbase[offset]; + logerror("%s: tilemapbase_r %04x (returning %02x)\n", machine().describe_context(), offset, ret); + return ret; +} + +WRITE8_MEMBER(trkfldch_state::tilemapbase_w) +{ + m_tilemapbase[offset] = data; + logerror("%s: tilemapbase_w %04x %02x (tilebase %d)\n", machine().describe_context(), offset, data, offset); +} void trkfldch_state::trkfldch_map(address_map &map) @@ -357,7 +713,20 @@ void trkfldch_state::trkfldch_map(address_map &map) map(0x007000, 0x0072ff).ram().share("palram"); // 7800 - 78xx look like registers? - map(0x007800, 0x0078ff).rw(FUNC(trkfldch_state::unkregs_r), FUNC(trkfldch_state::unkregs_w)); + + map(0x007800, 0x00780f).rw(FUNC(trkfldch_state::sysregs_r), FUNC(trkfldch_state::sysregs_w)); + + + map(0x007810, 0x00781a).rw(FUNC(trkfldch_state::modebankregs_r), FUNC(trkfldch_state::modebankregs_w)); + + map(0x007820, 0x007831).rw(FUNC(trkfldch_state::tmap0_scroll_window_r), FUNC(trkfldch_state::tmap0_scroll_window_w)); + map(0x007832, 0x007843).rw(FUNC(trkfldch_state::tmap1_scroll_window_r), FUNC(trkfldch_state::tmap1_scroll_window_w)); + + map(0x007854, 0x007856).rw(FUNC(trkfldch_state::tilemapbase_r), FUNC(trkfldch_state::tilemapbase_w)); + + map(0x007860, 0x00786d).rw(FUNC(trkfldch_state::dmaregs_r), FUNC(trkfldch_state::dmaregs_w)); + + map(0x007870, 0x0078ff).rw(FUNC(trkfldch_state::unkregs_r), FUNC(trkfldch_state::unkregs_w)); map(0x008000, 0x3fffff).rom().region("maincpu", 0x000000); // good for code mapped at 008000 and 050000 at least } @@ -382,9 +751,9 @@ READ8_MEMBER(trkfldch_state::read_vector) 0e : 0xA2ED (dummy) 10 : 0xA2D3 (dummy) 12 : 0xA327 (dummy) - 14 : 0xA30D (real function) + 14 : 0xA30D (real function) (dummy in trkfld?) (controls arrow speed in ddr?) 16 : 0x6000 (points at ram? or some internal ROM? we have nothing mapped here, not cleared as RAM either) - 18 : 0xA31A (dummy) + 18 : 0xA31A (dummy) (not dummy in trkfld? - timer interrupt?) 1a : 0xA2AC (dummy) 1c : 0xA341 (boot vector) 1e : (invalid) @@ -432,6 +801,20 @@ TIMER_DEVICE_CALLBACK_MEMBER(trkfldch_state::scanline) m_maincpu->set_input_line(G65816_LINE_NMI, CLEAR_LINE); } + // this is clearly a timer interrupt, trkfldch needs it to count + if ((scanline >= 80) && (scanline < 120)) + { + if ((scanline & 1) == 0) + { + m_which_vector = 0x18; + m_maincpu->set_input_line(G65816_LINE_NMI, ASSERT_LINE); + } + else + { + m_which_vector = 0x18; + m_maincpu->set_input_line(G65816_LINE_NMI, CLEAR_LINE); + } + } } static INPUT_PORTS_START( trkfldch ) @@ -616,140 +999,144 @@ GFXDECODE_END : 0x40 - ? (there is no irq 0x1c - it's the boot vector) : 0x80 - ? (there is no irq 0x1e) - -42/43 = y scroll on one layer? - -26/27 = x xcroll (top racer on track field) -28/29 = x scroll (bottom racer on track field) - -2a/2b = ?? throwing event (paired with below) -3a/3b = ?? throwing event (paired with below) - -54 = 18 (layer base?) (tiles are at 1800 trkfldch) -55 = 22 (layer base?) (tiles are at 2200 trkfldch) -56 = 2c (layer base?) (tiles are at 2c00 trkfldch) - - */ -READ8_MEMBER(trkfldch_state::unkregs_r) +READ8_MEMBER(trkfldch_state::sysregs_r) { - uint8_t ret = m_unkregs[offset]; + uint8_t ret = m_sysregs[offset]; switch (offset) { case 0x00: // IRQ status?, see above ret = machine().rand(); - logerror("%s: unkregs_r (IRQ state?) %04x (returning %02x)\n", machine().describe_context(), offset, ret); + logerror("%s: sysregs_r (IRQ state?) %04x (returning %02x)\n", machine().describe_context(), offset, ret); break; case 0x01: // IRQ status?, see above ret = machine().rand(); - logerror("%s: unkregs_r (IRQ state?) %04x (returning %02x)\n", machine().describe_context(), offset, ret); + logerror("%s: sysregs_r (IRQ state?) %04x (returning %02x)\n", machine().describe_context(), offset, ret); break; - case 0x02: // ends up being read as a side effect of reading a 16-bit word at 0x1, but also directly too? - logerror("%s: unkregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret); + case 0x02: // code to write 0x7f here during startup, also code to read port, mask with 0x7f and rewrite (clear top bit, probably gets set by hw?) + logerror("%s: sysregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret); break; - case 0x03: // ends up being read as a side effect of reading a 16-bit word at 0x2, any other purpose? - logerror("%s: unkregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret); + case 0x03: // there is code to read, set bit 0x04 and write back out as well as code to clear to 0x00 (no other uses?) + logerror("%s: sysregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret); break; - case 0x04: - ret = 0xff; - logerror("%s: unkregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret); + case 0x04: // bit 0x80 is checked and looped on after writes to 78b6 (the 'large amount of data upload' port) + ret = 0x80; + logerror("%s: sysregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret); break; - case 0x05: // only read as a side effect of reading port 0x4 in 16-bit mode? - ret = 0xff; - logerror("%s: unkregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret); + case 0x05: // bit 0x20 is checked and looped on right after DMA trigger (assuming DMA trigger is correct) + ret = 0x20; + logerror("%s: sysregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret); break; - case 0x06: - logerror("%s: unkregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret); + case 0x06: // no real reads, only side-effect of reading 7805 + logerror("%s: sysregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret); break; + } + return ret; +} - case 0x42: - logerror("%s: unkregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret); - break; - case 0x43: - logerror("%s: unkregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret); +WRITE8_MEMBER(trkfldch_state::sysregs_w) +{ + m_sysregs[offset] = data; + + switch (offset) + { + case 0x00: // IRQ ack/force?, see above + logerror("%s: sysregs_w (IRQ ack/force?) %04x %02x\n", machine().describe_context(), offset, data); break; - case 0x44: - logerror("%s: unkregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret); + case 0x01: // IRQ maybe status, see above + logerror("%s: sysregs_w (IRQ ack/force?) %04x %02x\n", machine().describe_context(), offset, data); break; + case 0x02: // startup + logerror("%s: sysregs_w %04x %02x\n", machine().describe_context(), offset, data); + break; + case 0x03: // startup + logerror("%s: sysregs_w %04x %02x\n", machine().describe_context(), offset, data); + break; - case 0x54: // tilebase 1 - logerror("%s: unkregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret); + case 0x04: // startup + logerror("%s: sysregs_w %04x %02x\n", machine().describe_context(), offset, data); break; - case 0x55: // tilebase 2 - logerror("%s: unkregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret); + case 0x05: // startup + logerror("%s: sysregs_w %04x %02x\n", machine().describe_context(), offset, data); break; - case 0x56: // tilebase 3 - logerror("%s: unkregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret); + default: + logerror("%s: sysregs_w %04x %02x\n", machine().describe_context(), offset, data); break; + } +} + +READ8_MEMBER(trkfldch_state::unkregs_r) +{ + uint8_t ret = m_unkregs[offset]; - case 0x70: // read in irq (inputs?) + switch (offset) + { + + case 0x00: // read in irq (inputs?) ret = ioport("IN0")->read(); logerror("%s: unkregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret); break; - case 0x71: + case 0x01: ret = ioport("IN1")->read(); logerror("%s: unkregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret); break; - case 0x73: + case 0x03: logerror("%s: unkregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret); break; - case 0x74: + case 0x04: logerror("%s: unkregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret); break; - case 0x75: + case 0x05: logerror("%s: unkregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret); break; - case 0x76: + case 0x06: logerror("%s: unkregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret); break; - case 0x77: + case 0x07: logerror("%s: unkregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret); break; - case 0x7f: + case 0x0f: logerror("%s: unkregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret); break; - case 0x80: // only read as a side-effect of reading 0x7f? + case 0x10: // only read as a side-effect of reading 0x7f? logerror("%s: unkregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret); break; - - - case 0xb6: + case 0x46: // 0x70 logerror("%s: unkregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret); break; - case 0xb7: + case 0x47: logerror("%s: unkregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret); break; - default: logerror("%s: unkregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret); break; @@ -757,381 +1144,84 @@ READ8_MEMBER(trkfldch_state::unkregs_r) return ret; } + + WRITE8_MEMBER(trkfldch_state::unkregs_w) { m_unkregs[offset] = data; switch (offset) { - case 0x00: // IRQ ack/force?, see above - logerror("%s: unkregs_w (IRQ ack/force?) %04x %02x\n", machine().describe_context(), offset, data); - break; - - case 0x01: // IRQ maybe status, see above - logerror("%s: unkregs_w (IRQ ack/force?) %04x %02x\n", machine().describe_context(), offset, data); - break; - - case 0x02: // startup - logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); - break; - - case 0x03: // startup - logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); - break; - - case 0x04: // startup - logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); - break; - - case 0x05: // startup - logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); - break; - - - - - - case 0x10: // gfxmode select (4bpp / 8bpp) and layer enables - logerror("%s: unkregs_w (enable, bpp select) %04x %02x\n", machine().describe_context(), offset, data); - break; - - case 0x11: // tilegfxbank 1 - logerror("%s: unkregs_w %04x %02x (tilegfxbank 1)\n", machine().describe_context(), offset, data); - break; - - case 0x12: // 00 - startup (probably more tilegfxbank 1 bits) - logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); - break; - - case 0x13: // tilegfxbank 2 - logerror("%s: unkregs_w %04x %02x (tilegfxbank 2)\n", machine().describe_context(), offset, data); - break; - - case 0x14: // 00 - startup (probably more tilegfxbank 2 bits) - logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); - break; - - case 0x15: // spritegfxbank - logerror("%s: unkregs_w %04x %02x (spritegfxbank)\n", machine().describe_context(), offset, data); - break; - - case 0x16: // 00 (probably more spritegfxbank bits) - logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); - break; - - case 0x17: // gfxbank for weird layer - logerror("%s: unkregs_w %04x %02x (weird gfx bank)\n", machine().describe_context(), offset, data); - break; - - case 0x18: // more gfxbank for weird layer? - logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); - break; - - // unknowns? another unknown layer? - case 0x19: - logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); - break; - - case 0x1a: - logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); - break; - - - - - case 0x20: // rarely - logerror("%s: unkregs_w %04x %02x (window 0 top?)\n", machine().describe_context(), offset, data); // trkfldch possible scroll window 0 top (0f) - break; - - case 0x21: // rarely - logerror("%s: unkregs_w %04x %02x (window 0 bottom?)\n", machine().describe_context(), offset, data); // trkfldch possible scroll window 0 bottom (1f) - break; - - case 0x22: // rarely - logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); // 1f - break; - - case 0x23: // after a long time - logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); // 1e - break; - - case 0x24: // rarely - logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); // 00 - break; - - case 0x25: // rarely - logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); // 00 - break; - - case 0x26: - logerror("%s: unkregs_w %04x %02x (x scroll 2 low) upper\n", machine().describe_context(), offset, data); // trkfldch running (split screen) - break; - - case 0x27: - logerror("%s: unkregs_w %04x %02x (x scroll 2 high) upper\n", machine().describe_context(), offset, data); // trkfldch running (split screen) - break; - - case 0x28: - logerror("%s: unkregs_w %04x %02x (x scroll 2 low) lower\n", machine().describe_context(), offset, data); // trkfldch running (split screen) - break; - - case 0x29: - logerror("%s: unkregs_w %04x %02x (x scroll 2 high) lower\n", machine().describe_context(), offset, data); // trkfldch running (split screen) - break; - - case 0x2a: - logerror("%s: unkregs_w %04x %02x (x scroll 1 low)\n", machine().describe_context(), offset, data); // trkfldch jav - break; - - case 0x2b: - logerror("%s: unkregs_w %04x %02x (x scroll 1 high)\n", machine().describe_context(), offset, data); // trkfldch jav - break; - - - - - case 0x30: - logerror("%s: unkregs_w %04x %02x (y scroll 1 low)\n", machine().describe_context(), offset, data); // trkfldch jav, hammer - break; - - case 0x31: - logerror("%s: unkregs_w %04x %02x (y scroll 1 high)\n", machine().describe_context(), offset, data); // trkfldch jav, hammer - break; - - case 0x32: // rarely - logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); // 19 / 00 - break; - - case 0x33: // rarely - logerror("%s: unkregs_w %04x %02x (window 1 top?)\n", machine().describe_context(), offset, data); // 1e / 04 possible scroll window 1 top - break; - - case 0x34: // rarely - logerror("%s: unkregs_w %04x %02x (window 1 bottom?)\n", machine().describe_context(), offset, data); // 1e / 19 possible scroll window 1 bottom - break; - - - // gap - - - case 0x36: // rarely - logerror("%s: unkregs_w %04x %02x (window 1 left)\n", machine().describe_context(), offset, data); // 25 possible scroll window 1 left - break; - - case 0x37: // rarely - logerror("%s: unkregs_w %04x %02x (window 1 right)\n", machine().describe_context(), offset, data); // 29 possible scroll window 1 right - break; - - case 0x3a: - logerror("%s: unkregs_w %04x %02x (x scroll 2 low)\n", machine().describe_context(), offset, data); // trkfldch jav - break; - - case 0x3b: - logerror("%s: unkregs_w %04x %02x (x scroll 2 high)\n", machine().describe_context(), offset, data); // trkfldch jav - break; - - - - - case 0x42: - logerror("%s: unkregs_w %04x %02x (y scroll 2 low)\n", machine().describe_context(), offset, data); // my1stddr text scroller on right - break; - - case 0x43: - logerror("%s: unkregs_w %04x %02x (y scroll 2 high)\n", machine().describe_context(), offset, data); // my1stddr text scroller on right - break; - - - - - case 0x54: // tilebase 1 - logerror("%s: unkregs_w %04x %02x (tilebase 1)\n", machine().describe_context(), offset, data); - break; - - case 0x55: // tilebase 2 - logerror("%s: unkregs_w %04x %02x (tilebase 2)\n", machine().describe_context(), offset, data); - break; - - case 0x56: // tilebase 3 - logerror("%s: unkregs_w %04x %02x (weird layer base)\n", machine().describe_context(), offset, data); - break; - - - - case 0x60: // sprite list location (dma source?) - logerror("%s: unkregs_w %04x %02x (dma source low )\n", machine().describe_context(), offset, data); - break; - - case 0x61: // sprite list location (dma source?) - logerror("%s: unkregs_w %04x %02x (dma source med )\n", machine().describe_context(), offset, data); - break; - - case 0x62: - logerror("%s: unkregs_w %04x %02x (dma source high)\n", machine().describe_context(), offset, data); - break; - - case 0x63: - logerror("%s: unkregs_w %04x %02x (dma dest low )\n", machine().describe_context(), offset, data); - break; - - case 0x64: - logerror("%s: unkregs_w %04x %02x (dma dest high)\n", machine().describe_context(), offset, data); - break; - - case 0x65: - logerror("%s: unkregs_w %04x %02x (dma length low ) (and trigger)\n", machine().describe_context(), offset, data); - { - address_space &mem = m_maincpu->space(AS_PROGRAM); - uint16_t dmalength = (m_unkregs[0x66] << 8) | m_unkregs[0x65]; - uint32_t dmasource = (m_unkregs[0x62] << 16) | (m_unkregs[0x61] << 8) | m_unkregs[0x60]; - uint16_t dmadest = (m_unkregs[0x64] << 8) | m_unkregs[0x63]; - - //if (dmadest != 0x6800) - logerror("%s: performing dma src: %06x dst %04x len %04x and extra params %02x %02x %02x %02x %02x %02x\n", machine().describe_context(), dmasource, dmadest, dmalength, m_unkregs[0x67], m_unkregs[0x68], m_unkregs[0x69], m_unkregs[0x6b], m_unkregs[0x6c], m_unkregs[0x6d]); - - int writeoffset = 0; - int writedo = m_unkregs[0x6d]; - - int readoffset = 0; - int readdo = m_unkregs[0x69]; - - if ((m_unkregs[0x68] != 0x00) || (m_unkregs[0x6c] != 0x00)) - { - fatalerror("unhandled dma params\n"); - } - - for (uint32_t j = 0; j < dmalength; j++) - { - uint8_t byte = mem.read_byte(dmasource+readoffset); - readdo--; - if (readdo < 0) - { - readdo = m_unkregs[0x69]; - readoffset += m_unkregs[0x67]; - } - else - { - readoffset++; - } - - mem.write_byte(dmadest+writeoffset, byte); - writedo--; - if (writedo < 0) - { - writedo = m_unkregs[0x6d]; - writeoffset += m_unkregs[0x6b]; - } - else - { - writeoffset++; - } - - } - } - break; - - case 0x66: - logerror("%s: unkregs_w %04x %02x (dma length high)\n", machine().describe_context(), offset, data); - break; - - case 0x67: // after a long time - logerror("%s: unkregs_w %04x %02x (dma source read skip size)\n", machine().describe_context(), offset, data); - break; - - case 0x68: // rarely (my1stddr) - logerror("%s: unkregs_w %04x %02x (dma source unknown)\n", machine().describe_context(), offset, data); - break; - - case 0x69: // after a long time - logerror("%s: unkregs_w %04x %02x (dma source read group size)\n", machine().describe_context(), offset, data); - break; - - case 0x6b: // after a long time - logerror("%s: unkregs_w %04x %02x (dma dest write skip size)\n", machine().describe_context(), offset, data); - break; - - case 0x6c: // rarely (my1stddr) - logerror("%s: unkregs_w %04x %02x (dma dest unknown)\n", machine().describe_context(), offset, data); - break; - - case 0x6d: // after a long time - logerror("%s: unkregs_w %04x %02x (dma dest write group size)\n", machine().describe_context(), offset, data); - break; - - - // 7x = I/O area? - - case 0x71: // startup + case 0x01: // startup logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); break; - case 0x72: // startup + case 0x02: // startup logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); break; - case 0x73: // some kind of serial device? + case 0x03: // some kind of serial device? logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); break; - case 0x74: // startup + case 0x04: // startup logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); break; - case 0x75: // some kind of serial device? (used with 73?) + case 0x05: // some kind of serial device? (used with 73?) logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); break; - case 0x76: // startup + case 0x06: // startup logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); break; - case 0x77: // every second or so + case 0x07: // every second or so logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); break; - case 0x78: // startup + case 0x08: // startup logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); break; - case 0x79: // startup + case 0x09: // startup logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); break; - case 0x7a: // startup + case 0x0a: // startup logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); break; - case 0x7f: // startup + case 0x0f: // startup logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); break; - case 0x81: // startup (my1stddr) + case 0x11: // startup (my1stddr) logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); break; - case 0x82: // startup (my1stddr) + case 0x12: // startup (my1stddr) logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); break; - case 0x83: + case 0x13: logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); break; - case 0x84: + case 0x14: logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); break; - case 0xb5: // startup + case 0x45: // (real address 78b5) startup logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); break; - case 0xb6: // significant data transfer shortly after boot, seems to clock writes with 0073 writing d0 / c0? (then writes 2 bytes here) + case 0x46: // significant data transfer shortly after boot, seems to clock writes with 0073 writing d0 / c0? (then writes 2 bytes here) // is this sending song patterns to another CPU? - logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); m_unkdata[m_unkdata_addr] = data; @@ -1139,13 +1229,10 @@ WRITE8_MEMBER(trkfldch_state::unkregs_w) m_unkdata_addr &= 0xfffff; break; - - - case 0xca: // startup + case 0x5a: // (real address 78ca) startup logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); break; - default: logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data); break; @@ -1169,33 +1256,51 @@ void trkfldch_state::machine_reset() { m_which_vector = 0x06; - for (int i = 0; i < 0x100; i++) - m_unkregs[i] = 0x00; + for (int i = 0; i < 0x90; i++) + m_unkregs[i] = 0x90; for (int i = 0; i < 0x100000; i++) m_unkdata[i] = 0; + for (int j = 0; j < 2; j++) + for (int i = 0; i < 0x12; i++) + m_tmapscroll_window[j][i] = 0x00; + + // these don't always get initialized by the code, these appear to be reasonable default values based on what they get reset to by the games after first use + for (int j = 0; j < 2; j++) + { + m_tmapscroll_window[j][0x00] = 0x00; + m_tmapscroll_window[j][0x01] = 0x00; + m_tmapscroll_window[j][0x02] = 0x1e; + m_tmapscroll_window[j][0x03] = 0x1e; + m_tmapscroll_window[j][0x04] = 0x00; + m_tmapscroll_window[j][0x05] = 0x28; + } + + for (int i = 0; i < 0xe; i++) + m_dmaregs[i] = 0x00; + + for (int i = 0; i < 0xb; i++) + m_modebank[i] = 0x00; + + for (int i = 0; i < 0x10; i++) + m_sysregs[i] = 0x00; + + m_tilemapbase[0x00] = 0x00; + m_tilemapbase[0x01] = 0x00; + m_tilemapbase[0x02] = 0x00; + + m_unkdata_addr = 0; // the game code doesn't set the DMA step / skip params to default values until after it's used them with other values, so assume they reset to these - m_unkregs[0x67] = 0x01; - m_unkregs[0x68] = 0x00; - m_unkregs[0x69] = 0x00; - - m_unkregs[0x6b] = 0x01; - m_unkregs[0x6c] = 0x00; - m_unkregs[0x6d] = 0x00; - - // maybe, these get reset to this value after actual use in trkfield - m_unkregs[0x36] = 0x00; - m_unkregs[0x37] = 0x28; - - // trkfld sets these to 1e/1e on javelin, but leaves then uninitizlied before that - // it also sets them to 00 / 1e on 'hurdle the hole' (window use) - // it also sets them to 00 / 1e on 'hammer throw' (reason unclear) - // high jump sets it to 00 / 16 on height select screen - m_unkregs[0x33] = 0xde; - m_unkregs[0x34] = 0xad; + m_dmaregs[0x07] = 0x01; + m_dmaregs[0x08] = 0x00; + m_dmaregs[0x09] = 0x00; + + m_dmaregs[0x0b] = 0x01; + m_dmaregs[0x0c] = 0x00; + m_dmaregs[0x0d] = 0x00; } void trkfldch_state::trkfldch(machine_config &config) |