diff options
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 |
commit | e54c35c18e5e673e68216e7442e5cb5fb035f1c1 (patch) | |
tree | 74ce224020d66c17720132a34077c2c07157037d | |
parent | abfaf54b0a71c59a6fd19eab702d9cb2e508ec39 (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.c | 354 | ||||
-rw-r--r-- | src/mame/includes/amiga.h | 1 | ||||
-rw-r--r-- | src/mame/video/amigaaga.c | 92 |
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 */ |