Added PSP Stella port by David Voswinkel. Hope I didn't break

anything.


git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@745 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
stephena 2005-08-25 15:19:17 +00:00
parent 374a2a1bb9
commit fb749d3325
26 changed files with 1266 additions and 55 deletions

View File

@ -13,7 +13,7 @@
## See the file "license" for information on usage and redistribution of ## See the file "license" for information on usage and redistribution of
## this file, and for a DISCLAIMER OF ALL WARRANTIES. ## this file, and for a DISCLAIMER OF ALL WARRANTIES.
## ##
## $Id: Makefile,v 1.6 2005-07-01 13:59:40 stephena Exp $ ## $Id: Makefile,v 1.7 2005-08-25 15:19:17 stephena Exp $
## ##
## Based on code from ScummVM - Scumm Interpreter ## Based on code from ScummVM - Scumm Interpreter
## Copyright (C) 2002-2004 The ScummVM project ## Copyright (C) 2002-2004 The ScummVM project
@ -109,7 +109,7 @@ DEPFILES =
# The build rule for the Stella executable # The build rule for the Stella executable
$(EXECUTABLE): $(OBJS) $(EXECUTABLE): $(OBJS)
$(CXX) $(LDFLAGS) $(PRE_OBJS_FLAGS) $+ $(POST_OBJS_FLAGS) $(LIBS) -o $@ $(LD) $(LDFLAGS) $(PRE_OBJS_FLAGS) $+ $(POST_OBJS_FLAGS) $(LIBS) -o $@
distclean: clean distclean: clean
$(RM_REC) $(DEPDIRS) $(RM_REC) $(DEPDIRS)
@ -248,5 +248,39 @@ win32dist: scummvm$(EXEEXT)
cp /usr/local/bin/SDL.dll $(WIN32PATH) cp /usr/local/bin/SDL.dll $(WIN32PATH)
u2d $(WIN32PATH)/*.txt u2d $(WIN32PATH)/*.txt
# Special target to create psp stuff
psp-package: $(EXECUTABLE)
$(MKSFO) 'Stella' PARAM.SFO
mkdir -p "psp/stella"
$(PSP-STRIP) stella.elf -o psp/stella/EBOOT.PBP
mkdir -p "psp/stella%"
$(PACK-PBP) "psp/stella%/EBOOT.PBP" PARAM.SFO src/psp/data/ICON0.PNG NULL NULL src/psp/data/PIC1.PNG NULL NULL NULL
rm -f PARAM.SFO
psp-upload: psp-package
mount | grep $(PSP-MOUNTPOINT) || mount $(PSP-MOUNTPOINT)
cp -rv "psp/stella" "psp/stella%" $(PSP-MOUNTPOINT)/psp/game/
umount $(PSP-MOUNTPOINT)
psp-debug:
mount | grep \$(PSP-MOUNTPOINT) || mount $(PSP-MOUNTPOINT)
@cat $(PSP-MOUNTPOINT)/stderr.txt
@echo -e "\n\n------------------------------------------------------------"
@cat $(PSP-MOUNTPOINT)/stdout.txt
umount $(PSP-MOUNTPOINT)
psp-cleanup:
rm -rf psp
mount | grep $(PSP-MOUNTPOINT) || mount $(PSP-MOUNTPOINT)
rm -rf $(PSP-MOUNTPOINT)/std*
umount $(PSP-MOUNTPOINT)
psp-layout:
mount | grep $(PSP-MOUNTPOINT) || mount $(PSP-MOUNTPOINT)
mkdir -p $(PSP-MOUNTPOINT)/stella/roms
mkdir -p $(PSP-MOUNTPOINT)/stella/snapshots
cp -v src/psp/data/stellarc.psp $(PSP-MOUNTPOINT)/stella/stellarc
umount $(PSP-MOUNTPOINT)
.PHONY: deb bundle test osxsnap win32dist dist install uninstall .PHONY: deb bundle test osxsnap win32dist dist install uninstall

57
stella/README-PSP.txt Normal file
View File

@ -0,0 +1,57 @@
STELLA port for the Sony PSP contributed by
David Voswinekl <david@optixx.org>
Building
--------
To build for the PSP, make sure psp-config is in the path and run:
./configure --host=psp
make
make psp-upload
make psp-layout
Dependencies
------------
o psp-toolchain
o pspsdk
o libsdl
o libpng
Status
------
Video - Support for scaled software mode and framebuffer hardware mode
Audio - Working
Input - Mouse emulation via Joystick
Snapshot - Working
Lauchner - Working
Menu - Working
Debugger - Not useable
Keymap
------
Menu
Cross - Left Mouse Button
Circle - Right Mouse Button
Emulation
Cross - Fire
Circle - Snapshot
Square - toggle PAL/NTSC
Triangle - Pause
Select - toggle Menu
Start - back to Launcher
Known Bugs
----------
o SDL video driver is in early stage, so expect flickering and update problems
o Stella will only compile/run with lastest sdl, pspskd and toolchain.
o Stella will crash if SDL is compiled with --disable-stdio-redirect.
Also you need a custom libSDLmain which has a debugHandler for stdout.

69
stella/configure vendored
View File

@ -112,15 +112,19 @@ find_sdlconfig()
_sdlconfig= _sdlconfig=
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
done=0
for path_dir in $_sdlpath; do for path_dir in $_sdlpath; do
for sdlconfig in $sdlconfigs; do for sdlconfig in $sdlconfigs; do
if test -x "$path_dir/$sdlconfig" ; then if test -x "$path_dir/$sdlconfig" ; then
_sdlconfig="$path_dir/$sdlconfig" _sdlconfig="$path_dir/$sdlconfig"
echo $_sdlconfig done=1
break break
fi fi
done done
if test $done -eq 1 ; then
echo $_sdlconfig
break
fi
done done
IFS="$ac_save_ifs" IFS="$ac_save_ifs"
@ -341,6 +345,14 @@ ppc-amigaos)
_host_os=amigaos _host_os=amigaos
_host_cpu=ppc _host_cpu=ppc
;; ;;
psp)
_host_os=psp
_host_cpu=mips
_png=yes
# force psp sdl path
_sdlpath=$(psp-config --pspdev-path)/psp/bin:$_sdlpath
PATH=$(psp-config --pspdev-path)/psp/bin:$(psp-config --pspdev-path)/bin:$PATH
;;
*) *)
guessed_host=`$_srcdir/config.guess` guessed_host=`$_srcdir/config.guess`
_host_cpu=`echo $guessed_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` _host_cpu=`echo $guessed_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
@ -359,6 +371,9 @@ mingw* | cygwin*)
arm-riscos-aof) arm-riscos-aof)
EXEEXT=",ff8" EXEEXT=",ff8"
;; ;;
psp)
EXEEXT=".elf"
;;
*) *)
EXEEXT="" EXEEXT=""
;; ;;
@ -375,6 +390,11 @@ else
fi fi
CXX= CXX=
if [ "$_host" = "psp" ] ; then
compilers="$CXX psp-g++ psp-c++"
CXX="psp-c++"
fi
for compiler in $compilers; do for compiler in $compilers; do
if test_compiler $compiler; then if test_compiler $compiler; then
CXX=$compiler CXX=$compiler
@ -392,7 +412,7 @@ fi
echocheck "compiler version" echocheck "compiler version"
cxx_name=`( $cc -v ) 2>&1 | tail -1 | cut -d ' ' -f 1` cxx_name=`( $cc -v ) 2>&1 | tail -n 1 | cut -d ' ' -f 1`
cxx_version=`( $CXX -dumpversion ) 2>&1` cxx_version=`( $CXX -dumpversion ) 2>&1`
if test "$?" -gt 0; then if test "$?" -gt 0; then
cxx_version="not found" cxx_version="not found"
@ -466,6 +486,8 @@ if test -n "$_host"; then
CXXFLAGS="$CFLAGS -newlib -mstrict-align -mcpu=750 -mtune=7400" CXXFLAGS="$CFLAGS -newlib -mstrict-align -mcpu=750 -mtune=7400"
LDFLAGS="$LDFLAGS -newlib" LDFLAGS="$LDFLAGS -newlib"
;; ;;
psp)
;;
*) *)
echo "Cross-compiling to unknown target, please add your target to configure." echo "Cross-compiling to unknown target, please add your target to configure."
exit 1 exit 1
@ -669,7 +691,7 @@ else
fi fi
LIBS="$LIBS `$_sdlconfig $_sdl_conf_libs` -lz" LIBS="$LIBS `$_sdlconfig $_sdl_conf_libs` -lz"
LD=$CXX
case $_host_os in case $_host_os in
unix) unix)
DEFINES="$DEFINES -DBSPF_UNIX -DHAVE_GETTIMEOFDAY -DHAVE_INTTYPES" DEFINES="$DEFINES -DBSPF_UNIX -DHAVE_GETTIMEOFDAY -DHAVE_INTTYPES"
@ -693,6 +715,33 @@ case $_host_os in
LIBS="$LIBS -lopengl32" LIBS="$LIBS -lopengl32"
fi fi
;; ;;
psp)
# -O3 is need for speed
# -G0 to avoid c++ link problems
CXXFLAGS="-G0 -O3 -fomit-frame-pointer -funroll-loops"
# 2 times -lc to avoid link problems. psp-gcc seems to to forget the first -lc wiile stdc++ linking
LIBS="-L `psp-config --pspsdk-path`/lib -L`psp-config --pspsdk-path`/../lib "
LIBS="$LIBS -lSDLmain -lSDL -lpng -lm -lpspsdk -lpspdebug -lpspgu -lpspctrl "
LIBS="$LIBS -lpspaudio -lc -lz -lpspkernel -lpspuser -lpspge -lpspdisplay -lpsphprm -lstdc++ -lc"
# psp compiler
CC="psp-gcc"
LD="psp-gcc"
_ranlib="psp-ranlib"
_ar="psp-ar cru"
MODULES="$MODULES src/psp"
# psp specific tool
PSP_STRIP=`psp-config --pspdev-path`"/bin/psp-strip"
PACK_PBP=`psp-config --pspdev-path`"/bin/pack-pbp"
MKSFO="`psp-config --pspdev-path`/bin/mksfo"
# mount point of psp
PSP_MOUNTPOINT="/mnt/psp"
INCLUDES="$INCLUDES -Isrc/psp -I`psp-config --pspsdk-path`/include"
DEFINES="$DEFINES -Dmain=SDL_main -DPSP -DBSPF_PSP -DPSP_DEBUG"
;;
*) *)
echo "WARNING: host system not currenty supported" echo "WARNING: host system not currenty supported"
exit exit
@ -726,6 +775,7 @@ cat > config.mak << EOF
CXX := $CXX CXX := $CXX
CXXFLAGS := $CXXFLAGS CXXFLAGS := $CXXFLAGS
LD := $LD
LIBS += $LIBS LIBS += $LIBS
RANLIB := $_ranlib RANLIB := $_ranlib
INSTALL := $_install INSTALL := $_install
@ -758,5 +808,16 @@ DEFINES += $DEFINES
LDFLAGS += $LDFLAGS LDFLAGS += $LDFLAGS
EOF EOF
if test $_host_os = "psp" ; then
cat >> config.mak << EOF
PSP-STRIP := $PSP_STRIP
PACK-PBP := $PACK_PBP
MKSFO := $MKSFO
PSP-MOUNTPOINT := $PSP_MOUNTPOINT
EOF
fi
# This should be taken care of elsewhere, but I'm not sure where # This should be taken care of elsewhere, but I'm not sure where
rm -f stella-conf* rm -f stella-conf*

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: FrameBufferSoft.cxx,v 1.35 2005-08-24 01:07:36 stephena Exp $ // $Id: FrameBufferSoft.cxx,v 1.36 2005-08-25 15:19:17 stephena Exp $
//============================================================================ //============================================================================
#include <SDL.h> #include <SDL.h>
@ -98,6 +98,29 @@ bool FrameBufferSoft::createScreen()
// In software mode, the image and screen dimensions are always the same // In software mode, the image and screen dimensions are always the same
myImageDim = myScreenDim; myImageDim = myScreenDim;
#ifdef PSP
if (myUseHardSurface)
{
/* double buff is broken */
mySDLFlags = SDL_HWSURFACE;
myScreenDim.w = myDesktopDim.w;
myScreenDim.h = myDesktopDim.w;
#ifdef PSP_DEBUG
fprintf(stdout, "FrameBufferSoft::createScreen Hardware Mode "
"myScreenDim.w='%i' myScreenDim.h='%i'\n",
myScreenDim.w,myScreenDim.h);
#endif
}
else
{
#ifdef PSP_DEBUG
fprintf(stdout, "FrameBufferSoft::createScreen Software Mode "
"myScreenDim.w='%i' myScreenDim.h='%i'\n",
myScreenDim.w,myScreenDim.h);
#endif
}
#endif
myScreen = SDL_SetVideoMode(myScreenDim.w, myScreenDim.h, 0, mySDLFlags); myScreen = SDL_SetVideoMode(myScreenDim.w, myScreenDim.h, 0, mySDLFlags);
if(myScreen == NULL) if(myScreen == NULL)
{ {

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: Snapshot.cxx,v 1.7 2005-06-28 23:18:15 stephena Exp $ // $Id: Snapshot.cxx,v 1.8 2005-08-25 15:19:17 stephena Exp $
//============================================================================ //============================================================================
#ifdef SNAPSHOT_SUPPORT #ifdef SNAPSHOT_SUPPORT
@ -74,6 +74,12 @@ string Snapshot::savePNG(string filename)
uInt32 width = myFrameBuffer.imageWidth(); uInt32 width = myFrameBuffer.imageWidth();
uInt32 height = myFrameBuffer.imageHeight(); uInt32 height = myFrameBuffer.imageHeight();
// FIXME - this should really call something like OSystem::message()
// so we can get rid of annoying ifdefs everywhere
#ifdef PSP
fprintf(stdout,"ok w=%i h=%i\n",width,height);
#endif
ofstream* out = new ofstream(filename.c_str(), ios_base::binary); ofstream* out = new ofstream(filename.c_str(), ios_base::binary);
if(!out) if(!out)
return "Couldn't create snapshot file"; return "Couldn't create snapshot file";

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: SoundSDL.cxx,v 1.19 2005-06-28 23:18:15 stephena Exp $ // $Id: SoundSDL.cxx,v 1.20 2005-08-25 15:19:17 stephena Exp $
//============================================================================ //============================================================================
#ifdef SOUND_SUPPORT #ifdef SOUND_SUPPORT
@ -98,8 +98,14 @@ void SoundSDL::initialize(bool forcerestart)
uInt32 fragsize = myOSystem->settings().getInt("fragsize"); uInt32 fragsize = myOSystem->settings().getInt("fragsize");
SDL_AudioSpec desired; SDL_AudioSpec desired;
desired.freq = 31400; #ifndef PSP
desired.freq = 31400;
desired.format = AUDIO_U8; desired.format = AUDIO_U8;
else
desired.freq = 44100;
desired.format = AUDIO_U16;
#endif
desired.channels = 1; desired.channels = 1;
desired.samples = fragsize; desired.samples = fragsize;
desired.callback = callback; desired.callback = callback;
@ -138,7 +144,7 @@ void SoundSDL::initialize(bool forcerestart)
*/ */
// Now initialize the TIASound object which will actually generate sound // Now initialize the TIASound object which will actually generate sound
Tia_sound_init(31400, myHardwareSpec.freq); Tia_sound_init(desired.freq, myHardwareSpec.freq);
// And start the SDL sound subsystem ... // And start the SDL sound subsystem ...
SDL_PauseAudio(0); SDL_PauseAudio(0);

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: mainSDL.cxx,v 1.48 2005-06-28 04:40:21 urchlay Exp $ // $Id: mainSDL.cxx,v 1.49 2005-08-25 15:19:17 stephena Exp $
//============================================================================ //============================================================================
#include <fstream> #include <fstream>
@ -45,9 +45,16 @@
#elif defined(MAC_OSX) #elif defined(MAC_OSX)
#include "SettingsMACOSX.hxx" #include "SettingsMACOSX.hxx"
#include "OSystemMACOSX.hxx" #include "OSystemMACOSX.hxx"
extern "C" {
int stellaMain(int argc, char* argv[]); extern "C" {
} int stellaMain(int argc, char* argv[]);
}
#elif defined(PSP)
#include "SettingsPSP.hxx"
#include "OSystemPSP.hxx"
extern "C" {
int SDL_main(int argc, char* argv[]);
}
#else #else
#error Unsupported platform! #error Unsupported platform!
#endif #endif
@ -104,6 +111,8 @@ void Cleanup()
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#if defined(MAC_OSX) #if defined(MAC_OSX)
int stellaMain(int argc, char* argv[]) int stellaMain(int argc, char* argv[])
#elif defined(PSP)
int SDL_main(int argc, char* argv[])
#else #else
int main(int argc, char* argv[]) int main(int argc, char* argv[])
#endif #endif
@ -118,9 +127,15 @@ int main(int argc, char* argv[])
#elif defined(MAC_OSX) #elif defined(MAC_OSX)
theOSystem = new OSystemMACOSX(); theOSystem = new OSystemMACOSX();
SettingsMACOSX settings(theOSystem); SettingsMACOSX settings(theOSystem);
#elif defined(PSP)
fprintf(stderr,"---------------- Stderr Begins ----------------\n");
fprintf(stdout,"---------------- Stdout Begins ----------------\n");
theOSystem = new OSystemPSP();
SettingsPSP settings(theOSystem);
#else #else
#error Unsupported platform! #error Unsupported platform!
#endif #endif
theOSystem->settings().loadConfig(); theOSystem->settings().loadConfig();
// Take care of commandline arguments // Take care of commandline arguments

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: EventHandler.cxx,v 1.86 2005-08-24 22:54:30 stephena Exp $ // $Id: EventHandler.cxx,v 1.87 2005-08-25 15:19:17 stephena Exp $
//============================================================================ //============================================================================
#include <algorithm> #include <algorithm>
@ -56,7 +56,12 @@ EventHandler::EventHandler(OSystem* osystem)
myQuitFlag(false), myQuitFlag(false),
myGrabMouseFlag(false), myGrabMouseFlag(false),
myUseLauncherFlag(false), myUseLauncherFlag(false),
myPaddleMode(0) myPaddleMode(0),
myMouseX(0),
myMouseY(0),
myLastMouseMoveX(0),
myLastMouseMoveY(0)
{ {
// Add this eventhandler object to the OSystem // Add this eventhandler object to the OSystem
myOSystem->attach(this); myOSystem->attach(this);
@ -472,6 +477,7 @@ void EventHandler::poll(uInt32 time)
break; // SDL_KEYUP, SDL_KEYDOWN break; // SDL_KEYUP, SDL_KEYDOWN
} }
case SDL_MOUSEMOTION: case SDL_MOUSEMOTION:
handleMouseMotionEvent(event); handleMouseMotionEvent(event);
break; // SDL_MOUSEMOTION break; // SDL_MOUSEMOTION
@ -533,14 +539,19 @@ void EventHandler::poll(uInt32 time)
code = event.jbutton.button; code = event.jbutton.button;
state = event.jbutton.state == SDL_PRESSED ? 1 : 0; state = event.jbutton.state == SDL_PRESSED ? 1 : 0;
#ifdef PSP
handleWarpMouseButton(code,state);
#endif
handleJoyEvent(stick, code, state); handleJoyEvent(stick, code, state);
break; break;
case SDL_JOYAXISMOTION: case SDL_JOYAXISMOTION:
axis = event.jaxis.axis; axis = event.jaxis.axis;
value = event.jaxis.value; value = event.jaxis.value;
#ifdef PSP
if (state!=S_EMULATE)
handleMouseWarp(stick,axis,value);
#endif
if(axis == 0) // x-axis if(axis == 0) // x-axis
{ {
handleJoyEvent(stick, kJAxisLeft, (value < -16384) ? 1 : 0); handleJoyEvent(stick, kJAxisLeft, (value < -16384) ? 1 : 0);
@ -807,6 +818,126 @@ void EventHandler::handleMouseButtonEvent(SDL_Event& event, uInt8 state)
} }
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void EventHandler::handleWarpMouseButton(uInt8 event_button, uInt8 state)
{
#ifdef PSP
// Determine which mode we're in, then send the event to the appropriate place
switch(myState)
{
case S_EMULATE:
{
/* map joypad button to sdl key events*/
if (event_button == 11){ /*start*/
handleKeyEvent(0,SDLK_ESCAPE,(SDLMod)0,state);
} else if (event_button == 10){ /*select*/
handleKeyEvent(0,SDLK_TAB,(SDLMod)0,state);
} else if (event_button == 6){
handleKeyEvent(0,SDLK_UP,(SDLMod)0,state);
} else if (event_button == 8){
handleKeyEvent(0,SDLK_DOWN,(SDLMod)0,state);
} else if (event_button == 9){
handleKeyEvent(0,SDLK_RIGHT,(SDLMod)0,state);
} else if (event_button == 7){
handleKeyEvent(0,SDLK_LEFT,(SDLMod)0,state);
} else if (event_button == 0){ /*triangle*/
handleKeyEvent(0,SDLK_PAUSE,(SDLMod)0,state);
} else if (event_button == 2){ /*cross*/
handleKeyEvent(0,SDLK_SPACE,(SDLMod)0,state);
} else if (event_button == 1){ /*circle*/
handleKeyEvent(0,SDLK_F12,(SDLMod)0,state);
} else if (event_button == 3 && state){ /*square*/
myOSystem->console().toggleFormat();
} else if (event_button == 4){ /*left trigger*/
handleKeyEvent(0,SDLK_F11,(SDLMod)0,state);
} else if (event_button == 5){ /*right trigger*/
handleKeyEvent(0,SDLK_F9,(SDLMod)0,state);
}
break;
}
case S_MENU:
case S_LAUNCHER:
case S_DEBUGGER:
{
/* map up and down buttions to sdl events */
if (event_button == 8){
handleKeyEvent(0,SDLK_UP,(SDLMod)0,state);
break;
} else if (event_button == 6){
handleKeyEvent(0,SDLK_DOWN,(SDLMod)0,state);
break;
}
Int32 x = myMouseX;
Int32 y = myMouseY;
myOSystem->frameBuffer().translateCoords(&x, &y);
MouseButton button;
/* enable 'select' button */
if (event_button == 10 && state){
handleKeyEvent(0,SDLK_TAB,(SDLMod)0,state);
break;
}
/* map the buttons to sdl mouse buttton events*/
if(state)
{
if(event_button == 2)
button = EVENT_LBUTTONDOWN;
else if(event_button == 1)
button = EVENT_RBUTTONDOWN;
else
break;
}
else
{
if(event_button == 2)
button = EVENT_LBUTTONUP;
else if(event_button == 1)
button = EVENT_RBUTTONUP;
else
break;
}
if(myState == S_MENU)
myOSystem->menu().handleMouseButtonEvent(button, x, y, state);
else if(myState == S_LAUNCHER)
myOSystem->launcher().handleMouseButtonEvent(button, x, y, state);
else
myOSystem->debugger().handleMouseButtonEvent(button, x, y, state);
break;
}
default:
break;
}
#endif
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void EventHandler::handleMouseWarp(uInt8 stick,uInt8 axis,Int16 value)
{
#ifdef PSP
Int32 new_x = myMouseX;
Int32 new_y = myMouseY;
value = value / 4000;
if (axis == 0)
{
myLastMouseMoveX = value;
}
else if (axis == 1)
{
myLastMouseMoveY = value;
}
new_x += myLastMouseMoveX;
new_y += myLastMouseMoveY;
if (new_x >=0 and new_x <= PSP_SCREEN_WIDTH)
myMouseX = new_x;
if (new_y >=0 and new_y <= PSP_SCREEN_HEIGHT)
myMouseY = new_y;
SDL_WarpMouse(myMouseX,myMouseY);
#endif
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void EventHandler::handleJoyEvent(uInt8 stick, uInt32 code, uInt8 state) void EventHandler::handleJoyEvent(uInt8 stick, uInt32 code, uInt8 state)
@ -1293,17 +1424,22 @@ void EventHandler::loadState(int state)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void EventHandler::takeSnapshot() void EventHandler::takeSnapshot()
{ {
#ifdef PSP_DEBUG
fprintf(stdout,"EventHandler::takeSnapshot\n");
#endif
#ifdef SNAPSHOT_SUPPORT #ifdef SNAPSHOT_SUPPORT
// Figure out the correct snapshot name // Figure out the correct snapshot name
string filename; string filename;
string sspath = myOSystem->settings().getString("ssdir"); string sspath = myOSystem->settings().getString("ssdir");
string ssname = myOSystem->settings().getString("ssname"); string ssname = myOSystem->settings().getString("ssname");
char separator = ssname[ssname.length()-1] != '/' ? BSPF_PATH_SEPARATOR : '';
if(ssname == "romname") if(ssname == "romname")
sspath = sspath + BSPF_PATH_SEPARATOR + sspath = sspath + separator +
myOSystem->console().properties().get("Cartridge.Name"); myOSystem->console().properties().get("Cartridge.Name");
else if(ssname == "md5sum") else if(ssname == "md5sum")
sspath = sspath + BSPF_PATH_SEPARATOR + sspath = sspath + separator +
myOSystem->console().properties().get("Cartridge.MD5"); myOSystem->console().properties().get("Cartridge.MD5");
// Check whether we want multiple snapshots created // Check whether we want multiple snapshots created
@ -1319,6 +1455,9 @@ void EventHandler::takeSnapshot()
{ {
buf.str(""); buf.str("");
buf << sspath << "_" << i << ".png"; buf << sspath << "_" << i << ".png";
#ifdef PSP_DEBUG
fprintf(stdout,"EventHandler::takeSnapshot '%s'\n",buf.str().c_str());
#endif
if(!FilesystemNode::fileExists(buf.str())) if(!FilesystemNode::fileExists(buf.str()))
break; break;
} }
@ -1331,7 +1470,7 @@ void EventHandler::takeSnapshot()
// Now create a Snapshot object and save the PNG // Now create a Snapshot object and save the PNG
myOSystem->frameBuffer().refresh(true); myOSystem->frameBuffer().refresh(true);
Snapshot snapshot(myOSystem->frameBuffer()); Snapshot snapshot(myOSystem->frameBuffer());
string result = snapshot.savePNG(filename); string result = snapshot.savePNG(filename);
myOSystem->frameBuffer().showMessage(result); myOSystem->frameBuffer().showMessage(result);
#else #else
myOSystem->frameBuffer().showMessage("Snapshots unsupported"); myOSystem->frameBuffer().showMessage("Snapshots unsupported");

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: EventHandler.hxx,v 1.45 2005-08-11 19:12:38 stephena Exp $ // $Id: EventHandler.hxx,v 1.46 2005-08-25 15:19:17 stephena Exp $
//============================================================================ //============================================================================
#ifndef EVENTHANDLER_HXX #ifndef EVENTHANDLER_HXX
@ -74,7 +74,7 @@ struct Stella_Joystick {
mapping can take place. mapping can take place.
@author Stephen Anthony @author Stephen Anthony
@version $Id: EventHandler.hxx,v 1.45 2005-08-11 19:12:38 stephena Exp $ @version $Id: EventHandler.hxx,v 1.46 2005-08-25 15:19:17 stephena Exp $
*/ */
class EventHandler class EventHandler
{ {
@ -279,6 +279,8 @@ class EventHandler
@param state state of code (pressed/released) @param state state of code (pressed/released)
*/ */
void handleJoyEvent(uInt8 stick, uInt32 code, uInt8 state); void handleJoyEvent(uInt8 stick, uInt32 code, uInt8 state);
void handleMouseWarp(uInt8 stick, uInt8 axis, Int16 value);
void handleWarpMouseButton(uInt8 event_button, uInt8 state);
/** /**
The following methods take care of assigning action mappings. The following methods take care of assigning action mappings.
@ -350,6 +352,11 @@ class EventHandler
// The current joymap in string form // The current joymap in string form
string myJoymapString; string myJoymapString;
Int32 myMouseX;
Int32 myMouseY;
Int32 myLastMouseMoveX;
Int32 myLastMouseMoveY;
}; };
#endif #endif

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: FrameBuffer.cxx,v 1.64 2005-08-25 01:20:11 markgrebe Exp $ // $Id: FrameBuffer.cxx,v 1.65 2005-08-25 15:19:17 stephena Exp $
//============================================================================ //============================================================================
#include <sstream> #include <sstream>
@ -35,8 +35,10 @@
#include "Debugger.hxx" #include "Debugger.hxx"
#endif #endif
#ifdef MAC_OSX #if defined(MAC_OSX)
#include "macOSXDisplay.h" #include "macOSXDisplay.h"
#elif defined(PSP)
#include "DisplayPSP.hxx"
#endif #endif
#include "stella.xpm" // The Stella icon #include "stella.xpm" // The Stella icon
@ -85,31 +87,29 @@ void FrameBuffer::initialize(const string& title, uInt32 width, uInt32 height,
} }
// Calculate the desktop size // Calculate the desktop size
// This is really the job of SDL
myDesktopDim.w = myDesktopDim.h = 0; myDesktopDim.w = myDesktopDim.h = 0;
#if defined(UNIX)
// Get the system-specific WM information
SDL_SysWMinfo myWMInfo; SDL_SysWMinfo myWMInfo;
SDL_VERSION(&myWMInfo.version); SDL_VERSION(&myWMInfo.version);
if(SDL_GetWMInfo(&myWMInfo) > 0) if(SDL_GetWMInfo(&myWMInfo) > 0 && myWMInfo.subsystem == SDL_SYSWM_X11)
{ {
#if defined(UNIX) myWMInfo.info.x11.lock_func();
if(myWMInfo.subsystem == SDL_SYSWM_X11) myDesktopDim.w = DisplayWidth(myWMInfo.info.x11.display,
{ DefaultScreen(myWMInfo.info.x11.display));
myWMInfo.info.x11.lock_func(); myDesktopDim.h = DisplayHeight(myWMInfo.info.x11.display,
myDesktopDim.w = DisplayWidth(myWMInfo.info.x11.display, DefaultScreen(myWMInfo.info.x11.display));
DefaultScreen(myWMInfo.info.x11.display)); myWMInfo.info.x11.unlock_func();
myDesktopDim.h = DisplayHeight(myWMInfo.info.x11.display,
DefaultScreen(myWMInfo.info.x11.display));
myWMInfo.info.x11.unlock_func();
}
#elif defined(WIN32)
myDesktopDim.w = (uInt16) GetSystemMetrics(SM_CXSCREEN);
myDesktopDim.h = (uInt16) GetSystemMetrics(SM_CYSCREEN);
#endif
} }
#if defined(MAC_OSX) #elif defined(WIN32)
myDesktopDim.w = (uInt16) GetSystemMetrics(SM_CXSCREEN);
myDesktopDim.h = (uInt16) GetSystemMetrics(SM_CYSCREEN);
#elif defined(MAC_OSX)
myDesktopDim.w = macOSXDisplayWidth(); myDesktopDim.w = macOSXDisplayWidth();
myDesktopDim.h = macOSXDisplayHeight(); myDesktopDim.h = macOSXDisplayHeight();
#elif defined(PSP)
myDesktopDim.w = PSP_SCREEN_WIDTH;
myDesktopDim.h = PSP_SCREEN_HEIGHT;
#endif #endif
// Set fullscreen flag // Set fullscreen flag

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: OSystem.cxx,v 1.32 2005-08-24 22:54:30 stephena Exp $ // $Id: OSystem.cxx,v 1.33 2005-08-25 15:19:17 stephena Exp $
//============================================================================ //============================================================================
#include <cassert> #include <cassert>
@ -187,7 +187,6 @@ bool OSystem::createFrameBuffer(bool showmessage)
// And recreate a new one // And recreate a new one
string video = mySettings->getString("video"); string video = mySettings->getString("video");
cout << " ==> video: " << video << endl;
if(video == "soft") if(video == "soft")
myFrameBuffer = new FrameBufferSoft(this); myFrameBuffer = new FrameBufferSoft(this);

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: Settings.cxx,v 1.55 2005-08-24 01:07:36 stephena Exp $ // $Id: Settings.cxx,v 1.56 2005-08-25 15:19:17 stephena Exp $
//============================================================================ //============================================================================
#include <cassert> #include <cassert>
@ -84,6 +84,11 @@ void Settings::loadConfig()
string line, key, value; string line, key, value;
string::size_type equalPos, garbage; string::size_type equalPos, garbage;
// FIXME - add infrastructure to print output
#ifdef PSP_DEBUG
fprintf(stdout,"Settings::loadConfig '%s'\n",myOSystem->configInputFilename().c_str());
#endif
ifstream in(myOSystem->configInputFilename().c_str()); ifstream in(myOSystem->configInputFilename().c_str());
if(!in || !in.is_open()) if(!in || !in.is_open())
{ {

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: bspf.hxx,v 1.8 2005-07-20 17:49:26 stephena Exp $ // $Id: bspf.hxx,v 1.9 2005-08-25 15:19:17 stephena Exp $
//============================================================================ //============================================================================
#ifndef BSPF_HXX #ifndef BSPF_HXX
@ -24,7 +24,7 @@
that need to be defined for different operating systems. that need to be defined for different operating systems.
@author Bradford W. Mott @author Bradford W. Mott
@version $Id: bspf.hxx,v 1.8 2005-07-20 17:49:26 stephena Exp $ @version $Id: bspf.hxx,v 1.9 2005-08-25 15:19:17 stephena Exp $
*/ */
// Types for 8-bit signed and unsigned integers // Types for 8-bit signed and unsigned integers
@ -52,6 +52,10 @@ typedef unsigned int uInt32;
using namespace std; using namespace std;
#endif #endif
#ifdef PSP
#include "pspstdint.h"
#endif
#ifdef HAVE_INTTYPES #ifdef HAVE_INTTYPES
#include <inttypes.h> #include <inttypes.h>
#endif #endif
@ -63,6 +67,8 @@ typedef unsigned int uInt32;
#define BSPF_PATH_SEPARATOR "\\" #define BSPF_PATH_SEPARATOR "\\"
#elif defined BSPF_MAC_OSX #elif defined BSPF_MAC_OSX
#define BSPF_PATH_SEPARATOR "/" #define BSPF_PATH_SEPARATOR "/"
#elif defined BSPF_PSP
#define BSPF_PATH_SEPARATOR "/"
#endif #endif
// I wish Windows had a complete POSIX layer // I wish Windows had a complete POSIX layer

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: AboutDialog.cxx,v 1.6 2005-08-11 21:57:30 stephena Exp $ // $Id: AboutDialog.cxx,v 1.7 2005-08-25 15:19:17 stephena Exp $
// //
// Based on code from ScummVM - Scumm Interpreter // Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project // Copyright (C) 2002-2004 The ScummVM project
@ -111,6 +111,8 @@ void AboutDialog::updateStrings(int page, int lines, string& title, string* &dsc
ADD_ATEXT("\\L\\c2"" Original author for OS/2 port"); ADD_ATEXT("\\L\\c2"" Original author for OS/2 port");
ADD_ATEXT("\\L\\c0"" Doodle"); ADD_ATEXT("\\L\\c0"" Doodle");
ADD_ATEXT("\\L\\c2"" Current maintainer for OS/2 port"); ADD_ATEXT("\\L\\c2"" Current maintainer for OS/2 port");
ADD_ATEXT("\\L\\c0"" David Voswinkel");
ADD_ATEXT("\\L\\c2"" Maintainer for PSP port");
break; break;
case 4: case 4:

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: VideoDialog.cxx,v 1.22 2005-08-24 01:07:36 stephena Exp $ // $Id: VideoDialog.cxx,v 1.23 2005-08-25 15:19:17 stephena Exp $
// //
// Based on code from ScummVM - Scumm Interpreter // Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project // Copyright (C) 2002-2004 The ScummVM project
@ -171,7 +171,6 @@ void VideoDialog::loadConfig()
// Renderer setting // Renderer setting
s = instance()->settings().getString("video"); s = instance()->settings().getString("video");
cout << " ==> video: " << s << endl;
if(s == "soft") if(s == "soft")
myRendererPopup->setSelectedTag(1); myRendererPopup->setSelectedTag(1);
else if(s == "hard") else if(s == "hard")

View File

@ -0,0 +1,27 @@
//============================================================================
//
// SSSS tt lll lll
// SS SS tt ll ll
// SS tttttt eeee ll ll aaaa
// SSSS tt ee ee ll ll aa
// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
// SS SS tt ee ll ll aa aa
// SSSS ttt eeeee llll llll aaaaa
//
// Copyright (c) 1995-2005 by Bradford W. Mott and the Stella team
//
// See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id: DisplayPSP.hxx,v 1.1 2005-08-25 15:19:17 stephena Exp $
//============================================================================
#ifndef DISPLAY_PSP_HXX
#define DISPLAY_PSP_HXX
// FIXME - at some point, this should be integrated into either SDL or OSystem
#define PSP_SCREEN_WIDTH 480
#define PSP_SCREEN_HEIGHT 272
#endif

View File

@ -0,0 +1,285 @@
//============================================================================
//
// SSSS tt lll lll
// SS SS tt ll ll
// SS tttttt eeee ll ll aaaa
// SSSS tt ee ee ll ll aa
// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
// SS SS tt ee ll ll aa aa
// SSSS ttt eeeee llll llll aaaaa
//
// Copyright (c) 1995-2005 by Bradford W. Mott and the Stella team
//
// See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id: FSNodePSP.cxx,v 1.1 2005-08-25 15:19:17 stephena Exp $
//
// Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project
//============================================================================
#include "FSNode.hxx"
#include <pspdebug.h>
#include <pspiofilemgr.h>
#include <stdlib.h>
#include <string.h>
#include <sstream>
/*
* Implementation of the Stella file system API based on POSIX for PSP
*/
class PSPFilesystemNode : public AbstractFilesystemNode
{
public:
PSPFilesystemNode();
PSPFilesystemNode(const string& path);
PSPFilesystemNode(const PSPFilesystemNode* node);
virtual string displayName() const { return _displayName; }
virtual bool isValid() const { return _isValid; }
virtual bool isDirectory() const { return _isDirectory; }
virtual string path() const { return _path; }
virtual FSList listDir(ListMode mode = kListDirectoriesOnly) const;
virtual AbstractFilesystemNode* parent() const;
static void stripTailingSlashes(char * buf);
protected:
string _displayName;
bool _isDirectory;
bool _isValid;
string _path;
};
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
static const char* lastPathComponent(const string& str)
{
const char *start = str.c_str();
const char *cur = start + str.size() - 2;
while (cur > start && *cur != '/')
--cur;
return cur+1;
}
static void stripTailingSlashes(char * buf)
{
char * ptr;
ptr = buf + strlen(buf)-1;
while(*(ptr)=='/') *(ptr--)='\0';
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
static string validatePath(const string& p)
{
string path = p;
if(p.size() <= 0 || p[0] == '/')
path = "ms0:/";
return path;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AbstractFilesystemNode* FilesystemNode::getRoot()
{
return new PSPFilesystemNode();
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AbstractFilesystemNode* FilesystemNode::getNodeForPath(const string& path)
{
return new PSPFilesystemNode(validatePath(path));
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PSPFilesystemNode::PSPFilesystemNode()
{
const char buf[] = "ms0:/stella/";
_path = buf;
_displayName = string("stella");
_isValid = true;
_isDirectory = true;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PSPFilesystemNode::PSPFilesystemNode(const string& p)
{
string path = validatePath(p);
Int32 len = 0, offset = path.size();
SceIoStat st;
_path = path;
// Extract last component from path
const char *str = path.c_str();
while (offset > 0 && str[offset-1] == '/')
offset--;
while (offset > 0 && str[offset-1] != '/')
{
len++;
offset--;
}
_displayName = string(str + offset, len);
// Check whether it is a directory, and whether the file actually exists
//_isValid = (0 == stat(_path.c_str(), &st));
//_isDirectory = S_ISDIR(st.st_mode);
_isValid = (0 == sceIoGetstat(_path.c_str(), &st));
_isDirectory = FIO_S_ISDIR(st.st_mode);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PSPFilesystemNode::PSPFilesystemNode(const PSPFilesystemNode* node)
{
_displayName = node->_displayName;
_isValid = node->_isValid;
_isDirectory = node->_isDirectory;
_path = node->_path;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FSList PSPFilesystemNode::listDir(ListMode mode) const
{
// assert(_isDirectory);
FSList myList;
SceUID dfd = sceIoDopen (_path.c_str());
SceIoDirent *dp;
dp = (SceIoDirent*)malloc(sizeof(SceIoDirent));
#ifdef PSP_DEBUG
fprintf(stdout,"PSPFilesystemNode::listDir: dir='%s'\n",_path.c_str());
#endif
if (!dfd){
#ifdef PSP_DEBUG
fprintf(stdout,"PSPFilesystemNode::listDir: no dir handle\n");
#endif
return myList;
}
while (sceIoDread(dfd,dp) > 0){
if (dp->d_name[0]=='.')
continue;
PSPFilesystemNode entry;
entry._displayName = dp->d_name;
entry._path = _path;
if (entry._path.length() > 0 && entry._path[entry._path.length()-1] != '/')
entry._path += "/";
entry._path += dp->d_name;
entry._isDirectory = dp->d_stat.st_attr & FIO_SO_IFDIR;
// Honor the chosen mode
if ((mode == kListFilesOnly && entry._isDirectory) ||
(mode == kListDirectoriesOnly && !entry._isDirectory))
continue;
if (entry._isDirectory)
entry._path += "/";
myList.push_back(wrap(new PSPFilesystemNode(&entry)));
}
sceIoDclose(dfd);
free(dp);
return myList;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AbstractFilesystemNode *PSPFilesystemNode::parent() const
{
if (_path == "/")
return 0;
PSPFilesystemNode* p = new PSPFilesystemNode();
const char *start = _path.c_str();
const char *end = lastPathComponent(_path);
p->_path = string(start, end - start);
p->_displayName = lastPathComponent(p->_path);
p->_isValid = true;
p->_isDirectory = true;
return p;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool AbstractFilesystemNode::fileExists(const string& path)
{
SceIoStat st;
#ifdef PSP_DEBUG
fprintf(stdout,"AbstractFilesystemNode::fileExists '%s'\n",path.c_str());
#endif
if(sceIoGetstat(path.c_str(), &st) != 0){
#ifdef PSP_DEBUG
fprintf(stdout,"AbstractFilesystemNode::fileExists error \n");
#endif
return false;
}
#ifdef PSP_DEBUG
fprintf(stdout,"AbstractFilesystemNode::fileExists return '%i'\n", !FIO_SO_ISREG(st.st_mode));
#endif
return !FIO_SO_ISREG(st.st_mode);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool AbstractFilesystemNode::dirExists(const string& in)
{
char tmp_buf[1024];
strncpy(tmp_buf,in.c_str(),1023);
stripTailingSlashes(tmp_buf);
string path = (char*)tmp_buf;
#ifdef PSP_DEBUG
fprintf(stdout,"AbstractFilesystemNode::dirExists '%s'\n", path.c_str());
#endif
SceIoStat st;
if(sceIoGetstat(path.c_str(), &st) != 0)
return false;
#ifdef PSP_DEBUG
fprintf(stdout,"AbstractFilesystemNode::dirExists return '%i'\n", !FIO_SO_ISDIR(st.st_mode));
#endif
return !FIO_SO_ISDIR(st.st_mode);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool AbstractFilesystemNode::makeDir(const string& path)
{
return sceIoMkdir(path.c_str(), 0777) == 0;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
string AbstractFilesystemNode::modTime(const string& in)
{
char tmp_buf[1024];
strncpy(tmp_buf,in.c_str(),1023);
stripTailingSlashes(tmp_buf);
string path = (char*)tmp_buf;
SceIoStat st;
#ifdef PSP_DEBUG
fprintf(stdout,"AbstractFilesystemNode::modTime '%s'\n",path.c_str());
#endif
if(sceIoGetstat(path.c_str(), &st) < 0){
#ifdef PSP_DEBUG
fprintf(stdout,"AbstractFilesystemNode::modTime returns error\n");
#endif
return "";
}
ostringstream buf;
buf << (unsigned short)st.st_mtime.year
<< (unsigned short)st.st_mtime.month
<< (unsigned short)st.st_mtime.day
<< (unsigned short)st.st_mtime.hour
<< (unsigned short)st.st_mtime.minute
<< (unsigned short)st.st_mtime.second;
#ifdef PSP_DEBUG
fprintf(stdout,"AbstractFilesystemNode::modTime returns '%s'\n",buf.str().c_str());
#endif
return buf.str();
}

View File

@ -0,0 +1,168 @@
//============================================================================
//
// SSSS tt lll lll
// SS SS tt ll ll
// SS tttttt eeee ll ll aaaa
// SSSS tt ee ee ll ll aa
// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
// SS SS tt ee ll ll aa aa
// SSSS ttt eeeee llll llll aaaaa
//
// Copyright (c) 1995-2005 by Bradford W. Mott and the Stella team
//
// See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id: OSystemPSP.cxx,v 1.1 2005-08-25 15:19:17 stephena Exp $
//============================================================================
#include <cstdlib>
#include <sstream>
#include <fstream>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include "bspf.hxx"
#include "OSystem.hxx"
#include "OSystemPSP.hxx"
#ifdef HAVE_GETTIMEOFDAY
#include <time.h>
#include <sys/time.h>
#endif
/**
Each derived class is responsible for calling the following methods
in its constructor:
setBaseDir()
setStateDir()
setPropertiesFiles()
setConfigFiles()
setCacheFile()
And for initializing the following variables:
myDriverList (a StringList)
See OSystem.hxx for a further explanation
*/
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
OSystemPSP::OSystemPSP()
{
// First set variables that the OSystem needs
string basedir = string("ms0:/stella");
setBaseDir(basedir);
string statedir = basedir + "/state";
setStateDir(statedir);
string userPropertiesFile = basedir + "/stella.pro";
string systemPropertiesFile = "/etc/stella.pro";
setPropertiesFiles(userPropertiesFile, systemPropertiesFile);
string userConfigFile = basedir + "/stellarc";
string systemConfigFile = "/etc/stellarc";
setConfigFiles(userConfigFile, systemConfigFile);
string cacheFile = basedir + "/stella.cache";
setCacheFile(cacheFile);
// No drivers are specified for Unix
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
OSystemPSP::~OSystemPSP()
{
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void OSystemPSP::mainLoop()
{
// These variables are common to both timing options
// and are needed to calculate the overall frames per second.
uInt32 frameTime = 0, numberOfFrames = 0;
if(mySettings->getBool("accurate")) // normal, CPU-intensive timing
{
// Set up accurate timing stuff
uInt32 startTime, delta;
// Set the base for the timers
frameTime = 0;
// Main game loop
for(;;)
{
// Exit if the user wants to quit
if(myEventHandler->doQuit()){
break;
}
startTime = getTicks();
myEventHandler->poll(startTime);
myFrameBuffer->update();
// Now, waste time if we need to so that we are at the desired frame rate
for(;;)
{
delta = getTicks() - startTime;
if(delta >= myTimePerFrame)
break;
}
frameTime += getTicks() - startTime;
++numberOfFrames;
}
}
else // less accurate, less CPU-intensive timing
{
// Set up less accurate timing stuff
uInt32 startTime, virtualTime, currentTime;
// Set the base for the timers
virtualTime = getTicks();
frameTime = 0;
// Main game loop
for(;;)
{
// Exit if the user wants to quit
if(myEventHandler->doQuit()){
break;
}
startTime = getTicks();
myEventHandler->poll(startTime);
myFrameBuffer->update();
currentTime = getTicks();
virtualTime += myTimePerFrame;
if(currentTime < virtualTime)
{
SDL_Delay((virtualTime - currentTime)/1000);
}
currentTime = getTicks() - startTime;
frameTime += currentTime;
++numberOfFrames;
}
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
uInt32 OSystemPSP::getTicks()
{
#if defined(HAVE_GETTIMEOFDAY)
timeval now;
gettimeofday(&now, 0);
return (uInt32) (now.tv_sec * 1000000 + now.tv_usec);
#else
return (uInt32) SDL_GetTicks() * 1000;
#endif
}

View File

@ -0,0 +1,60 @@
//============================================================================
//
// SSSS tt lll lll
// SS SS tt ll ll
// SS tttttt eeee ll ll aaaa
// SSSS tt ee ee ll ll aa
// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
// SS SS tt ee ll ll aa aa
// SSSS ttt eeeee llll llll aaaaa
//
// Copyright (c) 1995-2005 by Bradford W. Mott and the Stella team
//
// See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id: OSystemPSP.hxx,v 1.1 2005-08-25 15:19:17 stephena Exp $
//============================================================================
#ifndef OSYSTEM_PSP_HXX
#define OSYSTEM_PSP_HXX
#include "bspf.hxx"
/**
This class defines PSP-like OS's (Linux) system specific settings.
@author Stephen Anthony
@version $Id: OSystemPSP.hxx,v 1.1 2005-08-25 15:19:17 stephena Exp $
*/
class OSystemPSP : public OSystem
{
public:
/**
Create a new PSP-specific operating system object
*/
OSystemPSP();
/**
Destructor
*/
virtual ~OSystemPSP();
public:
/**
This method runs the main loop. Since different platforms
may use different timing methods and/or algorithms, this method has
been abstracted to each platform.
*/
virtual void mainLoop();
/**
This method returns number of ticks in microseconds.
@return Current time in microseconds.
*/
virtual uInt32 getTicks();
};
#endif

View File

@ -0,0 +1,39 @@
//============================================================================
//
// SSSS tt lll lll
// SS SS tt ll ll
// SS tttttt eeee ll ll aaaa
// SSSS tt ee ee ll ll aa
// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
// SS SS tt ee ll ll aa aa
// SSSS ttt eeeee llll llll aaaaa
//
// Copyright (c) 1995-2005 by Bradford W. Mott and the Stella team
//
// See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id: SettingsPSP.cxx,v 1.1 2005-08-25 15:19:17 stephena Exp $
//============================================================================
#include "bspf.hxx"
#include "Settings.hxx"
#include "SettingsPSP.hxx"
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SettingsPSP::SettingsPSP(OSystem* osystem)
: Settings(osystem)
{
set("accurate", "false");
set("zoom", "1");
set("romdir", "ms0:/stella/roms/");
set("ssdir", "ms0:/stella/snapshots/");
set("grabmouse", "1");
set("sound", "true");
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SettingsPSP::~SettingsPSP()
{
}

View File

@ -0,0 +1,46 @@
//============================================================================
//
// SSSS tt lll lll
// SS SS tt ll ll
// SS tttttt eeee ll ll aaaa
// SSSS tt ee ee ll ll aa
// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
// SS SS tt ee ll ll aa aa
// SSSS ttt eeeee llll llll aaaaa
//
// Copyright (c) 1995-2005 by Bradford W. Mott and the Stella team
//
// See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id: SettingsPSP.hxx,v 1.1 2005-08-25 15:19:17 stephena Exp $
//============================================================================
#ifndef SETTINGS_PSP_HXX
#define SETTINGS_PSP_HXX
class OSystem;
#include "bspf.hxx"
/**
This class defines PSP-like OS's (Linux) system specific settings.
@author Stephen Anthony
@version $Id: SettingsPSP.hxx,v 1.1 2005-08-25 15:19:17 stephena Exp $
*/
class SettingsPSP : public Settings
{
public:
/**
Create a new PSP settings object
*/
SettingsPSP(OSystem* osystem);
/**
Destructor
*/
virtual ~SettingsPSP();
};
#endif

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 KiB

View File

@ -0,0 +1,40 @@
; Stella configuration file
;
; Lines starting with ';' are comments and are ignored.
; Spaces and tabs are ignored.
;
; Format MUST be as follows:
; command = value
;
; Commmands are the same as those specified on the commandline,
; without the '-' character.
;
; Values are the same as those allowed on the commandline.
; Boolean values are specified as 1 (or true) and 0 (or false)
;
video = soft
video_driver =
gl_filter = nearest
gl_aspect = 2.0
gl_fsmax = false
zoom = 1
fullscreen = false
grabmouse = 1
center = true
palette = standard
debugheight = 20
sound = 1
fragsize = 1024
volume = 100
keymap = 0:0:0:0:0:0:0:0:74:71:0:0:0:0:0:0:0:0:0:69:0:0:0:0:0:0:0:73:0:0:0:0:15:0:0:0:0:0:0:0:0:0:0:0:54:0:55:56:47:33:34:35:21:22:23:24:45:46:0:53:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:72:39:0:44:41:38:20:18:17:48:19:51:52:0:0:49:50:36:0:40:0:0:0:37:43:16:42:0:0:0:0:62:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:11:12:14:13:58:60:64:57:61:9:10:3:4:5:6:7:8:67:65:66:68:0:0:0:0:0:0:0:0:0:0:0:0:15:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:
joymap = 15:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:11:12:13:14:20:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:16:17:18:19:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:
paddle = 0
showinfo = false
ssdir = ms0:/stella/snapshots/
ssname = romname
sssingle = false
romdir = ms0:/stella/roms/
lastrom =
modtime = 2005820191330
accurate = false
break =

12
stella/src/psp/module.mk Normal file
View File

@ -0,0 +1,12 @@
MODULE := src/psp
MODULE_OBJS := \
src/psp/FSNodePSP.o \
src/psp/OSystemPSP.o \
src/psp/SettingsPSP.o
MODULE_DIRS += \
src/psp
# Include common rules
include $(srcdir)/common.rules

175
stella/src/psp/pspstdint.h Normal file
View File

@ -0,0 +1,175 @@
/* SCE CONFIDENTIAL
PSP(TM) Programmer Tool Runtime Library Release 1.5.0
*
* Copyright (C) 2005 Sony Computer Entertainment Inc.
* All Rights Reserved.
*
*/
/*
*
* PSP(TM) integer types
*
* pspstdint.h
*
* Version Date Design Log
* --------------------------------------------------------------------
* 0.00 2005-01-19 kono the first version
*/
#ifndef _SCE_PSPSTDINT_H
#define _SCE_PSPSTDINT_H
/* Exact-width integer types */
#ifndef _SCE_PSPSTDINT_int8_t_DEFINED
#define _SCE_PSPSTDINT_int8_t_DEFINED
typedef signed char int8_t;
typedef unsigned char uint8_t;
typedef short int16_t;
typedef unsigned short uint16_t;
typedef int int32_t;
typedef unsigned int uint32_t;
#if defined(__GNUC__)
__extension__ typedef long long int64_t __attribute__((mode(DI)));
__extension__ typedef unsigned long long uint64_t __attribute__((mode(DI)));
#else /* defined(__GNUC__) */
typedef long long int64_t;
typedef unsigned long long uint64_t;
#endif /* defined(__GNUC__) */
#endif /* _SCE_PSPSTDINT_int8_t_DEFINED */
/* Minimum-width integer types */
#ifndef _SCE_PSPSTDINT_int_least8_t_DEFINED
#define _SCE_PSPSTDINT_int_least8_t_DEFINED
typedef signed char int_least8_t;
typedef unsigned char uint_least8_t;
typedef short int_least16_t;
typedef unsigned short uint_least16_t;
typedef int int_least32_t;
typedef unsigned int uint_least32_t;
#if defined(__GNUC__)
__extension__ typedef long long int_least64_t __attribute__((mode(DI)));
__extension__ typedef unsigned long long uint_least64_t __attribute__((mode(DI)));
#else /* defined(__GNUC__) */
typedef long long int_least64_t;
typedef unsigned long long uint_least64_t;
#endif /* defined(__GNUC__) */
#endif /* _SCE_PSPSTDINT_int_least8_t_DEFINED */
/* Fastest minimum-width integer types */
#ifndef _SCE_PSPSTDINT_int_fast8_t_DEFINED
#define _SCE_PSPSTDINT_int_fast8_t_DEFINED
typedef char int_fast8_t;
typedef unsigned char uint_fast8_t;
typedef int int_fast16_t;
typedef unsigned int uint_fast16_t;
typedef int int_fast32_t;
typedef unsigned int uint_fast32_t;
#if defined(__GNUC__)
__extension__ typedef long long int_fast64_t __attribute__((mode(DI)));
__extension__ typedef unsigned long long uint_fast64_t __attribute__((mode(DI)));
#else /* defined(__GNUC__) */
typedef long long int_fast64_t;
typedef unsigned long long uint_fast64_t;
#endif /* defined(__GNUC__) */
#endif /* _SCE_PSPSTDINT_int_fast8_t_DEFINED */
/* Integer types capable of holding object pointers */
#ifndef _SCE_PSPSTDINT_intptr_t_DEFINED
#define _SCE_PSPSTDINT_intptr_t_DEFINED
typedef int intptr_t;
typedef unsigned int uintptr_t;
#endif /* _SCE_PSPSTDINT_intptr_t_DEFINED */
/* Gereat-width integer types */
#ifndef _SCE_PSPSTDINT_intmax_t_DEFINED
#define _SCE_PSPSTDINT_intmax_t_DEFINED
#if defined(__GNUC__)
typedef long long intmax_t __attribute__((mode(DI)));
typedef unsigned long long uintmax_t __attribute__((mode(DI)));
#else /* defined(__GNUC__) */
typedef long long intmax_t;
typedef unsigned long long uintmax_t;
#endif /* defined(__GNUC__) */
#endif /* _SCE_PSPSTDINT_intmax_t_DEFINED */
/* Limits of specified-width intger types */
#if (!(defined(_LANGUAGE_C_PLUS_PLUS)||defined(__cplusplus)||defined(c_plusplus)))||defined(__STDC_CONSTANT_MACROS)
/* Limits of exact-width integer types */
#define INT8_MIN (-128)
#define INT16_MIN (-32767-1)
#define INT32_MIN (-2147483647-1)
#define INT64_MIN (-9223372036854775807LL-1)
#define INT8_MAX (127)
#define INT16_MAX (32767)
#define INT32_MAX (2147483647)
#define INT64_MAX (9223372036854775807LL)
#define UINT8_MAX (255)
#define UINT16_MAX (65535)
#define UINT32_MAX (4294967295U)
#define UINT64_MAX (18446744073709551615ULL)
/* Limits of minimum-width integer types */
#define INT_LEAST8_MIN (-128)
#define INT_LEAST16_MIN (-32767-1)
#define INT_LEAST32_MIN (-2147483647-1)
#define INT_LEAST64_MIN (-9223372036854775807LL-1)
#define INT_LEAST8_MAX (127)
#define INT_LEAST16_MAX (32767)
#define INT_LEAST32_MAX (2147483647)
#define INT_LEAST64_MAX (9223372036854775807LL)
#define UINT_LEAST8_MAX (255)
#define UINT_LEAST16_MAX (65535)
#define UINT_LEAST32_MAX (4294967295U)
#define UINT_LEAST64_MAX (18446744073709551615ULL)
/* Limits of fastest minimum-width integer types */
#define INT_FAST8_MIN (-128)
#define INT_FAST16_MIN (-2147483647-1)
#define INT_FAST32_MIN (-2147483647-1)
#define INT_FAST64_MIN (-9223372036854775807LL-1)
#define INT_FAST8_MAX (127)
#define INT_FAST16_MAX (2147483647)
#define INT_FAST32_MAX (2147483647)
#define INT_FAST64_MAX (9223372036854775807LL)
#define UINT_FAST8_MAX (255)
#define UINT_FAST16_MAX (4294967295U)
#define UINT_FAST32_MAX (4294967295U)
#define UINT_FAST64_MAX (18446744073709551615ULL)
/* Limits of integer types capable of holding object pointers */
#define INTPTR_MIN (-2147483647-1)
#define INTPTR_MAX (2147483647)
#define UINTPTR_MAX (4294967295U)
/* Limits of greates-width intger types */
#define INTMAX_MIN (-9223372036854775807LL-1)
#define INTMAX_MAX (9223372036854775807LL)
#define UINTMAX_MAX (18446744073709551615ULL)
/* Macros for minimum-width integer constants */
#define INT8_C(c) c
#define INT16_C(c) c
#define INT32_C(c) c
#define INT64_C(c) c ## LL
#define UINT8_C(c) c ## U
#define UINT16_C(c) c ## U
#define UINT32_C(c) c ## U
#define UINT64_C(c) c ## ULL
/* Macros for greatest-width integer constants */
#define INTMAX_C(c) c ## LL
#define UINTMAX_C(c) c ## ULL
#endif /* (!(defined(_LANGUAGE_C_PLUS_PLUS)||defined(__cplusplus)||defined(c_plusplus)))||defined(__STDC_CONSTANT_MACROS) */
#endif /* _SCE_PSPSTDINT_H */