digdug wip - fix some button issues

This commit is contained in:
dinkc64 2015-07-27 21:13:04 +00:00
parent 70ecb4fb36
commit 3fedb0b71d
1 changed files with 59 additions and 75 deletions

View File

@ -1,8 +1,5 @@
// Galaga & Dig-Dug driver for FB Alpha, based on the MAME driver by Nicola Salmoria & previous work by Martin Scragg, Mirko Buffoni, Aaron Giles
//
// Todo:
// Issue with highscore name entry, yet. related to fire button handling.
// Dig Dug added July 27, 2015
#include "tiles_generic.h"
#include "z80_intf.h"
@ -16,7 +13,6 @@ static UINT8 DrvInputPort1r[8] = {0, 0, 0, 0, 0, 0, 0, 0};
static UINT8 DrvInputPort2r[8] = {0, 0, 0, 0, 0, 0, 0, 0};
static UINT8 DrvDip[3] = {0, 0, 0};
static UINT8 DrvInput[3] = {0x00, 0x00, 0x00};
static UINT8 DrvInputr[3] = {0x00, 0x00, 0x00};
static UINT8 DrvReset = 0;
static UINT8 *Mem = NULL;
@ -47,8 +43,8 @@ static UINT8 DrvCPU2Halt;
static UINT8 DrvCPU3Halt;
static UINT8 DrvFlipScreen;
static UINT8 DrvStarControl[6];
static UINT32 DrvStarScrollX;
static UINT32 DrvStarScrollY;
static UINT32 DrvStarScrollX;
static UINT32 DrvStarScrollY;
static UINT8 IOChipCustomCommand;
static UINT8 IOChipCPU1FireIRQ;
@ -62,17 +58,14 @@ static UINT8 PrevInValue;
static INT32 Fetch = 0;
static INT32 FetchMode = 0;
static UINT8 Config1[4], Config2[4], Config3[5];
static INT32 playfield, alphacolor, playenable, playcolor; // digdug
// Dig Dug playfield stuff
static INT32 playfield, alphacolor, playenable, playcolor;
static INT32 digdugmode;
static UINT8 bHasSamples = 0;
static INT32 DrvButtonHold[2] = { 0, 0 };
static INT32 DrvButtonHeld[2] = { 0, 0 };
static INT32 DrvButtonHoldframecnt = 0;
static INT32 nCyclesDone[3], nCyclesTotal[3];
static INT32 nCyclesSegment;
static INT32 DrvButtonHold[2] = { 0, 0 }; // Fire button must be held for 1 frame
static INT32 DrvButtonHeld[2] = { 0, 0 }; // otherwise Dig Dug acts strangely.
static INT32 DrvLastButtons; // State of the last button press
static struct BurnInputInfo DrvInputList[] =
{
@ -571,7 +564,8 @@ static INT32 DrvDoReset()
}
BurnSampleReset();
NamcoSoundReset();
DrvCPU1FireIRQ = 0;
DrvCPU2FireIRQ = 0;
DrvCPU3FireIRQ = 0;
@ -729,9 +723,6 @@ static void Namco54XXWrite(INT32 Data)
}
}
}
static void DrvMakeInputs();
static void makeinputsfirst();
UINT8 __fastcall GalagaZ80ProgRead(UINT16 a)
{
@ -821,8 +812,7 @@ UINT8 __fastcall GalagaZ80ProgRead(UINT16 a)
if (Offset == 1 || Offset == 2) {
INT32 jp = DrvInput[Offset];
makeinputsfirst();
DrvMakeInputs();
if (IOChipMode == 0 && digdugmode) {
/* check directions, according to the following 8-position rule */
/* 0 */
@ -842,7 +832,19 @@ UINT8 __fastcall GalagaZ80ProgRead(UINT16 a)
jp = (jp & ~0x0f) | 0x08;
}
return jp;
INT32 joy = jp & 0x0f;
INT32 in, toggle;
in = ~((jp & 0xf0) >> 4);
toggle = in ^ DrvLastButtons;
DrvLastButtons = (DrvLastButtons & 2) | (in & 1);
/* fire */
joy |= ((toggle & in & 0x01)^1) << 4;
joy |= ((in & 0x01)^1) << 5;
return joy;
}
}
}
@ -1105,7 +1107,7 @@ static void MachineInit()
NamcoSoundInit(18432000 / 6 / 32, 3);
NacmoSoundSetAllRoutes(0.90 * 10.0 / 16.0, BURN_SND_ROUTE_BOTH);
BurnSampleInit(1);
BurnSampleSetAllRoutesAllSamples(0.55, BURN_SND_ROUTE_BOTH);
BurnSampleSetAllRoutesAllSamples(0.35, BURN_SND_ROUTE_BOTH);
bHasSamples = BurnSampleGetStatus(0) != -1;
GenericTilesInit();
@ -1990,31 +1992,31 @@ static INT32 DrvDigdugDraw()
return 0;
}
static UINT32 buttonprev[3] = { 0, 0, 0 };
static void makeinputsfirst() {
static void DrvPreMakeInputs() {
// silly bit of code to keep the joystick button pressed for only 1 frame
// needed for proper pumping action in digdug & highscore name entry.
memcpy(DrvInputPort1r, DrvInputPort1, sizeof(DrvInputPort1r));
memcpy(DrvInputPort2r, DrvInputPort2, sizeof(DrvInputPort2r));
if (digdugmode) {
// memcpy(DrvInputPort1r, DrvInputPort1, sizeof(DrvInputPort1r));
// memcpy(DrvInputPort2r, DrvInputPort2, sizeof(DrvInputPort2r));
DrvInputPort1r[4] = 0;
if(DrvInputPort1[4] && !DrvButtonHeld[0]) {
DrvButtonHold[0] = 3;
DrvButtonHeld[0] = 1;
//bprintf(0, _T("I"));
} else {
if (!DrvInputPort1[4]) {
DrvButtonHeld[0] = 0;
//bprintf(0, _T("O"));
}
}
if(DrvButtonHold[0]) {
DrvButtonHold[0]--;
DrvInputPort1r[4] = ((DrvButtonHold[0]) ? 1 : 0);
} else {
DrvInputPort1r[4] = 0;
{
DrvInputPort1r[4] = 0;
DrvInputPort2r[4] = 0;
for (INT32 i = 0; i < 2; i++) {
if(((!i) ? DrvInputPort1[4] : DrvInputPort2[4]) && !DrvButtonHeld[i]) {
DrvButtonHold[i] = 2; // number of frames to be held + 1.
DrvButtonHeld[i] = 1;
} else {
if (((!i) ? !DrvInputPort1[4] : !DrvInputPort2[4])) {
DrvButtonHeld[i] = 0;
}
}
if(DrvButtonHold[i]) {
DrvButtonHold[i]--;
((!i) ? DrvInputPort1r[4] : DrvInputPort2r[4]) = ((DrvButtonHold[i]) ? 1 : 0);
} else {
(!i) ? DrvInputPort1r[4] : DrvInputPort2r[4] = 0;
}
}
//bprintf(0, _T("%X:%X,"), DrvInputPort1r[4], DrvButtonHold[0]);
}
@ -2033,14 +2035,6 @@ static void DrvMakeInputs()
DrvInput[1] -= (DrvInputPort1r[i] & 1) << i;
DrvInput[2] -= (DrvInputPort2r[i] & 1) << i;
}
for (INT32 i = 1; i < 3; i++) {
DrvInput[i] ^= (-buttonprev[i] ^ DrvInput[i]) & (1 << 5);
}
for (INT32 i = 1; i < 3; i++) {
buttonprev[i] = (DrvInput[i] & 1 << 4)>>4;
}
}
static INT32 DrvFrame()
@ -2048,33 +2042,29 @@ static INT32 DrvFrame()
if (DrvReset) DrvDoReset();
//DrvMakeInputs();
DrvPreMakeInputs();
DrvMakeInputs();
DrvButtonHoldframecnt++;
INT32 nSoundBufferPos = 0;
INT32 nInterleave = 1000;
INT32 nInterleave = 4000;
INT32 nCyclesTotal[3];
nCyclesTotal[0] = (18432000 / 6) / 60;
nCyclesTotal[1] = (18432000 / 6) / 60;
nCyclesTotal[2] = (18432000 / 6) / 60;
nCyclesDone[0] = nCyclesDone[1] = nCyclesDone[2] = 0;
ZetNewFrame();
for (INT32 i = 0; i < nInterleave; i++) {
INT32 nCurrentCPU, nNext;
INT32 nCurrentCPU;
nCurrentCPU = 0;
ZetOpen(nCurrentCPU);
nNext = (i + 1) * nCyclesTotal[nCurrentCPU] / nInterleave;
nCyclesSegment = nNext - nCyclesDone[nCurrentCPU];
nCyclesSegment = ZetRun(nCyclesSegment);
nCyclesDone[nCurrentCPU] += nCyclesSegment;
if (i == (nInterleave * 248 / 256) && DrvCPU1FireIRQ) {
ZetRun(nCyclesTotal[nCurrentCPU] / nInterleave);
if (i == (nInterleave-1 /* * 248 / 256*/) && DrvCPU1FireIRQ) {
ZetSetIRQLine(0, CPU_IRQSTATUS_HOLD);
}
if ((i == 0 || i % (nInterleave / 4) == 0) && IOChipCPU1FireIRQ) {
if ((i % 100==99) && IOChipCPU1FireIRQ) {
ZetNmi();
}
ZetClose();
@ -2082,11 +2072,8 @@ static INT32 DrvFrame()
if (!DrvCPU2Halt) {
nCurrentCPU = 1;
ZetOpen(nCurrentCPU);
nNext = (i + 1) * nCyclesTotal[nCurrentCPU] / nInterleave;
nCyclesSegment = nNext - nCyclesDone[nCurrentCPU];
nCyclesSegment = ZetRun(nCyclesSegment);
nCyclesDone[nCurrentCPU] += nCyclesSegment;
if (i == (nInterleave * 248 / 256) && DrvCPU2FireIRQ) {
ZetRun(nCyclesTotal[nCurrentCPU] / nInterleave);
if (i == (nInterleave-1 /* * 248 / 256*/) && DrvCPU2FireIRQ) {
ZetSetIRQLine(0, CPU_IRQSTATUS_HOLD);
}
ZetClose();
@ -2095,11 +2082,8 @@ static INT32 DrvFrame()
if (!DrvCPU3Halt) {
nCurrentCPU = 2;
ZetOpen(nCurrentCPU);
nNext = (i + 1) * nCyclesTotal[nCurrentCPU] / nInterleave;
nCyclesSegment = nNext - nCyclesDone[nCurrentCPU];
nCyclesSegment = ZetRun(nCyclesSegment);
nCyclesDone[nCurrentCPU] += nCyclesSegment;
if ((i == (nInterleave / 2) || i == (nInterleave * 248 / 256)) && DrvCPU3FireIRQ) {
ZetRun(nCyclesTotal[nCurrentCPU] / nInterleave);
if ((i == (nInterleave / 2)-25 || i == (nInterleave-1-25)) && DrvCPU3FireIRQ) {
ZetNmi();
}
ZetClose();