2929#include "avr_flash.h"
3030#include "avr_watchdog.h"
3131
32+ /* ANSI escape codes for colored output. */
33+ struct text_colors simavr_font = {
34+ #ifdef NO_COLOR
35+ .green = "" ,
36+ .red = "" ,
37+ .normal = ""
38+ #else
39+ .green = "\e[32m" ,
40+ .red = "\e[31m" ,
41+ .normal = "\e[0m"
42+ #endif
43+ };
44+
3245// SREG bit names
3346const char * _sreg_bit_name = "cznvshti" ;
3447
@@ -136,13 +149,15 @@ void crash(avr_t* avr)
136149
137150 for (int i = OLD_PC_SIZE - 1 ; i > 0 ; i -- ) {
138151 int pci = (avr -> trace_data -> old_pci + i ) & 0xf ;
139- printf (FONT_RED "*** %04x: %-25s RESET -%d; sp %04x" FONT_DEFAULT "\n" ,
152+ printf ("%s*** %04x: %-25s RESET -%d; sp %04x%s\n" ,
153+ simavr_font .red ,
140154 avr -> trace_data -> old [pci ].pc ,
141155 avr -> trace_data -> codeline ?
142156 avr -> trace_data -> codeline [avr -> trace_data -> old [pci ].pc >>1 ] :
143157 "unknown" ,
144158 OLD_PC_SIZE - i ,
145- avr -> trace_data -> old [pci ].sp );
159+ avr -> trace_data -> old [pci ].sp ,
160+ simavr_font .normal );
146161 }
147162
148163 printf ("Stack Ptr %04x/%04x = %d \n" , _avr_sp_get (avr ), avr -> ramend , avr -> ramend - _avr_sp_get (avr ));
@@ -219,9 +234,9 @@ void avr_core_watch_write(avr_t *avr, uint16_t addr, uint8_t v)
219234 addr = addr % (avr -> ramend + 1 );
220235 }
221236 if (addr < 32 ) {
222- AVR_LOG (avr , LOG_ERROR , FONT_RED
223- "CORE : *** Invalid write address PC=%04x SP=%04x O=%04x Address %04x=%02x low registers" FONT_DEFAULT " \n" ,
224- avr -> pc , _avr_sp_get (avr ), _avr_flash_read16le (avr , avr -> pc ), addr , v );
237+ AVR_LOG (avr , LOG_ERROR ,
238+ "%sCORE : *** Invalid write address PC=%04x SP=%04x O=%04x Address %04x=%02x low registers%s \n" ,
239+ simavr_font . red , avr -> pc , _avr_sp_get (avr ), _avr_flash_read16le (avr , avr -> pc ), addr , v , simavr_font . normal );
225240 crash (avr );
226241 }
227242#if AVR_STACK_WATCH
@@ -231,9 +246,9 @@ void avr_core_watch_write(avr_t *avr, uint16_t addr, uint8_t v)
231246 * frame and is munching on it's own return address.
232247 */
233248 if (avr -> trace_data -> stack_frame_index > 1 && addr > avr -> trace_data -> stack_frame [avr -> trace_data -> stack_frame_index - 2 ].sp ) {
234- printf ( FONT_RED " %04x : munching stack "
235- "SP %04x, A=%04x <= %02x" FONT_DEFAULT " \n" ,
236- avr -> pc , _avr_sp_get (avr ), addr , v );
249+ printf ("%s %04x : munching stack "
250+ "SP %04x, A=%04x <= %02x%s \n" ,
251+ simavr_font . red , avr -> pc , _avr_sp_get (avr ), addr , v , simavr_font . normal );
237252 }
238253#endif
239254
@@ -462,14 +477,16 @@ static void _avr_invalid_opcode(avr_t * avr)
462477 }
463478 avr -> pc += 2 ; // Step over.
464479#if CONFIG_SIMAVR_TRACE
465- printf ( FONT_RED "*** %04x: %-25s Invalid Opcode SP=%04x O=%04x" FONT_DEFAULT "\n" ,
480+ printf ("%s*** %04x: %-25s Invalid Opcode SP=%04x O=%04x%s\n" ,
481+ simavr_font .red ,
466482 avr -> pc ,
467483 avr -> trace_data -> codeline [avr -> pc >>1 ],
468484 _avr_sp_get (avr ),
469- _avr_flash_read16le (avr , avr -> pc ));
485+ _avr_flash_read16le (avr , avr -> pc ),
486+ simavr_font .normal );
470487#else
471- AVR_LOG (avr , LOG_ERROR , FONT_RED "CORE : *** %04x: Invalid Opcode SP=%04x O=%04x" FONT_DEFAULT " \n" ,
472- avr -> pc , _avr_sp_get (avr ), _avr_flash_read16le (avr , avr -> pc ));
488+ AVR_LOG (avr , LOG_ERROR , "%sCORE : *** %04x: Invalid Opcode SP=%04x O=%04x%s \n" ,
489+ simavr_font . red , avr -> pc , _avr_sp_get (avr ), _avr_flash_read16le (avr , avr -> pc ), simavr_font . normal );
473490#endif
474491}
475492
0 commit comments