X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=simavr%2Fsim%2Fsim_core.h;h=cc5da7bb168a5e7a564e95559dce49a4c675dc11;hb=43c83e991c0705b7dc981ca760aa14fd3331604c;hp=4642bb4a713ceba785d78a2380d1772f83bb259d;hpb=dea35993f4e8257294eb1e8b27a8416b7a401beb;p=simavr diff --git a/simavr/sim/sim_core.h b/simavr/sim/sim_core.h index 4642bb4..cc5da7b 100644 --- a/simavr/sim/sim_core.h +++ b/simavr/sim/sim_core.h @@ -19,17 +19,27 @@ along with simavr. If not, see . */ -#ifndef SIM_CORE_H_ -#define SIM_CORE_H_ +#ifndef __SIM_CORE_H__ +#define __SIM_CORE_H__ #ifdef __cplusplus extern "C" { #endif +#ifdef NO_COLOR + #define FONT_GREEN + #define FONT_RED + #define FONT_DEFAULT +#else + #define FONT_GREEN "\e[32m" + #define FONT_RED "\e[31m" + #define FONT_DEFAULT "\e[0m" +#endif + /* * Instruction decoder, run ONE instruction */ -uint16_t avr_run_one(avr_t * avr); +avr_flashaddr_t avr_run_one(avr_t * avr); /* * These are for internal access to the stack (for interrupts) @@ -47,7 +57,7 @@ const char * avr_regname(uint8_t reg); /* * DEBUG bits follow - * These will diseapear when gdb arrives + * These will disappear when gdb arrives */ void avr_dump_state(avr_t * avr); @@ -62,12 +72,12 @@ void avr_dump_state(avr_t * avr); #if AVR_STACK_WATCH #define DUMP_STACK() \ - for (int i = avr->stack_frame_index; i; i--) {\ + 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->stack_frame[pci].pc, \ - avr->codeline ? avr->codeline[avr->stack_frame[pci].pc>>1]->symbol : "unknown", \ - avr->stack_frame[pci].sp);\ + printf(FONT_RED "*** %04x: %-25s sp %04x\n" FONT_DEFAULT,\ + 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() @@ -77,9 +87,9 @@ void avr_dump_state(avr_t * avr); DUMP_REG();\ 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;\ - printf("\e[31m*** %04x: %-25s RESET -%d; sp %04x\e[0m\n",\ - avr->old[pci].pc, avr->codeline ? avr->codeline[avr->old[pci].pc>>1]->symbol : "unknown", OLD_PC_SIZE-i, avr->old[pci].sp);\ + int pci = (avr->trace_data->old_pci + i) & 0xf;\ + printf(FONT_RED "*** %04x: %-25s RESET -%d; sp %04x\n" FONT_DEFAULT,\ + 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));\ DUMP_STACK();\ @@ -95,8 +105,28 @@ void avr_dump_state(avr_t * avr); #endif +/** + * Reconstructs the SREG value from avr->sreg into dst. + */ +#define READ_SREG_INTO(avr, dst) { \ + dst = 0; \ + for (int i = 0; i < 8; i++) \ + if (avr->sreg[i] > 1) { \ + printf("** Invalid SREG!!\n"); \ + } else if (avr->sreg[i]) \ + dst |= (1 << i); \ + } + +/** + * Splits the SREG value from src into the avr->sreg array. + */ +#define SET_SREG_FROM(avr, src) { \ + for (int i = 0; i < 8; i++) \ + avr->sreg[i] = (src & (1 << i)) != 0; \ + } + #ifdef __cplusplus }; #endif -#endif /* SIM_CORE_H_ */ +#endif /*__SIM_CORE_H__*/