gyruss wip

This commit is contained in:
dinkc64 2015-02-09 15:17:33 +00:00
parent a17ebafd4e
commit ef96e30179
1 changed files with 78 additions and 18 deletions

View File

@ -10,6 +10,7 @@
#include "i8039.h"
#include "driver.h"
#include "flt_rc.h"
#include "dac.h"
extern "C" {
#include "ay8910.h"
}
@ -438,7 +439,8 @@ void __fastcall gyruss_sound0_out(UINT16 port, UINT8 data)
AY8910Write(4, 1, data);
return;
case 0x14: // clear i8039 irq
case 0x14:
I8039SetIrqState(1);
return;
case 0x18:
@ -457,6 +459,41 @@ UINT8 AY8910_3_portA(UINT32)
return gyruss_timer[(ZetTotalCycles() / 1024) % 10];
}
static UINT8 __fastcall gyruss_i8039_read(UINT32 address)
{
return DrvI8039ROM[address & 0x0fff];
}
static void __fastcall gyruss_i8039_write_port(UINT32 port, UINT8 data)
{
switch (port & 0x1ff)
{
case I8039_p1:
DACWrite(0, data);
return;
case I8039_p2:
I8039SetIrqState(0);
return;
}
}
static UINT8 __fastcall gyruss_i8039_read_port(UINT32 port)
{
if ((port & 0x1ff) < 0x100) {
return *soundlatch2;
}
return 0;
}
static INT32 DrvSyncDAC()
{
return (INT32)(float)(nBurnSoundLen * (ZetTotalCycles() / (3579545.0000 / (nBurnFPS / 100.0000))));
}
static INT32 MemIndex()
{
UINT8 *Next; Next = AllMem;
@ -623,6 +660,10 @@ static INT32 DrvDoReset()
ZetReset();
ZetClose();
I8039Reset();
DACReset();
AY8910Reset(0);
AY8910Reset(1);
AY8910Reset(2);
@ -711,12 +752,22 @@ static INT32 DrvInit()
ZetSetInHandler(gyruss_sound0_in);
ZetClose();
I8039Init(NULL);
I8039SetProgramReadHandler(gyruss_i8039_read);
I8039SetCPUOpReadHandler(gyruss_i8039_read);
I8039SetCPUOpReadArgHandler(gyruss_i8039_read);
I8039SetIOReadHandler(gyruss_i8039_read_port);
I8039SetIOWriteHandler(gyruss_i8039_write_port);
DACInit(0, 0, 1, DrvSyncDAC);
DACSetRoute(0, 0.15, BURN_SND_ROUTE_BOTH);
// don't bother with i8039 right now, descrete sounds not emulated
AY8910Init(0, 1789773, nBurnSoundRate, NULL, NULL, NULL, &AY8910_0_portBwrite);
AY8910Init(1, 1789773, nBurnSoundRate, NULL, NULL, NULL, &AY8910_1_portBwrite);
AY8910Init(2, 1789773, nBurnSoundRate, AY8910_3_portA, NULL, NULL, NULL);
AY8910Init(3, 1789773, nBurnSoundRate, NULL, NULL, NULL, NULL);
AY8910Init(4, 1789773, nBurnSoundRate, NULL, NULL, NULL, NULL);
AY8910Init(0, 1789750, nBurnSoundRate, NULL, NULL, NULL, &AY8910_0_portBwrite);
AY8910Init(1, 1789750, nBurnSoundRate, NULL, NULL, NULL, &AY8910_1_portBwrite);
AY8910Init(2, 1789750, nBurnSoundRate, AY8910_3_portA, NULL, NULL, NULL);
AY8910Init(3, 1789750, nBurnSoundRate, NULL, NULL, NULL, NULL);
AY8910Init(4, 1789750, nBurnSoundRate, NULL, NULL, NULL, NULL);
AY8910SetAllRoutes(0, 0.25, BURN_SND_ROUTE_BOTH);
AY8910SetAllRoutes(1, 0.25, BURN_SND_ROUTE_BOTH);
AY8910SetAllRoutes(2, 0.25, BURN_SND_ROUTE_BOTH);
@ -732,20 +783,20 @@ static INT32 DrvInit()
filter_rc_init(6, FLT_RC_HIGHPASS, 1000, 100, 0, CAP_P(0), 1); //CAP_P(100000), 1); // master out
filter_rc_init(7, FLT_RC_HIGHPASS, 1000, 100, 0, CAP_P(0), 1); //CAP_P(100000), 1); // master out
filter_rc_set_src_gain(0, 0.25);
filter_rc_set_src_gain(1, 0.25);
filter_rc_set_src_gain(2, 0.25);
filter_rc_set_src_gain(3, 0.25);
filter_rc_set_src_gain(4, 0.25);
filter_rc_set_src_gain(5, 0.25);
filter_rc_set_src_gain(0, 0.40);
filter_rc_set_src_gain(1, 0.70);
filter_rc_set_src_gain(2, 0.70);
filter_rc_set_src_gain(3, 0.40);
filter_rc_set_src_gain(4, 0.70);
filter_rc_set_src_gain(5, 0.70);
filter_rc_set_src_gain(6, 1.00);
filter_rc_set_src_gain(7, 1.00);
filter_rc_set_route(0, 0.25, BURN_SND_ROUTE_LEFT);
filter_rc_set_route(1, 0.25, BURN_SND_ROUTE_RIGHT);
filter_rc_set_route(2, 0.25, BURN_SND_ROUTE_LEFT);
filter_rc_set_route(0, 0.25, BURN_SND_ROUTE_LEFT );
filter_rc_set_route(1, 0.25, BURN_SND_ROUTE_LEFT );
filter_rc_set_route(2, 0.25, BURN_SND_ROUTE_LEFT );
filter_rc_set_route(3, 0.25, BURN_SND_ROUTE_RIGHT);
filter_rc_set_route(4, 0.25, BURN_SND_ROUTE_LEFT);
filter_rc_set_route(4, 0.25, BURN_SND_ROUTE_RIGHT);
filter_rc_set_route(5, 0.25, BURN_SND_ROUTE_RIGHT);
filter_rc_set_route(6, 0.25, BURN_SND_ROUTE_LEFT); // master out l
filter_rc_set_route(7, 0.25, BURN_SND_ROUTE_RIGHT); // master out r
@ -763,6 +814,10 @@ static INT32 DrvExit()
ZetExit();
M6809Exit();
I8039Exit();
DACExit();
AY8910Exit(0);
AY8910Exit(1);
AY8910Exit(2);
@ -896,10 +951,11 @@ static INT32 DrvFrame()
}
ZetNewFrame();
I8039NewFrame();
INT32 nCyclesSegment;
INT32 nInterleave = 256;
INT32 nCyclesTotal[4] = { 3072000 / 60, 2000000 / 60, 3579545 / 60, 8000000 / 60 };
INT32 nCyclesTotal[4] = { 3072000 / 60, 2000000 / 60, 3579545 / 60, 8000000 / 15 / 60 };
INT32 nCyclesDone[4] = { 0, 0, 0, 0 };
INT32 nSoundBufferPos = 0;
@ -933,7 +989,10 @@ static INT32 DrvFrame()
nNext = (i + 1) * nCyclesTotal[2] / nInterleave;
nCyclesSegment = nNext - nCyclesDone[2];
nCyclesDone[2] += ZetRun(nCyclesSegment);
ZetClose();
nNext = (nCyclesTotal[3] * (i + 1)) / nInterleave;
nCyclesDone[3] += I8039Run(nNext - nCyclesDone[3]);
ZetClose(); // after I8039Run() for DrvSyncDac()!
if (scanline >= 16 && scanline < 240) {
draw_sprites(scanline);
@ -999,6 +1058,7 @@ static INT32 DrvFrame()
filter_rc_update(7, pAY8910Buffer[13], pSoundBuf, nSegmentLength);
filter_rc_update(6, pAY8910Buffer[14], pSoundBuf, nSegmentLength);
}
DACUpdate(pBurnSoundOut, nBurnSoundLen);
}
if (pBurnDraw) {