#ifndef H2_H
|
#ifndef H2_H
|
#define H2_H
|
#define H2_H
|
|
|
#include <stddef.h>
|
#include <stddef.h>
|
#include <stdbool.h>
|
#include <stdbool.h>
|
#include <stdint.h>
|
#include <stdint.h>
|
#include <stdio.h>
|
#include <stdio.h>
|
|
|
/**@note STK_SIZE is fixed to 64, but h2.vhd allows for the instantiation of
|
/**@note STK_SIZE is fixed to 64, but h2.vhd allows for the instantiation of
|
* CPUs with different stack sizes, within reasonable limits, so long as they
|
* CPUs with different stack sizes, within reasonable limits, so long as they
|
* are a power of 2. */
|
* are a power of 2. */
|
|
|
#define MAX_CORE (8192u)
|
#define MAX_CORE (8192u)
|
#define STK_SIZE (64u)
|
#define STK_SIZE (64u)
|
#define START_ADDR (0u)
|
#define START_ADDR (0u)
|
|
|
#ifndef H2_CPU_ID_SIMULATION
|
#ifndef H2_CPU_ID_SIMULATION
|
#ifdef NO_MAIN
|
#ifdef NO_MAIN
|
#define H2_CPU_ID_SIMULATION (0xD1ED)
|
#define H2_CPU_ID_SIMULATION (0xD1ED)
|
#else
|
#else
|
#define H2_CPU_ID_SIMULATION (0xDEADu)
|
#define H2_CPU_ID_SIMULATION (0xDEADu)
|
#endif
|
#endif
|
#endif
|
#endif
|
|
|
#define H2_CPU_ID_VHDL (0xCAFEu)
|
#define H2_CPU_ID_VHDL (0xCAFEu)
|
|
|
#define VGA_INIT_FILE ("text.hex") /**< default name for VGA screen */
|
#define VGA_INIT_FILE ("text.hex") /**< default name for VGA screen */
|
#define FLASH_INIT_FILE ("nvram.blk") /**< default file for flash initialization */
|
#define FLASH_INIT_FILE ("nvram.blk") /**< default file for flash initialization */
|
|
|
typedef struct {
|
typedef struct {
|
size_t length;
|
size_t length;
|
uint16_t *points;
|
uint16_t *points;
|
} break_point_t;
|
} break_point_t;
|
|
|
typedef struct {
|
typedef struct {
|
uint16_t core[MAX_CORE]; /**< main memory */
|
uint16_t core[MAX_CORE]; /**< main memory */
|
uint16_t rstk[STK_SIZE]; /**< return stack */
|
uint16_t rstk[STK_SIZE]; /**< return stack */
|
uint16_t dstk[STK_SIZE]; /**< variable stack */
|
uint16_t dstk[STK_SIZE]; /**< variable stack */
|
uint16_t pc; /**< program counter */
|
uint16_t pc; /**< program counter */
|
uint16_t tos; /**< top of stack */
|
uint16_t tos; /**< top of stack */
|
uint16_t rp; /**< return stack pointer */
|
uint16_t rp; /**< return stack pointer */
|
uint16_t sp; /**< variable stack pointer */
|
uint16_t sp; /**< variable stack pointer */
|
bool ie; /**< interrupt enable */
|
bool ie; /**< interrupt enable */
|
|
unsigned time; /**< cycles run for */
|
|
|
break_point_t bp; /**< list of break points */
|
break_point_t bp; /**< list of break points */
|
uint16_t rpm; /**< maximum value of rp ever encountered */
|
uint16_t rpm; /**< maximum value of rp ever encountered */
|
uint16_t spm; /**< maximum value of sp ever encountered */
|
uint16_t spm; /**< maximum value of sp ever encountered */
|
} h2_t; /**< state of the H2 CPU */
|
} h2_t; /**< state of the H2 CPU */
|
|
|
typedef enum {
|
typedef enum {
|
SYMBOL_TYPE_LABEL,
|
SYMBOL_TYPE_LABEL,
|
SYMBOL_TYPE_CALL,
|
SYMBOL_TYPE_CALL,
|
SYMBOL_TYPE_CONSTANT,
|
SYMBOL_TYPE_CONSTANT,
|
SYMBOL_TYPE_VARIABLE,
|
SYMBOL_TYPE_VARIABLE,
|
} symbol_type_e;
|
} symbol_type_e;
|
|
|
typedef struct {
|
typedef struct {
|
symbol_type_e type;
|
symbol_type_e type;
|
char *id;
|
char *id;
|
uint16_t value;
|
uint16_t value;
|
bool hidden;
|
bool hidden;
|
|
bool used;
|
} symbol_t;
|
} symbol_t;
|
|
|
typedef struct {
|
typedef struct {
|
size_t length;
|
size_t length;
|
symbol_t **symbols;
|
symbol_t **symbols;
|
} symbol_table_t;
|
} symbol_table_t;
|
|
|
#define CLOCK_SPEED_HZ (100000000ULL)
|
#define CLOCK_SPEED_HZ (100000000ULL)
|
|
|
#define VGA_BUFFER_LENGTH (1 << 13)
|
#define VGA_BUFFER_LENGTH (1 << 13)
|
#define VGA_WIDTH (80)
|
#define VGA_WIDTH (80)
|
#define VGA_HEIGHT (40)
|
#define VGA_HEIGHT (40)
|
#define VGA_AREA (VGA_WIDTH * VGA_HEIGHT)
|
#define VGA_AREA (VGA_WIDTH * VGA_HEIGHT)
|
|
|
#define VGA_CTL_B_BIT (0)
|
#define VGA_CTL_B_BIT (0)
|
#define VGA_CTL_G_BIT (1)
|
#define VGA_CTL_G_BIT (1)
|
#define VGA_CTL_R_BIT (2)
|
#define VGA_CTL_R_BIT (2)
|
#define VGA_CUR_MODE_BIT (3)
|
#define VGA_CUR_MODE_BIT (3)
|
#define VGA_CUR_BLINK_BIT (4)
|
#define VGA_CUR_BLINK_BIT (4)
|
#define VGA_CUR_EN_BIT (5)
|
#define VGA_CUR_EN_BIT (5)
|
#define VGA_EN_BIT (6)
|
#define VGA_EN_BIT (6)
|
#define VGA_SCREEN_SELECT_BIT (7)
|
#define VGA_SCREEN_SELECT_BIT (7)
|
|
|
#define VGA_CTL_B (1 << VGA_CTL_B_BIT)
|
#define VGA_CTL_B (1 << VGA_CTL_B_BIT)
|
#define VGA_CTL_G (1 << VGA_CTL_G_BIT)
|
#define VGA_CTL_G (1 << VGA_CTL_G_BIT)
|
#define VGA_CTL_R (1 << VGA_CTL_R_BIT)
|
#define VGA_CTL_R (1 << VGA_CTL_R_BIT)
|
#define VGA_CUR_MODE (1 << VGA_CUR_MODE_BIT)
|
#define VGA_CUR_MODE (1 << VGA_CUR_MODE_BIT)
|
#define VGA_CUR_BLINK (1 << VGA_CUR_BLINK_BIT)
|
#define VGA_CUR_BLINK (1 << VGA_CUR_BLINK_BIT)
|
#define VGA_CUR_EN (1 << VGA_CUR_EN_BIT)
|
#define VGA_CUR_EN (1 << VGA_CUR_EN_BIT)
|
#define VGA_EN (1 << VGA_EN_BIT)
|
#define VGA_EN (1 << VGA_EN_BIT)
|
#define VGA_SCREEN_SELECT (1 << VGA_SCREEN_SELECT_BIT)
|
#define VGA_SCREEN_SELECT (1 << VGA_SCREEN_SELECT_BIT)
|
|
|
#define TIMER_ENABLE_BIT (15)
|
#define TIMER_ENABLE_BIT (15)
|
#define TIMER_RESET_BIT (14)
|
#define TIMER_RESET_BIT (14)
|
#define TIMER_INTERRUPT_ENABLE_BIT (13)
|
#define TIMER_INTERRUPT_ENABLE_BIT (13)
|
#define TIMER_ENABLE (1 << TIMER_ENABLE_BIT)
|
#define TIMER_ENABLE (1 << TIMER_ENABLE_BIT)
|
#define TIMER_RESET (1 << TIMER_RESET_BIT)
|
#define TIMER_RESET (1 << TIMER_RESET_BIT)
|
#define TIMER_INTERRUPT_ENABLE (1 << TIMER_INTERRUPT_ENABLE_BIT)
|
#define TIMER_INTERRUPT_ENABLE (1 << TIMER_INTERRUPT_ENABLE_BIT)
|
|
|
#define UART_FIFO_DEPTH (8)
|
#define UART_FIFO_DEPTH (8)
|
#define UART_BAUD_RATE (115200)
|
#define UART_BAUD_RATE (115200)
|
|
|
#define UART_RX_FIFO_EMPTY_BIT (8)
|
#define UART_RX_FIFO_EMPTY_BIT (8)
|
#define UART_RX_FIFO_FULL_BIT (9)
|
#define UART_RX_FIFO_FULL_BIT (9)
|
#define UART_RX_RE_BIT (10)
|
#define UART_RX_RE_BIT (10)
|
#define UART_TX_FIFO_EMPTY_BIT (11)
|
#define UART_TX_FIFO_EMPTY_BIT (11)
|
#define UART_TX_FIFO_FULL_BIT (12)
|
#define UART_TX_FIFO_FULL_BIT (12)
|
#define UART_TX_WE_BIT (13)
|
#define UART_TX_WE_BIT (13)
|
|
|
#define UART_RX_FIFO_EMPTY (1 << UART_RX_FIFO_EMPTY_BIT)
|
#define UART_RX_FIFO_EMPTY (1 << UART_RX_FIFO_EMPTY_BIT)
|
#define UART_RX_FIFO_FULL (1 << UART_RX_FIFO_FULL_BIT)
|
#define UART_RX_FIFO_FULL (1 << UART_RX_FIFO_FULL_BIT)
|
#define UART_RX_RE (1 << UART_RX_RE_BIT)
|
#define UART_RX_RE (1 << UART_RX_RE_BIT)
|
#define UART_TX_FIFO_EMPTY (1 << UART_TX_FIFO_EMPTY_BIT)
|
#define UART_TX_FIFO_EMPTY (1 << UART_TX_FIFO_EMPTY_BIT)
|
#define UART_TX_FIFO_FULL (1 << UART_TX_FIFO_FULL_BIT)
|
#define UART_TX_FIFO_FULL (1 << UART_TX_FIFO_FULL_BIT)
|
#define UART_TX_WE (1 << UART_TX_WE_BIT)
|
#define UART_TX_WE (1 << UART_TX_WE_BIT)
|
|
|
#define PS2_NEW_CHAR_BIT (8)
|
#define PS2_NEW_CHAR_BIT (8)
|
#define PS2_NEW_CHAR (1 << PS2_NEW_CHAR_BIT)
|
#define PS2_NEW_CHAR (1 << PS2_NEW_CHAR_BIT)
|
|
|
#define CHIP_MEMORY_SIZE (8*1024*1024) /*NB. size in WORDs not bytes! */
|
#define CHIP_MEMORY_SIZE (8*1024*1024) /*NB. size in WORDs not bytes! */
|
#define FLASH_MASK_ADDR_UPPER_MASK (0x1ff)
|
#define FLASH_MASK_ADDR_UPPER_MASK (0x1ff)
|
|
|
#define FLASH_CHIP_SELECT_BIT (10)
|
#define FLASH_CHIP_SELECT_BIT (10)
|
#define SRAM_CHIP_SELECT_BIT (11)
|
#define SRAM_CHIP_SELECT_BIT (11)
|
#define FLASH_MEMORY_WAIT_BIT (12)
|
#define FLASH_MEMORY_WAIT_BIT (12)
|
#define FLASH_MEMORY_RESET_BIT (13)
|
#define FLASH_MEMORY_RESET_BIT (13)
|
#define FLASH_MEMORY_OE_BIT (14)
|
#define FLASH_MEMORY_OE_BIT (14)
|
#define FLASH_MEMORY_WE_BIT (15)
|
#define FLASH_MEMORY_WE_BIT (15)
|
|
|
#define FLASH_CHIP_SELECT (1 << FLASH_CHIP_SELECT_BIT)
|
#define FLASH_CHIP_SELECT (1 << FLASH_CHIP_SELECT_BIT)
|
#define SRAM_CHIP_SELECT (1 << SRAM_CHIP_SELECT_BIT)
|
#define SRAM_CHIP_SELECT (1 << SRAM_CHIP_SELECT_BIT)
|
#define FLASH_MEMORY_WAIT (1 << FLASH_MEMORY_WAIT_BIT)
|
#define FLASH_MEMORY_WAIT (1 << FLASH_MEMORY_WAIT_BIT)
|
#define FLASH_MEMORY_RESET (1 << FLASH_MEMORY_RESET_BIT)
|
#define FLASH_MEMORY_RESET (1 << FLASH_MEMORY_RESET_BIT)
|
#define FLASH_MEMORY_OE (1 << FLASH_MEMORY_OE_BIT)
|
#define FLASH_MEMORY_OE (1 << FLASH_MEMORY_OE_BIT)
|
#define FLASH_MEMORY_WE (1 << FLASH_MEMORY_WE_BIT)
|
#define FLASH_MEMORY_WE (1 << FLASH_MEMORY_WE_BIT)
|
|
|
#define FLASH_BLOCK_MAX (130)
|
#define FLASH_BLOCK_MAX (130)
|
|
|
typedef enum {
|
typedef enum {
|
FLASH_UNLOCKED,
|
FLASH_UNLOCKED,
|
FLASH_LOCKED,
|
FLASH_LOCKED,
|
FLASH_LOCKED_DOWN,
|
FLASH_LOCKED_DOWN,
|
} flash_lock_t;
|
} flash_lock_t;
|
|
|
typedef struct {
|
typedef struct {
|
unsigned cycle;
|
unsigned cycle;
|
unsigned mode;
|
unsigned mode;
|
unsigned we;
|
unsigned we;
|
unsigned cs;
|
unsigned cs;
|
uint8_t status;
|
uint8_t status;
|
uint32_t arg1_address, arg2_address;
|
uint32_t arg1_address, arg2_address;
|
uint16_t data;
|
uint16_t data;
|
uint16_t nvram[CHIP_MEMORY_SIZE];
|
uint16_t nvram[CHIP_MEMORY_SIZE];
|
uint8_t locks[FLASH_BLOCK_MAX];
|
uint8_t locks[FLASH_BLOCK_MAX];
|
} flash_t;
|
} flash_t;
|
|
|
typedef enum { /**@warning do not change the order or insert elements */
|
typedef enum { /**@warning do not change the order or insert elements */
|
BLACK,
|
BLACK,
|
RED,
|
RED,
|
GREEN,
|
GREEN,
|
YELLOW,
|
YELLOW,
|
BLUE,
|
BLUE,
|
MAGENTA,
|
MAGENTA,
|
CYAN,
|
CYAN,
|
WHITE,
|
WHITE,
|
} color_t;
|
} color_t;
|
|
|
typedef enum {
|
typedef enum {
|
TERMINAL_NORMAL_MODE,
|
TERMINAL_NORMAL_MODE,
|
TERMINAL_CSI,
|
TERMINAL_CSI,
|
TERMINAL_COMMAND,
|
TERMINAL_COMMAND,
|
TERMINAL_NUMBER_1,
|
TERMINAL_NUMBER_1,
|
TERMINAL_NUMBER_2,
|
TERMINAL_NUMBER_2,
|
TERMINAL_DECTCEM,
|
TERMINAL_DECTCEM,
|
TERMINAL_STATE_END,
|
TERMINAL_STATE_END,
|
} terminal_state_t;
|
} terminal_state_t;
|
|
|
typedef struct {
|
typedef struct {
|
unsigned bold: 1;
|
unsigned bold: 1;
|
unsigned under_score: 1;
|
unsigned under_score: 1;
|
unsigned blink: 1;
|
unsigned blink: 1;
|
unsigned reverse_video: 1;
|
unsigned reverse_video: 1;
|
unsigned conceal: 1;
|
unsigned conceal: 1;
|
unsigned foreground_color: 3;
|
unsigned foreground_color: 3;
|
unsigned background_color: 3;
|
unsigned background_color: 3;
|
} vt100_attribute_t;
|
} vt100_attribute_t;
|
|
|
#define VT100_MAX_SIZE (8192)
|
#define VT100_MAX_SIZE (8192)
|
|
|
typedef struct {
|
typedef struct {
|
size_t cursor;
|
size_t cursor;
|
size_t cursor_saved;
|
size_t cursor_saved;
|
unsigned n1, n2;
|
unsigned n1, n2;
|
unsigned height;
|
unsigned height;
|
unsigned width;
|
unsigned width;
|
unsigned size;
|
unsigned size;
|
terminal_state_t state;
|
terminal_state_t state;
|
bool blinks;
|
bool blinks;
|
bool cursor_on;
|
bool cursor_on;
|
vt100_attribute_t attribute;
|
vt100_attribute_t attribute, attribute_saved;
|
vt100_attribute_t attributes[VT100_MAX_SIZE];
|
vt100_attribute_t attributes[VT100_MAX_SIZE];
|
uint8_t m[VT100_MAX_SIZE];
|
uint8_t m[VT100_MAX_SIZE];
|
uint8_t command_index;
|
uint8_t command_index;
|
} vt100_t;
|
} vt100_t;
|
|
|
typedef struct {
|
typedef struct {
|
uint8_t leds;
|
uint8_t leds;
|
vt100_t vt100;
|
vt100_t vt100;
|
|
|
uint16_t timer_control;
|
uint16_t timer_control;
|
uint16_t timer;
|
uint16_t timer;
|
|
|
uint16_t irc_mask;
|
uint16_t irc_mask;
|
|
|
uint8_t uart_getchar_register, ps2_getchar_register;
|
uint8_t uart_getchar_register, ps2_getchar_register;
|
|
|
uint16_t led_7_segments;
|
uint16_t led_7_segments;
|
|
|
uint16_t switches;
|
uint16_t switches;
|
uint16_t switches_previous;
|
uint16_t switches_previous;
|
|
|
uint16_t vram[CHIP_MEMORY_SIZE];
|
uint16_t vram[CHIP_MEMORY_SIZE];
|
uint16_t mem_control;
|
uint16_t mem_control;
|
uint16_t mem_addr_low;
|
uint16_t mem_addr_low;
|
uint16_t mem_dout;
|
uint16_t mem_dout;
|
flash_t flash;
|
flash_t flash;
|
|
|
bool wait;
|
bool wait;
|
bool interrupt;
|
bool interrupt;
|
uint8_t interrupt_selector;
|
uint8_t interrupt_selector;
|
|
|
|
uint16_t uart_tx_baud, uart_rx_baud, uart_control;
|
} h2_soc_state_t;
|
} h2_soc_state_t;
|
|
|
typedef uint16_t (*h2_io_get)(h2_soc_state_t *soc, uint16_t addr, bool *debug_on);
|
typedef uint16_t (*h2_io_get)(h2_soc_state_t *soc, uint16_t addr, bool *debug_on);
|
typedef void (*h2_io_set)(h2_soc_state_t *soc, uint16_t addr, uint16_t value, bool *debug_on);
|
typedef void (*h2_io_set)(h2_soc_state_t *soc, uint16_t addr, uint16_t value, bool *debug_on);
|
typedef void (*h2_io_update)(h2_soc_state_t *soc);
|
typedef void (*h2_io_update)(h2_soc_state_t *soc);
|
|
|
typedef struct {
|
typedef struct {
|
h2_io_get in;
|
h2_io_get in;
|
h2_io_set out;
|
h2_io_set out;
|
h2_io_update update;
|
h2_io_update update;
|
h2_soc_state_t *soc;
|
h2_soc_state_t *soc;
|
} h2_io_t;
|
} h2_io_t;
|
|
|
typedef enum {
|
typedef enum {
|
iUart = 0x4000,
|
iUart = 0x4000,
|
iVT100 = 0x4002,
|
iVT100 = 0x4002,
|
iTimerDin = 0x4004,
|
iTimerDin = 0x4004,
|
iSwitches = 0x4006,
|
iSwitches = 0x4006,
|
iMemDin = 0x4008,
|
iMemDin = 0x4008,
|
} h2_input_addr_t;
|
} h2_input_addr_t;
|
|
|
typedef enum {
|
typedef enum {
|
oUart = 0x4000,
|
oUart = 0x4000,
|
oVT100 = 0x4002,
|
oVT100 = 0x4002,
|
oTimerCtrl = 0x4004,
|
oTimerCtrl = 0x4004,
|
oLeds = 0x4006,
|
oLeds = 0x4006,
|
oMemDout = 0x4008,
|
oMemDout = 0x4008,
|
oMemControl = 0x400A,
|
oMemControl = 0x400A,
|
oMemAddrLow = 0x400C,
|
oMemAddrLow = 0x400C,
|
o7SegLED = 0x400E,
|
o7SegLED = 0x400E,
|
oIrcMask = 0x4010,
|
oIrcMask = 0x4010,
|
|
oUartTxBaud = 0x4012,
|
|
oUartRxBaud = 0x4014,
|
|
oUartControl = 0x4016,
|
} h2_output_addr_t;
|
} h2_output_addr_t;
|
|
|
typedef enum {
|
typedef enum {
|
isrEntry,
|
isrEntry,
|
isrRxFifoNotEmpty,
|
isrRxFifoNotEmpty,
|
isrRxFifoFull,
|
isrRxFifoFull,
|
isrTxFifoNotEmpty,
|
isrTxFifoNotEmpty,
|
isrTxFifoFull,
|
isrTxFifoFull,
|
isrKbdNew,
|
isrKbdNew,
|
isrTimer,
|
isrTimer,
|
isrDPadButton,
|
isrDPadButton,
|
} h2_interrupt_address_t;
|
} h2_interrupt_address_t;
|
|
|
void *allocate_or_die(size_t length);
|
void *allocate_or_die(size_t length);
|
FILE *fopen_or_die(const char *file, const char *mode);
|
FILE *fopen_or_die(const char *file, const char *mode);
|
|
|
h2_t *h2_new(uint16_t start_address);
|
h2_t *h2_new(uint16_t start_address);
|
void h2_free(h2_t *h);
|
void h2_free(h2_t *h);
|
int h2_load(h2_t *h, FILE *hexfile);
|
int h2_load(h2_t *h, FILE *hexfile);
|
int h2_save(h2_t *h, FILE *output, bool full);
|
int h2_save(const h2_t *h, FILE *output, bool full);
|
int h2_run(h2_t *h, h2_io_t *io, FILE *output, unsigned steps, symbol_table_t *symbols, bool run_debugger);
|
int h2_run(h2_t *h, h2_io_t *io, FILE *output, unsigned steps, symbol_table_t *symbols, bool run_debugger, FILE *trace);
|
|
|
uint16_t h2_io_memory_read_operation(h2_soc_state_t *soc);
|
uint16_t h2_io_memory_read_operation(const h2_soc_state_t *soc);
|
void soc_print(FILE *out, h2_soc_state_t *soc);
|
void soc_print(FILE *out, const h2_soc_state_t *soc);
|
h2_soc_state_t *h2_soc_state_new(void);
|
h2_soc_state_t *h2_soc_state_new(void);
|
void h2_soc_state_free(h2_soc_state_t *soc);
|
void h2_soc_state_free(h2_soc_state_t *soc);
|
h2_io_t *h2_io_new(void);
|
h2_io_t *h2_io_new(void);
|
void h2_io_free(h2_io_t *io);
|
void h2_io_free(h2_io_t *io);
|
|
|
int binary_memory_save(FILE *output, uint16_t *p, size_t length);
|
int binary_memory_save(FILE *output, const uint16_t *p, size_t length);
|
int binary_memory_load(FILE *input, uint16_t *p, size_t length);
|
int binary_memory_load(FILE *input, uint16_t *p, size_t length);
|
int nvram_save(h2_io_t *io, const char *name);
|
int nvram_save(h2_io_t *io, const char *name);
|
int nvram_load_and_transfer(h2_io_t *io, const char *name, bool transfer_to_sram);
|
int nvram_load_and_transfer(h2_io_t *io, const char *name, bool transfer_to_sram);
|
|
|
typedef uint8_t fifo_data_t;
|
typedef uint8_t fifo_data_t;
|
|
|
typedef struct {
|
typedef struct {
|
size_t head;
|
size_t head;
|
size_t tail;
|
size_t tail;
|
size_t size;
|
size_t size;
|
fifo_data_t *buffer;
|
fifo_data_t *buffer;
|
} fifo_t;
|
} fifo_t;
|
|
|
fifo_t *fifo_new(size_t size);
|
fifo_t *fifo_new(size_t size);
|
void fifo_free(fifo_t *fifo);
|
void fifo_free(fifo_t *fifo);
|
bool fifo_is_full(fifo_t * fifo);
|
bool fifo_is_full(const fifo_t * fifo);
|
bool fifo_is_empty(fifo_t * fifo);
|
bool fifo_is_empty(const fifo_t * fifo);
|
size_t fifo_count(fifo_t * fifo);
|
size_t fifo_count(const fifo_t * fifo);
|
size_t fifo_push(fifo_t * fifo, fifo_data_t data);
|
size_t fifo_push(fifo_t * fifo, fifo_data_t data);
|
size_t fifo_pop(fifo_t * fifo, fifo_data_t * data);
|
size_t fifo_pop(fifo_t * fifo, fifo_data_t * data);
|
|
|
/** @warning LOG_FATAL level kills the program */
|
/** @warning LOG_FATAL level kills the program */
|
#define X_MACRO_LOGGING\
|
#define X_MACRO_LOGGING\
|
X(LOG_MESSAGE_OFF, "")\
|
X(LOG_MESSAGE_OFF, "")\
|
X(LOG_FATAL, "fatal")\
|
X(LOG_FATAL, "fatal")\
|
X(LOG_ERROR, "error")\
|
X(LOG_ERROR, "error")\
|
X(LOG_WARNING, "warning")\
|
X(LOG_WARNING, "warning")\
|
X(LOG_NOTE, "note")\
|
X(LOG_NOTE, "note")\
|
X(LOG_DEBUG, "debug")\
|
X(LOG_DEBUG, "debug")\
|
X(LOG_ALL_MESSAGES, "any")
|
X(LOG_ALL_MESSAGES, "any")
|
|
|
typedef enum {
|
typedef enum {
|
#define X(ENUM, NAME) ENUM,
|
#define X(ENUM, NAME) ENUM,
|
X_MACRO_LOGGING
|
X_MACRO_LOGGING
|
#undef X
|
#undef X
|
} log_level_e;
|
} log_level_e;
|
|
|
extern log_level_e log_level;
|
extern log_level_e log_level;
|
|
|
|
#ifdef __GNUC__
|
|
#define LOGGER_PRINTF __attribute__((format(printf, 4, 5)))
|
|
#else
|
|
#define LOGGER_PRINTF
|
|
#endif
|
|
|
int logger(log_level_e level, const char *func,
|
int logger(log_level_e level, const char *func,
|
const unsigned line, const char *fmt, ...);
|
const unsigned line, const char *fmt, ...) LOGGER_PRINTF;
|
|
|
#define fatal(FMT, ...) logger(LOG_FATAL, __func__, __LINE__, FMT, ##__VA_ARGS__)
|
#define fatal(...) logger(LOG_FATAL, __func__, __LINE__, __VA_ARGS__)
|
#define error(FMT, ...) logger(LOG_ERROR, __func__, __LINE__, FMT, ##__VA_ARGS__)
|
#define error(...) logger(LOG_ERROR, __func__, __LINE__, __VA_ARGS__)
|
#define warning(FMT, ...) logger(LOG_WARNING, __func__, __LINE__, FMT, ##__VA_ARGS__)
|
#define warning(...) logger(LOG_WARNING, __func__, __LINE__, __VA_ARGS__)
|
#define note(FMT, ...) logger(LOG_NOTE, __func__, __LINE__, FMT, ##__VA_ARGS__)
|
#define note(...) logger(LOG_NOTE, __func__, __LINE__, __VA_ARGS__)
|
#define debug(FMT, ...) logger(LOG_DEBUG, __func__, __LINE__, FMT, ##__VA_ARGS__)
|
#define debug(...) logger(LOG_DEBUG, __func__, __LINE__, __VA_ARGS__)
|
|
|
int memory_load(FILE *input, uint16_t *p, size_t length);
|
int memory_load(FILE *input, uint16_t *p, size_t length);
|
int memory_save(FILE *output, uint16_t *p, size_t length);
|
int memory_save(FILE *output, const uint16_t *p, size_t length);
|
|
|
#define BACKSPACE (8)
|
#define BACKSPACE (8)
|
#define ESCAPE (27)
|
#define ESCAPE (27)
|
#define DELETE (127) /* ASCII delete */
|
#define DELETE (127) /* ASCII delete */
|
|
|
void vt100_update(vt100_t *t, uint8_t c);
|
void vt100_update(vt100_t *t, uint8_t c);
|
|
|
#endif
|
#endif
|
|
|