add basic libretro file wip

This commit is contained in:
R-type
2015-12-15 01:01:43 +01:00
parent 5a96c0ca66
commit 69e30b219a
30 changed files with 6818 additions and 0 deletions
+334
View File
@@ -0,0 +1,334 @@
TARGET_NAME := atari800
DEBUG = 0
LOG_PERFORMANCE = 1
HAVE_COMPAT = 0
SOURCES_C :=
SOURCES_CXX :=
LIBS :=
ifneq ($(EMSCRIPTEN),)
platform = emscripten
endif
ifeq ($(platform),)
platform = unix
ifeq ($(shell uname -a),)
platform = win
else ifneq ($(findstring MINGW,$(shell uname -a)),)
platform = win
else ifneq ($(findstring Darwin,$(shell uname -a)),)
platform = osx
else ifneq ($(findstring win,$(shell uname -a)),)
platform = win
endif
endif
# system platform
system_platform = unix
ifeq ($(shell uname -a),)
EXE_EXT = .exe
system_platform = win
else ifneq ($(findstring Darwin,$(shell uname -a)),)
system_platform = osx
else ifneq ($(findstring MINGW,$(shell uname -a)),)
system_platform = win
endif
CC_AS ?= $(CC)
LIBM := -lm
LIBZ := -lz
# Unix
ifneq (,$(findstring unix,$(platform)))
TARGET := $(TARGET_NAME)_libretro.so
fpic := -fPIC
SHARED := -shared -Wl,-version-script=link.T -Wl,-no-undefined
else ifneq (,$(findstring linux-portable,$(platform)))
TARGET := $(TARGET_NAME)_libretro.so
fpic := -fPIC -nostdlib
LIBM :=
LIBZ :=
SHARED := -shared -Wl,-version-script=link.T
# android arm
else ifneq (,$(findstring android,$(platform)))
TARGET := $(TARGET_NAME)_libretro.so
fpic = -fPIC
SHARED := -lstdc++ -llog -lz -shared -Wl,--version-script=link.T -Wl,--no-undefined
CC = arm-linux-androideabi-gcc
CXX = arm-linux-androideabi-g++
# Raspberry Pi
else ifneq (,$(findstring rpi,$(platform)))
TARGET := $(TARGET_NAME)_libretro.so
LDFLAGS += -shared -Wl,--version-script=link.T
fpic = -fPIC
SHARED := -shared -Wl,-version-script=link.T -Wl,-no-undefined
# OS X
else ifeq ($(platform), osx)
TARGET := $(TARGET_NAME)_libretro.dylib
fpic := -fPIC
SHARED := -dynamiclib
OSXVER = `sw_vers -productVersion | cut -d. -f 2`
OSX_LT_MAVERICKS = `(( $(OSXVER) <= 9)) && echo "YES"`
ifeq ($(OSX_LT_MAVERICKS),"YES")
fpic += -mmacosx-version-min=10.5
endif
# iOS
else ifneq (,$(findstring ios,$(platform)))
TARGET := $(TARGET_NAME)_libretro_ios.dylib
fpic := -fPIC
SHARED := -dynamiclib
ifeq ($(IOSSDK),)
IOSSDK := $(shell xcodebuild -version -sdk iphoneos Path)
endif
CC = cc -arch armv7 -isysroot $(IOSSDK)
CC_AS = perl ./tools/gas-preprocessor.pl $(CC)
CXX = c++ -arch armv7 -isysroot $(IOSSDK)
ifeq ($(platform),ios9)
CC += -miphoneos-version-min=8.0
CXX += -miphoneos-version-min=8.0
CC_AS += -miphoneos-version-min=8.0
PLATFORM_DEFINES := -miphoneos-version-min=8.0
else
CC += -miphoneos-version-min=5.0
CXX += -miphoneos-version-min=5.0
CC_AS += -miphoneos-version-min=5.0
PLATFORM_DEFINES := -miphoneos-version-min=5.0
endif
# Theos
else ifeq ($(platform), theos_ios)
DEPLOYMENT_IOSVERSION = 5.0
TARGET = iphone:latest:$(DEPLOYMENT_IOSVERSION)
ARCHS = armv7 armv7s
TARGET_IPHONEOS_DEPLOYMENT_VERSION=$(DEPLOYMENT_IOSVERSION)
THEOS_BUILD_DIR := objs
include $(THEOS)/makefiles/common.mk
LIBRARY_NAME = $(TARGET_NAME)_libretro_ios
# QNX
else ifeq ($(platform), qnx)
TARGET := $(TARGET_NAME)_libretro_qnx.so
fpic := -fPIC
SHARED := -lcpp -shared -Wl,-version-script=link.T
CC = qcc -Vgcc_ntoarmv7le
CC_AS = qcc -Vgcc_ntoarmv7le
CXX = QCC -Vgcc_ntoarmv7le_cpp
AR = QCC -Vgcc_ntoarmv7le
PLATFORM_DEFINES := -D__BLACKBERRY_QNX__ -fexceptions -marm -mcpu=cortex-a9 -mfpu=neon -mfloat-abi=softfp
# PS3
else ifeq ($(platform), ps3)
TARGET := $(TARGET_NAME)_libretro_ps3.a
CC = $(CELL_SDK)/host-win32/ppu/bin/ppu-lv2-gcc.exe
CC_AS = $(CELL_SDK)/host-win32/ppu/bin/ppu-lv2-gcc.exe
CXX = $(CELL_SDK)/host-win32/ppu/bin/ppu-lv2-g++.exe
AR = $(CELL_SDK)/host-win32/ppu/bin/ppu-lv2-ar.exe
PLATFORM_DEFINES := -D__CELLOS_LV2__
STATIC_LINKING = 1
HAVE_COMPAT = 1
# sncps3
else ifeq ($(platform), sncps3)
TARGET := $(TARGET_NAME)_libretro_ps3.a
CC = $(CELL_SDK)/host-win32/sn/bin/ps3ppusnc.exe
CC_AS = $(CELL_SDK)/host-win32/sn/bin/ps3ppusnc.exe
CXX = $(CELL_SDK)/host-win32/sn/bin/ps3ppusnc.exe
AR = $(CELL_SDK)/host-win32/sn/bin/ps3snarl.exe
PLATFORM_DEFINES := -D__CELLOS_LV2__
STATIC_LINKING = 1
HAVE_COMPAT = 1
# Lightweight PS3 Homebrew SDK
else ifeq ($(platform), psl1ght)
TARGET := $(TARGET_NAME)_libretro_psl1ght.a
CC = $(PS3DEV)/ppu/bin/ppu-gcc$(EXE_EXT)
CC_AS = $(PS3DEV)/ppu/bin/ppu-gcc$(EXE_EXT)
CXX = $(PS3DEV)/ppu/bin/ppu-g++$(EXE_EXT)
AR = $(PS3DEV)/ppu/bin/ppu-ar$(EXE_EXT)
PLATFORM_DEFINES := -D__CELLOS_LV2__
STATIC_LINKING = 1
HAVE_COMPAT = 1
# PSP
else ifeq ($(platform), psp1)
TARGET := $(TARGET_NAME)_libretro_psp1.a
CC = psp-gcc$(EXE_EXT)
CC_AS = psp-gcc$(EXE_EXT)
CXX = psp-g++$(EXE_EXT)
AR = psp-ar$(EXE_EXT)
PLATFORM_DEFINES := -DPSP
CFLAGS += -G0
CXXFLAGS += -G0
STATIC_LINKING = 1
HAVE_COMPAT = 1
EXTRA_INCLUDES := -I$(shell psp-config --pspsdk-path)/include
# Xbox 360
else ifeq ($(platform), xenon)
TARGET := $(TARGET_NAME)_libretro_xenon360.a
CC = xenon-gcc$(EXE_EXT)
CC_AS = xenon-gcc$(EXE_EXT)
CXX = xenon-g++$(EXE_EXT)
AR = xenon-ar$(EXE_EXT)
PLATFORM_DEFINES := -D__LIBXENON__
STATIC_LINKING = 1
# Nintendo Game Cube
else ifeq ($(platform), ngc)
TARGET := $(TARGET_NAME)_libretro_ngc.a
CC = $(DEVKITPPC)/bin/powerpc-eabi-gcc$(EXE_EXT)
CC_AS = $(DEVKITPPC)/bin/powerpc-eabi-gcc$(EXE_EXT)
CXX = $(DEVKITPPC)/bin/powerpc-eabi-g++$(EXE_EXT)
AR = $(DEVKITPPC)/bin/powerpc-eabi-ar$(EXE_EXT)
PLATFORM_DEFINES += -DGEKKO -DHW_DOL -mrvl -mcpu=750 -meabi -mhard-float
STATIC_LINKING = 1
HAVE_COMPAT = 1
# Nintendo Wii
else ifeq ($(platform), wii)
TARGET := $(TARGET_NAME)_libretro_wii.a
CC = $(DEVKITPPC)/bin/powerpc-eabi-gcc$(EXE_EXT)
CC_AS = $(DEVKITPPC)/bin/powerpc-eabi-gcc$(EXE_EXT)
CXX = $(DEVKITPPC)/bin/powerpc-eabi-g++$(EXE_EXT)
AR = $(DEVKITPPC)/bin/powerpc-eabi-ar$(EXE_EXT)
PLATFORM_DEFINES += -DGEKKO -DHW_RVL -mrvl -mcpu=750 -meabi -mhard-float
STATIC_LINKING = 1
HAVE_COMPAT = 1
# ARM
else ifneq (,$(findstring armv,$(platform)))
TARGET := $(TARGET_NAME)_libretro.so
fpic := -fPIC
SHARED := -shared -Wl,-version-script=link.T
CC = gcc
CC_AS = gcc
CXX = g++
ifneq (,$(findstring cortexa8,$(platform)))
PLATFORM_DEFINES += -marm -mcpu=cortex-a8
else ifneq (,$(findstring cortexa9,$(platform)))
PLATFORM_DEFINES += -marm -mcpu=cortex-a9
endif
PLATFORM_DEFINES += -marm
ifneq (,$(findstring neon,$(platform)))
PLATFORM_DEFINES += -mfpu=neon
HAVE_NEON = 1
endif
ifneq (,$(findstring softfloat,$(platform)))
PLATFORM_DEFINES += -mfloat-abi=softfp
else ifneq (,$(findstring hardfloat,$(platform)))
PLATFORM_DEFINES += -mfloat-abi=hard
endif
PLATFORM_DEFINES += -DARM
# emscripten
else ifeq ($(platform), emscripten)
TARGET := $(TARGET_NAME)_libretro_emscripten.bc
# Windows
else
TARGET := $(TARGET_NAME)_libretro.dll
CC = gcc
CC_AS = gcc
CXX = g++
SHARED := -shared -static-libgcc -static-libstdc++ -Wl,-no-undefined -Wl,-version-script=link.T
LIBS += -lshlwapi
HAVE_WIN32_MSX_MANAGER = 1
endif
CORE_DIR := .
CAP32_DIR := $(CORE_DIR)/cap32
ifeq ($(HAVE_COMPAT), 1)
PLATFORM_DEFINES += -DHAVE_COMPAT
endif
ifeq ($(DEBUG), 1)
CFLAGS += -O0 -g
CXXFLAGS += -O0 -g
else ifeq ($(platform), emscripten)
CFLAGS += -O2
CXXFLAGS += -O2 -fno-exceptions -fno-rtti -DHAVE_STDINT_H
else
CFLAGS += -O3
CXXFLAGS += -O3 -fno-exceptions -fno-rtti -DHAVE_STDINT_H
endif
ifeq ($(LOG_PERFORMANCE), 1)
CFLAGS += -DLOG_PERFORMANCE
CXXFLAGS += -DLOG_PERFORMANCE
endif
DEFINES := -D__LIBRETRO__ $(PLATFORM_DEFINES) -DINLINE="inline"
DEFINES += -DHAVE_CONFIG_H
CFLAGS += $(fpic) $(DEFINES)
CFLAGS += -Wall
CXXFLAGS += $(fpic) $(DEFINES)
CXXFLAGS += -Wall
LDFLAGS += $(LIBM) $(LIBZ)
ROMS =
SNAPS =
include Makefile.common
HEADERS += $(ROMS:.rom=.h) $(SNAPS:.szx=.h)
OBJS += $(SOURCES_C:.c=.o) $(SOURCES_CXX:.cpp=.o)
INCDIRS := $(EXTRA_INCLUDES) $(INCFLAGS)
%.o: %.cpp
$(CXX) -c -o $@ $< $(CXXFLAGS) $(INCDIRS)
%.o: %.c
$(CC) -c -o $@ $< $(CFLAGS) $(INCDIRS)
%.o: %.S
$(CC_AS) -c -o $@ $< $(CFLAGS) $(INCDIRS)
%.h: %.rom
xxd -i $< | sed "s/unsigned/const unsigned/g" > $@
%.h: %.szx
xxd -i $< | sed "s/unsigned/const unsigned/g" > $@
ifeq ($(platform), theos_ios)
COMMON_FLAGS := -DIOS $(COMMON_DEFINES) $(INCFLAGS) -I$(THEOS_INCLUDE_PATH) -Wno-error
$(LIBRARY_NAME)_CFLAGS += $(CFLAGS) $(COMMON_FLAGS)
$(LIBRARY_NAME)_CXXFLAGS += $(CXXFLAGS) $(COMMON_FLAGS)
${LIBRARY_NAME}_FILES = $(SOURCES_CXX) $(SOURCES_C)
${LIBRARY_NAME}_LIBRARIES = z
include $(THEOS_MAKE_PATH)/library.mk
else
all: $(TARGET)
$(TARGET): $(HEADERS) $(OBJS)
ifeq ($(STATIC_LINKING), 1)
$(AR) rcs $@ $(OBJS)
else
$(CC) -o $@ $(SHARED) $(OBJS) $(LDFLAGS) $(LIBS)
endif
clean-objs:
rm -f $(OBJS)
clean:
rm -f $(OBJS)
rm -f $(HEADERS)
rm -f $(TARGET)
.PHONY: $(TARGET) clean clean-objs
endif
+69
View File
@@ -0,0 +1,69 @@
INCFLAGS := -I$(CORE_DIR) \
-I$(CORE_DIR)/atari800/src \
-I$(CORE_DIR)/libretro
SOURCES_C := \
$(CORE_DIR)/libretro/libco/libco.c
SOURCES_C += \
$(CORE_DIR)/libretro/libretro-core.c \
$(CORE_DIR)/libretro/core-mapper.c \
$(CORE_DIR)/libretro/graph.c \
$(CORE_DIR)/libretro/vkbd.c
SOURCES_C += \
$(CORE_DIR)/atari800/src/afile.c \
$(CORE_DIR)/atari800/src/antic.c \
$(CORE_DIR)/atari800/src/atari.c \
$(CORE_DIR)/atari800/src/binload.c \
$(CORE_DIR)/atari800/src/cartridge.c \
$(CORE_DIR)/atari800/src/cassette.c \
$(CORE_DIR)/atari800/src/compfile.c \
$(CORE_DIR)/atari800/src/cfg.c \
$(CORE_DIR)/atari800/src/cpu.c \
$(CORE_DIR)/atari800/src/crc32.c \
$(CORE_DIR)/atari800/src/devices.c \
$(CORE_DIR)/atari800/src/emuos.c \
$(CORE_DIR)/atari800/src/esc.c \
$(CORE_DIR)/atari800/src/gtia.c \
$(CORE_DIR)/atari800/src/img_tape.c \
$(CORE_DIR)/atari800/src/log.c \
$(CORE_DIR)/atari800/src/memory.c \
$(CORE_DIR)/atari800/src/monitor.c \
$(CORE_DIR)/atari800/src/pbi.c \
$(CORE_DIR)/atari800/src/pia.c \
$(CORE_DIR)/atari800/src/pokey.c \
$(CORE_DIR)/atari800/src/pokeysnd.c \
$(CORE_DIR)/atari800/src/mzpokeysnd.c \
$(CORE_DIR)/atari800/src/remez.c \
$(CORE_DIR)/atari800/src/sndsave.c \
$(CORE_DIR)/atari800/src/rtime.c \
$(CORE_DIR)/atari800/src/sio.c \
$(CORE_DIR)/atari800/src/sysrom.c \
$(CORE_DIR)/atari800/src/util.c \
$(CORE_DIR)/atari800/src/sound.c \
$(CORE_DIR)/atari800/src/pbi_proto80.c \
$(CORE_DIR)/atari800/src/af80.c \
$(CORE_DIR)/atari800/src/input.c \
$(CORE_DIR)/atari800/src/statesav.c\
$(CORE_DIR)/atari800/src/ui_basic.c \
$(CORE_DIR)/atari800/src/ui.c \
$(CORE_DIR)/atari800/src/artifact.c \
$(CORE_DIR)/atari800/src/colours.c \
$(CORE_DIR)/atari800/src/colours_ntsc.c \
$(CORE_DIR)/atari800/src/colours_pal.c \
$(CORE_DIR)/atari800/src/colours_external.c \
$(CORE_DIR)/atari800/src/screen.c \
$(CORE_DIR)/atari800/src/cycle_map.c \
$(CORE_DIR)/atari800/src/pbi_mio.c \
$(CORE_DIR)/atari800/src/pbi_bb.c \
$(CORE_DIR)/atari800/src/pbi_scsi.c \
$(CORE_DIR)/atari800/src/ide.c \
$(CORE_DIR)/atari800/src/xep80.c \
$(CORE_DIR)/atari800/src/xep80_fonts.c \
$(CORE_DIR)/atari800/src/filter_ntsc.c \
$(CORE_DIR)/atari800/src/atari_ntsc/atari_ntsc.c \
$(CORE_DIR)/libretro/platform.c
# $(CORE_DIR)/atari800/src/videomode.c\
# $(CORE_DIR)/atari800/src/pal_blending.c \
+11
View File
@@ -1039,6 +1039,11 @@ static void autoframeskip(double curtime, double lasttime)
} }
} }
//LIBRETRO HACK
#ifdef __LIBRETRO__
#include "libretro-core.h"
#endif
void Atari800_Sync(void) void Atari800_Sync(void)
{ {
static double lasttime = 0; static double lasttime = 0;
@@ -1061,6 +1066,12 @@ void Atari800_Sync(void)
if ((lasttime + deltatime) < curtime) if ((lasttime + deltatime) < curtime)
lasttime = curtime; lasttime = curtime;
//LIBRETRO HACK
#ifdef __LIBRETRO__
co_switch(mainThread);
#endif
} }
#if defined(BASIC) || defined(VERY_SLOW) || defined(CURSES_BASIC) #if defined(BASIC) || defined(VERY_SLOW) || defined(CURSES_BASIC)
+29
View File
@@ -0,0 +1,29 @@
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := retro
ifeq ($(TARGET_ARCH),arm)
LOCAL_CFLAGS += -DANDROID_ARM
LOCAL_ARM_MODE := arm
endif
ifeq ($(TARGET_ARCH),x86)
LOCAL_CFLAGS += -DANDROID_X86
endif
ifeq ($(TARGET_ARCH),mips)
LOCAL_CFLAGS += -DANDROID_MIPS -D__mips__ -D__MIPSEL__
endif
CORE_DIR = ..
include $(CORE_DIR)/Makefile.common
LOCAL_SRC_FILES += $(SOURCES_C)
LOCAL_CFLAGS += -O2 -D__LIBRETRO__ -DFRONTEND_SUPPORTS_RGB565 -DNDEBUG=1 $(INCFLAGS)
LOCAL_LDLIBS += -lz
include $(BUILD_SHARED_LIBRARY)
+1
View File
@@ -0,0 +1 @@
APP_ABI := all
+121
View File
@@ -0,0 +1,121 @@
#include <ctype.h>
//Args for experimental_cmdline
static char ARGUV[64][1024];
static unsigned char ARGUC=0;
// Args for Core
static char XARGV[64][1024];
static const char* xargv_cmd[64];
int PARAMCOUNT=0;
extern int skel_main(int argc, char *argv[]);
void parse_cmdline( const char *argv );
void Add_Option(const char* option)
{
static int first=0;
if(first==0)
{
PARAMCOUNT=0;
first++;
}
sprintf(XARGV[PARAMCOUNT++],"%s\0",option);
}
int pre_main(const char *argv)
{
int i;
bool Only1Arg;
parse_cmdline(argv);
Only1Arg = (strcmp(ARGUV[0],"prg") == 0) ? 0 : 1;
for (i = 0; i<64; i++)
xargv_cmd[i] = NULL;
if(Only1Arg)
{
Add_Option("prg");
Add_Option(RPATH/*ARGUV[0]*/);
}
else
{ // Pass all cmdline args
for(i = 0; i < ARGUC; i++)
Add_Option(ARGUV[i]);
}
for (i = 0; i < PARAMCOUNT; i++)
{
xargv_cmd[i] = (char*)(XARGV[i]);
LOGI("%2d %s\n",i,XARGV[i]);
}
skel_main(PARAMCOUNT,( char **)xargv_cmd);
xargv_cmd[PARAMCOUNT - 2] = NULL;
}
void parse_cmdline(const char *argv)
{
char *p,*p2,*start_of_word;
int c,c2;
static char buffer[512*4];
enum states { DULL, IN_WORD, IN_STRING } state = DULL;
strcpy(buffer,argv);
strcat(buffer," \0");
for (p = buffer; *p != '\0'; p++)
{
c = (unsigned char) *p; /* convert to unsigned char for is* functions */
switch (state)
{
case DULL: /* not in a word, not in a double quoted string */
if (isspace(c)) /* still not in a word, so ignore this char */
continue;
/* not a space -- if it's a double quote we go to IN_STRING, else to IN_WORD */
if (c == '"')
{
state = IN_STRING;
start_of_word = p + 1; /* word starts at *next* char, not this one */
continue;
}
state = IN_WORD;
start_of_word = p; /* word starts here */
continue;
case IN_STRING:
/* we're in a double quoted string, so keep going until we hit a close " */
if (c == '"')
{
/* word goes from start_of_word to p-1 */
//... do something with the word ...
for (c2 = 0,p2 = start_of_word; p2 < p; p2++, c2++)
ARGUV[ARGUC][c2] = (unsigned char) *p2;
ARGUC++;
state = DULL; /* back to "not in word, not in string" state */
}
continue; /* either still IN_STRING or we handled the end above */
case IN_WORD:
/* we're in a word, so keep going until we get to a space */
if (isspace(c))
{
/* word goes from start_of_word to p-1 */
//... do something with the word ...
for (c2 = 0,p2 = start_of_word; p2 <p; p2++,c2++)
ARGUV[ARGUC][c2] = (unsigned char) *p2;
ARGUC++;
state = DULL; /* back to "not in word, not in string" state */
}
continue; /* either still IN_WORD or we handled the end above */
}
}
}
+572
View File
@@ -0,0 +1,572 @@
/* config.h. Generated from config.h.in by configure. */
/* config.h.in. Generated from configure.ac by autoheader. */
/* Define if building universal (internal helper macro) */
/* #undef AC_APPLE_UNIVERSAL_BUILD */
/* The Austin Franklin 80 column card. */
#define AF80 1
/* Target: Android */
#if !defined(ANDROID) && defined(__ANDROID__)
#define ANDROID 1
#endif
/* #undef ANDROID */
/* Target: standard I/O. */
/* #undef BASIC */
/* Define to use buffered debug output. */
/* #undef BUFFERED_LOG */
/* Define to allow sound clipping. */
/* #undef CLIP_SOUND */
/* Define to 1 if the `closedir' function returns void instead of `int'. */
/* #undef CLOSEDIR_VOID */
/* Define to allow console sound (keyboard clicks). */
/* #undef CONSOLE_SOUND */
/* Define to activate crash menu after CIM instruction. */
#define CRASH_MENU 1
/* Define to disable bitmap graphics emulation in CURSES target. */
/* #undef CURSES_BASIC */
/* Alternate config filename due to 8+3 fs limit. */
/* #undef DEFAULT_CFG_NAME */
/* Target: Windows with DirectX. */
/* #undef DIRECTX */
/* Define to use dirty screen partial repaints. */
/* #undef DIRTYRECT */
/* Define to use back slash as directory separator. */
/* #undef DIR_SEP_BACKSLASH */
/* Target: DOS VGA. */
/* #undef DOSVGA */
/* Define to enable DOS style drives support. */
/* #undef DOS_DRIVES */
/* Define to enable event recording. */
#define EVENT_RECORDING 1
/* Target: Atari Falcon system. */
/* #undef FALCON */
/* Define to use m68k assembler CPU core for Falcon target. */
/* #undef FALCON_CPUASM */
/* Use SDL for graphics and input. */
//#define GUI_SDL 1
/* Define to 1 if you have the <arpa/inet.h> header file. */
#define HAVE_ARPA_INET_H 1
/* Define to 1 if you have the `atexit' function. */
#define HAVE_ATEXIT 1
/* Define to 1 if you have the `chmod' function. */
#define HAVE_CHMOD 1
/* Define to 1 if you have the `clock' function. */
#define HAVE_CLOCK 1
/* Define to 1 if you have the <direct.h> header file. */
/* #undef HAVE_DIRECT_H */
/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
*/
#define HAVE_DIRENT_H 1
/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */
/* #undef HAVE_DOPRNT */
/* Define to 1 if you have the <errno.h> header file. */
#define HAVE_ERRNO_H 1
/* Define to 1 if you have the <fcntl.h> header file. */
#define HAVE_FCNTL_H 1
/* Define to 1 if you have the `fdopen' function. */
#define HAVE_FDOPEN 1
/* Define to 1 if you have the `fflush' function. */
#define HAVE_FFLUSH 1
/* Define to 1 if you have the <file.h> header file. */
/* #undef HAVE_FILE_H */
/* Define to 1 if you have the `floor' function. */
#define HAVE_FLOOR 1
/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */
#define HAVE_FSEEKO 1
/* Define to 1 if you have the `fstat' function. */
#define HAVE_FSTAT 1
/* Define to 1 if you have the `getcwd' function. */
#define HAVE_GETCWD 1
/* Define to 1 if you have the `gethostbyaddr' function. */
#define HAVE_GETHOSTBYADDR 1
/* Define to 1 if you have the `gethostbyname' function. */
#define HAVE_GETHOSTBYNAME 1
/* Define to 1 if you have the `gettimeofday' function. */
#define HAVE_GETTIMEOFDAY 1
/* Define to 1 if you have the `inet_ntoa' function. */
#define HAVE_INET_NTOA 1
/* Define to 1 if you have the <inttypes.h> header file. */
#define HAVE_INTTYPES_H 1
/* Define to 1 if you have the `gem' library (-lgem). */
/* #undef HAVE_LIBGEM */
/* Define to 1 if you have the `png' library (-lpng). */
//#define HAVE_LIBPNG 1
/* Define to 1 if you have the `z' library (-lz). */
#define HAVE_LIBZ 1
/* Define to 1 if you have the `localtime' function. */
#define HAVE_LOCALTIME 1
/* Define to 1 if you have the `memmove' function. */
#define HAVE_MEMMOVE 1
/* Define to 1 if you have the <memory.h> header file. */
#define HAVE_MEMORY_H 1
/* Define to 1 if you have the `memset' function. */
#define HAVE_MEMSET 1
/* Define to 1 if you have the `mkdir' function. */
#define HAVE_MKDIR 1
/* Define to 1 if you have the `mkstemp' function. */
#define HAVE_MKSTEMP 1
/* Define to 1 if you have the `mktemp' function. */
#define HAVE_MKTEMP 1
/* Define to 1 if you have the `modf' function. */
#define HAVE_MODF 1
/* Define to 1 if you have the `nanosleep' function. */
#define HAVE_NANOSLEEP 1
/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
/* #undef HAVE_NDIR_H */
/* Define to 1 if you have the <netdb.h> header file. */
#define HAVE_NETDB_H 1
/* Define to 1 if you have the <netinet/in.h> header file. */
#define HAVE_NETINET_IN_H 1
/* Define to 1 if you have the `opendir' function. */
#define HAVE_OPENDIR 1
/* Support for OpenGL graphics acceleration. */
/* #undef HAVE_OPENGL */
/* Define to 1 if you have the `rename' function. */
#define HAVE_RENAME 1
/* Define to 1 if you have the `rewind' function. */
#define HAVE_REWIND 1
/* Define to 1 if you have the `rmdir' function. */
#define HAVE_RMDIR 1
/* Define to 1 if you have the `select' function. */
#define HAVE_SELECT 1
/* Define to 1 if you have the `signal' function. */
#define HAVE_SIGNAL 1
/* Define to 1 if you have the <signal.h> header file. */
#define HAVE_SIGNAL_H 1
/* Define to 1 if you have the `snprintf' function. */
#define HAVE_SNPRINTF 1
/* Define to 1 if you have the `socket' function. */
#define HAVE_SOCKET 1
/* Define to 1 if you have the `stat' function. */
#define HAVE_STAT 1
/* Define to 1 if `stat' has the bug that it succeeds when given the
zero-length file name argument. */
/* #undef HAVE_STAT_EMPTY_STRING_BUG */
/* Define to 1 if you have the <stdint.h> header file. */
#define HAVE_STDINT_H 1
/* Define to 1 if you have the <stdlib.h> header file. */
#define HAVE_STDLIB_H 1
/* Define to 1 if you have the `strcasecmp' function. */
#define HAVE_STRCASECMP 1
/* Define to 1 if you have the `strchr' function. */
#define HAVE_STRCHR 1
/* Define to 1 if you have the `strdup' function. */
#define HAVE_STRDUP 1
/* Define to 1 if you have the `strerror' function. */
#define HAVE_STRERROR 1
/* Define to 1 if you have the <strings.h> header file. */
#define HAVE_STRINGS_H 1
/* Define to 1 if you have the <string.h> header file. */
#define HAVE_STRING_H 1
/* Define to 1 if you have the `strncpy' function. */
#define HAVE_STRNCPY 1
/* Define to 1 if you have the `strrchr' function. */
#define HAVE_STRRCHR 1
/* Define to 1 if you have the `strstr' function. */
#define HAVE_STRSTR 1
/* Define to 1 if you have the `strtol' function. */
#define HAVE_STRTOL 1
/* Define to 1 if you have the `system' function. */
#define HAVE_SYSTEM 1
/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
*/
/* #undef HAVE_SYS_DIR_H */
/* Define to 1 if you have the <sys/ioctl.h> header file. */
#define HAVE_SYS_IOCTL_H 1
/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
*/
/* #undef HAVE_SYS_NDIR_H */
/* Define to 1 if you have the <sys/select.h> header file. */
#define HAVE_SYS_SELECT_H 1
/* Define to 1 if you have the <sys/socket.h> header file. */
#define HAVE_SYS_SOCKET_H 1
/* Define to 1 if you have the <sys/soundcard.h> header file. */
#define HAVE_SYS_SOUNDCARD_H 1
/* Define to 1 if you have the <sys/stat.h> header file. */
#define HAVE_SYS_STAT_H 1
/* Define to 1 if you have the <sys/time.h> header file. */
#define HAVE_SYS_TIME_H 1
/* Define to 1 if you have the <sys/types.h> header file. */
#define HAVE_SYS_TYPES_H 1
/* Define to 1 if you have the <termios.h> header file. */
#define HAVE_TERMIOS_H 1
/* Define to 1 if you have the `time' function. */
#define HAVE_TIME 1
/* Define to 1 if you have the <time.h> header file. */
#define HAVE_TIME_H 1
/* Define to 1 if you have the `tmpfile' function. */
#define HAVE_TMPFILE 1
/* Define to 1 if you have the `tmpnam' function. */
#define HAVE_TMPNAM 1
/* Define to 1 if you have the `uclock' function. */
/* #undef HAVE_UCLOCK */
/* Define to 1 if you have the <unistd.h> header file. */
#define HAVE_UNISTD_H 1
/* Define to 1 if you have the <unixio.h> header file. */
/* #undef HAVE_UNIXIO_H */
/* Define to 1 if you have the `unlink' function. */
#define HAVE_UNLINK 1
/* Define to 1 if you have the `usleep' function. */
#define HAVE_USLEEP 1
/* Define to 1 if you have the `vprintf' function. */
#define HAVE_VPRINTF 1
/* Define to 1 if you have the `vsnprintf' function. */
#define HAVE_VSNPRINTF 1
/* Define to 1 if you have the <windows.h> header file. */
/* #undef HAVE_WINDOWS_H */
/* Define to 1 if you have the <winsock2.h> header file. */
/* #undef HAVE_WINSOCK2_H */
/* Define to 1 if you have the `_mkdir' function. */
/* #undef HAVE__MKDIR */
/* Define to add IDE harddisk emulation. */
#define IDE 1
/* Define to allow sound interpolation. */
/* #undef INTERPOLATE_SOUND */
/* Define to use LINUX joystick. */
/* #undef LINUX_JOYSTICK */
/* Define to 1 if `lstat' dereferences a symlink specified with a trailing
slash. */
#define LSTAT_FOLLOWS_SLASHED_SYMLINK 1
/* Define if mkdir takes only one argument. */
/* #undef MKDIR_TAKES_ONE_ARG */
/* Define to activate assembler in monitor. */
#define MONITOR_ASSEMBLER 1
/* Define to activate code breakpoints and execution history. */
#define MONITOR_BREAK 1
/* Define to activate user-defined breakpoints. */
/* #undef MONITOR_BREAKPOINTS */
/* Define to activate hints in disassembler. */
#define MONITOR_HINTS 1
/* Define to activate 6502 opcode profiling. */
/* #undef MONITOR_PROFILE */
/* Define to activate readline support in monitor. */
//#define MONITOR_READLINE 1
/* Define to activate TRACE command in monitor. */
/* #undef MONITOR_TRACE */
/* Target: X11 with Motif. */
/* #undef MOTIF */
/* Define to allow color changes inside a scanline. */
#define NEW_CYCLE_EXACT 1
/* Define to use nonlinear POKEY mixing. */
/* #undef NONLINEAR_MIXING */
/* Use NTSC video filter. */
#define NTSC_FILTER 1
/* Define to the address where bug reports for this package should be sent. */
#define PACKAGE_BUGREPORT "pstehlik@sophics.cz"
/* Define to the full name of this package. */
#define PACKAGE_NAME "Atari800"
/* Define to the full name and version of this package. */
#define PACKAGE_STRING "Atari800 3.1.0"
/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "atari800"
/* Define to the home page for this package. */
#define PACKAGE_URL ""
/* Define to the version of this package. */
#define PACKAGE_VERSION "3.1.0"
/* Define to use page-based attribute array. */
/* #undef PAGED_ATTRIB */
/* Use accurate PAL color blending. */
//#define PAL_BLENDING 1
/* Define to emulate the Black Box. */
#define PBI_BB 1
/* Define to emulate the MIO board. */
#define PBI_MIO 1
/* A prototype 80 column card for the 1090 expansion box. */
#define PBI_PROTO80 1
/* Define to emulate the 1400XL/1450XLD. */
/* #undef PBI_XLD */
/* Platform-specific mapping of RGB palette to display surface. */
#define PLATFORM_MAP_PALETTE 1
/* Target: Sony PlayStation 2. */
/* #undef PS2 */
/* Define as the return type of signal handlers (`int' or `void'). */
#define RETSIGTYPE void
/* Target: Raspberry Pi. */
/* #undef RPI */
/* Define to use R: device. */
/* #undef R_IO_DEVICE */
/* Define to use IP network connection with the R: device. */
/* #undef R_NETWORK */
/* Define to use the host serial port with the R: device. */
/* #undef R_SERIAL */
/* Target: SDL library. */
//#define SDL 1
/* Define to the type of arg 1 for `select'. */
#define SELECT_TYPE_ARG1 int
/* Define to the type of args 2, 3 and 4 for `select'. */
#define SELECT_TYPE_ARG234 (fd_set *)
/* Define to the type of arg 5 for `select'. */
#define SELECT_TYPE_ARG5 (struct timeval *)
/* Define to allow serial in/out sound. */
/* #undef SERIO_SOUND */
/* Target: X11 with shared memory extensions. */
/* #undef SHM */
/* Define to activate sound support. */
/* #undef SOUND */
#define SOUND 1
/* Platform updates sound buffer by callback function. */
/* #undef SOUND_CALLBACK */
#define SOUND_CALLBACK 1
/* Use new sound API. */
/* #undef SOUND_THIN_API */
#define SOUND_THIN_API 1
/* Define to 1 if you have the ANSI C header files. */
#define STDC_HEADERS 1
/* Define to allow stereo sound. */
/* #undef STEREO_SOUND */
#define STEREO_SOUND 1
/* Can change video modes on the fly. */
//#define SUPPORTS_CHANGE_VIDEOMODE 1
/* Save additional config file options. */
//#define SUPPORTS_PLATFORM_CONFIGSAVE 1
/* Additional config file options. */
//#define SUPPORTS_PLATFORM_CONFIGURE 1
/* Update the Palette if it changed. */
#define SUPPORTS_PLATFORM_PALETTEUPDATE 1
/* Platform-specific sleep function. */
/* #undef SUPPORTS_PLATFORM_SLEEP */
/* Platform-specific time function. */
#define SUPPORTS_PLATFORM_TIME 1
/* Can display the screen rotated sideways. */
//#define SUPPORTS_ROTATE_VIDEOMODE 1
/* Reinitialise the sound system. */
/* #undef SUPPORTS_SOUND_REINIT */
/* Define to use synchronized sound. */
/* #undef SYNCHRONIZED_SOUND */
/* Alternate system-wide config file for non-Unix OS. */
/* #undef SYSTEM_WIDE_CFG_FILE */
/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
#define TIME_WITH_SYS_TIME 1
/* Define to 1 if your <sys/time.h> declares `struct tm'. */
/* #undef TM_IN_SYS_TIME */
/* Target: Curses-compatible library. */
/* #undef USE_CURSES */
/* Define for using cursor/ctrl keys for keyboard joystick. */
/* #undef USE_CURSORBLOCK */
/* Target: Ncurses library. */
/* #undef USE_NCURSES */
/* Define to enable on-screen keyboard. */
/* #undef USE_UI_BASIC_ONSCREEN_KEYBOARD */
/* Define to use very slow computer support (faster -refresh). */
/* #undef VERY_SLOW */
/* Define to emulate the Alien Group Voice Box. */
/* #undef VOICEBOX */
/* Define to allow volume only sound. */
/* #undef VOL_ONLY_SOUND */
/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
significant byte first (like Motorola and SPARC, unlike Intel). */
#if defined AC_APPLE_UNIVERSAL_BUILD
# if defined __BIG_ENDIAN__
# define WORDS_BIGENDIAN 1
# endif
#else
# ifndef WORDS_BIGENDIAN
/* # undef WORDS_BIGENDIAN */
# endif
#endif
/* Define if unaligned word access is ok. */
#define WORDS_UNALIGNED_OK 1
/* Target: Standard X11. */
/* #undef X11 */
/* Emulate the XEP80. */
#define XEP80_EMULATION 1
/* Target: X11 with XView. */
/* #undef XVIEW */
/* Number of bits in a file offset, on hosts where this is settable. */
/* #undef _FILE_OFFSET_BITS */
/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */
/* #undef _LARGEFILE_SOURCE */
/* Define for large files, on AIX-style hosts. */
/* #undef _LARGE_FILES */
/* Define to empty if `const' does not conform to ANSI C. */
/* #undef const */
/* Define to `__inline__' or `__inline' if that's what the C compiler
calls it, or to nothing if 'inline' is not supported under any name. */
#ifndef __cplusplus
#define inline __inline__
#endif
/* Define to `unsigned int' if <sys/types.h> does not define. */
/* #undef size_t */
/* Define to empty if the keyword `volatile' does not work. Warning: valid
code using `volatile' can become incorrect without. Disable with care. */
/* #undef volatile */
+7
View File
@@ -0,0 +1,7 @@
#if defined(__ANDROID__) || defined(ANDROID)
#include <android/log.h>
#define LOG_TAG "RetroArch.atari800"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#else
#define LOGI printf
#endif
+805
View File
@@ -0,0 +1,805 @@
#include "libretro.h"
#include "libretro-core.h"
#include "retroscreen.h"
//CORE VAR
#ifdef _WIN32
char slash = '\\';
#else
char slash = '/';
#endif
extern const char *retro_save_directory;
extern const char *retro_system_directory;
extern const char *retro_content_directory;
char RETRO_DIR[512];
char DISKA_NAME[512]="\0";
char DISKB_NAME[512]="\0";
char TAPE_NAME[512]="\0";
//TIME
#ifdef __CELLOS_LV2__
#include "sys/sys_time.h"
#include "sys/timer.h"
#define usleep sys_timer_usleep
#else
#include <sys/types.h>
#include <sys/time.h>
#include <time.h>
#endif
extern void Screen_SetFullUpdate(int scr);
long frame=0;
unsigned long Ktime=0 , LastFPSTime=0;
//VIDEO
#ifdef RENDER16B
uint16_t Retro_Screen[400*300];
#else
unsigned int Retro_Screen[400*300];
#endif
//SOUND
short signed int SNDBUF[1024*2];
int snd_sampler_pal = 44100 / 50;
int snd_sampler_ntsc = 44100 / 60;
//PATH
char RPATH[512];
//EMU FLAGS
int NPAGE=-1, KCOL=1, BKGCOLOR=0;
int SHOWKEY=-1;
#if defined(ANDROID) || defined(__ANDROID__)
int MOUSE_EMULATED=1;
#else
int MOUSE_EMULATED=-1;
#endif
int MAXPAS=6,SHIFTON=-1,MOUSEMODE=-1,PAS=4;
int SND=1; //SOUND ON/OFF
static int firstps=0;
int pauseg=0; //enter_gui
int touch=-1; // gui mouse btn
//JOY
int al[2][2];//left analog1
int ar[2][2];//right analog1
unsigned char MXjoy[2]; // joy
int NUMjoy=1;
int NUMDRV=1;
//MOUSE
extern int pushi; // gui mouse btn
int gmx,gmy; //gui mouse
int c64mouse_enable=0;
int mouse_wu=0,mouse_wd=0;
//KEYBOARD
char Key_Sate[512];
char Key_Sate2[512];
static char old_Key_Sate[512];
static int mbt[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
//STATS GUI
int BOXDEC= 32+2;
int STAT_BASEY;
/*static*/ retro_input_state_t input_state_cb;
static retro_input_poll_t input_poll_cb;
void retro_set_input_state(retro_input_state_t cb)
{
input_state_cb = cb;
}
void retro_set_input_poll(retro_input_poll_t cb)
{
input_poll_cb = cb;
}
long GetTicks(void)
{ // in MSec
#ifndef _ANDROID_
#ifdef __CELLOS_LV2__
//#warning "GetTick PS3\n"
unsigned long ticks_micro;
uint64_t secs;
uint64_t nsecs;
sys_time_get_current_time(&secs, &nsecs);
ticks_micro = secs * 1000000UL + (nsecs / 1000);
return ticks_micro;///1000;
#else
struct timeval tv;
gettimeofday (&tv, NULL);
return (tv.tv_sec*1000000 + tv.tv_usec);///1000;
#endif
#else
struct timespec now;
clock_gettime(CLOCK_MONOTONIC, &now);
return (now.tv_sec*1000000 + now.tv_nsec/1000);///1000;
#endif
}
int slowdown=0;
void gui_poll_events(void)
{
Ktime = GetTicks();
if(Ktime - LastFPSTime >= 1000/50)
{
slowdown=0;
frame++;
LastFPSTime = Ktime;
co_switch(mainThread);
}
}
void retro_mouse(int a,int b) {}
void retro_mouse_but0(int a) {}
void retro_mouse_but1(int a) {}
void enter_options(void) {}
#if defined(ANDROID) || defined(__ANDROID__)
#define DEFAULT_PATH "/mnt/sdcard/"
#else
#ifdef PS3PORT
#define DEFAULT_PATH "/dev_hdd0/HOMEBREW/"
#else
#define DEFAULT_PATH "/"
#endif
#endif
int STATUTON=-1;
#define RETRO_DEVICE_ATARI_KEYBOARD RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_KEYBOARD, 0)
#define RETRO_DEVICE_ATARI_JOYSTICK RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_JOYPAD, 1)
void texture_uninit(void)
{
}
void texture_init(void)
{
memset(Retro_Screen, 0, sizeof(Retro_Screen));
memset(old_Key_Sate ,0, sizeof(old_Key_Sate));
gmx=(retrow/2)-1;
gmy=(retroh/2)-1;
}
int bitstart=0;
int pushi=0; //mouse button
int keydown=0,keyup=0;
int KBMOD=-1;
int RSTOPON=-1;
int CTRLON=-1;
extern unsigned short int bmp[400*300];
extern unsigned atari_devices[ 2 ];
#include "pokeysnd.h"
void retro_sound_update()
{
int x,silent=POKEYSND_enable_new_pokey?24449:32768;
POKEYSND_Process(SNDBUF,snd_sampler_pal*2);
for(x=0;x<snd_sampler_pal*2;x+=2)
retro_audio_cb(SNDBUF[x]+silent,SNDBUF[x+1]+silent);
}
//FIXME in kdbauto.c
extern void vkbd_key(int key,int pressed);
void vkbd_key(int key,int pressed){
//printf("key(%x)=%x shift:%d\n",key,pressed,SHIFTON);
if(pressed){
if(SHIFTON==1)
;//keyboard_matrix[0x25 >> 4] &= ~bit_values2[0x25 & 7]; // key needs to be SHIFTed
//keyboard_matrix[(unsigned char)key >> 4] &= ~bit_values2[(unsigned char)key & 7]; // key is being held down
}
else {
if(SHIFTON==1)
;//keyboard_matrix[0x25 >> 4] |= bit_values2[0x25 & 7]; // make sure key is unSHIFTed
//keyboard_matrix[(unsigned char)key >> 4] |= bit_values2[(unsigned char)key & 7];
}
}
void retro_key_down(int key)
{
int code;
/*
if(key<512)
code=KeySymToCPCKey[key];
else code = CPC_KEY_NULL;
CPC_SetKey(code);
*/
}
void retro_key_up(int key)
{
int code;
/*
if(key<512)
code=KeySymToCPCKey[key];
else code = CPC_KEY_NULL;
CPC_ClearKey(code);
*/
}
static int joy0_flag[6]={0,0,0,0,0,0};
//0x01,0x02,0x04,0x08,0x80 0x40
// UP DWN LEFT RGT BTN0 BTN1
// 0 1 2 3 4 5
void retro_joy0_test(unsigned char joy0)
{
if(joy0&0x01 && joy0_flag[0]==0 ){
//keyboard_matrix[(unsigned char)0x90 >> 4] &= ~bit_values2[(unsigned char)0x90 & 7];
joy0_flag[0]=1;
}
else if(joy0_flag[0]){
//keyboard_matrix[(unsigned char)0x90 >> 4] |= bit_values2[(unsigned char)0x90 & 7];
joy0_flag[0]=0;
}
if(joy0&0x02 && joy0_flag[1]==0 ){
//keyboard_matrix[(unsigned char)0x91 >> 4] &= ~bit_values2[(unsigned char)0x91 & 7];
joy0_flag[1]=1;
}
else if(joy0_flag[1]){
//keyboard_matrix[(unsigned char)0x91 >> 4] |= bit_values2[(unsigned char)0x91 & 7];
joy0_flag[1]=0;
}
if(joy0&0x04 && joy0_flag[2]==0 ){
//keyboard_matrix[(unsigned char)0x92 >> 4] &= ~bit_values2[(unsigned char)0x92 & 7];
joy0_flag[2]=1;
}
else if(joy0_flag[2]){
//keyboard_matrix[(unsigned char)0x92 >> 4] |= bit_values2[(unsigned char)0x92 & 7];
joy0_flag[2]=0;
}
if(joy0&0x08 && joy0_flag[3]==0 ){
//keyboard_matrix[(unsigned char)0x93 >> 4] &= ~bit_values2[(unsigned char)0x93 & 7];
joy0_flag[3]=1;
}
else if(joy0_flag[3]){
//keyboard_matrix[(unsigned char)0x93 >> 4] |= bit_values2[(unsigned char)0x93 & 7];
joy0_flag[3]=0;
}
if(joy0&0x40 && joy0_flag[5]==0 ){
//keyboard_matrix[(unsigned char)0x95 >> 4] &= ~bit_values2[(unsigned char)0x95 & 7];
joy0_flag[5]=1;
}
else if(joy0_flag[5]){
//keyboard_matrix[(unsigned char)0x95 >> 4] |= bit_values2[(unsigned char)0x95 & 7];
joy0_flag[5]=0;
}
if(joy0&0x80 && joy0_flag[4]==0 ){
//keyboard_matrix[(unsigned char)0x94 >> 4] &= ~bit_values2[(unsigned char)0x94 & 7];
joy0_flag[4]=1;
}
else if(joy0_flag[4]){
//keyboard_matrix[(unsigned char)0x94 >> 4] |= bit_values2[(unsigned char)0x94 & 7];
joy0_flag[4]=0;
}
}
void retro_virtualkb(void)
{
// VKBD
int i;
// RETRO B Y SLT STA UP DWN LEFT RGT A X L R L2 R2 L3 R3
// INDEX 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
static int oldi=-1;
static int vkx=0,vky=0;
if(oldi!=-1)
{
//retro_key_up(oldi);
vkbd_key(oldi,0);
oldi=-1;
}
if(SHOWKEY==1)
{
static int vkflag[5]={0,0,0,0,0};
if ( input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP) && vkflag[0]==0 )
vkflag[0]=1;
else if (vkflag[0]==1 && ! input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP) )
{
vkflag[0]=0;
vky -= 1;
}
if ( input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN) && vkflag[1]==0 )
vkflag[1]=1;
else if (vkflag[1]==1 && ! input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN) )
{
vkflag[1]=0;
vky += 1;
}
if ( input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT) && vkflag[2]==0 )
vkflag[2]=1;
else if (vkflag[2]==1 && ! input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT) )
{
vkflag[2]=0;
vkx -= 1;
}
if ( input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT) && vkflag[3]==0 )
vkflag[3]=1;
else if (vkflag[3]==1 && ! input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT) )
{
vkflag[3]=0;
vkx += 1;
}
if(vkx<0)vkx=NPLGN-1;
if(vkx>NPLGN-1)vkx=0;
if(vky<0)vky=NLIGN-1;
if(vky>NLIGN-1)vky=0;
virtual_kdb(( char *)Retro_Screen,vkx,vky);
i=8;
if(input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) && vkflag[4]==0)
vkflag[4]=1;
else if( !input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) && vkflag[4]==1)
{
vkflag[4]=0;
i=check_vkey2(vkx,vky);
if(i==-1){
oldi=-1;
}
if(i==-2)
{
NPAGE=-NPAGE;oldi=-1;
}
else if(i==-3)
{
//KDB bgcolor
KCOL=-KCOL;
oldi=-1;
}
else if(i==-4)
{
//VKbd show/hide
oldi=-1;
Screen_SetFullUpdate(0);
SHOWKEY=-SHOWKEY;
}
else if(i==-5)
{
//FLIP DSK PORT 1-2
NUMDRV=-NUMDRV;
oldi=-1;
}
else if(i==-6)
{
//Exit
retro_deinit();
oldi=-1;
exit(0);
}
else if(i==-7)
{
//SNA SAVE
// snapshot_save (RPATH);
oldi=-1;
}
else if(i==-8)
{
//PLAY TAPE
// play_tape();
oldi=-1;
}
else
{
if(i==0x25 /*i==-10*/) //SHIFT
{
// if(SHIFTON == 1)retro_key_up(RETROK_RSHIFT);
// else retro_key_down(RETROK_LSHIFT);
SHIFTON=-SHIFTON;
oldi=-1;
}
else if(i==0x27/*i==-11*/) //CTRL
{
// if(CTRLON == 1)retro_key_up(RETROK_LCTRL);
/// else retro_key_down(RETROK_LCTRL);
CTRLON=-CTRLON;
oldi=-1;
}
else if(i==-12) //RSTOP
{
// if(RSTOPON == 1)retro_key_up(RETROK_ESCAPE);
// else retro_key_down(RETROK_ESCAPE);
RSTOPON=-RSTOPON;
oldi=-1;
}
else if(i==-13) //GUI
{
// pauseg=1;
SHOWKEY=-SHOWKEY;
Screen_SetFullUpdate(0);
oldi=-1;
}
else if(i==-14) //JOY PORT TOGGLE
{
//cur joy toggle
//cur_port++;if(cur_port>2)cur_port=1;
SHOWKEY=-SHOWKEY;
oldi=-1;
}
else
{
oldi=i;
//retro_key_down(oldi);
vkbd_key(oldi,1);
}
}
}
}
}
void Screen_SetFullUpdate(int scr)
{
if(scr==0 ||scr>1)memset(Retro_Screen, 0, sizeof(Retro_Screen));
// if(scr>0)memset(bmp,0,sizeof(bmp));
}
void Process_key()
{
int i;
for(i=0;i<320;i++)
Key_Sate[i]=input_state_cb(0, RETRO_DEVICE_KEYBOARD, 0,i) ? 0x80: 0;
if(memcmp( Key_Sate,old_Key_Sate , sizeof(Key_Sate) ) )
for(i=0;i<320;i++)
if(Key_Sate[i] && Key_Sate[i]!=old_Key_Sate[i] )
{
if(i==RETROK_F12){
//play_tape();
continue;
}
/*
if(i==RETROK_RCTRL){
//CTRLON=-CTRLON;
printf("Modifier crtl pressed %d \n",CTRLON);
continue;
}
if(i==RETROK_RSHIFT){
//SHITFON=-SHITFON;
printf("Modifier shift pressed %d \n",SHIFTON);
continue;
}
*/
if(i==RETROK_LALT){
//KBMOD=-KBMOD;
printf("Modifier alt pressed %d \n",KBMOD);
continue;
}
//printf("press: %d \n",i);
retro_key_down(i);
}
else if ( !Key_Sate[i] && Key_Sate[i]!=old_Key_Sate[i] )
{
if(i==RETROK_F12){
//kbd_buf_feed("|tape\nrun\"\n^");
continue;
}
/*
if(i==RETROK_RCTRL){
CTRLON=-CTRLON;
printf("Modifier crtl released %d \n",CTRLON);
continue;
}
if(i==RETROK_RSHIFT){
SHIFTON=-SHIFTON;
printf("Modifier shift released %d \n",SHIFTON);
continue;
}
*/
if(i==RETROK_LALT){
KBMOD=-KBMOD;
printf("Modifier alt released %d \n",KBMOD);
continue;
}
//printf("release: %d \n",i);
retro_key_up(i);
}
memcpy(old_Key_Sate,Key_Sate , sizeof(Key_Sate) );
}
/*
void Print_Statut(void)
{
DrawFBoxBmp(bmp,0,CROP_HEIGHT,CROP_WIDTH,STAT_YSZ,RGB565(0,0,0));
Draw_text(bmp,STAT_DECX+40 ,STAT_BASEY,0xffff,0x8080,1,2,40,(SND>0?"SND":""));
Draw_text(bmp,STAT_DECX+80 ,STAT_BASEY,0xffff,0x8080,1,2,40,"F:%d",dwFPS);
Draw_text(bmp,STAT_DECX+120,STAT_BASEY,0xffff,0x8080,1,2,40,"DSK%c",NUMDRV>0?'A':'B');
if(ZOOM>-1)
Draw_text(bmp,(384-Mres[ZOOM].x)/2,(272-Mres[ZOOM].y)/2,0xffff,0x8080,1,2,40,"x:%3d y:%3d",Mres[ZOOM].x,Mres[ZOOM].y);
}
*/
/*
In joy mode
L3 GUI LOAD
R3 GUI SNAP
L2 STATUS ON/OFF
R2 AUTOLOAD TAPE
L CAT
R RESET
SEL MOUSE/JOY IN GUI
STR ENTER/RETURN
A FIRE1/VKBD KEY
B RUN
X FIRE2
Y VKBD ON/OFF
In Keayboard mode
F8 LOAD DSK/TAPE
F9 MEM SNAPSHOT LOAD/SAVE
F10 MAIN GUI
F12 PLAY TAPE
*/
int Retro_PollEvent()
{
// RETRO B Y SLT STA UP DWN LEFT RGT A X L R L2 R2 L3 R3
// INDEX 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
int SAVPAS=PAS;
int i;
static int vbt[16]={0x0,0x0,0x0,0x0,0x01,0x02,0x04,0x08,0x80,0x40,0x0,0x0,0x0,0x0,0x0,0x0};
//MXjoy[0]=0;
input_poll_cb();
int mouse_l;
int mouse_r;
int16_t mouse_x,mouse_y;
mouse_x=mouse_y=0;
if(SHOWKEY==-1 && pauseg==0)Process_key();
if(pauseg==0){ // if emulation running
//Joy mode
for(i=4;i<10;i++)
{
if( input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i))
MXjoy[0] |= vbt[i]; // Joy press
else if( MXjoy[0]&vbt[i])MXjoy[0] &= ~vbt[i]; // Joy press
}
if(SHOWKEY==-1)retro_joy0_test(MXjoy[0]);
if(atari_devices[0]==RETRO_DEVICE_ATARI_JOYSTICK){
//shortcut for joy mode only
i=1;//show vkbd toggle
if ( input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) && mbt[i]==0 )
mbt[i]=1;
else if ( mbt[i]==1 && ! input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) )
{
mbt[i]=0;
SHOWKEY=-SHOWKEY;
}
i=3;//type ENTER
if ( input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) && mbt[i]==0 )
mbt[i]=1;
else if ( mbt[i]==1 && ! input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) )
{
mbt[i]=0;
// kbd_buf_feed("\n");
}
/*
i=10;//type DEL / ZOOM
if ( input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) && mbt[i]==0 )
mbt[i]=1;
else if ( mbt[i]==1 && ! input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) ){
mbt[i]=0;
ZOOM++;if(ZOOM>4)ZOOM=-1;
}
*/
i=0;//type RUN"
if ( input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) && mbt[i]==0 )
mbt[i]=1;
else if ( mbt[i]==1 && ! input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) ){
mbt[i]=0;
// kbd_buf_feed("RUN\"");
}
i=10;//Type CAT\n
if ( input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) && mbt[i]==0 )
mbt[i]=1;
else if ( mbt[i]==1 && ! input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) ){
mbt[i]=0;
// kbd_buf_feed("CAT\n");
//Screen_SetFullUpdate();
}
i=12;//show/hide statut
if ( input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) && mbt[i]==0 )
mbt[i]=1;
else if ( mbt[i]==1 && ! input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) ){
mbt[i]=0;
STATUTON=-STATUTON;
// Screen_SetFullUpdate();
}
i=13;//auto load tape
if ( input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) && mbt[i]==0 )
mbt[i]=1;
else if ( mbt[i]==1 && ! input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) ){
mbt[i]=0;
// kbd_buf_feed("|tape\nrun\"\n^");
}
i=11;//reset
if ( input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) && mbt[i]==0 )
mbt[i]=1;
else if ( mbt[i]==1 && ! input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) ){
mbt[i]=0;
//emu_reset();
}
i=2;//mouse/joy toggle
if ( input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) && mbt[i]==0 )
mbt[i]=1;
else if ( mbt[i]==1 && ! input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) ){
mbt[i]=0;
MOUSE_EMULATED=-MOUSE_EMULATED;
}
// L3 -> gui load
if (input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, 14)){
}
// R3 -> gui snapshot
if (input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, 15)){
}
}//if atari_devices=joy
}// if pauseg=0
else{
// if in gui
i=2;//mouse/joy toggle
if ( input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) && mbt[i]==0 )
mbt[i]=1;
else if ( mbt[i]==1 && ! input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i) ){
mbt[i]=0;
MOUSE_EMULATED=-MOUSE_EMULATED;
}
}
if(MOUSE_EMULATED==1){
if(slowdown>0)return 1;
if (input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT))mouse_x += PAS;
if (input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT))mouse_x -= PAS;
if (input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN))mouse_y += PAS;
if (input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP))mouse_y -= PAS;
mouse_l=input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A);
mouse_r=input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B);
PAS=SAVPAS;
slowdown=1;
}
else {
//printf("-----------------%d \n",pauseg);
mouse_wu = input_state_cb(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_WHEELUP);
mouse_wd = input_state_cb(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_WHEELDOWN);
if(mouse_wu || mouse_wd)printf("-----------------MOUSE UP:%d DOWN:%d\n",mouse_wu, mouse_wd);
mouse_x = input_state_cb(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_X);
mouse_y = input_state_cb(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_Y);
mouse_l = input_state_cb(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_LEFT);
mouse_r = input_state_cb(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_RIGHT);
}
static int mmbL=0,mmbR=0;
if(mmbL==0 && mouse_l){
mmbL=1;
pushi=1;
touch=1;
}
else if(mmbL==1 && !mouse_l) {
mmbL=0;
pushi=0;
touch=-1;
}
if(mmbR==0 && mouse_r){
mmbR=1;
}
else if(mmbR==1 && !mouse_r) {
mmbR=0;
}
if(pauseg==0 && c64mouse_enable){
/*
mouse_move((int)mouse_x, (int)mouse_y);
mouse_button(0,mmbL);
mouse_button(1,mmbR);
*/
}
gmx+=mouse_x;
gmy+=mouse_y;
if(gmx<0)gmx=0;
if(gmx>retrow-1)gmx=retrow-1;
if(gmy<0)gmy=0;
if(gmy>retroh-1)gmy=retroh-1;
if(SHOWKEY && pauseg==0)retro_virtualkb();
return 1;
}
+270
View File
@@ -0,0 +1,270 @@
/****************************************************************/
/* Apple IIgs emulator */
/* */
/* Apple 2GS Original fonts. */
/* All the characters are coded in their original set. */
/* Only the USA keyboard is recognized with ROM 01. */
/* */
/****************************************************************/
unsigned char font_array[256*8]
= {
0xc7, 0xbb, 0xab, 0xa3, 0xa7, 0xbf, 0xc3, 0xff,
0xef, 0xd7, 0xbb, 0xbb, 0x83, 0xbb, 0xbb, 0xff,
0x87, 0xbb, 0xbb, 0x87, 0xbb, 0xbb, 0x87, 0xff,
0xc7, 0xbb, 0xbf, 0xbf, 0xbf, 0xbb, 0xc7, 0xff,
0x87, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x87, 0xff,
0x83, 0xbf, 0xbf, 0x87, 0xbf, 0xbf, 0x83, 0xff,
0x83, 0xbf, 0xbf, 0x87, 0xbf, 0xbf, 0xbf, 0xff,
0xc3, 0xbf, 0xbf, 0xbf, 0xb3, 0xbb, 0xc3, 0xff,
0xbb, 0xbb, 0xbb, 0x83, 0xbb, 0xbb, 0xbb, 0xff,
0xc7, 0xef, 0xef, 0xef, 0xef, 0xef, 0xc7, 0xff,
0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xbb, 0xc7, 0xff,
0xbb, 0xb7, 0xaf, 0x9f, 0xaf, 0xb7, 0xbb, 0xff,
0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0x83, 0xff,
0xbb, 0x93, 0xab, 0xab, 0xbb, 0xbb, 0xbb, 0xff,
0xbb, 0xbb, 0x9b, 0xab, 0xb3, 0xbb, 0xbb, 0xff,
0xc7, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xc7, 0xff,
0x87, 0xbb, 0xbb, 0x87, 0xbf, 0xbf, 0xbf, 0xff,
0xc7, 0xbb, 0xbb, 0xbb, 0xab, 0xb7, 0xcb, 0xff,
0x87, 0xbb, 0xbb, 0x87, 0xaf, 0xb7, 0xbb, 0xff,
0xc7, 0xbb, 0xbf, 0xc7, 0xfb, 0xbb, 0xc7, 0xff,
0x83, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xff,
0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xc7, 0xff,
0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xd7, 0xef, 0xff,
0xbb, 0xbb, 0xbb, 0xab, 0xab, 0x93, 0xbb, 0xff,
0xbb, 0xbb, 0xd7, 0xef, 0xd7, 0xbb, 0xbb, 0xff,
0xbb, 0xbb, 0xd7, 0xef, 0xef, 0xef, 0xef, 0xff,
0x83, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x83, 0xff,
0x83, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x83, 0xff,
0xff, 0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xff, 0xff,
0x83, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0x83, 0xff,
0xff, 0xff, 0xef, 0xd7, 0xbb, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xef, 0xef, 0xef, 0xef, 0xef, 0xff, 0xef, 0xff,
0xd7, 0xd7, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xff,
0xd7, 0xd7, 0x83, 0xd7, 0x83, 0xd7, 0xd7, 0xff,
0xef, 0xc3, 0xaf, 0xc7, 0xeb, 0x87, 0xef, 0xff,
0x9f, 0x9b, 0xf7, 0xef, 0xdf, 0xb3, 0xf3, 0xff,
0xdf, 0xaf, 0xaf, 0xdf, 0xab, 0xb7, 0xcb, 0xff,
0xef, 0xef, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff,
0xef, 0xdf, 0xbf, 0xbf, 0xbf, 0xdf, 0xef, 0xff,
0xef, 0xf7, 0xfb, 0xfb, 0xfb, 0xf7, 0xef, 0xff,
0xef, 0xab, 0xc7, 0xef, 0xc7, 0xab, 0xef, 0xff,
0xff, 0xef, 0xef, 0x83, 0xef, 0xef, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xef, 0xef, 0xdf, 0xff,
0xff, 0xff, 0xff, 0x83, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff,
0xff, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0xff, 0xff,
0xc7, 0xbb, 0xb3, 0xab, 0x9b, 0xbb, 0xc7, 0xff,
0xef, 0xcf, 0xef, 0xef, 0xef, 0xef, 0xc7, 0xff,
0xc7, 0xbb, 0xfb, 0xe7, 0xdf, 0xbf, 0x83, 0xff,
0x83, 0xfb, 0xf7, 0xe7, 0xfb, 0xbb, 0xc7, 0xff,
0xf7, 0xe7, 0xd7, 0xb7, 0x83, 0xf7, 0xf7, 0xff,
0x83, 0xbf, 0x87, 0xfb, 0xfb, 0xbb, 0xc7, 0xff,
0xe3, 0xdf, 0xbf, 0x87, 0xbb, 0xbb, 0xc7, 0xff,
0x83, 0xfb, 0xf7, 0xef, 0xdf, 0xdf, 0xdf, 0xff,
0xc7, 0xbb, 0xbb, 0xc7, 0xbb, 0xbb, 0xc7, 0xff,
0xc7, 0xbb, 0xbb, 0xc3, 0xfb, 0xf7, 0x8f, 0xff,
0xff, 0xff, 0xef, 0xff, 0xef, 0xff, 0xff, 0xff,
0xff, 0xff, 0xef, 0xff, 0xef, 0xef, 0xdf, 0xff,
0xf7, 0xef, 0xdf, 0xbf, 0xdf, 0xef, 0xf7, 0xff,
0xff, 0xff, 0x83, 0xff, 0x83, 0xff, 0xff, 0xff,
0xdf, 0xef, 0xf7, 0xfb, 0xf7, 0xef, 0xdf, 0xff,
0xc7, 0xbb, 0xf7, 0xef, 0xef, 0xff, 0xef, 0xff,
0x08, 0x10, 0x6c, 0xfe, 0xfc, 0xfc, 0x7e, 0x6c,
0x08, 0x10, 0x6c, 0x82, 0x84, 0x84, 0x52, 0x6c,
0x00, 0x00, 0x40, 0x60, 0x70, 0x78, 0x6c, 0x42,
0xfe, 0x44, 0x28, 0x10, 0x10, 0x28, 0x54, 0xfe,
0x00, 0x02, 0x04, 0x88, 0x50, 0x20, 0x20, 0x00,
0xfe, 0xfc, 0xfa, 0x36, 0xae, 0xde, 0xde, 0xfe,
0xfc, 0xfc, 0xfc, 0xdc, 0x9c, 0x00, 0x9e, 0xde,
0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0x00, 0xfe,
0x10, 0x20, 0x40, 0xfe, 0x40, 0x20, 0x10, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54,
0x10, 0x10, 0x10, 0x10, 0x92, 0x54, 0x38, 0x10,
0x10, 0x38, 0x54, 0x92, 0x10, 0x10, 0x10, 0x10,
0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x02, 0x02, 0x02, 0x22, 0x62, 0xfe, 0x60, 0x20,
0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc,
0xc8, 0x18, 0x38, 0x7e, 0x38, 0x18, 0x08, 0xf6,
0x26, 0x30, 0x38, 0xfc, 0x38, 0x30, 0x20, 0xde,
0x02, 0x12, 0x10, 0xfe, 0x7c, 0x38, 0x12, 0x02,
0x02, 0x12, 0x38, 0x7c, 0xfe, 0x10, 0x12, 0x02,
0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00,
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xfe,
0x10, 0x08, 0x04, 0xfe, 0x04, 0x08, 0x10, 0x00,
0x54, 0xaa, 0x54, 0xaa, 0x54, 0xaa, 0x54, 0xaa,
0xaa, 0x54, 0xaa, 0x54, 0xaa, 0x54, 0xaa, 0x54,
0x00, 0x7c, 0x82, 0x80, 0x80, 0x80, 0xfe, 0x00,
0x00, 0x00, 0xfc, 0x02, 0x02, 0x02, 0xfe, 0x00,
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
0x10, 0x38, 0x7c, 0xfe, 0x7c, 0x38, 0x10, 0x00,
0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe,
0x28, 0x28, 0xee, 0x00, 0xee, 0x28, 0x28, 0x00,
0xfe, 0x02, 0x02, 0x32, 0x32, 0x02, 0x02, 0xfe,
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
0xdf, 0xef, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xc7, 0xfb, 0xc3, 0xbb, 0xc3, 0xff,
0xbf, 0xbf, 0x87, 0xbb, 0xbb, 0xbb, 0x87, 0xff,
0xff, 0xff, 0xc3, 0xbf, 0xbf, 0xbf, 0xc3, 0xff,
0xfb, 0xfb, 0xc3, 0xbb, 0xbb, 0xbb, 0xc3, 0xff,
0xff, 0xff, 0xc7, 0xbb, 0x83, 0xbf, 0xc3, 0xff,
0xe7, 0xdb, 0xdf, 0x87, 0xdf, 0xdf, 0xdf, 0xff,
0xff, 0xff, 0xc7, 0xbb, 0xbb, 0xc3, 0xfb, 0xc7,
0xbf, 0xbf, 0x87, 0xbb, 0xbb, 0xbb, 0xbb, 0xff,
0xef, 0xff, 0xcf, 0xef, 0xef, 0xef, 0xc7, 0xff,
0xf7, 0xff, 0xe7, 0xf7, 0xf7, 0xf7, 0xb7, 0xcf,
0xbf, 0xbf, 0xbb, 0xb7, 0x8f, 0xb7, 0xbb, 0xff,
0xcf, 0xef, 0xef, 0xef, 0xef, 0xef, 0xc7, 0xff,
0xff, 0xff, 0x93, 0xab, 0xab, 0xab, 0xbb, 0xff,
0xff, 0xff, 0x87, 0xbb, 0xbb, 0xbb, 0xbb, 0xff,
0xff, 0xff, 0xc7, 0xbb, 0xbb, 0xbb, 0xc7, 0xff,
0xff, 0xff, 0x87, 0xbb, 0xbb, 0x87, 0xbf, 0xbf,
0xff, 0xff, 0xc3, 0xbb, 0xbb, 0xc3, 0xfb, 0xfb,
0xff, 0xff, 0xa3, 0x9f, 0xbf, 0xbf, 0xbf, 0xff,
0xff, 0xff, 0xc3, 0xbf, 0xc7, 0xfb, 0x87, 0xff,
0xdf, 0xdf, 0x87, 0xdf, 0xdf, 0xdb, 0xe7, 0xff,
0xff, 0xff, 0xbb, 0xbb, 0xbb, 0xb3, 0xcb, 0xff,
0xff, 0xff, 0xbb, 0xbb, 0xbb, 0xd7, 0xef, 0xff,
0xff, 0xff, 0xbb, 0xbb, 0xab, 0xab, 0x93, 0xff,
0xff, 0xff, 0xbb, 0xd7, 0xef, 0xd7, 0xbb, 0xff,
0xff, 0xff, 0xbb, 0xbb, 0xbb, 0xc3, 0xfb, 0xc7,
0xff, 0xff, 0x83, 0xf7, 0xef, 0xdf, 0x83, 0xff,
0xe3, 0xcf, 0xcf, 0x9f, 0xcf, 0xcf, 0xe3, 0xff,
0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef,
0x8f, 0xe7, 0xe7, 0xf3, 0xe7, 0xe7, 0x8f, 0xff,
0xcb, 0xa7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xab, 0xd7, 0xab, 0xd7, 0xab, 0xff, 0xff,
0x38, 0x44, 0x54, 0x5c, 0x58, 0x40, 0x3c, 0x00,
0x10, 0x28, 0x44, 0x44, 0x7c, 0x44, 0x44, 0x00,
0x78, 0x44, 0x44, 0x78, 0x44, 0x44, 0x78, 0x00,
0x38, 0x44, 0x40, 0x40, 0x40, 0x44, 0x38, 0x00,
0x78, 0x44, 0x44, 0x44, 0x44, 0x44, 0x78, 0x00,
0x7c, 0x40, 0x40, 0x78, 0x40, 0x40, 0x7c, 0x00,
0x7c, 0x40, 0x40, 0x78, 0x40, 0x40, 0x40, 0x00,
0x3c, 0x40, 0x40, 0x40, 0x4c, 0x44, 0x3c, 0x00,
0x44, 0x44, 0x44, 0x7c, 0x44, 0x44, 0x44, 0x00,
0x38, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00,
0x04, 0x04, 0x04, 0x04, 0x04, 0x44, 0x38, 0x00,
0x44, 0x48, 0x50, 0x60, 0x50, 0x48, 0x44, 0x00,
0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x7c, 0x00,
0x44, 0x6c, 0x54, 0x54, 0x44, 0x44, 0x44, 0x00,
0x44, 0x44, 0x64, 0x54, 0x4c, 0x44, 0x44, 0x00,
0x38, 0x44, 0x44, 0x44, 0x44, 0x44, 0x38, 0x00,
0x78, 0x44, 0x44, 0x78, 0x40, 0x40, 0x40, 0x00,
0x38, 0x44, 0x44, 0x44, 0x54, 0x48, 0x34, 0x00,
0x78, 0x44, 0x44, 0x78, 0x50, 0x48, 0x44, 0x00,
0x38, 0x44, 0x40, 0x38, 0x04, 0x44, 0x38, 0x00,
0x7c, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00,
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x38, 0x00,
0x44, 0x44, 0x44, 0x44, 0x44, 0x28, 0x10, 0x00,
0x44, 0x44, 0x44, 0x54, 0x54, 0x6c, 0x44, 0x00,
0x44, 0x44, 0x28, 0x10, 0x28, 0x44, 0x44, 0x00,
0x44, 0x44, 0x28, 0x10, 0x10, 0x10, 0x10, 0x00,
0x7c, 0x04, 0x08, 0x10, 0x20, 0x40, 0x7c, 0x00,
0x7c, 0x60, 0x60, 0x60, 0x60, 0x60, 0x7c, 0x00,
0x00, 0x40, 0x20, 0x10, 0x08, 0x04, 0x00, 0x00,
0x7c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x7c, 0x00,
0x00, 0x00, 0x10, 0x28, 0x44, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x00,
0x28, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00,
0x28, 0x28, 0x7c, 0x28, 0x7c, 0x28, 0x28, 0x00,
0x10, 0x3c, 0x50, 0x38, 0x14, 0x78, 0x10, 0x00,
0x60, 0x64, 0x08, 0x10, 0x20, 0x4c, 0x0c, 0x00,
0x20, 0x50, 0x50, 0x20, 0x54, 0x48, 0x34, 0x00,
0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x20, 0x40, 0x40, 0x40, 0x20, 0x10, 0x00,
0x10, 0x08, 0x04, 0x04, 0x04, 0x08, 0x10, 0x00,
0x10, 0x54, 0x38, 0x10, 0x38, 0x54, 0x10, 0x00,
0x00, 0x10, 0x10, 0x7c, 0x10, 0x10, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x20, 0x00,
0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
0x00, 0x04, 0x08, 0x10, 0x20, 0x40, 0x00, 0x00,
0x38, 0x44, 0x4c, 0x54, 0x64, 0x44, 0x38, 0x00,
0x10, 0x30, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00,
0x38, 0x44, 0x04, 0x18, 0x20, 0x40, 0x7c, 0x00,
0x7c, 0x04, 0x08, 0x18, 0x04, 0x44, 0x38, 0x00,
0x08, 0x18, 0x28, 0x48, 0x7c, 0x08, 0x08, 0x00,
0x7c, 0x40, 0x78, 0x04, 0x04, 0x44, 0x38, 0x00,
0x1c, 0x20, 0x40, 0x78, 0x44, 0x44, 0x38, 0x00,
0x7c, 0x04, 0x08, 0x10, 0x20, 0x20, 0x20, 0x00,
0x38, 0x44, 0x44, 0x38, 0x44, 0x44, 0x38, 0x00,
0x38, 0x44, 0x44, 0x3c, 0x04, 0x08, 0x70, 0x00,
0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00,
0x00, 0x00, 0x10, 0x00, 0x10, 0x10, 0x20, 0x00,
0x08, 0x10, 0x20, 0x40, 0x20, 0x10, 0x08, 0x00,
0x00, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x00, 0x00,
0x20, 0x10, 0x08, 0x04, 0x08, 0x10, 0x20, 0x00,
0x38, 0x44, 0x08, 0x10, 0x10, 0x00, 0x10, 0x00,
0x38, 0x44, 0x54, 0x5c, 0x58, 0x40, 0x3c, 0x00,
0x10, 0x28, 0x44, 0x44, 0x7c, 0x44, 0x44, 0x00,
0x78, 0x44, 0x44, 0x78, 0x44, 0x44, 0x78, 0x00,
0x38, 0x44, 0x40, 0x40, 0x40, 0x44, 0x38, 0x00,
0x78, 0x44, 0x44, 0x44, 0x44, 0x44, 0x78, 0x00,
0x7c, 0x40, 0x40, 0x78, 0x40, 0x40, 0x7c, 0x00,
0x7c, 0x40, 0x40, 0x78, 0x40, 0x40, 0x40, 0x00,
0x3c, 0x40, 0x40, 0x40, 0x4c, 0x44, 0x3c, 0x00,
0x44, 0x44, 0x44, 0x7c, 0x44, 0x44, 0x44, 0x00,
0x38, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00,
0x04, 0x04, 0x04, 0x04, 0x04, 0x44, 0x38, 0x00,
0x44, 0x48, 0x50, 0x60, 0x50, 0x48, 0x44, 0x00,
0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x7c, 0x00,
0x44, 0x6c, 0x54, 0x54, 0x44, 0x44, 0x44, 0x00,
0x44, 0x44, 0x64, 0x54, 0x4c, 0x44, 0x44, 0x00,
0x38, 0x44, 0x44, 0x44, 0x44, 0x44, 0x38, 0x00,
0x78, 0x44, 0x44, 0x78, 0x40, 0x40, 0x40, 0x00,
0x38, 0x44, 0x44, 0x44, 0x54, 0x48, 0x34, 0x00,
0x78, 0x44, 0x44, 0x78, 0x50, 0x48, 0x44, 0x00,
0x38, 0x44, 0x40, 0x38, 0x04, 0x44, 0x38, 0x00,
0x7c, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00,
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x38, 0x00,
0x44, 0x44, 0x44, 0x44, 0x44, 0x28, 0x10, 0x00,
0x44, 0x44, 0x44, 0x54, 0x54, 0x6c, 0x44, 0x00,
0x44, 0x44, 0x28, 0x10, 0x28, 0x44, 0x44, 0x00,
0x44, 0x44, 0x28, 0x10, 0x10, 0x10, 0x10, 0x00,
0x7c, 0x04, 0x08, 0x10, 0x20, 0x40, 0x7c, 0x00,
0x7c, 0x60, 0x60, 0x60, 0x60, 0x60, 0x7c, 0x00,
0x00, 0x40, 0x20, 0x10, 0x08, 0x04, 0x00, 0x00,
0x7c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x7c, 0x00,
0x00, 0x00, 0x10, 0x28, 0x44, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe,
0x20, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x38, 0x04, 0x3c, 0x44, 0x3c, 0x00,
0x40, 0x40, 0x78, 0x44, 0x44, 0x44, 0x78, 0x00,
0x00, 0x00, 0x3c, 0x40, 0x40, 0x40, 0x3c, 0x00,
0x04, 0x04, 0x3c, 0x44, 0x44, 0x44, 0x3c, 0x00,
0x00, 0x00, 0x38, 0x44, 0x7c, 0x40, 0x3c, 0x00,
0x18, 0x24, 0x20, 0x78, 0x20, 0x20, 0x20, 0x00,
0x00, 0x00, 0x38, 0x44, 0x44, 0x3c, 0x04, 0x38,
0x40, 0x40, 0x78, 0x44, 0x44, 0x44, 0x44, 0x00,
0x10, 0x00, 0x30, 0x10, 0x10, 0x10, 0x38, 0x00,
0x08, 0x00, 0x18, 0x08, 0x08, 0x08, 0x48, 0x30,
0x40, 0x40, 0x44, 0x48, 0x70, 0x48, 0x44, 0x00,
0x30, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00,
0x00, 0x00, 0x6c, 0x54, 0x54, 0x54, 0x44, 0x00,
0x00, 0x00, 0x78, 0x44, 0x44, 0x44, 0x44, 0x00,
0x00, 0x00, 0x38, 0x44, 0x44, 0x44, 0x38, 0x00,
0x00, 0x00, 0x78, 0x44, 0x44, 0x78, 0x40, 0x40,
0x00, 0x00, 0x3c, 0x44, 0x44, 0x3c, 0x04, 0x04,
0x00, 0x00, 0x5c, 0x60, 0x40, 0x40, 0x40, 0x00,
0x00, 0x00, 0x3c, 0x40, 0x38, 0x04, 0x78, 0x00,
0x20, 0x20, 0x78, 0x20, 0x20, 0x24, 0x18, 0x00,
0x00, 0x00, 0x44, 0x44, 0x44, 0x4c, 0x34, 0x00,
0x00, 0x00, 0x44, 0x44, 0x44, 0x28, 0x10, 0x00,
0x00, 0x00, 0x44, 0x44, 0x54, 0x54, 0x6c, 0x00,
0x00, 0x00, 0x44, 0x28, 0x10, 0x28, 0x44, 0x00,
0x00, 0x00, 0x44, 0x44, 0x44, 0x3c, 0x04, 0x38,
0x00, 0x00, 0x7c, 0x08, 0x10, 0x20, 0x7c, 0x00,
0x1c, 0x30, 0x30, 0x60, 0x30, 0x30, 0x1c, 0x00,
0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
0x70, 0x18, 0x18, 0x0c, 0x18, 0x18, 0x70, 0x00,
0x34, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x54, 0x28, 0x54, 0x28, 0x54, 0x00, 0x00,
};
/* Well, this is finally done ! */
+368
View File
@@ -0,0 +1,368 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <math.h>
#include "graph.h"
#include "libretro-core.h"
extern int VIRTUAL_WIDTH;
void DrawFBoxBmp(char *buffer,int x,int y,int dx,int dy,unsigned color){
int i,j,idx;
#if defined PITCH && PITCH == 4
unsigned *mbuffer=(unsigned*)buffer;
#else
unsigned short *mbuffer=(unsigned short *)buffer;
#endif
for(i=x;i<x+dx;i++){
for(j=y;j<y+dy;j++){
idx=i+j*VIRTUAL_WIDTH;
mbuffer[idx]=color;
}
}
}
void DrawBoxBmp(char *buffer,int x,int y,int dx,int dy,unsigned color){
int i,j,idx;
#if defined PITCH && PITCH == 4
unsigned *mbuffer=(unsigned*)buffer;
#else
unsigned short *mbuffer=(unsigned short *)buffer;
#endif
for(i=x;i<x+dx;i++){
idx=i+y*VIRTUAL_WIDTH;
mbuffer[idx]=color;
idx=i+(y+dy)*VIRTUAL_WIDTH;
mbuffer[idx]=color;
}
for(j=y;j<y+dy;j++){
idx=x+j*VIRTUAL_WIDTH;
mbuffer[idx]=color;
idx=(x+dx)+j*VIRTUAL_WIDTH;
mbuffer[idx]=color;
}
}
void DrawPointBmp(char *buffer,int x,int y,unsigned color){
int idx;
#if defined PITCH && PITCH == 4
unsigned *mbuffer=(unsigned*)buffer;
#else
unsigned short *mbuffer=(unsigned short *)buffer;
#endif
idx=x+y*VIRTUAL_WIDTH;
mbuffer[idx]=color;
}
void DrawHlineBmp(char *buffer,int x,int y,int dx,int dy,unsigned color){
int i,j,idx;
#if defined PITCH && PITCH == 4
unsigned *mbuffer=(unsigned*)buffer;
#else
unsigned short *mbuffer=(unsigned short *)buffer;
#endif
for(i=x;i<x+dx;i++){
idx=i+y*VIRTUAL_WIDTH;
mbuffer[idx]=color;
}
}
void DrawVlineBmp(char *buffer,int x,int y,int dx,int dy,unsigned color){
int i,j,idx;
#if defined PITCH && PITCH == 4
unsigned *mbuffer=(unsigned*)buffer;
#else
unsigned short *mbuffer=(unsigned short *)buffer;
#endif
for(j=y;j<y+dy;j++){
idx=x+j*VIRTUAL_WIDTH;
mbuffer[idx]=color;
}
}
void DrawlineBmp(char *buffer,int x1,int y1,int x2,int y2,unsigned color){
int pixx, pixy;
int x, y;
int dx, dy;
int sx, sy;
int swaptmp;
int idx;
#if defined PITCH && PITCH == 4
unsigned *mbuffer=(unsigned*)buffer;
#else
unsigned short *mbuffer=(unsigned short *)buffer;
#endif
dx = x2 - x1;
dy = y2 - y1;
sx = (dx >= 0) ? 1 : -1;
sy = (dy >= 0) ? 1 : -1;
if (dx==0) {
if (dy>0) {
DrawVlineBmp(buffer, x1, y1,0, dy, color);
return;
} else if (dy<0) {
DrawVlineBmp(buffer, x1, y2,0, -dy, color);
return;
} else {
idx=x1+y1*VIRTUAL_WIDTH;
mbuffer[idx]=color;
return ;
}
}
if (dy == 0) {
if (dx>0) {
DrawHlineBmp(buffer, x1, y1, dx, 0, color);
return;
} else if (dx<0) {
DrawHlineBmp(buffer, x2, y1, -dx,0, color);
return;
}
}
dx = sx * dx + 1;
dy = sy * dy + 1;
pixx = 1;
pixy = VIRTUAL_WIDTH;
pixx *= sx;
pixy *= sy;
if (dx < dy) {
swaptmp = dx;
dx = dy;
dy = swaptmp;
swaptmp = pixx;
pixx = pixy;
pixy = swaptmp;
}
x = 0;
y = 0;
idx=x1+y1*VIRTUAL_WIDTH;
for (; x < dx; x++, idx +=pixx) {
mbuffer[idx]=color;
y += dy;
if (y >= dx) {
y -= dx;
idx += pixy;
}
}
}
/*
void DrawBox(char *buffer,box b,char t[],unsigned color){
DrawBoxBmp(mbuffer,b.x,b.y,b.dx,b.dy,color);
textCpixel(mbuffer,b.x, 3*b.x + b.dx ,b.y+2,color,1,1,4,"%s",t);
}
void DrawBoxF(char *buffer,box b,char t[],unsigned color,unsigned border){
int ydec=b.y+(b.dy/2)-4;
if(ydec<b.y+2)ydec=b.y+2;
DrawBoxBmp(mbuffer,b.x,b.y,b.dx,b.dy,border);
DrawFBoxBmp(mbuffer,b.x+1,b.y+1,b.dx-2,b.dy-2,color);
textCpixel(mbuffer,b.x, 3*b.x + b.dx , ydec ,border,1,1,4,"%s",t);
}
*/
const float DEG2RAD = 3.14159/180;
void DrawCircle(char *buf,int x, int y, int radius,unsigned rgba,int full)
{
int i;
float degInRad;
int x1,y1;
#if defined PITCH && PITCH == 4
unsigned *mbuffer=(unsigned*)buf;
#else
unsigned short *mbuffer=(unsigned short *)buf;
#endif
for ( i=0; i < 360; i++){
degInRad = i*DEG2RAD;
x1=x+cos(degInRad)*radius;
y1=y+sin(degInRad)*radius;
if(full)DrawlineBmp(buf,x,y, x1,y1,rgba);
else {
mbuffer[x1+y1*VIRTUAL_WIDTH]=rgba;
}
}
}
#ifdef FILTER16X2
//UINT16
void filter_scale2x(unsigned char *srcPtr, unsigned srcPitch,
unsigned char *dstPtr, unsigned dstPitch,
int width, int height)
{
unsigned int nextlineSrc = srcPitch / sizeof(short);
short *p = (short *)srcPtr;
unsigned int nextlineDst = dstPitch / sizeof(short);
short *q = (short *)dstPtr;
while(height--) {
int i = 0, j = 0;
for(i = 0; i < width; ++i, j += 2) {
short B = *(p + i - nextlineSrc);
short D = *(p + i - 1);
short E = *(p + i);
short F = *(p + i + 1);
short H = *(p + i + nextlineSrc);
*(q + j) = D == B && B != F && D != H ? D : E;
*(q + j + 1) = B == F && B != D && F != H ? F : E;
*(q + j + nextlineDst) = D == H && D != B && H != F ? D : E;
*(q + j + nextlineDst + 1) = H == F && D != H && B != F ? F : E;
}
p += nextlineSrc;
q += nextlineDst << 1;
}
}
#endif
#include "font2.i"
void Retro_Draw_string(char *surf, signed short int x, signed short int y, const char *string,unsigned short maxstrlen,unsigned short xscale, unsigned short yscale, unsigned fg, unsigned bg)
{
int k,strlen;
unsigned char *linesurf;
signed int ypixel;
int col, bit;
unsigned char b;
int xrepeat, yrepeat;
#if defined PITCH && PITCH == 4
unsigned *yptr;
#elif defined PITCH && PITCH == 2
unsigned short *yptr;
#elif defined PITCH && PITCH == 1
unsigned char *yptr;
#endif
#if defined PITCH && PITCH == 4
unsigned *mbuffer=(unsigned*)surf;
#elif defined PITCH && PITCH == 2
unsigned short *mbuffer=(unsigned short *)surf;
#elif defined PITCH && PITCH == 1
unsigned char *mbuffer=(unsigned char *)surf;
#endif
if(string==NULL)return;
for(strlen = 0; strlen<maxstrlen && string[strlen]; strlen++) {}
int surfw=strlen * 7 * xscale;
int surfh=8 * yscale;
#if defined PITCH && PITCH == 4
linesurf =(unsigned char *)malloc(sizeof(unsigned )*surfw*surfh );
yptr = (unsigned *)&linesurf[0];
#elif defined PITCH && PITCH == 2
linesurf =(unsigned char *)malloc(sizeof(unsigned short)*surfw*surfh );
yptr = (unsigned short *)&linesurf[0];
#elif defined PITCH && PITCH == 1
linesurf =(unsigned char *)malloc(sizeof(unsigned char)*surfw*surfh );
yptr = (unsigned char *)&linesurf[0];
#endif
for(ypixel = 0; ypixel<8; ypixel++) {
for(col=0; col<strlen; col++) {
b = font_array[(string[col]^0x80)*8 + ypixel];
for(bit=0; bit<7; bit++, yptr++) {
*yptr = (b & (1<<(7-bit))) ? fg : bg;
for(xrepeat = 1; xrepeat < xscale; xrepeat++, yptr++)
yptr[1] = *yptr;
}
}
for(yrepeat = 1; yrepeat < yscale; yrepeat++)
for(xrepeat = 0; xrepeat<surfw; xrepeat++, yptr++)
*yptr = yptr[-surfw];
}
#if defined PITCH && PITCH == 4
yptr = (unsigned *)&linesurf[0];
#elif defined PITCH && PITCH == 2
yptr = (unsigned short*)&linesurf[0];
#elif defined PITCH && PITCH == 1
yptr = (unsigned char*)&linesurf[0];
#endif
for(yrepeat = y; yrepeat < y+ surfh; yrepeat++)
for(xrepeat = x; xrepeat< x+surfw; xrepeat++,yptr++)
if(*yptr!=0)mbuffer[xrepeat+yrepeat*VIRTUAL_WIDTH] = *yptr;
free(linesurf);
}
void Draw_text(char *buffer,int x,int y,unsigned fgcol,unsigned int bgcol ,int scalex,int scaley , int max,const char *string,...)
{
int boucle=0;
char text[256];
va_list ap;
if (string == NULL)return;
va_start(ap, string);
vsprintf(text, string, ap);
va_end(ap);
Retro_Draw_string(buffer, x,y, (const char *)text,max, scalex, scaley,fgcol,bgcol);
}
+29
View File
@@ -0,0 +1,29 @@
#ifndef GRAPH_H
#define GRAPH_H 1
extern void DrawFBoxBmp(char *buffer,int x,int y,int dx,int dy,unsigned color);
extern void DrawBoxBmp(char *buffer,int x,int y,int dx,int dy,unsigned color);
extern void DrawHlineBmp(char *buffer,int x,int y,int dx,int dy,unsigned color);
extern void DrawVlineBmp(char *buffer,int x,int y,int dx,int dy,unsigned color);
extern void DrawlineBmp(char *buffer,int x1,int y1,int x2,int y2,unsigned color);
extern void DrawPointBmp(char *buffer,int x,int y,unsigned color);
/*
extern void DrawBox(void *buf,box b,char t[],unsigned color);
extern void DrawBoxF(void *buf,box b,char t[],unsigned color,unsigned border);
*/
extern void DrawCircle(char *buf,int x, int y, int radius,unsigned rgba,int full);
extern void Retro_Draw_string(char *surf, signed short int x, signed short int y, const char *string, unsigned short int maxstrlen, unsigned short int xscale, unsigned short int yscale,unsigned int fg, unsigned int bg);
extern void Draw_text(char *buffer,int x,int y,unsigned fgcol,unsigned int bgcol ,int scalex,int scaley , int max,const char *string,...);
#endif
+197
View File
@@ -0,0 +1,197 @@
/*
libco.amd64 (2009-10-12)
author: byuu
license: public domain
*/
#define LIBCO_C
#include "libco.h"
#include <assert.h>
#include <stdlib.h>
#if defined(__GNUC__) && !defined(_WIN32) && !defined(__cplusplus)
#define CO_USE_INLINE_ASM
#endif
#ifdef __cplusplus
extern "C" {
#endif
static thread_local long long co_active_buffer[64];
static thread_local cothread_t co_active_handle = 0;
#ifndef CO_USE_INLINE_ASM
static void (*co_swap)(cothread_t, cothread_t) = 0;
#else
void co_swap(cothread_t, cothread_t);
#endif
#ifdef _WIN32
//ABI: Win64
static unsigned char co_swap_function[] = {
0x48, 0x89, 0x22, /* mov [rdx],rsp */
0x48, 0x8b, 0x21, /* mov rsp,[rcx] */
0x58, /* pop rax */
0x48, 0x89, 0x6a, 0x08, /* mov [rdx+0x8],rbp */
0x48, 0x89, 0x72, 0x10, /* mov [rdx+0x10],rsi */
0x48, 0x89, 0x7a, 0x18, /* mov [rdx+0x18],rdi */
0x48, 0x89, 0x5a, 0x20, /* mov [rdx+0x20],rbx */
0x4c, 0x89, 0x62, 0x28, /* mov [rdx+0x28],r12 */
0x4c, 0x89, 0x6a, 0x30, /* mov [rdx+0x30],r13 */
0x4c, 0x89, 0x72, 0x38, /* mov [rdx+0x38],r14 */
0x4c, 0x89, 0x7a, 0x40, /* mov [rdx+0x40],r15 */
0x48, 0x81, 0xc2, 0x80, 0x00, 0x00, 0x00, /* add rdx,0x80 */
0x48, 0x83, 0xe2, 0xf0, /* and rdx,-0x10 */
0x0f, 0x29, 0x32, /* movaps [rdx],xmm6 */
0x0f, 0x29, 0x7a, 0x10, /* movaps [rdx+0x10],xmm7 */
0x44, 0x0f, 0x29, 0x42, 0x20, /* movaps [rdx+0x20],xmm8 */
0x44, 0x0f, 0x29, 0x4a, 0x30, /* movaps [rdx+0x30],xmm9 */
0x44, 0x0f, 0x29, 0x52, 0x40, /* movaps [rdx+0x40],xmm10 */
0x44, 0x0f, 0x29, 0x5a, 0x50, /* movaps [rdx+0x50],xmm11 */
0x44, 0x0f, 0x29, 0x62, 0x60, /* movaps [rdx+0x60],xmm12 */
0x44, 0x0f, 0x29, 0x6a, 0x70, /* movaps [rdx+0x70],xmm13 */
0x44, 0x0f, 0x29, 0xb2, 0x80, 0x00, 0x00, 0x00, /* movaps [rdx+0x80],xmm14 */
0x44, 0x0f, 0x29, 0xba, 0x90, 0x00, 0x00, 0x00, /* movaps [rdx+0x90],xmm15 */
0x48, 0x8b, 0x69, 0x08, /* mov rbp,[rcx+0x8] */
0x48, 0x8b, 0x71, 0x10, /* mov rsi,[rcx+0x10] */
0x48, 0x8b, 0x79, 0x18, /* mov rdi,[rcx+0x18] */
0x48, 0x8b, 0x59, 0x20, /* mov rbx,[rcx+0x20] */
0x4c, 0x8b, 0x61, 0x28, /* mov r12,[rcx+0x28] */
0x4c, 0x8b, 0x69, 0x30, /* mov r13,[rcx+0x30] */
0x4c, 0x8b, 0x71, 0x38, /* mov r14,[rcx+0x38] */
0x4c, 0x8b, 0x79, 0x40, /* mov r15,[rcx+0x40] */
0x48, 0x81, 0xc1, 0x80, 0x00, 0x00, 0x00, /* add rcx,0x80 */
0x48, 0x83, 0xe1, 0xf0, /* and rcx,-0x10 */
0x0f, 0x29, 0x31, /* movaps [rcx],xmm6 */
0x0f, 0x29, 0x79, 0x10, /* movaps [rcx+0x10],xmm7 */
0x44, 0x0f, 0x29, 0x41, 0x20, /* movaps [rcx+0x20],xmm8 */
0x44, 0x0f, 0x29, 0x49, 0x30, /* movaps [rcx+0x30],xmm9 */
0x44, 0x0f, 0x29, 0x51, 0x40, /* movaps [rcx+0x40],xmm10 */
0x44, 0x0f, 0x29, 0x59, 0x50, /* movaps [rcx+0x50],xmm11 */
0x44, 0x0f, 0x29, 0x61, 0x60, /* movaps [rcx+0x60],xmm12 */
0x44, 0x0f, 0x29, 0x69, 0x70, /* movaps [rcx+0x70],xmm13 */
0x44, 0x0f, 0x29, 0xb1, 0x80, 0x00, 0x00, 0x00, /* movaps [rcx+0x80],xmm14 */
0x44, 0x0f, 0x29, 0xb9, 0x90, 0x00, 0x00, 0x00, /* movaps [rcx+0x90],xmm15 */
0xff, 0xe0, /* jmp rax */
};
#include <windows.h>
void co_init(void)
{
DWORD old_privileges;
VirtualProtect(co_swap_function,
sizeof(co_swap_function), PAGE_EXECUTE_READWRITE, &old_privileges);
}
#else
//ABI: SystemV
#ifndef CO_USE_INLINE_ASM
static unsigned char co_swap_function[] = {
0x48, 0x89, 0x26, /* mov [rsi],rsp */
0x48, 0x8b, 0x27, /* mov rsp,[rdi] */
0x58, /* pop rax */
0x48, 0x89, 0x6e, 0x08, /* mov [rsi+0x08],rbp */
0x48, 0x89, 0x5e, 0x10, /* mov [rsi+0x10],rbx */
0x4c, 0x89, 0x66, 0x18, /* mov [rsi+0x18],r12 */
0x4c, 0x89, 0x6e, 0x20, /* mov [rsi+0x20],r13 */
0x4c, 0x89, 0x76, 0x28, /* mov [rsi+0x28],r14 */
0x4c, 0x89, 0x7e, 0x30, /* mov [rsi+0x30],r15 */
0x48, 0x8b, 0x6f, 0x08, /* mov rbp,[rdi+0x08] */
0x48, 0x8b, 0x5f, 0x10, /* mov rbx,[rdi+0x10] */
0x4c, 0x8b, 0x67, 0x18, /* mov r12,[rdi+0x18] */
0x4c, 0x8b, 0x6f, 0x20, /* mov r13,[rdi+0x20] */
0x4c, 0x8b, 0x77, 0x28, /* mov r14,[rdi+0x28] */
0x4c, 0x8b, 0x7f, 0x30, /* mov r15,[rdi+0x30] */
0xff, 0xe0, /* jmp rax */
};
#include <unistd.h>
#include <sys/mman.h>
void co_init(void)
{
unsigned long long addr = (unsigned long long)co_swap_function;
unsigned long long base = addr - (addr % sysconf(_SC_PAGESIZE));
unsigned long long size = (addr - base) + sizeof(co_swap_function);
mprotect((void*)base, size, PROT_READ | PROT_WRITE | PROT_EXEC);
}
#else
__asm__(
".intel_syntax noprefix\n"
".globl co_swap \n"
"co_swap: \n"
".globl _co_swap \n" /* OSX ABI is different from Linux. */
"_co_swap: \n"
"mov [rsi],rsp \n"
"mov [rsi+0x08],rbp \n"
"mov [rsi+0x10],rbx \n"
"mov [rsi+0x18],r12 \n"
"mov [rsi+0x20],r13 \n"
"mov [rsi+0x28],r14 \n"
"mov [rsi+0x30],r15 \n"
"mov rsp,[rdi] \n"
"mov rbp,[rdi+0x08] \n"
"mov rbx,[rdi+0x10] \n"
"mov r12,[rdi+0x18] \n"
"mov r13,[rdi+0x20] \n"
"mov r14,[rdi+0x28] \n"
"mov r15,[rdi+0x30] \n"
"ret \n"
".att_syntax \n"
);
#endif
#endif
static void crash(void)
{
assert(0); /* called only if cothread_t entrypoint returns */
}
cothread_t co_active(void)
{
if (!co_active_handle)
co_active_handle = &co_active_buffer;
return co_active_handle;
}
cothread_t co_create(unsigned int size, void (*entrypoint)(void))
{
cothread_t handle;
#ifndef CO_USE_INLINE_ASM
if(!co_swap)
{
co_init();
co_swap = (void (*)(cothread_t, cothread_t))co_swap_function;
}
#endif
if (!co_active_handle)
co_active_handle = &co_active_buffer;
size += 512; /* allocate additional space for storage */
size &= ~15; /* align stack to 16-byte boundary */
if((handle = (cothread_t)malloc(size)))
{
long long *p = (long long*)((char*)handle + size); /* seek to top of stack */
*--p = (long long)crash; /* crash if entrypoint returns */
*--p = (long long)entrypoint; /* start of function */
*(long long*)handle = (long long)p; /* stack pointer */
}
return handle;
}
void co_delete(cothread_t handle)
{
free(handle);
}
void co_switch(cothread_t handle)
{
register cothread_t co_previous_handle = co_active_handle;
co_swap(co_active_handle = handle, co_previous_handle);
}
#ifdef __cplusplus
}
#endif
+95
View File
@@ -0,0 +1,95 @@
/*
libco.armeabi (2013-04-05)
author: Themaister
license: public domain
*/
#define LIBCO_C
#include <libco.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#ifndef IOS
#include <malloc.h>
#endif
#ifdef __cplusplus
extern "C" {
#endif
static thread_local uint32_t co_active_buffer[64];
static thread_local cothread_t co_active_handle;
asm (
".arm\n"
".align 4\n"
".globl co_switch_arm\n"
".globl _co_switch_arm\n"
"co_switch_arm:\n"
"_co_switch_arm:\n"
" stmia r1!, {r4, r5, r6, r7, r8, r9, r10, r11, sp, lr}\n"
" ldmia r0!, {r4, r5, r6, r7, r8, r9, r10, r11, sp, pc}\n"
);
/* ASM */
void co_switch_arm(cothread_t handle, cothread_t current);
static void crash(void)
{
/* Called only if cothread_t entrypoint returns. */
assert(0);
}
cothread_t co_create(unsigned int size, void (*entrypoint)(void))
{
size = (size + 1023) & ~1023;
cothread_t handle = 0;
#if HAVE_POSIX_MEMALIGN >= 1
if (posix_memalign(&handle, 1024, size + 256) < 0)
return 0;
#else
handle = memalign(1024, size + 256);
#endif
if (!handle)
return handle;
uint32_t *ptr = (uint32_t*)handle;
/* Non-volatiles. */
ptr[0] = 0; /* r4 */
ptr[1] = 0; /* r5 */
ptr[2] = 0; /* r6 */
ptr[3] = 0; /* r7 */
ptr[4] = 0; /* r8 */
ptr[5] = 0; /* r9 */
ptr[6] = 0; /* r10 */
ptr[7] = 0; /* r11 */
ptr[8] = (uintptr_t)ptr + size + 256 - 4; /* r13, stack pointer */
ptr[9] = (uintptr_t)entrypoint; /* r15, PC (link register r14 gets saved here). */
return handle;
}
cothread_t co_active(void)
{
if (!co_active_handle)
co_active_handle = co_active_buffer;
return co_active_handle;
}
void co_delete(cothread_t handle)
{
free(handle);
}
void co_switch(cothread_t handle)
{
cothread_t co_previous_handle = co_active();
co_switch_arm(co_active_handle = handle, co_previous_handle);
}
#ifdef __cplusplus
}
#endif
+58
View File
@@ -0,0 +1,58 @@
/*
libco.win (2008-01-28)
authors: Nach, byuu
license: public domain
*/
#define LIBCO_C
#include <libco.h>
#define WINVER 0x0400
#define _WIN32_WINNT 0x0400
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#ifdef __cplusplus
extern "C" {
#endif
static thread_local cothread_t co_active_ = 0;
static void __stdcall co_thunk(void *coentry)
{
((void (*)(void))coentry)();
}
cothread_t co_active(void)
{
if(!co_active_)
{
ConvertThreadToFiber(0);
co_active_ = GetCurrentFiber();
}
return co_active_;
}
cothread_t co_create(unsigned int heapsize, void (*coentry)(void))
{
if(!co_active_)
{
ConvertThreadToFiber(0);
co_active_ = GetCurrentFiber();
}
return (cothread_t)CreateFiber(heapsize, co_thunk, (void*)coentry);
}
void co_delete(cothread_t cothread)
{
DeleteFiber(cothread);
}
void co_switch(cothread_t cothread)
{
co_active_ = cothread;
SwitchToFiber(cothread);
}
#ifdef __cplusplus
}
#endif
+21
View File
@@ -0,0 +1,21 @@
/*
libco
auto-selection module
license: public domain
*/
#if defined(__GNUC__) && defined(__i386__) || (defined(_MSC_VER) && defined(_M_IX86))
#include "x86.c"
#elif defined(__GNUC__) && defined(__amd64__) || (defined(_MSC_VER) && defined(_M_AMD64))
#include "amd64.c"
#elif defined(__GNUC__) && defined(_ARCH_PPC)
#include "ppc.c"
#elif defined(__GNUC__) && (defined(__ARM_EABI__) || defined(__arm__))
#include "armeabi.c"
#elif defined(__GNUC__)
#include "sjlj.c"
#elif defined(_MSC_VER)
#include "fiber.c"
#else
#error "libco: unsupported processor, compiler or operating system"
#endif
+34
View File
@@ -0,0 +1,34 @@
/*
libco
version: 0.16 (2010-12-24)
license: public domain
*/
#ifndef LIBCO_H
#define LIBCO_H
#ifdef LIBCO_C
#ifdef LIBCO_MP
#define thread_local __thread
#else
#define thread_local
#endif
#endif
#ifdef __cplusplus
extern "C" {
#endif
typedef void* cothread_t;
cothread_t co_active();
cothread_t co_create(unsigned int, void (*)(void));
void co_delete(cothread_t);
void co_switch(cothread_t);
#ifdef __cplusplus
}
#endif
/* ifndef LIBCO_H */
#endif
+407
View File
@@ -0,0 +1,407 @@
/*
libco.ppc (2010-10-17)
author: blargg
license: public domain
*/
/* PowerPC 32/64 using embedded or external asm, with optional
floating-point and AltiVec save/restore */
#define LIBCO_C
#include <libco.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#define LIBCO_MPROTECT (__unix__ && !LIBCO_PPC_ASM)
#if LIBCO_MPROTECT
#include <unistd.h>
#include <sys/mman.h>
#endif
/* State format (offsets in 32-bit words)
+0 Pointer to swap code
Rest of function descriptor for entry function
+8 PC
+10 SP
Special regs
GPRs
FPRs
VRs
stack
*/
enum { state_size = 1024 };
enum { above_stack = 2048 };
enum { stack_align = 256 };
static thread_local cothread_t co_active_handle = 0;
/**** Determine environment ****/
#define LIBCO_PPC64 (_ARCH_PPC64 || __PPC64__ || __ppc64__ || __powerpc64__)
/* Whether function calls are indirect through a descriptor,
or are directly to function */
#ifndef LIBCO_PPCDESC
#if !_CALL_SYSV && (_CALL_AIX || _CALL_AIXDESC || LIBCO_PPC64)
#define LIBCO_PPCDESC 1
#endif
#endif
#ifdef LIBCO_PPC_ASM
#ifdef __cplusplus
extern "C"
#endif
/* Swap code is in ppc.S */
void co_swap_asm( cothread_t, cothread_t );
#define CO_SWAP_ASM( x, y ) co_swap_asm( x, y )
#else
/* Swap code is here in array. Please leave dieassembly comments,
as they make it easy to see what it does, and reorder instructions
if one wants to see whether that improves performance. */
static const uint32_t libco_ppc_code [] = {
#if LIBCO_PPC64
0x7d000026, /* mfcr r8 */
0xf8240028, /* std r1,40(r4) */
0x7d2802a6, /* mflr r9 */
0xf9c40048, /* std r14,72(r4) */
0xf9e40050, /* std r15,80(r4) */
0xfa040058, /* std r16,88(r4) */
0xfa240060, /* std r17,96(r4) */
0xfa440068, /* std r18,104(r4) */
0xfa640070, /* std r19,112(r4) */
0xfa840078, /* std r20,120(r4) */
0xfaa40080, /* std r21,128(r4) */
0xfac40088, /* std r22,136(r4) */
0xfae40090, /* std r23,144(r4) */
0xfb040098, /* std r24,152(r4) */
0xfb2400a0, /* std r25,160(r4) */
0xfb4400a8, /* std r26,168(r4) */
0xfb6400b0, /* std r27,176(r4) */
0xfb8400b8, /* std r28,184(r4) */
0xfba400c0, /* std r29,192(r4) */
0xfbc400c8, /* std r30,200(r4) */
0xfbe400d0, /* std r31,208(r4) */
0xf9240020, /* std r9,32(r4) */
0xe8e30020, /* ld r7,32(r3) */
0xe8230028, /* ld r1,40(r3) */
0x48000009, /* bl 1 */
0x7fe00008, /* trap */
0x91040030,/*1:stw r8,48(r4) */
0x80c30030, /* lwz r6,48(r3) */
0x7ce903a6, /* mtctr r7 */
0xe9c30048, /* ld r14,72(r3) */
0xe9e30050, /* ld r15,80(r3) */
0xea030058, /* ld r16,88(r3) */
0xea230060, /* ld r17,96(r3) */
0xea430068, /* ld r18,104(r3) */
0xea630070, /* ld r19,112(r3) */
0xea830078, /* ld r20,120(r3) */
0xeaa30080, /* ld r21,128(r3) */
0xeac30088, /* ld r22,136(r3) */
0xeae30090, /* ld r23,144(r3) */
0xeb030098, /* ld r24,152(r3) */
0xeb2300a0, /* ld r25,160(r3) */
0xeb4300a8, /* ld r26,168(r3) */
0xeb6300b0, /* ld r27,176(r3) */
0xeb8300b8, /* ld r28,184(r3) */
0xeba300c0, /* ld r29,192(r3) */
0xebc300c8, /* ld r30,200(r3) */
0xebe300d0, /* ld r31,208(r3) */
0x7ccff120, /* mtcr r6 */
#else
0x7d000026, /* mfcr r8 */
0x90240028, /* stw r1,40(r4) */
0x7d2802a6, /* mflr r9 */
0x91a4003c, /* stw r13,60(r4) */
0x91c40040, /* stw r14,64(r4) */
0x91e40044, /* stw r15,68(r4) */
0x92040048, /* stw r16,72(r4) */
0x9224004c, /* stw r17,76(r4) */
0x92440050, /* stw r18,80(r4) */
0x92640054, /* stw r19,84(r4) */
0x92840058, /* stw r20,88(r4) */
0x92a4005c, /* stw r21,92(r4) */
0x92c40060, /* stw r22,96(r4) */
0x92e40064, /* stw r23,100(r4) */
0x93040068, /* stw r24,104(r4) */
0x9324006c, /* stw r25,108(r4) */
0x93440070, /* stw r26,112(r4) */
0x93640074, /* stw r27,116(r4) */
0x93840078, /* stw r28,120(r4) */
0x93a4007c, /* stw r29,124(r4) */
0x93c40080, /* stw r30,128(r4) */
0x93e40084, /* stw r31,132(r4) */
0x91240020, /* stw r9,32(r4) */
0x80e30020, /* lwz r7,32(r3) */
0x80230028, /* lwz r1,40(r3) */
0x48000009, /* bl 1 */
0x7fe00008, /* trap */
0x91040030,/*1:stw r8,48(r4) */
0x80c30030, /* lwz r6,48(r3) */
0x7ce903a6, /* mtctr r7 */
0x81a3003c, /* lwz r13,60(r3) */
0x81c30040, /* lwz r14,64(r3) */
0x81e30044, /* lwz r15,68(r3) */
0x82030048, /* lwz r16,72(r3) */
0x8223004c, /* lwz r17,76(r3) */
0x82430050, /* lwz r18,80(r3) */
0x82630054, /* lwz r19,84(r3) */
0x82830058, /* lwz r20,88(r3) */
0x82a3005c, /* lwz r21,92(r3) */
0x82c30060, /* lwz r22,96(r3) */
0x82e30064, /* lwz r23,100(r3) */
0x83030068, /* lwz r24,104(r3) */
0x8323006c, /* lwz r25,108(r3) */
0x83430070, /* lwz r26,112(r3) */
0x83630074, /* lwz r27,116(r3) */
0x83830078, /* lwz r28,120(r3) */
0x83a3007c, /* lwz r29,124(r3) */
0x83c30080, /* lwz r30,128(r3) */
0x83e30084, /* lwz r31,132(r3) */
0x7ccff120, /* mtcr r6 */
#endif
#ifndef LIBCO_PPC_NOFP
0xd9c400e0, /* stfd f14,224(r4) */
0xd9e400e8, /* stfd f15,232(r4) */
0xda0400f0, /* stfd f16,240(r4) */
0xda2400f8, /* stfd f17,248(r4) */
0xda440100, /* stfd f18,256(r4) */
0xda640108, /* stfd f19,264(r4) */
0xda840110, /* stfd f20,272(r4) */
0xdaa40118, /* stfd f21,280(r4) */
0xdac40120, /* stfd f22,288(r4) */
0xdae40128, /* stfd f23,296(r4) */
0xdb040130, /* stfd f24,304(r4) */
0xdb240138, /* stfd f25,312(r4) */
0xdb440140, /* stfd f26,320(r4) */
0xdb640148, /* stfd f27,328(r4) */
0xdb840150, /* stfd f28,336(r4) */
0xdba40158, /* stfd f29,344(r4) */
0xdbc40160, /* stfd f30,352(r4) */
0xdbe40168, /* stfd f31,360(r4) */
0xc9c300e0, /* lfd f14,224(r3) */
0xc9e300e8, /* lfd f15,232(r3) */
0xca0300f0, /* lfd f16,240(r3) */
0xca2300f8, /* lfd f17,248(r3) */
0xca430100, /* lfd f18,256(r3) */
0xca630108, /* lfd f19,264(r3) */
0xca830110, /* lfd f20,272(r3) */
0xcaa30118, /* lfd f21,280(r3) */
0xcac30120, /* lfd f22,288(r3) */
0xcae30128, /* lfd f23,296(r3) */
0xcb030130, /* lfd f24,304(r3) */
0xcb230138, /* lfd f25,312(r3) */
0xcb430140, /* lfd f26,320(r3) */
0xcb630148, /* lfd f27,328(r3) */
0xcb830150, /* lfd f28,336(r3) */
0xcba30158, /* lfd f29,344(r3) */
0xcbc30160, /* lfd f30,352(r3) */
0xcbe30168, /* lfd f31,360(r3) */
#endif
#ifdef __ALTIVEC__
0x7ca042a6, /* mfvrsave r5 */
0x39040180, /* addi r8,r4,384 */
0x39240190, /* addi r9,r4,400 */
0x70a00fff, /* andi. r0,r5,4095 */
0x90a40034, /* stw r5,52(r4) */
0x4182005c, /* beq- 2 */
0x7e8041ce, /* stvx v20,r0,r8 */
0x39080020, /* addi r8,r8,32 */
0x7ea049ce, /* stvx v21,r0,r9 */
0x39290020, /* addi r9,r9,32 */
0x7ec041ce, /* stvx v22,r0,r8 */
0x39080020, /* addi r8,r8,32 */
0x7ee049ce, /* stvx v23,r0,r9 */
0x39290020, /* addi r9,r9,32 */
0x7f0041ce, /* stvx v24,r0,r8 */
0x39080020, /* addi r8,r8,32 */
0x7f2049ce, /* stvx v25,r0,r9 */
0x39290020, /* addi r9,r9,32 */
0x7f4041ce, /* stvx v26,r0,r8 */
0x39080020, /* addi r8,r8,32 */
0x7f6049ce, /* stvx v27,r0,r9 */
0x39290020, /* addi r9,r9,32 */
0x7f8041ce, /* stvx v28,r0,r8 */
0x39080020, /* addi r8,r8,32 */
0x7fa049ce, /* stvx v29,r0,r9 */
0x39290020, /* addi r9,r9,32 */
0x7fc041ce, /* stvx v30,r0,r8 */
0x7fe049ce, /* stvx v31,r0,r9 */
0x80a30034,/*2:lwz r5,52(r3) */
0x39030180, /* addi r8,r3,384 */
0x39230190, /* addi r9,r3,400 */
0x70a00fff, /* andi. r0,r5,4095 */
0x7ca043a6, /* mtvrsave r5 */
0x4d820420, /* beqctr */
0x7e8040ce, /* lvx v20,r0,r8 */
0x39080020, /* addi r8,r8,32 */
0x7ea048ce, /* lvx v21,r0,r9 */
0x39290020, /* addi r9,r9,32 */
0x7ec040ce, /* lvx v22,r0,r8 */
0x39080020, /* addi r8,r8,32 */
0x7ee048ce, /* lvx v23,r0,r9 */
0x39290020, /* addi r9,r9,32 */
0x7f0040ce, /* lvx v24,r0,r8 */
0x39080020, /* addi r8,r8,32 */
0x7f2048ce, /* lvx v25,r0,r9 */
0x39290020, /* addi r9,r9,32 */
0x7f4040ce, /* lvx v26,r0,r8 */
0x39080020, /* addi r8,r8,32 */
0x7f6048ce, /* lvx v27,r0,r9 */
0x39290020, /* addi r9,r9,32 */
0x7f8040ce, /* lvx v28,r0,r8 */
0x39080020, /* addi r8,r8,32 */
0x7fa048ce, /* lvx v29,r0,r9 */
0x39290020, /* addi r9,r9,32 */
0x7fc040ce, /* lvx v30,r0,r8 */
0x7fe048ce, /* lvx v31,r0,r9 */
#endif
0x4e800420, /* bctr */
};
#if LIBCO_PPCDESC
/* Function call goes through indirect descriptor */
#define CO_SWAP_ASM( x, y ) \
((void (*)( cothread_t, cothread_t )) (uintptr_t) x)( x, y )
#else
/* Function call goes directly to code */
#define CO_SWAP_ASM( x, y ) \
((void (*)( cothread_t, cothread_t )) (uintptr_t) libco_ppc_code)( x, y )
#endif
#endif
static uint32_t* co_create_( unsigned size, uintptr_t entry )
{
uint32_t* t = (uint32_t*) malloc( size );
(void) entry;
#if LIBCO_PPCDESC
if ( t )
{
/* Copy entry's descriptor */
memcpy( t, (void*) entry, sizeof (void*) * 3 );
/* Set function pointer to swap routine */
#ifdef LIBCO_PPC_ASM
*(const void**) t = *(void**) &co_swap_asm;
#else
*(const void**) t = libco_ppc_code;
#endif
}
#endif
return t;
}
cothread_t co_create( unsigned int size, void (*entry_)( void ) )
{
uintptr_t entry = (uintptr_t) entry_;
uint32_t* t = NULL;
/* Be sure main thread was successfully allocated */
if ( co_active() )
{
size += state_size + above_stack + stack_align;
t = co_create_( size, entry );
}
if ( t )
{
uintptr_t sp;
int shift;
/* Save current registers into new thread, so that any special ones will
have proper values when thread is begun */
CO_SWAP_ASM( t, t );
#if LIBCO_PPCDESC
/* Get real address */
entry = (uintptr_t) *(void**) entry;
#endif
/* Put stack near end of block, and align */
sp = (uintptr_t) t + size - above_stack;
sp -= sp % stack_align;
/* On PPC32, we save and restore GPRs as 32 bits. For PPC64, we
save and restore them as 64 bits, regardless of the size the ABI
uses. So, we manually write pointers at the proper size. We always
save and restore at the same address, and since PPC is big-endian,
we must put the low byte first on PPC32. */
/* If uintptr_t is 32 bits, >>32 is undefined behavior, so we do two shifts
and don't have to care how many bits uintptr_t is. */
#if LIBCO_PPC64
shift = 16;
#else
shift = 0;
#endif
/* Set up so entry will be called on next swap */
t [8] = (uint32_t) (entry >> shift >> shift);
t [9] = (uint32_t) entry;
t [10] = (uint32_t) (sp >> shift >> shift);
t [11] = (uint32_t) sp;
}
return t;
}
void co_delete( cothread_t t )
{
free(t);
}
static void co_init_( void )
{
#if LIBCO_MPROTECT
/* TODO: pre- and post-pad PPC code so that this doesn't make other
data executable and writable */
long page_size = sysconf( _SC_PAGESIZE );
if ( page_size > 0 )
{
uintptr_t align = page_size;
uintptr_t begin = (uintptr_t) libco_ppc_code;
uintptr_t end = begin + sizeof libco_ppc_code;
/* Align beginning and end */
end += align - 1;
end -= end % align;
begin -= begin % align;
mprotect( (void*) begin, end - begin, PROT_READ | PROT_WRITE | PROT_EXEC );
}
#endif
co_active_handle = co_create_( state_size, (uintptr_t) &co_switch );
}
cothread_t co_active(void)
{
if (!co_active_handle)
co_init_();
return co_active_handle;
}
void co_switch(cothread_t t)
{
cothread_t old = co_active_handle;
co_active_handle = t;
CO_SWAP_ASM( t, old );
}
+115
View File
@@ -0,0 +1,115 @@
/*
libco.sjlj (2008-01-28)
author: Nach
license: public domain
*/
/*
* Note this was designed for UNIX systems. Based on ideas expressed in a paper
* by Ralf Engelschall.
* For SJLJ on other systems, one would want to rewrite springboard() and
* co_create() and hack the jmb_buf stack pointer.
*/
#define LIBCO_C
#include <libco.h>
#include <stdlib.h>
#include <signal.h>
#include <setjmp.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef struct
{
sigjmp_buf context;
void (*coentry)(void);
void *stack;
} cothread_struct;
static thread_local cothread_struct co_primary;
static thread_local cothread_struct *creating, *co_running = 0;
static void springboard(int ignored)
{
if(sigsetjmp(creating->context, 0))
co_running->coentry();
}
cothread_t co_active(void)
{
if (!co_running)
co_running = &co_primary;
return (cothread_t)co_running;
}
cothread_t co_create(unsigned int size, void (*coentry)(void))
{
if(!co_running)
co_running = &co_primary;
cothread_struct *thread = (cothread_struct*)malloc(sizeof(cothread_struct));
if(thread)
{
struct sigaction handler;
struct sigaction old_handler;
stack_t stack;
stack_t old_stack;
thread->coentry = thread->stack = 0;
stack.ss_flags = 0;
stack.ss_size = size;
thread->stack = stack.ss_sp = malloc(size);
if(stack.ss_sp && !sigaltstack(&stack, &old_stack))
{
handler.sa_handler = springboard;
handler.sa_flags = SA_ONSTACK;
sigemptyset(&handler.sa_mask);
creating = thread;
if(!sigaction(SIGUSR1, &handler, &old_handler))
{
if(!raise(SIGUSR1))
thread->coentry = coentry;
sigaltstack(&old_stack, 0);
sigaction(SIGUSR1, &old_handler, 0);
}
}
if(thread->coentry != coentry)
{
co_delete(thread);
thread = 0;
}
}
return (cothread_t)thread;
}
void co_delete(cothread_t cothread)
{
if(cothread)
{
if(((cothread_struct*)cothread)->stack)
free(((cothread_struct*)cothread)->stack);
free(cothread);
}
}
void co_switch(cothread_t cothread)
{
if(!sigsetjmp(co_running->context, 0))
{
co_running = (cothread_struct*)cothread;
siglongjmp(co_running->context, 1);
}
}
#ifdef __cplusplus
}
#endif
+81
View File
@@ -0,0 +1,81 @@
/*
libco.ucontext (2008-01-28)
author: Nach
license: public domain
*/
/*
* WARNING: the overhead of POSIX ucontext is very high,
* assembly versions of libco or libco_sjlj should be much faster
*
* This library only exists for two reasons:
* 1 - as an initial test for the viability of a ucontext implementation
* 2 - to demonstrate the power and speed of libco over existing implementations,
* such as pth (which defaults to wrapping ucontext on unix targets)
*
* Use this library only as a *last resort*
*/
#define LIBCO_C
#include <libco.h>
#include <stdlib.h>
#include <ucontext.h>
#ifdef __cplusplus
extern "C" {
#endif
static thread_local ucontext_t co_primary;
static thread_local ucontext_t *co_running = 0;
cothread_t co_active(void)
{
if (!co_running)
co_running = &co_primary;
return (cothread_t)co_running;
}
cothread_t co_create(unsigned int heapsize, void (*coentry)(void))
{
if (!co_running)
co_running = &co_primary;
ucontext_t *thread = (ucontext_t*)malloc(sizeof(ucontext_t));
if(thread)
{
if((!getcontext(thread) && !(thread->uc_stack.ss_sp = 0)) && (thread->uc_stack.ss_sp = malloc(heapsize)))
{
thread->uc_link = co_running;
thread->uc_stack.ss_size = heapsize;
makecontext(thread, coentry, 0);
}
else
{
co_delete((cothread_t)thread);
thread = 0;
}
}
return (cothread_t)thread;
}
void co_delete(cothread_t cothread)
{
if (!cothread)
return;
if(((ucontext_t*)cothread)->uc_stack.ss_sp)
free(((ucontext_t*)cothread)->uc_stack.ss_sp);
free(cothread);
}
void co_switch(cothread_t cothread)
{
ucontext_t *old_thread = co_running;
co_running = (ucontext_t*)cothread;
swapcontext(old_thread, co_running);
}
#ifdef __cplusplus
}
#endif
+117
View File
@@ -0,0 +1,117 @@
/*
libco.x86 (2009-10-12)
author: byuu
license: public domain
*/
#define LIBCO_C
#include <libco.h>
#include <assert.h>
#include <stdlib.h>
#ifdef __cplusplus
extern "C" {
#endif
#if defined(_MSC_VER)
#define fastcall __fastcall
#elif defined(__GNUC__)
#define fastcall __attribute__((fastcall))
#else
#error "libco: please define fastcall macro"
#endif
static thread_local long co_active_buffer[64];
static thread_local cothread_t co_active_handle = 0;
static void (fastcall *co_swap)(cothread_t, cothread_t) = 0;
//ABI: fastcall
static unsigned char co_swap_function[] = {
0x89, 0x22, /* mov [edx],esp */
0x8b, 0x21, /* mov esp,[ecx] */
0x58, /* pop eax */
0x89, 0x6a, 0x04, /* mov [edx+0x04],ebp */
0x89, 0x72, 0x08, /* mov [edx+0x08],esi */
0x89, 0x7a, 0x0c, /* mov [edx+0x0c],edi */
0x89, 0x5a, 0x10, /* mov [edx+0x10],ebx */
0x8b, 0x69, 0x04, /* mov ebp,[ecx+0x04] */
0x8b, 0x71, 0x08, /* mov esi,[ecx+0x08] */
0x8b, 0x79, 0x0c, /* mov edi,[ecx+0x0c] */
0x8b, 0x59, 0x10, /* mov ebx,[ecx+0x10] */
0xff, 0xe0, /* jmp eax */
};
#ifdef _WIN32
#include <windows.h>
void co_init(void)
{
DWORD old_privileges;
VirtualProtect(co_swap_function,
sizeof co_swap_function, PAGE_EXECUTE_READWRITE, &old_privileges);
}
#else
#include <unistd.h>
#include <sys/mman.h>
void co_init(void)
{
unsigned long addr = (unsigned long)co_swap_function;
unsigned long base = addr - (addr % sysconf(_SC_PAGESIZE));
unsigned long size = (addr - base) + sizeof co_swap_function;
mprotect((void*)base, size, PROT_READ | PROT_WRITE | PROT_EXEC);
}
#endif
static void crash(void)
{
assert(0); /* called only if cothread_t entrypoint returns */
}
cothread_t co_active(void)
{
if(!co_active_handle)
co_active_handle = &co_active_buffer;
return co_active_handle;
}
cothread_t co_create(unsigned int size, void (*entrypoint)(void))
{
cothread_t handle;
if(!co_swap)
{
co_init();
co_swap = (void (fastcall*)(cothread_t, cothread_t))co_swap_function;
}
if(!co_active_handle)
co_active_handle = &co_active_buffer;
size += 256; /* allocate additional space for storage */
size &= ~15; /* align stack to 16-byte boundary */
if((handle = (cothread_t)malloc(size)))
{
long *p = (long*)((char*)handle + size); /* seek to top of stack */
*--p = (long)crash; /* crash if entrypoint returns */
*--p = (long)entrypoint; /* start of function */
*(long*)handle = (long)p; /* stack pointer */
}
return handle;
}
void co_delete(cothread_t handle)
{
free(handle);
}
void co_switch(cothread_t handle)
{
register cothread_t co_previous_handle = co_active_handle;
co_swap(co_active_handle = handle, co_previous_handle);
}
#ifdef __cplusplus
}
#endif
+465
View File
@@ -0,0 +1,465 @@
#include "libretro.h"
#include "libretro-core.h"
cothread_t mainThread;
cothread_t emuThread;
int CROP_WIDTH;
int CROP_HEIGHT;
int VIRTUAL_WIDTH;
int retrow=400;
int retroh=300;
#define RETRO_DEVICE_ATARI_KEYBOARD RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_KEYBOARD, 0)
#define RETRO_DEVICE_ATARI_JOYSTICK RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_JOYPAD, 1)
unsigned atari_devices[ 2 ];
int autorun=0;
int RETROJOY=0,RETROPT0=0,RETROSTATUS=0,RETRODRVTYPE=0;
int retrojoy_init=0,retro_ui_finalized=0;
int retro_sound_finalized=0;
extern int SHIFTON,pauseg,SND ,snd_sampler_pal;
extern short signed int SNDBUF[1024*2];
extern char RPATH[512];
extern char RETRO_DIR[512];
int cap32_statusbar=0;
#include "cmdline.c"
extern void update_input(void);
extern void texture_init(void);
extern void texture_uninit(void);
extern void Emu_init();
extern void Emu_uninit();
extern void input_gui(void);
const char *retro_save_directory;
const char *retro_system_directory;
const char *retro_content_directory;
char retro_system_data_directory[512];;
static retro_video_refresh_t video_cb;
static retro_audio_sample_t audio_cb;
static retro_audio_sample_batch_t audio_batch_cb;
static retro_environment_t environ_cb;
void retro_set_environment(retro_environment_t cb)
{
environ_cb = cb;
static const struct retro_controller_description p1_controllers[] = {
{ "ATARI Joystick", RETRO_DEVICE_ATARI_JOYSTICK },
{ "ATARI Keyboard", RETRO_DEVICE_ATARI_KEYBOARD },
};
static const struct retro_controller_description p2_controllers[] = {
{ "ATARI Joystick", RETRO_DEVICE_ATARI_JOYSTICK },
{ "ATARI Keyboard", RETRO_DEVICE_ATARI_KEYBOARD },
};
static const struct retro_controller_info ports[] = {
{ p1_controllers, 2 }, // port 1
{ p2_controllers, 2 }, // port 2
{ NULL, 0 }
};
cb( RETRO_ENVIRONMENT_SET_CONTROLLER_INFO, (void*)ports );
struct retro_variable variables[] = {
{
"atari800_opt1",
"Option 1; disabled|enabled" ,
},
{
"atari800_resolution",
"Internal resolution; 336x240|320x240|384x240|384x272|384x288|400x300",
},
{ NULL, NULL },
};
cb(RETRO_ENVIRONMENT_SET_VARIABLES, variables);
}
static void update_variables(void)
{
struct retro_variable var;
var.key = "atari800_opt1";
var.value = NULL;
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
{
if (strcmp(var.value, "enabled") == 0)
autorun = 1;
}
var.key = "atari800_resolution";
var.value = NULL;
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
{
char *pch;
char str[100];
snprintf(str, sizeof(str), var.value);
pch = strtok(str, "x");
if (pch)
retrow = strtoul(pch, NULL, 0);
pch = strtok(NULL, "x");
if (pch)
retroh = strtoul(pch, NULL, 0);
fprintf(stderr, "[libretro-vice]: Got size: %u x %u.\n", retrow, retroh);
CROP_WIDTH =retrow;
CROP_HEIGHT= (retroh-80);
VIRTUAL_WIDTH = retrow;
texture_init();
//reset_screen();
}
}
static void retro_wrap_emulator()
{
LOGI("WRAP EMU THD\n");
pre_main(RPATH);
LOGI("EXIT EMU THD\n");
pauseg=-1;
//environ_cb(RETRO_ENVIRONMENT_SHUTDOWN, 0);
// Were done here
co_switch(mainThread);
// Dead emulator, but libco says not to return
while(true)
{
LOGI("Running a dead emulator.");
co_switch(mainThread);
}
}
void Emu_init(){
#ifdef RETRO_AND
MOUSEMODE=1;
#endif
// update_variables();
memset(Key_Sate,0,512);
memset(Key_Sate2,0,512);
if(!emuThread && !mainThread)
{
mainThread = co_active();
emuThread = co_create(65536*sizeof(void*), retro_wrap_emulator);
}
update_variables();
}
void Emu_uninit(){
texture_uninit();
}
void retro_shutdown_core(void)
{
LOGI("SHUTDOWN\n");
texture_uninit();
environ_cb(RETRO_ENVIRONMENT_SHUTDOWN, NULL);
}
void retro_reset(void){
}
void retro_init(void)
{
const char *system_dir = NULL;
if (environ_cb(RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY, &system_dir) && system_dir)
{
// if defined, use the system directory
retro_system_directory=system_dir;
}
const char *content_dir = NULL;
if (environ_cb(RETRO_ENVIRONMENT_GET_CONTENT_DIRECTORY, &content_dir) && content_dir)
{
// if defined, use the system directory
retro_content_directory=content_dir;
}
const char *save_dir = NULL;
if (environ_cb(RETRO_ENVIRONMENT_GET_SAVE_DIRECTORY, &save_dir) && save_dir)
{
// If save directory is defined use it, otherwise use system directory
retro_save_directory = *save_dir ? save_dir : retro_system_directory;
}
else
{
// make retro_save_directory the same in case RETRO_ENVIRONMENT_GET_SAVE_DIRECTORY is not implemented by the frontend
retro_save_directory=retro_system_directory;
}
if(retro_system_directory==NULL)sprintf(RETRO_DIR, "%s\0",".");
else sprintf(RETRO_DIR, "%s\0", retro_system_directory);
sprintf(retro_system_data_directory, "%s/data\0",RETRO_DIR);
LOGI("Retro SYSTEM_DIRECTORY %s\n",retro_system_directory);
LOGI("Retro SAVE_DIRECTORY %s\n",retro_save_directory);
LOGI("Retro CONTENT_DIRECTORY %s\n",retro_content_directory);
#ifndef RENDER16B
enum retro_pixel_format fmt =RETRO_PIXEL_FORMAT_XRGB8888;
#else
enum retro_pixel_format fmt = RETRO_PIXEL_FORMAT_RGB565;
#endif
if (!environ_cb(RETRO_ENVIRONMENT_SET_PIXEL_FORMAT, &fmt))
{
fprintf(stderr, "PIXEL FORMAT is not supported.\n");
LOGI("PIXEL FORMAT is not supported.\n");
exit(0);
}
struct retro_input_descriptor inputDescriptors[] = {
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A, "A" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "B" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X, "X" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "Y" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT, "Select" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Start" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "Right" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "Left" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP, "Up" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "Down" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R, "R" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L, "L" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R2, "R2" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L2, "L2" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R3, "R3" },
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L3, "L3" }
};
environ_cb(RETRO_ENVIRONMENT_SET_INPUT_DESCRIPTORS, &inputDescriptors);
Emu_init();
texture_init();
}
extern void main_exit();
void retro_deinit(void)
{
Emu_uninit();
co_switch(emuThread);
LOGI("exit emu\n");
// main_exit();
co_switch(mainThread);
LOGI("exit main\n");
if(emuThread)
{
co_delete(emuThread);
emuThread = 0;
}
LOGI("Retro DeInit\n");
}
unsigned retro_api_version(void)
{
return RETRO_API_VERSION;
}
void retro_set_controller_port_device( unsigned port, unsigned device )
{
if ( port < 2 )
{
atari_devices[ port ] = device;
printf(" port(%d)=%d \n",port,device);
}
}
void retro_get_system_info(struct retro_system_info *info)
{
memset(info, 0, sizeof(*info));
info->library_name = "Atari800";
info->library_version = "3.1.0";
info->valid_extensions = "xfd|atr|cdm|cas|bin|a52|zip";
info->need_fullpath = true;
info->block_extract = false;
}
void retro_get_system_av_info(struct retro_system_av_info *info)
{
//FIXME handle vice PAL/NTSC
struct retro_game_geometry geom = { retrow, retroh, 400, 300,4.0 / 3.0 };
struct retro_system_timing timing = { 50.0, 44100.0 };
info->geometry = geom;
info->timing = timing;
}
void retro_set_audio_sample(retro_audio_sample_t cb)
{
audio_cb = cb;
}
void retro_set_audio_sample_batch(retro_audio_sample_batch_t cb)
{
audio_batch_cb = cb;
}
void retro_set_video_refresh(retro_video_refresh_t cb)
{
video_cb = cb;
}
void retro_audio_cb( short l, short r)
{
audio_cb(l,r);
}
void retro_run(void)
{
int x;
bool updated = false;
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE_UPDATE, &updated) && updated)
update_variables();
if(pauseg==0){
if(retro_sound_finalized)retro_sound_update();
Retro_PollEvent();
}
video_cb(Retro_Screen,retrow,retroh,retrow<<PIXEL_BYTES);
co_switch(emuThread);
}
unsigned int lastdown,lastup,lastchar;
static void keyboard_cb(bool down, unsigned keycode,
uint32_t character, uint16_t mod)
{
/*
printf( "Down: %s, Code: %d, Char: %u, Mod: %u.\n",
down ? "yes" : "no", keycode, character, mod);
*/
/*
if(down)lastdown=keycode;
else lastup=keycode;
lastchar=character;
*/
}
bool retro_load_game(const struct retro_game_info *info)
{
const char *full_path;
(void)info;
struct retro_keyboard_callback cb = { keyboard_cb };
environ_cb(RETRO_ENVIRONMENT_SET_KEYBOARD_CALLBACK, &cb);
full_path = info->path;
strcpy(RPATH,full_path);
update_variables();
#ifdef RENDER16B
memset(Retro_Screen,0,400*300*2);
#else
memset(Retro_Screen,0,400*300*2*2);
#endif
memset(SNDBUF,0,1024*2*2);
co_switch(emuThread);
return true;
}
void retro_unload_game(void){
pauseg=-1;
}
unsigned retro_get_region(void)
{
return RETRO_REGION_NTSC;
}
bool retro_load_game_special(unsigned type, const struct retro_game_info *info, size_t num)
{
(void)type;
(void)info;
(void)num;
return false;
}
size_t retro_serialize_size(void)
{
return 0;
}
bool retro_serialize(void *data_, size_t size)
{
return false;
}
bool retro_unserialize(const void *data_, size_t size)
{
return false;
}
void *retro_get_memory_data(unsigned id)
{
(void)id;
return NULL;
}
size_t retro_get_memory_size(unsigned id)
{
(void)id;
return 0;
}
void retro_cheat_reset(void) {}
void retro_cheat_set(unsigned index, bool enabled, const char *code)
{
(void)index;
(void)enabled;
(void)code;
}
+74
View File
@@ -0,0 +1,74 @@
#ifndef LIBRETRO_CORE_H
#define LIBRETRO_CORE_H 1
#include <stdint.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#define TEX_WIDTH 400
#define TEX_HEIGHT 300
#define UINT16 uint16_t
#define UINT32 uint32_t
#define RENDER16B
#ifdef RENDER16B
extern uint16_t Retro_Screen[400*300];
#define PIXEL_BYTES 1
#define PIXEL_TYPE UINT16
#define PITCH 2
#else
extern unsigned int Retro_Screen[400*300];
#define PIXEL_BYTES 2
#define PIXEL_TYPE UINT32
#define PITCH 4
#endif
#define WINDOW_WIDTH 400
#define WINDOW_HEIGHT 300
#include "libco/libco.h"
extern cothread_t mainThread;
extern cothread_t emuThread;
extern char Key_Sate[512];
extern char Key_Sate2[512];
extern int pauseg;
#if defined(__ANDROID__) || defined(ANDROID)
#include <android/log.h>
#define LOG_TAG "RetroArch.Vice"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#else
#define LOGI printf
#endif
#define NPLGN 12
#define NLIGN 5
#define NLETT 5
#define XSIDE (CROP_WIDTH/NPLGN -1)
#define YSIDE (CROP_HEIGHT/8 -1)
#define YBASE0 (CROP_HEIGHT - NLIGN*YSIDE -8)
#define XBASE0 0+4+2
#define XBASE3 0
#define YBASE3 YBASE0 -4
#define STAT_DECX 120
#define STAT_YSZ 20
#ifndef RENDER16B
#define RGB565(r, g, b) (((r) << (5+16)) | ((g) << (5+8)) | (b<<5))
#else
#define RGB565(r, g, b) (((r) << (5+6)) | ((g) << 6) | (b))
#endif
#define uint32 unsigned int
#define uint8 unsigned char
#endif
+1926
View File
File diff suppressed because it is too large Load Diff
+389
View File
@@ -0,0 +1,389 @@
/*
* platform.c - platform interface implementation for libretro
*
* Copyright (C) 2010 Atari800 development team (see DOC/CREDITS)
*
* This file is part of the Atari800 emulator project which emulates
* the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers.
*
* Atari800 is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Atari800 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Atari800; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/* Atari800 includes */
#include "atari.h"
#include "input.h"
#include "log.h"
#include "monitor.h"
#include "platform.h"
#include "sound.h"
#include "videomode.h"
#include "cpu.h"
#include "devices.h"
#include "akey.h"
#include "pokeysnd.h"
#include "sound.h"
#include "screen.h"
#include "colours.h"
extern char Key_Sate[512];
#include "libretro-core.h"
#include "libretro.h"
#include "retroscreen.h"
extern int UI_is_active;
static int swap_joysticks = FALSE;
int PLATFORM_kbd_joy_0_enabled = TRUE; /* enabled by default, doesn't hurt */
int PLATFORM_kbd_joy_1_enabled = FALSE; /* disabled, would steal normal keys */
extern unsigned char MXjoy[2]; // joy
extern int retro_sound_finalized;
static UWORD *palette = NULL;
int skel_main(int argc, char **argv)
{
/* initialise Atari800 core */
if (!Atari800_Initialise(&argc, argv)){
printf("Failed to initialise!\n");
return 3;
}
retro_sound_finalized=1;
printf("First retrun to main thread!\n");
co_switch(mainThread);
/* main loop */
for (;;) {
INPUT_key_code = PLATFORM_Keyboard();
//SDL_INPUT_Mouse();
Atari800_Frame();
if (Atari800_display_screen)
PLATFORM_DisplayScreen();
}
}
int PLATFORM_Initialise(int *argc, char *argv[])
{
Log_print("Core init");
retro_InitGraphics();
Devices_enable_h_patch = FALSE;
INPUT_direct_mouse = TRUE;
return TRUE;
}
int PLATFORM_Exit(int run_monitor)
{
if (CPU_cim_encountered) {
Log_print("CIM encountered");
return TRUE;
}
Log_print("Core_exit");
retro_ExitGraphics();
return FALSE;
}
int PLATFORM_Keyboard(void)
{
/* OPTION / SELECT / START keys */
INPUT_key_consol = INPUT_CONSOL_NONE;
if (Key_Sate[RETROK_F2])
INPUT_key_consol &= (~INPUT_CONSOL_OPTION);
if (Key_Sate[RETROK_F3])
INPUT_key_consol &= (~INPUT_CONSOL_SELECT);
if (Key_Sate[RETROK_F4])
INPUT_key_consol &= (~INPUT_CONSOL_START);
if (Key_Sate[RETROK_SPACE])
return AKEY_SPACE;
if (Key_Sate[RETROK_F1])
return AKEY_UI;
if (Key_Sate[RETROK_LEFT])return AKEY_LEFT;
if (Key_Sate[RETROK_RIGHT])return AKEY_RIGHT;
if (Key_Sate[RETROK_UP])return AKEY_UP;
if (Key_Sate[RETROK_DOWN])return AKEY_DOWN;
if (Key_Sate[RETROK_RETURN])return AKEY_RETURN;
if (Key_Sate[RETROK_ESCAPE])return AKEY_ESCAPE;
/*
if (UI_is_active){
printf("ui....\n");
if (MXjoy[0]&0x04)
return AKEY_LEFT;
if (MXjoy[0]&0x08)
return AKEY_RIGHT;
if (MXjoy[0]&0x01)
return AKEY_UP;
if (MXjoy[0]&0x02)
return AKEY_DOWN;
if (MXjoy[0]&0x80)
return AKEY_RETURN;
if (MXjoy[0]&0x40)
return AKEY_ESCAPE;
}
*/
return AKEY_NONE;
}
/*
int PLATFORM_GetRawKey(void)
{
input_poll_cb();
for(i=0;i<320;i++)
Key_Sate[i]=input_state_cb(0, RETRO_DEVICE_KEYBOARD, 0,i) ? 0x80: 0;
}
*/
void PLATFORM_DisplayScreen(void)
{
retro_Render();
}
double PLATFORM_Time(void)
{
return GetTicks()/1000 ;//* 1e-3;
}
void PLATFORM_PaletteUpdate(void)
{
retro_PaletteUpdate();
}
static void get_platform_PORT(unsigned char *s0, unsigned char *s1)
{
int stick0, stick1;
stick0 = stick1 = INPUT_STICK_CENTRE;
if (PLATFORM_kbd_joy_0_enabled) {
if (MXjoy[0]&0x04)
stick0 &= INPUT_STICK_LEFT;
if (MXjoy[0]&0x08)
stick0 &= INPUT_STICK_RIGHT;
if (MXjoy[0]&0x01)
stick0 &= INPUT_STICK_FORWARD;
if (MXjoy[0]&0x02)
stick0 &= INPUT_STICK_BACK;
}
if (PLATFORM_kbd_joy_1_enabled) {
if (MXjoy[1]&0x04)
stick1 &= INPUT_STICK_LEFT;
if (MXjoy[1]&0x08)
stick1 &= INPUT_STICK_RIGHT;
if (MXjoy[1]&0x01)
stick1 &= INPUT_STICK_FORWARD;
if (MXjoy[1]&0x02)
stick1 &= INPUT_STICK_BACK;
}
if (swap_joysticks) {
*s1 = stick0;
*s0 = stick1;
}
else {
*s0 = stick0;
*s1 = stick1;
}
}
static void get_platform_TRIG(unsigned char *t0, unsigned char *t1)
{
int trig0, trig1;
trig0 = trig1 = 1;
if (PLATFORM_kbd_joy_0_enabled) {
//trig0 = !MXjoy[0]&0x80;
trig0 = MXjoy[0]&0x80?0:1;
}
if (PLATFORM_kbd_joy_1_enabled) {
//trig1 = !MXjoy[1]&0x80;
trig1 = MXjoy[1]&0x80?0:1;
}
if (swap_joysticks) {
*t1 = trig0;
*t0 = trig1;
}
else {
*t0 = trig0;
*t1 = trig1;
}
}
int PLATFORM_PORT(int num)
{
if (num == 0) {
UBYTE a, b;
//update_SDL_joysticks();
//printf("ffff %d\n",MXjoy[0]) ;
get_platform_PORT(&a, &b);
return (b << 4) | (a & 0x0f);
}
return 0xff;//(Android_PortStatus >> (num << 3)) & 0xFF;
}
int PLATFORM_TRIG(int num)
{
UBYTE a, b;
get_platform_TRIG(&a, &b);
//printf("ffff 0x%x: %d %d\n",MXjoy[0],a,b) ;
switch (num) {
case 0:
return a;
case 1:
return b;
default:
break;
}
return 0x01;//(Android_TrigStatus >> num) & 0x1;
}
/////////////////////////////////////////////////////////////
// SOUND
/////////////////////////////////////////////////////////////
int PLATFORM_SoundSetup(Sound_setup_t *setup)
{
//force 16 bit stereo sound at 44100
setup->freq=44100;
setup->sample_size=2;
setup->channels=2;
setup->buffer_ms=20;
return TRUE;
}
void PLATFORM_SoundExit(void)
{
}
void PLATFORM_SoundPause(void)
{
}
void PLATFORM_SoundContinue(void)
{
}
void PLATFORM_SoundLock(void)
{
}
void PLATFORM_SoundUnlock(void)
{
}
/////////////////////////////////////////////////////////////
// VIDEO
/////////////////////////////////////////////////////////////
void retro_PaletteUpdate(void)
{
int i;
if (!palette) {
if ( !(palette = malloc(256 * sizeof(UWORD))) ) {
Log_print("Cannot allocate memory for palette conversion.");
return;
}
}
memset(palette, 0, 256 * sizeof(UWORD));
for (i = 0; i < 256; i++){
palette[i] = ((Colours_table[i] & 0x00f80000) >> 8) |
((Colours_table[i] & 0x0000fc00) >> 5) |
((Colours_table[i] & 0x000000f8) >> 3);
}
/* force full redraw */
Screen_EntireDirty();
}
int retro_InitGraphics(void)
{
/* Initialize palette */
retro_PaletteUpdate();
return TRUE;
}
void retro_Render(void)
{
int x, y;
UBYTE *src, *src_line;
UWORD *dst, *dst_line;
src_line = ((UBYTE *) Screen_atari) + 24;
dst_line = Retro_Screen;
for (y = 0; y < 240; y++) {
src = src_line;
dst = dst_line;
for (x = 0; x < 336; x += 8) {
*dst++ = palette[*src++]; *dst++ = palette[*src++];
*dst++ = palette[*src++]; *dst++ = palette[*src++];
*dst++ = palette[*src++]; *dst++ = palette[*src++];
*dst++ = palette[*src++]; *dst++ = palette[*src++];
}
src_line += 384;
dst_line += 336;
}
}
void retro_ExitGraphics(void)
{
if (palette)
free(palette);
palette = NULL;
}
+10
View File
@@ -0,0 +1,10 @@
#ifndef RETROSCREEN_H
#define RETROSCREEN_H 1
extern int CROP_WIDTH;
extern int CROP_HEIGHT;
extern int VIRTUAL_WIDTH;
extern int retrow ;
extern int retroh ;
#endif
+54
View File
@@ -0,0 +1,54 @@
#include "libretro.h"
#include "retroscreen.h"
#include "libretro-core.h"
#include "vkbd_def.h"
#include "graph.h"
extern int NPAGE;
extern int KCOL;
extern int BKGCOLOR;
extern int SHIFTON;
void virtual_kdb(char *buffer,int vx,int vy)
{
int x, y, page;
unsigned coul;
#if defined PITCH && PITCH == 4
unsigned *pix=(unsigned*)buffer;
#else
unsigned short *pix=(unsigned short *)buffer;
#endif
page = (NPAGE == -1) ? 0 : 5*NPLGN;
coul = RGB565(28, 28, 31);
BKGCOLOR = (KCOL>0?0xFF808080:0);
for(x=0;x<NPLGN;x++)
{
for(y=0;y<NLIGN;y++)
{
DrawBoxBmp((char*)pix,XBASE3+x*XSIDE,YBASE3+y*YSIDE, XSIDE,YSIDE, RGB565(7, 2, 1));
Draw_text((char*)pix,XBASE0-2+x*XSIDE ,YBASE0+YSIDE*y,coul, BKGCOLOR ,1, 1,20,
SHIFTON==-1?MVk[(y*NPLGN)+x+page].norml:MVk[(y*NPLGN)+x+page].shift);
}
}
DrawBoxBmp((char*)pix,XBASE3+vx*XSIDE,YBASE3+vy*YSIDE, XSIDE,YSIDE, RGB565(31, 2, 1));
Draw_text((char*)pix,XBASE0-2+vx*XSIDE ,YBASE0+YSIDE*vy,RGB565(2,31,1), BKGCOLOR ,1, 1,20,
SHIFTON==-1?MVk[(vy*NPLGN)+vx+page].norml:MVk[(vy*NPLGN)+vx+page].shift);
}
int check_vkey2(int x,int y)
{
int page;
//check which key is press
page= (NPAGE==-1) ? 0 : 5*NPLGN;
return MVk[y*NPLGN+x+page].val;
}
+7
View File
@@ -0,0 +1,7 @@
#ifndef VKBD_H
#define VKBD_H 1
void virtual_kdb(char *pixels,int vx,int vy);
int check_vkey2(int x,int y);
#endif
+147
View File
@@ -0,0 +1,147 @@
#ifndef VKBD_DEF_H
#define VKBD_DEF_H 1
typedef struct {
char norml[NLETT];
char shift[NLETT];
int val;
} Mvk;
Mvk MVk[NPLGN*NLIGN*2]={
{ "ESC" ,"ESC" ,0x82 },//0
{ " 1" ," !" , 0x80 },//0
{ " 2" ," \"" ,0x81 },
{ " 3" ," #" ,0x71 },
{ " 4" ," $" ,0x70 },
{ " 5" ," %" ,0x61 },
{ " 6" ," &" ,0x60 },
{ " 7" ," \'" ,0x51 },
{ " 8" ," (" ,0x50 },
{ " 9" ," )" ,0x41 },
{ " 0" ," _" ,0x40 },
{ " ^" ,"Pnd" ,0x30 },
{ " q" ," Q" ,0x83}, //10+2
{ " w" ," W" ,0x73},
{ " e" ," E" ,0x72},
{ " r" ," R" ,0x62},
{ " t" ," T" ,0x63},
{ " y" ," Y" ,0x53},
{ " u" ," U" ,0x52},
{ " i" ," I" ,0x43},
{ " o" ," O" ,0x42},
{ " p" ," P" ,0x33},
{ " @" ," |" ,0x32},
{ " [" ," [" ,0x21},
{ " a" ," A" ,0x85}, //20+4
{ " s" ," S" ,0x74},
{ " d" ," D" ,0x75},
{ " f" ," F" ,0x65},
{ " g" ," G" ,0x64},
{ " h" ," H" ,0x54},
{ " j" ," J" ,0x55},
{ " k" ," K" ,0x45},
{ " l" ," L" ,0x44},
{ " :" ," *" ,0x35},
{ " ;" ," +" ,0x34},
{ " ]" ," ]" ,0x23},
{ " z" ," Z" ,0x87},//30+6
{ " x" ," X" ,0x77},
{ " c" ," C" ,0x76},
{ " v" ," V" ,0x67},
{ " b" ," B" ,0x66},
{ " n" ," N" ,0x56},
{ " m"," M" ,0x46},
{ " ,"," <" ,0x47},
{ " ."," >" ,0x37},
{ " /" ," ?" ,0x36},
{ " \\"," \\" ,0x26},
{ "SHFT" ,"SHFT" ,0x25},
{ "PG2","PG2" ,-2}, //40+8
{ "TAB","TAB" ,0x54},
{ "CPSL" ,"CPSL" ,0x86},
{ "RET" ,"RET" ,0x22},
{ "DEL" ,"DEL" ,0x97},
{ "CTRL" ,"CTRL" ,0x27},
{ "CLR" ,"CLR" , 0x20},
{ "Spc" ,"Spc",0x57},
{ "COPY" ,"COPY" ,0x11},
{ " ." ," .",0x07},
{ "F0" ,"F0" ,0x17},
{ "Ent" ,"Ent",0x06},
{ "ESC" ,"ESC" ,0x82 },//50+10
{ " 1" ," !" , 0x80 },
{ " 2" ," \"" ,0x81 },
{ " 3" ," #" ,0x71 },
{ " 4" ," $" ,0x70 },
{ " 5" ," %" ,0x61 },
{ " 6" ," &" ,0x60 },
{ " 7" ," \'" ,0x51 },
{ " 8" ," (" ,0x50 },
{ " 9" ," )" ,0x41 },
{ " 0" ," _" ,0x40 },
{ " ^" ,"Pnd" ,0x30 },
{ " F7" ," F7" ,0x12}, //60+12
{ " F8" ," F8" ,0x13},
{ " F9" ," F9" ,0x03},
{ " F0" ," F0" ,0x17},
{ " t" ," T" ,0x63},
{ " /\\" ," /\\" ,0x00},
{ " u" ," U" ,0x52},
{ " i" ," I" ,0x43},
{ " o" ," O" ,0x42},
{ " p" ," P" ,0x33},
{ " @" ," |" ,0x32},
{ " [" ," [" ,0x21},
{ " F4" ," F4" ,0x24}, //70+14
{ " F5" ," F5" ,0x14},
{ " F6" ," F6" ,0x04},
{ " ." ," ." ,0x07},
{ " <-" ," <-" ,0x10},
{ "COPY" ,"COPY" ,0x11},
{ " ->" ," ->" ,0x01},
{ " k" ," K" ,0x45},
{ " l" ," L" ,0x44},
{ " :" ," *" ,0x35},
{ " ;" ," +" ,0x34},
{ " ]" ," ]" ,0x23},
{ " F1" ," F1" ,0x15},//80+16
{ " F2" ," F2" ,0x16},
{ " F3" ," F3" ,0x05},
{ "Ent" ,"Ent" ,0x06},
{ " b" ," B" ,0x66},
{ " \\/" ," \\/" ,0x02},
{ " m"," M" ,0x46},
{ " ,"," <" ,0x47},
{ " ."," >" ,0x37},
{ "TAPE" ,"TAPE" ,-8},
{ "EXIT","EXIT" ,-6},
{ "SNA" ,"SNA" ,-7},
{ "PG1","PG1" ,-2},//90+18
{ "DSK","DSK" ,-5},
{ "GUI","GUI" ,-13},
{ "COL" ,"COL",-3},
{ "CTRL" ,"CTRL" ,0x27},
{ "SPC" ,"SPC" ,0x57},
{ "SHFT" ,"SHFT" ,0x25},
{ "ESC","ESC",0x82},
{ "CLR" ,"CLR",0x20},
{ "DEL" ,"DEL",0x97},
{ "Ent" ,"Ent",0x22},
{ "KBD" ,"KBD",-4},
} ;
#endif
Executable
+5
View File
@@ -0,0 +1,5 @@
{
global: retro_*;
local: *;
};