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.cpp546
1 files changed, 495 insertions, 51 deletions
diff --git a/src/mame/drivers/trkfldch.cpp b/src/mame/drivers/trkfldch.cpp
index cde7b9594cf..bd6a32dde66 100644
--- a/src/mame/drivers/trkfldch.cpp
+++ b/src/mame/drivers/trkfldch.cpp
@@ -15,21 +15,10 @@ 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.
-currently dies after call at
+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.
-00:AE85: LDA $0b
-00:AE87: TAX
-00:AE88: LDA $0d
-00:AE8A: JSL $00a044
-
-00:A044: SEP #$20
-00:A046: PHA
-00:A047: REP #$20
-00:A049: DEX
-00:A04A: PHX
-00:A04B: RTL
-
-which pushes some values onto the stack, then RTLs to them (but the values at $0b and $0d at both 00, so it jumps to 0 and dies)
+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?
*/
@@ -40,6 +29,8 @@ which pushes some values onto the stack, then RTLs to them (but the values at $0
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
+#include "machine/timer.h"
+
class trkfldch_state : public driver_device
{
@@ -52,6 +43,7 @@ public:
{ }
void trkfldch(machine_config &config);
+ void vectors_map(address_map &map);
protected:
virtual void machine_start() override;
@@ -67,8 +59,17 @@ private:
uint32_t screen_update_trkfldch(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void trkfldch_map(address_map &map);
- DECLARE_READ8_MEMBER(unk_7804_read);
- DECLARE_READ8_MEMBER(unk_7805_read);
+ DECLARE_READ8_MEMBER(read_vector);
+
+ TIMER_DEVICE_CALLBACK_MEMBER(scanline);
+
+ uint8_t m_which_vector;
+
+ DECLARE_READ8_MEMBER(unkregs_r);
+ DECLARE_WRITE8_MEMBER(unkregs_w);
+
+ uint8_t m_unkregs[0x100];
+
};
void trkfldch_state::video_start()
@@ -81,15 +82,7 @@ uint32_t trkfldch_state::screen_update_trkfldch(screen_device &screen, bitmap_in
}
-READ8_MEMBER(trkfldch_state::unk_7804_read)
-{
- return 0xff;
-}
-READ8_MEMBER(trkfldch_state::unk_7805_read)
-{
- return 0xff;
-}
void trkfldch_state::trkfldch_map(address_map &map)
{
@@ -100,12 +93,84 @@ void trkfldch_state::trkfldch_map(address_map &map)
map(0x007000, 0x0072ff).ram();
// 7800 - 78xx look like registers?
- map(0x007804, 0x007804).r(FUNC(trkfldch_state::unk_7804_read));
- map(0x007805, 0x007805).r(FUNC(trkfldch_state::unk_7805_read));
+ map(0x007800, 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)
+ 16 : 0x6000 (points at ram? or some internal ROM? we have nothing mapped here, not cleared as RAM either)
+ 18 : 0xA31A (dummy)
+ 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);
+ }
+
+}
+
+
static INPUT_PORTS_START( trkfldch )
INPUT_PORTS_END
@@ -125,46 +190,425 @@ static GFXDECODE_START( gfx_trkfldch )
GFXDECODE_ENTRY( "maincpu", 0, tiles8x8_layout, 0, 1 )
GFXDECODE_END
-void trkfldch_state::machine_start()
+/*
+
+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::unkregs_r)
{
+ uint8_t ret = m_unkregs[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);
+ 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);
+ break;
+
+ case 0x04:
+ ret = 0xff;
+ //logerror("%s: unkregs_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);
+ break;
+
+ case 0x70: // read in irq (inputs?)
+ ret = machine().rand();
+ //logerror("%s: unkregs_r (IRQ state?) %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;
}
-void trkfldch_state::machine_reset()
+WRITE8_MEMBER(trkfldch_state::unkregs_w)
{
- uint8_t *rom = memregion("maincpu")->base();
+ 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;
+
+
+ // is it significant that 0x10 goes up to 0x1a, 0x20 to 0x2b, 0x30 to 0x3b could be 3 sets of similar things?
+
+ case 0x10:
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x11:
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x12: // startup
+ //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: // startup
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x15:
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x16:
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x17:
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x18:
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ 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\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x21: // rarely
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x22: // rarely
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x23: // after a long time
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x24: // rarely
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x25: // rarely
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x26:
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x27:
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x28:
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x29:
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x2a:
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x2b:
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
- int vector = 0xe;
- /* what appears to be a table of vectors apepars at the START of ROM, maybe this gets copied to RAM, maybe used directly?
- 0: (invalid)
- 1: (invalid)
- 2: 0xA2C6
- 3: 0xA334
- 4: 0xA300
- 5: 0xA2E0
- 6: 0xA2B9
- 7: 0xA2ED // possible irq vector pointer, THIS IS NOT THE BOOT CODE!
- 8: 0xA2D3
- 9: 0xA327
- a: 0xA30D
- b: 0x6000
- c: 0xA31A
- d: 0xA2AC
- e: 0xA341
- f: (invalid)
- */
- uint16_t addr = (rom[vector * 2 + 1] << 8) | (rom[vector * 2]);
- m_maincpu->set_state_int(1, addr);
+ case 0x30:
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x31:
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x32: // rarely
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x33: // rarely
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x34: // rarely
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x36: // rarely
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x37: // rarely
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x3a:
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x3b:
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+
+
+
+ case 0x42:
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x43:
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+
+
+
+ case 0x54: // startup
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x55: // startup
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x56: // startup
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+
+
+ case 0x60:
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x61:
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x62:
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x63:
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x64:
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x65:
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x66:
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x67: // after a long time
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x68: // rarely (my1stddr)
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x69: // after a long time
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x6b: // after a long time
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x6c: // rarely (my1stddr)
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x6d: // after a long time
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+
+
+ // 7x = I/O area?
+
+
+ case 0x71: // startup
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x72: // startup
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x73: // some kind of serial device?
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x74: // startup
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x75: // some kind of serial device? (used with 73?)
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x76: // startup
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x77: // every second or so
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x78: // startup
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x79: // startup
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x7a: // startup
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x7f: // startup
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+
+ case 0x81: // startup (my1stddr)
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x82: // startup (my1stddr)
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x83:
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0x84:
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+
+ case 0xb5: // startup
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+ case 0xb6: // significant data transfer shortly after boot
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+
+
+ case 0xca: // startup
+ //logerror("%s: unkregs_w %04x %02x\n", machine().describe_context(), offset, data);
+ break;
+
+
+ default:
+ //printf("%s: unkregs_w %04x %02x\n", machine().describe_context().c_str(), offset, data);
+ break;
+ }
+
+ m_unkregs[offset] = data;
+}
+
+void trkfldch_state::machine_start()
+{
+}
+
+void trkfldch_state::machine_reset()
+{
+ m_which_vector = 0x06;
+
+ for (int i = 0; i < 0x100; i++)
+ m_unkregs[i] = 0x00;
}
void trkfldch_state::trkfldch(machine_config &config)
{
/* basic machine hardware */
G65816(config, m_maincpu, 20000000);
- //m_maincpu->set_addrmap(AS_DATA, &tv965_state::mem_map);
+ //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);