#pragma once

#include <arduino.h>

#ifdef __AVR__
#define PHANTOM_REG _SFR_IO8(0xDF) // Actual address is 0xFF
#else
#define PHANTOM_REG (*(volatile char*)0xFFFFFF00)
#endif

enum PHANTOM_COMMANDS
 { PHANTOM_CMD_NOP = 0,
   PHANTOM_CMD_CHECK, 
   PHANTOM_CMD_BREAK,
   PHANTOM_CMD_LOG
 };

inline bool isVsm () 
 { 
   PHANTOM_REG = PHANTOM_CMD_CHECK; 
   PHANTOM_REG = 0x55; 
   return PHANTOM_REG == 0xAA; 
 }

inline void suspend() 
 { 
   PHANTOM_REG = PHANTOM_CMD_BREAK; 
 }

class SimulationLog : public Print
 { public:
     virtual size_t write(uint8_t data) 
      { 
         PHANTOM_REG=PHANTOM_CMD_LOG; 
         PHANTOM_REG=data; 
         return 1; 
      }
 };

 extern SimulationLog SimLog;
 