Merge pull request #79 from sergiobenrocha2/master

Upstream changes & Makefile cleanup
This commit is contained in:
Twinaphex 2017-04-20 06:52:28 +02:00 committed by GitHub
commit 365a28c734
25 changed files with 986 additions and 519 deletions

4
.gitignore vendored
View File

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

View File

@ -70,6 +70,7 @@ Genesis Plus GX 1.7.5 (xx/xx/xxxx) (Eke-Eke)
[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)
* fixed SG-1000 internal RAM size (1KB instead of 2KB)
* restored SG-1000 Pause button support
@ -77,6 +78,7 @@ Genesis Plus GX 1.7.5 (xx/xx/xxxx) (Eke-Eke)
[Core/CPU]
---------------
* 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 SP register initialization on power-on for Master System & Game Gear
(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
* 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]
---------------

View File

@ -2,10 +2,12 @@ DEBUG = 0
LOGSOUND = 0
FRONTEND_SUPPORTS_RGB565 = 1
# system platform
ifeq ($(platform),)
platform = unix
ifeq ($(shell uname -a),)
platform = win
EXE_EXT = .exe
else ifneq ($(findstring MINGW,$(shell uname -a)),)
platform = win
else ifneq ($(findstring Darwin,$(shell uname -a)),)
@ -17,38 +19,42 @@ ifeq ($(platform),)
else ifneq ($(findstring win,$(shell uname -a)),)
platform = win
endif
endif
# system platform
system_platform = unix
ifeq ($(shell uname -a),)
EXE_EXT = .exe
system_platform = win
else ifneq ($(findstring Darwin,$(shell uname -a)),)
system_platform = osx
arch = intel
ifeq ($(shell uname -p),powerpc)
arch = ppc
endif
else ifneq ($(findstring MINGW,$(shell uname -a)),)
system_platform = win
else ifneq (,$(findstring armv,$(platform)))
override platform += unix
else ifneq (,$(findstring rpi,$(platform)))
override platform += unix
endif
TARGET_NAME := genesis_plus_gx
LIBM := -lm
GIT_VERSION ?= " $(shell git rev-parse --short HEAD || echo unknown)"
ifneq ($(GIT_VERSION)," unknown")
CFLAGS += -DGIT_VERSION=\"$(GIT_VERSION)\"
endif
# Unix
ifeq ($(platform), unix)
ifneq (,$(findstring unix,$(platform)))
TARGET := $(TARGET_NAME)_libretro.so
fpic := -fPIC
SHARED := -shared -Wl,--version-script=libretro/link.T -Wl,--no-undefined
ENDIANNESS_DEFINES := -DLSB_FIRST -DBYTE_ORDER=LITTLE_ENDIAN
PLATFORM_DEFINES := -DHAVE_ZLIB
# Raspberry Pi
ifneq (,$(findstring rpi,$(platform)))
ENDIANNESS_DEFINES += -DALIGN_LONG
CFLAGS += -fomit-frame-pointer -ffast-math
ifneq (,$(findstring rpi1,$(platform)))
PLATFORM_DEFINES += -DARM11 -marm -march=armv6j -mfpu=vfp -mfloat-abi=hard
else ifneq (,$(findstring rpi2,$(platform)))
PLATFORM_DEFINES += -DARM -marm -mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard
else ifneq (,$(findstring rpi3,$(platform)))
PLATFORM_DEFINES += -DARM -marm -mcpu=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard
endif
endif
# Portable Linux
else ifeq ($(platform), linux-portable)
TARGET := $(TARGET_NAME)_libretro.so
@ -57,6 +63,7 @@ else ifeq ($(platform), linux-portable)
ENDIANNESS_DEFINES := -DLSB_FIRST -DBYTE_ORDER=LITTLE_ENDIAN
PLATFORM_DEFINES := -DHAVE_ZLIB
LIBM :=
# OS X
else ifeq ($(platform), osx)
TARGET := $(TARGET_NAME)_libretro.dylib
@ -79,7 +86,6 @@ else ifeq ($(platform), osx)
# iOS
else ifneq (,$(findstring ios,$(platform)))
TARGET := $(TARGET_NAME)_libretro_ios.dylib
fpic := -fPIC
SHARED := -dynamiclib
@ -91,13 +97,13 @@ else ifneq (,$(findstring ios,$(platform)))
endif
CC = cc -arch armv7 -isysroot $(IOSSDK)
ifeq ($(platform),ios9)
ifeq ($(platform),ios9)
CC += -miphoneos-version-min=8.0
PLATFORM_DEFINES += -miphoneos-version-min=8.0
else
else
CC += -miphoneos-version-min=5.0
PLATFORM_DEFINES += -miphoneos-version-min=5.0
endif
endif
# Theos
else ifeq ($(platform), theos_ios)
@ -125,28 +131,29 @@ else ifeq ($(platform), qnx)
PLATFORM_DEFINES := -D__BLACKBERRY_QNX__ -marm -mcpu=cortex-a9 -mfpu=neon -mfloat-abi=softfp
# PS3
else ifeq ($(platform), ps3)
else ifneq (,$(filter $(platform), ps3 sncps3 psl1ght))
TARGET := $(TARGET_NAME)_libretro_ps3.a
CC = $(CELL_SDK)/host-win32/ppu/bin/ppu-lv2-gcc.exe
AR = $(CELL_SDK)/host-win32/ppu/bin/ppu-lv2-ar.exe
PLATFORM_DEFINES := -D__CELLOS_LV2 -DALT_RENDER -DBYTE_ORDER=BIG_ENDIAN
PLATFORM_DEFINES := -D__CELLOS_LV2 -DALT_RENDER
STATIC_LINKING = 1
# sncps3
else ifeq ($(platform), sncps3)
TARGET := $(TARGET_NAME)_libretro_ps3.a
# sncps3
ifneq (,$(findstring sncps3,$(platform)))
CC = $(CELL_SDK)/host-win32/sn/bin/ps3ppusnc.exe
AR = $(CELL_SDK)/host-win32/sn/bin/ps3snarl.exe
PLATFORM_DEFINES := -D__CELLOS_LV2 -DALT_RENDER -DBYTE_ORDER=BIG_ENDIAN
STATIC_LINKING = 1
PLATFORM_DEFINES += -DBYTE_ORDER=BIG_ENDIAN
# Lightweight PS3 Homebrew SDK
else ifeq ($(platform), psl1ght)
# PS3
else ifneq (,$(findstring ps3,$(platform)))
CC = $(CELL_SDK)/host-win32/ppu/bin/ppu-lv2-gcc.exe
AR = $(CELL_SDK)/host-win32/ppu/bin/ppu-lv2-ar.exe
PLATFORM_DEFINES += -DBYTE_ORDER=BIG_ENDIAN
# Lightweight PS3 Homebrew SDK
else ifneq (,$(findstring psl1ght,$(platform)))
TARGET := $(TARGET_NAME)_libretro_$(platform).a
CC = $(PS3DEV)/ppu/bin/ppu-gcc$(EXE_EXT)
AR = $(PS3DEV)/ppu/bin/ppu-ar$(EXE_EXT)
PLATFORM_DEFINES := -D__CELLOS_LV2 -DALT_RENDER
STATIC_LINKING = 1
endif
# PSP
else ifeq ($(platform), psp1)
@ -180,42 +187,6 @@ else ifeq ($(platform), ctr)
CFLAGS += -fomit-frame-pointer -ffast-math
STATIC_LINKING = 1
# Raspberry Pi 1
else ifeq ($(platform), rpi1)
TARGET := $(TARGET_NAME)_libretro.so
fpic := -fPIC
SHARED := -shared -Wl,--version-script=libretro/link.T -Wl,--no-undefined
PLATFORM_DEFINES := -DHAVE_ZLIB
PLATFORM_DEFINES += -DARM11
PLATFORM_DEFINES += -marm -march=armv6j -mfloat-abi=hard -mfpu=vfp
ENDIANNESS_DEFINES := -DLSB_FIRST -DALIGN_LONG -DBYTE_ORDER=LITTLE_ENDIAN
CFLAGS += -fomit-frame-pointer -ffast-math
CXXFLAGS = $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11
# Raspberry Pi 2
else ifeq ($(platform), rpi2)
TARGET := $(TARGET_NAME)_libretro.so
fpic := -fPIC
SHARED := -shared -Wl,--version-script=libretro/link.T -Wl,--no-undefined
PLATFORM_DEFINES := -DHAVE_ZLIB
PLATFORM_DEFINES += -DARM
PLATFORM_DEFINES += -marm -mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard
ENDIANNESS_DEFINES := -DLSB_FIRST -DALIGN_LONG -DBYTE_ORDER=LITTLE_ENDIAN
CFLAGS += -fomit-frame-pointer -ffast-math
CXXFLAGS = $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11
# Raspberry Pi 3
else ifeq ($(platform), rpi3)
TARGET := $(TARGET_NAME)_libretro.so
fpic := -fPIC
SHARED := -shared -Wl,--version-script=libretro/link.T -Wl,--no-undefined
PLATFORM_DEFINES := -DHAVE_ZLIB
PLATFORM_DEFINES += -DARM
PLATFORM_DEFINES += -marm -mcpu=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard
ENDIANNESS_DEFINES := -DLSB_FIRST -DALIGN_LONG -DBYTE_ORDER=LITTLE_ENDIAN
CFLAGS += -fomit-frame-pointer -ffast-math
CXXFLAGS = $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11
# Xbox 360
else ifeq ($(platform), xenon)
TARGET := $(TARGET_NAME)_libretro_xenon360.a
@ -225,60 +196,28 @@ else ifeq ($(platform), xenon)
ENDIANNESS_DEFINES := -DBYTE_ORDER=BIG_ENDIAN
STATIC_LINKING = 1
# Nintendo Game Cube
else ifeq ($(platform), ngc)
# Nintendo GameCube / Wii / WiiU
else ifneq (,$(filter $(platform), ngc wii wiiu))
TARGET := $(TARGET_NAME)_libretro_$(platform).a
CC = $(DEVKITPPC)/bin/powerpc-eabi-gcc$(EXE_EXT)
AR = $(DEVKITPPC)/bin/powerpc-eabi-ar$(EXE_EXT)
ENDIANNESS_DEFINES := -DBYTE_ORDER=BIG_ENDIAN
PLATFORM_DEFINES := -DGEKKO -DHW_DOL -mrvl -mcpu=750 -meabi -mhard-float -DALT_RENDER
PLATFORM_DEFINES := -DGEKKO -mcpu=750 -meabi -mhard-float -DALT_RENDER
PLATFORM_DEFINES += -U__INT32_TYPE__ -U __UINT32_TYPE__ -D__INT32_TYPE__=int
STATIC_LINKING = 1
# Nintendo Wii
else ifeq ($(platform), wii)
TARGET := $(TARGET_NAME)_libretro_$(platform).a
CC = $(DEVKITPPC)/bin/powerpc-eabi-gcc$(EXE_EXT)
AR = $(DEVKITPPC)/bin/powerpc-eabi-ar$(EXE_EXT)
PLATFORM_DEFINES := -DGEKKO -DHW_RVL -mrvl -mcpu=750 -meabi -mhard-float -DALT_RENDER
PLATFORM_DEFINES += -U__INT32_TYPE__ -U __UINT32_TYPE__ -D__INT32_TYPE__=int
ENDIANNESS_DEFINES := -DBYTE_ORDER=BIG_ENDIAN
STATIC_LINKING = 1
# Nintendo WiiU
ifneq (,$(findstring wiiu,$(platform)))
PLATFORM_DEFINES += -DWIIU -DHW_RVL -mwup -DUSE_DYNAMIC_ALLOC
# Nintendo WiiU
else ifeq ($(platform), wiiu)
TARGET := $(TARGET_NAME)_libretro_$(platform).a
CC = $(DEVKITPPC)/bin/powerpc-eabi-gcc$(EXE_EXT)
AR = $(DEVKITPPC)/bin/powerpc-eabi-ar$(EXE_EXT)
PLATFORM_DEFINES := -DGEKKO -DWIIU -DHW_RVL -mwup -mcpu=750 -meabi -mhard-float -DALT_RENDER -DUSE_DYNAMIC_ALLOC
PLATFORM_DEFINES += -U__INT32_TYPE__ -U __UINT32_TYPE__ -D__INT32_TYPE__=int
ENDIANNESS_DEFINES := -DBYTE_ORDER=BIG_ENDIAN
STATIC_LINKING = 1
# Nintendo Wii
else ifneq (,$(findstring wii,$(platform)))
PLATFORM_DEFINES += -DHW_RVL -mrvl
# ARM
else ifneq (,$(findstring armv,$(platform)))
TARGET := $(TARGET_NAME)_libretro.so
fpic := -fPIC
SHARED := -shared -Wl,--version-script=libretro/link.T -Wl,--no-undefined
ENDIANNESS_DEFINES := -DLSB_FIRST -DBYTE_ORDER=LITTLE_ENDIAN
PLATFORM_DEFINES := -DHAVE_ZLIB
ifneq (,$(findstring cortexa5,$(platform)))
PLATFORM_DEFINES += -marm -mcpu=cortex-a5
else ifneq (,$(findstring cortexa8,$(platform)))
PLATFORM_DEFINES += -marm -mcpu=cortex-a8
else ifneq (,$(findstring cortexa9,$(platform)))
PLATFORM_DEFINES += -marm -mcpu=cortex-a9
else ifneq (,$(findstring cortexa15a7,$(platform)))
PLATFORM_DEFINES += -marm -mcpu=cortex-a15.cortex-a7
else
PLATFORM_DEFINES += -marm
# Nintendo GameCube
else ifneq (,$(findstring ngc,$(platform)))
PLATFORM_DEFINES += -DHW_DOL -mrvl
endif
ifneq (,$(findstring softfloat,$(platform)))
PLATFORM_DEFINES += -mfloat-abi=softfp
else ifneq (,$(findstring hardfloat,$(platform)))
PLATFORM_DEFINES += -mfloat-abi=hard
endif
PLATFORM_DEFINES += -DARM
# emscripten
else ifeq ($(platform), emscripten)
@ -290,7 +229,6 @@ else ifeq ($(platform), emscripten)
else ifeq ($(platform), gcw0)
TARGET := $(TARGET_NAME)_libretro.so
CC = /opt/gcw0-toolchain/usr/bin/mipsel-linux-gcc
CXX = /opt/gcw0-toolchain/usr/bin/mipsel-linux-g++
AR = /opt/gcw0-toolchain/usr/bin/mipsel-linux-ar
SHARED := -shared -Wl,--version-script=libretro/link.T -Wl,--no-undefined
fpic := -fPIC
@ -310,6 +248,9 @@ else
endif
LDFLAGS += $(LIBM)
ifeq ($(SHARED_LIBVORBIS), 1)
LDFLAGS += -lvorbisfile
endif
ifeq ($(DEBUG), 1)
CFLAGS += -O0 -g
@ -323,7 +264,9 @@ endif
CORE_DIR := .
TREMOR_SRC_DIR := $(CORE_DIR)/core/tremor
ifeq ($(SHARED_LIBVORBIS),)
TREMOR_SRC_DIR := $(CORE_DIR)/core/tremor
endif
LIBRETRO_DIR := $(CORE_DIR)/libretro
include $(LIBRETRO_DIR)/Makefile.common
@ -334,7 +277,11 @@ ifeq ($(LOGSOUND), 1)
LIBRETRO_CFLAGS := -DLOGSOUND
endif
DEFINES := -DUSE_LIBTREMOR
ifeq ($(SHARED_LIBVORBIS), 1)
DEFINES := -DUSE_LIBVORBIS
else
DEFINES := -DUSE_LIBTREMOR
endif
CFLAGS += $(fpic) $(DEFINES) $(CODE_DEFINES)
ifeq ($(FRONTEND_SUPPORTS_RGB565), 1)
@ -367,7 +314,7 @@ else
all: $(TARGET)
%.o: %.c
$(CC) -o $@ -c $< $(CFLAGS) $(LIBRETRO_CFLAGS)
$(CC) -o $@ -c $< $(CPPFLAGS) $(CFLAGS) $(LIBRETRO_CFLAGS)
$(TARGET): $(OBJECTS)
ifeq ($(STATIC_LINKING), 1)

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
* 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
* 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) */
{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) */
{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) */
{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) */
{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) */
/* 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) */
{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 */

View File

@ -2,7 +2,7 @@
* Genesis Plus
* 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
* provided that the following conditions are met:

View File

@ -31,6 +31,8 @@
- added proper cycle use on reset
- added cycle accurate timings for MUL/DIV instructions (thanks to Jorge Cwik !)
- 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
*/

View File

@ -143,13 +143,15 @@ static void m68k_op_abcd_8_rr(void)
uint src = DY;
uint dst = *r_dst;
uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1();
FLAG_V = ~res; /* Undefined V behavior */
uint corf = 0;
if(res > 9)
res += 6;
corf = 6;
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)
res -= 0xa0;
@ -169,13 +171,15 @@ static void m68k_op_abcd_8_mm_ax7(void)
uint ea = EA_A7_PD_8();
uint dst = m68ki_read_8(ea);
uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1();
FLAG_V = ~res; /* Undefined V behavior */
uint corf = 0;
if(res > 9)
res += 6;
corf = 6;
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)
res -= 0xa0;
@ -195,13 +199,15 @@ static void m68k_op_abcd_8_mm_ay7(void)
uint ea = EA_AX_PD_8();
uint dst = m68ki_read_8(ea);
uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1();
FLAG_V = ~res; /* Undefined V behavior */
uint corf = 0;
if(res > 9)
res += 6;
corf = 6;
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)
res -= 0xa0;
@ -221,13 +227,15 @@ static void m68k_op_abcd_8_mm_axy7(void)
uint ea = EA_A7_PD_8();
uint dst = m68ki_read_8(ea);
uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1();
FLAG_V = ~res; /* Undefined V behavior */
uint corf = 0;
if(res > 9)
res += 6;
corf = 6;
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)
res -= 0xa0;
@ -247,13 +255,15 @@ static void m68k_op_abcd_8_mm(void)
uint ea = EA_AX_PD_8();
uint dst = m68ki_read_8(ea);
uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1();
FLAG_V = ~res; /* Undefined V behavior */
uint corf = 0;
if(res > 9)
res += 6;
corf = 6;
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)
res -= 0xa0;
@ -15846,32 +15856,33 @@ static void m68k_op_nbcd_8_d(void)
{
uint* r_dst = &DY;
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)
res = (res & 0xf0) + 0x10;
if(((res|dst) & 0x0f) == 0x0)
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;
FLAG_Z |= res;
FLAG_C = CFLAG_SET;
FLAG_X = XFLAG_SET;
FLAG_N = NFLAG_8(res); /* Undefined N behavior */
}
else
{
FLAG_V = VFLAG_CLEAR;
FLAG_C = CFLAG_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 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)
res = (res & 0xf0) + 0x10;
if(((res|dst) & 0x0f) == 0x0)
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_C = CFLAG_SET;
FLAG_X = XFLAG_SET;
FLAG_N = NFLAG_8(res); /* Undefined N behavior */
}
else
{
FLAG_V = VFLAG_CLEAR;
FLAG_C = CFLAG_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 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)
res = (res & 0xf0) + 0x10;
if(((res|dst) & 0x0f) == 0x0)
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_C = CFLAG_SET;
FLAG_X = XFLAG_SET;
FLAG_N = NFLAG_8(res); /* Undefined N behavior */
}
else
{
FLAG_V = VFLAG_CLEAR;
FLAG_C = CFLAG_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 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)
res = (res & 0xf0) + 0x10;
if(((res|dst) & 0x0f) == 0x0)
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_C = CFLAG_SET;
FLAG_X = XFLAG_SET;
FLAG_N = NFLAG_8(res); /* Undefined N behavior */
}
else
{
FLAG_V = VFLAG_CLEAR;
FLAG_C = CFLAG_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 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)
res = (res & 0xf0) + 0x10;
if(((res|dst) & 0x0f) == 0x0)
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_C = CFLAG_SET;
FLAG_X = XFLAG_SET;
FLAG_N = NFLAG_8(res); /* Undefined N behavior */
}
else
{
FLAG_V = VFLAG_CLEAR;
FLAG_C = CFLAG_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 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)
res = (res & 0xf0) + 0x10;
if(((res|dst) & 0x0f) == 0x0)
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_C = CFLAG_SET;
FLAG_X = XFLAG_SET;
FLAG_N = NFLAG_8(res); /* Undefined N behavior */
}
else
{
FLAG_V = VFLAG_CLEAR;
FLAG_C = CFLAG_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 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)
res = (res & 0xf0) + 0x10;
if(((res|dst) & 0x0f) == 0x0)
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_C = CFLAG_SET;
FLAG_X = XFLAG_SET;
FLAG_N = NFLAG_8(res); /* Undefined N behavior */
}
else
{
FLAG_V = VFLAG_CLEAR;
FLAG_C = CFLAG_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 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)
res = (res & 0xf0) + 0x10;
if(((res|dst) & 0x0f) == 0x0)
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_C = CFLAG_SET;
FLAG_X = XFLAG_SET;
FLAG_N = NFLAG_8(res); /* Undefined N behavior */
}
else
{
FLAG_V = VFLAG_CLEAR;
FLAG_C = CFLAG_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 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)
res = (res & 0xf0) + 0x10;
if(((res|dst) & 0x0f) == 0x0)
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_C = CFLAG_SET;
FLAG_X = XFLAG_SET;
FLAG_N = NFLAG_8(res); /* Undefined N behavior */
}
else
{
FLAG_V = VFLAG_CLEAR;
FLAG_C = CFLAG_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 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)
res = (res & 0xf0) + 0x10;
if(((res|dst) & 0x0f) == 0x0)
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_C = CFLAG_SET;
FLAG_X = XFLAG_SET;
FLAG_N = NFLAG_8(res); /* Undefined N behavior */
}
else
{
FLAG_V = VFLAG_CLEAR;
FLAG_C = CFLAG_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 dst = *r_dst;
uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1();
uint corf = 0;
/* FLAG_V = ~res; */ /* Undefined V behavior */
FLAG_V = VFLAG_CLEAR; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to assume cleared. */
if(res > 0xf)
corf = 6;
if(res > 9)
res -= 6;
res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src);
if(res > 0x99)
FLAG_V = res; /* Undefined V behavior */
if(res > 0xff)
{
res += 0xa0;
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
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_N = NFLAG_8(res); */ /* Undefined N behavior */
FLAG_V &= ~res; /* Undefined V behavior part II */
FLAG_N = NFLAG_8(res); /* Undefined N behavior */
FLAG_Z |= 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 dst = m68ki_read_8(ea);
uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1();
uint corf = 0;
/* FLAG_V = ~res; */ /* Undefined V behavior */
FLAG_V = VFLAG_CLEAR; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to return zero. */
if(res > 9)
res -= 6;
if(res > 0xf)
corf = 6;
res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src);
if(res > 0x99)
FLAG_V = res; /* Undefined V behavior */
if(res > 0xff)
{
res += 0xa0;
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
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_N = NFLAG_8(res); */ /* Undefined N behavior */
FLAG_V &= ~res; /* Undefined V behavior part II */
FLAG_N = NFLAG_8(res); /* Undefined N behavior */
FLAG_Z |= 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 dst = m68ki_read_8(ea);
uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1();
uint corf = 0;
/* FLAG_V = ~res; */ /* Undefined V behavior */
FLAG_V = VFLAG_CLEAR; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to return zero. */
if(res > 9)
res -= 6;
if(res > 0xf)
corf = 6;
res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src);
if(res > 0x99)
FLAG_V = res; /* Undefined V behavior */
if(res > 0xff)
{
res += 0xa0;
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
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_N = NFLAG_8(res); */ /* Undefined N behavior */
FLAG_V &= ~res; /* Undefined V behavior part II */
FLAG_N = NFLAG_8(res); /* Undefined N behavior */
FLAG_Z |= 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 dst = m68ki_read_8(ea);
uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1();
uint corf = 0;
/* FLAG_V = ~res; */ /* Undefined V behavior */
FLAG_V = VFLAG_CLEAR; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to return zero. */
if(res > 9)
res -= 6;
if(res > 0xf)
corf = 6;
res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src);
if(res > 0x99)
FLAG_V = res; /* Undefined V behavior */
if(res > 0xff)
{
res += 0xa0;
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
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_N = NFLAG_8(res); */ /* Undefined N behavior */
FLAG_V &= ~res; /* Undefined V behavior part II */
FLAG_N = NFLAG_8(res); /* Undefined N behavior */
FLAG_Z |= 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 dst = m68ki_read_8(ea);
uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1();
uint corf = 0;
/* FLAG_V = ~res; */ /* Undefined V behavior */
FLAG_V = VFLAG_CLEAR; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to return zero. */
if(res > 9)
res -= 6;
if(res > 0xf)
corf = 6;
res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src);
if(res > 0x99)
FLAG_V = res; /* Undefined V behavior */
if(res > 0xff)
{
res += 0xa0;
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
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_N = NFLAG_8(res); */ /* Undefined N behavior */
FLAG_V &= ~res; /* Undefined V behavior part II */
FLAG_N = NFLAG_8(res); /* Undefined N behavior */
FLAG_Z |= res;
m68ki_write_8(ea, res);

View File

@ -46,4 +46,11 @@
#define INLINE static __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_ */

View File

@ -3,7 +3,7 @@
* Main 68k bus handlers
*
* 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
* 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);
}
case 0x10: /* MEMORY MODE */
case 0x12: /* Z80 RESET */
case 0x13: /* unknown */
case 0x40: /* TMSS */
case 0x44: /* RADICA */
case 0x50: /* SVP */
{
if ((address & 0xFC) == 0x00)
@ -436,6 +431,15 @@ unsigned int ctrl_io_read_byte(unsigned int 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 */
{
return m68k_lockup_r_8(address);

View File

@ -3,7 +3,7 @@
* Main 68k bus handlers
*
* 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
* provided that the following conditions are met:

View File

@ -6,7 +6,7 @@
*
* 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
* provided that the following conditions are met:
@ -78,6 +78,7 @@ static struct
{
int clocks;
int latch;
int zeroFreqInc;
int noiseShiftValue;
int noiseShiftWidth;
int noiseBitMask;
@ -103,6 +104,9 @@ void psg_init(PSG_TYPE type)
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 */
psg.noiseShiftWidth = noiseShiftWidth[type];
psg.noiseBitMask = noiseBitMask[type];
@ -117,7 +121,7 @@ void psg_reset()
{
psg.regs[i*2] = 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.polarity[i] = -1;
psg.chanDelta[i][0] = 0;
@ -126,8 +130,8 @@ void psg_reset()
psg.chanOut[i][1] = 0;
}
/* noise attenuation register is latched on power-on (verified on 315-5313A & 315-5660 integrated version only) */
psg.latch = 7;
/* tone #2 attenuation register is latched on power-on (verified on 315-5313A integrated version only) */
psg.latch = 3;
/* reset noise shift register */
psg.noiseShiftValue = 1 << psg.noiseShiftWidth;
@ -298,8 +302,8 @@ void psg_write(unsigned int clocks, unsigned int data)
}
else
{
/* zero value behaves the same as a value of 1 (verified on integrated version only) */
psg.freqInc[index>>1] = PSG_MCYCLES_RATIO;
/* zero value behaves the same as a value of 1 on integrated version (0x400 on discrete version) */
psg.freqInc[index>>1] = psg.zeroFreqInc;
}
/* 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;
}
/* 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;;
break;

View File

@ -6,7 +6,7 @@
*
* 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
* provided that the following conditions are met:

View File

@ -12,16 +12,27 @@
** 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
** 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:
** - better documentation
** - BUSY flag emulation
** - accurate DAC output
*/
/*
** 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):
** - removed input clock / output samplerate frequency ratio, chip now always run at (original) internal sample frequency
** - removed now uneeded extra bits of precision
@ -791,10 +802,11 @@ INLINE void INTERNAL_TIMER_B(int step)
ym2612.OPN.ST.status |= 0x02;
/* reload the counter */
if (ym2612.OPN.ST.TBL)
do
{
ym2612.OPN.ST.TBC += ym2612.OPN.ST.TBL;
else
ym2612.OPN.ST.TBC = ym2612.OPN.ST.TBL;
}
while (ym2612.OPN.ST.TBC <= 0);
}
}
}
@ -1268,29 +1280,23 @@ INLINE void update_ssg_eg_channels(FM_CH *CH)
} 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;
unsigned int kc, fc;
/* block is not modified by LFO PM */
UINT8 blk = fc >> 11;
/* 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;
/* LFO works with one more bit of a precision (12-bit) */
fc = ((fc << 1) + lfo_fn_offset) & 0xfff;
/* keyscale code */
kc = (blk<<2) | opn_fktable[block_fnum >> 8];
/* (frequency) phase increment counter */
fc = (((block_fnum << 5) >> (7 - blk)) + SLOT->DT[kc]) & DT_MASK;
/* (frequency) phase increment counter (17-bit) */
fc = (((fc << 5) >> (7 - blk)) + SLOT->DT[kc]) & DT_MASK;
/* update phase */
SLOT->phase += (fc * SLOT->mul) >> 1;
SLOT->phase += ((fc * SLOT->mul) >> 1);
}
else /* LFO phase modulation = zero */
{
@ -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)
{
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;
unsigned int kc, fc, finc;
UINT32 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;
/* block & keyscale code are not modified by LFO PM */
UINT8 blk = fc >> 11;
UINT8 kc = CH->kcode;
/* keyscale code */
kc = (blk<<2) | opn_fktable[block_fnum >> 8];
/* LFO works with one more bit of a precision (12-bit) */
fc = ((fc << 1) + lfo_fn_offset) & 0xfff;
/* (frequency) phase increment counter */
fc = (block_fnum << 5) >> (7 - blk);
/* (frequency) phase increment counter (17-bit) */
fc = (fc << 5) >> (7 - blk);
/* apply DETUNE & MUL operator specific values */
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;
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;
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;
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 */
{
@ -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)
{
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)
return 0;
@ -1424,32 +1427,31 @@ INLINE void chan_calc(FM_CH *CH, int num)
{
do
{
INT32 out = 0;
UINT32 AM = ym2612.OPN.LFO_AM >> CH->ams;
unsigned int eg_out = volume_calc(&CH->SLOT[SLOT1]);
m2 = c1 = c2 = mem = 0;
*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)
out = (CH->op1_out[0] + CH->op1_out[1]) >> CH->FB;
out = op_calc1(CH->SLOT[SLOT1].phase, eg_out, out );
}
CH->op1_out[0] = CH->op1_out[1];
CH->op1_out[1] = out;
if( !CH->connect1 ){
/* algorithm 5 */
mem = c1 = c2 = CH->op1_out[0];
mem = c1 = c2 = out;
}else{
/* other algorithms */
*CH->connect1 += CH->op1_out[0];
}
CH->op1_out[1] = 0;
if( eg_out < ENV_QUIET ) /* SLOT 1 */
{
if (!CH->FB)
out=0;
CH->op1_out[1] = op_calc1(CH->SLOT[SLOT1].phase, eg_out, (out<<CH->FB) );
}
*CH->connect1 = out;
}
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 */
if(CH->pms)
{
/* add support for 3 slot mode */
/* 3-slot mode */
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]);
update_phase_lfo_slot(&CH->SLOT[SLOT2], CH->pms, ym2612.OPN.SL3.block_fnum[2]);
update_phase_lfo_slot(&CH->SLOT[SLOT3], CH->pms, ym2612.OPN.SL3.block_fnum[0]);
update_phase_lfo_slot(&CH->SLOT[SLOT4], CH->pms, CH->block_fnum);
/* keyscale code is not modifiedby LFO */
UINT8 kc = ym2612.CH[2].kcode;
UINT32 pm = ym2612.CH[2].pms + ym2612.OPN.LFO_PM;
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
{
@ -1522,11 +1527,11 @@ INLINE void OPNWriteMode(int r, int v)
ym2612.OPN.LFO_AM = 126;
}
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.TAL = 1024 - ym2612.OPN.ST.TA;
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.TAL = 1024 - ym2612.OPN.ST.TA;
break;
@ -1727,7 +1732,7 @@ INLINE void OPNWriteReg(int r, int v)
case 0: /* 0xb0-0xb2 : FB,ALGO */
{
CH->ALGO = v&7;
CH->FB = (v>>3)&7;
CH->FB = SIN_BITS - ((v>>3)&7);
setup_connection( CH, c );
break;
}

View File

@ -54,10 +54,10 @@
}
/* VDP context */
uint8 sat[0x400] __attribute__((aligned(4))); /* Internal copy of sprite attribute table */
uint8 vram[0x10000] __attribute__((aligned(4))); /* Video RAM (64K x 8-bit) */
uint8 cram[0x80] __attribute__((aligned(4))); /* 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) sat[0x400]; /* Internal copy of sprite attribute table */
uint8 ALIGNED_(4) vram[0x10000]; /* Video RAM (64K x 8-bit) */
uint8 ALIGNED_(4) cram[0x80]; /* On-chip color RAM (64 x 9-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 hint_pending; /* 0= Line interrupt is pending */
uint8 vint_pending; /* 1= Frame interrupt is pending */

View File

@ -553,7 +553,7 @@ static const uint32 tms_palette[16] =
#endif
/* 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) */
static uint8 name_lut[0x400];

View File

@ -8,9 +8,13 @@ GENPLUS_SRC_DIR := $(CORE_DIR)/core \
$(CORE_DIR)/core/cart_hw \
$(CORE_DIR)/core/cart_hw/svp
SOURCES_C = $(foreach dir,$(GENPLUS_SRC_DIR),$(wildcard $(dir)/*.c)) \
$(foreach dir,$(TREMOR_SRC_DIR),$(wildcard $(dir)/*.c)) \
$(LIBRETRO_DIR)/libretro.c
SOURCES_C = $(foreach dir,$(GENPLUS_SRC_DIR),$(wildcard $(dir)/*.c))
ifeq ($(SHARED_LIBVORBIS),)
SOURCES_C += $(foreach dir,$(TREMOR_SRC_DIR),$(wildcard $(dir)/*.c))
endif
SOURCES_C += $(LIBRETRO_DIR)/libretro.c
SOURCES_C += $(LIBRETRO_DIR)/scrc32.c

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 SN76489 core by Maxim
Original SVP core by Notaz
Blip Buffer & NTSC Video filter libraries by Shay Green (Blargg)