fixed GP32 port

svn-id: r6958
This commit is contained in:
Joost Peters 2003-04-10 13:44:50 +00:00
parent e169b15efa
commit 81ac7cc8f8
7 changed files with 262 additions and 106 deletions

View file

@ -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
View 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__)

View file

@ -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--;
}
@ -825,6 +826,10 @@ void OSystem_GP32::set_mouse_pos(int x, int y) {
}
}
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,67 +1517,40 @@ 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;

View file

@ -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,

View file

@ -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

View file

@ -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
#ifndef __GP32__
strcat(buf, "/");
#endif
}
strcat(buf, filename);

View file

@ -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
//