summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorToad King2012-06-14 03:23:47 -0400
committerToad King2012-06-14 03:23:47 -0400
commite8bad8c3ca33d6dfa672f2e570eddc3ab4b3a7e6 (patch)
tree3b5ee797171edafe59bc22ec1523554d81bc448e
parent6fb0c7a7a53e1eba7a0f5dc5b1ade312a0d76119 (diff)
downloadsnes9x2002-e8bad8c3ca33d6dfa672f2e570eddc3ab4b3a7e6.tar.gz
snes9x2002-e8bad8c3ca33d6dfa672f2e570eddc3ab4b3a7e6.tar.bz2
snes9x2002-e8bad8c3ca33d6dfa672f2e570eddc3ab4b3a7e6.zip
initial libretro changes
-rw-r--r--.gitignore3
-rw-r--r--Makefile110
-rw-r--r--libretro/libretro.cpp616
-rw-r--r--libretro/libretro.h277
-rw-r--r--libretro/link.T5
-rw-r--r--libretro/memstream.c115
-rw-r--r--libretro/memstream.h30
-rw-r--r--src/dma.cpp2
-rw-r--r--src/memmap.h7
-rw-r--r--src/mode7.cpp89
-rw-r--r--src/mode7_t.h18
-rw-r--r--src/mode7new.cpp75
-rw-r--r--src/mode7prio.cpp106
-rw-r--r--src/mode7prio_t.h19
-rw-r--r--src/port.h10
-rw-r--r--src/rops.h61
-rw-r--r--src/snes9x.h10
-rw-r--r--src/spc700.cpp2
-rw-r--r--src/srtc.h2
-rw-r--r--src/tile16_t.h23
-rw-r--r--src/tile16f_t.h17
21 files changed, 1515 insertions, 82 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..c945f27
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+
+*.o
+retro.*
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..0330e95
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,110 @@
+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
+
+CC = gcc
+
+ifeq ($(platform), unix)
+ TARGET := libretro.so
+ fpic := -fPIC
+ SHARED := -shared -Wl,--version-script=libretro/link.T
+else ifeq ($(platform), osx)
+ TARGET := libretro.dylib
+ fpic := -fPIC
+ SHARED := -dynamiclib
+else ifeq ($(platform), ps3)
+ TARGET := libretro.a
+ CC = $(CELL_SDK)/host-win32/ppu/bin/ppu-lv2-gcc.exe
+ AR = $(CELL_SDK)/host-win32/ppu/bin/ppu-lv2-ar.exe
+ CFLAGS += -DBLARGG_BIG_ENDIAN=1 -D__ppc__
+else ifeq ($(platform), sncps3)
+ TARGET := libretro.a
+ CC = $(CELL_SDK)/host-win32/sn/bin/ps3ppusnc.exe
+ AR = $(CELL_SDK)/host-win32/sn/bin/ps3snarl.exe
+ CFLAGS += -DBLARGG_BIG_ENDIAN=1 -D__ppc__
+else ifeq ($(platform), xenon)
+ TARGET := libretro.a
+ CC = xenon-gcc
+ AR = xenon-ar
+ CFLAGS += -D__LIBXENON__ -m32 -D__ppc__
+else ifeq ($(platform), wii)
+ TARGET := libretro.a
+ CC = $(DEVKITPPC)/bin/powerpc-eabi-gcc
+ AR = $(DEVKITPPC)/bin/powerpc-eabi-ar
+ CFLAGS += -DGEKKO -mrvl -mcpu=750 -meabi -mhard-float -DBLARGG_BIG_ENDIAN=1 -D__ppc__
+else
+ TARGET := retro.dll
+ CC = gcc
+ fpic :=
+ LD_FLAGS :=
+ SHARED := -shared -static-libgcc -static-libstdc++ -Wl,--version-script=libretro/link.T
+ CFLAGS += -D__WIN32__ -D__WIN32_LIBRETRO__
+endif
+
+ifeq ($(DEBUG), 1)
+CFLAGS += -O0 -g
+else
+CFLAGS += -O3
+endif
+
+
+OBJECTS = ./src/apu.o ./src/apuaux.o ./src/c4.o ./src/c4emu.o ./src/cheats.o ./src/cheats2.o ./src/clip.o ./src/data.o ./src/screenshot.o ./src/dsp1.o ./src/fxemu.o ./src/fxinst.o ./src/globals.o ./src/loadzip.o ./src/ppu.o ./src/dma.o ./src/memmap.o ./src/cpu.o ./src/cpuexec.o ./src/cpuops.o ./src/sa1.o ./src/sa1cpu.o ./src/sdd1.o ./src/sdd1emu.o ./src/snapshot.o ./src/soundux.o ./src/spc700.o ./src/spc700a.o ./src/srtc.o ./src/spc_decode.o ./src/tile16.o ./src/tile16add.o ./src/tile16add1_2.o ./src/tile16fadd1_2.o ./src/tile16sub.o ./src/tile16sub1_2.o ./src/tile16fsub1_2.o ./src/mode7new.o ./src/mode7.o ./src/mode7add.o ./src/mode7add1_2.o ./src/mode7sub.o ./src/mode7sub1_2.o ./src/mode7prio.o ./src/mode7addprio.o ./src/mode7add1_2prio.o ./src/mode7subprio.o ./src/mode7sub1_2prio.o ./src/gfx16.o ./src/rops.o ./libretro/libretro.o ./libretro/memstream.o
+
+INCLUDES = -I.
+DEFINES = -DHAVE_STRINGS_H -DHAVE_STDINT_H -DHAVE_INTTYPES_H -D__LIBRETRO__ -DINLINE=inline -DUSE_SA1
+
+ifeq ($(platform), sncps3)
+WARNINGS_DEFINES =
+CODE_DEFINES =
+else
+WARNINGS_DEFINES = -Wall -W -Wno-unused-parameter -Wno-parentheses -Wno-write-strings -Wno-comment
+CODE_DEFINES = -fomit-frame-pointer
+endif
+
+COMMON_DEFINES += $(CODE_DEFINES) $(WARNINGS_DEFINES) -DNDEBUG=1 $(fpic)
+
+CFLAGS += $(DEFINES) $(COMMON_DEFINES)
+
+all: $(TARGET)
+
+$(TARGET): $(OBJECTS)
+ifeq ($(platform), ps3)
+ $(AR) rcs $@ $(OBJECTS)
+else ifeq ($(platform), sncps3)
+ $(AR) rcs $@ $(OBJECTS)
+else ifeq ($(platform), xenon)
+ $(AR) rcs $@ $(OBJECTS)
+else ifeq ($(platform), wii)
+ $(AR) rcs $@ $(OBJECTS)
+else
+ $(CXX) $(fpic) $(SHARED) $(INCLUDES) -o $@ $(OBJECTS) -lm
+endif
+
+%.o: %.c
+ $(CC) $(INCLUDES) $(CFLAGS) -c -o $@ $<
+
+%.o: %.cpp
+ $(CXX) $(INCLUDES) $(CFLAGS) -c -o $@ $<
+
+%.o: %.s
+ $(CXX) $(INCLUDES) $(CFLAGS) -Wa,-I./src/ -c -o $@ $<
+
+%.o: %.S
+ $(CXX) $(INCLUDES) $(CFLAGS) -Wa,-I./src/ -c -o $@ $<
+
+clean:
+ rm -f $(OBJECTS) $(TARGET)
+
+.PHONY: clean
+
diff --git a/libretro/libretro.cpp b/libretro/libretro.cpp
new file mode 100644
index 0000000..ec9e4d6
--- /dev/null
+++ b/libretro/libretro.cpp
@@ -0,0 +1,616 @@
+#include <stdio.h>
+#include <stdint.h>
+#ifndef _MSC_VER
+#include <stdbool.h>
+#include <unistd.h>
+#endif
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <fcntl.h>
+
+#include "libretro.h"
+#include "memstream.h"
+
+#include "../src/snes9x.h"
+#include "../src/memmap.h"
+#include "../src/cpuexec.h"
+#include "../src/srtc.h"
+#include "../src/apu.h"
+#include "../src/ppu.h"
+#include "../src/snapshot.h"
+#include "../src/soundux.h"
+#include "../src/cheats.h"
+#include "../src/display.h"
+
+#define MAP_BUTTON(id, name) S9xMapButton((id), S9xGetCommandT((name)), false)
+#define MAKE_BUTTON(pad, btn) (((pad)<<4)|(btn))
+
+#define BTN_POINTER (RETRO_DEVICE_ID_JOYPAD_R + 1)
+#define BTN_POINTER2 (BTN_POINTER + 1)
+
+static retro_video_refresh_t video_cb = NULL;
+static retro_input_poll_t poll_cb = NULL;
+static retro_input_state_t input_cb = NULL;
+static retro_audio_sample_batch_t audio_batch_cb = NULL;
+static retro_environment_t environ_cb = NULL;
+
+static uint32 joys[5];
+
+bool8 ROMAPUEnabled = 0;
+char currentWorkingDir[MAX_PATH+1] = {0};
+
+memstream_t *s_stream;
+
+int s_open(const char *fname, const char *mode)
+{
+ s_stream = memstream_open();
+ return TRUE;
+}
+
+int s_read(void *p, int l)
+{
+ return memstream_read(s_stream, p, l);
+}
+
+int s_write(void *p, int l)
+{
+ return memstream_write(s_stream, p, l);
+}
+
+void s_close()
+{
+ memstream_close(s_stream);
+}
+
+int (*statef_open)(const char *fname, const char *mode) = s_open;
+int (*statef_read)(void *p, int l) = s_read;
+int (*statef_write)(void *p, int l) = s_write;
+void (*statef_close)() = s_close;
+
+
+
+void *retro_get_memory_data(unsigned type)
+{
+ uint8_t* data;
+
+ switch(type)
+ {
+ case RETRO_MEMORY_SAVE_RAM:
+ data = Memory.SRAM;
+ break;
+ case RETRO_MEMORY_SYSTEM_RAM:
+ data = Memory.RAM;
+ break;
+ case RETRO_MEMORY_VIDEO_RAM:
+ data = Memory.VRAM;
+ break;
+ default:
+ data = NULL;
+ break;
+ }
+
+ return data;
+}
+
+size_t retro_get_memory_size(unsigned type)
+{
+ unsigned size;
+
+ switch(type)
+ {
+ case RETRO_MEMORY_SAVE_RAM:
+ size = (unsigned) (Memory.SRAMSize ? (1 << (Memory.SRAMSize + 3)) * 128 : 0);
+ if (size > 0x20000)
+ size = 0x20000;
+ break;
+ /*case RETRO_MEMORY_RTC:
+ size = (Settings.SRTC || Settings.SPC7110RTC)?20:0;
+ break;*/
+ case RETRO_MEMORY_SYSTEM_RAM:
+ size = 128 * 1024;
+ break;
+ case RETRO_MEMORY_VIDEO_RAM:
+ size = 64 * 1024;
+ break;
+ default:
+ size = 0;
+ break;
+ }
+
+ return size;
+}
+
+unsigned retro_api_version(void)
+{
+ return RETRO_API_VERSION;
+}
+
+void retro_set_video_refresh(retro_video_refresh_t cb)
+{
+ video_cb = cb;
+}
+
+void retro_set_audio_sample(retro_audio_sample_t 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)
+{
+ poll_cb = cb;
+}
+
+void retro_set_input_state(retro_input_state_t cb)
+{
+ input_cb = cb;
+}
+
+static bool use_overscan;
+
+void retro_set_environment(retro_environment_t cb)
+{
+ environ_cb = cb;
+}
+
+void retro_get_system_info(struct retro_system_info *info)
+{
+ info->need_fullpath = false;
+ info->valid_extensions = "smc|fig|sfc|gd3|gd7|dx2|bsx|swc|zip|SMC|FIG|SFC|BSX|GD3|GD7|DX2|SWC|ZIP";
+ info->library_version = "7.2.0";
+ info->library_name = "PocketSNES";
+ info->block_extract = false;
+}
+
+static int16 audio_buf[0x10000];
+int avail = 534;
+
+void S9xGenerateSound()
+{
+}
+
+uint32 S9xReadJoypad(int which1)
+{
+ if (which1 > 4)
+ return 0;
+ return joys[which1];
+}
+
+void retro_set_controller_port_device(unsigned in_port, unsigned device)
+{
+}
+
+void retro_get_system_av_info(struct retro_system_av_info *info)
+{
+ info->geometry.base_width = 256;
+ info->geometry.base_height = 239;
+ info->geometry.max_width = 512;
+ info->geometry.max_height = 512;
+ if (!Settings.PAL)
+ info->timing.fps = 21477272.0 / 357366.0;
+ else
+ info->timing.fps = 21281370.0 / 425568.0;
+ info->timing.sample_rate = 32040.5;
+ info->geometry.aspect_ratio = 4.0f / 3.0f;
+}
+
+static void snes_init (void)
+{
+ memset(&Settings, 0, sizeof(Settings));
+ Settings.JoystickEnabled = FALSE;
+ Settings.SoundPlaybackRate = 32000;
+ Settings.Stereo = TRUE;
+ Settings.SoundBufferSize = 0;
+ Settings.CyclesPercentage = 100;
+ Settings.DisableSoundEcho = FALSE;
+ Settings.APUEnabled = FALSE;
+ Settings.H_Max = SNES_CYCLES_PER_SCANLINE;
+ Settings.SkipFrames = AUTO_FRAMERATE;
+ Settings.Shutdown = Settings.ShutdownMaster = TRUE;
+ Settings.FrameTimePAL = 20000;
+ Settings.FrameTimeNTSC = 16667;
+ Settings.FrameTime = Settings.FrameTimeNTSC;
+ Settings.DisableSampleCaching = FALSE;
+ Settings.DisableMasterVolume = FALSE;
+ Settings.Mouse = FALSE;
+ Settings.SuperScope = FALSE;
+ Settings.MultiPlayer5 = FALSE;
+ // Settings.ControllerOption = SNES_MULTIPLAYER5;
+ Settings.ControllerOption = 0;
+
+ Settings.ForceTransparency = FALSE;
+ Settings.Transparency = TRUE;
+ Settings.SixteenBit = TRUE;
+
+ Settings.SupportHiRes = FALSE;
+ Settings.NetPlay = FALSE;
+ Settings.ServerName [0] = 0;
+ Settings.AutoSaveDelay = 30;
+ Settings.ApplyCheats = FALSE;
+ Settings.TurboMode = FALSE;
+ Settings.TurboSkipFrames = 15;
+ Settings.ThreadSound = FALSE;
+ Settings.SoundSync = FALSE;
+ Settings.asmspc700 = TRUE;
+ Settings.SpeedHacks = TRUE;
+
+ Settings.HBlankStart = (256 * Settings.H_Max) / SNES_HCOUNTER_MAX;
+ /*
+ Settings.SoundPlaybackRate = 5;
+ Settings.Stereo = TRUE;
+ Settings.SoundBufferSize = 0;
+ Settings.DisableSoundEcho = 0;
+ Settings.AltSampleDecode = 0;
+ Settings.SoundEnvelopeHeightReading = FALSE;
+ Settings.FixFrequency = 0;
+ Settings.CyclesPercentage = 100;
+ Settings.InterpolatedSound = TRUE;
+ Settings.APUEnabled = Settings.NextAPUEnabled = TRUE;
+ Settings.SoundMixInterval = 0;
+ Settings.H_Max = SNES_CYCLES_PER_SCANLINE;
+ Settings.SkipFrames = 10;
+ Settings.ShutdownMaster = TRUE;
+ Settings.FrameTimePAL = 20000;
+ Settings.FrameTimeNTSC = 16667;
+ Settings.DisableSampleCaching = FALSE;
+ Settings.DisableMasterVolume = FALSE;
+ Settings.Mouse = FALSE;
+ Settings.SuperScope = FALSE;
+ Settings.MultiPlayer5 = FALSE;
+ Settings.TurboMode = FALSE;
+ Settings.TurboSkipFrames = 40;
+ Settings.ControllerOption = SNES_MULTIPLAYER5;
+ Settings.Transparency = TRUE;
+ Settings.SixteenBit = TRUE;
+ Settings.SupportHiRes = TRUE;
+ Settings.NetPlay = FALSE;
+ Settings.ServerName [0] = 0;
+ Settings.ThreadSound = FALSE;
+ Settings.AutoSaveDelay = 30;
+ Settings.HBlankStart = (256 * Settings.H_Max) / SNES_HCOUNTER_MAX;
+ Settings.DisplayFrameRate = FALSE;
+ Settings.ReverseStereo = TRUE;
+ */
+
+ CPU.Flags = 0;
+
+ if (!Memory.Init() || !S9xInitAPU())
+ {
+ Memory.Deinit();
+ S9xDeinitAPU();
+ fprintf(stderr, "[libsnes]: Failed to init Memory or APU.\n");
+ exit(1);
+ }
+
+ if (!S9xInitSound() || !S9xGraphicsInit()) exit(1);
+ //S9xSetSamplesAvailableCallback(S9xAudioCallback);
+
+ GFX.Pitch = use_overscan ? 1024 : 2048;
+
+ // hack to make sure GFX.Delta is always (2048 * 512 * 2) >> 1, needed for tile16_t.h
+ GFX.Screen = (uint8 *) calloc(1, 2048 * 512 * 2 * 2);
+ GFX.SubScreen = GFX.Screen + 2048 * 512 * 2;
+ GFX.ZBuffer = (uint8 *) calloc(1, GFX.Pitch * 512 * sizeof(uint16));
+ GFX.SubZBuffer = (uint8 *) calloc(1, GFX.Pitch * 512 * sizeof(uint16));
+ GFX.Delta = 1048576; //(GFX.SubScreen - GFX.Screen) >> 1;
+
+ if (GFX.Delta != ((GFX.SubScreen - GFX.Screen) >> 1))
+ {
+ printf("BAD DELTA! (is %u, should be %u)\n", ((GFX.SubScreen - GFX.Screen) >> 1), GFX.Delta);
+ exit(1);
+ }
+
+ /* controller port 1 */
+ //S9xSetController(0, CTL_JOYPAD, 0, 0, 0, 0);
+ //retro_devices[0] = RETRO_DEVICE_JOYPAD;
+
+ /* controller port 2 */
+ //S9xSetController(1, CTL_JOYPAD, 1, 0, 0, 0);
+ //retro_devices[1] = RETRO_DEVICE_JOYPAD;
+
+ //S9xUnmapAllControls();
+ //map_buttons();
+
+ //S9xSetSoundMute(FALSE);
+}
+
+void retro_init (void)
+{
+ if (!environ_cb(RETRO_ENVIRONMENT_GET_OVERSCAN, &use_overscan))
+ use_overscan = FALSE;
+
+ snes_init();
+}
+
+/* libsnes uses relative values for analogue devices.
+ S9x seems to use absolute values, but do convert these into relative values in the core. (Why?!)
+ Hack around it. :) */
+
+void retro_deinit(void)
+{
+ S9xDeinitAPU();
+ Memory.Deinit();
+ S9xGraphicsDeinit();
+ //S9xUnmapAllControls();
+}
+
+void retro_reset (void)
+{
+ S9xReset();
+}
+
+//static int16_t retro_mouse_state[2][2] = {{0}, {0}};
+//static int16_t retro_scope_state[2] = {0};
+//static int16_t retro_justifier_state[2][2] = {{0}, {0}};
+void S9xSetButton(int i, uint16 b, bool pressed);
+
+static void report_buttons (void)
+{
+ int i, j;
+ for ( i = 0; i < 5; i++)
+ {
+ for (j = 0; j <= RETRO_DEVICE_ID_JOYPAD_R; j++)
+ {
+ if (input_cb(i, RETRO_DEVICE_JOYPAD, 0, j))
+ joys[i] |= (1 << (15 - j));
+ else
+ joys[i] &= ~(1 << (15 - j));
+ }
+ }
+}
+
+void retro_run (void)
+{
+ S9xMainLoop();
+ S9xMixSamples(audio_buf, avail * 2);
+ audio_batch_cb((int16_t *) audio_buf, avail);
+
+ poll_cb();
+
+ report_buttons();
+}
+
+size_t retro_serialize_size (void)
+{
+ uint8_t *tmpbuf;
+
+ tmpbuf = (uint8_t*)malloc(5000000);
+ memstream_set_buffer(tmpbuf, 5000000);
+ S9xFreezeGame("");
+ free(tmpbuf);
+ return memstream_get_last_size();
+}
+
+bool retro_serialize(void *data, size_t size)
+{
+ memstream_set_buffer((uint8_t*)data, size);
+ if (S9xFreezeGame("") == FALSE)
+ return FALSE;
+
+ return TRUE;
+}
+
+bool retro_unserialize(const void * data, size_t size)
+{
+ memstream_set_buffer((uint8_t*)data, size);
+ if (S9xUnfreezeGame("") == FALSE)
+ return FALSE;
+
+ return TRUE;
+}
+
+void retro_cheat_reset(void)
+{}
+
+void retro_cheat_set(unsigned unused, bool unused1, const char* unused2)
+{}
+
+bool retro_load_game(const struct retro_game_info *game)
+{
+ bool8 loaded;
+
+ /* Hack. S9x cannot do stuff from RAM. <_< */
+ memstream_set_buffer((uint8_t*)game->data, game->size);
+
+ loaded = Memory.LoadROM("");
+ if (!loaded)
+ {
+ fprintf(stderr, "[libretro]: Rom loading failed...\n");
+ return FALSE;
+ }
+
+ //S9xGraphicsInit();
+ S9xReset();
+ CPU.APU_APUExecuting = Settings.APUEnabled = 3;
+ Settings.SixteenBitSound = true;
+ so.stereo = Settings.Stereo;
+ so.playback_rate = Settings.SoundPlaybackRate;
+ S9xSetPlaybackRate(so.playback_rate);
+ S9xSetSoundMute(FALSE);
+
+ return TRUE;
+}
+
+bool retro_load_game_special(
+ unsigned game_type,
+ const struct retro_game_info *info, size_t num_info
+)
+{ return false; }
+
+void retro_unload_game (void)
+{ }
+
+unsigned retro_get_region (void)
+{
+ return Settings.PAL ? RETRO_REGION_PAL : RETRO_REGION_NTSC;
+}
+
+bool8 S9xDeinitUpdate(int width, int height, bool8 sixteen_bit)
+{
+ int y;
+
+ if (height == 448 || height == 478)
+ {
+ /* Pitch 2048 -> 1024, only done once per res-change. */
+ if (GFX.Pitch == 2048)
+ {
+ for ( y = 1; y < height; y++)
+ {
+ uint8_t *src = GFX.Screen + y * 1024;
+ uint8_t *dst = GFX.Screen + y * 512;
+ memcpy(dst, src, width * sizeof(uint8_t) * 2);
+ }
+ }
+ GFX.Pitch = 1024;
+ }
+ else
+ {
+ /* Pitch 1024 -> 2048, only done once per res-change. */
+ if (GFX.Pitch == 1024)
+ {
+ for ( y = height - 1; y >= 0; y--)
+ {
+ uint8_t *src = GFX.Screen + y * 512;
+ uint8_t *dst = GFX.Screen + y * 1024;
+ memcpy(dst, src, width * sizeof(uint8_t) * 2);
+ }
+ }
+ GFX.Pitch = 2048;
+ }
+
+ video_cb(GFX.Screen, width, height, GFX_PITCH);
+
+ return TRUE;
+}
+
+
+/* Dummy functions that should probably be implemented correctly later. */
+const char* S9xGetFilename(const char* in) { return in; }
+const char* S9xGetFilenameInc(const char* in) { return in; }
+const char *S9xGetHomeDirectory() { return NULL; }
+const char *S9xGetSnapshotDirectory() { return NULL; }
+const char *S9xGetROMDirectory() { return NULL; }
+const char* S9xChooseFilename(bool8 a) { return NULL; }
+bool8 S9xInitUpdate() { return TRUE; }
+bool8 S9xContinueUpdate(int width, int height) { return TRUE; }
+void S9xSetPalette() {}
+void S9xAutoSaveSRAM() {}
+void S9xLoadSDD1Data() {}
+bool8 S9xReadMousePosition (int which1_0_to_1, int &x, int &y, uint32 &buttons) { return FALSE; }
+bool8 S9xReadSuperScopePosition (int &x, int &y, uint32 &buttons) { return FALSE; }
+void JustifierButtons(uint32& x) {}
+bool JustifierOffscreen() { return false; }
+
+START_EXTERN_C
+
+void S9xToggleSoundChannel (int channel) {}
+
+bool8 S9xMovieActive() { return FALSE; }
+bool8 S9xMoviePlaying() { return FALSE; }
+void S9xMovieFreeze() {}
+void S9xMovieUnfreeze() {}
+int S9xMovieCreate (const char* filename, uint8 controllers_mask, uint8 opts, const wchar_t* metadata, int metadata_length) { return FALSE; }
+void S9xMovieStop (bool8 suppress_message) {}
+const char *S9xChooseMovieFilename(bool8 read_only) { return NULL; }
+void S9xMovieUpdate(bool addFrame) {}
+void S9xMovieUpdateOnReset() {}
+int S9xMovieOpen(const char* filename, bool8 read_only) { return FALSE; }
+uint32 S9xMovieGetFrameCounter() { return 0; }
+const char *S9xStringInput(const char *message) { return NULL; }
+
+END_EXTERN_C
+
+//void Write16(uint16 v, uint8*& ptr) {}
+//uint16 Read16(const uint8*& ptr) { return 0; }
+
+//void S9xHandlePortCommand(s9xcommand_t cmd, int16 data1, int16 data2) {}
+//bool S9xPollButton(uint32 id, bool *pressed) { return false; }
+//bool S9xPollPointer(uint32 id, int16 *x, int16 *y) { return false; }
+//bool S9xPollAxis(uint32 id, int16 *value) { return false; }
+
+void S9xExit() { exit(1); }
+bool8 S9xOpenSoundDevice (int mode, bool8 stereo, int buffer_size) {
+ //so.sixteen_bit = 1;
+ so.stereo = TRUE;
+ //so.buffer_size = 534;
+ so.playback_rate = 32000;
+ return TRUE;
+}
+
+const char *emptyString = "";
+const char *S9xBasename (const char *filename) { return emptyString; }
+bool8 S9xOpenSnapshotFile (const char *base, bool8 read_only, STREAM *file) { *file = OPEN_STREAM(0, 0); return TRUE; }
+void S9xCloseSnapshotFile (STREAM file) { CLOSE_STREAM(file); }
+
+void S9xMessage(int a, int b, const char* msg)
+{
+ fprintf(stderr, "%s\n", msg);
+}
+
+/* S9x weirdness. */
+#ifndef _WIN32
+void _splitpath (const char * path, char * drive, char * dir, char * fname, char * ext)
+{
+ const char *slash, *dot;
+
+ slash = strrchr(path, SLASH_CHAR);
+ dot = strrchr(path, '.');
+
+ if (dot && slash && dot < slash)
+ dot = NULL;
+
+ if (!slash)
+ {
+ *dir = 0;
+
+ strcpy(fname, path);
+
+ if (dot)
+ {
+ fname[dot - path] = 0;
+ strcpy(ext, dot + 1);
+ }
+ else
+ *ext = 0;
+ }
+ else
+ {
+ strcpy(dir, path);
+ dir[slash - path] = 0;
+
+ strcpy(fname, slash + 1);
+
+ if (dot)
+ {
+ fname[dot - slash - 1] = 0;
+ strcpy(ext, dot + 1);
+ }
+ else
+ *ext = 0;
+ }
+}
+
+void _makepath (char *path, const char * a, const char *dir, const char *fname, const char *ext)
+{
+ if (dir && *dir)
+ {
+ strcpy(path, dir);
+ strcat(path, SLASH_STR);
+ }
+ else
+ *path = 0;
+
+ strcat(path, fname);
+
+ if (ext && *ext)
+ {
+ strcat(path, ".");
+ strcat(path, ext);
+ }
+}
+#endif
+
diff --git a/libretro/libretro.h b/libretro/libretro.h
new file mode 100644
index 0000000..4b5d71d
--- /dev/null
+++ b/libretro/libretro.h
@@ -0,0 +1,277 @@
+#ifndef LIBRETRO_H__
+#define LIBRETRO_H__
+
+#include <stdint.h>
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#else
+#if defined(_MSC_VER) && !defined(__cplusplus)
+#define bool unsigned char
+#define true 1
+#define false 0
+#else
+#include <stdbool.h>
+#endif
+#endif
+
+#define RETRO_API_VERSION 1
+
+#define RETRO_DEVICE_MASK 0xff
+#define RETRO_DEVICE_NONE 0
+#define RETRO_DEVICE_JOYPAD 1
+#define RETRO_DEVICE_MOUSE 2
+#define RETRO_DEVICE_KEYBOARD 3
+#define RETRO_DEVICE_LIGHTGUN 4
+
+#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)
+
+#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_MOUSE_X 0
+#define RETRO_DEVICE_ID_MOUSE_Y 1
+#define RETRO_DEVICE_ID_MOUSE_LEFT 2
+#define RETRO_DEVICE_ID_MOUSE_RIGHT 3
+
+#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
+
+#define RETRO_REGION_NTSC 0
+#define RETRO_REGION_PAL 1
+
+#define RETRO_MEMORY_MASK 0xff
+#define RETRO_MEMORY_SAVE_RAM 0
+#define RETRO_MEMORY_RTC 1
+#define RETRO_MEMORY_SYSTEM_RAM 2
+#define RETRO_MEMORY_VIDEO_RAM 3
+
+#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)
+
+#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
+
+
+// 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 RetroArch supports frame duping,
+ // passing NULL to video frame callback.
+ //
+#define RETRO_ENVIRONMENT_GET_VARIABLE 4 // struct retro_variable * --
+ // Interface to aquire user-defined information from environment
+ // that cannot feasibly be supported in a multi-system way.
+ // Mostly used for obscure,
+ // specific features that the user can tap into when neseccary.
+ //
+#define RETRO_ENVIRONMENT_SET_VARIABLES 5 // const struct retro_variable * --
+ // Allows an implementation to signal the environment
+ // which variables it might want to check for later using GET_VARIABLE.
+ // 'data' points to an array of retro_variable structs terminated by a { NULL, NULL } element.
+ // retro_variable::value should contain a human readable description of the key.
+ //
+#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.
+
+struct retro_message
+{
+ const char *msg; // Message to be displayed.
+ unsigned frames; // Duration in frames of message.
+};
+
+struct retro_system_info
+{
+ 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 XRGB1555 native endian.
+// Width and height specify dimensions of buffer.
+// Pitch specifices length in bytes between two lines in buffer.
+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.
+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/libretro/link.T b/libretro/link.T
new file mode 100644
index 0000000..b0c262d
--- /dev/null
+++ b/libretro/link.T
@@ -0,0 +1,5 @@
+{
+ global: retro_*;
+ local: *;
+};
+
diff --git a/libretro/memstream.c b/libretro/memstream.c
new file mode 100644
index 0000000..4e1ac21
--- /dev/null
+++ b/libretro/memstream.c
@@ -0,0 +1,115 @@
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "memstream.h"
+
+static uint8_t* g_buffer = NULL;
+static size_t g_size = 0;
+
+static size_t last_file_size = 0;
+
+struct memstream
+{
+ uint8_t *m_buf;
+ size_t m_size;
+ size_t m_ptr;
+};
+
+void memstream_set_buffer(uint8_t *buffer, size_t size)
+{
+ g_buffer = buffer;
+ g_size = size;
+}
+
+size_t memstream_get_last_size()
+{
+ return last_file_size;
+}
+
+static void memstream_init(memstream_t *stream, uint8_t *buffer, size_t max_size)
+{
+ stream->m_buf = buffer;
+ stream->m_size = max_size;
+ stream->m_ptr = 0;
+}
+
+memstream_t *memstream_open()
+{
+ memstream_t *stream;
+ if (!g_buffer || !g_size)
+ return NULL;
+
+ stream = (memstream_t*)calloc(1, sizeof(*stream));
+ memstream_init(stream, g_buffer, g_size);
+
+ g_buffer = NULL;
+ g_size = 0;
+ return stream;
+}
+
+void memstream_close(memstream_t *stream)
+{
+ last_file_size = stream->m_ptr;
+ free(stream);
+}
+
+size_t memstream_read(memstream_t *stream, void *data, size_t bytes)
+{
+ size_t avail = stream->m_size - stream->m_ptr;
+ if (bytes > avail)
+ bytes = avail;
+
+ memcpy(data, stream->m_buf + stream->m_ptr, bytes);
+ stream->m_ptr += bytes;
+ return bytes;
+}
+
+size_t memstream_write(memstream_t *stream, const void *data, size_t bytes)
+{
+ size_t avail = stream->m_size - stream->m_ptr;
+ if (bytes > avail)
+ bytes = avail;
+
+ memcpy(stream->m_buf + stream->m_ptr, data, bytes);
+ stream->m_ptr += bytes;
+ return bytes;
+}
+
+int memstream_seek(memstream_t *stream, int offset, int whence)
+{
+ size_t ptr;
+ if (whence == SEEK_SET)
+ ptr = offset;
+ else if (whence == SEEK_CUR)
+ ptr = stream->m_ptr + offset;
+ else if (whence == SEEK_END)
+ ptr = stream->m_size + offset;
+ else
+ return -1;
+
+ if (ptr <= stream->m_size)
+ {
+ stream->m_ptr = ptr;
+ return 0;
+ }
+ else
+ return -1;
+}
+
+size_t memstream_pos(memstream_t *stream)
+{
+ return stream->m_ptr;
+}
+
+char *memstream_gets(memstream_t *stream, char *buffer, size_t len)
+{
+ return NULL;
+}
+
+int memstream_getc(memstream_t *stream)
+{
+ if (stream->m_ptr >= stream->m_size)
+ return EOF;
+ else
+ return stream->m_buf[stream->m_ptr++];
+}
diff --git a/libretro/memstream.h b/libretro/memstream.h
new file mode 100644
index 0000000..812086a
--- /dev/null
+++ b/libretro/memstream.h
@@ -0,0 +1,30 @@
+#ifndef __MEMSTREAM_H
+#define __MEMSTREAM_H
+
+#include <stddef.h>
+#include <stdint.h>
+
+#if defined(__cplusplus) || defined(c_plusplus)
+extern "C" {
+#endif
+
+typedef struct memstream memstream_t;
+
+memstream_t *memstream_open();
+void memstream_close(memstream_t * stream);
+
+size_t memstream_read(memstream_t * stream, void *data, size_t bytes);
+size_t memstream_write(memstream_t * stream, const void *data, size_t bytes);
+int memstream_getc(memstream_t * stream);
+char *memstream_gets(memstream_t * stream, char *buffer, size_t len);
+size_t memstream_pos(memstream_t * stream);
+int memstream_seek(memstream_t * stream, int offset, int whence);
+
+void memstream_set_buffer(uint8_t *buffer, size_t size);
+size_t memstream_get_last_size();
+
+#if defined(__cplusplus) || defined(c_plusplus)
+}
+#endif
+
+#endif
diff --git a/src/dma.cpp b/src/dma.cpp
index bf102ed..7a6af0f 100644
--- a/src/dma.cpp
+++ b/src/dma.cpp
@@ -127,7 +127,7 @@ void S9xDoDMA (uint8 Channel)
}
else
{
- #if defined (__GP2X__) || defined (__GIZ__) || defined (__WIZ__)
+ #if 1
void *ptr = bsearch (&address, Memory.SDD1Index,
Memory.SDD1Entries, 12, S9xCompareSDD1IndexEntries);
if (ptr)
diff --git a/src/memmap.h b/src/memmap.h
index ca234ea..d146522 100644
--- a/src/memmap.h
+++ b/src/memmap.h
@@ -46,8 +46,11 @@
#ifdef FAST_LSB_WORD_ACCESS
#define READ_WORD(s) (*(uint16 *) (s))
#define READ_DWORD(s) (*(uint32 *) (s))
-#define WRITE_WORD(s, d) (*(uint16 *) (s) = (d)
-#define WRITE_DWORD(s, d) (*(uint32 *) (s) = (d)
+#define WRITE_WORD(s, d) *(uint16 *) (s) = (d)
+#define WRITE_DWORD(s, d) *(uint32 *) (s) = (d)
+#define READ_3WORD(s) ((*(uint32 *) (s)) & 0x00FFFFFF)
+#define WRITE_3WORD(s, d) *(uint16 *) (s) = (uint16) (d), \
+ *((uint8 *) (s) + 2) = (uint8) ((d) >> 16)
#else
#define READ_WORD(s) ( *(uint8 *) (s) |\
(*((uint8 *) (s) + 1) << 8))
diff --git a/src/mode7.cpp b/src/mode7.cpp
index 88b4d89..db65ab9 100644
--- a/src/mode7.cpp
+++ b/src/mode7.cpp
@@ -132,6 +132,8 @@ void DrawBGMode7Background16R3 (uint8 *Screen, int bg, int depth)
xx3 = (startx + HOffset);
+ if (dir == 1)
+ {
asm volatile (
"1: \n"
" ldrb r0, [%[d]] \n"
@@ -158,7 +160,7 @@ void DrawBGMode7Background16R3 (uint8 *Screen, int bg, int depth)
" add %[AA], %[AA], r1 \n"
" movs r0, r0, lsl #2 \n"
" ldrne r1, [%[colors], r0] \n"
- " add %[xx3], %[xx3], %[dir] \n"
+ " add %[xx3], %[xx3], #1 \n"
" strneb %[depth], [%[d]] \n"
" ldr r0, %[dcc] \n"
" strneh r1, [%[p]] \n"
@@ -184,7 +186,7 @@ void DrawBGMode7Background16R3 (uint8 *Screen, int bg, int depth)
"4: \n"
" ldr r0, %[daa] \n"
" ldr r1, %[dcc] \n"
- " add %[xx3], %[xx3], %[dir] \n"
+ " add %[xx3], %[xx3], #1 \n"
" add %[AA], %[AA], r0 \n"
" add %[CC], %[CC], r1 \n"
" add %[p], %[p], #2 \n"
@@ -203,11 +205,91 @@ void DrawBGMode7Background16R3 (uint8 *Screen, int bg, int depth)
[p] "r" (p),
[d] "r" (d),
[depth] "r" (depth),
- [dir] "r" (dir),
+ //[dir] "r" (dir),
[yy3] "r" (yy3),
[xx3] "r" (xx3)
: "r0", "r1", "r3", "cc"
);
+ }
+ else
+ {
+ asm volatile (
+ "1: \n"
+ " ldrb r0, [%[d]] \n"
+ " mov r3, %[AA], asr #18 \n"
+ " cmp %[depth], r0 \n"
+ " bls 4f \n"
+ " orrs r3, r3, %[CC], asr #18 \n"
+ " bne 2f \n"
+ " \n"
+ " mov r3, %[CC], asr #11 \n"
+ " mov r1, %[AA], asr #11 \n"
+ " add r3, r1, r3, lsl #7 \n"
+ " mov r3, r3, lsl #1 \n"
+ " ldrb r3, [%[VRAM], r3] \n"
+ " \n"
+ " and r1, %[CC], #(7 << 8) \n"
+ " add r3, %[VRAM], r3, lsl #7 \n"
+ " and r0, %[AA], #(7 << 8) \n"
+ " add r3, r3, r1, asr #4 \n"
+ " add r3, r3, r0, asr #7 \n"
+ " \n"
+ " ldr r1, %[daa] \n"
+ " ldrb r0, [r3, #1] \n"
+ " add %[AA], %[AA], r1 \n"
+ " movs r0, r0, lsl #2 \n"
+ " ldrne r1, [%[colors], r0] \n"
+ " add %[xx3], %[xx3], #-1 \n"
+ " strneb %[depth], [%[d]] \n"
+ " ldr r0, %[dcc] \n"
+ " strneh r1, [%[p]] \n"
+ " \n"
+ " add %[CC], %[CC], r0 \n"
+ " add %[d], %[d], #1 \n"
+ " add %[p], %[p], #2 \n"
+ " subs %[x], %[x], #1 \n"
+ " bne 1b \n"
+ " b 3f \n"
+ "2: \n"
+ //" and r1, %[yy3], #7 \n"
+ " and r0, %[xx3], #7 \n"
+ //" mov r3, r1, lsl #4 \n"
+ " add r3, %[yy3], r0, lsl #1 \n"
+ " \n"
+ " add r3, %[VRAM], r3 \n"
+ " ldrb r0, [r3, #1] \n"
+ " movs r0, r0, lsl #2 \n"
+ " ldrne r1, [%[colors], r0] \n"
+ " strneb %[depth], [%[d]] \n"
+ " strneh r1, [%[p]] \n"
+ "4: \n"
+ " ldr r0, %[daa] \n"
+ " ldr r1, %[dcc] \n"
+ " add %[xx3], %[xx3], #-1 \n"
+ " add %[AA], %[AA], r0 \n"
+ " add %[CC], %[CC], r1 \n"
+ " add %[p], %[p], #2 \n"
+ " add %[d], %[d], #1 \n"
+ " subs %[x], %[x], #1 \n"
+ " bne 1b \n"
+ "3: \n"
+ :
+ : [x] "r" (Right - Left),
+ [AA] "r" (l->MatrixA * (startx + xx) + BB),
+ [CC] "r" (l->MatrixC * (startx + xx) + DD),
+ [daa] "m" (aa),
+ [dcc] "m" (cc),
+ [VRAM] "r" (Memory.VRAM),
+ [colors] "r" (GFX.ScreenColors),
+ [p] "r" (p),
+ [d] "r" (d),
+ [depth] "r" (depth),
+ //[dir] "r" (dir),
+ [yy3] "r" (yy3),
+ [xx3] "r" (xx3)
+ : "r0", "r1", "r3", "cc"
+ );
+ }
}
}
@@ -487,3 +569,4 @@ void DrawBGMode7Background16R0 (uint8 *Screen, int bg, int depth)
}
+
diff --git a/src/mode7_t.h b/src/mode7_t.h
index 0d066b5..5d67aa6 100644
--- a/src/mode7_t.h
+++ b/src/mode7_t.h
@@ -127,7 +127,8 @@ static void DrawBGMode7Background16R3 (uint8 *Screen, int bg, int depth)
\
" cmp r3, #1 \n"\
" blo 11f \n"\
- " ldrneh r3, [%[p], %[delta]] \n"\
+ " mov r3, #0x200000 \n"\
+ " ldrneh r3, [%[p], r3] \n"\
" ldreq r3, %[fixedcolour] \n"\
\
ROP\
@@ -159,7 +160,8 @@ static void DrawBGMode7Background16R3 (uint8 *Screen, int bg, int depth)
\
" cmp r3, #1 \n"\
" blo 12f \n"\
- " ldrneh r3, [%[p], %[delta]] \n"\
+ " mov r3, #0x200000 \n"\
+ " ldrneh r3, [%[p], r3] \n"\
" ldreq r3, %[fixedcolour] \n"\
\
ROP\
@@ -186,7 +188,6 @@ static void DrawBGMode7Background16R3 (uint8 *Screen, int bg, int depth)
[colors] "r" (GFX.ScreenColors),\
[depth] "r" (depth),\
[yy3] "m" (yy3), \
- [delta] "r" (GFX.Delta << 1),\
[fixedcolour] "m" (fixedColour)\
: "r0", "r1", "r3", "cc"\
);
@@ -317,7 +318,8 @@ static void DrawBGMode7Background16R1R2 (uint8 *Screen, int bg, int depth)
" cmp r3, #1 \n"
" blo 11f \n"
- " ldrneh r3, [%[p], %[delta]] \n"
+ " mov r3, #0x200000 \n"
+ " ldrneh r3, [%[p], r3] \n"
" ldreq r3, %[fixedcolour] \n"
ROP
@@ -342,7 +344,7 @@ static void DrawBGMode7Background16R1R2 (uint8 *Screen, int bg, int depth)
[colors] "r" (GFX.ScreenColors),
[depth] "r" (depth),
//[zdelta] "r" (GFX.DepthDelta),
- [delta] "r" (GFX.Delta << 1),
+ //[delta] "r" (GFX.Delta << 1),
[fixedcolour] "m" (fixedColour),
[AndByX] "m" (AndByX),
[AndByY] "m" (AndByY)
@@ -463,7 +465,8 @@ static void DrawBGMode7Background16R0 (uint8 *Screen, int bg, int depth)
" cmp r3, #1 \n"
" blo 11f \n"
- " ldrneh r3, [%[p], %[delta]] \n"
+ " mov r3, #0x200000 \n"
+ " ldrneh r3, [%[p], r3] \n"
" ldreq r3, %[fixedcolour] \n"
ROP
@@ -487,7 +490,7 @@ static void DrawBGMode7Background16R0 (uint8 *Screen, int bg, int depth)
[VRAM] "r" (Memory.VRAM),
[colors] "r" (GFX.ScreenColors),
//[zdelta] "r" (GFX.DepthDelta),
- [delta] "r" (GFX.Delta << 1),
+ //[delta] "r" (GFX.Delta << 1),
[fixedcolour] "m" (fixedColour),
[depth] "r" (depth),
[AndByY] "m" (AndByY)
@@ -524,3 +527,4 @@ DEC_FMODE7(ROPNAME)
return;
}
}
+
diff --git a/src/mode7new.cpp b/src/mode7new.cpp
index 33ff453..b71e835 100644
--- a/src/mode7new.cpp
+++ b/src/mode7new.cpp
@@ -127,6 +127,8 @@ void DrawBGMode7Background16NewR3 (uint8 *Screen)
//fprintf(f, "AA:%d, CC:%d, daa: %d, dcc: %d, MA: %d, MB: %d, MC: %d, MD: %d\n", AA, CC, aa, cc, l->MatrixA, l->MatrixB, l->MatrixC, l->MatrixD);
+ if (dir == 1)
+ {
asm volatile (
"1: \n"
" mov r3, %[AA], asr #18 \n"
@@ -149,7 +151,7 @@ void DrawBGMode7Background16NewR3 (uint8 *Screen)
" add %[AA], %[AA], %[daa] \n"
" movs r0, r0, lsl #2 \n"
" ldrne r1, [%[colors], r0] \n"
- " add %[xx3], %[xx3], %[dir] \n"
+ " add %[xx3], %[xx3], #1 \n"
" strneh r1, [%[p]] \n"
" \n"
" add %[CC], %[CC], %[dcc] \n"
@@ -166,7 +168,7 @@ void DrawBGMode7Background16NewR3 (uint8 *Screen)
" add %[AA], %[AA], %[daa] \n"
" movs r0, r0, lsl #2 \n"
" ldrne r1, [%[colors], r0] \n"
- " add %[xx3], %[xx3], %[dir] \n"
+ " add %[xx3], %[xx3], #1 \n"
" strneh r1, [%[p]] \n"
" \n"
" add %[CC], %[CC], %[dcc] \n"
@@ -183,10 +185,74 @@ void DrawBGMode7Background16NewR3 (uint8 *Screen)
[daa] "r" (aa),
[dcc] "r" (cc),
[VRAM] "r" (Memory.VRAM),
- [colors] "r" (GFX.ScreenColors),
- [dir] "r" (dir)
+ [colors] "r" (GFX.ScreenColors)
+ //[dir] "r" (dir)
+ : "r0", "r1", "r3", "cc"
+ );
+ }
+ else
+ {
+ asm volatile (
+ "1: \n"
+ " mov r3, %[AA], asr #18 \n"
+ " orrs r3, r3, %[CC], asr #18 \n"
+ " bne 2f \n"
+ " \n"
+ " mov r3, %[CC], asr #11 \n"
+ " mov r1, %[AA], asr #11 \n"
+ " add r3, r1, r3, lsl #7 \n"
+ " mov r3, r3, lsl #1 \n"
+ " ldrb r3, [%[VRAM], r3] \n"
+ " \n"
+ " and r1, %[CC], #(7 << 8) \n"
+ " add r3, %[VRAM], r3, lsl #7 \n"
+ " and r0, %[AA], #(7 << 8) \n"
+ " add r3, r3, r1, asr #4 \n"
+ " add r3, r3, r0, asr #7 \n"
+ " \n"
+ " ldrb r0, [r3, #1] \n"
+ " add %[AA], %[AA], %[daa] \n"
+ " movs r0, r0, lsl #2 \n"
+ " ldrne r1, [%[colors], r0] \n"
+ " add %[xx3], %[xx3], #-1 \n"
+ " strneh r1, [%[p]] \n"
+ " \n"
+ " add %[CC], %[CC], %[dcc] \n"
+ " add %[p], %[p], #2 \n"
+ " subs %[x], %[x], #1 \n"
+ " bne 1b \n"
+ " b 3f \n"
+ "2: \n"
+ " and r0, %[xx3], #7 \n"
+ " add r3, %[yy3], r0, lsl #1 \n"
+ " \n"
+ " add r3, %[VRAM], r3 \n"
+ " ldrb r0, [r3, #1] \n"
+ " add %[AA], %[AA], %[daa] \n"
+ " movs r0, r0, lsl #2 \n"
+ " ldrne r1, [%[colors], r0] \n"
+ " add %[xx3], %[xx3], #-1 \n"
+ " strneh r1, [%[p]] \n"
+ " \n"
+ " add %[CC], %[CC], %[dcc] \n"
+ " add %[p], %[p], #2 \n"
+ " subs %[x], %[x], #1 \n"
+ " bne 1b \n"
+ "3: \n"
+ : [xx3] "+r" (xx3),
+ [x] "+r" (width),
+ [p] "+r" (p),
+ [AA] "+r" (AA),
+ [CC] "+r" (CC)
+ : [yy3] "r" (yy3),
+ [daa] "r" (aa),
+ [dcc] "r" (cc),
+ [VRAM] "r" (Memory.VRAM),
+ [colors] "r" (GFX.ScreenColors)
+ //[dir] "r" (dir)
: "r0", "r1", "r3", "cc"
);
+ }
}
}
@@ -437,3 +503,4 @@ uint8 *z;
}
+
diff --git a/src/mode7prio.cpp b/src/mode7prio.cpp
index e4878fd..c149eb5 100644
--- a/src/mode7prio.cpp
+++ b/src/mode7prio.cpp
@@ -126,6 +126,9 @@ void DrawBGMode7Background16PrioR3 (uint8 *Screen, int bg)
cc = l->MatrixC;
dir = 1;
}
+
+ if (dir == 1)
+ {
asm volatile (
"1: \n"
" mov r3, %[AA], lsr #18 \n"
@@ -160,7 +163,7 @@ void DrawBGMode7Background16PrioR3 (uint8 *Screen, int bg)
" movs r0, r0, lsl #2 \n"
" add %[AA], %[AA], r1 \n"
" ldrne r1, [%[colors], r0] \n"
- " add %[xx3], %[xx3], %[dir] \n"
+ " add %[xx3], %[xx3], #1 \n"
" strneb %[depth], [%[d]] \n"
" ldr r0, %[dcc] \n"
" strneh r1, [%[p]] \n"
@@ -194,7 +197,7 @@ void DrawBGMode7Background16PrioR3 (uint8 *Screen, int bg)
"4: \n"
" ldr r0, %[daa] \n"
" ldr r1, %[dcc] \n"
- " add %[xx3], %[xx3], %[dir] \n"
+ " add %[xx3], %[xx3], #1 \n"
" add %[AA], %[AA], r0 \n"
" add %[CC], %[CC], r1 \n"
" add %[p], %[p], #2 \n"
@@ -213,11 +216,107 @@ void DrawBGMode7Background16PrioR3 (uint8 *Screen, int bg)
[p] "r" (p),
[d] "r" (d),
[depth] "r" (depth),
- [dir] "r" (dir),
+ //[dir] "r" (dir),
[yy3] "r" (yy + CentreY),
[xx3] "r" (startx + HOffset)
: "r0", "r1", "r3", "cc"
);
+ }
+ else
+ {
+ asm volatile (
+ "1: \n"
+ " mov r3, %[AA], lsr #18 \n"
+ " orrs r3, r3, %[CC], lsr #18 \n"
+ " bne 2f \n"
+ " \n"
+ " mov r3, %[CC], lsr #11 \n"
+ " mov r1, %[AA], lsr #11 \n"
+ " add r3, r1, r3, lsl #7 \n"
+ " mov r3, r3, lsl #1 \n"
+ " ldrb r3, [%[VRAM], r3] \n"
+ " \n"
+ " mov r1, %[CC], lsr #8 \n"
+ " mov r0, %[AA], lsr #8 \n"
+ " \n"
+ " add r3, %[VRAM], r3, lsl #7 \n"
+ " \n"
+ " and r1, r1, #7 \n"
+ " and r0, r0, #7 \n"
+ " add r3, r3, r1, lsl #4 \n"
+ " add r3, r3, r0, lsl #1 \n"
+ " \n"
+ " ldrb r0, [r3, #1] \n"
+ " ldrb r3, [%[d]] \n"
+ " tst r0, #0x80 \n"
+ " andeq r1, %[depth], #0xff \n"
+ " mov r1, %[depth], lsr #8 \n"
+ " cmp r1, r3 \n"
+ " bls 4f \n"
+
+ " ldr r1, %[daa] \n"
+ " movs r0, r0, lsl #2 \n"
+ " add %[AA], %[AA], r1 \n"
+ " ldrne r1, [%[colors], r0] \n"
+ " add %[xx3], %[xx3], #-1 \n"
+ " strneb %[depth], [%[d]] \n"
+ " ldr r0, %[dcc] \n"
+ " strneh r1, [%[p]] \n"
+ " \n"
+ " add %[CC], %[CC], r0 \n"
+ " add %[d], %[d], #1 \n"
+ " add %[p], %[p], #2 \n"
+ " subs %[x], %[x], #1 \n"
+ " bne 1b \n"
+ " b 3f \n"
+ "2: \n"
+ " and r1, %[yy3], #7 \n"
+ " and r0, %[xx3], #7 \n"
+ " mov r3, r1, lsl #4 \n"
+ " add r3, r3, r0, lsl #1 \n"
+ " \n"
+ " add r3, %[VRAM], r3 \n"
+
+ " ldrb r0, [r3, #1] \n"
+ " ldrb r3, [%[d]] \n"
+ " tst r0, #0x80 \n"
+ " andeq r1, %[depth], #0xff \n"
+ " mov r1, %[depth], lsr #8 \n"
+ " cmp r1, r3 \n"
+ " bls 4f \n"
+
+ " movs r0, r0, lsl #2 \n"
+ " ldrne r1, [%[colors], r0] \n"
+ " strneb %[depth], [%[d]] \n"
+ " strneh r1, [%[p]] \n"
+ "4: \n"
+ " ldr r0, %[daa] \n"
+ " ldr r1, %[dcc] \n"
+ " add %[xx3], %[xx3], #-1 \n"
+ " add %[AA], %[AA], r0 \n"
+ " add %[CC], %[CC], r1 \n"
+ " add %[p], %[p], #2 \n"
+ " add %[d], %[d], #1 \n"
+ " subs %[x], %[x], #1 \n"
+ " bne 1b \n"
+ "3: \n"
+ :
+ : [x] "r" (Right - Left),
+ [AA] "r" (l->MatrixA * (startx + xx) + BB),
+ [CC] "r" (l->MatrixC * (startx + xx) + DD),
+ [daa] "m" (aa),
+ [dcc] "m" (cc),
+ [VRAM] "r" (Memory.VRAM),
+ [colors] "r" (GFX.ScreenColors),
+ [p] "r" (p),
+ [d] "r" (d),
+ [depth] "r" (depth),
+ //[dir] "r" (dir),
+ [yy3] "r" (yy + CentreY),
+ [xx3] "r" (startx + HOffset)
+ : "r0", "r1", "r3", "cc"
+ );
+ }
}
}
@@ -501,3 +600,4 @@ void DrawBGMode7Background16PrioR0 (uint8 *Screen, int bg)
}
+
diff --git a/src/mode7prio_t.h b/src/mode7prio_t.h
index 24d0062..8f1e7e4 100644
--- a/src/mode7prio_t.h
+++ b/src/mode7prio_t.h
@@ -128,7 +128,8 @@ static void DrawBGMode7Background16R3 (uint8 *Screen, int bg)
" cmp r3, #1 \n"
" blo 11f \n"
- " addne r0, %[delta], %[delta] \n"
+ " mov r3, #0x200000 \n"
+ " addne r0, r3, r3 \n"
" ldreq r3, %[fixedcolour] \n"
ROP
@@ -170,7 +171,8 @@ static void DrawBGMode7Background16R3 (uint8 *Screen, int bg)
" cmp r3, #1 \n"
" blo 12f \n"
- " ldrneh r3, [%[p], %[delta]] \n"
+ " mov r3, #0x200000 \n"
+ " ldrneh r3, [%[p], r3] \n"
" ldreq r3, %[fixedcolour] \n"
ROP
@@ -201,7 +203,7 @@ static void DrawBGMode7Background16R3 (uint8 *Screen, int bg)
[dir] "m" (dir),
[yy3] "m" (yy3),
//[zdelta] "r" (GFX.DepthDelta),
- [delta] "r" (GFX.Delta << 1),
+ //[delta] "r" (GFX.Delta << 1),
[fixedcolour] "m" (fixedColour),
[xx3] "r" (xx3)
: "r0", "r1", "r3", "cc"
@@ -324,7 +326,8 @@ static void DrawBGMode7Background16R1R2 (uint8 *Screen, int bg)
" cmp r3, #1 \n"
" blo 11f \n"
- " ldrneh r3, [%[p], %[delta]] \n"
+ " mov r3, #0x200000 \n"
+ " ldrneh r3, [%[p], r3] \n"
" ldreq r3, %[fixedcolour] \n"
ROP
@@ -349,7 +352,7 @@ static void DrawBGMode7Background16R1R2 (uint8 *Screen, int bg)
[d] "r" (d-1),
[depth] "r" (depth),
//[zdelta] "r" (GFX.DepthDelta),
- [delta] "r" (GFX.Delta << 1),
+ //[delta] "r" (GFX.Delta << 1),
[fixedcolour] "m" (fixedColour),
[AndByX] "m" (AndByX),
[AndByY] "m" (AndByY)
@@ -469,7 +472,8 @@ static void DrawBGMode7Background16R0 (uint8 *Screen, int bg)
" cmp r3, #1 \n"
" blo 11f \n"
- " ldrneh r3, [%[p], %[delta]] \n"
+ " mov r3, #0x200000 \n"
+ " ldrneh r3, [%[p], r3] \n"
" ldreq r3, %[fixedcolour] \n"
ROP
@@ -495,7 +499,7 @@ static void DrawBGMode7Background16R0 (uint8 *Screen, int bg)
[p] "r" (p),
[d] "r" (d-1),
//[zdelta] "r" (GFX.DepthDelta),
- [delta] "r" (GFX.Delta << 1),
+ //[delta] "r" (GFX.Delta << 1),
[fixedcolour] "m" (fixedColour),
[depth] "r" (depth),
[AndByY] "m" (AndByY)
@@ -533,3 +537,4 @@ DEC_FMODE7(ROPNAME)
}
}
+
diff --git a/src/port.h b/src/port.h
index 96a3ac1..de64f9e 100644
--- a/src/port.h
+++ b/src/port.h
@@ -57,7 +57,7 @@ I can't take it anymore, it's too convoluted. So I've commented out the entire
** _SNESPPC DEFINES
*/
-#ifdef __GIZ__
+#if 1
//Title
#define TITLE "Snes9x"
@@ -72,6 +72,7 @@ I can't take it anymore, it's too convoluted. So I've commented out the entire
typedef unsigned char bool8;
typedef unsigned char uint8;
typedef unsigned short uint16;
+typedef unsigned int bool32;
typedef unsigned int uint32;
typedef signed char int8;
typedef short int16;
@@ -105,8 +106,8 @@ typedef short int16_32;
#define _MAX_DRIVE 1
#define _MAX_FNAME PATH_MAX
#define _MAX_EXT PATH_MAX
-#define PATH_MAX 1024
-#define _MAX_PATH (1024)
+//#define PATH_MAX 1024
+#define _MAX_PATH PATH_MAX
//True/False Defines
#define TRUE 1
@@ -122,7 +123,7 @@ typedef short int16_32;
#define LSB_FIRST
#define STATIC static
#define FASTCALL
-#define PIXEL_FORMAT RGB565
+#define PIXEL_FORMAT RGB555
#define CHECK_SOUND()
#define VOID void
#define CPU_SHUTDOWN
@@ -132,6 +133,7 @@ typedef short int16_32;
#define ALIGN_BY_ONE __attribute__ ((aligned (1), packed))
#define LSB_FIRST
#undef FAST_LSB_WORD_ACCESS
+#define SUPER_FX
#ifdef ASMCPU
#define ASM_SPC700
#endif
diff --git a/src/rops.h b/src/rops.h
index e751a58..dc5409f 100644
--- a/src/rops.h
+++ b/src/rops.h
@@ -6,7 +6,7 @@
*/
// -------------
-// RGB_565
+// RGB_555
// a.red = a.red - b.red
// a.blue = a.blue - b.blue
// a.green = a.green - b.green
@@ -24,21 +24,21 @@
" biceq " #a ", " #a ", #0b01111100000000000 \n"
*/
#define ROP_SUB(a, b) \
- " bics " #b ", " #b ", #0b00000100000100000 \n"\
+ " bics " #b ", " #b ", #0b00000010000100000 \n"\
" beq 999f \n"\
- " orr " #a ", " #a ", #0b00000100000100000 \n"\
+ " orr " #a ", " #a ", #0b00000010000100000 \n"\
" orr " #a ", " #a ", #(1 << 31) \n"\
" subs " #a ", " #a ", " #b " \n"\
- " bicpl " #a ", " #a ", #0b01111100000000000 \n"\
+ " bicpl " #a ", " #a ", #0b00111110000000000 \n"\
" tst " #a ", #0b00000000000100000 \n"\
" biceq " #a ", " #a ", #0b00000000000011111 \n"\
- " tst " #a ", #0b00000100000000000 \n"\
- " biceq " #a ", " #a ", #0b00000011111100000 \n"\
+ " tst " #a ", #0b00000010000000000 \n"\
+ " biceq " #a ", " #a ", #0b00000001111100000 \n"\
"999:\n"
// -------------
-// RGB_565
+// RGB_555
// if ZF set do ROP_SUB, else:
// a.red = (a.red - b.red) / 2
// a.blue = (a.blue - b.blue) / 2
@@ -64,60 +64,60 @@
#define ROP_SUB1_2(a, b) \
" movne " #a ", " #a ", lsr #1 \n"\
- " bicne " #a ", " #a ", #0b00000010000010000 \n"\
+ " bicne " #a ", " #a ", #0b00000001000010000 \n"\
" movne " #b ", " #b ", lsr #1 \n"\
- " bicne " #b ", " #b ", #0b00000010000010000 \n"\
+ " bicne " #b ", " #b ", #0b00000001000010000 \n"\
\
- " bics " #b ", " #b ", #0b00000100000100000 \n"\
+ " bics " #b ", " #b ", #0b00000010000100000 \n"\
" beq 999f \n"\
- " orr " #a ", " #a ", #0b00000100000100000 \n"\
+ " orr " #a ", " #a ", #0b00000010000100000 \n"\
" orr " #a ", " #a ", #(1 << 31) \n"\
" subs " #a ", " #a ", " #b " \n"\
- " bicpl " #a ", " #a ", #0b01111100000000000 \n"\
+ " bicpl " #a ", " #a ", #0b00111110000000000 \n"\
" tst " #a ", #0b00000000000100000 \n"\
" biceq " #a ", " #a ", #0b00000000000011111 \n"\
- " tst " #a ", #0b00000100000000000 \n"\
- " biceq " #a ", " #a ", #0b00000011111100000 \n"\
+ " tst " #a ", #0b00000010000000000 \n"\
+ " biceq " #a ", " #a ", #0b00000001111100000 \n"\
"999:\n"
// -------------
-// RGB_565
+// RGB_555
// a.red = a.red + b.red
// a.blue = a.blue + b.blue
// a.green = a.green + b.green
#define ROP_ADD(a, b) \
- " bics " #b ", " #b ", #0b00000100000100000 \n"\
+ " bics " #b ", " #b ", #0b00000010000100000 \n"\
" beq 999f \n"\
- " bic " #a ", " #a ", #0b00000100000100000 \n"\
+ " bic " #a ", " #a ", #0b00000010000100000 \n"\
" add " #a ", " #a ", " #b " \n"\
" tst " #a ", #0b00000000000100000 \n"\
" orrne " #a ", " #a ", #0b00000000000011111 \n"\
- " tst " #a ", #0b00000100000000000 \n"\
- " orrne " #a ", " #a ", #0b00000011111100000 \n"\
- " tst " #a ", #0b10000000000000000 \n"\
- " orrne " #a ", " #a ", #0b01111100000000000 \n"\
+ " tst " #a ", #0b00000010000000000 \n"\
+ " orrne " #a ", " #a ", #0b00000001111100000 \n"\
+ " tst " #a ", #0b01000000000000000 \n"\
+ " orrne " #a ", " #a ", #0b00111110000000000 \n"\
"999:\n"
// -------------
-// RGB_565
+// RGB_555
// if ZF set do ROP_ADD, else:
// a.red = (a.red + b.red) / 2
// a.blue = (a.blue + b.blue) / 2
// a.green = (a.green + b.green) / 2
#define ROP_ADD1_2(a, b) \
- " bic " #a ", " #a ", #0b00000100000100000 \n"\
- " bicne " #a ", " #a ", #0b00001000001000000 \n"\
- " bic " #b ", " #b ", #0b00000100000100000 \n"\
- " bicne " #b ", " #b ", #0b00001000001000000 \n"\
+ " bic " #a ", " #a ", #0b00000010000100000 \n"\
+ " bicne " #a ", " #a ", #0b00000100001000000 \n"\
+ " bic " #b ", " #b ", #0b00000010000100000 \n"\
+ " bicne " #b ", " #b ", #0b00000100001000000 \n"\
" add " #a ", " #a ", " #b " \n"\
" movne " #a ", " #a ", lsr #1 \n"\
" tst " #a ", #0b00000000000100000 \n"\
" orrne " #a ", " #a ", #0b00000000000011111 \n"\
- " tst " #a ", #0b00000100000000000 \n"\
- " orrne " #a ", " #a ", #0b00000011111100000 \n"\
- " tst " #a ", #0b10000000000000000 \n"\
- " orrne " #a ", " #a ", #0b01111100000000000 \n"
+ " tst " #a ", #0b00000010000000000 \n"\
+ " orrne " #a ", " #a ", #0b00000001111100000 \n"\
+ " tst " #a ", #0b01000000000000000 \n"\
+ " orrne " #a ", " #a ", #0b00111110000000000 \n"
typedef struct {
@@ -166,3 +166,4 @@ void doRaster(ROPSTRUCT *rop);
bool wouldRasterAlterStatus(ROPSTRUCT *rop);
#endif
+
diff --git a/src/snes9x.h b/src/snes9x.h
index be7bfd0..0201ad9 100644
--- a/src/snes9x.h
+++ b/src/snes9x.h
@@ -61,7 +61,15 @@
#define ROM_NAME_LEN 23
-#ifdef ZLIB
+#ifdef __LIBRETRO__
+#include "../libretro/memstream.h"
+#define STREAM memstream_t *
+#define READ_STREAM(p, l, s) memstream_read(s, p, l)
+#define WRITE_STREAM(p, l, s) memstream_write(s, p, l)
+#define OPEN_STREAM(f, m) memstream_open()
+#define CLOSE_STREAM(s) memstream_close(s)
+#define SEEK_STREAM(p,r,s) memstream_seek(p,r,s)
+#elif defined(ZLIB)
//#ifndef __WIN32__
#include "zlib.h"
//#endif
diff --git a/src/spc700.cpp b/src/spc700.cpp
index 00dd4f8..637d2db 100644
--- a/src/spc700.cpp
+++ b/src/spc700.cpp
@@ -239,6 +239,7 @@ APUSetZN8 ((uint8) Int16);
IAPU.Address = *(IAPU.DirectPage + OP1) + \
(*(IAPU.DirectPage + OP1 + 1) << 8) + \
IAPU.YA.B.Y;
+#endif
void Apu00 ()
{
@@ -2505,5 +2506,4 @@ void (*S9xApuOpcodes[256]) (void) =
ApuF8, ApuF9, ApuFA, ApuFB, ApuFC, ApuFD, ApuFE, ApuFF
};
-#endif
diff --git a/src/srtc.h b/src/srtc.h
index a4e8abf..32437f5 100644
--- a/src/srtc.h
+++ b/src/srtc.h
@@ -42,7 +42,7 @@
#define _srtc_h_
#if !defined(_SNESPPC) && !defined(__GIZ__) && !defined(__GP2X__) && !defined(__WIZ__)
-#include <time.h>
+//#include <time.h>
#endif
#define MAX_RTC_INDEX 0xC
diff --git a/src/tile16_t.h b/src/tile16_t.h
index db1916e..f4a0a57 100644
--- a/src/tile16_t.h
+++ b/src/tile16_t.h
@@ -210,7 +210,8 @@ DEC_DRAWNOZ(ROPNAME)
\
" cmp r8, #1 \n"\
" blo 4f \n"\
- " ldrneh r8, [%[screen], %[delta]] \n"\
+ " mov r8, #0x200000 \n"\
+ " ldrneh r8, [%[screen], r8] \n"\
" moveq r8, %[fixedcolour] \n"\
\
ROP \
@@ -243,7 +244,8 @@ DEC_DRAWNOZ(ROPNAME)
\
" cmp r8, #1 \n"\
" blo 4f \n"\
- " ldrneh r8, [%[screen], %[delta]] \n"\
+ " mov r8, #0x200000 \n"\
+ " ldrneh r8, [%[screen], r8] \n"\
" moveq r8, %[fixedcolour] \n"\
\
ROP \
@@ -282,7 +284,7 @@ DEC_DRAW(ROPNAME)
: [gfx_z1] "r" (GFX.Z1),
[gfx_z2] "r" (GFX.Z2),
[colors] "r" (GFX.ScreenColors),
- [delta] "r" (GFX.Delta << 1),
+ //[delta] "r" (GFX.Delta << 1),
[fixedcolour] "r" (GFX.FixedColour),
[screen] "r" ((uint16 *) GFX.S + Offset),
[depth] "r" (GFX.ZBuffer + Offset),
@@ -306,7 +308,7 @@ DEC_DRAW(ROPNAME)
: [gfx_z1] "r" (GFX.Z1),
[gfx_z2] "r" (GFX.Z2),
[colors] "r" (GFX.ScreenColors),
- [delta] "r" (GFX.Delta << 1),
+ //[delta] "r" (GFX.Delta << 1),
[fixedcolour] "r" (GFX.FixedColour),
[screen] "r" ((uint16 *) GFX.S + Offset),
[depth] "r" (GFX.ZBuffer + Offset),
@@ -332,7 +334,7 @@ DEC_DRAW(ROPNAME)
: [gfx_z1] "r" (GFX.Z1),
[gfx_z2] "r" (GFX.Z2),
[colors] "r" (GFX.ScreenColors),
- [delta] "r" (GFX.Delta << 1),
+ //[delta] "r" (GFX.Delta << 1),
[fixedcolour] "r" (GFX.FixedColour),
[screen] "r" ((uint16 *) GFX.S + Offset),
[depth] "r" (GFX.ZBuffer + Offset),
@@ -358,7 +360,7 @@ DEC_DRAW(ROPNAME)
: [gfx_z1] "r" (GFX.Z1),
[gfx_z2] "r" (GFX.Z2),
[colors] "r" (GFX.ScreenColors),
- [delta] "r" (GFX.Delta << 1),
+ //[delta] "r" (GFX.Delta << 1),
[fixedcolour] "r" (GFX.FixedColour),
[screen] "r" ((uint16 *) GFX.S + Offset),
[depth] "r" (GFX.ZBuffer + Offset),
@@ -405,7 +407,7 @@ if (Tile & V_FLIP){
: [gfx_z1] "r" (GFX.Z1),
[gfx_z2] "r" (GFX.Z2),
[colors] "r" (GFX.ScreenColors),
- [delta] "r" (GFX.Delta << 1),
+ //[delta] "r" (GFX.Delta << 1),
[fixedcolour] "r" (GFX.FixedColour),
[width] "r" (Width),
[screen] "r" ((uint16 *) GFX.S + Offset),
@@ -437,7 +439,7 @@ if (Tile & V_FLIP){
: [gfx_z1] "r" (GFX.Z1),
[gfx_z2] "r" (GFX.Z2),
[colors] "r" (GFX.ScreenColors),
- [delta] "r" (GFX.Delta << 1),
+ //[delta] "r" (GFX.Delta << 1),
[fixedcolour] "r" (GFX.FixedColour),
[width] "r" (Width),
[screen] "r" ((uint16 *) GFX.S + Offset),
@@ -471,7 +473,7 @@ if (Tile & V_FLIP){
: [gfx_z1] "r" (GFX.Z1),
[gfx_z2] "r" (GFX.Z2),
[colors] "r" (GFX.ScreenColors),
- [delta] "r" (GFX.Delta << 1),
+ //[delta] "r" (GFX.Delta << 1),
[fixedcolour] "r" (GFX.FixedColour),
[width] "r" (Width),
[screen] "r" ((uint16 *) GFX.S + Offset),
@@ -503,7 +505,7 @@ if (Tile & V_FLIP){
: [gfx_z1] "r" (GFX.Z1),
[gfx_z2] "r" (GFX.Z2),
[colors] "r" (GFX.ScreenColors),
- [delta] "r" (GFX.Delta << 1),
+ //[delta] "r" (GFX.Delta << 1),
[fixedcolour] "r" (GFX.FixedColour),
[width] "r" (Width),
[screen] "r" ((uint16 *) GFX.S + Offset),
@@ -517,3 +519,4 @@ if (Tile & V_FLIP){
}
}
}
+
diff --git a/src/tile16f_t.h b/src/tile16f_t.h
index 70b5cff..493f76f 100644
--- a/src/tile16f_t.h
+++ b/src/tile16f_t.h
@@ -103,7 +103,7 @@ DEC_DRAW(ROPNAME)
: [gfx_z1] "r" (GFX.Z1),
[gfx_z2] "r" (GFX.Z2),
[colors] "r" (GFX.ScreenColors),
- [delta] "r" (GFX.Delta << 1),
+ //[delta] "r" (GFX.Delta << 1),
[fixedcolour] "r" (FIXEDCOLOUR),
[screen] "r" ((uint16 *) GFX.S + Offset),
[depth] "r" (GFX.ZBuffer + Offset),
@@ -127,7 +127,7 @@ DEC_DRAW(ROPNAME)
: [gfx_z1] "r" (GFX.Z1),
[gfx_z2] "r" (GFX.Z2),
[colors] "r" (GFX.ScreenColors),
- [delta] "r" (GFX.Delta << 1),
+ //[delta] "r" (GFX.Delta << 1),
[fixedcolour] "r" (FIXEDCOLOUR),
[screen] "r" ((uint16 *) GFX.S + Offset),
[depth] "r" (GFX.ZBuffer + Offset),
@@ -153,7 +153,7 @@ DEC_DRAW(ROPNAME)
: [gfx_z1] "r" (GFX.Z1),
[gfx_z2] "r" (GFX.Z2),
[colors] "r" (GFX.ScreenColors),
- [delta] "r" (GFX.Delta << 1),
+ //[delta] "r" (GFX.Delta << 1),
[fixedcolour] "r" (FIXEDCOLOUR),
[screen] "r" ((uint16 *) GFX.S + Offset),
[depth] "r" (GFX.ZBuffer + Offset),
@@ -179,7 +179,7 @@ DEC_DRAW(ROPNAME)
: [gfx_z1] "r" (GFX.Z1),
[gfx_z2] "r" (GFX.Z2),
[colors] "r" (GFX.ScreenColors),
- [delta] "r" (GFX.Delta << 1),
+ //[delta] "r" (GFX.Delta << 1),
[fixedcolour] "r" (FIXEDCOLOUR),
[screen] "r" ((uint16 *) GFX.S + Offset),
[depth] "r" (GFX.ZBuffer + Offset),
@@ -226,7 +226,7 @@ if (Tile & V_FLIP){
: [gfx_z1] "r" (GFX.Z1),
[gfx_z2] "r" (GFX.Z2),
[colors] "r" (GFX.ScreenColors),
- [delta] "r" (GFX.Delta << 1),
+ //[delta] "r" (GFX.Delta << 1),
[fixedcolour] "r" (FIXEDCOLOUR),
[width] "r" (Width),
[screen] "r" ((uint16 *) GFX.S + Offset),
@@ -258,7 +258,7 @@ if (Tile & V_FLIP){
: [gfx_z1] "r" (GFX.Z1),
[gfx_z2] "r" (GFX.Z2),
[colors] "r" (GFX.ScreenColors),
- [delta] "r" (GFX.Delta << 1),
+ //[delta] "r" (GFX.Delta << 1),
[fixedcolour] "r" (FIXEDCOLOUR),
[width] "r" (Width),
[screen] "r" ((uint16 *) GFX.S + Offset),
@@ -292,7 +292,7 @@ if (Tile & V_FLIP){
: [gfx_z1] "r" (GFX.Z1),
[gfx_z2] "r" (GFX.Z2),
[colors] "r" (GFX.ScreenColors),
- [delta] "r" (GFX.Delta << 1),
+ //[delta] "r" (GFX.Delta << 1),
[fixedcolour] "r" (FIXEDCOLOUR),
[width] "r" (Width),
[screen] "r" ((uint16 *) GFX.S + Offset),
@@ -324,7 +324,7 @@ if (Tile & V_FLIP){
: [gfx_z1] "r" (GFX.Z1),
[gfx_z2] "r" (GFX.Z2),
[colors] "r" (GFX.ScreenColors),
- [delta] "r" (GFX.Delta << 1),
+ //[delta] "r" (GFX.Delta << 1),
[fixedcolour] "r" (FIXEDCOLOUR),
[width] "r" (Width),
[screen] "r" ((uint16 *) GFX.S + Offset),
@@ -338,3 +338,4 @@ if (Tile & V_FLIP){
}
}
}
+