OpenCores
URL https://opencores.org/ocsvn/forth-cpu/forth-cpu/trunk

Subversion Repositories forth-cpu

[/] [forth-cpu/] [trunk/] [h2.h] - Rev 5

Compare with Previous | Blame | View Log

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

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.