Merge remote-tracking branch 'sliedes/to-upstream' into dev-home
[simavr] / simavr / sim / sim_core.h
index 0fc5dd5..22f781f 100644 (file)
 #ifndef SIM_CORE_H_
 #define SIM_CORE_H_
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 /*
  * Instruction decoder, run ONE instruction
  */
 uint16_t avr_run_one(avr_t * avr);
 
 /*
- * These are for internal access to the stack (for interupts)
+ * These are for internal access to the stack (for interrupts)
  */
 uint16_t _avr_sp_get(avr_t * avr);
 void _avr_sp_set(avr_t * avr, uint16_t sp);
 void _avr_push16(avr_t * avr, uint16_t v);
 
+#if CONFIG_SIMAVR_TRACE
+
 /*
  * Get a "pretty" register name
  */
 const char * avr_regname(uint8_t reg);
 
-
 /* 
  * DEBUG bits follow 
  * These will diseapear when gdb arrives
@@ -55,16 +60,43 @@ void avr_dump_state(avr_t * avr);
                }
 
 
+#if AVR_STACK_WATCH
+#define DUMP_STACK() \
+               for (int i = avr->trace_data->stack_frame_index; i; i--) {\
+                       int pci = i-1;\
+                       printf("\e[31m*** %04x: %-25s sp %04x\e[0m\n",\
+                                       avr->trace_data->stack_frame[pci].pc, \
+                                       avr->trace_data->codeline ? avr->trace_data->codeline[avr->trace_data->stack_frame[pci].pc>>1]->symbol : "unknown", \
+                                                       avr->trace_data->stack_frame[pci].sp);\
+               }
+#else
+#define DUMP_STACK()
+#endif
+
 #define CRASH()  {\
                DUMP_REG();\
-               printf("*** CYCLE %lld\n", avr->cycle);\
+               printf("*** CYCLE %" PRI_avr_cycle_count "PC %04x\n", avr->cycle, avr->pc);\
                for (int i = OLD_PC_SIZE-1; i > 0; i--) {\
-                       int pci = (avr->old_pci + i) & 0xf;\
+                       int pci = (avr->trace_data->old_pci + i) & 0xf;\
                        printf("\e[31m*** %04x: %-25s RESET -%d; sp %04x\e[0m\n",\
-                                       avr->old[pci].pc, avr->codeline[avr->old[pci].pc>>1]->symbol, OLD_PC_SIZE-i, avr->old[pci].sp);\
+                                       avr->trace_data->old[pci].pc, avr->trace_data->codeline ? avr->trace_data->codeline[avr->trace_data->old[pci].pc>>1]->symbol : "unknown", OLD_PC_SIZE-i, avr->trace_data->old[pci].sp);\
                }\
                printf("Stack Ptr %04x/%04x = %d \n", _avr_sp_get(avr), avr->ramend, avr->ramend - _avr_sp_get(avr));\
-               exit(1);\
+               DUMP_STACK();\
+               avr_sadly_crashed(avr, 0);\
        }
+#else /* CONFIG_SIMAVR_TRACE */
+
+#define CRASH() { \
+               avr_sadly_crashed(avr, 0);\
+       }
+#define DUMP_STACK()
+#define DUMP_REG();
+
+#endif 
+
+#ifdef __cplusplus
+};
+#endif
 
 #endif /* SIM_CORE_H_ */