summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/trkfldch.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/trkfldch.cpp')
-rw-r--r--src/mame/drivers/trkfldch.cpp1343
1 files changed, 0 insertions, 1343 deletions
diff --git a/src/mame/drivers/trkfldch.cpp b/src/mame/drivers/trkfldch.cpp
deleted file mode 100644
index 12c88d3a3b0..00000000000
--- a/src/mame/drivers/trkfldch.cpp
+++ /dev/null
@@ -1,1343 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:David Haywood
-/*
-
-Track & Field Challenge TV Game
-https://www.youtube.com/watch?v=wjn1lLylqog
-
-Uses epoxy blobs for CPU etc.
-These have been identified as Winbond 2005 BA5962 (large glob) + Winbond 200506 BA5934 (smaller glob)
-seems to be G65816 derived with custom vectors?
-
-PCB Game
-TV0001 R1.1 My First DDR
-TV0002 R1.0 Track & Field
-
-DDR & TF PCBs look identical, all the parts are in the same place, the traces are the same, and the silkscreened part # for resistors and caps are the same.
-
-Some of m_unkregs must retain value (or return certain things) or RAM containing vectors gets blanked and game crashes.
-The G65816 code on these is VERY ugly and difficult to follow, many redundant statements, excessive mode switching, accessing things via pointers to pointers etc.
-
-One of the vectors points to 0x6000, there is nothing mapped there, could it be a small internal ROM or some debug trap for development?
-
-*/
-
-#include "emu.h"
-
-#include "cpu/g65816/g65816.h"
-
-#include "emupal.h"
-#include "screen.h"
-#include "speaker.h"
-#include "machine/timer.h"
-
-
-class trkfldch_state : public driver_device
-{
-public:
- trkfldch_state(const machine_config &mconfig, device_type type, const char *tag) :
- driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_screen(*this, "screen"),
- m_gfxdecode(*this, "gfxdecode"),
- m_mainram(*this, "mainram"),
- m_spriteram(*this, "spriteram"),
- m_palram(*this, "palram"),
- m_palette(*this, "palette")
- { }
-
- void trkfldch(machine_config &config);
- void vectors_map(address_map &map);
-
-protected:
- virtual void machine_start() override;
- virtual void machine_reset() override;
- virtual void video_start() override;
-
-private:
-
- required_device<cpu_device> m_maincpu;
- required_device<screen_device> m_screen;
- required_device<gfxdecode_device> m_gfxdecode;
- required_shared_ptr<uint8_t> m_mainram;
- required_shared_ptr<uint8_t> m_spriteram;
- required_shared_ptr<uint8_t> m_palram;
- required_device<palette_device> m_palette;
-
- void draw_sprites(screen_device& screen, bitmap_ind16& bitmap, const rectangle& cliprect, int pri);
- void render_text_tile_layer(screen_device& screen, bitmap_ind16& bitmap, const rectangle& cliprect, uint16_t base);
- void render_tile_layer(screen_device& screen, bitmap_ind16& bitmap, const rectangle& cliprect, int which);
- uint32_t screen_update_trkfldch(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- void trkfldch_map(address_map &map);
-
- DECLARE_READ8_MEMBER(read_vector);
-
- TIMER_DEVICE_CALLBACK_MEMBER(scanline);
-
- 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_tmapscroll_window[2][0x12];
-
- uint8_t m_unkdata[0x100000];
- int m_unkdata_addr;
-
-};
-
-void trkfldch_state::video_start()
-{
-}
-
-void trkfldch_state::render_tile_layer(screen_device& screen, bitmap_ind16& bitmap, const rectangle& cliprect, int which)
-{
-// tilemap 0 = trkfld events, my1stddr background
-
-// tilemap 1= my1stddr HUD layer
-
-
-// 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);
-
-
- int base, gfxbase, gfxregion;
- int tilexsize = 8;
-
- if (which == 0)
- {
- base = (m_tilemapbase[0x00] << 8);
- gfxbase = (m_modebank[0x01] * 0x2000);
- }
- else //if (which == 1)
- {
- base = (m_tilemapbase[0x01] << 8);
- gfxbase = (m_modebank[0x03] * 0x2000);
- }
-
- if (m_modebank[0x00] & 1) // seems like it might be a global control for bpp?
- {
- gfxbase -= 0x200;
- gfxregion = 0;
- }
- else
- {
- gfxbase -= 0x2ac;
- gfxregion = 2;
- }
-
-
-
- for (int y = 0; y < 30; y++)
- {
- for (int x = 0; x < 41; x++)
- {
- // fppt tttt tttt tttt
-
- rectangle clip;
- clip.set(x*8, (x*8)+7, y*8, (y*8)+7);
-
- clip &= cliprect;
-
-
- address_space &mem = m_maincpu->space(AS_PROGRAM);
-
- int tile_address = (y * 41) + x;
-
- uint8_t byte = mem.read_byte(base+((tile_address * 2)));
- uint8_t attr = mem.read_byte(base+((tile_address * 2)+1));
-
- int tile = (attr << 8) | byte;
-
- int flipx = (tile & 0x8000) >> 15;
- int pal = (tile & 0x6000) >> 13;
-
- tile &= 0x1fff;
-
- tile += gfxbase;
-
- gfx_element* gfx = m_gfxdecode->gfx(gfxregion);
-
- gfx->transpen(bitmap, clip,tile, pal, flipx, 0, x*tilexsize, y*8, 0);
-
- }
- }
-}
-
-void trkfldch_state::render_text_tile_layer(screen_device& screen, bitmap_ind16& bitmap, const rectangle& cliprect, uint16_t base)
-{
- // this isn't correct, it doesn't seem like a 'real' tilemap, maybe some kind of sprite / tile hybrid, or something with end of line markers?
- // it is needed for the 'good' 'perfect' 'miss' text on DDR ingame
- 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_modebank[0x07] * 0x80) - 0x100;
-
- int offs = 0;
- for (int y = 0; y < 4; y++)
- {
- for (int x = 0; x < 32; x++)
- {
- address_space& mem = m_maincpu->space(AS_PROGRAM);
-
- uint8_t byte = mem.read_byte(base + offs);
- offs++;
-
- int tile = tilegfxbase | byte;
-
- gfx_element* gfx = m_gfxdecode->gfx(4);
-
- gfx->transpen(bitmap, cliprect, tile, 0, 0, 0, x * 8, y * 16, 0);
-
- }
- }
- }
-}
-
-
-
-// regs 11 13 15 17
-//
-// DDR Title = 5000 03 03 05 00
-// DDR Ingame Girl 1 = 7000 04 05 06 80
-// DDR Music Select = 9000 05 03 04 00
-// trkfldch logos = b000 06 07 06 00
-// trkfldch ingame uses different bpp so different addressing here too?
-
-
-void trkfldch_state::draw_sprites(screen_device& screen, bitmap_ind16& bitmap, const rectangle& cliprect, int pri)
-{
- for (int i = 0x500 - 5; i >= 0; i -= 5)
- {
- int priority = (m_spriteram[i + 4] & 0x20)>>5;
-
- // list is NOT drawn but instead z sorted, see shadows in trkfldch
- if (priority != pri)
- 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_modebank[0x05] * 0x800);
-
- // --pp tt-y yyyy yyyy tttt tttt yyyy yyyy --zf -t-x
-
- int y = m_spriteram[i + 1];
- int x = m_spriteram[i + 3];
- int tile = m_spriteram[i + 2];
-
- int tilehigh = m_spriteram[i + 4] & 0x04;
- int tilehigh2 = m_spriteram[i + 0] & 0x04;
- int tilehigh3 = m_spriteram[i + 0] & 0x08;
-
- int pal = 0;
-
- int flipx = m_spriteram[i + 4] & 0x10;
-
- if (tilehigh)
- tile += 0x100;
-
- if (tilehigh2)
- tile += 0x200;
-
- if (tilehigh3)
- tile += 0x400;
-
- int xhigh = m_spriteram[i + 4] & 0x01;
- int yhigh = m_spriteram[i + 0] & 0x01; // or enable bit?
-
- x = x | (xhigh << 8);
- y = y | (yhigh << 8);
-
- y -= 0x100;
- y -= 16;
- x -= 16;
-
- gfx_element* gfx;
-
- if (m_modebank[0x00] & 1) // seems like it might be a global control for bpp?
- {
- gfx = m_gfxdecode->gfx(1);
- tilegfxbase -= 0x80;
- }
- else
- {
- pal = (m_spriteram[i + 0] & 0x30)>>4;
- gfx = m_gfxdecode->gfx(3);
- tilegfxbase -= 0x40;
- tilegfxbase -= 0x6b;
-
- }
-
-
- gfx->transpen(bitmap, cliprect, tile + tilegfxbase, pal, flipx, 0, x, y, 0);
- }
-}
-
-uint32_t trkfldch_state::screen_update_trkfldch(screen_device& screen, bitmap_ind16& bitmap, const rectangle& cliprect)
-{
- bitmap.fill(0, cliprect);
-
- // 3 lots of 0x100 values, but maybe not rgb, seems to be yuv (borrowed from tetrisp2.cpp)
- for (int i = 0; i < 256; i++)
- {
- uint8_t u = m_palram[0x000 + i] & 0xff;
- uint8_t y1 = m_palram[0x100 + i] & 0xff;
- uint8_t v = m_palram[0x200 + i] & 0xff;
- double bf = y1+1.772*(u - 128);
- double gf = y1-0.334*(u - 128) - 0.714 * (v - 128);
- double rf = y1+1.772*(v - 128);
- // clamp to 0-255 range
- rf = std::min(rf,255.0);
- rf = std::max(rf,0.0);
- gf = std::min(gf,255.0);
- gf = std::max(gf,0.0);
- bf = std::min(bf,255.0);
- bf = std::max(bf,0.0);
-
- uint8_t r = (uint8_t)rf;
- uint8_t g = (uint8_t)gf;
- uint8_t b = (uint8_t)bf;
-
- m_palette->set_pen_color(i, r, g, b);
- }
-
- 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_modebank[0x00] & 0x10) // definitely looks like layer enable
- {
- render_tile_layer(screen, bitmap, cliprect, 1);
- }
-
- draw_sprites(screen, bitmap, cliprect, 1);
-
- if (m_modebank[0x00] & 0x20) // this layer is buggy and not currently drawn
- {
- 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)
-{
- map(0x000000, 0x003fff).ram().share("mainram");
-
- map(0x006800, 0x006cff).ram().share("spriteram");
-
- map(0x007000, 0x0072ff).ram().share("palram");
-
- // 7800 - 78xx look like registers?
-
- 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
-}
-
-void trkfldch_state::vectors_map(address_map &map)
-{
- map(0x00, 0x1f).r(FUNC(trkfldch_state::read_vector));
-}
-
-READ8_MEMBER(trkfldch_state::read_vector)
-{
- uint8_t *rom = memregion("maincpu")->base();
-
- /* what appears to be a table of vectors apepars at the START of ROM, maybe this gets copied to RAM, maybe used directly?
- 00 : (invalid)
- 02 : (invalid)
- 04 : 0xA2C6 (dummy)
- 06 : 0xA334 (real function - vbl?)
- 08 : 0xA300 (dummy)
- 0a : 0xA2E0 (dummy)
- 0c : 0xA2B9 (dummy)
- 0e : 0xA2ED (dummy)
- 10 : 0xA2D3 (dummy)
- 12 : 0xA327 (dummy)
- 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) (not dummy in trkfld? - timer interrupt?)
- 1a : 0xA2AC (dummy)
- 1c : 0xA341 (boot vector)
- 1e : (invalid)
- */
-
- logerror("reading vector offset %02x\n", offset);
-
- if (offset == 0x0b)
- { // NMI
- return rom[m_which_vector+1];
- }
- else if (offset == 0x0a)
- { // NMI
- return rom[m_which_vector];
- }
-
- // boot vector
- return rom[offset];
-}
-
-
-TIMER_DEVICE_CALLBACK_MEMBER(trkfldch_state::scanline)
-{
- int scanline = param;
-
- if (scanline == 200)
- {
- m_which_vector = 0x06;
- m_maincpu->set_input_line(G65816_LINE_NMI, ASSERT_LINE);
- }
- else if (scanline == 201)
- {
- m_which_vector = 0x06;
- m_maincpu->set_input_line(G65816_LINE_NMI, CLEAR_LINE);
- }
-
- if (scanline == 20)
- {
- m_which_vector = 0x14;
- m_maincpu->set_input_line(G65816_LINE_NMI, ASSERT_LINE);
- }
- else if (scanline == 21)
- {
- m_which_vector = 0x14;
- 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 )
- PORT_START("IN0")
- PORT_DIPNAME( 0x01, 0x01, "IN0" )
- PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_16WAY
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_16WAY
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 )
- PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
-
- PORT_START("IN1")
- PORT_DIPNAME( 0x01, 0x01, "IN1" )
- PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( my1stddr )
- PORT_START("IN0")
- PORT_DIPNAME( 0x01, 0x01, "IN0" )
- PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("O") // selects / forward
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_16WAY // directions correct based on 'letters' minigame
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_16WAY
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_16WAY
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_16WAY
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("X") // goes back
- PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
-
- PORT_START("IN1")
- PORT_DIPNAME( 0x01, 0x01, "IN1" )
- PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
-INPUT_PORTS_END
-
-
-static const gfx_layout tiles8x8x8_layout =
-{
- 8,8,
- RGN_FRAC(1,1),
- 8,
- { 48,49, 32,33, 16,17, 0, 1 },
- { 8,10,12, 14, 0,2,4,6 },
- { STEP8(0,64) },
- 512,
-};
-
-static const gfx_layout tiles8x16x8_layout =
-{
- 8,16,
- RGN_FRAC(1,1),
- 8,
- { 48,49, 32,33, 16,17, 0, 1 },
- { 8,10,12, 14, 0,2,4,6 },
- { STEP16(0,64) },
- 1024,
-};
-
-
-static const gfx_layout tiles16x16x8_layout =
-{
- 16,16,
- RGN_FRAC(1,1),
- 8,
- { 96, 97, 64, 65, 32, 33, 0, 1 },
- { 8,10,12,14, 0,2,4,6, 24,26,28,30, 16,18,20,22 },
- { STEP16(0,128) },
- 128*16,
-};
-
-
-// TODO: if we're going to use gfxdecode then allocate this manually with the correct number of tiles
-// might be we have to use manual drawing tho, the base offset is already strange
-static const gfx_layout tiles8x8x6_layout =
-{
- 8,8,
- 0x5500*4,
- 6,
- { 32, 33, 16, 17, 0, 1 },
- { 8,10,12,14, 0,2,4,6 },
- { STEP8(0,48) },
- 48*8,
-};
-
-
-static const gfx_layout tiles16x16x6_layout =
-{
- 16,16,
- 0x5500,
- 6,
- { 64, 65, 32, 33, 0, 1 },
- { 8,10,12,14, 0,2,4,6, 24,26,28,30, 16,18,20,22 },
- { STEP16(0,96) },
- 96*16,
-};
-
-
-static GFXDECODE_START( gfx_trkfldch )
- GFXDECODE_ENTRY( "maincpu", 0, tiles8x8x8_layout, 0, 1 )
- GFXDECODE_ENTRY( "maincpu", 0, tiles16x16x8_layout, 0, 1 )
- GFXDECODE_ENTRY( "maincpu", 0x40, tiles8x8x6_layout, 0, 4 )
- GFXDECODE_ENTRY( "maincpu", 0x40, tiles16x16x6_layout, 0, 4 )
- GFXDECODE_ENTRY( "maincpu", 0, tiles8x16x8_layout, 0, 1 )
-GFXDECODE_END
-
-/*
-
-7800 / 7801 seem to be IRQ related
-
-7800 : 0001 - ? (there is no irq 0x00)
- 0002 - ? (there is no irq 0x02)
- 0004 used in irq 0x04
- 0008 used in irq 0x06
- 0010 used in irq 0x08
- 0020 used in irq 0x0a
- 0x40 used in irq 0x0c
- 0x80 used in irq 0x0e (and by code accessing other ports in the main execution?!)
-
-7801 : 0001 used in irq 0x10
- : 0002 used in irq 0x12
- : 0004 used in irq 0x14
- : 0008 - ? (there is no irq 0x016, it points to unknown area? and we have no code touching this bit)
- : 0010 used in irq 0x18
- : 0020 used in irq 0x1a and 0x06?! (used with OR instead of EOR in 0x06, force IRQ?)
- : 0x40 - ? (there is no irq 0x1c - it's the boot vector)
- : 0x80 - ? (there is no irq 0x1e)
-
-*/
-
-READ8_MEMBER(trkfldch_state::sysregs_r)
-{
- uint8_t ret = m_sysregs[offset];
-
- switch (offset)
- {
- case 0x00: // IRQ status?, see above
- ret = machine().rand();
- 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: sysregs_r (IRQ state?) %04x (returning %02x)\n", machine().describe_context(), offset, ret);
- break;
-
- 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: // 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: // 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: // 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: // 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;
-}
-
-
-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 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 0x04: // startup
- logerror("%s: sysregs_w %04x %02x\n", machine().describe_context(), offset, data);
- break;
-
- case 0x05: // startup
- logerror("%s: sysregs_w %04x %02x\n", machine().describe_context(), offset, data);
- break;
-
- 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];
-
- 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 0x01:
- ret = ioport("IN1")->read();
- logerror("%s: unkregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret);
- break;
-
- case 0x03:
- logerror("%s: unkregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret);
- break;
-
- case 0x04:
- logerror("%s: unkregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret);
- break;
-
- case 0x05:
- logerror("%s: unkregs_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);
- break;
-
- case 0x07:
- logerror("%s: unkregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret);
- break;
-
- case 0x0f:
- logerror("%s: unkregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret);
- break;
-
- 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 0x46: // 0x70
- logerror("%s: unkregs_r %04x (returning %02x)\n", machine().describe_context(), offset, ret);
- break;
-
- 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;
- }
- return ret;
-}
-
-
-
-WRITE8_MEMBER(trkfldch_state::unkregs_w)
-{
- m_unkregs[offset] = data;
-
- switch (offset)
- {
- // 7x = I/O area?
-
- case 0x01: // startup
- logerror("%s: unkregs_w %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: // some kind of serial device?
- 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: // some kind of serial device? (used with 73?)
- logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
- break;
-
- case 0x06: // startup
- logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
- break;
-
- case 0x07: // every second or so
- logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
- break;
-
- case 0x08: // startup
- logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
- break;
-
- case 0x09: // startup
- logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
- break;
-
- case 0x0a: // startup
- logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
- break;
-
- case 0x0f: // startup
- logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
- break;
-
-
- case 0x11: // startup (my1stddr)
- logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
- break;
-
- case 0x12: // startup (my1stddr)
- logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
- break;
-
- case 0x13:
- logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
- break;
-
- case 0x14:
- logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
- break;
-
-
- case 0x45: // (real address 78b5) startup
- logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
- break;
-
- 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;
-
- m_unkdata_addr++;
- m_unkdata_addr &= 0xfffff;
- break;
-
- 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;
- }
-
-}
-
-void trkfldch_state::machine_start()
-{
- save_item(NAME(m_unkdata_addr));
- save_item(NAME(m_unkdata));
-
- for (int i = 0; i < 256; i++)
- {
- m_palette->set_pen_color(i, machine().rand(), machine().rand(), machine().rand());
- }
-
-}
-
-void trkfldch_state::machine_reset()
-{
- m_which_vector = 0x06;
-
- 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_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)
-{
- /* basic machine hardware */
- G65816(config, m_maincpu, 20000000);
- //m_maincpu->set_addrmap(AS_DATA, &trkfldch_state::mem_map);
- m_maincpu->set_addrmap(AS_PROGRAM, &trkfldch_state::trkfldch_map);
- m_maincpu->set_addrmap(g65816_device::AS_VECTORS, &trkfldch_state::vectors_map);
-
- TIMER(config, "scantimer").configure_scanline(FUNC(trkfldch_state::scanline), "screen", 0, 1);
-
- /* video hardware */
- SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
- m_screen->set_refresh_hz(60);
- m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
- m_screen->set_size(320, 240);
- m_screen->set_visarea(0, 320-1, 0, 240-1);
- m_screen->set_screen_update(FUNC(trkfldch_state::screen_update_trkfldch));
- m_screen->set_palette("palette");
-
- GFXDECODE(config, m_gfxdecode, "palette", gfx_trkfldch);
-
- PALETTE(config, m_palette, palette_device::BLACK, 256);
-}
-
-ROM_START( trkfldch )
- ROM_REGION( 0x400000, "maincpu", 0 )
- ROM_LOAD( "trackandfield.bin", 0x000000, 0x400000, CRC(f4f1959d) SHA1(344dbfe8df1897adf77da6e5ca0435c4d47d6842) )
-ROM_END
-
-ROM_START( my1stddr )
- ROM_REGION( 0x400000, "maincpu", 0 )
- ROM_LOAD( "myfirstddr.bin", 0x000000, 0x400000, CRC(2ef57bfc) SHA1(9feea5adb9de8fe17e915f3a037e8ddd70e58ae7) )
-ROM_END
-
-
-CONS( 2007, trkfldch, 0, 0, trkfldch, trkfldch,trkfldch_state, empty_init, "Konami", "Track & Field Challenge", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
-CONS( 2006, my1stddr, 0, 0, trkfldch, my1stddr,trkfldch_state, empty_init, "Konami", "My First Dance Dance Revolution (US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // Japan version has different songs
-