mirror of
https://github.com/Pecusx/libretro-atari800.git
synced 2026-05-20 22:33:22 +02:00
add basic libretro file wip
This commit is contained in:
@@ -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
|
||||||
@@ -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 \
|
||||||
|
|
||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
APP_ABI := all
|
||||||
@@ -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 */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -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 */
|
||||||
@@ -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
|
||||||
@@ -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;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -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 ! */
|
||||||
Executable
+368
@@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Executable
+29
@@ -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
|
||||||
|
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
|
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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 );
|
||||||
|
}
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -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
File diff suppressed because it is too large
Load Diff
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -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
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
Reference in New Issue
Block a user