Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Sérgio Benjamim 2017-04-19 23:27:28 -03:00
commit 71065f83bb
23 changed files with 776 additions and 260 deletions

4
.gitignore vendored
View File

@ -1,3 +1,7 @@
.vs/
Debug/
Release/
psp2/*.o psp2/*.o
psp2/*.elf psp2/*.elf
psp2/*.velf psp2/*.velf

View File

@ -70,6 +70,7 @@ Genesis Plus GX 1.7.5 (xx/xx/xxxx) (Eke-Eke)
[Core/SG] [Core/SG]
--------------- ---------------
* added support for new SMS Power Korean dumps (Star Soldier & Pippols)
* added support for SG-1000 II clone hardware (2KB RAM + integrated VDP/PSG chip 315-5066) * added support for SG-1000 II clone hardware (2KB RAM + integrated VDP/PSG chip 315-5066)
* fixed SG-1000 internal RAM size (1KB instead of 2KB) * fixed SG-1000 internal RAM size (1KB instead of 2KB)
* restored SG-1000 Pause button support * restored SG-1000 Pause button support
@ -77,6 +78,7 @@ Genesis Plus GX 1.7.5 (xx/xx/xxxx) (Eke-Eke)
[Core/CPU] [Core/CPU]
--------------- ---------------
* improved 68k auto-vectored interrupts acknowledge cycle timing accuracy (Bubsy background color corruption during cutscenes) * improved 68k auto-vectored interrupts acknowledge cycle timing accuracy (Bubsy background color corruption during cutscenes)
* fixed 68k undocumented behaviors for ABCD/SBCD/NBCD instructions (thanks to flamewing for his test ROM)
* fixed Z80 interrupt duration (Bomb on Basic City music running too fast) * fixed Z80 interrupt duration (Bomb on Basic City music running too fast)
* fixed Z80 SP register initialization on power-on for Master System & Game Gear * fixed Z80 SP register initialization on power-on for Master System & Game Gear
(Ace of Aces, Shadow Dancer, Ecco the Dolphin, Evander Holyfield Real Deal Boxing) (Ace of Aces, Shadow Dancer, Ecco the Dolphin, Evander Holyfield Real Deal Boxing)
@ -117,6 +119,10 @@ Genesis Plus GX 1.7.5 (xx/xx/xxxx) (Eke-Eke)
--------------- ---------------
* rewrote optimized & more accurate PSG core from scratch * rewrote optimized & more accurate PSG core from scratch
* removed PSG boost noise feature & added optional high-quality PSG resampling * removed PSG boost noise feature & added optional high-quality PSG resampling
* fixed YM2612 self-feedback regression introduced in 1.7.1
* fixed YM2612 one-sample extra delay on operator1 output
* fixed YM2612 LFO PM implementation: block & keyscale code should not be modified by LFO (verified on YM2612 die)
* fixed YM2612 Timer B overflow handling
[Gamecube/Wii] [Gamecube/Wii]
--------------- ---------------

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 MiB

After

Width:  |  Height:  |  Size: 3.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 MiB

After

Width:  |  Height:  |  Size: 3.3 MiB

View File

@ -2,7 +2,7 @@
* Genesis Plus * Genesis Plus
* SG-1000, Master System & Game Gear cartridge hardware support * SG-1000, Master System & Game Gear cartridge hardware support
* *
* Copyright (C) 2007-2016 Eke-Eke (Genesis Plus GX) * Copyright (C) 2007-2017 Eke-Eke (Genesis Plus GX)
* *
* Redistribution and use of this code or any derivative works are permitted * Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met: * provided that the following conditions are met:
@ -160,13 +160,15 @@ static const rominfo_t game_list[] =
{0x2E7166D5, 0, 0, 0, MAPPER_RAM_8K_EXT1, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* The Legend of Kage (TW) */ {0x2E7166D5, 0, 0, 0, MAPPER_RAM_8K_EXT1, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* The Legend of Kage (TW) */
{0xC550B4F0, 0, 0, 0, MAPPER_RAM_8K_EXT1, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* TwinBee (TW) */ {0xC550B4F0, 0, 0, 0, MAPPER_RAM_8K_EXT1, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* TwinBee (TW) */
{0xFC87463C, 0, 0, 0, MAPPER_RAM_8K_EXT1, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Yie Ar Kung-Fu II (TW) */ {0xFC87463C, 0, 0, 0, MAPPER_RAM_8K_EXT1, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Yie Ar Kung-Fu II (TW) */
{0xDF7CBFA5, 0, 0, 0, MAPPER_RAM_8K_EXT1, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Pippols (TW) */
{0xE0816BB7, 0, 0, 0, MAPPER_RAM_8K_EXT1, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Star Soldier (TW) */
{0x69FC1494, 0, 0, 0, MAPPER_RAM_8K_EXT2, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Bomberman Special (TW) */ {0x69FC1494, 0, 0, 0, MAPPER_RAM_8K_EXT2, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Bomberman Special (TW) */
{0xFFC4EE3F, 0, 0, 0, MAPPER_RAM_8K_EXT2, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Magical Kid Wiz (TW) */ {0xFFC4EE3F, 0, 0, 0, MAPPER_RAM_8K_EXT2, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Magical Kid Wiz (TW) */
{0x2E366CCF, 0, 0, 0, MAPPER_RAM_8K_EXT2, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* The Castle (TW) */ {0x2E366CCF, 0, 0, 0, MAPPER_RAM_8K_EXT2, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* The Castle (TW) */
{0xAAAC12CF, 0, 0, 0, MAPPER_RAM_8K_EXT2, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Rally-X (TW) */ {0xAAAC12CF, 0, 0, 0, MAPPER_RAM_8K_EXT2, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Rally-X (TW) */
{0xD2EDD329, 0, 0, 0, MAPPER_RAM_8K_EXT2, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Road Fighter (TW) */ {0xD2EDD329, 0, 0, 0, MAPPER_RAM_8K_EXT2, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Road Fighter (TW) */
/* games requiring 2K internal RAM (SG-1000 II clone hardware) */ /* games requiring 2KB internal RAM (SG-1000 II clone hardware) */
{0x7F7F009D, 0, 0, 0, MAPPER_NONE, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Circus Charlie (KR) */ {0x7F7F009D, 0, 0, 0, MAPPER_NONE, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Circus Charlie (KR) */
{0x77DB4704, 0, 0, 0, MAPPER_NONE, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Q*Bert */ {0x77DB4704, 0, 0, 0, MAPPER_NONE, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Q*Bert */
{0xC5A67B95, 0, 0, 0, MAPPER_NONE, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Othello Multivision BIOS */ {0xC5A67B95, 0, 0, 0, MAPPER_NONE, SYSTEM_SGII, REGION_JAPAN_NTSC}, /* Othello Multivision BIOS */

View File

@ -2,7 +2,7 @@
* Genesis Plus * Genesis Plus
* SG-1000, Master System & Game Gear cartridge hardware support * SG-1000, Master System & Game Gear cartridge hardware support
* *
* Copyright (C) 2007-2016 Eke-Eke (Genesis Plus GX) * Copyright (C) 2007-2017 Eke-Eke (Genesis Plus GX)
* *
* Redistribution and use of this code or any derivative works are permitted * Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met: * provided that the following conditions are met:

View File

@ -31,6 +31,8 @@
- added proper cycle use on reset - added proper cycle use on reset
- added cycle accurate timings for MUL/DIV instructions (thanks to Jorge Cwik !) - added cycle accurate timings for MUL/DIV instructions (thanks to Jorge Cwik !)
- fixed undocumented flags for DIV instructions (Blood Shot) - fixed undocumented flags for DIV instructions (Blood Shot)
- fixed undocumented behaviors for ABCD/SBCD/NBCD instructions (thanks to flamewing for his test ROM)
- improved auto-vectored interrupts acknowledge cycle timing accuracy
- added MAIN-CPU & SUB-CPU support for Mega CD emulation - added MAIN-CPU & SUB-CPU support for Mega CD emulation
*/ */

View File

@ -143,13 +143,15 @@ static void m68k_op_abcd_8_rr(void)
uint src = DY; uint src = DY;
uint dst = *r_dst; uint dst = *r_dst;
uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1(); uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1();
uint corf = 0;
FLAG_V = ~res; /* Undefined V behavior */
if(res > 9) if(res > 9)
res += 6; corf = 6;
res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst); res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst);
FLAG_X = FLAG_C = (res > 0x99) << 8; FLAG_V = ~res; /* Undefined V behavior */
res += corf;
FLAG_X = FLAG_C = (res > 0x9f) << 8;
if(FLAG_C) if(FLAG_C)
res -= 0xa0; res -= 0xa0;
@ -169,13 +171,15 @@ static void m68k_op_abcd_8_mm_ax7(void)
uint ea = EA_A7_PD_8(); uint ea = EA_A7_PD_8();
uint dst = m68ki_read_8(ea); uint dst = m68ki_read_8(ea);
uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1(); uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1();
uint corf = 0;
FLAG_V = ~res; /* Undefined V behavior */
if(res > 9) if(res > 9)
res += 6; corf = 6;
res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst); res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst);
FLAG_X = FLAG_C = (res > 0x99) << 8; FLAG_V = ~res; /* Undefined V behavior */
res += corf;
FLAG_X = FLAG_C = (res > 0x9f) << 8;
if(FLAG_C) if(FLAG_C)
res -= 0xa0; res -= 0xa0;
@ -195,13 +199,15 @@ static void m68k_op_abcd_8_mm_ay7(void)
uint ea = EA_AX_PD_8(); uint ea = EA_AX_PD_8();
uint dst = m68ki_read_8(ea); uint dst = m68ki_read_8(ea);
uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1(); uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1();
uint corf = 0;
FLAG_V = ~res; /* Undefined V behavior */
if(res > 9) if(res > 9)
res += 6; corf = 6;
res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst); res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst);
FLAG_X = FLAG_C = (res > 0x99) << 8; FLAG_V = ~res; /* Undefined V behavior */
res += corf;
FLAG_X = FLAG_C = (res > 0x9f) << 8;
if(FLAG_C) if(FLAG_C)
res -= 0xa0; res -= 0xa0;
@ -221,13 +227,15 @@ static void m68k_op_abcd_8_mm_axy7(void)
uint ea = EA_A7_PD_8(); uint ea = EA_A7_PD_8();
uint dst = m68ki_read_8(ea); uint dst = m68ki_read_8(ea);
uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1(); uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1();
uint corf = 0;
FLAG_V = ~res; /* Undefined V behavior */
if(res > 9) if(res > 9)
res += 6; corf = 6;
res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst); res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst);
FLAG_X = FLAG_C = (res > 0x99) << 8; FLAG_V = ~res; /* Undefined V behavior */
res += corf;
FLAG_X = FLAG_C = (res > 0x9f) << 8;
if(FLAG_C) if(FLAG_C)
res -= 0xa0; res -= 0xa0;
@ -247,13 +255,15 @@ static void m68k_op_abcd_8_mm(void)
uint ea = EA_AX_PD_8(); uint ea = EA_AX_PD_8();
uint dst = m68ki_read_8(ea); uint dst = m68ki_read_8(ea);
uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1(); uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1();
uint corf = 0;
FLAG_V = ~res; /* Undefined V behavior */
if(res > 9) if(res > 9)
res += 6; corf = 6;
res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst); res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst);
FLAG_X = FLAG_C = (res > 0x99) << 8; FLAG_V = ~res; /* Undefined V behavior */
res += corf;
FLAG_X = FLAG_C = (res > 0x9f) << 8;
if(FLAG_C) if(FLAG_C)
res -= 0xa0; res -= 0xa0;
@ -15846,32 +15856,33 @@ static void m68k_op_nbcd_8_d(void)
{ {
uint* r_dst = &DY; uint* r_dst = &DY;
uint dst = *r_dst; uint dst = *r_dst;
uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); uint res = -dst - XFLAG_AS_1();
if(res != 0x9a) if(res)
{ {
FLAG_V = ~res; /* Undefined V behavior */ FLAG_V = res; /* Undefined V behavior */
if((res & 0x0f) == 0xa) if(((res|dst) & 0x0f) == 0x0)
res = (res & 0xf0) + 0x10; res = (res & 0xf0) + 6;
res = MASK_OUT_ABOVE_8(res); res = MASK_OUT_ABOVE_8(res+0x9a);
FLAG_V &= res; /* Undefined V behavior part II */ FLAG_V &= ~res; /* Undefined V behavior part II */
*r_dst = MASK_OUT_BELOW_8(*r_dst) | res; *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
FLAG_Z |= res; FLAG_Z |= res;
FLAG_C = CFLAG_SET; FLAG_C = CFLAG_SET;
FLAG_X = XFLAG_SET; FLAG_X = XFLAG_SET;
FLAG_N = NFLAG_8(res); /* Undefined N behavior */
} }
else else
{ {
FLAG_V = VFLAG_CLEAR; FLAG_V = VFLAG_CLEAR;
FLAG_C = CFLAG_CLEAR; FLAG_C = CFLAG_CLEAR;
FLAG_X = XFLAG_CLEAR; FLAG_X = XFLAG_CLEAR;
FLAG_N = NFLAG_CLEAR;
} }
FLAG_N = NFLAG_8(res); /* Undefined N behavior */
} }
@ -15879,32 +15890,33 @@ static void m68k_op_nbcd_8_ai(void)
{ {
uint ea = EA_AY_AI_8(); uint ea = EA_AY_AI_8();
uint dst = m68ki_read_8(ea); uint dst = m68ki_read_8(ea);
uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); uint res = -dst - XFLAG_AS_1();
if(res != 0x9a) if(res)
{ {
FLAG_V = ~res; /* Undefined V behavior */ FLAG_V = res; /* Undefined V behavior */
if((res & 0x0f) == 0xa) if(((res|dst) & 0x0f) == 0x0)
res = (res & 0xf0) + 0x10; res = (res & 0xf0) + 6;
res = MASK_OUT_ABOVE_8(res); res = MASK_OUT_ABOVE_8(res+0x9a);
FLAG_V &= res; /* Undefined V behavior part II */ FLAG_V &= ~res; /* Undefined V behavior part II */
m68ki_write_8(ea, MASK_OUT_ABOVE_8(res)); m68ki_write_8(ea, res);
FLAG_Z |= res; FLAG_Z |= res;
FLAG_C = CFLAG_SET; FLAG_C = CFLAG_SET;
FLAG_X = XFLAG_SET; FLAG_X = XFLAG_SET;
FLAG_N = NFLAG_8(res); /* Undefined N behavior */
} }
else else
{ {
FLAG_V = VFLAG_CLEAR; FLAG_V = VFLAG_CLEAR;
FLAG_C = CFLAG_CLEAR; FLAG_C = CFLAG_CLEAR;
FLAG_X = XFLAG_CLEAR; FLAG_X = XFLAG_CLEAR;
FLAG_N = NFLAG_CLEAR;
} }
FLAG_N = NFLAG_8(res); /* Undefined N behavior */
} }
@ -15912,32 +15924,33 @@ static void m68k_op_nbcd_8_pi(void)
{ {
uint ea = EA_AY_PI_8(); uint ea = EA_AY_PI_8();
uint dst = m68ki_read_8(ea); uint dst = m68ki_read_8(ea);
uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); uint res = -dst - XFLAG_AS_1();
if(res != 0x9a) if(res)
{ {
FLAG_V = ~res; /* Undefined V behavior */ FLAG_V = res; /* Undefined V behavior */
if((res & 0x0f) == 0xa) if(((res|dst) & 0x0f) == 0x0)
res = (res & 0xf0) + 0x10; res = (res & 0xf0) + 6;
res = MASK_OUT_ABOVE_8(res); res = MASK_OUT_ABOVE_8(res+0x9a);
FLAG_V &= res; /* Undefined V behavior part II */ FLAG_V &= ~res; /* Undefined V behavior part II */
m68ki_write_8(ea, MASK_OUT_ABOVE_8(res)); m68ki_write_8(ea, res);
FLAG_Z |= res; FLAG_Z |= res;
FLAG_C = CFLAG_SET; FLAG_C = CFLAG_SET;
FLAG_X = XFLAG_SET; FLAG_X = XFLAG_SET;
FLAG_N = NFLAG_8(res); /* Undefined N behavior */
} }
else else
{ {
FLAG_V = VFLAG_CLEAR; FLAG_V = VFLAG_CLEAR;
FLAG_C = CFLAG_CLEAR; FLAG_C = CFLAG_CLEAR;
FLAG_X = XFLAG_CLEAR; FLAG_X = XFLAG_CLEAR;
FLAG_N = NFLAG_CLEAR;
} }
FLAG_N = NFLAG_8(res); /* Undefined N behavior */
} }
@ -15945,32 +15958,33 @@ static void m68k_op_nbcd_8_pi7(void)
{ {
uint ea = EA_A7_PI_8(); uint ea = EA_A7_PI_8();
uint dst = m68ki_read_8(ea); uint dst = m68ki_read_8(ea);
uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); uint res = -dst - XFLAG_AS_1();
if(res != 0x9a) if(res)
{ {
FLAG_V = ~res; /* Undefined V behavior */ FLAG_V = res; /* Undefined V behavior */
if((res & 0x0f) == 0xa) if(((res|dst) & 0x0f) == 0x0)
res = (res & 0xf0) + 0x10; res = (res & 0xf0) + 6;
res = MASK_OUT_ABOVE_8(res); res = MASK_OUT_ABOVE_8(res+0x9a);
FLAG_V &= res; /* Undefined V behavior part II */ FLAG_V &= ~res; /* Undefined V behavior part II */
m68ki_write_8(ea, MASK_OUT_ABOVE_8(res)); m68ki_write_8(ea, res);
FLAG_Z |= res; FLAG_Z |= res;
FLAG_C = CFLAG_SET; FLAG_C = CFLAG_SET;
FLAG_X = XFLAG_SET; FLAG_X = XFLAG_SET;
FLAG_N = NFLAG_8(res); /* Undefined N behavior */
} }
else else
{ {
FLAG_V = VFLAG_CLEAR; FLAG_V = VFLAG_CLEAR;
FLAG_C = CFLAG_CLEAR; FLAG_C = CFLAG_CLEAR;
FLAG_X = XFLAG_CLEAR; FLAG_X = XFLAG_CLEAR;
FLAG_N = NFLAG_CLEAR;
} }
FLAG_N = NFLAG_8(res); /* Undefined N behavior */
} }
@ -15978,32 +15992,33 @@ static void m68k_op_nbcd_8_pd(void)
{ {
uint ea = EA_AY_PD_8(); uint ea = EA_AY_PD_8();
uint dst = m68ki_read_8(ea); uint dst = m68ki_read_8(ea);
uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); uint res = -dst - XFLAG_AS_1();
if(res != 0x9a) if(res)
{ {
FLAG_V = ~res; /* Undefined V behavior */ FLAG_V = res; /* Undefined V behavior */
if((res & 0x0f) == 0xa) if(((res|dst) & 0x0f) == 0x0)
res = (res & 0xf0) + 0x10; res = (res & 0xf0) + 6;
res = MASK_OUT_ABOVE_8(res); res = MASK_OUT_ABOVE_8(res+0x9a);
FLAG_V &= res; /* Undefined V behavior part II */ FLAG_V &= ~res; /* Undefined V behavior part II */
m68ki_write_8(ea, MASK_OUT_ABOVE_8(res)); m68ki_write_8(ea, res);
FLAG_Z |= res; FLAG_Z |= res;
FLAG_C = CFLAG_SET; FLAG_C = CFLAG_SET;
FLAG_X = XFLAG_SET; FLAG_X = XFLAG_SET;
FLAG_N = NFLAG_8(res); /* Undefined N behavior */
} }
else else
{ {
FLAG_V = VFLAG_CLEAR; FLAG_V = VFLAG_CLEAR;
FLAG_C = CFLAG_CLEAR; FLAG_C = CFLAG_CLEAR;
FLAG_X = XFLAG_CLEAR; FLAG_X = XFLAG_CLEAR;
FLAG_N = NFLAG_CLEAR;
} }
FLAG_N = NFLAG_8(res); /* Undefined N behavior */
} }
@ -16011,32 +16026,33 @@ static void m68k_op_nbcd_8_pd7(void)
{ {
uint ea = EA_A7_PD_8(); uint ea = EA_A7_PD_8();
uint dst = m68ki_read_8(ea); uint dst = m68ki_read_8(ea);
uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); uint res = -dst - XFLAG_AS_1();
if(res != 0x9a) if(res)
{ {
FLAG_V = ~res; /* Undefined V behavior */ FLAG_V = res; /* Undefined V behavior */
if((res & 0x0f) == 0xa) if(((res|dst) & 0x0f) == 0x0)
res = (res & 0xf0) + 0x10; res = (res & 0xf0) + 6;
res = MASK_OUT_ABOVE_8(res); res = MASK_OUT_ABOVE_8(res+0x9a);
FLAG_V &= res; /* Undefined V behavior part II */ FLAG_V &= ~res; /* Undefined V behavior part II */
m68ki_write_8(ea, MASK_OUT_ABOVE_8(res)); m68ki_write_8(ea, res);
FLAG_Z |= res; FLAG_Z |= res;
FLAG_C = CFLAG_SET; FLAG_C = CFLAG_SET;
FLAG_X = XFLAG_SET; FLAG_X = XFLAG_SET;
FLAG_N = NFLAG_8(res); /* Undefined N behavior */
} }
else else
{ {
FLAG_V = VFLAG_CLEAR; FLAG_V = VFLAG_CLEAR;
FLAG_C = CFLAG_CLEAR; FLAG_C = CFLAG_CLEAR;
FLAG_X = XFLAG_CLEAR; FLAG_X = XFLAG_CLEAR;
FLAG_N = NFLAG_CLEAR;
} }
FLAG_N = NFLAG_8(res); /* Undefined N behavior */
} }
@ -16044,32 +16060,33 @@ static void m68k_op_nbcd_8_di(void)
{ {
uint ea = EA_AY_DI_8(); uint ea = EA_AY_DI_8();
uint dst = m68ki_read_8(ea); uint dst = m68ki_read_8(ea);
uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); uint res = -dst - XFLAG_AS_1();
if(res != 0x9a) if(res)
{ {
FLAG_V = ~res; /* Undefined V behavior */ FLAG_V = res; /* Undefined V behavior */
if((res & 0x0f) == 0xa) if(((res|dst) & 0x0f) == 0x0)
res = (res & 0xf0) + 0x10; res = (res & 0xf0) + 6;
res = MASK_OUT_ABOVE_8(res); res = MASK_OUT_ABOVE_8(res+0x9a);
FLAG_V &= res; /* Undefined V behavior part II */ FLAG_V &= ~res; /* Undefined V behavior part II */
m68ki_write_8(ea, MASK_OUT_ABOVE_8(res)); m68ki_write_8(ea, res);
FLAG_Z |= res; FLAG_Z |= res;
FLAG_C = CFLAG_SET; FLAG_C = CFLAG_SET;
FLAG_X = XFLAG_SET; FLAG_X = XFLAG_SET;
FLAG_N = NFLAG_8(res); /* Undefined N behavior */
} }
else else
{ {
FLAG_V = VFLAG_CLEAR; FLAG_V = VFLAG_CLEAR;
FLAG_C = CFLAG_CLEAR; FLAG_C = CFLAG_CLEAR;
FLAG_X = XFLAG_CLEAR; FLAG_X = XFLAG_CLEAR;
FLAG_N = NFLAG_CLEAR;
} }
FLAG_N = NFLAG_8(res); /* Undefined N behavior */
} }
@ -16077,32 +16094,33 @@ static void m68k_op_nbcd_8_ix(void)
{ {
uint ea = EA_AY_IX_8(); uint ea = EA_AY_IX_8();
uint dst = m68ki_read_8(ea); uint dst = m68ki_read_8(ea);
uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); uint res = -dst - XFLAG_AS_1();
if(res != 0x9a) if(res)
{ {
FLAG_V = ~res; /* Undefined V behavior */ FLAG_V = res; /* Undefined V behavior */
if((res & 0x0f) == 0xa) if(((res|dst) & 0x0f) == 0x0)
res = (res & 0xf0) + 0x10; res = (res & 0xf0) + 6;
res = MASK_OUT_ABOVE_8(res); res = MASK_OUT_ABOVE_8(res+0x9a);
FLAG_V &= res; /* Undefined V behavior part II */ FLAG_V &= ~res; /* Undefined V behavior part II */
m68ki_write_8(ea, MASK_OUT_ABOVE_8(res)); m68ki_write_8(ea, res);
FLAG_Z |= res; FLAG_Z |= res;
FLAG_C = CFLAG_SET; FLAG_C = CFLAG_SET;
FLAG_X = XFLAG_SET; FLAG_X = XFLAG_SET;
FLAG_N = NFLAG_8(res); /* Undefined N behavior */
} }
else else
{ {
FLAG_V = VFLAG_CLEAR; FLAG_V = VFLAG_CLEAR;
FLAG_C = CFLAG_CLEAR; FLAG_C = CFLAG_CLEAR;
FLAG_X = XFLAG_CLEAR; FLAG_X = XFLAG_CLEAR;
FLAG_N = NFLAG_CLEAR;
} }
FLAG_N = NFLAG_8(res); /* Undefined N behavior */
} }
@ -16110,32 +16128,33 @@ static void m68k_op_nbcd_8_aw(void)
{ {
uint ea = EA_AW_8(); uint ea = EA_AW_8();
uint dst = m68ki_read_8(ea); uint dst = m68ki_read_8(ea);
uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); uint res = -dst - XFLAG_AS_1();
if(res != 0x9a) if(res)
{ {
FLAG_V = ~res; /* Undefined V behavior */ FLAG_V = res; /* Undefined V behavior */
if((res & 0x0f) == 0xa) if(((res|dst) & 0x0f) == 0x0)
res = (res & 0xf0) + 0x10; res = (res & 0xf0) + 6;
res = MASK_OUT_ABOVE_8(res); res = MASK_OUT_ABOVE_8(res+0x9a);
FLAG_V &= res; /* Undefined V behavior part II */ FLAG_V &= ~res; /* Undefined V behavior part II */
m68ki_write_8(ea, MASK_OUT_ABOVE_8(res)); m68ki_write_8(ea, res);
FLAG_Z |= res; FLAG_Z |= res;
FLAG_C = CFLAG_SET; FLAG_C = CFLAG_SET;
FLAG_X = XFLAG_SET; FLAG_X = XFLAG_SET;
FLAG_N = NFLAG_8(res); /* Undefined N behavior */
} }
else else
{ {
FLAG_V = VFLAG_CLEAR; FLAG_V = VFLAG_CLEAR;
FLAG_C = CFLAG_CLEAR; FLAG_C = CFLAG_CLEAR;
FLAG_X = XFLAG_CLEAR; FLAG_X = XFLAG_CLEAR;
FLAG_N = NFLAG_CLEAR;
} }
FLAG_N = NFLAG_8(res); /* Undefined N behavior */
} }
@ -16143,32 +16162,33 @@ static void m68k_op_nbcd_8_al(void)
{ {
uint ea = EA_AL_8(); uint ea = EA_AL_8();
uint dst = m68ki_read_8(ea); uint dst = m68ki_read_8(ea);
uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1()); uint res = -dst - XFLAG_AS_1();
if(res != 0x9a) if(res)
{ {
FLAG_V = ~res; /* Undefined V behavior */ FLAG_V = res; /* Undefined V behavior */
if((res & 0x0f) == 0xa) if(((res|dst) & 0x0f) == 0x0)
res = (res & 0xf0) + 0x10; res = (res & 0xf0) + 6;
res = MASK_OUT_ABOVE_8(res); res = MASK_OUT_ABOVE_8(res+0x9a);
FLAG_V &= res; /* Undefined V behavior part II */ FLAG_V &= ~res; /* Undefined V behavior part II */
m68ki_write_8(ea, MASK_OUT_ABOVE_8(res)); m68ki_write_8(ea, res);
FLAG_Z |= res; FLAG_Z |= res;
FLAG_C = CFLAG_SET; FLAG_C = CFLAG_SET;
FLAG_X = XFLAG_SET; FLAG_X = XFLAG_SET;
FLAG_N = NFLAG_8(res); /* Undefined N behavior */
} }
else else
{ {
FLAG_V = VFLAG_CLEAR; FLAG_V = VFLAG_CLEAR;
FLAG_C = CFLAG_CLEAR; FLAG_C = CFLAG_CLEAR;
FLAG_X = XFLAG_CLEAR; FLAG_X = XFLAG_CLEAR;
FLAG_N = NFLAG_CLEAR;
} }
FLAG_N = NFLAG_8(res); /* Undefined N behavior */
} }
@ -19736,26 +19756,28 @@ static void m68k_op_sbcd_8_rr(void)
uint src = DY; uint src = DY;
uint dst = *r_dst; uint dst = *r_dst;
uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1(); uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1();
uint corf = 0;
/* FLAG_V = ~res; */ /* Undefined V behavior */ if(res > 0xf)
FLAG_V = VFLAG_CLEAR; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to assume cleared. */ corf = 6;
if(res > 9)
res -= 6;
res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src); res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src);
if(res > 0x99) FLAG_V = res; /* Undefined V behavior */
if(res > 0xff)
{ {
res += 0xa0; res += 0xa0;
FLAG_X = FLAG_C = CFLAG_SET; FLAG_X = FLAG_C = CFLAG_SET;
FLAG_N = NFLAG_SET; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to follow carry. */
} }
else if(res < corf)
FLAG_X = FLAG_C = CFLAG_SET;
else else
FLAG_N = FLAG_X = FLAG_C = 0; FLAG_X = FLAG_C = 0;
res = MASK_OUT_ABOVE_8(res); res = MASK_OUT_ABOVE_8(res-corf);
/* FLAG_V &= res; */ /* Undefined V behavior part II */ FLAG_V &= ~res; /* Undefined V behavior part II */
/* FLAG_N = NFLAG_8(res); */ /* Undefined N behavior */ FLAG_N = NFLAG_8(res); /* Undefined N behavior */
FLAG_Z |= res; FLAG_Z |= res;
*r_dst = MASK_OUT_BELOW_8(*r_dst) | res; *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
@ -19768,26 +19790,27 @@ static void m68k_op_sbcd_8_mm_ax7(void)
uint ea = EA_A7_PD_8(); uint ea = EA_A7_PD_8();
uint dst = m68ki_read_8(ea); uint dst = m68ki_read_8(ea);
uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1(); uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1();
uint corf = 0;
/* FLAG_V = ~res; */ /* Undefined V behavior */ if(res > 0xf)
FLAG_V = VFLAG_CLEAR; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to return zero. */ corf = 6;
if(res > 9)
res -= 6;
res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src); res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src);
if(res > 0x99) FLAG_V = res; /* Undefined V behavior */
if(res > 0xff)
{ {
res += 0xa0; res += 0xa0;
FLAG_X = FLAG_C = CFLAG_SET; FLAG_X = FLAG_C = CFLAG_SET;
FLAG_N = NFLAG_SET; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to follow carry. */
} }
else if(res < corf)
FLAG_X = FLAG_C = CFLAG_SET;
else else
FLAG_N = FLAG_X = FLAG_C = 0; FLAG_X = FLAG_C = 0;
res = MASK_OUT_ABOVE_8(res); res = MASK_OUT_ABOVE_8(res-corf);
/* FLAG_V &= res; */ /* Undefined V behavior part II */ FLAG_V &= ~res; /* Undefined V behavior part II */
/* FLAG_N = NFLAG_8(res); */ /* Undefined N behavior */ FLAG_N = NFLAG_8(res); /* Undefined N behavior */
FLAG_Z |= res; FLAG_Z |= res;
m68ki_write_8(ea, res); m68ki_write_8(ea, res);
@ -19800,26 +19823,27 @@ static void m68k_op_sbcd_8_mm_ay7(void)
uint ea = EA_AX_PD_8(); uint ea = EA_AX_PD_8();
uint dst = m68ki_read_8(ea); uint dst = m68ki_read_8(ea);
uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1(); uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1();
uint corf = 0;
/* FLAG_V = ~res; */ /* Undefined V behavior */ if(res > 0xf)
FLAG_V = VFLAG_CLEAR; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to return zero. */ corf = 6;
if(res > 9)
res -= 6;
res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src); res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src);
if(res > 0x99) FLAG_V = res; /* Undefined V behavior */
if(res > 0xff)
{ {
res += 0xa0; res += 0xa0;
FLAG_X = FLAG_C = CFLAG_SET; FLAG_X = FLAG_C = CFLAG_SET;
FLAG_N = NFLAG_SET; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to follow carry. */
} }
else if(res < corf)
FLAG_X = FLAG_C = CFLAG_SET;
else else
FLAG_N = FLAG_X = FLAG_C = 0; FLAG_X = FLAG_C = 0;
res = MASK_OUT_ABOVE_8(res); res = MASK_OUT_ABOVE_8(res-corf);
/* FLAG_V &= res; */ /* Undefined V behavior part II */ FLAG_V &= ~res; /* Undefined V behavior part II */
/* FLAG_N = NFLAG_8(res); */ /* Undefined N behavior */ FLAG_N = NFLAG_8(res); /* Undefined N behavior */
FLAG_Z |= res; FLAG_Z |= res;
m68ki_write_8(ea, res); m68ki_write_8(ea, res);
@ -19832,26 +19856,27 @@ static void m68k_op_sbcd_8_mm_axy7(void)
uint ea = EA_A7_PD_8(); uint ea = EA_A7_PD_8();
uint dst = m68ki_read_8(ea); uint dst = m68ki_read_8(ea);
uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1(); uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1();
uint corf = 0;
/* FLAG_V = ~res; */ /* Undefined V behavior */ if(res > 0xf)
FLAG_V = VFLAG_CLEAR; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to return zero. */ corf = 6;
if(res > 9)
res -= 6;
res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src); res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src);
if(res > 0x99) FLAG_V = res; /* Undefined V behavior */
if(res > 0xff)
{ {
res += 0xa0; res += 0xa0;
FLAG_X = FLAG_C = CFLAG_SET; FLAG_X = FLAG_C = CFLAG_SET;
FLAG_N = NFLAG_SET; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to follow carry. */
} }
else if(res < corf)
FLAG_X = FLAG_C = CFLAG_SET;
else else
FLAG_N = FLAG_X = FLAG_C = 0; FLAG_X = FLAG_C = 0;
res = MASK_OUT_ABOVE_8(res); res = MASK_OUT_ABOVE_8(res-corf);
/* FLAG_V &= res; */ /* Undefined V behavior part II */ FLAG_V &= ~res; /* Undefined V behavior part II */
/* FLAG_N = NFLAG_8(res); */ /* Undefined N behavior */ FLAG_N = NFLAG_8(res); /* Undefined N behavior */
FLAG_Z |= res; FLAG_Z |= res;
m68ki_write_8(ea, res); m68ki_write_8(ea, res);
@ -19864,26 +19889,27 @@ static void m68k_op_sbcd_8_mm(void)
uint ea = EA_AX_PD_8(); uint ea = EA_AX_PD_8();
uint dst = m68ki_read_8(ea); uint dst = m68ki_read_8(ea);
uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1(); uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1();
uint corf = 0;
/* FLAG_V = ~res; */ /* Undefined V behavior */ if(res > 0xf)
FLAG_V = VFLAG_CLEAR; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to return zero. */ corf = 6;
if(res > 9)
res -= 6;
res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src); res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src);
if(res > 0x99) FLAG_V = res; /* Undefined V behavior */
if(res > 0xff)
{ {
res += 0xa0; res += 0xa0;
FLAG_X = FLAG_C = CFLAG_SET; FLAG_X = FLAG_C = CFLAG_SET;
FLAG_N = NFLAG_SET; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to follow carry. */
} }
else if(res < corf)
FLAG_X = FLAG_C = CFLAG_SET;
else else
FLAG_N = FLAG_X = FLAG_C = 0; FLAG_X = FLAG_C = 0;
res = MASK_OUT_ABOVE_8(res); res = MASK_OUT_ABOVE_8(res-corf);
/* FLAG_V &= res; */ /* Undefined V behavior part II */ FLAG_V &= ~res; /* Undefined V behavior part II */
/* FLAG_N = NFLAG_8(res); */ /* Undefined N behavior */ FLAG_N = NFLAG_8(res); /* Undefined N behavior */
FLAG_Z |= res; FLAG_Z |= res;
m68ki_write_8(ea, res); m68ki_write_8(ea, res);

View File

@ -46,4 +46,11 @@
#define INLINE static __inline__ #define INLINE static __inline__
#endif /* INLINE */ #endif /* INLINE */
/* Alignment macros for cross compiler compatibility */
#if defined(_MSC_VER)
#define ALIGNED_(x) __declspec(align(x))
#elif defined(__GNUC__)
#define ALIGNED_(x) __attribute__ ((aligned(x)))
#endif
#endif /* _MACROS_H_ */ #endif /* _MACROS_H_ */

View File

@ -3,7 +3,7 @@
* Main 68k bus handlers * Main 68k bus handlers
* *
* Copyright (C) 1998-2003 Charles Mac Donald (original code) * Copyright (C) 1998-2003 Charles Mac Donald (original code)
* Copyright (C) 2007-2016 Eke-Eke (Genesis Plus GX) * Copyright (C) 2007-2017 Eke-Eke (Genesis Plus GX)
* *
* Redistribution and use of this code or any derivative works are permitted * Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met: * provided that the following conditions are met:
@ -413,11 +413,6 @@ unsigned int ctrl_io_read_byte(unsigned int address)
return m68k_read_bus_8(address); return m68k_read_bus_8(address);
} }
case 0x10: /* MEMORY MODE */
case 0x12: /* Z80 RESET */
case 0x13: /* unknown */
case 0x40: /* TMSS */
case 0x44: /* RADICA */
case 0x50: /* SVP */ case 0x50: /* SVP */
{ {
if ((address & 0xFC) == 0x00) if ((address & 0xFC) == 0x00)
@ -436,6 +431,15 @@ unsigned int ctrl_io_read_byte(unsigned int address)
return m68k_read_bus_8(address); return m68k_read_bus_8(address);
} }
case 0x10: /* MEMORY MODE */
case 0x12: /* Z80 RESET */
case 0x13: /* unknown */
case 0x40: /* TMSS */
case 0x44: /* RADICA */
{
return m68k_read_bus_8(address);
}
default: /* Invalid address */ default: /* Invalid address */
{ {
return m68k_lockup_r_8(address); return m68k_lockup_r_8(address);

View File

@ -3,7 +3,7 @@
* Main 68k bus handlers * Main 68k bus handlers
* *
* Copyright (C) 1998-2003 Charles Mac Donald (original code) * Copyright (C) 1998-2003 Charles Mac Donald (original code)
* Copyright (C) 2007-2016 Eke-Eke (Genesis Plus GX) * Copyright (C) 2007-2017 Eke-Eke (Genesis Plus GX)
* *
* Redistribution and use of this code or any derivative works are permitted * Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met: * provided that the following conditions are met:

View File

@ -6,7 +6,7 @@
* *
* Noise implementation based on http://www.smspower.org/Development/SN76489#NoiseChannel * Noise implementation based on http://www.smspower.org/Development/SN76489#NoiseChannel
* *
* Copyright (C) 2016 Eke-Eke (Genesis Plus GX) * Copyright (C) 2016-2017 Eke-Eke (Genesis Plus GX)
* *
* Redistribution and use of this code or any derivative works are permitted * Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met: * provided that the following conditions are met:
@ -78,6 +78,7 @@ static struct
{ {
int clocks; int clocks;
int latch; int latch;
int zeroFreqInc;
int noiseShiftValue; int noiseShiftValue;
int noiseShiftWidth; int noiseShiftWidth;
int noiseBitMask; int noiseBitMask;
@ -100,9 +101,12 @@ void psg_init(PSG_TYPE type)
for (i=0; i<4; i++) for (i=0; i<4; i++)
{ {
psg.chanAmp[i][0] = 100; psg.chanAmp[i][0] = 100;
psg.chanAmp[i][1] = 100; psg.chanAmp[i][1] = 100;
} }
/* Initialize Tone zero frequency increment value */
psg.zeroFreqInc = ((type == PSG_DISCRETE) ? 0x400 : 0x1) * PSG_MCYCLES_RATIO;
/* Initialize Noise LSFR type */ /* Initialize Noise LSFR type */
psg.noiseShiftWidth = noiseShiftWidth[type]; psg.noiseShiftWidth = noiseShiftWidth[type];
psg.noiseBitMask = noiseBitMask[type]; psg.noiseBitMask = noiseBitMask[type];
@ -117,7 +121,7 @@ void psg_reset()
{ {
psg.regs[i*2] = 0; psg.regs[i*2] = 0;
psg.regs[i*2+1] = 0; psg.regs[i*2+1] = 0;
psg.freqInc[i] = (i < 3) ? (1 * PSG_MCYCLES_RATIO) : (16 * PSG_MCYCLES_RATIO); psg.freqInc[i] = (i < 3) ? (psg.zeroFreqInc) : (16 * PSG_MCYCLES_RATIO);
psg.freqCounter[i] = 0; psg.freqCounter[i] = 0;
psg.polarity[i] = -1; psg.polarity[i] = -1;
psg.chanDelta[i][0] = 0; psg.chanDelta[i][0] = 0;
@ -126,8 +130,8 @@ void psg_reset()
psg.chanOut[i][1] = 0; psg.chanOut[i][1] = 0;
} }
/* noise attenuation register is latched on power-on (verified on 315-5313A & 315-5660 integrated version only) */ /* tone #2 attenuation register is latched on power-on (verified on 315-5313A integrated version only) */
psg.latch = 7; psg.latch = 3;
/* reset noise shift register */ /* reset noise shift register */
psg.noiseShiftValue = 1 << psg.noiseShiftWidth; psg.noiseShiftValue = 1 << psg.noiseShiftWidth;
@ -298,8 +302,8 @@ void psg_write(unsigned int clocks, unsigned int data)
} }
else else
{ {
/* zero value behaves the same as a value of 1 (verified on integrated version only) */ /* zero value behaves the same as a value of 1 on integrated version (0x400 on discrete version) */
psg.freqInc[index>>1] = PSG_MCYCLES_RATIO; psg.freqInc[index>>1] = psg.zeroFreqInc;
} }
/* update noise channel counter increment if required */ /* update noise channel counter increment if required */
@ -328,7 +332,15 @@ void psg_write(unsigned int clocks, unsigned int data)
psg.freqInc[3] = (0x10 << noiseFreq) * PSG_MCYCLES_RATIO; psg.freqInc[3] = (0x10 << noiseFreq) * PSG_MCYCLES_RATIO;
} }
/* reset shift register value */ /* check current noise shift register output */
if (psg.noiseShiftValue & 1)
{
/* high to low transition will be applied at next internal cycle update */
psg.chanDelta[3][0] = -psg.chanOut[3][0];
psg.chanDelta[3][1] = -psg.chanOut[3][1];
}
/* reset noise shift register value (noise channel output is forced low) */
psg.noiseShiftValue = 1 << psg.noiseShiftWidth;; psg.noiseShiftValue = 1 << psg.noiseShiftWidth;;
break; break;

View File

@ -6,7 +6,7 @@
* *
* Noise implementation based on http://www.smspower.org/Development/SN76489#NoiseChannel * Noise implementation based on http://www.smspower.org/Development/SN76489#NoiseChannel
* *
* Copyright (C) 2016 Eke-Eke (Genesis Plus GX) * Copyright (C) 2016-2017 Eke-Eke (Genesis Plus GX)
* *
* Redistribution and use of this code or any derivative works are permitted * Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met: * provided that the following conditions are met:

View File

@ -12,16 +12,27 @@
** Additional code & fixes by Eke-Eke for Genesis Plus GX ** Additional code & fixes by Eke-Eke for Genesis Plus GX
** **
** Huge thanks to Nemesis, most of those fixes came from his tests on Sega Genesis hardware ** Huge thanks to Nemesis, most of those fixes came from his tests on Sega Genesis hardware
** More informations at http://gendev.spritesmind.net/forum/viewtopic.php?t=386 ** Additional info from YM2612 die shot analysis by Sauraen
** See http://gendev.spritesmind.net/forum/viewtopic.php?t=386
** **
** TODO: ** TODO:
** - better documentation ** - better documentation
** - BUSY flag emulation ** - BUSY flag emulation
** - accurate DAC output
*/ */
/* /*
** CHANGELOG: ** CHANGELOG:
** **
** 09-04-2017 Eke-Eke (Genesis Plus GX):
** - fixed LFO PM implementation: block & keyscale code should not be modified by LFO (verified on YM2612 die)
** - fixed Timer B overflow handling
**
** 12-03-2017 Eke-Eke (Genesis Plus GX):
** - fixed Op1 self-feedback regression introduced by previous modifications
** - removed one-sample extra delay on Op1 calculated output
** - refactored chan_calc() function
**
** 01-09-2012 Eke-Eke (Genesis Plus GX): ** 01-09-2012 Eke-Eke (Genesis Plus GX):
** - removed input clock / output samplerate frequency ratio, chip now always run at (original) internal sample frequency ** - removed input clock / output samplerate frequency ratio, chip now always run at (original) internal sample frequency
** - removed now uneeded extra bits of precision ** - removed now uneeded extra bits of precision
@ -791,10 +802,11 @@ INLINE void INTERNAL_TIMER_B(int step)
ym2612.OPN.ST.status |= 0x02; ym2612.OPN.ST.status |= 0x02;
/* reload the counter */ /* reload the counter */
if (ym2612.OPN.ST.TBL) do
{
ym2612.OPN.ST.TBC += ym2612.OPN.ST.TBL; ym2612.OPN.ST.TBC += ym2612.OPN.ST.TBL;
else }
ym2612.OPN.ST.TBC = ym2612.OPN.ST.TBL; while (ym2612.OPN.ST.TBC <= 0);
} }
} }
} }
@ -1268,31 +1280,25 @@ INLINE void update_ssg_eg_channels(FM_CH *CH)
} while (--i); } while (--i);
} }
INLINE void update_phase_lfo_slot(FM_SLOT *SLOT, INT32 pms, UINT32 block_fnum) INLINE void update_phase_lfo_slot(FM_SLOT *SLOT, UINT32 pm, UINT8 kc, UINT32 fc)
{ {
INT32 lfo_fn_table_index_offset = lfo_pm_table[(((block_fnum & 0x7f0) >> 4) << 8) + pms + ym2612.OPN.LFO_PM]; INT32 lfo_fn_offset = lfo_pm_table[(((fc & 0x7f0) >> 4) << 8) + pm];
if (lfo_fn_table_index_offset) /* LFO phase modulation active */ if (lfo_fn_offset) /* LFO phase modulation active */
{ {
UINT8 blk; /* block is not modified by LFO PM */
unsigned int kc, fc; UINT8 blk = fc >> 11;
/* there are 2048 FNUMs that can be generated using FNUM/BLK registers /* LFO works with one more bit of a precision (12-bit) */
but LFO works with one more bit of a precision so we really need 4096 elements */ fc = ((fc << 1) + lfo_fn_offset) & 0xfff;
block_fnum = block_fnum*2 + lfo_fn_table_index_offset;
blk = (block_fnum&0x7000) >> 12;
block_fnum = block_fnum & 0xfff;
/* keyscale code */ /* (frequency) phase increment counter (17-bit) */
kc = (blk<<2) | opn_fktable[block_fnum >> 8]; fc = (((fc << 5) >> (7 - blk)) + SLOT->DT[kc]) & DT_MASK;
/* (frequency) phase increment counter */
fc = (((block_fnum << 5) >> (7 - blk)) + SLOT->DT[kc]) & DT_MASK;
/* update phase */ /* update phase */
SLOT->phase += (fc * SLOT->mul) >> 1; SLOT->phase += ((fc * SLOT->mul) >> 1);
} }
else /* LFO phase modulation = zero */ else /* LFO phase modulation = zero */
{ {
SLOT->phase += SLOT->Incr; SLOT->phase += SLOT->Incr;
} }
@ -1300,39 +1306,36 @@ INLINE void update_phase_lfo_slot(FM_SLOT *SLOT, INT32 pms, UINT32 block_fnum)
INLINE void update_phase_lfo_channel(FM_CH *CH) INLINE void update_phase_lfo_channel(FM_CH *CH)
{ {
UINT32 block_fnum = CH->block_fnum; UINT32 fc = CH->block_fnum;
INT32 lfo_fn_table_index_offset = lfo_pm_table[(((block_fnum & 0x7f0) >> 4) << 8) + CH->pms + ym2612.OPN.LFO_PM]; INT32 lfo_fn_offset = lfo_pm_table[(((fc & 0x7f0) >> 4) << 8) + CH->pms + ym2612.OPN.LFO_PM];
if (lfo_fn_table_index_offset) /* LFO phase modulation active */ if (lfo_fn_offset) /* LFO phase modulation active */
{ {
UINT8 blk; UINT32 finc;
unsigned int kc, fc, finc;
/* there are 2048 FNUMs that can be generated using FNUM/BLK registers
but LFO works with one more bit of a precision so we really need 4096 elements */
block_fnum = block_fnum*2 + lfo_fn_table_index_offset;
blk = (block_fnum&0x7000) >> 12;
block_fnum = block_fnum & 0xfff;
/* keyscale code */
kc = (blk<<2) | opn_fktable[block_fnum >> 8];
/* (frequency) phase increment counter */ /* block & keyscale code are not modified by LFO PM */
fc = (block_fnum << 5) >> (7 - blk); UINT8 blk = fc >> 11;
UINT8 kc = CH->kcode;
/* LFO works with one more bit of a precision (12-bit) */
fc = ((fc << 1) + lfo_fn_offset) & 0xfff;
/* (frequency) phase increment counter (17-bit) */
fc = (fc << 5) >> (7 - blk);
/* apply DETUNE & MUL operator specific values */ /* apply DETUNE & MUL operator specific values */
finc = (fc + CH->SLOT[SLOT1].DT[kc]) & DT_MASK; finc = (fc + CH->SLOT[SLOT1].DT[kc]) & DT_MASK;
CH->SLOT[SLOT1].phase += (finc*CH->SLOT[SLOT1].mul) >> 1; CH->SLOT[SLOT1].phase += ((finc * CH->SLOT[SLOT1].mul) >> 1);
finc = (fc + CH->SLOT[SLOT2].DT[kc]) & DT_MASK; finc = (fc + CH->SLOT[SLOT2].DT[kc]) & DT_MASK;
CH->SLOT[SLOT2].phase += (finc*CH->SLOT[SLOT2].mul) >> 1; CH->SLOT[SLOT2].phase += ((finc * CH->SLOT[SLOT2].mul) >> 1);
finc = (fc + CH->SLOT[SLOT3].DT[kc]) & DT_MASK; finc = (fc + CH->SLOT[SLOT3].DT[kc]) & DT_MASK;
CH->SLOT[SLOT3].phase += (finc*CH->SLOT[SLOT3].mul) >> 1; CH->SLOT[SLOT3].phase += ((finc * CH->SLOT[SLOT3].mul) >> 1);
finc = (fc + CH->SLOT[SLOT4].DT[kc]) & DT_MASK; finc = (fc + CH->SLOT[SLOT4].DT[kc]) & DT_MASK;
CH->SLOT[SLOT4].phase += (finc*CH->SLOT[SLOT4].mul) >> 1; CH->SLOT[SLOT4].phase += ((finc * CH->SLOT[SLOT4].mul) >> 1);
} }
else /* LFO phase modulation = zero */ else /* LFO phase modulation = zero */
{ {
@ -1413,7 +1416,7 @@ INLINE signed int op_calc(UINT32 phase, unsigned int env, unsigned int pm)
INLINE signed int op_calc1(UINT32 phase, unsigned int env, unsigned int pm) INLINE signed int op_calc1(UINT32 phase, unsigned int env, unsigned int pm)
{ {
UINT32 p = (env<<3) + sin_tab[ ( (phase + pm ) >> SIN_BITS ) & SIN_MASK ]; UINT32 p = (env<<3) + sin_tab[ ( ( phase >> SIN_BITS ) + pm ) & SIN_MASK ];
if (p >= TL_TAB_LEN) if (p >= TL_TAB_LEN)
return 0; return 0;
@ -1424,32 +1427,31 @@ INLINE void chan_calc(FM_CH *CH, int num)
{ {
do do
{ {
INT32 out = 0;
UINT32 AM = ym2612.OPN.LFO_AM >> CH->ams; UINT32 AM = ym2612.OPN.LFO_AM >> CH->ams;
unsigned int eg_out = volume_calc(&CH->SLOT[SLOT1]); unsigned int eg_out = volume_calc(&CH->SLOT[SLOT1]);
m2 = c1 = c2 = mem = 0; m2 = c1 = c2 = mem = 0;
*CH->mem_connect = CH->mem_value; /* restore delayed sample (MEM) value to m2 or c2 */ *CH->mem_connect = CH->mem_value; /* restore delayed sample (MEM) value to m2 or c2 */
if( eg_out < ENV_QUIET ) /* SLOT 1 */
{ {
INT32 out = CH->op1_out[0] + CH->op1_out[1]; if (CH->FB < SIN_BITS)
CH->op1_out[0] = CH->op1_out[1]; out = (CH->op1_out[0] + CH->op1_out[1]) >> CH->FB;
if( !CH->connect1 ){ out = op_calc1(CH->SLOT[SLOT1].phase, eg_out, out );
/* algorithm 5 */ }
mem = c1 = c2 = CH->op1_out[0];
}else{
/* other algorithms */
*CH->connect1 += CH->op1_out[0];
}
CH->op1_out[1] = 0; CH->op1_out[0] = CH->op1_out[1];
if( eg_out < ENV_QUIET ) /* SLOT 1 */ CH->op1_out[1] = out;
{
if (!CH->FB)
out=0;
CH->op1_out[1] = op_calc1(CH->SLOT[SLOT1].phase, eg_out, (out<<CH->FB) ); if( !CH->connect1 ){
} /* algorithm 5 */
mem = c1 = c2 = out;
}else{
/* other algorithms */
*CH->connect1 = out;
} }
eg_out = volume_calc(&CH->SLOT[SLOT3]); eg_out = volume_calc(&CH->SLOT[SLOT3]);
@ -1471,13 +1473,16 @@ INLINE void chan_calc(FM_CH *CH, int num)
/* update phase counters AFTER output calculations */ /* update phase counters AFTER output calculations */
if(CH->pms) if(CH->pms)
{ {
/* add support for 3 slot mode */ /* 3-slot mode */
if ((ym2612.OPN.ST.mode & 0xC0) && (CH == &ym2612.CH[2])) if ((ym2612.OPN.ST.mode & 0xC0) && (CH == &ym2612.CH[2]))
{ {
update_phase_lfo_slot(&CH->SLOT[SLOT1], CH->pms, ym2612.OPN.SL3.block_fnum[1]); /* keyscale code is not modifiedby LFO */
update_phase_lfo_slot(&CH->SLOT[SLOT2], CH->pms, ym2612.OPN.SL3.block_fnum[2]); UINT8 kc = ym2612.CH[2].kcode;
update_phase_lfo_slot(&CH->SLOT[SLOT3], CH->pms, ym2612.OPN.SL3.block_fnum[0]); UINT32 pm = ym2612.CH[2].pms + ym2612.OPN.LFO_PM;
update_phase_lfo_slot(&CH->SLOT[SLOT4], CH->pms, CH->block_fnum); update_phase_lfo_slot(&ym2612.CH[2].SLOT[SLOT1], pm, kc, ym2612.OPN.SL3.block_fnum[1]);
update_phase_lfo_slot(&ym2612.CH[2].SLOT[SLOT2], pm, kc, ym2612.OPN.SL3.block_fnum[2]);
update_phase_lfo_slot(&ym2612.CH[2].SLOT[SLOT3], pm, kc, ym2612.OPN.SL3.block_fnum[0]);
update_phase_lfo_slot(&ym2612.CH[2].SLOT[SLOT4], pm, kc, ym2612.CH[2].block_fnum);
} }
else else
{ {
@ -1522,11 +1527,11 @@ INLINE void OPNWriteMode(int r, int v)
ym2612.OPN.LFO_AM = 126; ym2612.OPN.LFO_AM = 126;
} }
break; break;
case 0x24: /* timer A High 8*/ case 0x24: /* timer A High */
ym2612.OPN.ST.TA = (ym2612.OPN.ST.TA & 0x03)|(((int)v)<<2); ym2612.OPN.ST.TA = (ym2612.OPN.ST.TA & 0x03)|(((int)v)<<2);
ym2612.OPN.ST.TAL = 1024 - ym2612.OPN.ST.TA; ym2612.OPN.ST.TAL = 1024 - ym2612.OPN.ST.TA;
break; break;
case 0x25: /* timer A Low 2*/ case 0x25: /* timer A Low */
ym2612.OPN.ST.TA = (ym2612.OPN.ST.TA & 0x3fc)|(v&3); ym2612.OPN.ST.TA = (ym2612.OPN.ST.TA & 0x3fc)|(v&3);
ym2612.OPN.ST.TAL = 1024 - ym2612.OPN.ST.TA; ym2612.OPN.ST.TAL = 1024 - ym2612.OPN.ST.TA;
break; break;
@ -1727,7 +1732,7 @@ INLINE void OPNWriteReg(int r, int v)
case 0: /* 0xb0-0xb2 : FB,ALGO */ case 0: /* 0xb0-0xb2 : FB,ALGO */
{ {
CH->ALGO = v&7; CH->ALGO = v&7;
CH->FB = (v>>3)&7; CH->FB = SIN_BITS - ((v>>3)&7);
setup_connection( CH, c ); setup_connection( CH, c );
break; break;
} }

View File

@ -54,15 +54,15 @@
} }
/* VDP context */ /* VDP context */
uint8 sat[0x400] __attribute__((aligned(4))); /* Internal copy of sprite attribute table */ uint8 ALIGNED_(4) sat[0x400]; /* Internal copy of sprite attribute table */
uint8 vram[0x10000] __attribute__((aligned(4))); /* Video RAM (64K x 8-bit) */ uint8 ALIGNED_(4) vram[0x10000]; /* Video RAM (64K x 8-bit) */
uint8 cram[0x80] __attribute__((aligned(4))); /* On-chip color RAM (64 x 9-bit) */ uint8 ALIGNED_(4) cram[0x80]; /* On-chip color RAM (64 x 9-bit) */
uint8 vsram[0x80] __attribute__((aligned(4))); /* On-chip vertical scroll RAM (40 x 11-bit) */ uint8 ALIGNED_(4) vsram[0x80]; /* On-chip vertical scroll RAM (40 x 11-bit) */
uint8 reg[0x20]; /* Internal VDP registers (23 x 8-bit) */ uint8 reg[0x20]; /* Internal VDP registers (23 x 8-bit) */
uint8 hint_pending; /* 0= Line interrupt is pending */ uint8 hint_pending; /* 0= Line interrupt is pending */
uint8 vint_pending; /* 1= Frame interrupt is pending */ uint8 vint_pending; /* 1= Frame interrupt is pending */
uint16 status; /* VDP status flags */ uint16 status; /* VDP status flags */
uint32 dma_length; /* DMA remaining length */ uint32 dma_length; /* DMA remaining length */
/* Global variables */ /* Global variables */
uint16 ntab; /* Name table A base address */ uint16 ntab; /* Name table A base address */

View File

@ -553,7 +553,7 @@ static const uint32 tms_palette[16] =
#endif #endif
/* Cached and flipped patterns */ /* Cached and flipped patterns */
static uint8 bg_pattern_cache[0x80000] __attribute__((aligned(4))); static uint8 ALIGNED_(4) bg_pattern_cache[0x80000];
/* Sprite pattern name offset look-up table (Mode 5) */ /* Sprite pattern name offset look-up table (Mode 5) */
static uint8 name_lut[0x400]; static uint8 name_lut[0x400];

View File

@ -0,0 +1,22 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.26228.9
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "msvc-2010", "msvc-2017\msvc-2017.vcxproj", "{29DF2EE7-2930-4BD3-8AC5-81A2534ACC99}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x86 = Debug|x86
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{29DF2EE7-2930-4BD3-8AC5-81A2534ACC99}.Debug|x86.ActiveCfg = Debug|Win32
{29DF2EE7-2930-4BD3-8AC5-81A2534ACC99}.Debug|x86.Build.0 = Debug|Win32
{29DF2EE7-2930-4BD3-8AC5-81A2534ACC99}.Release|x86.ActiveCfg = Release|Win32
{29DF2EE7-2930-4BD3-8AC5-81A2534ACC99}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,27 @@
LIBRARY "msvc-2017"
EXPORTS
retro_set_environment
retro_set_video_refresh
retro_set_audio_sample
retro_set_audio_sample_batch
retro_set_input_poll
retro_set_input_state
retro_init
retro_deinit
retro_api_version
retro_get_system_info
retro_get_system_av_info
retro_set_controller_port_device
retro_reset
retro_run
retro_serialize_size
retro_serialize
retro_unserialize
retro_cheat_reset
retro_cheat_set
retro_load_game
retro_load_game_special
retro_unload_game
retro_get_region
retro_get_memory_data
retro_get_memory_size

View File

@ -0,0 +1,154 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\..\core\cart_hw\areplay.c" />
<ClCompile Include="..\..\..\core\cart_hw\eeprom_93c.c" />
<ClCompile Include="..\..\..\core\cart_hw\eeprom_i2c.c" />
<ClCompile Include="..\..\..\core\cart_hw\eeprom_spi.c" />
<ClCompile Include="..\..\..\core\cart_hw\ggenie.c" />
<ClCompile Include="..\..\..\core\cart_hw\md_cart.c" />
<ClCompile Include="..\..\..\core\cart_hw\sms_cart.c" />
<ClCompile Include="..\..\..\core\cart_hw\sram.c" />
<ClCompile Include="..\..\..\core\cart_hw\svp\ssp16.c" />
<ClCompile Include="..\..\..\core\cart_hw\svp\svp.c" />
<ClCompile Include="..\..\..\core\cd_hw\cdc.c" />
<ClCompile Include="..\..\..\core\cd_hw\cdd.c" />
<ClCompile Include="..\..\..\core\cd_hw\cd_cart.c" />
<ClCompile Include="..\..\..\core\cd_hw\gfx.c" />
<ClCompile Include="..\..\..\core\cd_hw\pcm.c" />
<ClCompile Include="..\..\..\core\cd_hw\scd.c" />
<ClCompile Include="..\..\..\core\genesis.c" />
<ClCompile Include="..\..\..\core\input_hw\activator.c" />
<ClCompile Include="..\..\..\core\input_hw\gamepad.c" />
<ClCompile Include="..\..\..\core\input_hw\graphic_board.c" />
<ClCompile Include="..\..\..\core\input_hw\input.c" />
<ClCompile Include="..\..\..\core\input_hw\lightgun.c" />
<ClCompile Include="..\..\..\core\input_hw\mouse.c" />
<ClCompile Include="..\..\..\core\input_hw\paddle.c" />
<ClCompile Include="..\..\..\core\input_hw\sportspad.c" />
<ClCompile Include="..\..\..\core\input_hw\teamplayer.c" />
<ClCompile Include="..\..\..\core\input_hw\terebi_oekaki.c" />
<ClCompile Include="..\..\..\core\input_hw\xe_1ap.c" />
<ClCompile Include="..\..\..\core\io_ctrl.c" />
<ClCompile Include="..\..\..\core\loadrom.c" />
<ClCompile Include="..\..\..\core\m68k\m68kcpu.c" />
<ClCompile Include="..\..\..\core\m68k\s68kcpu.c" />
<ClCompile Include="..\..\..\core\mem68k.c" />
<ClCompile Include="..\..\..\core\membnk.c" />
<ClCompile Include="..\..\..\core\memz80.c" />
<ClCompile Include="..\..\..\core\ntsc\md_ntsc.c" />
<ClCompile Include="..\..\..\core\ntsc\sms_ntsc.c" />
<ClCompile Include="..\..\..\core\sound\blip_buf.c" />
<ClCompile Include="..\..\..\core\sound\eq.c" />
<ClCompile Include="..\..\..\core\sound\psg.c" />
<ClCompile Include="..\..\..\core\sound\sound.c" />
<ClCompile Include="..\..\..\core\sound\ym2413.c" />
<ClCompile Include="..\..\..\core\sound\ym2612.c" />
<ClCompile Include="..\..\..\core\state.c" />
<ClCompile Include="..\..\..\core\system.c" />
<ClCompile Include="..\..\..\core\tremor\bitwise.c" />
<ClCompile Include="..\..\..\core\tremor\block.c" />
<ClCompile Include="..\..\..\core\tremor\codebook.c" />
<ClCompile Include="..\..\..\core\tremor\floor0.c" />
<ClCompile Include="..\..\..\core\tremor\floor1.c" />
<ClCompile Include="..\..\..\core\tremor\framing.c" />
<ClCompile Include="..\..\..\core\tremor\info.c" />
<ClCompile Include="..\..\..\core\tremor\mapping0.c" />
<ClCompile Include="..\..\..\core\tremor\mdct.c" />
<ClCompile Include="..\..\..\core\tremor\registry.c" />
<ClCompile Include="..\..\..\core\tremor\res012.c" />
<ClCompile Include="..\..\..\core\tremor\sharedbook.c" />
<ClCompile Include="..\..\..\core\tremor\synthesis.c" />
<ClCompile Include="..\..\..\core\tremor\vorbisfile.c" />
<ClCompile Include="..\..\..\core\tremor\window.c" />
<ClCompile Include="..\..\..\core\vdp_ctrl.c" />
<ClCompile Include="..\..\..\core\vdp_render.c" />
<ClCompile Include="..\..\..\core\z80\z80.c" />
<ClCompile Include="..\..\libretro.c" />
<ClCompile Include="..\..\scrc32.c" />
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{29DF2EE7-2930-4BD3-8AC5-81A2534ACC99}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>msvc2017</RootNamespace>
<ProjectName>msvc-2017</ProjectName>
<WindowsTargetPlatformVersion>10.0.14393.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>Unicode</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<OutDir>$(SolutionDir)msvc-2017\$(Configuration)\</OutDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<OutDir>$(SolutionDir)msvc-2017\$(Configuration)\</OutDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;MSVC2017_EXPORTS;_CRT_SECURE_NO_WARNINGS;INLINE=static _inline;__inline__=_inline;__extension__=;LSB_FIRST;__LIBRETRO__;USE_16BPP_RENDERING;FRONTEND_SUPPORTS_RGB565;%(PreprocessorDefinitions);USE_LIBTREMOR;BYTE_ORDER=LITTLE_ENDIAN</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(SolutionDir)/../../core;$(SolutionDir)/../../utils/zlib;$(SolutionDir)/../../core/cart_hw/svp;$(SolutionDir)/../../libretro;$(SolutionDir)/../../core/m68k;$(SolutionDir)/../../core/z80;$(SolutionDir)/../../core/input_hw;$(SolutionDir)/../../core/cart_hw;$(SolutionDir)/../../core/sound;$(SolutionDir)/../../core/ntsc;$(SolutionDir)/../../core/cd_hw;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<ModuleDefinitionFile>libretro.def</ModuleDefinitionFile>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>
</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;MSVC2017_EXPORTS;_CRT_SECURE_NO_WARNINGS;INLINE=static _inline;__inline__=_inline;__extension__=;LSB_FIRST;__LIBRETRO__;USE_16BPP_RENDERING;FRONTEND_SUPPORTS_RGB565;%(PreprocessorDefinitions);USE_LIBTREMOR;BYTE_ORDER=LITTLE_ENDIAN</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(SolutionDir)/../../core;$(SolutionDir)/../../utils/zlib;$(SolutionDir)/../../core/cart_hw/svp;$(SolutionDir)/../../libretro;$(SolutionDir)/../../core/m68k;$(SolutionDir)/../../core/z80;$(SolutionDir)/../../core/input_hw;$(SolutionDir)/../../core/cart_hw;$(SolutionDir)/../../core/sound;$(SolutionDir)/../../core/ntsc;$(SolutionDir)/../../core/cd_hw;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<ModuleDefinitionFile>libretro.def</ModuleDefinitionFile>
</Link>
</ItemDefinitionGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -0,0 +1,241 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
<Filter Include="Source Files\z80">
<UniqueIdentifier>{e0f9ca3b-df0f-4cf9-bde1-9fa3c945b0df}</UniqueIdentifier>
</Filter>
<Filter Include="Source Files\m68k">
<UniqueIdentifier>{0605ef1a-d898-494c-a898-8f06000646ae}</UniqueIdentifier>
</Filter>
<Filter Include="Source Files\cart_hw">
<UniqueIdentifier>{8b373848-96f7-4410-a466-5d7cb6866b0f}</UniqueIdentifier>
</Filter>
<Filter Include="Source Files\cart_hw\svp">
<UniqueIdentifier>{ea37a461-94f4-40e3-91a8-2b254b94f547}</UniqueIdentifier>
</Filter>
<Filter Include="Source Files\input_hw">
<UniqueIdentifier>{becebb08-7987-4fe3-8ee0-dd47889d4996}</UniqueIdentifier>
</Filter>
<Filter Include="Source Files\ntsc">
<UniqueIdentifier>{e66cf784-cb76-4a70-a2e0-327a3b4c96eb}</UniqueIdentifier>
</Filter>
<Filter Include="Source Files\sound">
<UniqueIdentifier>{39a1110f-2062-4e3c-9f43-aca63cc20cda}</UniqueIdentifier>
</Filter>
<Filter Include="Source Files\libretro">
<UniqueIdentifier>{95e90e29-1915-4f70-b6e0-50b9dace48cf}</UniqueIdentifier>
</Filter>
<Filter Include="Source Files\cd_hw">
<UniqueIdentifier>{eba4b43d-dbd8-4170-9853-e3234db6dfc0}</UniqueIdentifier>
</Filter>
<Filter Include="Source Files\tremor">
<UniqueIdentifier>{c4a5e1da-1ff3-4c81-893c-97364ed7ed4b}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\..\core\cart_hw\svp\svp.c">
<Filter>Source Files\cart_hw\svp</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\cart_hw\svp\ssp16.c">
<Filter>Source Files\cart_hw\svp</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\cart_hw\sram.c">
<Filter>Source Files\cart_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\cart_hw\areplay.c">
<Filter>Source Files\cart_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\cart_hw\ggenie.c">
<Filter>Source Files\cart_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\cart_hw\md_cart.c">
<Filter>Source Files\cart_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\cart_hw\sms_cart.c">
<Filter>Source Files\cart_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\input_hw\xe_a1p.c">
<Filter>Source Files\input_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\input_hw\activator.c">
<Filter>Source Files\input_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\input_hw\gamepad.c">
<Filter>Source Files\input_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\input_hw\input.c">
<Filter>Source Files\input_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\input_hw\lightgun.c">
<Filter>Source Files\input_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\input_hw\mouse.c">
<Filter>Source Files\input_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\input_hw\paddle.c">
<Filter>Source Files\input_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\input_hw\sportspad.c">
<Filter>Source Files\input_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\input_hw\teamplayer.c">
<Filter>Source Files\input_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\input_hw\terebi_oekaki.c">
<Filter>Source Files\input_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\libretro.c">
<Filter>Source Files\libretro</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\m68k\s68kcpu.c">
<Filter>Source Files\m68k</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\m68k\m68kcpu.c">
<Filter>Source Files\m68k</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\ntsc\sms_ntsc.c">
<Filter>Source Files\ntsc</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\ntsc\md_ntsc.c">
<Filter>Source Files\ntsc</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\sound\ym2612.c">
<Filter>Source Files\sound</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\sound\eq.c">
<Filter>Source Files\sound</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\sound\psg.c">
<Filter>Source Files\sound</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\sound\sound.c">
<Filter>Source Files\sound</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\sound\ym2413.c">
<Filter>Source Files\sound</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\z80\z80.c">
<Filter>Source Files\z80</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\vdp_render.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\genesis.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\io_ctrl.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\loadrom.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\mem68k.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\membnk.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\memz80.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\state.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\system.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\vdp_ctrl.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\cd_hw\scd.c">
<Filter>Source Files\cd_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\cd_hw\cd_cart.c">
<Filter>Source Files\cd_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\cd_hw\cdc.c">
<Filter>Source Files\cd_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\cd_hw\cdd.c">
<Filter>Source Files\cd_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\cd_hw\gfx.c">
<Filter>Source Files\cd_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\cd_hw\pcm.c">
<Filter>Source Files\cd_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\scrc32.c">
<Filter>Source Files\libretro</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\cart_hw\eeprom_spi.c">
<Filter>Source Files\cart_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\cart_hw\eeprom_93c.c">
<Filter>Source Files\cart_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\cart_hw\eeprom_i2c.c">
<Filter>Source Files\cart_hw</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\sound\blip_buf.c">
<Filter>Source Files\sound</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\tremor\window.c">
<Filter>Source Files\tremor</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\tremor\bitwise.c">
<Filter>Source Files\tremor</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\tremor\block.c">
<Filter>Source Files\tremor</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\tremor\codebook.c">
<Filter>Source Files\tremor</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\tremor\floor0.c">
<Filter>Source Files\tremor</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\tremor\floor1.c">
<Filter>Source Files\tremor</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\tremor\framing.c">
<Filter>Source Files\tremor</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\tremor\info.c">
<Filter>Source Files\tremor</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\tremor\mapping0.c">
<Filter>Source Files\tremor</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\tremor\mdct.c">
<Filter>Source Files\tremor</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\tremor\registry.c">
<Filter>Source Files\tremor</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\tremor\res012.c">
<Filter>Source Files\tremor</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\tremor\sharedbook.c">
<Filter>Source Files\tremor</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\tremor\synthesis.c">
<Filter>Source Files\tremor</Filter>
</ClCompile>
<ClCompile Include="..\..\..\core\tremor\vorbisfile.c">
<Filter>Source Files\tremor</Filter>
</ClCompile>
</ItemGroup>
</Project>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ShowAllFiles>true</ShowAllFiles>
</PropertyGroup>
</Project>

View File

@ -116,8 +116,6 @@ END USERS SHOULD PREFERABLY USE LIBRETRO PORT WITH RETROARCH.
Original YM2612/YM2413 cores by Jarek Burczynski & Tatsuyuki Satoh Original YM2612/YM2413 cores by Jarek Burczynski & Tatsuyuki Satoh
Original SN76489 core by Maxim
Original SVP core by Notaz Original SVP core by Notaz
Blip Buffer & NTSC Video filter libraries by Shay Green (Blargg) Blip Buffer & NTSC Video filter libraries by Shay Green (Blargg)