revision 27:1ef09a52cd1e
summary |
tree |
shortlog |
changelog |
graph |
changeset |
raw | bz2 | zip | gz changeset | 27:1ef09a52cd1e |
parent | 26:ad258e3daaa5 |
child | 28:81c206f59dc7 |
author | nkeynes |
date | Sun Dec 25 01:28:39 2005 +0000 (18 years ago) |
Refactor all the GUI bits out of the main directory (except for a couple
lingering temporarily in loader.c
Fix a few timeslice issues
lingering temporarily in loader.c
Fix a few timeslice issues
src/dreamcast.c | view | annotate | diff | log | ||
src/gui/callbacks.c | view | annotate | diff | log | ||
src/gui/gui.c | view | annotate | diff | log | ||
src/gui/gui.h | view | annotate | diff | log | ||
src/loader.c | view | annotate | diff | log | ||
src/main.c | view | annotate | diff | log | ||
src/modules.h | view | annotate | diff | log | ||
src/pvr2/pvr2.c | view | annotate | diff | log | ||
src/sh4/sh4core.c | view | annotate | diff | log | ||
src/sh4/sh4core.h | view | annotate | diff | log |
1.1 --- a/src/dreamcast.c Sat Dec 24 08:02:18 2005 +00001.2 +++ b/src/dreamcast.c Sun Dec 25 01:28:39 2005 +00001.3 @@ -1,5 +1,5 @@1.4 /**1.5 - * $Id: dreamcast.c,v 1.9 2005-12-24 08:02:14 nkeynes Exp $1.6 + * $Id: dreamcast.c,v 1.10 2005-12-25 01:28:36 nkeynes Exp $1.7 * Central switchboard for the system. This pulls all the individual modules1.8 * together into some kind of coherent structure. This is also where you'd1.9 * add Naomi support, if I ever get a board to play with...1.10 @@ -111,9 +111,10 @@1.11 }1.12 dreamcast_state = STATE_RUNNING;1.13 while( dreamcast_state == STATE_RUNNING ) {1.14 + int time_to_run = timeslice_length;1.15 for( i=0; i<num_modules; i++ ) {1.16 if( modules[i]->run_time_slice != NULL )1.17 - modules[i]->run_time_slice( timeslice_length );1.18 + time_to_run = modules[i]->run_time_slice( time_to_run );1.19 }1.21 }1.22 @@ -123,7 +124,6 @@1.23 modules[i]->stop();1.24 }1.25 dreamcast_state = STATE_STOPPED;1.26 - update_gui();1.27 }1.29 void dreamcast_stop( void )
2.1 --- a/src/gui/callbacks.c Sat Dec 24 08:02:18 2005 +00002.2 +++ b/src/gui/callbacks.c Sun Dec 25 01:28:39 2005 +00002.3 @@ -1,5 +1,5 @@2.4 /**2.5 - * $Id: callbacks.c,v 1.8 2005-12-24 08:02:18 nkeynes Exp $2.6 + * $Id: callbacks.c,v 1.9 2005-12-25 01:28:39 nkeynes Exp $2.7 *2.8 * All GTK callbacks go here (stubs are autogenerated by Glade)2.9 *2.10 @@ -102,7 +102,6 @@2.11 gpointer user_data)2.12 {2.13 dreamcast_reset();2.14 - update_gui();2.15 }2.18 @@ -119,7 +118,7 @@2.19 gpointer user_data)2.20 {2.21 sh4_execute_instruction();2.22 - update_gui();2.23 + gtk_gui_update();2.24 }
3.1 --- a/src/gui/gui.c Sat Dec 24 08:02:18 2005 +00003.2 +++ b/src/gui/gui.c Sun Dec 25 01:28:39 2005 +00003.3 @@ -2,22 +2,40 @@3.4 #include <stdarg.h>3.5 #include <gnome.h>3.6 #include <math.h>3.7 +#include "dream.h"3.8 #include "dreamcast.h"3.9 -#include "gui.h"3.10 #include "mem.h"3.11 #include "sh4dasm.h"3.12 #include "sh4core.h"3.13 +#include "gui/gui.h"3.15 #define REGISTER_FONT "-*-fixed-medium-r-normal--12-*-*-*-*-*-iso8859-1"3.17 GdkColor clrNormal, clrChanged, clrError, clrWarn, clrPC, clrDebug, clrTrace;3.18 PangoFontDescription *fixed_list_font;3.20 +debug_info_t main_debug;3.21 +3.22 +3.23 void open_file_callback(GtkWidget *btn, gint result, gpointer user_data);3.25 -void init_gui() {3.26 +void gtk_gui_init( void );3.27 +void gtk_gui_update( void );3.28 +int gtk_gui_run_slice( int microsecs );3.29 +3.30 +struct dreamcast_module gtk_gui_module = { "Debugger", gtk_gui_init,3.31 + gtk_gui_update, NULL,3.32 + gtk_gui_run_slice,3.33 + gtk_gui_update,3.34 + NULL, NULL };3.35 +3.36 +const cpu_desc_t cpu_descs[4] = { &sh4_cpu_desc, &arm_cpu_desc, &armt_cpu_desc, NULL };3.37 +3.38 +3.39 +void gtk_gui_init() {3.40 GdkColormap *map;3.41 -3.42 + GtkWidget *debug_win;3.43 +3.44 clrNormal.red = clrNormal.green = clrNormal.blue = 0;3.45 clrChanged.red = clrChanged.green = 64*256;3.46 clrChanged.blue = 154*256;3.47 @@ -41,16 +59,23 @@3.48 gdk_colormap_alloc_color(map, &clrDebug, TRUE, TRUE);3.49 gdk_colormap_alloc_color(map, &clrTrace, TRUE, TRUE);3.50 fixed_list_font = pango_font_description_from_string("Courier 10");3.51 + debug_win = create_debug_win ();3.52 + main_debug = init_debug_win(debug_win, cpu_descs);3.53 + init_mmr_win();3.54 +3.55 + gtk_widget_show (debug_win);3.56 +3.57 }3.59 -void gui_run_slice( int millisecs )3.60 +int gtk_gui_run_slice( int microsecs )3.61 {3.62 while( gtk_events_pending() )3.63 gtk_main_iteration();3.64 update_icount(main_debug);3.65 + return microsecs;3.66 }3.68 -void update_gui(void) {3.69 +void gtk_gui_update(void) {3.70 update_registers(main_debug);3.71 update_icount(main_debug);3.72 update_mmr_win();
4.1 --- a/src/gui/gui.h Sat Dec 24 08:02:18 2005 +00004.2 +++ b/src/gui/gui.h Sun Dec 25 01:28:39 2005 +00004.3 @@ -7,7 +7,10 @@4.4 #include <gnome.h>4.5 #include "dream.h"4.6 #include "disasm.h"4.7 +#include "modules.h"4.8 #include "gui/interface.h"4.9 +#include "sh4/sh4dasm.h"4.10 +#include "aica/armdasm.h"4.12 #ifdef __cplusplus4.13 extern "C" {4.14 @@ -16,8 +19,9 @@4.15 #endif4.16 #endif4.18 -void init_gui(void);4.19 -void update_gui(void);4.20 +void gtk_gui_init(void);4.21 +void gtk_gui_update(void);4.22 +extern struct dreamcast_module gtk_gui_module;4.24 typedef struct debug_info_struct *debug_info_t;4.25 extern debug_info_t main_debug;
5.1 --- a/src/loader.c Sat Dec 24 08:02:18 2005 +00005.2 +++ b/src/loader.c Sun Dec 25 01:28:39 2005 +00005.3 @@ -1,5 +1,5 @@5.4 /**5.5 - * $Id: loader.c,v 1.7 2005-12-24 08:02:14 nkeynes Exp $5.6 + * $Id: loader.c,v 1.8 2005-12-25 01:28:36 nkeynes Exp $5.7 *5.8 * File loading routines, mostly for loading demos without going through the5.9 * whole procedure of making a CD image for them.5.10 @@ -76,9 +76,7 @@5.11 read( fd, load, BOOTSTRAP_SIZE );5.12 bootstrap_dump( load );5.13 sh4_set_pc( BOOTSTRAP_LOAD_ADDR + 0x300 );5.14 - set_disassembly_region( main_debug, BOOTSTRAP_LOAD_ADDR );5.15 - set_disassembly_pc( main_debug, sh4r.pc, TRUE );5.16 - update_gui();5.17 + gtk_gui_update();5.18 } else {5.19 /* look for a valid ISO9660 header */5.20 lseek( fd, 32768, SEEK_SET );5.21 @@ -103,7 +101,5 @@5.22 int file_load_binary( const gchar *filename ) {5.23 mem_load_block( filename, BINARY_LOAD_ADDR, -1 );5.24 sh4_set_pc( BINARY_LOAD_ADDR );5.25 - set_disassembly_region( main_debug, BINARY_LOAD_ADDR );5.26 - set_disassembly_pc( main_debug, sh4r.pc, TRUE );5.27 - update_gui();5.28 + gtk_gui_update();5.29 }
6.1 --- a/src/main.c Sat Dec 24 08:02:18 2005 +00006.2 +++ b/src/main.c Sun Dec 25 01:28:39 2005 +00006.3 @@ -10,35 +10,20 @@6.4 #include <gnome.h>6.6 #include "gui/gui.h"6.7 -#include "sh4core.h"6.8 -#include "sh4dasm.h"6.9 -#include "aica/armdasm.h"6.10 -#include "mem.h"6.11 -6.12 -debug_info_t main_debug;6.13 -6.14 -const cpu_desc_t cpu_descs[4] = { &sh4_cpu_desc, &arm_cpu_desc, &armt_cpu_desc, NULL };6.15 +#include "dream.h"6.16 +#include "dreamcast.h"6.18 int6.19 main (int argc, char *argv[])6.20 {6.21 - GtkWidget *debug_win;6.22 -6.23 #ifdef ENABLE_NLS6.24 bindtextdomain (PACKAGE, PACKAGE_LOCALE_DIR);6.25 textdomain (PACKAGE);6.26 #endif6.27 + dreamcast_init();6.28 gnome_init ("dreamon", VERSION, argc, argv);6.29 - init_gui();6.30 - debug_win = create_debug_win ();6.31 - main_debug = init_debug_win(debug_win, cpu_descs);6.32 + dreamcast_register_module( >k_gui_module );6.33 video_open();6.34 - dreamcast_init();6.35 - init_mmr_win(); /* Note: must be done after sh4_init */6.36 - sh4_reset();6.37 - update_gui();6.38 - gtk_widget_show (debug_win);6.39 - set_disassembly_region( main_debug, 0xA0000000 );6.40 // mem_new_watch( 0x0C204818, 0x0C204830, WATCH_WRITE );6.42 emit( main_debug, EMIT_INFO, -1, "DreamOn! ready..." );
7.1 --- a/src/modules.h Sat Dec 24 08:02:18 2005 +00007.2 +++ b/src/modules.h Sun Dec 25 01:28:39 2005 +00007.3 @@ -33,7 +33,7 @@7.4 * Execute one time-slice worth of operations, for the given number of7.5 * micro-seconds.7.6 */7.7 - void (*run_time_slice)( int microsecs );7.8 + int (*run_time_slice)( int microsecs );7.9 /**7.10 * Set the module into a stopped state (may be NULL)7.11 */
8.1 --- a/src/pvr2/pvr2.c Sat Dec 24 08:02:18 2005 +00008.2 +++ b/src/pvr2/pvr2.c Sun Dec 25 01:28:39 2005 +00008.3 @@ -10,7 +10,7 @@8.4 char *video_base;8.6 void pvr2_init( void );8.7 -void pvr2_run_slice( int );8.8 +int pvr2_run_slice( int );8.9 void pvr2_next_frame( void );8.11 struct dreamcast_module pvr2_module = { "PVR2", pvr2_init, NULL, NULL,8.12 @@ -26,13 +26,14 @@8.13 uint32_t pvr2_time_counter = 0;8.14 uint32_t pvr2_time_per_frame = 20000;8.16 -void pvr2_run_slice( int microsecs )8.17 +int pvr2_run_slice( int microsecs )8.18 {8.19 pvr2_time_counter += microsecs;8.20 if( pvr2_time_counter >= pvr2_time_per_frame ) {8.21 pvr2_next_frame();8.22 pvr2_time_counter -= pvr2_time_per_frame;8.23 }8.24 + return microsecs;8.25 }8.27 uint32_t vid_stride, vid_lpf, vid_ppl, vid_hres, vid_vres, vid_col;
9.1 --- a/src/sh4/sh4core.c Sat Dec 24 08:02:18 2005 +00009.2 +++ b/src/sh4/sh4core.c Sun Dec 25 01:28:39 2005 +00009.3 @@ -1,5 +1,5 @@9.4 /**9.5 - * $Id: sh4core.c,v 1.9 2005-12-23 11:44:55 nkeynes Exp $9.6 + * $Id: sh4core.c,v 1.10 2005-12-25 01:28:39 nkeynes Exp $9.7 *9.8 * SH4 emulation core, and parent module for all the SH4 peripheral9.9 * modules.9.10 @@ -26,6 +26,17 @@9.11 #include "clock.h"9.12 #include "intc.h"9.14 +/* CPU-generated exception code/vector pairs */9.15 +#define EXC_POWER_RESET 0x000 /* vector special */9.16 +#define EXC_MANUAL_RESET 0x0209.17 +#define EXC_SLOT_ILLEGAL 0x1A09.18 +#define EXC_ILLEGAL 0x1809.19 +#define EXV_ILLEGAL 0x1009.20 +#define EXC_TRAP 0x1609.21 +#define EXV_TRAP 0x1009.22 +#define EXC_FPDISABLE 0x8009.23 +#define EXV_FPDISABLE 0x1009.24 +9.25 uint32_t sh4_freq = SH4_BASE_RATE;9.26 uint32_t sh4_bus_freq = SH4_BASE_RATE;9.27 uint32_t sh4_peripheral_freq = SH4_BASE_RATE / 2;9.28 @@ -34,7 +45,7 @@9.30 void sh4_init( void );9.31 void sh4_reset( void );9.32 -void sh4_run_slice( int );9.33 +int sh4_run_slice( int );9.34 void sh4_start( void );9.35 void sh4_stop( void );9.36 void sh4_save_state( FILE *f );9.37 @@ -45,41 +56,65 @@9.38 sh4_save_state, sh4_load_state };9.40 struct sh4_registers sh4r;9.41 -static int running = 0;9.43 void sh4_init(void)9.44 {9.45 register_io_regions( mmio_list_sh4mmio );9.46 mmu_init();9.47 + sh4_reset();9.48 }9.50 void sh4_reset(void)9.51 {9.52 /* zero everything out, for the sake of having a consistent state. */9.53 memset( &sh4r, 0, sizeof(sh4r) );9.54 +9.55 + /* Resume running if we were halted */9.56 + sh4r.sh4_state = SH4_STATE_RUNNING;9.57 +9.58 sh4r.pc = 0xA0000000;9.59 sh4r.new_pc= 0xA0000002;9.60 sh4r.vbr = 0x00000000;9.61 sh4r.fpscr = 0x00040001;9.62 sh4r.sr = 0x700000F0;9.63 +9.64 + /* Mem reset will do this, but if we want to reset _just_ the SH4... */9.65 + MMIO_WRITE( MMU, EXPEVT, EXC_POWER_RESET );9.66 +9.67 + /* Peripheral modules */9.68 intc_reset();9.69 }9.71 -void sh4_run_slice( int microsecs )9.72 +int sh4_run_slice( int microsecs )9.73 {9.74 - int count = sh4_freq * microsecs;9.75 + int target = sh4r.icount + sh4_freq * microsecs;9.76 + int start = sh4r.icount;9.77 int i;9.79 - for( i=0; i<count; i++ ) {9.80 - sh4_execute_instruction();9.81 + if( sh4r.sh4_state != SH4_STATE_RUNNING ) {9.82 + if( sh4r.int_pending != 0 )9.83 + sh4r.sh4_state = SH4_STATE_RUNNING;;9.84 }9.85 - TMU_run_slice( microsecs );9.86 - SCIF_run_slice( microsecs );9.87 +9.88 + while( sh4r.icount < target && sh4r.sh4_state == SH4_STATE_RUNNING ) {9.89 + sh4r.icount++;9.90 + if( !sh4_execute_instruction() )9.91 + break;9.92 + }9.93 + if( target != sh4r.icount ) {9.94 + /* Halted - compute time actually executed */9.95 + microsecs = (sh4r.icount - start) / sh4_freq;9.96 + }9.97 + if( sh4r.sh4_state != SH4_STATE_STANDBY ) {9.98 + TMU_run_slice( microsecs );9.99 + SCIF_run_slice( microsecs );9.100 + }9.101 + return microsecs;9.102 }9.104 void sh4_stop(void)9.105 {9.106 - running = 0;9.107 +9.108 }9.110 void sh4_save_state( FILE *f )9.111 @@ -94,14 +129,6 @@9.112 return SCIF_load_state( f );9.113 }9.115 -void sh4_run(void)9.116 -{9.117 - running = 1;9.118 - while( running ) {9.119 - sh4_execute_instruction();9.120 - }9.121 -}9.122 -9.123 /********************** SH4 emulation core ****************************/9.125 void sh4_set_pc( int pc )9.126 @@ -115,40 +142,8 @@9.128 }9.130 -void sh4_runfor(uint32_t count)9.131 -{9.132 - running = 1;9.133 - while( running && count--) {9.134 - int pc = sh4r.pc;9.135 - sh4_execute_instruction();9.136 - /*9.137 - if( sh4r.pc == 0x8C0C1636 ||9.138 - sh4r.pc == 0x8C0C1634 ) {9.139 - WARN( "Branching to %08X from %08X", sh4r.pc, pc );9.140 - sh4_stop();9.141 - }*/9.142 - }9.143 -}9.144 -9.145 -int sh4_isrunning(void)9.146 -{9.147 - return running;9.148 -}9.149 -9.150 -void sh4_runto( uint32_t target_pc, uint32_t count )9.151 -{9.152 - running = 1;9.153 - while( running && count--) {9.154 - sh4_execute_instruction();9.155 - if( sh4r.pc == target_pc ) {9.156 - running = 0;9.157 - break;9.158 - }9.159 - }9.160 -}9.161 -9.162 -#define UNDEF(ir) do{ ERROR( "Raising exception on undefined instruction at %08x, opcode = %04x", sh4r.pc, ir ); sh4_stop(); RAISE( EXC_ILLEGAL, EXV_ILLEGAL ); }while(0)9.163 -#define UNIMP(ir) do{ ERROR( "Halted on unimplemented instruction at %08x, opcode = %04x", sh4r.pc, ir ); sh4_stop(); return; }while(0)9.164 +#define UNDEF(ir) do{ ERROR( "Raising exception on undefined instruction at %08x, opcode = %04x", sh4r.pc, ir ); RAISE( EXC_ILLEGAL, EXV_ILLEGAL ); }while(0)9.165 +#define UNIMP(ir) do{ ERROR( "Halted on unimplemented instruction at %08x, opcode = %04x", sh4r.pc, ir ); dreamcast_stop(); return FALSE; }while(0)9.167 #define RAISE( x, v ) do{ \9.168 if( sh4r.vbr == 0 ) { \9.169 @@ -163,7 +158,7 @@9.170 sh4r.new_pc = sh4r.pc + 2; \9.171 sh4_load_sr( sh4r.ssr |SR_MD|SR_BL|SR_RB ); \9.172 } \9.173 - return; } while(0)9.174 + return TRUE; } while(0)9.176 #define MEM_READ_BYTE( addr ) sh4_read_byte(addr)9.177 #define MEM_READ_WORD( addr ) sh4_read_word(addr)9.178 @@ -184,16 +179,6 @@9.180 #define FP_WIDTH (IS_FPU_DOUBLESIZE() ? 8 : 4)9.182 -#define EXC_POWER_RESET 0x000 /* vector special */9.183 -#define EXC_MANUAL_RESET 0x0209.184 -#define EXC_SLOT_ILLEGAL 0x1A09.185 -#define EXC_ILLEGAL 0x1809.186 -#define EXV_ILLEGAL 0x1009.187 -#define EXC_TRAP 0x1609.188 -#define EXV_TRAP 0x1009.189 -#define EXC_FPDISABLE 0x8009.190 -#define EXV_FPDISABLE 0x1009.191 -9.192 #define CHECK( x, c, v ) if( !x ) RAISE( c, v )9.193 #define CHECKPRIV() CHECK( IS_SH4_PRIVMODE(), EXC_ILLEGAL, EXV_ILLEGAL )9.194 #define CHECKFPUEN() CHECK( IS_FPU_ENABLED(), EXC_FPDISABLE, EXV_FPDISABLE )9.195 @@ -250,7 +235,7 @@9.196 WARN( "Accepting interrupt %03X, from %08X => %08X", code, sh4r.spc, sh4r.pc );9.197 }9.199 -void sh4_execute_instruction( void )9.200 +gboolean sh4_execute_instruction( void )9.201 {9.202 int pc;9.203 unsigned short ir;9.204 @@ -331,14 +316,14 @@9.205 sh4r.pr = sh4r.pc + 4;9.206 sh4r.pc = sh4r.new_pc;9.207 sh4r.new_pc = pc + 4 + RN(ir);9.208 - return;9.209 + return TRUE;9.210 case 2: /* BRAF Rn */9.211 CHECKDEST( pc + 4 + RN(ir) );9.212 CHECKSLOTILLEGAL();9.213 sh4r.in_delay_slot = 1;9.214 sh4r.pc = sh4r.new_pc;9.215 sh4r.new_pc = pc + 4 + RN(ir);9.216 - return;9.217 + return TRUE;9.218 case 8: /* PREF [Rn] */9.219 tmp = RN(ir);9.220 if( (tmp & 0xFC000000) == 0xE0000000 ) {9.221 @@ -442,10 +427,14 @@9.222 sh4r.in_delay_slot = 1;9.223 sh4r.pc = sh4r.new_pc;9.224 sh4r.new_pc = sh4r.pr;9.225 - return;9.226 + return TRUE;9.227 case 1: /* SLEEP */9.228 - running = 0;9.229 - break;9.230 + if( MMIO_READ( CPG, STBCR ) & 0x80 ) {9.231 + sh4r.sh4_state = SH4_STATE_STANDBY;9.232 + } else {9.233 + sh4r.sh4_state = SH4_STATE_SLEEP;9.234 + }9.235 + return FALSE; /* Halt CPU */9.236 case 2: /* RTE */9.237 CHECKPRIV();9.238 CHECKDEST( sh4r.spc );9.239 @@ -455,7 +444,7 @@9.240 sh4r.new_pc = sh4r.spc;9.241 sh4_load_sr( sh4r.ssr );9.242 WARN( "RTE => %08X", sh4r.new_pc );9.243 - return;9.244 + return TRUE;9.245 default:UNDEF(ir);9.246 }9.247 break;9.248 @@ -681,7 +670,7 @@9.249 sh4r.pc = sh4r.new_pc;9.250 sh4r.new_pc = RN(ir);9.251 sh4r.pr = pc + 4;9.252 - return;9.253 + return TRUE;9.254 case 0x0E: /* LDC Rn, SR */9.255 CHECKPRIV();9.256 sh4_load_sr( RN(ir) );9.257 @@ -784,7 +773,7 @@9.258 sh4r.in_delay_slot = 1;9.259 sh4r.pc = sh4r.new_pc;9.260 sh4r.new_pc = RN(ir);9.261 - return;9.262 + return TRUE;9.263 case 0x2E: /* LDC Rn, VBR */9.264 CHECKPRIV();9.265 sh4r.vbr = RN(ir);9.266 @@ -992,7 +981,7 @@9.267 CHECKDEST( sh4r.pc + (PCDISP8(ir)<<1) + 4 )9.268 sh4r.pc += (PCDISP8(ir)<<1) + 4;9.269 sh4r.new_pc = sh4r.pc + 2;9.270 - return;9.271 + return TRUE;9.272 }9.273 break;9.274 case 11:/* BF disp8 */9.275 @@ -1001,7 +990,7 @@9.276 CHECKDEST( sh4r.pc + (PCDISP8(ir)<<1) + 4 )9.277 sh4r.pc += (PCDISP8(ir)<<1) + 4;9.278 sh4r.new_pc = sh4r.pc + 2;9.279 - return;9.280 + return TRUE;9.281 }9.282 break;9.283 case 13:/* BT/S disp8 */9.284 @@ -1012,7 +1001,7 @@9.285 sh4r.pc = sh4r.new_pc;9.286 sh4r.new_pc = pc + (PCDISP8(ir)<<1) + 4;9.287 sh4r.in_delay_slot = 1;9.288 - return;9.289 + return TRUE;9.290 }9.291 break;9.292 case 15:/* BF/S disp8 */9.293 @@ -1022,7 +1011,7 @@9.294 sh4r.in_delay_slot = 1;9.295 sh4r.pc = sh4r.new_pc;9.296 sh4r.new_pc = pc + (PCDISP8(ir)<<1) + 4;9.297 - return;9.298 + return TRUE;9.299 }9.300 break;9.301 default: UNDEF(ir);9.302 @@ -1039,7 +1028,7 @@9.303 sh4r.in_delay_slot = 1;9.304 sh4r.pc = sh4r.new_pc;9.305 sh4r.new_pc = pc + 4 + (DISP12(ir)<<1);9.306 - return;9.307 + return TRUE;9.308 case 11:/* 1011dddddddddddd */9.309 /* BSR disp12 */9.310 CHECKDEST( sh4r.pc + (DISP12(ir)<<1) + 4 )9.311 @@ -1048,7 +1037,7 @@9.312 sh4r.pr = pc + 4;9.313 sh4r.pc = sh4r.new_pc;9.314 sh4r.new_pc = pc + 4 + (DISP12(ir)<<1);9.315 - return;9.316 + return TRUE;9.317 case 12:/* 1100xxxxdddddddd */9.318 switch( (ir&0x0F00)>>8 ) {9.319 case 0: /* MOV.B R0, [GBR + disp8] */
10.1 --- a/src/sh4/sh4core.h Sat Dec 24 08:02:18 2005 +000010.2 +++ b/src/sh4/sh4core.h Sun Dec 25 01:28:39 2005 +000010.3 @@ -1,5 +1,5 @@10.4 /**10.5 - * $Id: sh4core.h,v 1.4 2005-12-23 11:44:55 nkeynes Exp $10.6 + * $Id: sh4core.h,v 1.5 2005-12-25 01:28:39 nkeynes Exp $10.7 *10.8 * This file defines the public functions exported by the SH4 core, except10.9 * for disassembly functions defined in sh4dasm.h10.10 @@ -19,6 +19,7 @@10.11 #ifndef sh4core_H10.12 #define sh4core_H 110.14 +#include <glib/gtypes.h>10.15 #include <stdint.h>10.16 #include <stdio.h>10.18 @@ -29,6 +30,29 @@10.19 #endif10.20 #endif10.22 +10.23 +/**10.24 + * SH4 is running normally10.25 + */10.26 +#define SH4_STATE_RUNNING 110.27 +/**10.28 + * SH4 is not executing instructions but all peripheral modules are still10.29 + * running10.30 + */10.31 +#define SH4_STATE_SLEEP 210.32 +/**10.33 + * SH4 is not executing instructions, DMAC is halted, but all other peripheral10.34 + * modules are still running10.35 + */10.36 +#define SH4_STATE_DEEP_SLEEP 310.37 +/**10.38 + * SH4 is not executing instructions and all peripheral modules are also10.39 + * stopped. As close as you can get to powered-off without actually being10.40 + * off.10.41 + */10.42 +#define SH4_STATE_STANDBY 410.43 +10.44 +10.45 struct sh4_registers {10.46 uint32_t r[16];10.47 uint32_t r_bank[8]; /* hidden banked registers */10.48 @@ -45,6 +69,7 @@10.49 uint32_t int_pending; /* flag set by the INTC = pending priority level */10.50 int in_delay_slot; /* flag to indicate the current instruction is in10.51 * a delay slot (certain rules apply) */10.52 + int sh4_state; /* Current power-on state (one of the SH4_STATE_* values ) */10.53 };10.55 extern struct sh4_registers sh4r;10.56 @@ -59,7 +84,7 @@10.57 int sh4_isrunning( void );10.58 void sh4_stop( void );10.59 void sh4_set_pc( int );10.60 -void sh4_execute_instruction( void );10.61 +gboolean sh4_execute_instruction( void );10.62 void sh4_raise_exception( int, int );10.63 void sh4_set_breakpoint( uint32_t pc, int type );
.