Cps2Turbo: add missing y-lines to sfz3mix, add asspect ratio DIP

This commit is contained in:
dinkc64 2023-12-04 09:29:40 -05:00
parent d068ff4e18
commit aa33827302
9 changed files with 113 additions and 26 deletions

View File

@ -2356,7 +2356,9 @@ INT32 CpsExit()
nCpsNumScanlines = 262;
nCpsScreenWidth = 384;
nCpsScreenHeight = 224;
nCpsGlobalXOffset = 0;
nCpsGlobalYOffset = 0;
if (Cps2Turbo) {
BurnSampleExit();

View File

@ -316,7 +316,9 @@ extern INT32 Cps1OverrideLayers;
extern INT32 nCps1Layers[4];
extern INT32 nCps1LayerOffs[3];
extern INT32 nCpsScreenWidth;
extern INT32 nCpsScreenHeight;
extern INT32 nCpsGlobalXOffset;
extern INT32 nCpsGlobalYOffset;
void DrawFnInit();
INT32 CpsDraw();
INT32 CpsRedraw();
@ -447,7 +449,7 @@ struct CpsrLineInfo {
INT16 Rows[16]; // 16 row scroll values for this line
INT32 nMaxLeft, nMaxRight; // Maximum row shifts left and right
};
extern struct CpsrLineInfo CpsrLineInfo[15];
extern struct CpsrLineInfo CpsrLineInfo[16];
INT32 Cps1rPrepare();
INT32 Cps2rPrepare();
@ -528,3 +530,4 @@ extern UINT16 Cps2VolumeStates[40];
extern INT32 Cps2DisableDigitalVolume;
extern UINT8 Cps2VolUp;
extern UINT8 Cps2VolDwn;
extern UINT8 AspectDIP;

View File

@ -12,7 +12,9 @@ INT32 CpsLayEn[6] = {0, 0, 0, 0, 0, 0}; // bits for layer enable
INT32 MaskAddr[4] = {0, 0, 0, 0};
INT32 nCpsScreenWidth = 384;
INT32 nCpsScreenHeight = 224;
INT32 nCpsGlobalXOffset = 0;
INT32 nCpsGlobalYOffset = 0;
INT32 CpsLayer1XOffs = 0;
INT32 CpsLayer2XOffs = 0;
@ -83,7 +85,7 @@ static INT32 DrawScroll1(INT32 i)
// bprintf(PRINT_NORMAL, _T("1 %x, %x, %x\n"), nOff, nScrX, nScrY);
nScrX += CpsLayer1XOffs;
nScrY += 0x10;
nScrY += 0x10 - nCpsGlobalYOffset;
nScrY += CpsLayer1YOffs;
nOff <<= 8;
nOff &= 0xffc000;
@ -121,7 +123,7 @@ static INT32 DrawScroll2Init(INT32 i)
nCpsrScrX += CpsLayer2XOffs;
nCpsrScrX &= 0x03FF;
nCpsrScrY += 0x10;
nCpsrScrY += 0x10 - nCpsGlobalYOffset;
nCpsrScrY += CpsLayer2YOffs;
nCpsrScrY &= 0x03FF;
@ -191,7 +193,7 @@ static INT32 DrawScroll3(INT32 i)
// bprintf(PRINT_NORMAL, _T("3 %x, %x, %x\n"), nOff, nScrX, nScrY);
nScrX += CpsLayer3XOffs;
nScrY += 0x10;
nScrY += 0x10 - nCpsGlobalYOffset;
nScrY += CpsLayer3YOffs;
nOff <<= 8;
@ -400,7 +402,7 @@ static void Cps2Layers()
nStartline = nRasterline[nSlice];
nEndline = nRasterline[nSlice + 1];
if (!nEndline) {
nEndline = 224;
nEndline = nCpsScreenHeight;
}
// Render layer
@ -489,7 +491,7 @@ void CpsClearScreen()
}
}
} else {
memset(pBurnDraw, 0, nCpsScreenWidth * 224 * nBurnBpp);
memset(pBurnDraw, 0, nCpsScreenWidth * nCpsScreenHeight * nBurnBpp);
}
}

View File

@ -39,7 +39,7 @@ static INT32 CpsMemIndex()
CpsRam708 = Next; Next += 0x010000; // Obj Ram
CpsFrg = Next; Next += 0x000010; // 'Four' Registers (Registers at 0x400000)
ZBuf = (UINT16*)Next; Next += nCpsScreenWidth * 224 * 2; // Sprite Masking Z buffer
ZBuf = (UINT16*)Next; Next += nCpsScreenWidth * nCpsScreenHeight * 2; // Sprite Masking Z buffer
CpsSaveRegData = Next; Next += 0x0100 * (MAX_RASTER + 1); // Draw Copy of registers
CpsSaveFrgData = Next; Next += 0x0010 * (MAX_RASTER + 1); // Draw Copy of 'Four' Registers

View File

@ -123,7 +123,7 @@ INT32 CpsObjInit()
nGetNext=0;
if (Cps == 2) {
memset(ZBuf, 0, nCpsScreenWidth * 224 * 2);
memset(ZBuf, 0, nCpsScreenWidth * nCpsScreenHeight * 2);
nMaxZMask = nZOffset = 0;
nMaxZValue = 1;
}
@ -180,7 +180,7 @@ INT32 CpsObjGet()
pof->nShiftX = (-CpsSaveFrg[0][0x9]) + nCpsGlobalXOffset;
// bprintf(0, _T("shift-x %d\n"), pof->nShiftX);
pof->nShiftY = -CpsSaveFrg[0][0xB];
pof->nShiftY = (-CpsSaveFrg[0][0xB]) + nCpsGlobalYOffset;
} else {
INT32 nOff = BURN_ENDIAN_SWAP_INT16(*((UINT16*)(CpsReg + 0x00))) << 8;
nOff &= 0xfff800;
@ -240,7 +240,7 @@ void CpsObjDrawInit()
if (nZOffset >= 0xFC00) {
// The Z buffer might moverflow the next fram, so initialise it
memset(ZBuf, 0, nCpsScreenWidth * 224 * 2);
memset(ZBuf, 0, nCpsScreenWidth * nCpsScreenHeight * 2);
nZOffset = 0;
}
@ -300,7 +300,7 @@ INT32 Cps1ObjDraw(INT32 nLevelFrom,INT32 nLevelTo)
nFlip=(a>>5)&3;
// Take care with tiles if the sprite goes off the screen
if (x<0 || y<0 || x+(bx<<4)>nCpsScreenWidth || y+(by<<4)>224) {
if (x<0 || y<0 || x+(bx<<4)>nCpsScreenWidth || y+(by<<4)>nCpsScreenHeight) {
nCpstType=CTT_16X16 | CTT_CARE;
} else {
nCpstType=CTT_16X16;
@ -432,7 +432,7 @@ INT32 Cps2ObjDraw(INT32 nLevelFrom, INT32 nLevelTo)
by = ((a >> 12) & 15) + 1;
// Take care with tiles if the sprite goes off the screen
if (x < 0 || y < 0 || x + (bx << 4) > (nCpsScreenWidth-1) || y + (by << 4) > 223) {
if (x < 0 || y < 0 || x + (bx << 4) > (nCpsScreenWidth-1) || y + (by << 4) > (nCpsScreenHeight-1)) {
nCpstType = CTT_16X16 | CTT_CARE;
} else {
nCpstType = CTT_16X16;
@ -857,7 +857,7 @@ INT32 FcrashObjDraw(INT32 nLevelFrom,INT32 nLevelTo)
nFlip=(a>>5)&3;
// Take care with tiles if the sprite goes off the screen
if (x<0 || y<0 || x+(1<<4)>nCpsScreenWidth || y+(1<<4)>224) {
if (x<0 || y<0 || x+(1<<4)>nCpsScreenWidth || y+(1<<4)>nCpsScreenHeight) {
nCpstType=CTT_16X16 | CTT_CARE;
} else {
nCpstType=CTT_16X16;

View File

@ -22,6 +22,8 @@ INT32 Cps1VBlankIRQLine = 2;
INT32 Cps1DrawAtVblank = 0;
static UINT8 AspectDIPLast = 0;
CpsRunInitCallback CpsRunInitCallbackFunction = NULL;
CpsRunInitCallback CpsRunExitCallbackFunction = NULL;
CpsRunResetCallback CpsRunResetCallbackFunction = NULL;
@ -43,6 +45,23 @@ static void CpsQSoundCheatSearchCallback()
}
}
static void check_aspect()
{
if (Cps2Turbo && (AspectDIP & 0x03) != AspectDIPLast) {
INT32 aspects[3][2] = { { 16, 9 }, { 4, 3 }, { 112, 81 } };
AspectDIPLast = AspectDIP & 0x03;
INT32 nAspectX, nAspectY;
BurnDrvGetAspect(&nAspectX, &nAspectY);
if (nAspectX != aspects[AspectDIPLast][0] || nAspectY != aspects[AspectDIPLast][1]) {
bprintf(0, _T("* CPS-2: Changing to %d:%d aspect\n"), aspects[AspectDIPLast][0], aspects[AspectDIPLast][1]);
BurnDrvSetAspect(aspects[AspectDIPLast][0], aspects[AspectDIPLast][1]);
Reinitialise();
}
}
}
static INT32 DrvReset()
{
// Reset machine
@ -70,7 +89,6 @@ static INT32 DrvReset()
SekClose();
}
nCpsCyclesExtra = 0;
if (((Cps == 2) && !Cps2DisableQSnd) || Cps1Qs == 1) { // Sound init (QSound)
@ -80,7 +98,12 @@ static INT32 DrvReset()
if (CpsRunResetCallbackFunction) {
CpsRunResetCallbackFunction();
}
if (Cps2Turbo) {
AspectDIPLast = 0xff;
check_aspect();
}
HiscoreReset();
return 0;
@ -387,6 +410,10 @@ INT32 Cps2Frame()
DrvReset();
}
if (Cps2Turbo) {
check_aspect();
}
// extern INT32 prevline;
// prevline = -1;

View File

@ -9,7 +9,7 @@ int nCpsrRowStart=0; // Start of row scroll (can wrap?)
static INT32 nShiftY=0;
static INT32 EndLineInfo=0;
struct CpsrLineInfo CpsrLineInfo[15];
struct CpsrLineInfo CpsrLineInfo[16]; // +1 added for Cps2Turbo
static void GetRowsRange(INT32 *pnStart,INT32 *pnWidth,INT32 nRowFrom,INT32 nRowTo)
{

View File

@ -37,10 +37,10 @@ static INT32 CpstOne()
if (nCpstX <= -nSize) return 0;
if (nCpstX >= nCpsScreenWidth) return 0;
if (nCpstY <= -nSize) return 0;
if (nCpstY >= 224) return 0;
if (nCpstY >= nCpsScreenHeight) return 0;
}
nCtvRollX=(0x40000000 + nCpsScreenWidth - 1) + nCpstX * 0x7fff;
nCtvRollY=0x400000df + nCpstY * 0x7fff;
nCtvRollY=(0x40000000 + nCpsScreenHeight - 1) + nCpstY * 0x7fff;
}
// Clip to loaded graphics data (we have a gap of 0x200 at the end)
@ -78,11 +78,10 @@ static INT32 CpstOneBgHi()
if (nCpstX<=-nSize) return 0;
if (nCpstX>=nCpsScreenWidth) return 0;
if (nCpstY<=-nSize) return 0;
if (nCpstY>=224) return 0;
if (nCpstY>=nCpsScreenHeight) return 0;
}
nCtvRollX=(0x40000000 + nCpsScreenWidth - 1) + nCpstX * 0x7fff;
// nCtvRollX=0x4000017f + nCpstX * 0x7fff;
nCtvRollY=0x400000df + nCpstY * 0x7fff;
nCtvRollY=(0x40000000 + nCpsScreenHeight - 1) + nCpstY * 0x7fff;
}
// Clip to loaded graphics data (we have a gap of 0x200 at the end)
@ -164,10 +163,10 @@ static INT32 CpstOneObjZ()
if (nCpstX <= -nSize) return 0;
if (nCpstX >= nCpsScreenWidth) return 0;
if (nCpstY <= -nSize) return 0;
if (nCpstY >= 224) return 0;
if (nCpstY >= nCpsScreenHeight) return 0;
}
nCtvRollX=(0x40000000 + nCpsScreenWidth - 1) + nCpstX * 0x7fff;
nCtvRollY=0x400000df + nCpstY * 0x7fff;
nCtvRollY=(0x40000000 + nCpsScreenHeight - 1) + nCpstY * 0x7fff;
}

View File

@ -4,6 +4,7 @@ INT32 Cps2Volume = 39;
INT32 Cps2DisableDigitalVolume = 0;
UINT8 Cps2VolUp;
UINT8 Cps2VolDwn;
UINT8 AspectDIP; // only for Cps2Turbo == 1
UINT16 Cps2VolumeStates[40] = {
0xf010, 0xf008, 0xf004, 0xf002, 0xf001, 0xe810, 0xe808, 0xe804, 0xe802, 0xe801,
@ -50,6 +51,57 @@ static struct BurnInputInfo Cps2FightingInputList[] = {
STDINPUTINFO(Cps2Fighting)
static struct BurnInputInfo Sfz3mixInputList[] = {
{"P1 Coin" , BIT_DIGITAL , CpsInp020+4, "p1 coin" },
{"P1 Start" , BIT_DIGITAL , CpsInp020+0, "p1 start" },
{"P1 Up" , BIT_DIGITAL , CpsInp001+3, "p1 up" },
{"P1 Down" , BIT_DIGITAL , CpsInp001+2, "p1 down" },
{"P1 Left" , BIT_DIGITAL , CpsInp001+1, "p1 left" },
{"P1 Right" , BIT_DIGITAL , CpsInp001+0, "p1 right" },
{"P1 Weak Punch" , BIT_DIGITAL , CpsInp001+4, "p1 fire 1" },
{"P1 Medium Punch" , BIT_DIGITAL , CpsInp001+5, "p1 fire 2" },
{"P1 Strong Punch" , BIT_DIGITAL , CpsInp001+6, "p1 fire 3" },
{"P1 Weak Kick" , BIT_DIGITAL , CpsInp011+0, "p1 fire 4" },
{"P1 Medium Kick" , BIT_DIGITAL , CpsInp011+1, "p1 fire 5" },
{"P1 Strong Kick" , BIT_DIGITAL , CpsInp011+2, "p1 fire 6" },
{"P2 Coin" , BIT_DIGITAL , CpsInp020+5, "p2 coin" },
{"P2 Start" , BIT_DIGITAL , CpsInp020+1, "p2 start" },
{"P2 Up" , BIT_DIGITAL , CpsInp000+3, "p2 up" },
{"P2 Down" , BIT_DIGITAL , CpsInp000+2, "p2 down" },
{"P2 Left" , BIT_DIGITAL , CpsInp000+1, "p2 left" },
{"P2 Right" , BIT_DIGITAL , CpsInp000+0, "p2 right" },
{"P2 Weak Punch" , BIT_DIGITAL , CpsInp000+4, "p2 fire 1" },
{"P2 Medium Punch" , BIT_DIGITAL , CpsInp000+5, "p2 fire 2" },
{"P2 Strong Punch" , BIT_DIGITAL , CpsInp000+6, "p2 fire 3" },
{"P2 Weak Kick" , BIT_DIGITAL , CpsInp011+4, "p2 fire 4" },
{"P2 Medium Kick" , BIT_DIGITAL , CpsInp011+5, "p2 fire 5" },
{"P2 Strong Kick" , BIT_DIGITAL , CpsInp020+6, "p2 fire 6" },
{"Reset" , BIT_DIGITAL , &CpsReset , "reset" },
{"Diagnostic" , BIT_DIGITAL , CpsInp021+1, "diag" },
{"Service" , BIT_DIGITAL , CpsInp021+2, "service" },
{"Volume Up" , BIT_DIGITAL , &Cps2VolUp , "p1 fire 7" },
{"Volume Down" , BIT_DIGITAL , &Cps2VolDwn, "p1 fire 8" },
{"Dip A" , BIT_DIPSWITCH, &AspectDIP , "dip" },
};
STDINPUTINFO(Sfz3mix)
// sfz3miz 0.20+ only!
static struct BurnDIPInfo Sfz3mixDIPList[] =
{
DIP_OFFSET(0x1d)
{0x00, 0xff, 0xff, 0x00, NULL },
{0 , 0xfe, 0 , 3, "Aspect Ratio" },
{0x00, 0x01, 0x03, 0x00, "16:9" },
{0x00, 0x01, 0x03, 0x01, "4:3" },
{0x00, 0x01, 0x03, 0x02, "112:81" },
};
STDDIPINFO(Sfz3mix)
static struct BurnInputInfo NineXXInputList[] = {
{"P1 Coin" , BIT_DIGITAL , CpsInp020+4, "p1 coin" },
{"P1 Start" , BIT_DIGITAL , CpsInp020+0, "p1 start" },
@ -11528,7 +11580,9 @@ static INT32 Cps2TurboInit()
}
nCpsScreenWidth = 416;
nCpsScreenHeight = 234;
nCpsGlobalXOffset = 16;
nCpsGlobalYOffset = 5;
return Cps2Init();
}
@ -11538,9 +11592,9 @@ struct BurnDriver BurnDrvCpsSfz3mix = {
"Street Fighter Zero 3 Mix v0.22\0", NULL, "hack", "CPS2",
NULL, NULL, NULL, NULL,
BDF_GAME_WORKING | BDF_CLONE | BDF_HACK | BDF_HISCORE_SUPPORTED, 2, HARDWARE_CAPCOM_CPS2, GBF_VSFIGHT, FBF_SF,
NULL, Sfz3mixRomInfo, Sfz3mixRomName, NULL, NULL, Sfz3mixSampleInfo, Sfz3mixSampleName, Cps2FightingInputInfo, NULL,
NULL, Sfz3mixRomInfo, Sfz3mixRomName, NULL, NULL, Sfz3mixSampleInfo, Sfz3mixSampleName, Sfz3mixInputInfo, Sfz3mixDIPInfo,
Cps2TurboInit, DrvExit, Cps2Frame, CpsRedraw, CpsAreaScan,
&CpsRecalcPal, 0x1000, 416, 224, 16, 9
&CpsRecalcPal, 0x1000, 416, 234, 16, 9
};
struct BurnDriver BurnDrvCpsSfz3mix13 = {
@ -14651,7 +14705,7 @@ struct BurnDriver BurnDrvCpsGigaman2 = {
};
// Dungeons & Dragons - shadow over mystara (T-Chi)
// Modified by ¥Õ¥§¥Ë¥Ã¥¯¥¹
// Modified by ¥Õ¥§¥Ë¥Ã¥¯¥¹
static struct BurnRomInfo DdsomjcRomDesc[] = {
{ "dd2jc.03g", 0x080000, 0xed73e646, CPS2_PRG_68K | BRF_ESS | BRF_PRG },
{ "dd2jc.04g", 0x080000, 0xc5a6e4b5, CPS2_PRG_68K | BRF_ESS | BRF_PRG },