spacefb: almost perfect

This commit is contained in:
dinkc64 2018-05-12 04:40:34 +00:00
parent b64891b58d
commit f376b60692
1 changed files with 46 additions and 37 deletions

View File

@ -6,6 +6,7 @@
#include "i8039.h" #include "i8039.h"
#include "samples.h" #include "samples.h"
#include "dac.h" #include "dac.h"
#include "resnet.h"
static UINT8 *AllMem; static UINT8 *AllMem;
static UINT8 *MemEnd; static UINT8 *MemEnd;
@ -35,6 +36,9 @@ static UINT8 DrvDips[1];
static UINT8 DrvInputs[3]; static UINT8 DrvInputs[3];
static UINT8 DrvReset; static UINT8 DrvReset;
static double color_weights_rg[3];
static double color_weights_b[2];
static struct BurnInputInfo SpacefbInputList[] = { static struct BurnInputInfo SpacefbInputList[] = {
{"P1 Coin", BIT_DIGITAL, DrvJoy3 + 7, "p1 coin" }, {"P1 Coin", BIT_DIGITAL, DrvJoy3 + 7, "p1 coin" },
{"P1 Start", BIT_DIGITAL, DrvJoy3 + 2, "p1 start" }, {"P1 Start", BIT_DIGITAL, DrvJoy3 + 2, "p1 start" },
@ -127,7 +131,7 @@ static void port1_write(UINT8 data)
soundlatch = data; soundlatch = data;
} }
static void __fastcall spacefb_main_write_port(UINT16 port, UINT8 data) static void __fastcall spacefb_main_write_port(UINT16 port, UINT8 data)
{ {
switch (port & 3) switch (port & 3)
@ -186,7 +190,7 @@ static void __fastcall spacefb_i8035_write_port(UINT32 port, UINT8 data)
switch (port & 0x1ff) switch (port & 0x1ff)
{ {
case I8039_p1: case I8039_p1:
DACSignedWrite(0, data); DACWrite(0, data);
return; return;
} }
} }
@ -207,12 +211,12 @@ static UINT8 __fastcall spacefb_i8035_read_port(UINT32 port)
return 0; return 0;
} }
#if 0
static INT32 DrvSyncDAC() static INT32 DrvSyncDAC()
{ {
return (INT32)(float)(nBurnSoundLen * (I8039TotalCycles() / (730000.0000 / (nBurnFPS / 100.0000)))); return (INT32)(float)(nBurnSoundLen * (I8039TotalCycles() / (400000.0000 / (nBurnFPS / 100.0000))));
} }
#endif
static INT32 DrvDoReset() static INT32 DrvDoReset()
{ {
memset (AllRam, 0, RamEnd - AllRam); memset (AllRam, 0, RamEnd - AllRam);
@ -231,7 +235,17 @@ static INT32 DrvDoReset()
port0_data = 0; port0_data = 0;
port2_data = 0; port2_data = 0;
star_shift_reg = 0x18f89; star_shift_reg = 0x18f89;
{ // init resnet for colors
const INT32 resistances_rg[] = { 1000, 470, 220 };
const INT32 resistances_b [] = { 470, 220 };
compute_resistor_weights(0, 0xff, -1.0,
3, resistances_rg, color_weights_rg, 470, 0,
2, resistances_b, color_weights_b, 470, 0,
0, NULL, NULL, 0, 0);
}
return 0; return 0;
} }
@ -315,7 +329,8 @@ static INT32 DrvInit()
BurnSampleInit(0); BurnSampleInit(0);
BurnSampleSetAllRoutesAllSamples(0.25, BURN_SND_ROUTE_BOTH); BurnSampleSetAllRoutesAllSamples(0.25, BURN_SND_ROUTE_BOTH);
DACInit(0, 0, 1, DrvSyncDAC); DACInit(0, 0, 1, I8039TotalCycles, 400000);
//DACInit(0, 0, 1, DrvSyncDAC); // for gamezfan
DACSetRoute(0, 0.65, BURN_SND_ROUTE_BOTH); DACSetRoute(0, 0.65, BURN_SND_ROUTE_BOTH);
GenericTilesInit(); GenericTilesInit();
@ -360,11 +375,15 @@ static void get_starfield_pens()
UINT8 ra = (((i >> 4) & 0x01) || background_red) && !disable_star_field; UINT8 ra = (((i >> 4) & 0x01) || background_red) && !disable_star_field;
UINT8 rb = ((i >> 5) & 0x01) && color_contrast_r && !disable_star_field; UINT8 rb = ((i >> 5) & 0x01) && color_contrast_r && !disable_star_field;
UINT32 r = ra * 1000 + rb * 470 + 0 * 220; //UINT32 r = ra * 1000 + rb * 470 + 0 * 220;
UINT32 g = ga * 1000 + gb * 470 + 0 * 220; //UINT32 g = ga * 1000 + gb * 470 + 0 * 220;
UINT32 b = ba * 470 + bb * 220; //UINT32 b = ba * 470 + bb * 220;
UINT8 r = combine_3_weights(color_weights_rg, 0, rb, ra);
UINT8 g = combine_3_weights(color_weights_rg, 0, gb, ga);
UINT8 b = combine_2_weights(color_weights_b, bb, ba);
DrvPalette[i] = BurnHighCol((r * 255) / 1690, (g * 255) / 1690, (b * 255) / 690, 0); DrvPalette[i] = BurnHighCol(r, g, b, 0);
//DrvPalette[i] = BurnHighCol((r * 255) / 1690, (g * 255) / 1690, (b * 255) / 690, 0);
} }
} }
@ -387,9 +406,12 @@ static void get_sprite_pens()
UINT8 b1 = (data >> 6) & 0x01; UINT8 b1 = (data >> 6) & 0x01;
UINT8 b2 = (data >> 7) & 0x01; UINT8 b2 = (data >> 7) & 0x01;
UINT32 r = r2 * 1000 + r1 * 470 + r0 * 220; //UINT32 r = r2 * 1000 + r1 * 470 + r0 * 220;
UINT32 g = g2 * 1000 + g1 * 470 + g0 * 220; //UINT32 g = g2 * 1000 + g1 * 470 + g0 * 220;
UINT32 b = b2 * 470 + b1 * 220; //UINT32 b = b2 * 470 + b1 * 220;
UINT8 r = combine_3_weights(color_weights_rg, r0, r1, r2);
UINT8 g = combine_3_weights(color_weights_rg, g0, g1, g2);
UINT8 b = combine_2_weights(color_weights_b, b1, b2);
if (i >> 4) if (i >> 4)
{ {
@ -400,7 +422,8 @@ static void get_sprite_pens()
b = (UINT8)((b / fade_weight) + 0.5); b = (UINT8)((b / fade_weight) + 0.5);
} }
DrvPalette[i + 0x40] = BurnHighCol((r * 255) / 1690, (g * 255) / 1690, (b * 255) / 690, 0); DrvPalette[i + 0x40] = BurnHighCol(r, g, b, 0);
//DrvPalette[i + 0x40] = BurnHighCol((r * 255) / 1690, (g * 255) / 1690, (b * 255) / 690, 0);
} }
} }
@ -411,9 +434,8 @@ static inline void shift_star_generator()
static void draw_starfield() static void draw_starfield()
{ {
// if (cliprect.min_y == screen.visible_area().min_y)
{ {
INT32 clock_count = 512 * 15; // ? or 16) - 1? INT32 clock_count = 0x200 * 0x10 - 1;
for (INT32 i = 0; i < clock_count; i++) for (INT32 i = 0; i < clock_count; i++)
shift_star_generator(); shift_star_generator();
@ -441,9 +463,8 @@ static void draw_starfield()
} }
} }
// if (cliprect.max_y == screen.visible_area().max_y)
{ {
INT32 clock_count = 512 * 16; INT32 clock_count = 0x200 * (0x100 - 0xf0);
for (INT32 i = 0; i < clock_count; i++) for (INT32 i = 0; i < clock_count; i++)
shift_star_generator(); shift_star_generator();
@ -610,42 +631,30 @@ static INT32 DrvFrame()
} }
} }
INT32 nInterleave = 10; INT32 nInterleave = 256;
INT32 nCyclesTotal[2] = { 3000000 / 60, 400000 / 60 }; INT32 nCyclesTotal[2] = { 3000000 / 60, 400000 / 60 };
INT32 nCyclesDone[2] = { 0, 0 }; INT32 nCyclesDone[2] = { 0, 0 };
INT32 nSoundBufferPos = 0;
ZetOpen(0); ZetOpen(0);
for (INT32 i = 0; i < nInterleave; i++) for (INT32 i = 0; i < nInterleave; i++)
{ {
nCyclesDone[0] += ZetRun(nCyclesTotal[0] / nInterleave); nCyclesDone[0] += ZetRun(((i + 1) * nCyclesTotal[0] / nInterleave) - nCyclesDone[0]);
if (i == 4) { if (i == 128) {
ZetSetVector(0xd7); ZetSetVector(0xd7);
ZetSetIRQLine(0, CPU_IRQSTATUS_HOLD); ZetSetIRQLine(0, CPU_IRQSTATUS_HOLD);
} }
if (i == 9) { if (i == 240) {
ZetSetVector(0xcf); ZetSetVector(0xcf);
ZetSetIRQLine(0, CPU_IRQSTATUS_HOLD); ZetSetIRQLine(0, CPU_IRQSTATUS_HOLD);
} }
nCyclesDone[1] += I8039Run(nCyclesTotal[1] / nInterleave); nCyclesDone[1] += I8039Run(((i + 1) * nCyclesTotal[1] / nInterleave) - nCyclesDone[1]);
if (pBurnSoundOut) {
INT32 nSegmentLength = nBurnSoundLen / nInterleave;
INT16* pSoundBuf = pBurnSoundOut + (nSoundBufferPos << 1);
BurnSampleRender(pSoundBuf, nSegmentLength);
nSoundBufferPos += nSegmentLength;
}
} }
if (pBurnSoundOut) { if (pBurnSoundOut) {
INT32 nSegmentLength = nBurnSoundLen - nSoundBufferPos; BurnSampleRender(pBurnSoundOut, nBurnSoundLen);
INT16* pSoundBuf = pBurnSoundOut + (nSoundBufferPos << 1);
if (nSegmentLength) {
BurnSampleRender(pSoundBuf, nSegmentLength);
}
DACUpdate(pBurnSoundOut, nBurnSoundLen); DACUpdate(pBurnSoundOut, nBurnSoundLen);
} }