libx48ng/src/main.c

191 lines
4.3 KiB
C
Raw Normal View History

2022-03-24 13:41:22 +01:00
#include <errno.h>
#include <fcntl.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
2022-03-24 13:41:22 +01:00
#include <unistd.h>
#include <langinfo.h>
#include <locale.h>
#include "debugger.h"
2022-03-24 13:41:22 +01:00
#include "hp48.h"
#include "resources.h"
#include "x48.h"
#if defined( GUI_IS_X11 )
2023-04-27 12:15:59 +02:00
char* progname;
#endif
2022-03-24 13:41:22 +01:00
int saved_argc;
2023-04-27 12:15:59 +02:00
char** saved_argv;
saturn_t saturn;
2023-04-27 12:15:59 +02:00
void signal_handler( int sig ) {
switch ( sig ) {
2023-05-10 14:06:07 +02:00
case SIGINT: /* Ctrl-C */
2023-04-27 12:15:59 +02:00
enter_debugger |= USER_INTERRUPT;
break;
case SIGALRM:
got_alarm = 1;
break;
case SIGPIPE:
exit_x48( 0 );
exit( 0 );
default:
break;
}
}
2023-04-27 12:15:59 +02:00
int main( int argc, char** argv ) {
sigset_t set;
struct sigaction sa;
long flags;
struct itimerval it;
setlocale( LC_ALL, "C" );
#if defined( GUI_IS_X11 )
2023-04-27 12:15:59 +02:00
/*
* Get the name we are called.
*/
progname = strrchr( argv[ 0 ], '/' );
if ( progname == NULL )
progname = argv[ 0 ];
else
progname++;
/*
* save command line options
*/
save_options( argc, argv );
/*
* Open up the display
*/
2023-05-10 14:06:07 +02:00
if ( InitDisplay( argc, argv ) < 0 )
2023-04-27 12:15:59 +02:00
exit( 1 );
2023-05-10 14:06:07 +02:00
2023-05-09 14:48:24 +02:00
#elif defined( GUI_IS_SDL1 )
// SDL Initialization
SDLInit();
// Global parameter initialization
get_resources();
#endif
2023-04-27 12:15:59 +02:00
/*
* initialize emulator stuff
*/
2023-05-09 14:48:24 +02:00
if ( init_emulator() != 0 ) {
// Some error or information messages
const char* errinit_title = "Emulator initialization failed";
const char* errinit_text[] = { "",
"In order to work the emulator needs",
"the following files:",
" rom: an HP48 rom dump",
" ram: ram file",
" hp48: HP state file",
"",
"These files must be in ~/.x48ng",
"",
"Install these files and try again.",
0 };
printf( "%s\n", errinit_title );
for ( int i = 0; errinit_text[ i ]; i++ )
printf( "%s\n", errinit_text[ i ] );
2023-04-27 12:15:59 +02:00
2023-05-09 14:48:24 +02:00
return 0;
}
#if defined( GUI_IS_X11 )
2023-04-27 12:15:59 +02:00
/*
* Create the HP-48 window
*/
if ( CreateWindows( saved_argc, saved_argv ) < 0 ) {
2023-05-09 14:37:54 +02:00
fprintf( stderr, "can\'t create window\n" );
2023-04-27 12:15:59 +02:00
exit( 1 );
}
2023-05-05 08:59:14 +02:00
init_annunc();
#elif defined( GUI_IS_SDL1 )
// Create the HP-48 window
SDLCreateHP();
#endif
2023-04-27 12:15:59 +02:00
2023-05-05 08:59:14 +02:00
serial_init();
2023-04-27 12:15:59 +02:00
2023-05-05 08:59:14 +02:00
init_display();
2023-04-27 12:15:59 +02:00
/*
* install a handler for SIGALRM
*/
sigemptyset( &set );
sigaddset( &set, SIGALRM );
sa.sa_handler = signal_handler;
sa.sa_mask = set;
#ifdef SA_RESTART
2023-04-27 12:15:59 +02:00
sa.sa_flags = SA_RESTART;
#endif
2023-04-27 12:15:59 +02:00
sigaction( SIGALRM, &sa, ( struct sigaction* )0 );
/*
* install a handler for SIGINT
*/
sigemptyset( &set );
sigaddset( &set, SIGINT );
sa.sa_handler = signal_handler;
sa.sa_mask = set;
#ifdef SA_RESTART
2023-04-27 12:15:59 +02:00
sa.sa_flags = SA_RESTART;
#endif
2023-04-27 12:15:59 +02:00
sigaction( SIGINT, &sa, ( struct sigaction* )0 );
/*
* install a handler for SIGPIPE
*/
sigemptyset( &set );
sigaddset( &set, SIGPIPE );
sa.sa_handler = signal_handler;
sa.sa_mask = set;
#ifdef SA_RESTART
2023-04-27 12:15:59 +02:00
sa.sa_flags = SA_RESTART;
#endif
2023-04-27 12:15:59 +02:00
sigaction( SIGPIPE, &sa, ( struct sigaction* )0 );
/*
* set the real time interval timer
*/
int interval = 20000;
2023-04-27 12:15:59 +02:00
it.it_interval.tv_sec = 0;
it.it_interval.tv_usec = interval;
2023-04-27 12:15:59 +02:00
it.it_value.tv_sec = 0;
it.it_value.tv_usec = interval;
2023-04-27 12:15:59 +02:00
setitimer( ITIMER_REAL, &it, ( struct itimerval* )0 );
/*
* Set stdin flags to not include O_NDELAY and O_NONBLOCK
*/
flags = fcntl( STDIN_FILENO, F_GETFL, 0 );
flags &= ~O_NDELAY;
flags &= ~O_NONBLOCK;
fcntl( STDIN_FILENO, F_SETFL, flags );
2023-05-02 13:42:58 +02:00
/************************/
/* Start emulation loop */
/************************/
2023-04-27 12:15:59 +02:00
do {
if ( !exec_flags )
emulate();
else
emulate_debug();
2023-04-27 12:15:59 +02:00
debug();
} while ( 1 );
2023-04-27 12:15:59 +02:00
return 0;
}