summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author mariuszw1 <mariuszw1@users.noreply.github.com>2009-06-24 17:29:02 +0000
committer mariuszw1 <mariuszw1@users.noreply.github.com>2009-06-24 17:29:02 +0000
commite54c35c18e5e673e68216e7442e5cb5fb035f1c1 (patch)
tree74ce224020d66c17720132a34077c2c07157037d
parentabfaf54b0a71c59a6fd19eab702d9cb2e508ec39 (diff)
Amiga AGA update [Mariusz Wojcieszek]
- fixed sprite data fetching and sprite colors Cubo CD32 update [Stephane Humbert] - fixed inputs - found why inputs are not read (protection ?), hacked to work now New games added or promoted from NOT_WORKING status --------------------------------------------------- Candy Puzzle [Mariusz Wojcieszek, Stephane Humbert] Harem Challenge [Mariusz Wojcieszek, Stephane Humbert]
-rw-r--r--src/mame/drivers/cubocd32.c354
-rw-r--r--src/mame/includes/amiga.h1
-rw-r--r--src/mame/video/amigaaga.c92
3 files changed, 371 insertions, 76 deletions
diff --git a/src/mame/drivers/cubocd32.c b/src/mame/drivers/cubocd32.c
index 2ac6aadb71d..cd3aa8f9486 100644
--- a/src/mame/drivers/cubocd32.c
+++ b/src/mame/drivers/cubocd32.c
@@ -1,7 +1,8 @@
/* Cubo CD32 (Original hardware by Commodore, additional hardware and games by CD Express, Milan, Italy)
- Preliminary driver by Mariusz Wojcieszek
+ Driver by Mariusz Wojcieszek
CD-ROM controller by Ernesto Corvi
+ Inputs by Stephane Humbert
This is basically a CD32 (Amiga 68020, AGA based games system) hacked up to run arcade games.
see http://ninjaw.ifrance.com/cd32/cubo/ for a brief overview.
@@ -23,9 +24,6 @@
* Gamepad, Serial port, 2 Gameports, Interfaces for keyboard
- ToDo:
- Inputs
-
Known Games:
Title | rev. | year
@@ -41,6 +39,139 @@
Odeon Twister 2 |202.19| 1999
+ ToDo:
+ - remove the hack needed to make inputs working
+ - settings are not saved
+
+
+ Stephh notes:
+
+ Harem Challenge:
+
+settings (A5=0x00a688 & A2= 0x0028e8) :
+
+ - : photo level - soft* / erotic / porno
+ - 002906.b (A2 + 0x1e) : difficulty (2) - 1 = LOW / 2 = NORMAL / 3 = HIGH
+ - 0028fc.b (A2 + 0x14) : deadly selftouch (0) - 0 = NO / 1 = YES
+ - 0028ff.b (A2 + 0x17) : energy supply - 100%* / 0% / 50%
+ - 002900.b (A2 + 0x18) : area to cover 1P - 75% / 80%* / 85%
+ - 002901.b (A2 + 0x19) : area to cover 2P - 70% / 75%* / 80%
+ - 002902.w (A2 + 0x1a) : level time (00C8) - 0096 = 1:00 / 00C8 = 1:20 / 00FA = 1:40
+ - 002904.b (A2 + 0x1c) : tournament mode (2) - 0 = NO CHALLENGE / 2 = BEST OF 3 / 3 = BEST OF 5
+ - : reset hi-score - NO* / YES
+ - 0028fd.b (A2 + 0x15) : coin x 1 play (1) <=> number of credits used for each play
+ - 0028fe.b (A2 + 0x16) : play x credit (1) <=> credits awarded for each coin
+ - : demo photo level - soft* / erot
+
+useful addresses :
+
+ - 002907.b (-$7f00,A5 -> $1f,A2) : must be 0x0000 instead of 0x0001 to accept coins !
+ - 00278c.w (-$7efc,A5) : player 2 inputs
+ - 00278e.w (-$7efa,A5) : player 1 inputs
+ - 002790.b (-$7ef8,A5) : credits
+
+ - 0028e8.b (A2 ) : level - range (0x01 - 0x09 and 0x00 when in "attract mode")
+ - 0028ea.w (A2 + 0x02) : time (not used for "continue play") - range (0x0000 - 0x0014 with 0x0000 being max)
+
+ - 026fe8.l (-$7fa0,A5 -> A2 + $18 x 0 + 0x00) : player 1 energy (in MSW after swap) - range (0x00000000 - 0x00270000)
+ - 026fec.l (-$7fa0,A5 -> A2 + $18 x 0 + 0x04) : player 1 score
+ - 026ff8.w (-$7fa0,A5 -> A2 + $18 x 0 + 0x10) : player 1 girls
+ - 027000.l (-$7fa0,A5 -> A2 + $18 x 1 + 0x00) : player 2 energy (in MSW after swap) - range (0x00000000 - 0x00270000)
+ - 027004.l (-$7fa0,A5 -> A2 + $18 x 1 + 0x04) : player 2 score
+ - 027010.w (-$7fa0,A5 -> A2 + $18 x 1 + 0x10) : player 2 girls
+
+routines :
+
+ - 04a5de : inputs read
+ - 061928 : buttons + coin read
+ * D0 = 0 : read POTGO (player 2)
+ * D0 = 1 : read POTGO (player 1)
+
+ - 04a692 : coin verification
+ - 050b8c : start buttons verification
+
+
+ Laser Strixx 2
+
+settings (A5=0x00a688 & A2= 0x0027f8) :
+
+ - : photo level - soft* / erotic / porno
+ - 002910.l (A2 + 0x18) : difficulty (00010000) - 00008000 = LOW / 00010000 = NORMAL / 00018000 = HIGH
+ - 002818.b (A2 + 0x20) : deadly selftouch (0) - 0 = NO / 1 = YES
+ - 00281b.b (A2 + 0x23) : energy supply - 100%* / 0% / 50%
+ - 002819.b (A2 + 0x21) : coin x 1 play (1) <=> number of credits used for each play
+ - 00281a.b (A2 + 0x22) : play x credit (1) <=> credits awarded for each coin
+
+useful addresses :
+
+ - 00281c.b (-$7fa2,A5 -> $24,A2) : must be 0x0000 instead of 0x0001 to accept coins !
+ - 0026f4.w (-$7f94,A5) : player 1 inputs (in MSW after swap)
+ - 0026ee.b (-$7f9a,A5) : credits
+
+ - 0027f8.l (A2 + 0x00) : player 1 energy (in MSW after swap) - range (0x00000000 - 0x00270000)
+ - 0027fc.b (A2 + 0x04) : level - range (0x01 - 0x09 and 0x00 when in "attract mode")
+ - 0027fe.w (A2 + 0x06) : time (not used for "continue play") - range (0x0000 - 0x0014 with 0x0000 being max)
+ - 002800.l (A2 + 0x08) : player 1 score
+ - 00280a.b (A2 + 0x12) : mouth status (0x00 = not out - 0x01 = out - 0x02 = captured = LIVE STRIP at the end of level)
+ - 00280b.b (A2 + 0x13) : strip phase (0x01 - n with 0x01 being last phase)
+ Ann : n = 0x05
+ Eva : n = 0x04
+ Jo : n = 0x06
+ Sue : n = 0x04
+ Bob : n = 0x05
+
+routines :
+
+ - 04d1ae : inputs read
+ - 058340 : buttons + coin read
+ * D0 = 0 : read POTGO (player 2)
+ * D0 = 1 : read POTGO (player 1)
+
+ - 04d1da : coin verification
+
+
+ Candy Puzzle
+
+settings (A5=0x059ac0) :
+
+ - 051ba0.w (-$7f20,A5) : difficulty player 1 (0)
+ - 051ba2.w (-$7f1e,A5) : difficulty player 2 (0)
+ - 051ba4.w (-$7f1c,A5) : challenge rounds (3)
+ - 051ba6.w (-$7f1a,A5) : death in 2P mode (0) - 0 = NO / 1 = YES
+ - 051ba8.w (-$7f18,A5) : play x credit (1)
+ - 051bac.w (-$7f14,A5) : coin x 1 play (1)
+ - 051bb0.w (-$7f10,A5) : maxpalleattack (2)
+ - : reset high score - NO* / YES
+ - 051baa.w (-$7f16,A5) : 1 coin 2 players (1) - 0 = NO / 1 = YES
+
+useful addresses :
+
+ - 051c02.w (-$7ebe,A5) : must be 0x0000 instead of 0x0001 to accept coins !
+ - 051c04.b (-$7ebc,A5) : credits
+ - 051c10.l (-$7eb0,A5) : basic address for inputs = 0006fd18 :
+ * BA + 1 x 6 + 4 : start 2 (bit 5) and coin (bit 2)
+ * BA + 1 x 6 + 0 : player 2 L/R (-1/0/1)
+ * BA + 1 x 6 + 2 : player 2 U/D (-1/0/1)
+ * BA + 0 x 6 + 4 : start 1 (bit 5)
+ * BA + 0 x 6 + 0 : player 1 L/R (-1/0/1)
+ * BA + 0 x 6 + 2 : player 1 U/D (-1/0/1)
+
+routines :
+
+ - 07acae : inputs read
+ - 092c8a : buttons + coin read
+ * D0 = 0 : read POTGO (player 2)
+ * D0 = 1 : read POTGO (player 1)
+ - 092baa : joy read - test bits 1 and 9 : 1 if bit 1, -1 if bit 9, 0 if none
+ * D0 = 0 : read JOY0DAT (player 2)
+ * D0 = 1 : read JOY1DAT (player 1)
+ - 092bd4 : joy read - test bits 0 and 8 : 1 if bit 0, -1 if bit 8, 0 if none ("eor.w read, read >> 1" before test)
+ * D0 = 0 : read JOY0DAT (player 2)
+ * D0 = 1 : read JOY1DAT (player 1)
+
+ - 07ada4 : coin verification
+ - 07d0fe : start buttons verification
+
*/
#include "driver.h"
@@ -138,15 +269,23 @@ static ADDRESS_MAP_START( cd32_map, ADDRESS_SPACE_PROGRAM, 32 )
AM_RANGE(0xf80000, 0xffffff) AM_ROM AM_REGION("user1", 0x0) /* Kickstart */
ADDRESS_MAP_END
-//int cubo_input_port_val = 0;
-//int cubo_input_select = 0;
+/*************************************
+ *
+ * Inputs
+ *
+ *************************************/
+
static UINT16 potgo_value = 0;
static int cd32_shifter[2];
+static void (*cubocd32_input_hack)(running_machine *machine) = 0;
static void cubocd32_potgo_w(running_machine *machine, UINT16 data)
{
int i;
+ if (cubocd32_input_hack != NULL)
+ cubocd32_input_hack(machine);
+
potgo_value = potgo_value & 0x5500;
potgo_value |= data & 0xaa00;
@@ -165,9 +304,8 @@ static void cubocd32_potgo_w(running_machine *machine, UINT16 data)
UINT16 p5dir = 0x0200 << (i * 4); /* output enable P5 */
UINT16 p5dat = 0x0100 << (i * 4); /* data P5 */
if ((potgo_value & p5dir) && (potgo_value & p5dat))
- cd32_shifter[i] = 8;
+ cd32_shifter[i] = 8;
}
-
}
static void handle_cd32_joystick_cia(UINT8 pra, UINT8 dra)
@@ -180,6 +318,7 @@ static void handle_cd32_joystick_cia(UINT8 pra, UINT8 dra)
UINT8 but = 0x40 << i;
UINT16 p5dir = 0x0200 << (i * 4); /* output enable P5 */
UINT16 p5dat = 0x0100 << (i * 4); /* data P5 */
+
if (!(potgo_value & p5dir) || !(potgo_value & p5dat))
{
if ((dra & but) && (pra & but) != oldstate[i])
@@ -198,6 +337,7 @@ static void handle_cd32_joystick_cia(UINT8 pra, UINT8 dra)
static UINT16 handle_joystick_potgor (running_machine *machine, UINT16 potgor)
{
+ static const char *const player_portname[] = { "P2", "P1" };
int i;
for (i = 0; i < 2; i++)
@@ -218,9 +358,8 @@ static UINT16 handle_joystick_potgor (running_machine *machine, UINT16 potgor)
/* shift at 1 == return one, >1 = return button states */
if (cd32_shifter[i] == 0)
potgor &= ~p9dat; /* shift at zero == return zero */
- if (i == 0)
- if (cd32_shifter[i] >= 2 && (input_port_read(machine, "IN0") & (1 << (cd32_shifter[i] - 2))))
- potgor &= ~p9dat;
+ if (cd32_shifter[i] >= 2 && (input_port_read(machine, player_portname[i]) & (1 << (cd32_shifter[i] - 2))))
+ potgor &= ~p9dat;
}
return potgor;
}
@@ -233,42 +372,35 @@ static CUSTOM_INPUT(cubo_input)
static INPUT_PORTS_START( cd32 )
PORT_START("CIA0PORTA")
- PORT_BIT( 0x3f, IP_ACTIVE_LOW, IPT_SPECIAL )
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 )
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL
+ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START("CIA0PORTB")
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START2 )
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START("JOY0DAT")
- PORT_BIT( 0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM(amiga_joystick_convert, "P1JOY")
+ PORT_BIT( 0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM(amiga_joystick_convert, "P2JOY")
PORT_BIT( 0xfcfc, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("JOY1DAT")
- PORT_BIT( 0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM(amiga_joystick_convert, "P2JOY")
+ PORT_BIT( 0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM(amiga_joystick_convert, "P1JOY")
PORT_BIT( 0xfcfc, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("POTGO")
- PORT_BIT( 0x4400, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM(cubo_input, 0)
- PORT_BIT( 0xaaff, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x4400, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM(cubo_input, 0)
+ PORT_BIT( 0xbbff, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("P1JOY")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
PORT_START("P2JOY")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2)
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2)
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2)
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2)
- PORT_START("COINS")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 )
-
PORT_START("DIPSW1")
PORT_DIPNAME( 0x01, 0x01, "DSW1 1" )
PORT_DIPSETTING( 0x01, "Reset" )
@@ -293,19 +425,108 @@ static INPUT_PORTS_START( cd32 )
PORT_DIPSETTING( 0x80, "Reset" )
PORT_DIPSETTING( 0x00, "Set" )
- PORT_START("IN0")
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_BUTTON1 )
- PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_BUTTON2 )
- PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_BUTTON3 )
- PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_BUTTON4 )
- PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON5 )
- PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON6 )
- PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON7 )
- PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_START("P1")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) /* COIN1 */
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_PLAYER(1) /* BUTTON1 & START1 */
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_BUTTON8 ) PORT_PLAYER(1)
+
+ PORT_START("P2")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2)
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2)
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(2)
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_PLAYER(2) /* BUTTON1 & START2 */
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_PLAYER(2)
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_BUTTON8 ) PORT_PLAYER(2)
INPUT_PORTS_END
+static INPUT_PORTS_START( cndypuzl )
+ PORT_INCLUDE( cd32 )
+
+ PORT_MODIFY("P1")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_COIN1 )
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) /* START1 and launch bubble */
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_MODIFY("P2")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) /* START2 and launch bubble */
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( haremchl )
+ PORT_INCLUDE( cd32 )
+
+ PORT_MODIFY("P1")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_COIN1 )
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) /* fire */
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) /* START1 and draw */
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) /* retract */
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_MODIFY("P2")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) /* fire */
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) /* START2 and draw */
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) /* retract */
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( lasstixx )
+ PORT_INCLUDE( cd32 )
+
+ PORT_MODIFY("P2JOY")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_MODIFY("P1")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_COIN1 )
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) /* START1 and draw */
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) /* retract */
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_MODIFY("P2")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+INPUT_PORTS_END
/*************************************
*
* Sound definitions
@@ -463,6 +684,45 @@ static DRIVER_INIT( cd32 )
/* intialize akiko */
amiga_akiko_init(machine);
+
+ /* input hack */
+ cubocd32_input_hack = NULL;
+}
+
+static void haremchl_input_hack(running_machine *machine)
+{
+ if(cpu_get_pc(machine->cpu[0]) < amiga_chip_ram_size)
+ amiga_chip_ram_w(0x2906, 0x00);
+}
+
+static DRIVER_INIT(haremchl)
+{
+ DRIVER_INIT_CALL(cd32);
+ cubocd32_input_hack = haremchl_input_hack;
+}
+
+static void cndypuzl_input_hack(running_machine *machine)
+{
+ if(cpu_get_pc(machine->cpu[0]) < amiga_chip_ram_size)
+ amiga_chip_ram_w(0x051c02, 0x00);
+}
+
+static DRIVER_INIT(cndypuzl)
+{
+ DRIVER_INIT_CALL(cd32);
+ cubocd32_input_hack = cndypuzl_input_hack;
+}
+
+static void lasstixx_input_hack(running_machine *machine)
+{
+ if(cpu_get_pc(machine->cpu[0]) < amiga_chip_ram_size)
+ amiga_chip_ram_w(0x0281c, 0x00);
+}
+
+static DRIVER_INIT(lasstixx)
+{
+ DRIVER_INIT_CALL(cd32);
+ cubocd32_input_hack = lasstixx_input_hack;
}
/***************************************************************************************************/
@@ -470,10 +730,10 @@ static DRIVER_INIT( cd32 )
/* BIOS */
GAME( 1993, cd32, 0, cd32, cd32, cd32, ROT0, "Commodore", "Amiga CD32 Bios", GAME_IS_BIOS_ROOT )
-GAME( 1995, cndypuzl, cd32, cd32, cd32, cd32, ROT0, "CD Express", "Candy Puzzle (v1.0)", GAME_NOT_WORKING|GAME_NO_SOUND )
-GAME( 1995, haremchl, cd32, cd32, cd32, cd32, ROT0, "CD Express", "Harem Challenge", GAME_NOT_WORKING|GAME_NO_SOUND )
-GAME( 1995, lsrquiz, cd32, cd32, cd32, cd32, ROT0, "CD Express", "Laser Quiz", GAME_NOT_WORKING|GAME_NO_SOUND )
-GAME( 1995, lsrquiz2, cd32, cd32, cd32, cd32, ROT0, "CD Express", "Laser Quiz '2' Italy (v1.0)", GAME_NOT_WORKING|GAME_NO_SOUND )
-GAME( 1996, mgprem11, cd32, cd32, cd32, cd32, ROT0, "CD Express", "Magic Premium (v1.1)", GAME_NOT_WORKING|GAME_NO_SOUND )
-GAME( 1995, lasstixx, cd32, cd32, cd32, cd32, ROT0, "CD Express", "Laser Strixx", GAME_NOT_WORKING|GAME_NO_SOUND )
-GAME( 1995, mgnumber, cd32, cd32, cd32, cd32, ROT0, "CD Express", "Magic Number", GAME_NOT_WORKING|GAME_NO_SOUND )
+GAME( 1995, cndypuzl, cd32, cd32, cndypuzl, cndypuzl, ROT0, "CD Express", "Candy Puzzle (v1.0)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND )
+GAME( 1995, haremchl, cd32, cd32, haremchl, haremchl, ROT0, "CD Express", "Harem Challenge", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND )
+GAME( 1995, lsrquiz, cd32, cd32, cd32, cd32, ROT0, "CD Express", "Laser Quiz Italy", GAME_NOT_WORKING|GAME_NO_SOUND )
+GAME( 1995, lsrquiz2, cd32, cd32, cd32, cd32, ROT0, "CD Express", "Laser Quiz 2 Italy (v1.0)", GAME_NOT_WORKING|GAME_NO_SOUND )
+GAME( 1996, mgprem11, cd32, cd32, cd32, cd32, ROT0, "CD Express", "Magic Premium (v1.1)", GAME_NOT_WORKING|GAME_NO_SOUND )
+GAME( 1995, lasstixx, cd32, cd32, lasstixx, lasstixx, ROT0, "CD Express", "Laser Strixx 2", GAME_NOT_WORKING|GAME_NO_SOUND )
+GAME( 1995, mgnumber, cd32, cd32, cd32, cd32, ROT0, "CD Express", "Magic Number", GAME_NOT_WORKING|GAME_NO_SOUND )
diff --git a/src/mame/includes/amiga.h b/src/mame/includes/amiga.h
index 4ed361c6c8d..0ca0a7283b5 100644
--- a/src/mame/includes/amiga.h
+++ b/src/mame/includes/amiga.h
@@ -144,6 +144,7 @@ Ernesto Corvi & Mariusz Wojcieszek
#define REG_BPLCON3 (0x106/2) /* W D Bit plane control reg (enhanced features) */
#define REG_BPL1MOD (0x108/2) /* W A Bit plane modulo (odd planes) */
#define REG_BPL2MOD (0x10A/2) /* W A Bit Plane modulo (even planes) */
+#define REG_BPLCON4 (0x10C/2) /* W D Bit plane control reg. (display masks) */
#define REG_BPL1DAT (0x110/2) /* W D Bit plane 1 data (parallel-to-serial convert) */
#define REG_BPL2DAT (0x112/2) /* W D Bit plane 2 data (parallel-to-serial convert) */
#define REG_BPL3DAT (0x114/2) /* W D Bit plane 3 data (parallel-to-serial convert) */
diff --git a/src/mame/video/amigaaga.c b/src/mame/video/amigaaga.c
index 584f7df90bb..e4b62295047 100644
--- a/src/mame/video/amigaaga.c
+++ b/src/mame/video/amigaaga.c
@@ -1,6 +1,6 @@
/***************************************************************************
- Amiga hardware
+ Amiga AGA hardware
Driver by: Ernesto Corvi, Mariusz Wojcieszek, Aaron Giles
@@ -9,10 +9,11 @@ Done:
- bitplane data fetching
- support for up to 8 standard bitplanes
- HAM8 mode
+ - preliminary sprites
To do:
- - sprites (current implementation is incomplete - see CD32 logo)
- incorrect hstart/hstop values in CD32 logo, lsrquiz & lsrquiz2
+ - sprite collisions
***************************************************************************/
@@ -59,6 +60,7 @@ static UINT64 aga_bpldat[8];
static UINT8 sprite_comparitor_enable_mask;
static UINT8 sprite_dma_reload_mask;
static UINT8 sprite_dma_live_mask;
+static UINT8 sprite_ctl_written;
static UINT32 sprite_shiftreg[8];
static UINT8 sprite_remain[8];
static UINT16 aga_sprdata[8][4];
@@ -208,6 +210,8 @@ VIDEO_START( amiga_aga )
/* reset the genlock color */
genlock_color = 0xffff;
+
+ sprite_ctl_written = 0;
}
@@ -398,6 +402,7 @@ static int copper_execute_next(running_machine *machine, int xpos)
void amiga_aga_sprite_dma_reset(int which)
{
+ if (LOG_SPRITE_DMA) logerror("sprite %d dma reset\n", which );
sprite_dma_reload_mask |= 1 << which;
sprite_dma_live_mask |= 1 << which;
}
@@ -405,13 +410,17 @@ void amiga_aga_sprite_dma_reset(int which)
void amiga_aga_sprite_enable_comparitor(int which, int enable)
{
+ if (LOG_SPRITE_DMA) logerror("sprite %d comparitor %sable\n", which, enable ? "en" : "dis" );
if (enable)
{
sprite_comparitor_enable_mask |= 1 << which;
sprite_dma_live_mask &= ~(1 << which);
}
else
+ {
sprite_comparitor_enable_mask &= ~(1 << which);
+ sprite_ctl_written |= (1 << which);
+ }
}
@@ -422,7 +431,7 @@ void amiga_aga_sprite_enable_comparitor(int which, int enable)
*
*************************************/
-INLINE void fetch_sprite_data(int sprite)
+INLINE void fetch_sprite_data(int scanline, int sprite)
{
switch((CUSTOM_REG(REG_FMODE) >> 2) & 0x03)
{
@@ -431,31 +440,39 @@ INLINE void fetch_sprite_data(int sprite)
aga_sprdatb[sprite][0] = amiga_chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 2);
CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) += 4;
aga_sprite_fetched_words = 1;
+ if (LOG_SPRITE_DMA) logerror("%3d:sprite %d fetch: data=%04X-%04X\n", scanline, sprite, aga_sprdata[sprite][0], aga_sprdatb[sprite][0]);
break;
case 1:
case 2:
aga_sprdata[sprite][0] = amiga_chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 0);
- aga_sprdatb[sprite][0] = amiga_chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 2);
+ aga_sprdata[sprite][1] = amiga_chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 2);
CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) += 4;
- aga_sprdata[sprite][1] = amiga_chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 0);
+ aga_sprdatb[sprite][0] = amiga_chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 0);
aga_sprdatb[sprite][1] = amiga_chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 2);
CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) += 4;
aga_sprite_fetched_words = 2;
+ if (LOG_SPRITE_DMA) logerror("%3d:sprite %d fetch: data=%04X-%04X %04X-%04X\n", scanline, sprite, aga_sprdata[sprite][0], aga_sprdatb[sprite][0], aga_sprdata[sprite][1], aga_sprdatb[sprite][1] );
break;
case 3:
aga_sprdata[sprite][0] = amiga_chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 0);
- aga_sprdatb[sprite][0] = amiga_chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 2);
- CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) += 4;
- aga_sprdata[sprite][1] = amiga_chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 0);
- aga_sprdatb[sprite][1] = amiga_chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 2);
+ aga_sprdata[sprite][1] = amiga_chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 2);
CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) += 4;
aga_sprdata[sprite][2] = amiga_chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 0);
- aga_sprdatb[sprite][2] = amiga_chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 2);
+ aga_sprdata[sprite][3] = amiga_chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 2);
CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) += 4;
- aga_sprdata[sprite][3] = amiga_chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 0);
+ aga_sprdatb[sprite][0] = amiga_chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 0);
+ aga_sprdatb[sprite][1] = amiga_chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 2);
+ CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) += 4;
+ aga_sprdatb[sprite][2] = amiga_chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 0);
aga_sprdatb[sprite][3] = amiga_chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 2);
CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) += 4;
aga_sprite_fetched_words = 4;
+ if (LOG_SPRITE_DMA) logerror("%3d:sprite %d fetch: data=%04X-%04X %04X-%04X %04X-%04X %04X-%04X\n",
+ scanline, sprite,
+ aga_sprdata[sprite][0], aga_sprdatb[sprite][0],
+ aga_sprdata[sprite][1], aga_sprdatb[sprite][1],
+ aga_sprdata[sprite][2], aga_sprdatb[sprite][2],
+ aga_sprdata[sprite][3], aga_sprdatb[sprite][3]);
break;
}
aga_sprite_dma_used_words[sprite] = 0;
@@ -478,7 +495,7 @@ static void update_sprite_dma(int scanline)
int vstart, vstop;
/* if we are == VSTOP, fetch new control words */
- if (dmaenable && (sprite_dma_live_mask & bitmask) && (sprite_dma_reload_mask & bitmask))
+ if (dmaenable && (sprite_dma_live_mask & bitmask) && (sprite_dma_reload_mask & bitmask) && !(sprite_ctl_written & bitmask))
{
/* disable the sprite */
sprite_comparitor_enable_mask &= ~bitmask;
@@ -488,6 +505,19 @@ static void update_sprite_dma(int scanline)
CUSTOM_REG(REG_SPR0POS + 4 * num) = amiga_chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * num) + 0);
CUSTOM_REG(REG_SPR0CTL + 4 * num) = amiga_chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * num) + 2);
CUSTOM_REG_LONG(REG_SPR0PTH + 2 * num) += 4;
+ /* fetch additional words */
+ switch((CUSTOM_REG(REG_FMODE) >> 2) & 0x03)
+ {
+ case 0:
+ break;
+ case 1:
+ case 2:
+ CUSTOM_REG_LONG(REG_SPR0PTH + 2 * num) += 4;
+ break;
+ case 3:
+ CUSTOM_REG_LONG(REG_SPR0PTH + 2 * num) += 3*4;
+ break;
+ }
if (LOG_SPRITE_DMA) logerror("%3d:sprite %d fetch: pos=%04X ctl=%04X\n", scanline, num, CUSTOM_REG(REG_SPR0POS + 4 * num), CUSTOM_REG(REG_SPR0CTL + 4 * num));
}
@@ -505,6 +535,7 @@ static void update_sprite_dma(int scanline)
/* if we hit vstop, disable the comparitor and trigger a reload for the next scanline */
if (scanline == vstop)
{
+ sprite_ctl_written &= ~bitmask;
sprite_comparitor_enable_mask &= ~bitmask;
sprite_dma_reload_mask |= 1 << num;
CUSTOM_REG(REG_SPR0DATA + 4 * num) = 0; /* just a guess */
@@ -518,8 +549,7 @@ static void update_sprite_dma(int scanline)
//CUSTOM_REG(REG_SPR0DATA + 4 * num) = amiga_chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * num) + 0);
//CUSTOM_REG(REG_SPR0DATB + 4 * num) = amiga_chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * num) + 2);
//CUSTOM_REG_LONG(REG_SPR0PTH + 2 * num) += 4;
- fetch_sprite_data(num);
- if (LOG_SPRITE_DMA) logerror("%3d:sprite %d fetch: data=%04X-%04X\n", scanline, num, CUSTOM_REG(REG_SPR0DATA + 4 * num), CUSTOM_REG(REG_SPR0DATB + 4 * num));
+ fetch_sprite_data(scanline, num);
}
}
}
@@ -573,7 +603,7 @@ static int get_sprite_pixel(int x)
if (aga_sprite_dma_used_words[num] < aga_sprite_fetched_words)
{
sprite_remain[num] = 16;
- sprite_shiftreg[num] = interleave_sprite_data(aga_sprdata[aga_sprite_dma_used_words[num]][0], aga_sprdatb[aga_sprite_dma_used_words[num]][0]);
+ sprite_shiftreg[num] = interleave_sprite_data(aga_sprdata[num][aga_sprite_dma_used_words[num]], aga_sprdatb[num][aga_sprite_dma_used_words[num]]);
aga_sprite_dma_used_words[num]++;
}
}
@@ -594,6 +624,10 @@ static int get_sprite_pixel(int x)
0x0000, 0x0800, 0x2000, 0x2a00, 0x4000, 0x4c00, 0x7000, 0x7e00
};
int collide;
+ int esprm, osprm;
+
+ esprm = CUSTOM_REG(REG_BPLCON4) & 0x00f0;
+ osprm = (CUSTOM_REG(REG_BPLCON4) & 0x000f) << 4;
/* OR the two sprite bits together so we only have 1 bit per sprite */
collide = pixels | (pixels >> 1);
@@ -612,22 +646,22 @@ static int get_sprite_pixel(int x)
if (pixels & 0x0f)
{
/* final result is:
- topmost sprite color in bits 0-5
- sprite present bitmask in bits 6-9
- topmost sprite pair index in bits 10-11
+ topmost sprite color in bits 0-7
+ sprite present bitmask in bits 8-9
+ topmost sprite pair index in bits 12-11
*/
/* attached case */
if (CUSTOM_REG(REG_SPR1CTL + 8 * pair) & 0x0080)
- return (pixels & 0xf) | 0x10 | (collide << 6) | (pair << 10);
+ return (pixels & 0xf) | osprm | (collide << 8) | (pair << 12);
/* lower-numbered sprite of pair */
else if (pixels & 3)
- return (pixels & 3) | 0x10 | (pair << 2) | (collide << 6) | (pair << 10);
+ return (pixels & 3) | esprm | (pair << 2) | (collide << 8) | (pair << 12);
/* higher-numbered sprite of pair */
else
- return ((pixels >> 2) & 3) | 0x10 | (pair << 2) | (collide << 6) | (pair << 10);
+ return ((pixels >> 2) & 3) | osprm | (pair << 2) | (collide << 8) | (pair << 12);
}
}
@@ -1014,7 +1048,7 @@ void amiga_aga_render_scanline(running_machine *machine, bitmap_t *bitmap, int s
if (sprpix && pf1pri > (sprpix >> 10))
{
dst[x*2+0] =
- dst[x*2+1] = aga_palette[sprpix & 0x1f];
+ dst[x*2+1] = aga_palette[sprpix & 0xff];
}
/* playfield has priority */
@@ -1034,9 +1068,9 @@ void amiga_aga_render_scanline(running_machine *machine, bitmap_t *bitmap, int s
pix = sprpix & 0x1f;
if (pix)
{
- if ((pfpix0 & 0x15) && pf1pri <= (sprpix >> 10))
+ if ((pfpix0 & 0x15) && pf1pri <= (sprpix >> 12))
pix = 0;
- if ((pfpix0 & 0x2a) && pf2pri <= (sprpix >> 10))
+ if ((pfpix0 & 0x2a) && pf2pri <= (sprpix >> 12))
pix = 0;
}
@@ -1047,12 +1081,12 @@ void amiga_aga_render_scanline(running_machine *machine, bitmap_t *bitmap, int s
dst[x*2+0] = aga_palette[separate_bitplanes[(CUSTOM_REG(REG_BPLCON2) >> 6) & 1][pfpix0]];
/* mask out the sprite if it doesn't have priority */
- pix = sprpix & 0x1f;
+ pix = sprpix & 0xff;
if (pix)
{
- if ((pfpix1 & 0x15) && pf1pri <= (sprpix >> 10))
+ if ((pfpix1 & 0x15) && pf1pri <= (sprpix >> 12))
pix = 0;
- if ((pfpix1 & 0x2a) && pf2pri <= (sprpix >> 10))
+ if ((pfpix1 & 0x2a) && pf2pri <= (sprpix >> 12))
pix = 0;
}
@@ -1067,10 +1101,10 @@ void amiga_aga_render_scanline(running_machine *machine, bitmap_t *bitmap, int s
else
{
/* sprite has priority */
- if (sprpix && pf1pri > (sprpix >> 10))
+ if (sprpix && pf1pri > (sprpix >> 12))
{
dst[x*2+0] =
- dst[x*2+1] = aga_palette[(sprpix & 0x1f)];
+ dst[x*2+1] = aga_palette[(sprpix & 0xff)];
}
/* playfield has priority */