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)
This commit is contained in:
David Haywood 2019-05-23 17:40:17 +01:00 committed by R. Belmont
parent 7da9eaffd0
commit 7ddee052fa

View File

@ -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
/*
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;
}
WRITE8_MEMBER(trkfldch_state::unkregs_w)
{
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;
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()
{
uint8_t *rom = memregion("maincpu")->base();
m_which_vector = 0x06;
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);
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);