diff options
Diffstat (limited to 'apps/plugins/rockboy/rockboy.c')
| -rw-r--r-- | apps/plugins/rockboy/rockboy.c | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/apps/plugins/rockboy/rockboy.c b/apps/plugins/rockboy/rockboy.c new file mode 100644 index 0000000..c9788e2 --- /dev/null +++ b/apps/plugins/rockboy/rockboy.c @@ -0,0 +1,137 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Gameboy emulator based on gnuboy + * + * All files in this archive are subject to the GNU General Public License. + * See the file COPYING in the source tree root for full license agreement. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ +#include "plugin.h" +#include "loader.h" +#include "rockmacros.h" + +#if MEM <= 8 && !defined(SIMULATOR) +/* On archos this is loaded as an overlay */ + +/* These are defined in the linker script */ +extern unsigned char ovl_start_addr[]; +extern unsigned char ovl_end_addr[]; + +const struct { + unsigned long magic; + unsigned char *start_addr; + unsigned char *end_addr; + enum plugin_status (*entry_point)(struct plugin_api*, void*); +} header __attribute__ ((section (".header"))) = { + 0x524f564c, /* ROVL */ + ovl_start_addr, ovl_end_addr, plugin_start +}; +#endif + +/* here is a global api struct pointer. while not strictly necessary, + it's nice not to have to pass the api pointer in all function calls + in the plugin */ +struct plugin_api* rb; +int shut,cleanshut; +char *errormsg; +int gnuboy_main(char *rom); + +/* libc functions */ + +int isdigit(int c) { + return c>='0' && c<= '9'; +} + +int isalpha(int c) { + return (c>='a' && c<='z')||(c>='A' && c<='Z'); +} + +int isupper(int c) { + return c>='A'&&c<='Z'; +} + +int isalnum(int c) { + return isdigit(c)||isalpha(c); +} + +void die(char *message, ...) +{ + shut=1; + errormsg=message; +} + +void *mp3_bufferbase; +void *mp3_bufferpointer; +unsigned int mp3_buffer_free; + +void *my_malloc(size_t size) +{ + void *alloc; + + if (!mp3_bufferbase) + { + mp3_bufferbase = mp3_bufferpointer + = rb->plugin_get_mp3_buffer(&mp3_buffer_free); +#if MEM <= 8 && !defined(SIMULATOR) + /* loaded as an overlay, protect from overwriting ourselves */ + if ((unsigned)(ovl_start_addr - (unsigned char *)mp3_bufferbase) + < mp3_buffer_free) + mp3_buffer_free = ovl_start_addr - (unsigned char *)mp3_bufferbase; +#endif + } + if (size + 4 > mp3_buffer_free) + return 0; + alloc = mp3_bufferpointer; + mp3_bufferpointer += size + 4; + mp3_buffer_free -= size + 4; + return alloc; +} + +void setmallocpos(void *pointer) +{ + mp3_bufferpointer = pointer; + mp3_buffer_free = mp3_bufferpointer - mp3_bufferbase; +} + +/* this is the plugin entry point */ +enum plugin_status plugin_start(struct plugin_api* api, void* parameter) +{ + /* this macro should be called as the first thing you do in the plugin. + it test that the api version and model the plugin was compiled for + matches the machine it is running on */ + TEST_PLUGIN_API(api); + + /* if you are using a global api pointer, don't forget to copy it! + otherwise you will get lovely "I04: IllInstr" errors... :-) */ + rb = api; + shut=0; + cleanshut=0; + mp3_bufferbase=mp3_bufferpointer=0; + mp3_buffer_free=0; + + /* now go ahead and have fun! */ + rb->splash(HZ*2, true, "Rockboy v0.3"); + rb->lcd_clear_display(); + gnuboy_main(parameter); + + if(shut&&!cleanshut) { + rb->splash(HZ*2, true, errormsg); + return PLUGIN_ERROR; + } + + rb->splash(HZ*2, true, "Shutting down.. byebye ^^"); + + cleanup(); + + return PLUGIN_OK; +} |