#include <stdint.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
typedef uint64_t avr_cycle_count_t;
typedef uint16_t avr_io_addr_t;
uint8_t vector_size;
uint8_t signature[3];
uint8_t fuse[4];
+ avr_io_addr_t rampz; // optional, only for ELPM/SPM on >64Kb cores
+ avr_io_addr_t eind; // optional, only for EIJMP/EICALL on >64Kb cores
// filled by the ELF data, this allow tracking of invalid jumps
uint32_t codeend;
int state; // stopped, running, sleeping
uint32_t frequency; // frequency we are running at
+ // mostly used by the ADC for now
+ uint32_t vcc,avcc,aref; // (optional) voltages in millivolts
// cycles gets incremented when sleeping and when running; it corresponds
// not only to "cycles that runs" but also "cycles that might have run"
// in the opcode decoder.
// This array is re-synthetized back/forth when SREG changes
uint8_t sreg[8];
+ uint8_t i_shadow; // used to detect edges on I flag
/*
* ** current PC **
// set an IO register to receive commands from the AVR firmware
// it's optional, and uses the ELF tags
void avr_set_command_register(avr_t * avr, avr_io_addr_t addr);
+
+// specify the "console register" -- output sent to this register
+// is printed on the simulator console, without using a UART
+void avr_set_console_register(avr_t * avr, avr_io_addr_t addr);
+
// load code in the "flash"
void avr_loadcode(avr_t * avr, uint8_t * code, uint32_t size, uint32_t address);
-// converts a number of usec to a nunber of machine cycles, at current speed
-avr_cycle_count_t avr_usec_to_cycles(avr_t * avr, uint32_t usec);
-// converts a number of hz (to megahertz etc) to a number of cycle
-avr_cycle_count_t avr_hz_to_cycles(avr_t * avr, uint32_t hz);
-// converts back a number of cycles to usecs (for usleep)
-uint32_t avr_cycles_to_usec(avr_t * avr, avr_cycle_count_t cycles);
-
-// register for calling 'timer' in 'when' cycles
-void avr_cycle_timer_register(avr_t * avr, avr_cycle_count_t when, avr_cycle_timer_t timer, void * param);
-// register a timer to call in 'when' usec
-void avr_cycle_timer_register_usec(avr_t * avr, uint32_t when, avr_cycle_timer_t timer, void * param);
-// cancel a previously set timer
-void avr_cycle_timer_cancel(avr_t * avr, avr_cycle_timer_t timer, void * param);
/*
* these are accessors for avr->data but allows watchpoints to be set for gdb
// this might activate gdb server
void avr_sadly_crashed(avr_t *avr, uint8_t signal);
+#ifdef __cplusplus
+};
+#endif
+
#include "sim_io.h"
#include "sim_regbit.h"
#include "sim_interrupts.h"
#include "sim_irq.h"
+#include "sim_cycle_timers.h"
#endif /*__SIM_AVR_H__*/