fixed GP32 port
svn-id: r6958
This commit is contained in:
parent
e169b15efa
commit
81ac7cc8f8
7 changed files with 262 additions and 106 deletions
|
@ -32,4 +32,4 @@ LDFLAGS = -Wl,-T $(LNKSCRIPT)
|
|||
LIBS += -lgpgraphic -lgpmem -lgpos -lgpstdlib -lgpstdio -lgpsound -lgpfont
|
||||
INCLUDES += -Ibackends/gp32
|
||||
MODULES += backends/gp32
|
||||
OBJS += $(CCBASE)/arm-agb-elf/lib/gpstart/gpstart.o backends/gp32/gp32.o
|
||||
OBJS += $(CCBASE)/arm-agb-elf/lib/gpstart/gpstart.o backends/gp32/gp32.o backends/gp32/gp-fs.o
|
||||
|
|
152
backends/gp32/gp-fs.cpp
Normal file
152
backends/gp32/gp-fs.cpp
Normal file
|
@ -0,0 +1,152 @@
|
|||
/* ScummVM - Scumm Interpreter
|
||||
* Copyright (C) 2001-2003 The ScummVM project
|
||||
*
|
||||
* This program 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.
|
||||
*
|
||||
* This program 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 this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* $Header$
|
||||
*/
|
||||
|
||||
#if defined (__GP32__)
|
||||
|
||||
#include "../fs/fs.h"
|
||||
#include "stdio.h"
|
||||
|
||||
extern "C" {
|
||||
#include "gpstdio.h"
|
||||
}
|
||||
|
||||
/*
|
||||
* Implementation of the ScummVM file system API based on GP32.
|
||||
*/
|
||||
|
||||
class GP32FilesystemNode : public FilesystemNode {
|
||||
protected:
|
||||
String _displayName;
|
||||
bool _isDirectory;
|
||||
bool _isValid;
|
||||
String _path;
|
||||
|
||||
public:
|
||||
GP32FilesystemNode();
|
||||
GP32FilesystemNode(const String &path);
|
||||
GP32FilesystemNode(const GP32FilesystemNode *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 FilesystemNode *parent() const;
|
||||
virtual FilesystemNode *clone() const { return new GP32FilesystemNode(this); }
|
||||
};
|
||||
|
||||
|
||||
FilesystemNode *FilesystemNode::getRoot() {
|
||||
return new GP32FilesystemNode();
|
||||
}
|
||||
|
||||
GP32FilesystemNode::GP32FilesystemNode() {
|
||||
_displayName = "gp:\\";
|
||||
_isValid = true;
|
||||
_isDirectory = true;
|
||||
_path = "gp:\\";
|
||||
}
|
||||
|
||||
/*
|
||||
GP32FilesystemNode::GP32FilesystemNode(const String &p) {
|
||||
// TODO - extract last component from path
|
||||
_displayName = p;
|
||||
// TODO - check whether it is a directory, and whether the file actually exists
|
||||
_isValid = true;
|
||||
_isDirectory = true;
|
||||
_path = p;
|
||||
}
|
||||
*/
|
||||
|
||||
GP32FilesystemNode::GP32FilesystemNode(const GP32FilesystemNode *node) {
|
||||
_displayName = node->_displayName;
|
||||
_isValid = node->_isValid;
|
||||
_isDirectory = node->_isDirectory;
|
||||
_path = node->_path;
|
||||
}
|
||||
|
||||
FSList *GP32FilesystemNode::listDir(ListMode mode) const {
|
||||
assert(_isDirectory);
|
||||
|
||||
GPDIRENTRY dp;
|
||||
ulong read;
|
||||
|
||||
FSList *myList = new FSList();
|
||||
|
||||
int start=0; // current file
|
||||
|
||||
// ... loop over dir entries using readdir
|
||||
while (GpDirEnumList(_path.c_str(), start++, 1, &dp, &read) == SM_OK) {
|
||||
if (strcmp(dp.name,".")==0|| strcmp(dp.name,"..")==0) continue;
|
||||
GP32FilesystemNode entry;
|
||||
entry._displayName = dp.name;
|
||||
entry._path = _path;
|
||||
entry._path += dp.name;
|
||||
|
||||
GPFILEATTR attr;
|
||||
char s[256];
|
||||
sprintf(s, "%s%s", _path.c_str(), dp.name);
|
||||
GpFileAttr(s, &attr);
|
||||
entry._isDirectory = attr.attr & (1<<4);
|
||||
|
||||
// Honor the chosen mode
|
||||
if ((mode == kListFilesOnly && entry._isDirectory) ||
|
||||
(mode == kListDirectoriesOnly && !entry._isDirectory))
|
||||
continue;
|
||||
|
||||
if (entry._isDirectory)
|
||||
entry._path += "\\"; //ph0x
|
||||
myList->push_back(entry);
|
||||
}
|
||||
return myList;
|
||||
}
|
||||
|
||||
const char *lastPathComponent(const ScummVM::String &str) {
|
||||
const char *start = str.c_str();
|
||||
const char *cur = start + str.size() - 2;
|
||||
|
||||
while (cur > start && *cur != '\\') { //ph0x
|
||||
--cur;
|
||||
}
|
||||
|
||||
return cur+1;
|
||||
}
|
||||
|
||||
FilesystemNode *GP32FilesystemNode::parent() const {
|
||||
|
||||
GP32FilesystemNode *p = new GP32FilesystemNode();
|
||||
|
||||
// Root node is its own parent. Still we can't just return this
|
||||
// as the GUI code will call delete on the old node.
|
||||
if (_path != "gp:\\") { //ph0x
|
||||
const char *start = _path.c_str();
|
||||
const char *end = lastPathComponent(_path);
|
||||
|
||||
p->_path = String(start, end - start);
|
||||
p->_isValid = true;
|
||||
p->_isDirectory = true;
|
||||
p->_displayName = lastPathComponent(p->_path);
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
#endif // defined(__GP32__)
|
||||
|
|
@ -30,9 +30,10 @@ void GpSetPaletteEntry(u8 i, u8 r, u8 g, u8 b);
|
|||
#define NAMEME_SURFACE 1
|
||||
#define DEBUG_SURFACE 2
|
||||
|
||||
GPDRAWSURFACE gpDraw[2]; // surfaces
|
||||
GPDRAWSURFACE gpDraw[3]; // surfaces
|
||||
int mx=1, my=1; // wrong if 0?
|
||||
char currsurface;
|
||||
FILE *fstderr, *fstdout, *fstdin;
|
||||
|
||||
// Set colors of the palette
|
||||
void OSystem_GP32::set_palette(const byte *colors, uint start, uint num) {
|
||||
|
@ -609,7 +610,7 @@ void OSystem_GP32::draw_mouse() {
|
|||
*bak++ = *dst;
|
||||
color = *src++;
|
||||
if (color != 0xFF) // 0xFF = transparent, don't draw
|
||||
*dst = RGB_TO_16(_currentPalette[color].r, _currentPalette[color].g, _currentPalette[color].b);
|
||||
*dst = RGBToColor(_currentPalette[color].r, _currentPalette[color].g, _currentPalette[color].b);
|
||||
dst++;
|
||||
width--;
|
||||
}
|
||||
|
@ -824,7 +825,11 @@ void OSystem_GP32::set_mouse_pos(int x, int y) {
|
|||
undraw_mouse();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void OSystem_GP32::warp_mouse(int x, int y) {
|
||||
set_mouse_pos(x, y);
|
||||
}
|
||||
|
||||
// Set the bitmap that's used when drawing the cursor.
|
||||
void OSystem_GP32::set_mouse_cursor(const byte *buf, uint w, uint h, int hotspot_x, int hotspot_y) {
|
||||
_mouse_cur_state.w = w;
|
||||
|
@ -890,8 +895,8 @@ bool OSystem_GP32::poll_event(Event *event) { // fixme: make more user-friendly
|
|||
if (key & GPC_VK_FL && key & GPC_VK_FR) { // L+R = save state
|
||||
printf("Saving game, please wait...");
|
||||
|
||||
extern void autosave(void * engine);
|
||||
autosave(NULL); //FIXME?
|
||||
//extern void autosave(void * engine);
|
||||
//autosave(NULL); //FIXME?
|
||||
do key=GpKeyGet(); while (key != GPC_VK_NONE) ;
|
||||
return false;
|
||||
} else
|
||||
|
@ -1078,7 +1083,7 @@ void OSystem_GP32::delete_mutex(void *mutex) { }
|
|||
// Quit
|
||||
void gphalt(int);
|
||||
void OSystem_GP32::quit() {
|
||||
gphalt();
|
||||
exit(0);
|
||||
}
|
||||
|
||||
// Overlay
|
||||
|
@ -1220,56 +1225,34 @@ OSystem *OSystem_GP32_create(int gfx_mode, bool full_screen) {
|
|||
extern "C" int write(int fd, void *p, size_t n);
|
||||
int write(int fd, void *p, size_t n) { return 0; } //ph0x hack!
|
||||
|
||||
// fixme - unnecessary?
|
||||
class GP32SaveFile : public SaveFile {
|
||||
private:
|
||||
FILE *fh;
|
||||
public:
|
||||
GP32SaveFile(FILE *f) : fh(f) { }
|
||||
|
||||
~GP32SaveFile();
|
||||
|
||||
int fread(void *buf, int size, int cnt);
|
||||
int fwrite(void *buf, int size, int cnt);
|
||||
}
|
||||
|
||||
class GP32SaveFileManager : public SaveFileManager {
|
||||
SaveFile *open_savefile(const char *filename, bool saveOrLoad);
|
||||
}
|
||||
|
||||
int GP32SaveFile::fwrite(void *buf, int size, int cnt) {
|
||||
// implement me
|
||||
return ::fwrite(buf, size, cnt, fh);
|
||||
}
|
||||
|
||||
SaveFile GP32SaveFileManager::open_savefile(const char *filename,
|
||||
bool saveOrLoad) {
|
||||
// implement me
|
||||
FILE *fh = ::fopen(filename, (saveOrLoad? "wb":"rb"));
|
||||
//if (saveOrLoad) error("Autosaving..");
|
||||
return fh? new GP32SaveFile(fh) : NULL;
|
||||
}
|
||||
|
||||
void GP32SaveFile::~GP32SaveFile() {
|
||||
// implement me
|
||||
::fclose(fh);
|
||||
}
|
||||
int GP32SaveFile::fread(void *buf, int size, int cnt) {
|
||||
// implement me
|
||||
return ::fread(buf, size, cnt, fh);
|
||||
|
||||
}
|
||||
|
||||
SaveFileManager *OSystem_GP32::get_savefile_manager() {
|
||||
return new GP32SaveFileManager();
|
||||
}
|
||||
|
||||
// Converts 8bit rgb values to a GP32 palette value
|
||||
void GpSetPaletteEntry(u8 i, u8 r, u8 g, u8 b) {
|
||||
GP_PALETTEENTRY entry = GP_RGB16(r,g,b);
|
||||
GpPaletteEntryChange ( i, 1, &entry, 0 );
|
||||
}
|
||||
|
||||
void switchsurf(int surf) {
|
||||
GPLCDINFO lcd;
|
||||
GpLcdInfoGet(&lcd);
|
||||
|
||||
if (surf == DEBUG_SURFACE) {
|
||||
if (lcd.lcd_global.U8_lcd.bpp == 16)
|
||||
GpGraphicModeSet(8, NULL);
|
||||
|
||||
currsurface = DEBUG_SURFACE;
|
||||
GpSurfaceFlip(&gpDraw[currsurface]);
|
||||
GpSetPaletteEntry(0, 0, 0, 0);
|
||||
GpSetPaletteEntry(1, 255, 0, 0);
|
||||
GpSetPaletteEntry(2, 255, 255, 255);
|
||||
} else {
|
||||
if (surf == GAME_SURFACE) {
|
||||
currsurface = GAME_SURFACE;
|
||||
GpSurfaceFlip(&gpDraw[currsurface]);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int gpprintf(const char *fmt, ...) { //return 0; //fixme
|
||||
static int y;
|
||||
char s[1024]; // ?
|
||||
|
@ -1443,6 +1426,39 @@ void gphalt(int code=0) {
|
|||
while (1);
|
||||
}
|
||||
|
||||
char *gpstrdup(const char *strSource) {
|
||||
|
||||
char *buffer;
|
||||
buffer = (char *)malloc(strlen(strSource) + 1);
|
||||
if (buffer)
|
||||
strcpy(buffer, strSource);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
time_t gptime(time_t *timer) {
|
||||
|
||||
time_t t = GpTickCountGet() / 1000;
|
||||
if (timer)
|
||||
*timer = t;
|
||||
|
||||
return t;
|
||||
}
|
||||
|
||||
void gpdeinit() {
|
||||
fclose(fstdin);
|
||||
fclose(fstdout);
|
||||
fclose(fstderr);
|
||||
}
|
||||
|
||||
void gpexit(int code) {
|
||||
|
||||
switchsurf(DEBUG_SURFACE);
|
||||
|
||||
printf("Your GP32 will now restart...");
|
||||
gpdeinit();
|
||||
GpAppExit();
|
||||
}
|
||||
|
||||
//#include <string.h>
|
||||
#include "common/gamedetector.h"
|
||||
VersionSettings* menu() {
|
||||
|
@ -1501,68 +1517,41 @@ VersionSettings* menu() {
|
|||
}
|
||||
|
||||
int gpinit() {
|
||||
|
||||
ERR_CODE err;
|
||||
|
||||
//GpKeyInit();
|
||||
GpFatInit();
|
||||
GpRelativePathSet("gp:\\gpmm");
|
||||
|
||||
// Initialize graphics
|
||||
GpGraphicModeSet(8, NULL);
|
||||
GpLcdSurfaceGet(&gpDraw[DEBUG_SURFACE], DEBUG_SURFACE);
|
||||
GpLcdSurfaceGet(&gpDraw[NAMEME_SURFACE], NAMEME_SURFACE);
|
||||
GpLcdSurfaceGet(&gpDraw[GAME_SURFACE], GAME_SURFACE);
|
||||
|
||||
// gpDraw[GAME_SURFACE].oy=19; //center screen?
|
||||
// GpRectFill(NULL,&gpDraw[GAME_SURFACE], 0, 0, 320, 240, 0); //black border
|
||||
GpLcdEnable();
|
||||
GpSetPaletteEntry(0, 0, 0, 0);
|
||||
GpSetPaletteEntry(1, 255, 0, 0);
|
||||
GpSetPaletteEntry(2, 255, 255, 255);
|
||||
|
||||
// fixme - use get function
|
||||
currsurface=DEBUG_SURFACE;
|
||||
GpSurfaceSet(&gpDraw[currsurface]);
|
||||
|
||||
// _gp_sdk_init();
|
||||
// GpKeyInit();
|
||||
GpFatInit();
|
||||
GpRelativePathSet("gp:"); // fixme (get path)
|
||||
GpLcdEnable();
|
||||
|
||||
/*
|
||||
char s[256];
|
||||
GpRelativePathGet(s);
|
||||
printf("path=%s", s);
|
||||
*/
|
||||
#ifdef GPDEBUG
|
||||
printf(">waiting debugger...");
|
||||
printf(">waiting for debugger...");
|
||||
InitDebug();
|
||||
#endif
|
||||
printf(">Running ScummVM");
|
||||
|
||||
}
|
||||
|
||||
void createfakeini() {
|
||||
/*
|
||||
char s[] = "\
|
||||
[dott]\n\
|
||||
gameid=tentacle\n\
|
||||
[samnmax]\n\
|
||||
gameid=samnmax\n\
|
||||
[atlantis]\n\
|
||||
gameid=playfate\n\
|
||||
";
|
||||
FILE *f=fopen("scummvm.ini", "w");
|
||||
fwrite(s, 1, sizeof(s)+1, f);
|
||||
fclose(f);
|
||||
*/
|
||||
printf("Creating scummvm.ini, please wait...");
|
||||
FILE *f=fopen("scummvm.ini", "w");
|
||||
const VersionSettings *v = version_settings;
|
||||
char s[256];
|
||||
while (v->filename && v->gamename) {
|
||||
sprintf(s, "[%s]\ngameid=%s\n", v->filename, v->filename);
|
||||
fwrite(s, 1, strlen(s), f);
|
||||
v++;
|
||||
}
|
||||
fclose(f);
|
||||
}
|
||||
|
||||
extern "C" void GpMain (void * arg); // hack
|
||||
void GpMain (void * arg) {
|
||||
gpinit();
|
||||
createfakeini(); //FIXME: use methods :)
|
||||
|
||||
|
||||
// fixme - use get function
|
||||
currsurface=GAME_SURFACE;
|
||||
GpSurfaceFlip(&gpDraw[currsurface]);
|
||||
|
@ -1572,6 +1561,6 @@ void GpMain (void * arg) {
|
|||
|
||||
extern int main(int argc, char *argv[]);
|
||||
main(argc, argv);
|
||||
|
||||
|
||||
error("returned from main ?!");
|
||||
}
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
#include "scumm/saveload.h"
|
||||
#include "common/scaler.h"
|
||||
|
||||
#include "portdefs.h"
|
||||
#include "sdl.h"
|
||||
|
||||
class OSystem_GP32 : public OSystem {
|
||||
|
@ -52,6 +53,7 @@ public:
|
|||
|
||||
// Either show or hide the mouse cursor
|
||||
bool show_mouse(bool visible);
|
||||
void warp_mouse(int x, int y);
|
||||
|
||||
// Set the position of the mouse cursor
|
||||
void set_mouse_pos(int x, int y);
|
||||
|
@ -115,10 +117,6 @@ public:
|
|||
void grab_overlay(int16 *buf, int pitch);
|
||||
void copy_rect_overlay(const int16 *buf, int pitch, int x, int y, int w, int h);
|
||||
|
||||
// Savefiles
|
||||
SaveFileManager *get_savefile_manager();
|
||||
|
||||
|
||||
static OSystem *create(int gfx_mode, bool full_screen);
|
||||
private:
|
||||
typedef void ScalerProc(uint8 *srcPtr, uint32 srcPitch, uint8 *deltaPtr,
|
||||
|
|
|
@ -55,6 +55,8 @@ typedef int s32;
|
|||
extern void *gpmalloc(size_t size);
|
||||
extern void *gpcalloc(size_t nitems, size_t size);
|
||||
extern void gpfree(void *block);
|
||||
extern char *gpstrdup(const char *s);
|
||||
|
||||
#define malloc gpmalloc
|
||||
#define calloc gpcalloc //gm_calloc
|
||||
#define free gpfree
|
||||
|
@ -65,16 +67,22 @@ typedef int s32;
|
|||
#define strncpy gm_strncpy
|
||||
#define strcat gm_strcat
|
||||
#define sprintf gm_sprintf*/
|
||||
#define strdup gpstrdup
|
||||
|
||||
#define assert(e) ((e) ? 0 : (printf("!AS: " #e " (%s, %d)\n", __FILE__, __LINE__)))
|
||||
#define ASSERT assert
|
||||
|
||||
#define ENDLESSLOOP while (1)
|
||||
|
||||
|
||||
#define FILE F_HANDLE
|
||||
#define stderr NULL // hack...
|
||||
#define stdout stderr
|
||||
#define stdin stderr
|
||||
extern FILE *fstderr;
|
||||
extern FILE *fstdout;
|
||||
extern FILE *fstdin;
|
||||
|
||||
#define stderr fstderr
|
||||
#define stdout fstdout
|
||||
#define stdin fstdin
|
||||
|
||||
extern FILE *gpfopen(const char *filename, const char *mode);
|
||||
extern int gpfclose(FILE *stream);
|
||||
|
@ -101,10 +109,16 @@ typedef int s32;
|
|||
#define fprintf gpfprintf
|
||||
#define fflush gpfflush
|
||||
|
||||
extern void gphalt(int code=0);
|
||||
#define exit gphalt
|
||||
extern void gpexit(int code);
|
||||
#define exit gpexit
|
||||
//#define error printf
|
||||
|
||||
#define time(x) (0) // fixme! (SIMON)
|
||||
extern time_t gptime(time_t *timer);
|
||||
#define time gptime
|
||||
#define MARK printf("MARK: %s, %s, %d", __FILE__, __FUNCTION__, __LINE__);
|
||||
|
||||
extern void *gpmemset (void *s, int c, size_t n);
|
||||
extern void *gpmemcpy (void *dest, const void *src, size_t n);
|
||||
//#define memset gpmemset
|
||||
//#define memcpy gpmemcpy
|
||||
|
||||
// EOF
|
||||
|
|
|
@ -32,7 +32,10 @@ FILE *File::fopenNoCase(const char *filename, const char *directory, const char
|
|||
#ifdef __MORPHOS__
|
||||
if (buf[strlen(buf)-1] != ':' && buf[strlen(buf)-1] != '/')
|
||||
#endif
|
||||
strcat(buf, "/");
|
||||
|
||||
#ifndef __GP32__
|
||||
strcat(buf, "/");
|
||||
#endif
|
||||
}
|
||||
strcat(buf, filename);
|
||||
|
||||
|
|
|
@ -123,7 +123,7 @@ GlobalOptionsDialog::GlobalOptionsDialog(NewGui *gui, GameDetector &detector)
|
|||
_sfxVolumeLabel->setFlags(WIDGET_CLEARBG);
|
||||
|
||||
|
||||
#if !defined(__DC__)
|
||||
#if !( defined(__DC__) || defined(__GP32__) )
|
||||
//
|
||||
// Save game path
|
||||
//
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue