From 7ddee052fabc3edd6e9f7c4d95991a97dc3c235d Mon Sep 17 00:00:00 2001 From: David Haywood Date: Thu, 23 May 2019 17:40:17 +0100 Subject: trkfldch / my1stddr - don't just blow up at least (nw) (#5102) * trkfldch / my1stddr - don't just blow up at least (nw) * unimportant rubbish (nw) * nonsense (nw) * basically nothing (nw) * possible irq reg (nw) * outside irq (nw) * looking at register use (nw) --- src/mame/drivers/trkfldch.cpp | 546 ++++++++++++++++++++++++++++++++++++++---- 1 file 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); -- cgit v1.2.3