diff options
author | Toad King | 2012-06-14 03:23:47 -0400 |
---|---|---|
committer | Toad King | 2012-06-14 03:23:47 -0400 |
commit | e8bad8c3ca33d6dfa672f2e570eddc3ab4b3a7e6 (patch) | |
tree | 3b5ee797171edafe59bc22ec1523554d81bc448e | |
parent | 6fb0c7a7a53e1eba7a0f5dc5b1ade312a0d76119 (diff) | |
download | snes9x2002-e8bad8c3ca33d6dfa672f2e570eddc3ab4b3a7e6.tar.gz snes9x2002-e8bad8c3ca33d6dfa672f2e570eddc3ab4b3a7e6.tar.bz2 snes9x2002-e8bad8c3ca33d6dfa672f2e570eddc3ab4b3a7e6.zip |
initial libretro changes
-rw-r--r-- | .gitignore | 3 | ||||
-rw-r--r-- | Makefile | 110 | ||||
-rw-r--r-- | libretro/libretro.cpp | 616 | ||||
-rw-r--r-- | libretro/libretro.h | 277 | ||||
-rw-r--r-- | libretro/link.T | 5 | ||||
-rw-r--r-- | libretro/memstream.c | 115 | ||||
-rw-r--r-- | libretro/memstream.h | 30 | ||||
-rw-r--r-- | src/dma.cpp | 2 | ||||
-rw-r--r-- | src/memmap.h | 7 | ||||
-rw-r--r-- | src/mode7.cpp | 89 | ||||
-rw-r--r-- | src/mode7_t.h | 18 | ||||
-rw-r--r-- | src/mode7new.cpp | 75 | ||||
-rw-r--r-- | src/mode7prio.cpp | 106 | ||||
-rw-r--r-- | src/mode7prio_t.h | 19 | ||||
-rw-r--r-- | src/port.h | 10 | ||||
-rw-r--r-- | src/rops.h | 61 | ||||
-rw-r--r-- | src/snes9x.h | 10 | ||||
-rw-r--r-- | src/spc700.cpp | 2 | ||||
-rw-r--r-- | src/srtc.h | 2 | ||||
-rw-r--r-- | src/tile16_t.h | 23 | ||||
-rw-r--r-- | src/tile16f_t.h | 17 |
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) } } + @@ -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 @@ -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
@@ -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){ } } } + |