From 8bda372bed05288ea9eac8e9f0e03c65e192008d Mon Sep 17 00:00:00 2001 From: goyuken Date: Sun, 4 May 2014 19:04:15 +0000 Subject: [PATCH] misc cleanup --- libgambatte/libgambatte.vcxproj | 2 - libgambatte/libgambatte.vcxproj.filters | 6 - libgambatte/src/file/file.cpp | 26 - libgambatte/src/file/file.h | 43 -- libgambatte/src/mem/cartridge.cpp | 1 - output/dll/libgambatte.dll | Bin 175616 -> 174080 bytes output/dll/libquicknes.dll | Bin 423364 -> 423364 bytes quicknes/libretro/Makefile | 216 ------- quicknes/libretro/jni/Android.mk | 75 --- quicknes/libretro/jni/Application.mk | 2 - quicknes/libretro/libretro.cpp | 267 --------- quicknes/libretro/libretro.h | 758 ------------------------ quicknes/libretro/link.T | 5 - 13 files changed, 1401 deletions(-) delete mode 100644 libgambatte/src/file/file.cpp delete mode 100644 libgambatte/src/file/file.h delete mode 100644 quicknes/libretro/Makefile delete mode 100644 quicknes/libretro/jni/Android.mk delete mode 100644 quicknes/libretro/jni/Application.mk delete mode 100644 quicknes/libretro/libretro.cpp delete mode 100644 quicknes/libretro/libretro.h delete mode 100644 quicknes/libretro/link.T diff --git a/libgambatte/libgambatte.vcxproj b/libgambatte/libgambatte.vcxproj index 08859d112d..c817c75164 100644 --- a/libgambatte/libgambatte.vcxproj +++ b/libgambatte/libgambatte.vcxproj @@ -93,7 +93,6 @@ - @@ -129,7 +128,6 @@ - diff --git a/libgambatte/libgambatte.vcxproj.filters b/libgambatte/libgambatte.vcxproj.filters index 5c86765634..e476b4c316 100644 --- a/libgambatte/libgambatte.vcxproj.filters +++ b/libgambatte/libgambatte.vcxproj.filters @@ -57,9 +57,6 @@ Header Files - - Header Files - Header Files @@ -176,9 +173,6 @@ Source Files - - Source Files - Source Files diff --git a/libgambatte/src/file/file.cpp b/libgambatte/src/file/file.cpp deleted file mode 100644 index fff66d2b1d..0000000000 --- a/libgambatte/src/file/file.cpp +++ /dev/null @@ -1,26 +0,0 @@ -/*************************************************************************** -Copyright (C) 2007 by Nach -http://nsrt.edgeemu.com - -Copyright (C) 2007-2011 by Sindre Aamås -aamas@stud.ntnu.no - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License version 2 as -published by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License version 2 for more details. - -You should have received a copy of the GNU General Public License -version 2 along with this program; if not, write to the -Free Software Foundation, Inc., -59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -***************************************************************************/ -#include "stdfile.h" - -std::auto_ptr gambatte::newFileInstance(const std::string &filepath) { - return std::auto_ptr(new StdFile(filepath.c_str())); -} diff --git a/libgambatte/src/file/file.h b/libgambatte/src/file/file.h deleted file mode 100644 index 23b23c05b4..0000000000 --- a/libgambatte/src/file/file.h +++ /dev/null @@ -1,43 +0,0 @@ -/*************************************************************************** -Copyright (C) 2007 by Nach -http://nsrt.edgeemu.com - -Copyright (C) 2007-2011 by Sindre Aamås -aamas@stud.ntnu.no - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License version 2 as -published by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License version 2 for more details. - -You should have received a copy of the GNU General Public License -version 2 along with this program; if not, write to the -Free Software Foundation, Inc., -59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -***************************************************************************/ -#ifndef GAMBATTE_FILE_H -#define GAMBATTE_FILE_H - -#include -#include - -namespace gambatte { - -class File { -public: - virtual ~File() {} - virtual void rewind() = 0; - virtual std::size_t size() const = 0; - virtual void read(char *buffer, std::size_t amount) = 0; - virtual bool fail() const = 0; -}; - -std::auto_ptr newFileInstance(const std::string &filepath); - -} - -#endif diff --git a/libgambatte/src/mem/cartridge.cpp b/libgambatte/src/mem/cartridge.cpp index 68e905f734..4b4c72b386 100644 --- a/libgambatte/src/mem/cartridge.cpp +++ b/libgambatte/src/mem/cartridge.cpp @@ -17,7 +17,6 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "cartridge.h" -#include "file/file.h" #include "../savestate.h" #include #include diff --git a/output/dll/libgambatte.dll b/output/dll/libgambatte.dll index 7946642f5b217ead2027deb60bda0bcfa4b92126..1cbdeb911f9d01c5833dd8c3446de637e1f25622 100644 GIT binary patch delta 26540 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 diff --git a/output/dll/libquicknes.dll b/output/dll/libquicknes.dll index 8a9ca092765b6be56df11842dfdab5ff040e5303..632c80874ca3f85ad2907e45bd72aeb5af32ee75 100644 GIT binary patch delta 54 zcmX@|TJp$i$q5}StrOCMC-(R-O}B2m)q0Du^%hg>E#|GaShRe>QtcdmEI`bn*0%Tg+Q;v1s{%rP?|CSb&&yJBJ_J G9(4fMx)*Q& diff --git a/quicknes/libretro/Makefile b/quicknes/libretro/Makefile deleted file mode 100644 index 8117af8704..0000000000 --- a/quicknes/libretro/Makefile +++ /dev/null @@ -1,216 +0,0 @@ -DEBUG = 0 - -ifeq ($(platform),) -platform = unix -ifeq ($(shell uname -a),) - platform = win -else ifneq ($(findstring MINGW,$(shell uname -a)),) - platform = win -else ifneq ($(findstring Darwin,$(shell uname -a)),) - platform = osx -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 -else ifneq ($(findstring MINGW,$(shell uname -a)),) - system_platform = win -endif - -LIBRETRO_DIR := libretro -TARGET_NAME := quicknes - -ifeq ($(platform), unix) - TARGET := $(TARGET_NAME)_libretro.so - fpic := -fPIC - SHARED := -shared -Wl,-version-script=link.T -Wl,-no-undefined -else ifeq ($(platform), osx) - TARGET := $(TARGET_NAME)_libretro.dylib - fpic := -fPIC - SHARED := -dynamiclib -else ifeq ($(platform), ios) - TARGET := $(TARGET_NAME)_libretro_ios.dylib - fpic := -fPIC - SHARED := -dynamiclib - - CC = clang -arch armv7 -isysroot $(IOSSDK) -miphoneos-version-min=5.0 - CXX = clang++ -arch armv7 -isysroot $(IOSSDK) -miphoneos-version-min=5.0 - PLATFORM_DEFINES += -DIOS -miphoneos-version-min=5.0 -else ifeq ($(platform), qnx) - TARGET := $(TARGET_NAME)_libretro_qnx.so - fpic := -fPIC - SHARED := -shared -Wl,--version-script=link.T - - CC = qcc -Vgcc_ntoarmv7le - CXX = QCC -Vgcc_ntoarmv7le - AR = QCC -Vgcc_ntoarmv7le - PLATFORM_DEFINES += -D__BLACKBERRY_QNX__ -else ifeq ($(platform), ps3) - TARGET := $(TARGET_NAME)_libretro_ps3.a - CXX = $(CELL_SDK)/host-win32/ppu/bin/ppu-lv2-g++.exe - AR = $(CELL_SDK)/host-win32/ppu/bin/ppu-lv2-ar.exe - PLATFORM_DEFINES := -D__CELLOS_LV2__ - STATIC_LINKING = 1 -else ifeq ($(platform), sncps3) - TARGET := $(TARGET_NAME)_libretro_ps3.a - CC = $(CELL_SDK)/host-win32/sn/bin/ps3ppusnc.exe - CXX = $(CELL_SDK)/host-win32/sn/bin/ps3ppusnc.exe - AR = $(CELL_SDK)/host-win32/sn/bin/ps3snarl.exe - PLATFORM_DEFINES := -D__CELLOS_LV2__ - STATIC_LINKING = 1 -else ifeq ($(platform), psl1ght) - TARGET := $(TARGET_NAME)_libretro_psl1ght.a - CC = $(PS3DEV)/ppu/bin/ppu-gcc$(EXE_EXT) - CXX = $(PS3DEV)/ppu/bin/ppu-g++$(EXE_EXT) - AR = $(PS3DEV)/ppu/bin/ppu-ar$(EXE_EXT) - PLATFORM_DEFINES := -D__CELLOS_LV2__ - STATIC_LINKING = 1 -else ifeq ($(platform), xenon) - TARGET := $(TARGET_NAME)_libretro_xenon360.a - CC = xenon-gcc$(EXE_EXT) - CXX = xenon-g++$(EXE_EXT) - AR = xenon-ar$(EXE_EXT) - PLATFORM_DEFINES := -D__LIBXENON__ - STATIC_LINKING = 1 -else ifeq ($(platform), ngc) - TARGET := $(TARGET_NAME)_libretro_ngc.a - CC = $(DEVKITPPC)/bin/powerpc-eabi-gcc$(EXE_EXT) - CXX = $(DEVKITPPC)/bin/powerpc-eabi-g++$(EXE_EXT) - AR = $(DEVKITPPC)/bin/powerpc-eabi-ar$(EXE_EXT) - PLATFORM_DEFINES += -DGEKKO -DHW_DOL -mrvl -mcpu=750 -meabi -mhard-float - STATIC_LINKING = 1 -else ifeq ($(platform), wii) - TARGET := $(TARGET_NAME)_libretro_wii.a - CC = $(DEVKITPPC)/bin/powerpc-eabi-gcc$(EXE_EXT) - CXX = $(DEVKITPPC)/bin/powerpc-eabi-g++$(EXE_EXT) - AR = $(DEVKITPPC)/bin/powerpc-eabi-ar$(EXE_EXT) - PLATFORM_DEFINES += -DGEKKO -DHW_RVL -mrvl -mcpu=750 -meabi -mhard-float - STATIC_LINKING = 1 -else ifneq (,$(findstring armv,$(platform))) - TARGET := $(TARGET_NAME)_libretro.so - fpic := -fPIC - SHARED := -shared -Wl,-version-script=link.T -Wl,-no-undefined - CC = gcc -ifneq (,$(findstring cortexa8,$(platform))) - PLATFORM_DEFINES += -marm -mcpu=cortex-a8 -else ifneq (,$(findstring cortexa9,$(platform))) - PLATFORM_DEFINES += -marm -mcpu=cortex-a9 -endif - PLATFORM_DEFINES += -marm -ifneq (,$(findstring neon,$(platform))) - PLATFORM_DEFINES += -mfpu=neon - HAVE_NEON = 1 -endif -ifneq (,$(findstring softfloat,$(platform))) - PLATFORM_DEFINES += -mfloat-abi=softfp -else ifneq (,$(findstring hardfloat,$(platform))) - PLATFORM_DEFINES += -mfloat-abi=hard -endif - PLATFORM_DEFINES += -DARM -else - TARGET := $(TARGET_NAME)_libretro.dll - CC = gcc - CXX = g++ - SHARED := -shared -static-libgcc -static-libstdc++ -Wl,-no-undefined -Wl,-version-script=link.T -endif - -all: $(TARGET) - -ifeq ($(DEBUG), 1) - CFLAGS += -O0 -g - CXXFLAGS += -O0 -g -else - CFLAGS += -O3 - CXXFLAGS += -O3 -endif - -EMU_DIR := ../nes_emu - -CXXSRCS := \ - $(EMU_DIR)/abstract_file.cpp \ - $(EMU_DIR)/apu_state.cpp \ - $(EMU_DIR)/Blip_Buffer.cpp \ - $(EMU_DIR)/Effects_Buffer.cpp \ - $(EMU_DIR)/Mapper_Fme7.cpp \ - $(EMU_DIR)/Mapper_Mmc5.cpp \ - $(EMU_DIR)/Mapper_Namco106.cpp \ - $(EMU_DIR)/Mapper_Vrc6.cpp \ - $(EMU_DIR)/misc_mappers.cpp \ - $(EMU_DIR)/Multi_Buffer.cpp \ - $(EMU_DIR)/Nes_Apu.cpp \ - $(EMU_DIR)/Nes_Buffer.cpp \ - $(EMU_DIR)/Nes_Cart.cpp \ - $(EMU_DIR)/Nes_Core.cpp \ - $(EMU_DIR)/Nes_Cpu.cpp \ - $(EMU_DIR)/nes_data.cpp \ - $(EMU_DIR)/Nes_Effects_Buffer.cpp \ - $(EMU_DIR)/Nes_Emu.cpp \ - $(EMU_DIR)/Nes_File.cpp \ - $(EMU_DIR)/Nes_Film.cpp \ - $(EMU_DIR)/Nes_Film_Data.cpp \ - $(EMU_DIR)/Nes_Film_Packer.cpp \ - $(EMU_DIR)/Nes_Fme7_Apu.cpp \ - $(EMU_DIR)/Nes_Mapper.cpp \ - $(EMU_DIR)/nes_mappers.cpp \ - $(EMU_DIR)/Nes_Mmc1.cpp \ - $(EMU_DIR)/Nes_Mmc3.cpp \ - $(EMU_DIR)/Nes_Namco_Apu.cpp \ - $(EMU_DIR)/Nes_Oscs.cpp \ - $(EMU_DIR)/Nes_Ppu.cpp \ - $(EMU_DIR)/Nes_Ppu_Impl.cpp \ - $(EMU_DIR)/Nes_Ppu_Rendering.cpp \ - $(EMU_DIR)/Nes_Recorder.cpp \ - $(EMU_DIR)/Nes_State.cpp \ - $(EMU_DIR)/nes_util.cpp \ - $(EMU_DIR)/Nes_Vrc6_Apu.cpp \ - libretro.cpp - -LIBSRCS := \ - ../fex/Data_Reader.cpp \ - ../fex/blargg_errors.cpp \ - ../fex/blargg_common.cpp - -CXXOBJ := $(CXXSRCS:.cpp=.o) $(LIBSRCS:.cpp=.o) - -OBJS := $(CXXOBJ) - -DEFINES := -D__LIBRETRO__ $(PLATFORM_DEFINES) -Wall -Wno-multichar -Wno-unused-variable -Wno-sign-compare -DNDEBUG \ - -DSTD_AUTO_FILE_WRITER=Std_File_Writer \ - -DSTD_AUTO_FILE_READER=Std_File_Reader \ - -DSTD_AUTO_FILE_COMP_READER=Std_File_Reader \ - -DSTD_AUTO_FILE_COMP_WRITER=Std_File_Writer - -CFLAGS += $(fpic) $(DEFINES) -std=gnu99 -CXXFLAGS += $(fpic) $(DEFINES) - -INCDIRS := -I$(EMU_DIR) -I. -I.. - -$(TARGET): $(OBJS) -ifeq ($(STATIC_LINKING), 1) - $(AR) rcs $@ $(OBJS) -else - $(CXX) -o $@ $(SHARED) $(OBJS) $(LDFLAGS) $(LIBS) -endif - -%.o: %.cpp - $(CXX) -c -o $@ $< $(CXXFLAGS) $(INCDIRS) - -%.o: %.c - $(CXX) -c -o $@ $< $(CXXFLAGS) $(INCDIRS) - -clean-objs: - rm -f $(OBJS) - -clean: - rm -f $(OBJS) - rm -f $(TARGET) - -.PHONY: clean clean-objs - diff --git a/quicknes/libretro/jni/Android.mk b/quicknes/libretro/jni/Android.mk deleted file mode 100644 index f74e2569fb..0000000000 --- a/quicknes/libretro/jni/Android.mk +++ /dev/null @@ -1,75 +0,0 @@ -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) - -ifeq ($(TARGET_ARCH),arm) -LOCAL_CFLAGS += -DANDROID_ARM -LOCAL_ARM_MODE := arm -endif - -ifeq ($(TARGET_ARCH),x86) -LOCAL_CFLAGS += -DANDROID_X86 -endif - -ifeq ($(TARGET_ARCH),mips) -LOCAL_CFLAGS += -DANDROID_MIPS -endif - -LOCAL_MODULE := libretro - -EMU_DIR := ../../nes_emu -LIBRETRO_DIR := ../ - -CXXSRCS := \ - $(EMU_DIR)/abstract_file.cpp \ - $(EMU_DIR)/apu_state.cpp \ - $(EMU_DIR)/Blip_Buffer.cpp \ - $(EMU_DIR)/Effects_Buffer.cpp \ - $(EMU_DIR)/Mapper_Fme7.cpp \ - $(EMU_DIR)/Mapper_Mmc5.cpp \ - $(EMU_DIR)/Mapper_Namco106.cpp \ - $(EMU_DIR)/Mapper_Vrc6.cpp \ - $(EMU_DIR)/misc_mappers.cpp \ - $(EMU_DIR)/Multi_Buffer.cpp \ - $(EMU_DIR)/Nes_Apu.cpp \ - $(EMU_DIR)/Nes_Buffer.cpp \ - $(EMU_DIR)/Nes_Cart.cpp \ - $(EMU_DIR)/Nes_Core.cpp \ - $(EMU_DIR)/Nes_Cpu.cpp \ - $(EMU_DIR)/nes_data.cpp \ - $(EMU_DIR)/Nes_Effects_Buffer.cpp \ - $(EMU_DIR)/Nes_Emu.cpp \ - $(EMU_DIR)/Nes_File.cpp \ - $(EMU_DIR)/Nes_Film.cpp \ - $(EMU_DIR)/Nes_Film_Data.cpp \ - $(EMU_DIR)/Nes_Film_Packer.cpp \ - $(EMU_DIR)/Nes_Fme7_Apu.cpp \ - $(EMU_DIR)/Nes_Mapper.cpp \ - $(EMU_DIR)/nes_mappers.cpp \ - $(EMU_DIR)/Nes_Mmc1.cpp \ - $(EMU_DIR)/Nes_Mmc3.cpp \ - $(EMU_DIR)/Nes_Namco_Apu.cpp \ - $(EMU_DIR)/Nes_Oscs.cpp \ - $(EMU_DIR)/Nes_Ppu.cpp \ - $(EMU_DIR)/Nes_Ppu_Impl.cpp \ - $(EMU_DIR)/Nes_Ppu_Rendering.cpp \ - $(EMU_DIR)/Nes_Recorder.cpp \ - $(EMU_DIR)/Nes_State.cpp \ - $(EMU_DIR)/nes_util.cpp \ - $(EMU_DIR)/Nes_Vrc6_Apu.cpp \ - $(LIBRETRO_DIR)/libretro.cpp - -LIBSRCS := \ - $(LIBRETRO_DIR)/../fex/Data_Reader.cpp \ - $(LIBRETRO_DIR)/../fex/blargg_errors.cpp \ - $(LIBRETRO_DIR)/../fex/blargg_common.cpp - -LOCAL_SRC_FILES = $(CXXSRCS) $(LIBSRCS) -LOCAL_CXXFLAGS = -DANDROID -D__LIBRETRO__ -Wall -Wno-multichar -Wno-unused-variable -Wno-sign-compare -DNDEBUG \ - -DSTD_AUTO_FILE_WRITER=Std_File_Writer \ - -DSTD_AUTO_FILE_READER=Std_File_Reader \ - -DSTD_AUTO_FILE_COMP_READER=Std_File_Reader \ - -DSTD_AUTO_FILE_COMP_WRITER=Std_File_Writer -LOCAL_C_INCLUDES = $(LIBRETRO_DIR) $(EMU_DIR) $(EMU_DIR)/.. - -include $(BUILD_SHARED_LIBRARY) diff --git a/quicknes/libretro/jni/Application.mk b/quicknes/libretro/jni/Application.mk deleted file mode 100644 index e235f0da7d..0000000000 --- a/quicknes/libretro/jni/Application.mk +++ /dev/null @@ -1,2 +0,0 @@ -APP_STL := gnustl_static -APP_ABI := all diff --git a/quicknes/libretro/libretro.cpp b/quicknes/libretro/libretro.cpp deleted file mode 100644 index f631de8e5d..0000000000 --- a/quicknes/libretro/libretro.cpp +++ /dev/null @@ -1,267 +0,0 @@ -#include "libretro.h" -#include -#include -#include -#include -#include -#include "Nes_Emu.h" -#include "fex/Data_Reader.h" -#include "abstract_file.h" - -static Nes_Emu *emu; - -void retro_init(void) -{ - delete emu; - emu = new Nes_Emu; -} - -void retro_deinit(void) -{ - delete emu; - emu = 0; -} - -unsigned retro_api_version(void) -{ - return RETRO_API_VERSION; -} - -void retro_set_controller_port_device(unsigned, unsigned) -{ -} - -void retro_get_system_info(struct retro_system_info *info) -{ - memset(info, 0, sizeof(*info)); - info->library_name = "QuickNES"; - info->library_version = "v1"; - info->need_fullpath = false; - info->valid_extensions = "nes"; // Anything is fine, we don't care. -} - -void retro_get_system_av_info(struct retro_system_av_info *info) -{ - const retro_system_timing timing = { Nes_Emu::frame_rate, 44100.0 }; - info->timing = timing; - - const retro_game_geometry geom = { - Nes_Emu::image_width, - Nes_Emu::image_height, - Nes_Emu::image_width, - Nes_Emu::image_height, - 4.0 / 3.0, - }; - info->geometry = geom; -} - -static retro_video_refresh_t video_cb; -static retro_audio_sample_t audio_cb; -static retro_audio_sample_batch_t audio_batch_cb; -static retro_environment_t environ_cb; -static retro_input_poll_t input_poll_cb; -static retro_input_state_t input_state_cb; - -void retro_set_environment(retro_environment_t cb) -{ - environ_cb = cb; -} - -void retro_set_audio_sample(retro_audio_sample_t cb) -{ - audio_cb = cb; -} - -void retro_set_audio_sample_batch(retro_audio_sample_batch_t cb) -{ - audio_batch_cb = cb; -} - -void retro_set_input_poll(retro_input_poll_t cb) -{ - input_poll_cb = cb; -} - -void retro_set_input_state(retro_input_state_t cb) -{ - input_state_cb = cb; -} - -void retro_set_video_refresh(retro_video_refresh_t cb) -{ - video_cb = cb; -} - -void retro_reset(void) -{ - if (emu) - emu->reset(); -} - -#define JOY_A 1 -#define JOY_B 2 -#define JOY_SELECT 4 -#define JOY_START 8 -#define JOY_UP 0x10 -#define JOY_DOWN 0x20 -#define JOY_LEFT 0x40 -#define JOY_RIGHT 0x80 - -typedef struct -{ - unsigned retro; - unsigned nes; -} keymap; - -static const keymap bindmap[] = { - { RETRO_DEVICE_ID_JOYPAD_A, JOY_A }, - { RETRO_DEVICE_ID_JOYPAD_B, JOY_B }, - { RETRO_DEVICE_ID_JOYPAD_SELECT, JOY_SELECT }, - { RETRO_DEVICE_ID_JOYPAD_START, JOY_START }, - { RETRO_DEVICE_ID_JOYPAD_UP, JOY_UP }, - { RETRO_DEVICE_ID_JOYPAD_DOWN, JOY_DOWN }, - { RETRO_DEVICE_ID_JOYPAD_LEFT, JOY_LEFT }, - { RETRO_DEVICE_ID_JOYPAD_RIGHT, JOY_RIGHT }, -}; - -static void update_input(int pads[2]) -{ - pads[0] = pads[1] = 0; - input_poll_cb(); - - for (unsigned p = 0; p < 2; p++) - for (unsigned bind = 0; bind < sizeof(bindmap) / sizeof(bindmap[0]); bind++) - pads[p] |= input_state_cb(p, RETRO_DEVICE_JOYPAD, 0, bindmap[bind].retro) ? bindmap[bind].nes : 0; -} - -void retro_run(void) -{ - int pads[2] = {0}; - update_input(pads); - - emu->emulate_frame(pads[0], pads[1]); - const Nes_Emu::frame_t &frame = emu->frame(); - - static uint32_t video_buffer[Nes_Emu::image_width * Nes_Emu::image_height]; - - const uint8_t *in_pixels = frame.pixels; - uint32_t *out_pixels = video_buffer; - - for (unsigned h = 0; h < Nes_Emu::image_height; - h++, in_pixels += frame.pitch, out_pixels += Nes_Emu::image_width) - { - for (unsigned w = 0; w < Nes_Emu::image_width; w++) - { - unsigned col = frame.palette[in_pixels[w]]; - const Nes_Emu::rgb_t& rgb = emu->nes_colors[col]; - unsigned r = rgb.red; - unsigned g = rgb.green; - unsigned b = rgb.blue; - out_pixels[w] = (r << 16) | (g << 8) | (b << 0); - } - } - - video_cb(video_buffer, Nes_Emu::image_width, Nes_Emu::image_height, - Nes_Emu::image_width * sizeof(uint32_t)); - - // Mono -> Stereo. - int16_t samples[2048]; - long read_samples = emu->read_samples(samples, 2048); - int16_t out_samples[4096]; - for (long i = 0; i < read_samples; i++) - out_samples[(i << 1)] = out_samples[(i << 1) + 1] = samples[i]; - - audio_batch_cb(out_samples, read_samples); -} - -bool retro_load_game(const struct retro_game_info *info) -{ - if (!emu) - return false; - - enum retro_pixel_format fmt = RETRO_PIXEL_FORMAT_XRGB8888; - if (!environ_cb(RETRO_ENVIRONMENT_SET_PIXEL_FORMAT, &fmt)) - { - fprintf(stderr, "XRGB8888 is not supported.\n"); - return false; - } - - emu->set_sample_rate(44100); - emu->set_equalizer(Nes_Emu::nes_eq); - emu->set_palette_range(0); - - static uint8_t video_buffer[Nes_Emu::image_width * Nes_Emu::image_height]; - emu->set_pixels(video_buffer, Nes_Emu::image_width); - - Mem_File_Reader reader(info->data, info->size); - return !emu->load_ines(reader); -} - -void retro_unload_game(void) -{ - emu->close(); -} - -unsigned retro_get_region(void) -{ - return RETRO_REGION_NTSC; -} - -bool retro_load_game_special(unsigned, const struct retro_game_info *, size_t) -{ - return false; -} - -size_t retro_serialize_size(void) -{ - Mem_Writer writer; - if (emu->save_state(writer)) - return 0; - - return writer.size(); -} - -bool retro_serialize(void *data, size_t size) -{ - Mem_Writer writer(data, size); - return !emu->save_state(writer); -} - -bool retro_unserialize(const void *data, size_t size) -{ - Mem_File_Reader reader(data, size); - return !emu->load_state(reader); -} - -void *retro_get_memory_data(unsigned id) -{ - switch (id) - { - case RETRO_MEMORY_SAVE_RAM: - return emu->high_mem(); - case RETRO_MEMORY_SYSTEM_RAM: - return emu->low_mem(); - default: - return 0; - } -} - -size_t retro_get_memory_size(unsigned id) -{ - switch (id) - { - case RETRO_MEMORY_SAVE_RAM: - return Nes_Emu::high_mem_size; - case RETRO_MEMORY_SYSTEM_RAM: - return Nes_Emu::low_mem_size; - default: - return 0; - } -} - -void retro_cheat_reset(void) -{} - -void retro_cheat_set(unsigned, bool, const char *) -{} - diff --git a/quicknes/libretro/libretro.h b/quicknes/libretro/libretro.h deleted file mode 100644 index b02855ae1f..0000000000 --- a/quicknes/libretro/libretro.h +++ /dev/null @@ -1,758 +0,0 @@ -#ifndef LIBRETRO_H__ -#define LIBRETRO_H__ - -#include -#include -#include - -// Hack applied for MSVC when compiling in C89 mode as it isn't C99 compliant. -#ifdef __cplusplus -extern "C" { -#else -#if defined(_MSC_VER) && !defined(SN_TARGET_PS3) && !defined(__cplusplus) -#define bool unsigned char -#define true 1 -#define false 0 -#else -#include -#endif -#endif - -// Used for checking API/ABI mismatches that can break libretro implementations. -// It is not incremented for compatible changes to the API. -#define RETRO_API_VERSION 1 - -// Libretro's fundamental device abstractions. -#define RETRO_DEVICE_MASK 0xff -#define RETRO_DEVICE_NONE 0 - -// The JOYPAD is called RetroPad. It is essentially a Super Nintendo controller, -// but with additional L2/R2/L3/R3 buttons, similar to a PS1 DualShock. -#define RETRO_DEVICE_JOYPAD 1 - -// The mouse is a simple mouse, similar to Super Nintendo's mouse. -// X and Y coordinates are reported relatively to last poll (poll callback). -// It is up to the libretro implementation to keep track of where the mouse pointer is supposed to be on the screen. -// The frontend must make sure not to interfere with its own hardware mouse pointer. -#define RETRO_DEVICE_MOUSE 2 - -// KEYBOARD device lets one poll for raw key pressed. -// It is poll based, so input callback will return with the current pressed state. -#define RETRO_DEVICE_KEYBOARD 3 - -// Lightgun X/Y coordinates are reported relatively to last poll, similar to mouse. -#define RETRO_DEVICE_LIGHTGUN 4 - -// The ANALOG device is an extension to JOYPAD (RetroPad). -// Similar to DualShock it adds two analog sticks. -// This is treated as a separate device type as it returns values in the full analog range -// of [-0x8000, 0x7fff]. Positive X axis is right. Positive Y axis is down. -// Only use ANALOG type when polling for analog values of the axes. -#define RETRO_DEVICE_ANALOG 5 - -// Abstracts the concept of a pointing mechanism, e.g. touch. -// This allows libretro to query in absolute coordinates where on the screen a mouse (or something similar) is being placed. -// For a touch centric device, coordinates reported are the coordinates of the press. -// -// Coordinates in X and Y are reported as: -// [-0x7fff, 0x7fff]: -0x7fff corresponds to the far left/top of the screen, -// and 0x7fff corresponds to the far right/bottom of the screen. -// The "screen" is here defined as area that is passed to the frontend and later displayed on the monitor. -// The frontend is free to scale/resize this screen as it sees fit, however, -// (X, Y) = (-0x7fff, -0x7fff) will correspond to the top-left pixel of the game image, etc. -// -// To check if the pointer coordinates are valid (e.g. a touch display actually being touched), -// PRESSED returns 1 or 0. -// If using a mouse, PRESSED will usually correspond to the left mouse button. -// PRESSED will only return 1 if the pointer is inside the game screen. -// -// For multi-touch, the index variable can be used to successively query more presses. -// If index = 0 returns true for _PRESSED, coordinates can be extracted -// with _X, _Y for index = 0. One can then query _PRESSED, _X, _Y with index = 1, and so on. -// Eventually _PRESSED will return false for an index. No further presses are registered at this point. -#define RETRO_DEVICE_POINTER 6 - -// These device types are specializations of the base types above. -// They should only be used in retro_set_controller_type() to inform libretro implementations -// about use of a very specific device type. -// -// In input state callback, however, only the base type should be used in the 'device' field. -#define RETRO_DEVICE_JOYPAD_MULTITAP ((1 << 8) | RETRO_DEVICE_JOYPAD) -#define RETRO_DEVICE_LIGHTGUN_SUPER_SCOPE ((1 << 8) | RETRO_DEVICE_LIGHTGUN) -#define RETRO_DEVICE_LIGHTGUN_JUSTIFIER ((2 << 8) | RETRO_DEVICE_LIGHTGUN) -#define RETRO_DEVICE_LIGHTGUN_JUSTIFIERS ((3 << 8) | RETRO_DEVICE_LIGHTGUN) - -// Buttons for the RetroPad (JOYPAD). -// The placement of these is equivalent to placements on the Super Nintendo controller. -// L2/R2/L3/R3 buttons correspond to the PS1 DualShock. -#define RETRO_DEVICE_ID_JOYPAD_B 0 -#define RETRO_DEVICE_ID_JOYPAD_Y 1 -#define RETRO_DEVICE_ID_JOYPAD_SELECT 2 -#define RETRO_DEVICE_ID_JOYPAD_START 3 -#define RETRO_DEVICE_ID_JOYPAD_UP 4 -#define RETRO_DEVICE_ID_JOYPAD_DOWN 5 -#define RETRO_DEVICE_ID_JOYPAD_LEFT 6 -#define RETRO_DEVICE_ID_JOYPAD_RIGHT 7 -#define RETRO_DEVICE_ID_JOYPAD_A 8 -#define RETRO_DEVICE_ID_JOYPAD_X 9 -#define RETRO_DEVICE_ID_JOYPAD_L 10 -#define RETRO_DEVICE_ID_JOYPAD_R 11 -#define RETRO_DEVICE_ID_JOYPAD_L2 12 -#define RETRO_DEVICE_ID_JOYPAD_R2 13 -#define RETRO_DEVICE_ID_JOYPAD_L3 14 -#define RETRO_DEVICE_ID_JOYPAD_R3 15 - -// Index / Id values for ANALOG device. -#define RETRO_DEVICE_INDEX_ANALOG_LEFT 0 -#define RETRO_DEVICE_INDEX_ANALOG_RIGHT 1 -#define RETRO_DEVICE_ID_ANALOG_X 0 -#define RETRO_DEVICE_ID_ANALOG_Y 1 - -// Id values for MOUSE. -#define RETRO_DEVICE_ID_MOUSE_X 0 -#define RETRO_DEVICE_ID_MOUSE_Y 1 -#define RETRO_DEVICE_ID_MOUSE_LEFT 2 -#define RETRO_DEVICE_ID_MOUSE_RIGHT 3 - -// Id values for LIGHTGUN types. -#define RETRO_DEVICE_ID_LIGHTGUN_X 0 -#define RETRO_DEVICE_ID_LIGHTGUN_Y 1 -#define RETRO_DEVICE_ID_LIGHTGUN_TRIGGER 2 -#define RETRO_DEVICE_ID_LIGHTGUN_CURSOR 3 -#define RETRO_DEVICE_ID_LIGHTGUN_TURBO 4 -#define RETRO_DEVICE_ID_LIGHTGUN_PAUSE 5 -#define RETRO_DEVICE_ID_LIGHTGUN_START 6 - -// Id values for POINTER. -#define RETRO_DEVICE_ID_POINTER_X 0 -#define RETRO_DEVICE_ID_POINTER_Y 1 -#define RETRO_DEVICE_ID_POINTER_PRESSED 2 - -// Returned from retro_get_region(). -#define RETRO_REGION_NTSC 0 -#define RETRO_REGION_PAL 1 - -// Passed to retro_get_memory_data/size(). -// If the memory type doesn't apply to the implementation NULL/0 can be returned. -#define RETRO_MEMORY_MASK 0xff - -// Regular save ram. This ram is usually found on a game cartridge, backed up by a battery. -// If save game data is too complex for a single memory buffer, -// the SYSTEM_DIRECTORY environment callback can be used. -#define RETRO_MEMORY_SAVE_RAM 0 - -// Some games have a built-in clock to keep track of time. -// This memory is usually just a couple of bytes to keep track of time. -#define RETRO_MEMORY_RTC 1 - -// System ram lets a frontend peek into a game systems main RAM. -#define RETRO_MEMORY_SYSTEM_RAM 2 - -// Video ram lets a frontend peek into a game systems video RAM (VRAM). -#define RETRO_MEMORY_VIDEO_RAM 3 - -// Special memory types. -#define RETRO_MEMORY_SNES_BSX_RAM ((1 << 8) | RETRO_MEMORY_SAVE_RAM) -#define RETRO_MEMORY_SNES_BSX_PRAM ((2 << 8) | RETRO_MEMORY_SAVE_RAM) -#define RETRO_MEMORY_SNES_SUFAMI_TURBO_A_RAM ((3 << 8) | RETRO_MEMORY_SAVE_RAM) -#define RETRO_MEMORY_SNES_SUFAMI_TURBO_B_RAM ((4 << 8) | RETRO_MEMORY_SAVE_RAM) -#define RETRO_MEMORY_SNES_GAME_BOY_RAM ((5 << 8) | RETRO_MEMORY_SAVE_RAM) -#define RETRO_MEMORY_SNES_GAME_BOY_RTC ((6 << 8) | RETRO_MEMORY_RTC) - -// Special game types passed into retro_load_game_special(). -// Only used when multiple ROMs are required. -#define RETRO_GAME_TYPE_BSX 0x101 -#define RETRO_GAME_TYPE_BSX_SLOTTED 0x102 -#define RETRO_GAME_TYPE_SUFAMI_TURBO 0x103 -#define RETRO_GAME_TYPE_SUPER_GAME_BOY 0x104 - -// Keysyms used for ID in input state callback when polling RETRO_KEYBOARD. -enum retro_key -{ - RETROK_UNKNOWN = 0, - RETROK_FIRST = 0, - RETROK_BACKSPACE = 8, - RETROK_TAB = 9, - RETROK_CLEAR = 12, - RETROK_RETURN = 13, - RETROK_PAUSE = 19, - RETROK_ESCAPE = 27, - RETROK_SPACE = 32, - RETROK_EXCLAIM = 33, - RETROK_QUOTEDBL = 34, - RETROK_HASH = 35, - RETROK_DOLLAR = 36, - RETROK_AMPERSAND = 38, - RETROK_QUOTE = 39, - RETROK_LEFTPAREN = 40, - RETROK_RIGHTPAREN = 41, - RETROK_ASTERISK = 42, - RETROK_PLUS = 43, - RETROK_COMMA = 44, - RETROK_MINUS = 45, - RETROK_PERIOD = 46, - RETROK_SLASH = 47, - RETROK_0 = 48, - RETROK_1 = 49, - RETROK_2 = 50, - RETROK_3 = 51, - RETROK_4 = 52, - RETROK_5 = 53, - RETROK_6 = 54, - RETROK_7 = 55, - RETROK_8 = 56, - RETROK_9 = 57, - RETROK_COLON = 58, - RETROK_SEMICOLON = 59, - RETROK_LESS = 60, - RETROK_EQUALS = 61, - RETROK_GREATER = 62, - RETROK_QUESTION = 63, - RETROK_AT = 64, - RETROK_LEFTBRACKET = 91, - RETROK_BACKSLASH = 92, - RETROK_RIGHTBRACKET = 93, - RETROK_CARET = 94, - RETROK_UNDERSCORE = 95, - RETROK_BACKQUOTE = 96, - RETROK_a = 97, - RETROK_b = 98, - RETROK_c = 99, - RETROK_d = 100, - RETROK_e = 101, - RETROK_f = 102, - RETROK_g = 103, - RETROK_h = 104, - RETROK_i = 105, - RETROK_j = 106, - RETROK_k = 107, - RETROK_l = 108, - RETROK_m = 109, - RETROK_n = 110, - RETROK_o = 111, - RETROK_p = 112, - RETROK_q = 113, - RETROK_r = 114, - RETROK_s = 115, - RETROK_t = 116, - RETROK_u = 117, - RETROK_v = 118, - RETROK_w = 119, - RETROK_x = 120, - RETROK_y = 121, - RETROK_z = 122, - RETROK_DELETE = 127, - - RETROK_KP0 = 256, - RETROK_KP1 = 257, - RETROK_KP2 = 258, - RETROK_KP3 = 259, - RETROK_KP4 = 260, - RETROK_KP5 = 261, - RETROK_KP6 = 262, - RETROK_KP7 = 263, - RETROK_KP8 = 264, - RETROK_KP9 = 265, - RETROK_KP_PERIOD = 266, - RETROK_KP_DIVIDE = 267, - RETROK_KP_MULTIPLY = 268, - RETROK_KP_MINUS = 269, - RETROK_KP_PLUS = 270, - RETROK_KP_ENTER = 271, - RETROK_KP_EQUALS = 272, - - RETROK_UP = 273, - RETROK_DOWN = 274, - RETROK_RIGHT = 275, - RETROK_LEFT = 276, - RETROK_INSERT = 277, - RETROK_HOME = 278, - RETROK_END = 279, - RETROK_PAGEUP = 280, - RETROK_PAGEDOWN = 281, - - RETROK_F1 = 282, - RETROK_F2 = 283, - RETROK_F3 = 284, - RETROK_F4 = 285, - RETROK_F5 = 286, - RETROK_F6 = 287, - RETROK_F7 = 288, - RETROK_F8 = 289, - RETROK_F9 = 290, - RETROK_F10 = 291, - RETROK_F11 = 292, - RETROK_F12 = 293, - RETROK_F13 = 294, - RETROK_F14 = 295, - RETROK_F15 = 296, - - RETROK_NUMLOCK = 300, - RETROK_CAPSLOCK = 301, - RETROK_SCROLLOCK = 302, - RETROK_RSHIFT = 303, - RETROK_LSHIFT = 304, - RETROK_RCTRL = 305, - RETROK_LCTRL = 306, - RETROK_RALT = 307, - RETROK_LALT = 308, - RETROK_RMETA = 309, - RETROK_LMETA = 310, - RETROK_LSUPER = 311, - RETROK_RSUPER = 312, - RETROK_MODE = 313, - RETROK_COMPOSE = 314, - - RETROK_HELP = 315, - RETROK_PRINT = 316, - RETROK_SYSREQ = 317, - RETROK_BREAK = 318, - RETROK_MENU = 319, - RETROK_POWER = 320, - RETROK_EURO = 321, - RETROK_UNDO = 322, - - RETROK_LAST, - - RETROK_DUMMY = INT_MAX // Ensure sizeof(enum) == sizeof(int) -}; - -enum retro_mod -{ - RETROKMOD_NONE = 0x0000, - - RETROKMOD_SHIFT = 0x01, - RETROKMOD_CTRL = 0x02, - RETROKMOD_ALT = 0x04, - RETROKMOD_META = 0x08, - - RETROKMOD_NUMLOCK = 0x10, - RETROKMOD_CAPSLOCK = 0x20, - RETROKMOD_SCROLLOCK = 0x40, - - RETROKMOD_DUMMY = INT_MAX // Ensure sizeof(enum) == sizeof(int) -}; - -// If set, this call is not part of the public libretro API yet. It can change or be removed at any time. -#define RETRO_ENVIRONMENT_EXPERIMENTAL 0x10000 - -// Environment commands. -#define RETRO_ENVIRONMENT_SET_ROTATION 1 // const unsigned * -- - // Sets screen rotation of graphics. - // Is only implemented if rotation can be accelerated by hardware. - // Valid values are 0, 1, 2, 3, which rotates screen by 0, 90, 180, 270 degrees - // counter-clockwise respectively. - // -#define RETRO_ENVIRONMENT_GET_OVERSCAN 2 // bool * -- - // Boolean value whether or not the implementation should use overscan, or crop away overscan. - // -#define RETRO_ENVIRONMENT_GET_CAN_DUPE 3 // bool * -- - // Boolean value whether or not frontend supports frame duping, - // passing NULL to video frame callback. - // -// Environ 4, 5 are no longer supported (GET_VARIABLE / SET_VARIABLES), and reserved to avoid possible ABI clash. -#define RETRO_ENVIRONMENT_SET_MESSAGE 6 // const struct retro_message * -- - // Sets a message to be displayed in implementation-specific manner for a certain amount of 'frames'. - // Should not be used for trivial messages, which should simply be logged to stderr. -#define RETRO_ENVIRONMENT_SHUTDOWN 7 // N/A (NULL) -- - // Requests the frontend to shutdown. - // Should only be used if game has a specific - // way to shutdown the game from a menu item or similar. - // -#define RETRO_ENVIRONMENT_SET_PERFORMANCE_LEVEL 8 - // const unsigned * -- - // Gives a hint to the frontend how demanding this implementation - // is on a system. E.g. reporting a level of 2 means - // this implementation should run decently on all frontends - // of level 2 and up. - // - // It can be used by the frontend to potentially warn - // about too demanding implementations. - // - // The levels are "floating", but roughly defined as: - // 0: Low-powered embedded devices such as Raspberry Pi - // 1: 6th generation consoles, such as Wii/Xbox 1, and phones, tablets, etc. - // 2: 7th generation consoles, such as PS3/360, with sub-par CPUs. - // 3: Modern desktop/laptops with reasonably powerful CPUs. - // 4: High-end desktops with very powerful CPUs. - // - // This function can be called on a per-game basis, - // as certain games an implementation can play might be - // particularily demanding. - // If called, it should be called in retro_load_game(). - // -#define RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY 9 - // const char ** -- - // Returns the "system" directory of the frontend. - // This directory can be used to store system specific ROMs such as BIOSes, configuration data, etc. - // The returned value can be NULL. - // If so, no such directory is defined, - // and it's up to the implementation to find a suitable directory. - // -#define RETRO_ENVIRONMENT_SET_PIXEL_FORMAT 10 - // const enum retro_pixel_format * -- - // Sets the internal pixel format used by the implementation. - // The default pixel format is RETRO_PIXEL_FORMAT_0RGB1555. - // This pixel format however, is deprecated (see enum retro_pixel_format). - // If the call returns false, the frontend does not support this pixel format. - // This function should be called inside retro_load_game() or retro_get_system_av_info(). - // -#define RETRO_ENVIRONMENT_SET_INPUT_DESCRIPTORS 11 - // const struct retro_input_descriptor * -- - // Sets an array of retro_input_descriptors. - // It is up to the frontend to present this in a usable way. - // The array is terminated by retro_input_descriptor::description being set to NULL. - // This function can be called at any time, but it is recommended to call it as early as possible. -#define RETRO_ENVIRONMENT_SET_KEYBOARD_CALLBACK 12 - // const struct retro_keyboard_callback * -- - // Sets a callback function used to notify core about keyboard events. - // -#define RETRO_ENVIRONMENT_SET_DISK_CONTROL_INTERFACE 13 - // const struct retro_disk_control_callback * -- - // Sets an interface which frontend can use to eject and insert disk images. - // This is used for games which consist of multiple images and must be manually - // swapped out by the user (e.g. PSX). -#define RETRO_ENVIRONMENT_SET_HW_RENDER (14 | RETRO_ENVIRONMENT_EXPERIMENTAL) - // struct retro_hw_render_callback * -- - // NOTE: This call is currently very experimental, and should not be considered part of the public API. - // The interface could be changed or removed at any time. - // Sets an interface to let a libretro core render with hardware acceleration. - // Should be called in retro_load_game(). - // If successful, libretro cores will be able to render to a frontend-provided framebuffer. - // The size of this framebuffer will be at least as large as max_width/max_height provided in get_av_info(). - // If HW rendering is used, pass only RETRO_HW_FRAME_BUFFER_VALID or NULL to retro_video_refresh_t. -#define RETRO_ENVIRONMENT_GET_VARIABLE 15 - // struct retro_variable * -- - // Interface to aquire user-defined information from environment - // that cannot feasibly be supported in a multi-system way. - // 'key' should be set to a key which has already been set by SET_VARIABLES. - // 'data' will be set to a value or NULL. - // -#define RETRO_ENVIRONMENT_SET_VARIABLES 16 - // const struct retro_variable * -- - // Allows an implementation to signal the environment - // which variables it might want to check for later using GET_VARIABLE. - // This allows the frontend to present these variables to a user dynamically. - // This should be called as early as possible (ideally in retro_set_environment). - // - // 'data' points to an array of retro_variable structs terminated by a { NULL, NULL } element. - // retro_variable::key should be namespaced to not collide with other implementations' keys. E.g. A core called 'foo' should use keys named as 'foo_option'. - // retro_variable::value should contain a human readable description of the key as well as a '|' delimited list of expected values. - // The number of possible options should be very limited, i.e. it should be feasible to cycle through options without a keyboard. - // First entry should be treated as a default. - // - // Example entry: - // { "foo_option", "Speed hack coprocessor X; false|true" } - // - // Text before first ';' is description. This ';' must be followed by a space, and followed by a list of possible values split up with '|'. - // Only strings are operated on. The possible values will generally be displayed and stored as-is by the frontend. - // -#define RETRO_ENVIRONMENT_GET_VARIABLE_UPDATE 17 - // bool * -- - // Result is set to true if some variables are updated by - // frontend since last call to RETRO_ENVIRONMENT_GET_VARIABLE. - // Variables should be queried with GET_VARIABLE. - -// Pass this to retro_video_refresh_t if rendering to hardware. -// Passing NULL to retro_video_refresh_t is still a frame dupe as normal. -#define RETRO_HW_FRAME_BUFFER_VALID ((void*)-1) - -// Invalidates the current HW context. -// If called, all GPU resources must be reinitialized. -// Usually called when frontend reinits video driver. -// Also called first time video driver is initialized, allowing libretro core to init resources. -typedef void (*retro_hw_context_reset_t)(void); -// Gets current framebuffer which is to be rendered to. Could change every frame potentially. -typedef uintptr_t (*retro_hw_get_current_framebuffer_t)(void); - -// Get a symbol from HW context. -typedef void (*retro_proc_address_t)(void); -typedef retro_proc_address_t (*retro_hw_get_proc_address_t)(const char *sym); - -enum retro_hw_context_type -{ - RETRO_HW_CONTEXT_NONE = 0, - RETRO_HW_CONTEXT_OPENGL, // OpenGL 2.x. Latest version available before 3.x+. - RETRO_HW_CONTEXT_OPENGLES2, // GLES 2.0 - - RETRO_HW_CONTEXT_DUMMY = INT_MAX -}; - -struct retro_hw_render_callback -{ - enum retro_hw_context_type context_type; // Which API to use. Set by libretro core. - retro_hw_context_reset_t context_reset; // Set by libretro core. - retro_hw_get_current_framebuffer_t get_current_framebuffer; // Set by frontend. - retro_hw_get_proc_address_t get_proc_address; // Set by frontend. - bool depth; // Set if render buffers should have depth component attached. -}; - -// Callback type passed in RETRO_ENVIRONMENT_SET_KEYBOARD_CALLBACK. Called by the frontend in response to keyboard events. -// down is set if the key is being pressed, or false if it is being released. -// keycode is the RETROK value of the char. -// character is the text character of the pressed key. (UTF-32). -// key_modifiers is a set of RETROKMOD values or'ed together. -typedef void (*retro_keyboard_event_t)(bool down, unsigned keycode, uint32_t character, uint16_t key_modifiers); - -struct retro_keyboard_callback -{ - retro_keyboard_event_t callback; -}; - -// Callbacks for RETRO_ENVIRONMENT_SET_DISK_CONTROL_INTERFACE. -// Should be set for implementations which can swap out multiple disk images in runtime. -// If the implementation can do this automatically, it should strive to do so. -// However, there are cases where the user must manually do so. -// -// Overview: To swap a disk image, eject the disk image with set_eject_state(true). -// Set the disk index with set_image_index(index). Insert the disk again with set_eject_state(false). - -// If ejected is true, "ejects" the virtual disk tray. -// When ejected, the disk image index can be set. -typedef bool (*retro_set_eject_state_t)(bool ejected); -// Gets current eject state. The initial state is 'not ejected'. -typedef bool (*retro_get_eject_state_t)(void); -// Gets current disk index. First disk is index 0. -// If return value is >= get_num_images(), no disk is currently inserted. -typedef unsigned (*retro_get_image_index_t)(void); -// Sets image index. Can only be called when disk is ejected. -// The implementation supports setting "no disk" by using an index >= get_num_images(). -typedef bool (*retro_set_image_index_t)(unsigned index); -// Gets total number of images which are available to use. -typedef unsigned (*retro_get_num_images_t)(void); -// -// Replaces the disk image associated with index. -// Arguments to pass in info have same requirements as retro_load_game(). -// Virtual disk tray must be ejected when calling this. -// Replacing a disk image with info = NULL will remove the disk image from the internal list. -// As a result, calls to get_image_index() can change. -// -// E.g. replace_image_index(1, NULL), and previous get_image_index() returned 4 before. -// Index 1 will be removed, and the new index is 3. -struct retro_game_info; -typedef bool (*retro_replace_image_index_t)(unsigned index, const struct retro_game_info *info); -// Adds a new valid index (get_num_images()) to the internal disk list. -// This will increment subsequent return values from get_num_images() by 1. -// This image index cannot be used until a disk image has been set with replace_image_index. -typedef bool (*retro_add_image_index_t)(void); - -struct retro_disk_control_callback -{ - retro_set_eject_state_t set_eject_state; - retro_get_eject_state_t get_eject_state; - - retro_get_image_index_t get_image_index; - retro_set_image_index_t set_image_index; - retro_get_num_images_t get_num_images; - - retro_replace_image_index_t replace_image_index; - retro_add_image_index_t add_image_index; -}; - -enum retro_pixel_format -{ - // 0RGB1555, native endian. 0 bit must be set to 0. - // This pixel format is default for compatibility concerns only. - // If a 15/16-bit pixel format is desired, consider using RGB565. - RETRO_PIXEL_FORMAT_0RGB1555 = 0, - - // XRGB8888, native endian. X bits are ignored. - RETRO_PIXEL_FORMAT_XRGB8888 = 1, - - // RGB565, native endian. This pixel format is the recommended format to use if a 15/16-bit format is desired - // as it is the pixel format that is typically available on a wide range of low-power devices. - // It is also natively supported in APIs like OpenGL ES. - RETRO_PIXEL_FORMAT_RGB565 = 2, - - // Ensure sizeof() == sizeof(int). - RETRO_PIXEL_FORMAT_UNKNOWN = INT_MAX -}; - -struct retro_message -{ - const char *msg; // Message to be displayed. - unsigned frames; // Duration in frames of message. -}; - -// Describes how the libretro implementation maps a libretro input bind -// to its internal input system through a human readable string. -// This string can be used to better let a user configure input. -struct retro_input_descriptor -{ - // Associates given parameters with a description. - unsigned port; - unsigned device; - unsigned index; - unsigned id; - - const char *description; // Human readable description for parameters. - // The pointer must remain valid until retro_unload_game() is called. -}; - -struct retro_system_info -{ - // All pointers are owned by libretro implementation, and pointers must remain valid until retro_deinit() is called. - - const char *library_name; // Descriptive name of library. Should not contain any version numbers, etc. - const char *library_version; // Descriptive version of core. - - const char *valid_extensions; // A string listing probably rom extensions the core will be able to load, separated with pipe. - // I.e. "bin|rom|iso". - // Typically used for a GUI to filter out extensions. - - bool need_fullpath; // If true, retro_load_game() is guaranteed to provide a valid pathname in retro_game_info::path. - // ::data and ::size are both invalid. - // If false, ::data and ::size are guaranteed to be valid, but ::path might not be valid. - // This is typically set to true for libretro implementations that must load from file. - // Implementations should strive for setting this to false, as it allows the frontend to perform patching, etc. - - bool block_extract; // If true, the frontend is not allowed to extract any archives before loading the real ROM. - // Necessary for certain libretro implementations that load games from zipped archives. -}; - -struct retro_game_geometry -{ - unsigned base_width; // Nominal video width of game. - unsigned base_height; // Nominal video height of game. - unsigned max_width; // Maximum possible width of game. - unsigned max_height; // Maximum possible height of game. - - float aspect_ratio; // Nominal aspect ratio of game. If aspect_ratio is <= 0.0, - // an aspect ratio of base_width / base_height is assumed. - // A frontend could override this setting if desired. -}; - -struct retro_system_timing -{ - double fps; // FPS of video content. - double sample_rate; // Sampling rate of audio. -}; - -struct retro_system_av_info -{ - struct retro_game_geometry geometry; - struct retro_system_timing timing; -}; - -struct retro_variable -{ - const char *key; // Variable to query in RETRO_ENVIRONMENT_GET_VARIABLE. - // If NULL, obtains the complete environment string if more complex parsing is necessary. - // The environment string is formatted as key-value pairs delimited by semicolons as so: - // "key1=value1;key2=value2;..." - const char *value; // Value to be obtained. If key does not exist, it is set to NULL. -}; - -struct retro_game_info -{ - const char *path; // Path to game, UTF-8 encoded. Usually used as a reference. - // May be NULL if rom was loaded from stdin or similar. - // retro_system_info::need_fullpath guaranteed that this path is valid. - const void *data; // Memory buffer of loaded game. Will be NULL if need_fullpath was set. - size_t size; // Size of memory buffer. - const char *meta; // String of implementation specific meta-data. -}; - -// Callbacks -// -// Environment callback. Gives implementations a way of performing uncommon tasks. Extensible. -typedef bool (*retro_environment_t)(unsigned cmd, void *data); - -// Render a frame. Pixel format is 15-bit 0RGB1555 native endian unless changed (see RETRO_ENVIRONMENT_SET_PIXEL_FORMAT). -// Width and height specify dimensions of buffer. -// Pitch specifices length in bytes between two lines in buffer. -// For performance reasons, it is highly recommended to have a frame that is packed in memory, i.e. pitch == width * byte_per_pixel. -// Certain graphic APIs, such as OpenGL ES, do not like textures that are not packed in memory. -typedef void (*retro_video_refresh_t)(const void *data, unsigned width, unsigned height, size_t pitch); - -// Renders a single audio frame. Should only be used if implementation generates a single sample at a time. -// Format is signed 16-bit native endian. -typedef void (*retro_audio_sample_t)(int16_t left, int16_t right); -// Renders multiple audio frames in one go. One frame is defined as a sample of left and right channels, interleaved. -// I.e. int16_t buf[4] = { l, r, l, r }; would be 2 frames. -// Only one of the audio callbacks must ever be used. -typedef size_t (*retro_audio_sample_batch_t)(const int16_t *data, size_t frames); - -// Polls input. -typedef void (*retro_input_poll_t)(void); -// Queries for input for player 'port'. device will be masked with RETRO_DEVICE_MASK. -// Specialization of devices such as RETRO_DEVICE_JOYPAD_MULTITAP that have been set with retro_set_controller_port_device() -// will still use the higher level RETRO_DEVICE_JOYPAD to request input. -typedef int16_t (*retro_input_state_t)(unsigned port, unsigned device, unsigned index, unsigned id); - -// Sets callbacks. retro_set_environment() is guaranteed to be called before retro_init(). -// The rest of the set_* functions are guaranteed to have been called before the first call to retro_run() is made. -void retro_set_environment(retro_environment_t); -void retro_set_video_refresh(retro_video_refresh_t); -void retro_set_audio_sample(retro_audio_sample_t); -void retro_set_audio_sample_batch(retro_audio_sample_batch_t); -void retro_set_input_poll(retro_input_poll_t); -void retro_set_input_state(retro_input_state_t); - -// Library global initialization/deinitialization. -void retro_init(void); -void retro_deinit(void); - -// Must return RETRO_API_VERSION. Used to validate ABI compatibility when the API is revised. -unsigned retro_api_version(void); - -// Gets statically known system info. Pointers provided in *info must be statically allocated. -// Can be called at any time, even before retro_init(). -void retro_get_system_info(struct retro_system_info *info); - -// Gets information about system audio/video timings and geometry. -// Can be called only after retro_load_game() has successfully completed. -// NOTE: The implementation of this function might not initialize every variable if needed. -// E.g. geom.aspect_ratio might not be initialized if core doesn't desire a particular aspect ratio. -void retro_get_system_av_info(struct retro_system_av_info *info); - -// Sets device to be used for player 'port'. -void retro_set_controller_port_device(unsigned port, unsigned device); - -// Resets the current game. -void retro_reset(void); - -// Runs the game for one video frame. -// During retro_run(), input_poll callback must be called at least once. -// -// If a frame is not rendered for reasons where a game "dropped" a frame, -// this still counts as a frame, and retro_run() should explicitly dupe a frame if GET_CAN_DUPE returns true. -// In this case, the video callback can take a NULL argument for data. -void retro_run(void); - -// Returns the amount of data the implementation requires to serialize internal state (save states). -// Beetween calls to retro_load_game() and retro_unload_game(), the returned size is never allowed to be larger than a previous returned value, to -// ensure that the frontend can allocate a save state buffer once. -size_t retro_serialize_size(void); - -// Serializes internal state. If failed, or size is lower than retro_serialize_size(), it should return false, true otherwise. -bool retro_serialize(void *data, size_t size); -bool retro_unserialize(const void *data, size_t size); - -void retro_cheat_reset(void); -void retro_cheat_set(unsigned index, bool enabled, const char *code); - -// Loads a game. -bool retro_load_game(const struct retro_game_info *game); - -// Loads a "special" kind of game. Should not be used except in extreme cases. -bool retro_load_game_special( - unsigned game_type, - const struct retro_game_info *info, size_t num_info -); - -// Unloads a currently loaded game. -void retro_unload_game(void); - -// Gets region of game. -unsigned retro_get_region(void); - -// Gets region of memory. -void *retro_get_memory_data(unsigned id); -size_t retro_get_memory_size(unsigned id); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/quicknes/libretro/link.T b/quicknes/libretro/link.T deleted file mode 100644 index b0c262db9e..0000000000 --- a/quicknes/libretro/link.T +++ /dev/null @@ -1,5 +0,0 @@ -{ - global: retro_*; - local: *; -}; -