document 15625
This commit is contained in:
parent
18bc490153
commit
12aadf3e9a
3 changed files with 37 additions and 36 deletions
|
@ -13,6 +13,20 @@
|
|||
|
||||
#define NR_TIMERS 4
|
||||
|
||||
#define RAM_BASE_SX 0x70000
|
||||
#define ACCESSTIME_SX ( 0x70052 - RAM_BASE_SX )
|
||||
#define ACCESSCRC_SX ( 0x7005F - RAM_BASE_SX )
|
||||
#define TIMEOUT_SX ( 0x70063 - RAM_BASE_SX )
|
||||
#define TIMEOUTCLK_SX ( 0x70070 - RAM_BASE_SX )
|
||||
|
||||
#define RAM_BASE_GX 0x80000
|
||||
#define ACCESSTIME_GX ( 0x80058 - RAM_BASE_GX )
|
||||
#define ACCESSCRC_GX ( 0x80065 - RAM_BASE_GX )
|
||||
#define TIMEOUT_GX ( 0x80069 - RAM_BASE_GX )
|
||||
#define TIMEOUTCLK_GX ( 0x80076 - RAM_BASE_GX )
|
||||
|
||||
#define calc_crc( nib ) ( crc = ( crc >> 4 ) ^ ( ( ( crc ^ ( nib ) ) & 0xf ) * 0x1081 ) )
|
||||
|
||||
typedef struct x48_timer_t {
|
||||
word_1 run;
|
||||
word_64 start;
|
||||
|
@ -24,6 +38,8 @@ static x48_timer_t timers[ NR_TIMERS ];
|
|||
|
||||
static long systime_offset = 0;
|
||||
|
||||
static word_64 zero = 0;
|
||||
|
||||
/*
|
||||
* Ticks for THU 01.01.1970 00:00:00
|
||||
*/
|
||||
|
@ -40,20 +56,6 @@ word_64 set_0_time = 0x0;
|
|||
*/
|
||||
word_64 time_offset = 0x0;
|
||||
|
||||
#define RAM_BASE_SX 0x70000
|
||||
#define ACCESSTIME_SX ( 0x70052 - RAM_BASE_SX )
|
||||
#define ACCESSCRC_SX ( 0x7005F - RAM_BASE_SX )
|
||||
#define TIMEOUT_SX ( 0x70063 - RAM_BASE_SX )
|
||||
#define TIMEOUTCLK_SX ( 0x70070 - RAM_BASE_SX )
|
||||
|
||||
#define RAM_BASE_GX 0x80000
|
||||
#define ACCESSTIME_GX ( 0x80058 - RAM_BASE_GX )
|
||||
#define ACCESSCRC_GX ( 0x80065 - RAM_BASE_GX )
|
||||
#define TIMEOUT_GX ( 0x80069 - RAM_BASE_GX )
|
||||
#define TIMEOUTCLK_GX ( 0x80076 - RAM_BASE_GX )
|
||||
|
||||
#define calc_crc( nib ) ( crc = ( crc >> 4 ) ^ ( ( ( crc ^ ( nib ) ) & 0xf ) * 0x1081 ) )
|
||||
|
||||
/*
|
||||
* Set ACCESSTIME: (on startup)
|
||||
*
|
||||
|
@ -95,7 +97,7 @@ void set_accesstime( void )
|
|||
|
||||
ticks = tv.tv_sec;
|
||||
ticks <<= 13;
|
||||
ticks += ( tv.tv_usec << 7 ) / 15625;
|
||||
ticks += ( tv.tv_usec << 7 ) / USEC_PER_FRAME;
|
||||
|
||||
time_offset = unix_0_time + set_0_time;
|
||||
ticks += time_offset;
|
||||
|
@ -164,11 +166,11 @@ void start_timer( int timer )
|
|||
timers[ timer ].run = 1;
|
||||
if ( timer == T1_TIMER ) {
|
||||
timers[ timer ].start = ( tv.tv_sec << 9 );
|
||||
timers[ timer ].start += ( tv.tv_usec / 15625 ) >> 3;
|
||||
timers[ timer ].start += ( tv.tv_usec / USEC_PER_FRAME ) >> 3;
|
||||
} else {
|
||||
timers[ timer ].start = tv.tv_sec;
|
||||
timers[ timer ].start <<= 13;
|
||||
timers[ timer ].start += ( tv.tv_usec << 7 ) / 15625;
|
||||
timers[ timer ].start += ( tv.tv_usec << 7 ) / USEC_PER_FRAME;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -191,11 +193,11 @@ void restart_timer( int timer )
|
|||
timers[ timer ].run = 1;
|
||||
if ( timer == T1_TIMER ) {
|
||||
timers[ timer ].start = ( tv.tv_sec << 9 );
|
||||
timers[ timer ].start += ( tv.tv_usec / 15625 ) >> 3;
|
||||
timers[ timer ].start += ( tv.tv_usec / USEC_PER_FRAME ) >> 3;
|
||||
} else {
|
||||
timers[ timer ].start = tv.tv_sec;
|
||||
timers[ timer ].start <<= 13;
|
||||
timers[ timer ].start += ( tv.tv_usec << 7 ) / 15625;
|
||||
timers[ timer ].start += ( tv.tv_usec << 7 ) / USEC_PER_FRAME;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -217,30 +219,27 @@ void stop_timer( int timer )
|
|||
timers[ timer ].run = 0;
|
||||
if ( timer == T1_TIMER ) {
|
||||
timers[ timer ].stop = ( tv.tv_sec << 9 );
|
||||
timers[ timer ].stop += ( tv.tv_usec / 15625 ) >> 3;
|
||||
timers[ timer ].stop += ( tv.tv_usec / USEC_PER_FRAME ) >> 3;
|
||||
} else {
|
||||
timers[ timer ].stop = tv.tv_sec;
|
||||
timers[ timer ].stop <<= 13;
|
||||
timers[ timer ].stop += ( tv.tv_usec << 7 ) / 15625;
|
||||
timers[ timer ].stop += ( tv.tv_usec << 7 ) / USEC_PER_FRAME;
|
||||
}
|
||||
|
||||
timers[ timer ].value += timers[ timer ].stop - timers[ timer ].start;
|
||||
// add_sub_64(&timers[timer].stop, &timers[timer].start,
|
||||
// &timers[timer].value);
|
||||
}
|
||||
|
||||
void reset_timer( int timer )
|
||||
{
|
||||
if ( timer > NR_TIMERS )
|
||||
return;
|
||||
|
||||
timers[ timer ].run = 0;
|
||||
timers[ timer ].start = 0;
|
||||
timers[ timer ].stop = 0;
|
||||
timers[ timer ].value = 0;
|
||||
}
|
||||
|
||||
static word_64 zero = 0;
|
||||
|
||||
word_64 get_timer( int timer )
|
||||
{
|
||||
struct timeval tv;
|
||||
|
@ -259,11 +258,11 @@ word_64 get_timer( int timer )
|
|||
|
||||
if ( timer == T1_TIMER ) {
|
||||
stop = ( tv.tv_sec << 9 );
|
||||
stop += ( tv.tv_usec / 15625 ) >> 3;
|
||||
stop += ( tv.tv_usec / USEC_PER_FRAME ) >> 3;
|
||||
} else {
|
||||
stop = tv.tv_sec;
|
||||
stop <<= 13;
|
||||
stop += ( tv.tv_usec << 7 ) / 15625;
|
||||
stop += ( tv.tv_usec << 7 ) / USEC_PER_FRAME;
|
||||
}
|
||||
timers[ timer ].value += stop - timers[ timer ].start;
|
||||
}
|
||||
|
@ -302,18 +301,18 @@ t1_t2_ticks get_t1_t2( void )
|
|||
|
||||
if ( timers[ T1_TIMER ].run ) {
|
||||
stop = ( tv.tv_sec << 9 );
|
||||
stop += ( tv.tv_usec / 15625 ) >> 3;
|
||||
if ( timers[ T1_TIMER ].start <= stop ) {
|
||||
stop += ( tv.tv_usec / USEC_PER_FRAME ) >> 3;
|
||||
|
||||
if ( timers[ T1_TIMER ].start <= stop )
|
||||
timers[ T1_TIMER ].value += stop - timers[ T1_TIMER ].start;
|
||||
} else {
|
||||
else
|
||||
fprintf( stderr, "clock running backwards\n" );
|
||||
}
|
||||
}
|
||||
ticks.t1_ticks = timers[ T1_TIMER ].value;
|
||||
|
||||
stop = tv.tv_sec;
|
||||
stop <<= 13;
|
||||
stop += ( tv.tv_usec << 7 ) / 15625;
|
||||
stop += ( tv.tv_usec << 7 ) / USEC_PER_FRAME;
|
||||
|
||||
stop += time_offset;
|
||||
|
||||
|
|
|
@ -14,6 +14,9 @@
|
|||
#define RUN_TIMER 2
|
||||
#define IDLE_TIMER 3
|
||||
|
||||
/* LCD refresh rate is 64Hz according to https://www.hpcalc.org/hp48/docs/faq/48faq-6.html */
|
||||
#define USEC_PER_FRAME ( 1000000 / 64 )
|
||||
|
||||
// Keys
|
||||
#define NB_KEYS 49
|
||||
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
#include "debugger.h"
|
||||
#include "emulator.h"
|
||||
#include "runtime_options.h"
|
||||
#include "ui.h" /* init_ui(); */
|
||||
#include "ui.h" /* setup_frontend(); init_ui(); */
|
||||
|
||||
void signal_handler( int sig )
|
||||
{
|
||||
|
@ -76,11 +76,10 @@ int main( int argc, char** argv )
|
|||
In emulate() sigalarm_triggered triggers LCD refresh and UI event handling
|
||||
*/
|
||||
struct itimerval it;
|
||||
int interval = 15625; /* 64Hz according to https://www.hpcalc.org/hp48/docs/faq/48faq-6.html */
|
||||
it.it_interval.tv_sec = 0;
|
||||
it.it_interval.tv_usec = interval;
|
||||
it.it_interval.tv_usec = USEC_PER_FRAME;
|
||||
it.it_value.tv_sec = 0;
|
||||
it.it_value.tv_usec = interval;
|
||||
it.it_value.tv_usec = USEC_PER_FRAME;
|
||||
setitimer( ITIMER_REAL, &it, ( struct itimerval* )0 );
|
||||
|
||||
/**********************************************************/
|
||||
|
|
Loading…
Add table
Reference in a new issue