preparing for persisting bus_info and cpu

This commit is contained in:
Gwenhael Le Moine 2024-04-15 16:17:45 +02:00
parent 21e5e00cf1
commit 8137109c17
No known key found for this signature in database
GPG key ID: FDFE3669426707A7
7 changed files with 117 additions and 26 deletions

View file

@ -57,10 +57,6 @@ static address hdw_seg;
word crc; word crc;
void bus_init( void ) { bus_reset(); }
void bus_exit( void ) {}
static inline void update_crc( byte nibble ) { crc = ( crc >> 4 ) ^ ( ( ( crc ^ nibble ) & 0xF ) * 0x1081 ); } static inline void update_crc( byte nibble ) { crc = ( crc >> 4 ) ^ ( ( ( crc ^ nibble ) & 0xF ) * 0x1081 ); }
void bus_read( byte* buf, address adr, address len ) void bus_read( byte* buf, address adr, address len )

View file

@ -50,8 +50,8 @@ extern word crc;
// FAST_PEEK_MAX must not be greater than the size of the hdw registers (64) // FAST_PEEK_MAX must not be greater than the size of the hdw registers (64)
#define FAST_PEEK_MAX 64 #define FAST_PEEK_MAX 64
extern void bus_init( void ); /* extern void bus_init( void ); */
extern void bus_exit( void ); /* extern void bus_exit( void ); */
extern void bus_read( byte* buf, address adr, address len ); extern void bus_read( byte* buf, address adr, address len );
extern void bus_write( byte* buf, address adr, address len ); extern void bus_write( byte* buf, address adr, address len );

View file

@ -41,26 +41,25 @@ static int emulator_state = EMULATOR_RUN;
void emulator_set_state( int state ) { emulator_state = state; } void emulator_set_state( int state ) { emulator_state = state; }
void emulator_init( char* fn_rom, char* fn_ram, char* fn_port1, char* fn_port2 ) void emulator_init( char* fn_rom, char* fn_ram, char* fn_port1, char* fn_port2, char* fn_bus, char* fn_cpu )
{ {
static bool locked = false;
get_absolute_working_dir_path( "hpemung" ); get_absolute_working_dir_path( "hpemung" );
rom_init( fn_rom ); rom_init( fn_rom );
ram_init( fn_ram ); ram_init( fn_ram );
ports_init( fn_port1, fn_port2 ); ports_init( fn_port1, fn_port2 );
bus_init();
if ( !locked ) cpu_init( fn_cpu );
locked = true; bus_init( fn_bus );
} }
void emulator_exit( char* fn_rom, char* fn_ram, char* fn_port1, char* fn_port2 ) void emulator_exit( char* fn_rom, char* fn_ram, char* fn_port1, char* fn_port2, char* fn_bus, char* fn_cpu )
{ {
rom_exit();
ram_exit( fn_ram );
ports_exit( fn_port1, fn_port2 ); ports_exit( fn_port1, fn_port2 );
bus_exit(); ram_exit( fn_ram );
rom_exit();
bus_exit( fn_bus );
cpu_exit( fn_cpu );
} }
static inline void throttle( bool is_needed ) static inline void throttle( bool is_needed )

View file

@ -9,8 +9,8 @@ enum EmulatorStates { EMULATOR_STOP, EMULATOR_STEP, EMULATOR_RUN };
extern volatile bool please_exit; extern volatile bool please_exit;
extern void emulator_init( char* fn_rom, char* fn_ram, char* fn_port1, char* fn_port2 ); extern void emulator_init( char* fn_rom, char* fn_ram, char* fn_port1, char* fn_port2, char* fn_bus, char* fn_cpu );
extern void emulator_exit( char* fn_rom, char* fn_ram, char* fn_port1, char* fn_port2 ); extern void emulator_exit( char* fn_rom, char* fn_ram, char* fn_port1, char* fn_port2, char* fn_bus, char* fn_cpu );
extern bool emulator_run( void ); extern bool emulator_run( void );
extern void emulator_set_state( int state ); extern void emulator_set_state( int state );

View file

@ -10,6 +10,7 @@
#include "rpl.h" #include "rpl.h"
#include "bus.h" #include "bus.h"
#include "cpu.h"
#include "config.h" #include "config.h"
#include "types.h" #include "types.h"
@ -271,6 +272,9 @@ int write_mem_file( char* absolute_filename, nibble* mem, int size )
return 1; return 1;
} }
/********************/
/* PUBLIC FUNCTIONS */
/********************/
void load_file_on_stack( char* filename ) void load_file_on_stack( char* filename )
{ {
FILE* f; FILE* f;
@ -331,6 +335,97 @@ void load_file_on_stack( char* filename )
free( obj ); free( obj );
} }
void bus_init( char* filename )
{
char fullpath[ MAX_LENGTH_FILENAME ];
get_absolute_working_dir_path();
sprintf( fullpath, "%s%s", absolute_working_dir_path, filename );
if ( config.verbose )
fprintf( stderr, "fullpath = %s\n", fullpath );
int filesize = file_size( fullpath );
/* if ( filesize ) { */
/* FILE* fp; */
/* if ( NULL == ( fp = fopen( fullpath, "w" ) ) ) { */
/* if ( config.verbose ) */
/* fprintf( stderr, "can\'t open %s\n", fullpath ); */
/* return; */
/* } */
/* fwrite( &bus_info, sizeof( BusInfo ), 1, fp ); */
/* fclose( fp ); */
/* } else */
bus_reset();
}
void bus_exit( char* filename )
{
char fullpath[ MAX_LENGTH_FILENAME ];
get_absolute_working_dir_path();
sprintf( fullpath, "%s%s", absolute_working_dir_path, filename );
if ( config.verbose )
fprintf( stderr, "fullpath = %s\n", fullpath );
FILE* fp;
if ( NULL == ( fp = fopen( fullpath, "w" ) ) ) {
if ( config.verbose )
fprintf( stderr, "can\'t open %s\n", fullpath );
return;
}
fwrite( &bus_info, sizeof( BusInfo ), 1, fp );
fclose( fp );
}
void cpu_init( char* filename )
{
char fullpath[ MAX_LENGTH_FILENAME ];
get_absolute_working_dir_path();
sprintf( fullpath, "%s%s", absolute_working_dir_path, filename );
if ( config.verbose )
fprintf( stderr, "fullpath = %s\n", fullpath );
int filesize = file_size( fullpath );
if ( filesize ) {
/* FILE* fp; */
/* if ( NULL == ( fp = fopen( fullpath, "w" ) ) ) { */
/* if ( config.verbose ) */
/* fprintf( stderr, "can\'t open %s\n", fullpath ); */
/* return; */
/* } */
/* fwrite( &cpu, sizeof( Cpu ), 1, fp ); */
/* fclose( fp ); */
}
}
void cpu_exit( char* filename )
{
char fullpath[ MAX_LENGTH_FILENAME ];
get_absolute_working_dir_path();
sprintf( fullpath, "%s%s", absolute_working_dir_path, filename );
if ( config.verbose )
fprintf( stderr, "fullpath = %s\n", fullpath );
FILE* fp;
if ( NULL == ( fp = fopen( fullpath, "w" ) ) ) {
if ( config.verbose )
fprintf( stderr, "can\'t open %s\n", fullpath );
return;
}
fwrite( &cpu, sizeof( Cpu ), 1, fp );
fclose( fp );
}
void rom_init( char* filename ) void rom_init( char* filename )
{ {
int size; int size;
@ -430,7 +525,6 @@ void ram_init( char* filename )
bus_info.ram_mask = ram_size - 1; bus_info.ram_mask = ram_size - 1;
} }
void ram_exit( char* filename ) void ram_exit( char* filename )
{ {
fprintf( stderr, "\n\nfilename = %s\n", filename ); fprintf( stderr, "\n\nfilename = %s\n", filename );
@ -492,7 +586,6 @@ void ports_init( char* filename1, char* filename2 )
bus_info.ben = false; bus_info.ben = false;
current_bank = 0; current_bank = 0;
} }
void ports_exit( char* filename1, char* filename2 ) void ports_exit( char* filename1, char* filename2 )
{ {
char fullpath1[ MAX_LENGTH_FILENAME ]; char fullpath1[ MAX_LENGTH_FILENAME ];

View file

@ -7,12 +7,15 @@ extern int file_size( char* filename );
extern void load_file_on_stack( char* filename ); extern void load_file_on_stack( char* filename );
extern void rom_init( char* filename ); extern void rom_init( char* filename );
extern void rom_exit();
extern void ram_init( char* filename ); extern void ram_init( char* filename );
extern void ram_exit( char* filename );
extern void ports_init( char* filename1, char* filename2 ); extern void ports_init( char* filename1, char* filename2 );
extern void cpu_init( char* filename );
extern void bus_init( char* filename );
extern void rom_exit();
extern void ram_exit( char* filename );
extern void ports_exit( char* filename1, char* filename2 ); extern void ports_exit( char* filename1, char* filename2 );
extern void cpu_exit( char* filename );
extern void bus_exit( char* filename );
#endif #endif

View file

@ -25,7 +25,7 @@ int main( int argc, char* argv[] )
if ( !gui_init() ) if ( !gui_init() )
exit( EXIT_FAILURE ); exit( EXIT_FAILURE );
emulator_init( "rom", "ram", "port1", "port2" ); emulator_init( "rom", "ram", "port1", "port2", "bus", "cpu" );
while ( !please_exit ) { while ( !please_exit ) {
if ( please_exit ) if ( please_exit )
@ -49,7 +49,7 @@ int main( int argc, char* argv[] )
break; break;
} }
emulator_exit( "rom", "ram", "port1", "port2" ); emulator_exit( "rom", "ram", "port1", "port2", "bus", "cpu" );
gui_exit(); gui_exit();
return 0; return 0;