summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/karnov.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/karnov.c')
-rw-r--r--src/mame/drivers/karnov.c300
1 files changed, 147 insertions, 153 deletions
diff --git a/src/mame/drivers/karnov.c b/src/mame/drivers/karnov.c
index 92dc914d585..4d67db80385 100644
--- a/src/mame/drivers/karnov.c
+++ b/src/mame/drivers/karnov.c
@@ -91,62 +91,58 @@ Stephh's notes (based on the games M68000 code and some tests) :
*************************************/
/* Emulation of the protected microcontroller - for coins & general protection */
-static void karnov_i8751_w( running_machine &machine, int data )
+void karnov_state::karnov_i8751_w( int data )
{
- karnov_state *state = machine.driver_data<karnov_state>();
-
/* Pending coin operations may cause protection commands to be queued */
- if (state->m_i8751_needs_ack)
+ if (m_i8751_needs_ack)
{
- state->m_i8751_command_queue = data;
+ m_i8751_command_queue = data;
return;
}
- state->m_i8751_return = 0;
+ m_i8751_return = 0;
- if (data == 0x100 && state->m_microcontroller_id == KARNOV) /* USA version */
- state->m_i8751_return = 0x56b;
+ if (data == 0x100 && m_microcontroller_id == KARNOV) /* USA version */
+ m_i8751_return = 0x56b;
- if (data == 0x100 && state->m_microcontroller_id == KARNOVJ) /* Japan version */
- state->m_i8751_return = 0x56a;
+ if (data == 0x100 && m_microcontroller_id == KARNOVJ) /* Japan version */
+ m_i8751_return = 0x56a;
if ((data & 0xf00) == 0x300)
- state->m_i8751_return = (data & 0xff) * 0x12; /* Player sprite mapping */
+ m_i8751_return = (data & 0xff) * 0x12; /* Player sprite mapping */
/* I'm not sure the ones marked ^ appear in the right order */
- if (data == 0x400) state->m_i8751_return = 0x4000; /* Get The Map... */
- if (data == 0x402) state->m_i8751_return = 0x40a6; /* Ancient Ruins */
- if (data == 0x403) state->m_i8751_return = 0x4054; /* Forest... */
- if (data == 0x404) state->m_i8751_return = 0x40de; /* ^Rocky hills */
- if (data == 0x405) state->m_i8751_return = 0x4182; /* Sea */
- if (data == 0x406) state->m_i8751_return = 0x41ca; /* Town */
- if (data == 0x407) state->m_i8751_return = 0x421e; /* Desert */
- if (data == 0x401) state->m_i8751_return = 0x4138; /* ^Whistling wind */
- if (data == 0x408) state->m_i8751_return = 0x4276; /* ^Heavy Gates */
-
-// if (!state->m_i8751_return && data != 0x300) logerror("%s - Unknown Write %02x intel\n", machine.describe_context(), data);
-
- state->m_maincpu->set_input_line(6, HOLD_LINE); /* Signal main cpu task is complete */
- state->m_i8751_needs_ack = 1;
+ if (data == 0x400) m_i8751_return = 0x4000; /* Get The Map... */
+ if (data == 0x402) m_i8751_return = 0x40a6; /* Ancient Ruins */
+ if (data == 0x403) m_i8751_return = 0x4054; /* Forest... */
+ if (data == 0x404) m_i8751_return = 0x40de; /* ^Rocky hills */
+ if (data == 0x405) m_i8751_return = 0x4182; /* Sea */
+ if (data == 0x406) m_i8751_return = 0x41ca; /* Town */
+ if (data == 0x407) m_i8751_return = 0x421e; /* Desert */
+ if (data == 0x401) m_i8751_return = 0x4138; /* ^Whistling wind */
+ if (data == 0x408) m_i8751_return = 0x4276; /* ^Heavy Gates */
+
+// if (!m_i8751_return && data != 0x300) logerror("%s - Unknown Write %02x intel\n", machine().describe_context(), data);
+
+ m_maincpu->set_input_line(6, HOLD_LINE); /* Signal main cpu task is complete */
+ m_i8751_needs_ack = 1;
}
-static void wndrplnt_i8751_w( running_machine &machine, int data )
+void karnov_state::wndrplnt_i8751_w( int data )
{
- karnov_state *state = machine.driver_data<karnov_state>();
-
/* The last command hasn't been ACK'd (probably a conflict with coin command) */
- if (state->m_i8751_needs_ack)
+ if (m_i8751_needs_ack)
{
- state->m_i8751_command_queue = data;
+ m_i8751_command_queue = data;
return;
}
- state->m_i8751_return=0;
+ m_i8751_return=0;
- if (data == 0x100) state->m_i8751_return = 0x67a;
- if (data == 0x200) state->m_i8751_return = 0x214;
- if (data == 0x300) state->m_i8751_return = 0x17; /* Copyright text on title screen */
-// if (data == 0x300) state->m_i8751_return = 0x1; /* (USA) Copyright text on title screen */
+ if (data == 0x100) m_i8751_return = 0x67a;
+ if (data == 0x200) m_i8751_return = 0x214;
+ if (data == 0x300) m_i8751_return = 0x17; /* Copyright text on title screen */
+// if (data == 0x300) m_i8751_return = 0x1; /* (USA) Copyright text on title screen */
/* The game writes many values in the 0x600 range, but only a specific mask
matters for the return value */
@@ -154,172 +150,170 @@ static void wndrplnt_i8751_w( running_machine &machine, int data )
{
switch (data & 0x18)
{
- case 0x00: state->m_i8751_return = 0x4d53; break;
- case 0x08: state->m_i8751_return = 0x4b54; break;
- case 0x10: state->m_i8751_return = 0x5453; break;
- case 0x18: state->m_i8751_return = 0x5341; break;
+ case 0x00: m_i8751_return = 0x4d53; break;
+ case 0x08: m_i8751_return = 0x4b54; break;
+ case 0x10: m_i8751_return = 0x5453; break;
+ case 0x18: m_i8751_return = 0x5341; break;
}
}
-// else logerror("%s - Unknown Write %02x intel\n", machine.describe_context(), data);
+// else logerror("%s - Unknown Write %02x intel\n", machine().describe_context(), data);
/* These are 68k function call addresses - different address for each power-up */
- if (data == 0x400) state->m_i8751_return = 0x594;
- if (data == 0x401) state->m_i8751_return = 0x5ea;
- if (data == 0x402) state->m_i8751_return = 0x628;
- if (data == 0x403) state->m_i8751_return = 0x66c;
- if (data == 0x404) state->m_i8751_return = 0x6a4;
- if (data == 0x405) state->m_i8751_return = 0x6a4;
- if (data == 0x406) state->m_i8751_return = 0x6a4;
+ if (data == 0x400) m_i8751_return = 0x594;
+ if (data == 0x401) m_i8751_return = 0x5ea;
+ if (data == 0x402) m_i8751_return = 0x628;
+ if (data == 0x403) m_i8751_return = 0x66c;
+ if (data == 0x404) m_i8751_return = 0x6a4;
+ if (data == 0x405) m_i8751_return = 0x6a4;
+ if (data == 0x406) m_i8751_return = 0x6a4;
/* This is 68k program code which is executed every frame */
- if (data == 0x50c) state->m_i8751_return = 0x13fc;
- if (data == 0x50b) state->m_i8751_return = 0x00ff;
- if (data == 0x50a) state->m_i8751_return = 0x0006;
- if (data == 0x509) state->m_i8751_return = 0x0000;
- if (data == 0x508) state->m_i8751_return = 0x4a39;
- if (data == 0x507) state->m_i8751_return = 0x0006;
- if (data == 0x506) state->m_i8751_return = 0x0000;
- if (data == 0x505) state->m_i8751_return = 0x66f8;
- if (data == 0x504) state->m_i8751_return = 0x4a39;
- if (data == 0x503) state->m_i8751_return = 0x000c;
- if (data == 0x502) state->m_i8751_return = 0x0003;
- if (data == 0x501) state->m_i8751_return = 0x6bf8;
- if (data == 0x500) state->m_i8751_return = 0x4e75;
-
- state->m_maincpu->set_input_line(6, HOLD_LINE); /* Signal main cpu task is complete */
- state->m_i8751_needs_ack = 1;
+ if (data == 0x50c) m_i8751_return = 0x13fc;
+ if (data == 0x50b) m_i8751_return = 0x00ff;
+ if (data == 0x50a) m_i8751_return = 0x0006;
+ if (data == 0x509) m_i8751_return = 0x0000;
+ if (data == 0x508) m_i8751_return = 0x4a39;
+ if (data == 0x507) m_i8751_return = 0x0006;
+ if (data == 0x506) m_i8751_return = 0x0000;
+ if (data == 0x505) m_i8751_return = 0x66f8;
+ if (data == 0x504) m_i8751_return = 0x4a39;
+ if (data == 0x503) m_i8751_return = 0x000c;
+ if (data == 0x502) m_i8751_return = 0x0003;
+ if (data == 0x501) m_i8751_return = 0x6bf8;
+ if (data == 0x500) m_i8751_return = 0x4e75;
+
+ m_maincpu->set_input_line(6, HOLD_LINE); /* Signal main cpu task is complete */
+ m_i8751_needs_ack = 1;
}
-static void chelnov_i8751_w( running_machine &machine, int data )
+void karnov_state::chelnov_i8751_w( int data )
{
- karnov_state *state = machine.driver_data<karnov_state>();
-
/* Pending coin operations may cause protection commands to be queued */
- if (state->m_i8751_needs_ack)
+ if (m_i8751_needs_ack)
{
- state->m_i8751_command_queue = data;
+ m_i8751_command_queue = data;
return;
}
- state->m_i8751_return = 0;
+ m_i8751_return = 0;
- if (data == 0x200 && state->m_microcontroller_id == CHELNOV) /* World version */
- state->m_i8751_return = 0x7736;
+ if (data == 0x200 && m_microcontroller_id == CHELNOV) /* World version */
+ m_i8751_return = 0x7736;
- if (data == 0x200 && state->m_microcontroller_id == CHELNOVU) /* USA version */
- state->m_i8751_return = 0x783e;
+ if (data == 0x200 && m_microcontroller_id == CHELNOVU) /* USA version */
+ m_i8751_return = 0x783e;
- if (data == 0x200 && state->m_microcontroller_id == CHELNOVJ) /* Japan version */
- state->m_i8751_return = 0x7734;
+ if (data == 0x200 && m_microcontroller_id == CHELNOVJ) /* Japan version */
+ m_i8751_return = 0x7734;
- if (data == 0x100 && state->m_microcontroller_id == CHELNOV) /* World version */
- state->m_i8751_return = 0x71c;
+ if (data == 0x100 && m_microcontroller_id == CHELNOV) /* World version */
+ m_i8751_return = 0x71c;
- if (data == 0x100 && state->m_microcontroller_id == CHELNOVU) /* USA version */
- state->m_i8751_return = 0x71b;
+ if (data == 0x100 && m_microcontroller_id == CHELNOVU) /* USA version */
+ m_i8751_return = 0x71b;
- if (data == 0x100 && state->m_microcontroller_id == CHELNOVJ) /* Japan version */
- state->m_i8751_return = 0x71a;
+ if (data == 0x100 && m_microcontroller_id == CHELNOVJ) /* Japan version */
+ m_i8751_return = 0x71a;
if (data >= 0x6000 && data < 0x8000)
- state->m_i8751_return = 1; /* patched */
+ m_i8751_return = 1; /* patched */
- if ((data & 0xf000) == 0x1000) state->m_i8751_level = 1; /* Level 1 */
- if ((data & 0xf000) == 0x2000) state->m_i8751_level++; /* Level Increment */
+ if ((data & 0xf000) == 0x1000) m_i8751_level = 1; /* Level 1 */
+ if ((data & 0xf000) == 0x2000) m_i8751_level++; /* Level Increment */
if ((data & 0xf000) == 0x3000)
{
/* Sprite table mapping */
int b = data & 0xff;
- switch (state->m_i8751_level)
+ switch (m_i8751_level)
{
case 1: /* Level 1, Sprite mapping tables */
- if (state->m_microcontroller_id == CHELNOVU) /* USA */
+ if (m_microcontroller_id == CHELNOVU) /* USA */
{
- if (b < 2) state->m_i8751_return = 0;
- else if (b < 6) state->m_i8751_return = 1;
- else if (b < 0xb) state->m_i8751_return = 2;
- else if (b < 0xf) state->m_i8751_return = 3;
- else if (b < 0x13) state->m_i8751_return = 4;
- else state->m_i8751_return = 5;
+ if (b < 2) m_i8751_return = 0;
+ else if (b < 6) m_i8751_return = 1;
+ else if (b < 0xb) m_i8751_return = 2;
+ else if (b < 0xf) m_i8751_return = 3;
+ else if (b < 0x13) m_i8751_return = 4;
+ else m_i8751_return = 5;
}
else /* Japan, World */
{
- if (b < 3) state->m_i8751_return = 0;
- else if (b < 8) state->m_i8751_return = 1;
- else if (b < 0xc) state->m_i8751_return = 2;
- else if (b < 0x10) state->m_i8751_return = 3;
- else if (b < 0x19) state->m_i8751_return = 4;
- else if (b < 0x1b) state->m_i8751_return = 5;
- else if (b < 0x22) state->m_i8751_return = 6;
- else if (b < 0x28) state->m_i8751_return = 7;
- else state->m_i8751_return = 8;
+ if (b < 3) m_i8751_return = 0;
+ else if (b < 8) m_i8751_return = 1;
+ else if (b < 0xc) m_i8751_return = 2;
+ else if (b < 0x10) m_i8751_return = 3;
+ else if (b < 0x19) m_i8751_return = 4;
+ else if (b < 0x1b) m_i8751_return = 5;
+ else if (b < 0x22) m_i8751_return = 6;
+ else if (b < 0x28) m_i8751_return = 7;
+ else m_i8751_return = 8;
}
break;
case 2: /* Level 2, Sprite mapping tables, all sets are the same */
- if (b < 3) state->m_i8751_return = 0;
- else if (b < 9) state->m_i8751_return = 1;
- else if (b < 0x11) state->m_i8751_return = 2;
- else if (b < 0x1b) state->m_i8751_return = 3;
- else if (b < 0x21) state->m_i8751_return = 4;
- else if (b < 0x28) state->m_i8751_return = 5;
- else state->m_i8751_return = 6;
+ if (b < 3) m_i8751_return = 0;
+ else if (b < 9) m_i8751_return = 1;
+ else if (b < 0x11) m_i8751_return = 2;
+ else if (b < 0x1b) m_i8751_return = 3;
+ else if (b < 0x21) m_i8751_return = 4;
+ else if (b < 0x28) m_i8751_return = 5;
+ else m_i8751_return = 6;
break;
case 3: /* Level 3, Sprite mapping tables, all sets are the same */
- if (b < 5) state->m_i8751_return = 0;
- else if (b < 9) state->m_i8751_return = 1;
- else if (b < 0xd) state->m_i8751_return = 2;
- else if (b < 0x11) state->m_i8751_return = 3;
- else if (b < 0x1b) state->m_i8751_return = 4;
- else if (b < 0x1c) state->m_i8751_return = 5;
- else if (b < 0x22) state->m_i8751_return = 6;
- else if (b < 0x27) state->m_i8751_return = 7;
- else state->m_i8751_return = 8;
+ if (b < 5) m_i8751_return = 0;
+ else if (b < 9) m_i8751_return = 1;
+ else if (b < 0xd) m_i8751_return = 2;
+ else if (b < 0x11) m_i8751_return = 3;
+ else if (b < 0x1b) m_i8751_return = 4;
+ else if (b < 0x1c) m_i8751_return = 5;
+ else if (b < 0x22) m_i8751_return = 6;
+ else if (b < 0x27) m_i8751_return = 7;
+ else m_i8751_return = 8;
break;
case 4: /* Level 4, Sprite mapping tables, all sets are the same */
- if (b < 4) state->m_i8751_return = 0;
- else if (b < 0xc) state->m_i8751_return = 1;
- else if (b < 0xf) state->m_i8751_return = 2;
- else if (b < 0x19) state->m_i8751_return = 3;
- else if (b < 0x1c) state->m_i8751_return = 4;
- else if (b < 0x22) state->m_i8751_return = 5;
- else if (b < 0x29) state->m_i8751_return = 6;
- else state->m_i8751_return = 7;
+ if (b < 4) m_i8751_return = 0;
+ else if (b < 0xc) m_i8751_return = 1;
+ else if (b < 0xf) m_i8751_return = 2;
+ else if (b < 0x19) m_i8751_return = 3;
+ else if (b < 0x1c) m_i8751_return = 4;
+ else if (b < 0x22) m_i8751_return = 5;
+ else if (b < 0x29) m_i8751_return = 6;
+ else m_i8751_return = 7;
break;
case 5: /* Level 5, Sprite mapping tables, all sets are the same */
- if (b < 7) state->m_i8751_return = 0;
- else if (b < 0xe) state->m_i8751_return = 1;
- else if (b < 0x14) state->m_i8751_return = 2;
- else if (b < 0x1a) state->m_i8751_return = 3;
- else if (b < 0x23) state->m_i8751_return = 4;
- else if (b < 0x27) state->m_i8751_return = 5;
- else state->m_i8751_return = 6;
+ if (b < 7) m_i8751_return = 0;
+ else if (b < 0xe) m_i8751_return = 1;
+ else if (b < 0x14) m_i8751_return = 2;
+ else if (b < 0x1a) m_i8751_return = 3;
+ else if (b < 0x23) m_i8751_return = 4;
+ else if (b < 0x27) m_i8751_return = 5;
+ else m_i8751_return = 6;
break;
case 6: /* Level 6, Sprite mapping tables, all sets are the same */
- if (b < 3) state->m_i8751_return = 0;
- else if (b < 0xb) state->m_i8751_return = 1;
- else if (b < 0x11) state->m_i8751_return = 2;
- else if (b < 0x17) state->m_i8751_return = 3;
- else if (b < 0x1d) state->m_i8751_return = 4;
- else if (b < 0x24) state->m_i8751_return = 5;
- else state->m_i8751_return = 6;
+ if (b < 3) m_i8751_return = 0;
+ else if (b < 0xb) m_i8751_return = 1;
+ else if (b < 0x11) m_i8751_return = 2;
+ else if (b < 0x17) m_i8751_return = 3;
+ else if (b < 0x1d) m_i8751_return = 4;
+ else if (b < 0x24) m_i8751_return = 5;
+ else m_i8751_return = 6;
break;
case 7: /* Level 7, Sprite mapping tables, all sets are the same */
- if (b < 5) state->m_i8751_return = 0;
- else if (b < 0xb) state->m_i8751_return = 1;
- else if (b < 0x11) state->m_i8751_return = 2;
- else if (b < 0x1a) state->m_i8751_return = 3;
- else if (b < 0x21) state->m_i8751_return = 4;
- else if (b < 0x27) state->m_i8751_return = 5;
- else state->m_i8751_return = 6;
+ if (b < 5) m_i8751_return = 0;
+ else if (b < 0xb) m_i8751_return = 1;
+ else if (b < 0x11) m_i8751_return = 2;
+ else if (b < 0x1a) m_i8751_return = 3;
+ else if (b < 0x21) m_i8751_return = 4;
+ else if (b < 0x27) m_i8751_return = 5;
+ else m_i8751_return = 6;
break;
}
}
- // logerror("%s - Unknown Write %02x intel\n", machine.describe_context(), data);
+ // logerror("%s - Unknown Write %02x intel\n", machine().describe_context(), data);
- state->m_maincpu->set_input_line(6, HOLD_LINE); /* Signal main cpu task is complete */
- state->m_i8751_needs_ack = 1;
+ m_maincpu->set_input_line(6, HOLD_LINE); /* Signal main cpu task is complete */
+ m_i8751_needs_ack = 1;
}
/*************************************
@@ -370,16 +364,16 @@ WRITE16_MEMBER(karnov_state::karnov_control_w)
case 6: /* SECREQ (Interrupt & Data to i8751) */
if (m_microcontroller_id == KARNOV || m_microcontroller_id == KARNOVJ)
- karnov_i8751_w(machine(), data);
+ karnov_i8751_w(data);
if (m_microcontroller_id == CHELNOV || m_microcontroller_id == CHELNOVU || m_microcontroller_id == CHELNOVJ)
- chelnov_i8751_w(machine(), data);
+ chelnov_i8751_w(data);
if (m_microcontroller_id == WNDRPLNT)
- wndrplnt_i8751_w(machine(), data);
+ wndrplnt_i8751_w(data);
break;
case 8: /* HSHIFT (9 bits) - Top bit indicates video flip */
COMBINE_DATA(&m_scroll[0]);
- karnov_flipscreen_w(machine(), data >> 15);
+ karnov_flipscreen_w(data >> 15);
break;
case 0xa: /* VSHIFT */