forked from Miroirs/x49gp
Compare commits
2 commits
092b7f49af
...
08271cf4c2
Author | SHA1 | Date | |
---|---|---|---|
|
08271cf4c2 | ||
|
9f77361637 |
9 changed files with 61 additions and 54 deletions
14
Makefile
14
Makefile
|
@ -5,6 +5,13 @@ VERSION_MAJOR = 1
|
|||
VERSION_MINOR = 3
|
||||
PATCHLEVEL = 2
|
||||
|
||||
INSTALL_PREFIX = /usr/local
|
||||
INSTALL_BINARY_DIR = "$(INSTALL_PREFIX)"/bin
|
||||
INSTALL_DATA_DIR = "$(INSTALL_PREFIX)"/share/$(TARGET)
|
||||
INSTALL_DOC_DIR = "$(INSTALL_PREFIX)"/doc/$(TARGET)
|
||||
INSTALL_MENU_DIR = "$(INSTALL_PREFIX)"/share/applications
|
||||
INSTALL_MAN_DIR = "$(INSTALL_PREFIX)/share/man/man1"
|
||||
|
||||
#
|
||||
DEBUG_CFLAGS = -g # -pg
|
||||
OPTIM ?= 2
|
||||
|
@ -216,13 +223,6 @@ else
|
|||
endif
|
||||
|
||||
# Installation
|
||||
INSTALL_PREFIX = /usr/local
|
||||
INSTALL_BINARY_DIR = "$(INSTALL_PREFIX)"/bin
|
||||
INSTALL_DATA_DIR = "$(INSTALL_PREFIX)"/share/$(TARGET)
|
||||
INSTALL_DOC_DIR = "$(INSTALL_PREFIX)"/doc/$(TARGET)
|
||||
INSTALL_MENU_DIR = "$(INSTALL_PREFIX)"/share/applications
|
||||
INSTALL_MAN_DIR = "$(INSTALL_PREFIX)/share/man/man1"
|
||||
|
||||
dist/$(TARGET).desktop: dist/$(TARGET).desktop.in
|
||||
perl -p -e "s!TARGET!$(TARGET)!" < dist/$(TARGET).desktop.in >$@
|
||||
|
||||
|
|
2
dist/x49gpng.scd
vendored
2
dist/x49gpng.scd
vendored
|
@ -51,7 +51,7 @@ Please consult HP's manual (for their official firmware) or the documentation of
|
|||
|
||||
- *-h* *--help* print this message and exit
|
||||
- *--verbose* print out more information
|
||||
- *--state*[=_filename_] alternate config file
|
||||
- *--datadir*[=_absolute path_] alternate datadir (default: $XDG_CONFIG_HOME/x49gpng/)
|
||||
- *--50g* emulate an HP 50g (default)
|
||||
- *--49gp* emulate an HP 49g+
|
||||
- *--newrpl-keyboard* label keyboard for newRPL
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
|
||||
#include "x49gp.h"
|
||||
#include "ui.h"
|
||||
#include "options.h"
|
||||
|
||||
#define FLASH_STATE_NORMAL 0
|
||||
|
||||
|
@ -435,11 +436,11 @@ static int flash_load( x49gp_module_t* module, GKeyFile* key )
|
|||
|
||||
if ( flash->size > st.st_size ) {
|
||||
fprintf( stderr, "Flash too small, rebuilding\n" );
|
||||
x49gp->startup_reinit = X49GP_REINIT_FLASH_FULL;
|
||||
opt.reinit = X49GP_REINIT_FLASH_FULL;
|
||||
}
|
||||
if ( x49gp->startup_reinit >= X49GP_REINIT_FLASH ) {
|
||||
if ( opt.reinit >= X49GP_REINIT_FLASH ) {
|
||||
|
||||
if ( x49gp->startup_reinit == X49GP_REINIT_FLASH_FULL )
|
||||
if ( opt.reinit == X49GP_REINIT_FLASH_FULL )
|
||||
memset( phys_ram_base + flash->offset, 0xff, flash->size - st.st_size );
|
||||
|
||||
bootfd = x49gp_module_open_rodata(
|
||||
|
@ -467,7 +468,7 @@ static int flash_load( x49gp_module_t* module, GKeyFile* key )
|
|||
close( bootfd );
|
||||
g_free( bootfile );
|
||||
|
||||
if ( x49gp->startup_reinit == X49GP_REINIT_FLASH_FULL ) {
|
||||
if ( opt.reinit == X49GP_REINIT_FLASH_FULL ) {
|
||||
/* The stock firmware expects special markers in certain
|
||||
spots across the flash. Without these, the user banks
|
||||
act up and are not usable, and PINIT apparently won't
|
||||
|
@ -485,8 +486,8 @@ static int flash_load( x49gp_module_t* module, GKeyFile* key )
|
|||
|
||||
retry:
|
||||
filename = NULL;
|
||||
if ( x49gp->firmware != NULL )
|
||||
filename = g_strdup( x49gp->firmware );
|
||||
if ( opt.firmware != NULL )
|
||||
filename = g_strdup( opt.firmware );
|
||||
else
|
||||
gui_open_firmware( x49gp, &filename );
|
||||
|
||||
|
@ -496,7 +497,7 @@ retry:
|
|||
fprintf( stderr, "%s: %s:%u: open %s: %s\n", module->name, __FUNCTION__, __LINE__, filename, strerror( errno ) );
|
||||
/* Mark firmware as invalid if there is one */
|
||||
memset( phys_ram_base + flash->offset + BOOT_SIZE, 0, 16 );
|
||||
if ( x49gp->firmware != NULL ) {
|
||||
if ( opt.firmware != NULL ) {
|
||||
fprintf( stderr, "Warning: Could not "
|
||||
"open selected firmware, "
|
||||
"falling back to bootloader "
|
||||
|
@ -514,7 +515,7 @@ retry:
|
|||
/* Mark firmware as invalid
|
||||
if there is one */
|
||||
memset( phys_ram_base + flash->offset + BOOT_SIZE, 0, 16 );
|
||||
if ( x49gp->firmware != NULL ) {
|
||||
if ( opt.firmware != NULL ) {
|
||||
fprintf( stderr, "Warning: "
|
||||
"Could not read "
|
||||
"selected firmware, "
|
||||
|
@ -531,7 +532,7 @@ retry:
|
|||
} else if ( bytes_read < 16 || memcmp( phys_ram_base + flash->offset + BOOT_SIZE, "KINPOUPDATEIMAGE", 16 ) != 0 ) {
|
||||
/* Mark firmware as invalid */
|
||||
memset( phys_ram_base + flash->offset + BOOT_SIZE, 0, 16 );
|
||||
if ( x49gp->firmware != NULL ) {
|
||||
if ( opt.firmware != NULL ) {
|
||||
fprintf( stderr, "Warning: "
|
||||
"Firmware is invalid, "
|
||||
"falling back to "
|
||||
|
@ -553,7 +554,7 @@ retry:
|
|||
/* Mark firmware as invalid
|
||||
if there is one */
|
||||
memset( phys_ram_base + flash->offset + BOOT_SIZE, 0, 16 );
|
||||
if ( x49gp->firmware != NULL ) {
|
||||
if ( opt.firmware != NULL ) {
|
||||
fprintf( stderr, "Warning: "
|
||||
"Could not read "
|
||||
"selected firmware, "
|
||||
|
|
|
@ -285,11 +285,6 @@ int main( int argc, char** argv )
|
|||
if ( x49gp_modules_init( x49gp ) )
|
||||
exit( EXIT_FAILURE );
|
||||
|
||||
x49gp->basename = g_path_get_dirname( opt.state_filename );
|
||||
x49gp->debug_port = opt.debug_port;
|
||||
x49gp->startup_reinit = opt.reinit;
|
||||
x49gp->firmware = opt.firmware;
|
||||
|
||||
int error = x49gp_modules_load( x49gp, opt.state_filename );
|
||||
if ( error || opt.reinit >= X49GP_REINIT_REBOOT_ONLY ) {
|
||||
if ( error && error != -EAGAIN )
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
|
||||
#include "list.h"
|
||||
#include "x49gp.h"
|
||||
#include "options.h"
|
||||
|
||||
int x49gp_modules_init( x49gp_t* x49gp )
|
||||
{
|
||||
|
@ -94,22 +95,22 @@ int x49gp_modules_load( x49gp_t* x49gp, const char* filename )
|
|||
printf( "%s:%u:\n", __FUNCTION__, __LINE__ );
|
||||
#endif
|
||||
|
||||
if ( g_mkdir_with_parents( x49gp->basename, 0755 ) ) {
|
||||
if ( g_mkdir_with_parents( opt.datadir, 0755 ) ) {
|
||||
error = -errno;
|
||||
fprintf( stderr, "%s:%u: g_mkdir_with_parents: %s\n", __FUNCTION__, __LINE__, strerror( errno ) );
|
||||
return error;
|
||||
}
|
||||
|
||||
x49gp->state_filename = g_key_file_new();
|
||||
if ( NULL == x49gp->state_filename ) {
|
||||
x49gp->state = g_key_file_new();
|
||||
if ( NULL == x49gp->state ) {
|
||||
fprintf( stderr, "%s:%u: g_key_file_new: Out of memory\n", __FUNCTION__, __LINE__ );
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
if ( !g_key_file_load_from_file( x49gp->state_filename, filename, G_KEY_FILE_KEEP_COMMENTS, &gerror ) &&
|
||||
if ( !g_key_file_load_from_file( x49gp->state, filename, G_KEY_FILE_KEEP_COMMENTS, &gerror ) &&
|
||||
!g_error_matches( gerror, G_FILE_ERROR, G_FILE_ERROR_NOENT ) ) {
|
||||
fprintf( stderr, "%s:%u: g_key_file_load_from_file: %s\n", __FUNCTION__, __LINE__, gerror->message );
|
||||
g_key_file_free( x49gp->state_filename );
|
||||
g_key_file_free( x49gp->state );
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
|
@ -117,7 +118,7 @@ int x49gp_modules_load( x49gp_t* x49gp, const char* filename )
|
|||
|
||||
list_for_each_entry( module, &x49gp->modules, list )
|
||||
{
|
||||
error = module->load( module, x49gp->state_filename );
|
||||
error = module->load( module, x49gp->state );
|
||||
if ( error ) {
|
||||
if ( error == -EAGAIN )
|
||||
result = -EAGAIN;
|
||||
|
@ -154,12 +155,12 @@ int x49gp_modules_save( x49gp_t* x49gp, const char* filename )
|
|||
|
||||
list_for_each_entry( module, &x49gp->modules, list )
|
||||
{
|
||||
error = module->save( module, x49gp->state_filename );
|
||||
error = module->save( module, x49gp->state );
|
||||
if ( error )
|
||||
return error;
|
||||
}
|
||||
|
||||
data = g_key_file_to_data( x49gp->state_filename, &length, &gerror );
|
||||
data = g_key_file_to_data( x49gp->state, &length, &gerror );
|
||||
if ( NULL == data ) {
|
||||
fprintf( stderr, "%s:%u: g_key_file_to_data: %s\n", __FUNCTION__, __LINE__, gerror->message );
|
||||
return -ENOMEM;
|
||||
|
@ -213,7 +214,6 @@ int x49gp_module_unregister( x49gp_module_t* module )
|
|||
|
||||
int x49gp_module_get_filename( x49gp_module_t* module, GKeyFile* key, const char* name, char* reset, char** valuep, char** path )
|
||||
{
|
||||
x49gp_t* x49gp = module->x49gp;
|
||||
int error;
|
||||
|
||||
error = x49gp_module_get_string( module, key, name, reset, valuep );
|
||||
|
@ -223,7 +223,7 @@ int x49gp_module_get_filename( x49gp_module_t* module, GKeyFile* key, const char
|
|||
return error;
|
||||
}
|
||||
|
||||
*path = g_build_filename( x49gp->basename, *valuep, NULL );
|
||||
*path = g_build_filename( opt.datadir, *valuep, NULL );
|
||||
if ( NULL == path ) {
|
||||
fprintf( stderr, "%s: %s:%u: Out of memory\n", module->name, __FUNCTION__, __LINE__ );
|
||||
g_free( *valuep );
|
||||
|
@ -374,6 +374,8 @@ int x49gp_module_open_rodata( x49gp_module_t* module, const char* name, char** p
|
|||
int error;
|
||||
|
||||
*path = g_build_filename( x49gp->progpath, name, NULL );
|
||||
if ( opt.verbose )
|
||||
fprintf( stderr, "reading %s\n", *path );
|
||||
if ( NULL == *path ) {
|
||||
fprintf( stderr, "%s: %s:%u: Out of memory\n", module->name, __FUNCTION__, __LINE__ );
|
||||
return -ENOMEM;
|
||||
|
@ -386,6 +388,8 @@ int x49gp_module_open_rodata( x49gp_module_t* module, const char* name, char** p
|
|||
g_free( *path );
|
||||
|
||||
*path = g_build_filename( X49GP_DATADIR, name, NULL );
|
||||
if ( opt.verbose )
|
||||
fprintf( stderr, "reading %s\n", *path );
|
||||
if ( NULL == *path ) {
|
||||
fprintf( stderr, "%s: %s:%u: Out of memory\n", module->name, __FUNCTION__, __LINE__ );
|
||||
return -ENOMEM;
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include "gdbstub.h"
|
||||
|
||||
struct options opt = {
|
||||
.datadir = NULL,
|
||||
.config_lua_filename = NULL,
|
||||
.state_filename = NULL,
|
||||
.debug_port = 0,
|
||||
|
@ -140,9 +141,7 @@ void config_init( char* progname, int argc, char* argv[] )
|
|||
{"print-config", no_argument, &print_config_and_exit, true},
|
||||
{"verbose", no_argument, &clopt_verbose, true},
|
||||
|
||||
{"config", required_argument, NULL, 'c' },
|
||||
|
||||
{"state", required_argument, NULL, 1 },
|
||||
{"datadir", required_argument, NULL, 1 },
|
||||
|
||||
{"enable-debug", required_argument, NULL, 'D' },
|
||||
{"debug", no_argument, NULL, 'd' },
|
||||
|
@ -173,17 +172,22 @@ void config_init( char* progname, int argc, char* argv[] )
|
|||
"Valid options:\n"
|
||||
" -h --help print this message and exit\n"
|
||||
" --verbose print out more information\n"
|
||||
" --state[=<filename>] alternate config file\n"
|
||||
"\n"
|
||||
" --datadir[=<absolute path>] alternate datadir (default: $XDG_CONFIG_HOME/%s/)\n"
|
||||
"\n"
|
||||
" --50g emulate an HP 50g (default)\n"
|
||||
" --49gp emulate an HP 49g+\n"
|
||||
" --newrpl-keyboard label keyboard for newRPL\n"
|
||||
"\n"
|
||||
" -n --name[=<name>] set alternate UI name\n"
|
||||
" -t --font[=<fontname>] set alternate UI font\n"
|
||||
" -s --font-size[=<X>] scale text by X (default: 3)\n"
|
||||
" -S --display-scale[=<X>] scale LCD by X (default: 2)\n"
|
||||
"\n"
|
||||
" -D --enable-debug[=<port>] enable the debugger interface\n"
|
||||
" (default port: %u)\n"
|
||||
" -d --debug use along -D to also start the debugger immediately\n"
|
||||
"\n"
|
||||
" -f --reflash[=firmware] rebuild the flash using the supplied firmware\n"
|
||||
" (default: select one interactively)\n"
|
||||
" (implies -r for safety reasons)\n"
|
||||
|
@ -191,11 +195,12 @@ void config_init( char* progname, int argc, char* argv[] )
|
|||
" in the area beyond the firmware\n"
|
||||
" -r --reboot reboot on startup instead of continuing from the\n"
|
||||
" saved state in the state file\n\n"
|
||||
"\n"
|
||||
"The state file is formatted as INI file and contains the settings for which persistence makes sense like CPU "
|
||||
"registers, etc.\n"
|
||||
"If the state file is omitted, ~/.config/%s/state is used.\n"
|
||||
"Please consult the manual for more details on state file settings.\n",
|
||||
progname, VERSION_MAJOR, VERSION_MINOR, PATCHLEVEL, progname, DEFAULT_GDBSTUB_PORT, progname );
|
||||
progname, VERSION_MAJOR, VERSION_MINOR, PATCHLEVEL, progname, progname, DEFAULT_GDBSTUB_PORT, progname );
|
||||
exit( EXIT_SUCCESS );
|
||||
break;
|
||||
case 'r':
|
||||
|
@ -203,7 +208,7 @@ void config_init( char* progname, int argc, char* argv[] )
|
|||
opt.reinit = X49GP_REINIT_REBOOT_ONLY;
|
||||
break;
|
||||
case 1:
|
||||
opt.state_filename = strdup( optarg );
|
||||
opt.datadir = strdup( optarg );
|
||||
break;
|
||||
case 'D':
|
||||
do_enable_debugger = true;
|
||||
|
@ -245,9 +250,14 @@ void config_init( char* progname, int argc, char* argv[] )
|
|||
}
|
||||
}
|
||||
|
||||
const char* user_config_dir = g_get_user_config_dir();
|
||||
if ( opt.datadir == NULL ) {
|
||||
const char* user_config_dir = g_get_user_config_dir();
|
||||
opt.datadir = g_build_filename( user_config_dir, progname, NULL );
|
||||
}
|
||||
|
||||
opt.config_lua_filename = g_build_filename( user_config_dir, progname, config_lua_filename, NULL );
|
||||
opt.config_lua_filename = g_build_filename( opt.datadir, progname, config_lua_filename, NULL );
|
||||
|
||||
opt.state_filename = g_build_filename( opt.datadir, "state", NULL );
|
||||
|
||||
/**********************/
|
||||
/* 1. read config.lua */
|
||||
|
@ -316,8 +326,8 @@ void config_init( char* progname, int argc, char* argv[] )
|
|||
|
||||
if ( !haz_config_file ) {
|
||||
fprintf( stderr, "\nConfiguration file %s doesn't seem to exist or is invalid!\n", opt.config_lua_filename );
|
||||
fprintf( stderr, "You can solve this by running `mkdir -p %s/%s && %s --print-config >> %s`\n\n", user_config_dir, progname,
|
||||
progname, opt.config_lua_filename );
|
||||
fprintf( stderr, "You can solve this by running `mkdir -p %s/ && %s --print-config >> %s`\n\n", opt.datadir, progname,
|
||||
opt.config_lua_filename );
|
||||
}
|
||||
|
||||
if ( do_enable_debugger ) {
|
||||
|
@ -337,7 +347,4 @@ void config_init( char* progname, int argc, char* argv[] )
|
|||
if ( do_reflash_full )
|
||||
opt.reinit = X49GP_REINIT_FLASH_FULL;
|
||||
}
|
||||
|
||||
if ( opt.state_filename == NULL )
|
||||
opt.state_filename = g_build_filename( user_config_dir, progname, "state", NULL );
|
||||
}
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
#ifndef _CONFIG_H
|
||||
#define _CONFIG_H 1
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "x49gp.h"
|
||||
|
||||
#ifndef VERSION_MAJOR
|
||||
|
@ -31,6 +33,8 @@ struct options {
|
|||
int font_size;
|
||||
char* config_lua_filename;
|
||||
bool verbose;
|
||||
|
||||
char* datadir;
|
||||
};
|
||||
|
||||
extern struct options opt;
|
||||
|
|
|
@ -826,8 +826,8 @@ static void do_start_gdb_server( GtkMenuItem* menuitem, gpointer user_data )
|
|||
{
|
||||
x49gp_t* x49gp = user_data;
|
||||
|
||||
if ( x49gp->debug_port != 0 && !gdbserver_isactive() ) {
|
||||
gdbserver_start( x49gp->debug_port );
|
||||
if ( opt.debug_port != 0 && !gdbserver_isactive() ) {
|
||||
gdbserver_start( opt.debug_port );
|
||||
gdb_handlesig( x49gp->env, 0 );
|
||||
}
|
||||
}
|
||||
|
@ -1541,7 +1541,7 @@ static int ui_load( x49gp_module_t* module, GKeyFile* keyfile )
|
|||
g_signal_connect_swapped( G_OBJECT( menu_unmount ), "activate", G_CALLBACK( s3c2410_sdi_unmount ), x49gp );
|
||||
ui->menu_unmount = menu_unmount;
|
||||
|
||||
if ( x49gp->debug_port != 0 ) {
|
||||
if ( opt.debug_port != 0 ) {
|
||||
gtk_menu_shell_append( GTK_MENU_SHELL( ui->menu ), gtk_separator_menu_item_new() );
|
||||
|
||||
GtkWidget* menu_debug = gtk_menu_item_new_with_label( "Start debugger" );
|
||||
|
|
|
@ -83,13 +83,9 @@ struct __x49gp_s__ {
|
|||
|
||||
x49gp_ui_t* ui;
|
||||
|
||||
GKeyFile* state_filename;
|
||||
GKeyFile* state;
|
||||
const char* progname;
|
||||
const char* progpath;
|
||||
const char* basename;
|
||||
int debug_port;
|
||||
x49gp_reinit_t startup_reinit;
|
||||
char* firmware;
|
||||
};
|
||||
|
||||
extern void x49gp_set_idle( x49gp_t*, x49gp_arm_idle_t idle );
|
||||
|
|
Loading…
Reference in a new issue