rockbox/apps/plugins/zxbox/zxbox.c
Andrew Mahone 23d9812273 loader-initialized global plugin API:
struct plugin_api *rb is declared in PLUGIN_HEADER, and pointed to by
__header.api

the loader uses this pointer to initialize rb before calling entry_point

entry_point is no longer passed a pointer to the plugin API

all plugins, and pluginlib functions, are modified to refer to the
global rb

pluginlib functions which only served to copy the API pointer are
removed

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@19776 a1c6a512-1295-4272-9138-f99709370657
2009-01-16 10:34:40 +00:00

269 lines
6.6 KiB
C

/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (c) 2006 Anton Romanov
*
* 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#include "zxconfig.h"
PLUGIN_HEADER
PLUGIN_IRAM_DECLARE
#include "spkey_p.h"
spkeyboard kb_mkey;
bool exit_requested=false;
bool clear_kbd=0;
extern bool zxbox_menu(void);
/* DUMMIES ... to clean */
unsigned int scrmul=0;
int privatemap;
int use_shm = 0;
int small_screen,pause_on_iconify;
int vga_pause_bg;
#include "keymaps.h"
#include "zxvid_com.h"
#include "spmain.h"
#include "spperif.h"
struct zxbox_settings settings;
/* doesn't fit into .ibss */
unsigned char image_array [ HEIGHT * WIDTH ];
static int previous_state;
#ifdef USE_GREY
GREY_INFO_STRUCT_IRAM
static unsigned char *gbuf;
static size_t gbuf_size = 0;
#endif
long video_frames IBSS_ATTR = 0 ;
long start_time IBSS_ATTR = 0;
enum plugin_status plugin_start(const void* parameter)
{
PLUGIN_IRAM_INIT(rb)
#if LCD_DEPTH > 1
rb->lcd_set_backdrop(NULL);
#endif
rb->splash(HZ, "Welcome to ZXBox");
sp_init();
#ifdef USE_GREY
/* get the remainder of the plugin buffer */
gbuf = (unsigned char *) rb->plugin_get_buffer(&gbuf_size);
#ifdef USE_BUFFERED_GREY
grey_init(gbuf, gbuf_size, GREY_BUFFERED|GREY_ON_COP, LCD_WIDTH,
LCD_HEIGHT, NULL);
#else
grey_init(gbuf, gbuf_size, GREY_ON_COP, LCD_WIDTH, LCD_HEIGHT, NULL);
#endif /* USE_BUFFERED_GREY */
/* switch on greyscale overlay */
grey_show(true);
#endif /* USE_GREY */
#if defined(HAVE_ADJUSTABLE_CPU_FREQ)
rb->cpu_boost(true);
#endif
start_time = *rb->current_tick;
#ifdef RB_PROFILE
rb->profile_thread();
#endif
start_spectemu(parameter);
#ifdef RB_PROFILE
rb->profstop();
#endif
#if defined(HAVE_ADJUSTABLE_CPU_FREQ)
rb->cpu_boost(false);
#endif
#ifdef USE_GREY
grey_show(false);
grey_release();
#endif
#if CONFIG_CODEC == SWCODEC && !defined SIMULATOR
rb->pcm_play_stop();
#endif
return PLUGIN_OK;
}
void init_spect_key(void)
{
clear_keystates();
init_basekeys();
}
void spkb_process_events( int evenframe )
{
if(evenframe){
int ki;
#if (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) || \
(CONFIG_KEYPAD == IPOD_1G2G_PAD)
if (rb->button_hold())
{
#if defined(HAVE_ADJUSTABLE_CPU_FREQ)
rb->cpu_boost(false);
#endif
exit_requested=1;
#ifdef USE_GREY
grey_show(false);
#endif
return;
}
#endif
int buttons = rb->button_status();
if ( buttons == previous_state )
return;
previous_state = buttons;
#if (CONFIG_KEYPAD != IPOD_4G_PAD) && (CONFIG_KEYPAD != IPOD_3G_PAD) && \
(CONFIG_KEYPAD != IPOD_1G2G_PAD)
if (buttons & ZX_MENU)
{
#if defined(HAVE_ADJUSTABLE_CPU_FREQ)
rb->cpu_boost(false);
#endif
exit_requested=1;
#ifdef USE_GREY
grey_show(false);
#endif
return;
}
#endif
spkb_state_changed = 1;
if (settings.kempston){
if ( buttons & ZX_RIGHT ){
ki = KS_TO_KEY(SK_KP_Right);
spkb_kbstate[ki].state = 1;
}
else if (buttons & ZX_LEFT){
ki = KS_TO_KEY(SK_KP_Left);
spkb_kbstate[ki].state = 1;
}
else{
ki = KS_TO_KEY(SK_KP_Right);
spkb_kbstate[ki].state = 0;
ki = KS_TO_KEY(SK_KP_Left);
spkb_kbstate[ki].state = 0;
}
if ( buttons & ZX_UP ){
ki = KS_TO_KEY(SK_KP_Up);
spkb_kbstate[ki].state = 1;
}
else if (buttons & ZX_DOWN){
ki = KS_TO_KEY(SK_KP_Down);
spkb_kbstate[ki].state = 1;
}
else{
ki = KS_TO_KEY(SK_KP_Up);
spkb_kbstate[ki].state = 0;
ki = KS_TO_KEY(SK_KP_Down);
spkb_kbstate[ki].state = 0;
}
if ( buttons & ZX_SELECT ){
ki = KS_TO_KEY(SK_KP_Insert);
spkb_kbstate[ki].state = 1;
}
else{
ki = KS_TO_KEY(SK_KP_Insert);
spkb_kbstate[ki].state = 0;
}
}
else {
if ( buttons & ZX_RIGHT ){
ki = KS_TO_KEY(intkeys[3]);
spkb_kbstate[ki].state = 1;
}
else{
ki = KS_TO_KEY(intkeys[3]);
spkb_kbstate[ki].state = 0;
}
if ( buttons & ZX_LEFT ){
ki = KS_TO_KEY(intkeys[2]);
spkb_kbstate[ki].state = 1;
}
else{
ki = KS_TO_KEY(intkeys[2]);
spkb_kbstate[ki].state = 0;
}
if ( buttons & ZX_UP ){
ki = KS_TO_KEY(intkeys[0]);
spkb_kbstate[ki].state = 1;
}
else{
ki = KS_TO_KEY(intkeys[0]);
spkb_kbstate[ki].state = 0;
}
if ( buttons & ZX_DOWN ){
ki = KS_TO_KEY(intkeys[1]);
spkb_kbstate[ki].state = 1;
}
else{
ki = KS_TO_KEY(intkeys[1]);
spkb_kbstate[ki].state = 0;
}
if ( buttons & ZX_SELECT ){
ki = KS_TO_KEY(intkeys[4]);
spkb_kbstate[ki].state = 1;
}
else{
ki = KS_TO_KEY(intkeys[4]);
spkb_kbstate[ki].state = 0;
}
}
process_keys();
}
}
void press_key(int c){
spkb_state_changed = 1;
int ki;
if ( c == 'E' )
ki = KS_TO_KEY(SK_KP_Enter);
else if (c == 'S' )
ki = KS_TO_KEY(SK_KP_Space);
else
ki = KS_TO_KEY(c);
spkb_kbstate[ki].state = 1;
process_keys();
}