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

Subversion Repositories forth-cpu

[/] [forth-cpu/] [trunk/] [h2.h] - Blame information for rev 5

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 howe.r.j.8
#ifndef H2_H
2
#define H2_H
3
 
4
#include <stddef.h>
5
#include <stdbool.h>
6
#include <stdint.h>
7
#include <stdio.h>
8
 
9
/**@note STK_SIZE is fixed to 64, but h2.vhd allows for the instantiation of
10
 * CPUs with different stack sizes, within reasonable limits, so long as they
11
 * are a power of 2. */
12
 
13
#define MAX_CORE             (8192u)
14
#define STK_SIZE             (64u)
15
#define START_ADDR           (0u)
16
 
17
#ifndef H2_CPU_ID_SIMULATION
18
#ifdef NO_MAIN
19
#define H2_CPU_ID_SIMULATION (0xD1ED)
20
#else
21
#define H2_CPU_ID_SIMULATION (0xDEADu)
22
#endif
23
#endif
24
 
25
#define H2_CPU_ID_VHDL       (0xCAFEu)
26
 
27
#define VGA_INIT_FILE        ("text.hex")  /**< default name for VGA screen */
28
#define FLASH_INIT_FILE      ("nvram.blk") /**< default file for flash initialization */
29
 
30
typedef struct {
31
        size_t length;
32
        uint16_t *points;
33
} break_point_t;
34
 
35
typedef struct {
36
        uint16_t core[MAX_CORE]; /**< main memory */
37
        uint16_t rstk[STK_SIZE]; /**< return stack */
38
        uint16_t dstk[STK_SIZE]; /**< variable stack */
39
        uint16_t pc;  /**< program counter */
40
        uint16_t tos; /**< top of stack */
41
        uint16_t rp;  /**< return stack pointer */
42
        uint16_t sp;  /**< variable stack pointer */
43
        bool     ie;  /**< interrupt enable */
44 5 howe.r.j.8
        unsigned time; /**< cycles run for */
45 3 howe.r.j.8
 
46
        break_point_t bp; /**< list of break points */
47
        uint16_t rpm; /**< maximum value of rp ever encountered */
48
        uint16_t spm; /**< maximum value of sp ever encountered */
49
} h2_t; /**< state of the H2 CPU */
50
 
51
typedef enum {
52
        SYMBOL_TYPE_LABEL,
53
        SYMBOL_TYPE_CALL,
54
        SYMBOL_TYPE_CONSTANT,
55
        SYMBOL_TYPE_VARIABLE,
56
} symbol_type_e;
57
 
58
typedef struct {
59
        symbol_type_e type;
60
        char *id;
61
        uint16_t value;
62
        bool hidden;
63 5 howe.r.j.8
        bool used;
64 3 howe.r.j.8
} symbol_t;
65
 
66
typedef struct {
67
        size_t length;
68
        symbol_t **symbols;
69
} symbol_table_t;
70
 
71
#define CLOCK_SPEED_HZ             (100000000ULL)
72
 
73
#define VGA_BUFFER_LENGTH          (1 << 13)
74
#define VGA_WIDTH                  (80)
75
#define VGA_HEIGHT                 (40)
76
#define VGA_AREA                   (VGA_WIDTH * VGA_HEIGHT)
77
 
78
#define VGA_CTL_B_BIT              (0)
79
#define VGA_CTL_G_BIT              (1)
80
#define VGA_CTL_R_BIT              (2)
81
#define VGA_CUR_MODE_BIT           (3)
82
#define VGA_CUR_BLINK_BIT          (4)
83
#define VGA_CUR_EN_BIT             (5)
84
#define VGA_EN_BIT                 (6)
85
#define VGA_SCREEN_SELECT_BIT      (7)
86
 
87
#define VGA_CTL_B                  (1 << VGA_CTL_B_BIT)
88
#define VGA_CTL_G                  (1 << VGA_CTL_G_BIT)
89
#define VGA_CTL_R                  (1 << VGA_CTL_R_BIT)
90
#define VGA_CUR_MODE               (1 << VGA_CUR_MODE_BIT)
91
#define VGA_CUR_BLINK              (1 << VGA_CUR_BLINK_BIT)
92
#define VGA_CUR_EN                 (1 << VGA_CUR_EN_BIT)
93
#define VGA_EN                     (1 << VGA_EN_BIT)
94
#define VGA_SCREEN_SELECT          (1 << VGA_SCREEN_SELECT_BIT)
95
 
96
#define TIMER_ENABLE_BIT           (15)
97
#define TIMER_RESET_BIT            (14)
98
#define TIMER_INTERRUPT_ENABLE_BIT (13)
99
#define TIMER_ENABLE               (1 << TIMER_ENABLE_BIT)
100
#define TIMER_RESET                (1 << TIMER_RESET_BIT)
101
#define TIMER_INTERRUPT_ENABLE     (1 << TIMER_INTERRUPT_ENABLE_BIT)
102
 
103
#define UART_FIFO_DEPTH            (8)
104
#define UART_BAUD_RATE             (115200)
105
 
106
#define UART_RX_FIFO_EMPTY_BIT     (8)
107
#define UART_RX_FIFO_FULL_BIT      (9)
108
#define UART_RX_RE_BIT             (10)
109
#define UART_TX_FIFO_EMPTY_BIT     (11)
110
#define UART_TX_FIFO_FULL_BIT      (12)
111
#define UART_TX_WE_BIT             (13)
112
 
113
#define UART_RX_FIFO_EMPTY         (1 << UART_RX_FIFO_EMPTY_BIT)
114
#define UART_RX_FIFO_FULL          (1 << UART_RX_FIFO_FULL_BIT)
115
#define UART_RX_RE                 (1 << UART_RX_RE_BIT)
116
#define UART_TX_FIFO_EMPTY         (1 << UART_TX_FIFO_EMPTY_BIT)
117
#define UART_TX_FIFO_FULL          (1 << UART_TX_FIFO_FULL_BIT)
118
#define UART_TX_WE                 (1 << UART_TX_WE_BIT)
119
 
120
#define PS2_NEW_CHAR_BIT           (8)
121
#define PS2_NEW_CHAR               (1 << PS2_NEW_CHAR_BIT)
122
 
123
#define CHIP_MEMORY_SIZE           (8*1024*1024) /*NB. size in WORDs not bytes! */
124
#define FLASH_MASK_ADDR_UPPER_MASK (0x1ff)
125
 
126
#define FLASH_CHIP_SELECT_BIT      (10)
127
#define SRAM_CHIP_SELECT_BIT       (11)
128
#define FLASH_MEMORY_WAIT_BIT      (12)
129
#define FLASH_MEMORY_RESET_BIT     (13)
130
#define FLASH_MEMORY_OE_BIT        (14)
131
#define FLASH_MEMORY_WE_BIT        (15)
132
 
133
#define FLASH_CHIP_SELECT          (1 << FLASH_CHIP_SELECT_BIT)
134
#define SRAM_CHIP_SELECT           (1 << SRAM_CHIP_SELECT_BIT)
135
#define FLASH_MEMORY_WAIT          (1 << FLASH_MEMORY_WAIT_BIT)
136
#define FLASH_MEMORY_RESET         (1 << FLASH_MEMORY_RESET_BIT)
137
#define FLASH_MEMORY_OE            (1 << FLASH_MEMORY_OE_BIT)
138
#define FLASH_MEMORY_WE            (1 << FLASH_MEMORY_WE_BIT)
139
 
140
#define FLASH_BLOCK_MAX            (130)
141
 
142
typedef enum {
143
        FLASH_UNLOCKED,
144
        FLASH_LOCKED,
145
        FLASH_LOCKED_DOWN,
146
} flash_lock_t;
147
 
148
typedef struct {
149
        unsigned cycle;
150
        unsigned mode;
151
        unsigned we;
152
        unsigned cs;
153
        uint8_t  status;
154
        uint32_t arg1_address, arg2_address;
155
        uint16_t data;
156
        uint16_t nvram[CHIP_MEMORY_SIZE];
157
        uint8_t  locks[FLASH_BLOCK_MAX];
158
} flash_t;
159
 
160
typedef enum { /**@warning do not change the order or insert elements */
161
        BLACK,
162
        RED,
163
        GREEN,
164
        YELLOW,
165
        BLUE,
166
        MAGENTA,
167
        CYAN,
168
        WHITE,
169
} color_t;
170
 
171
typedef enum {
172
        TERMINAL_NORMAL_MODE,
173
        TERMINAL_CSI,
174
        TERMINAL_COMMAND,
175
        TERMINAL_NUMBER_1,
176
        TERMINAL_NUMBER_2,
177
        TERMINAL_DECTCEM,
178
        TERMINAL_STATE_END,
179
} terminal_state_t;
180
 
181
typedef struct {
182
        unsigned bold:          1;
183
        unsigned under_score:   1;
184
        unsigned blink:         1;
185
        unsigned reverse_video: 1;
186
        unsigned conceal:       1;
187
        unsigned foreground_color: 3;
188
        unsigned background_color: 3;
189
} vt100_attribute_t;
190
 
191
#define VT100_MAX_SIZE (8192)
192
 
193
typedef struct {
194
        size_t cursor;
195
        size_t cursor_saved;
196
        unsigned n1, n2;
197
        unsigned height;
198
        unsigned width;
199
        unsigned size;
200
        terminal_state_t state;
201
        bool blinks;
202
        bool cursor_on;
203 5 howe.r.j.8
        vt100_attribute_t attribute, attribute_saved;
204 3 howe.r.j.8
        vt100_attribute_t attributes[VT100_MAX_SIZE];
205
        uint8_t m[VT100_MAX_SIZE];
206
        uint8_t command_index;
207
} vt100_t;
208
 
209
typedef struct {
210
        uint8_t leds;
211
        vt100_t vt100;
212
 
213
        uint16_t timer_control;
214
        uint16_t timer;
215
 
216
        uint16_t irc_mask;
217
 
218
        uint8_t uart_getchar_register, ps2_getchar_register;
219
 
220
        uint16_t led_7_segments;
221
 
222
        uint16_t switches;
223
        uint16_t switches_previous;
224
 
225
        uint16_t vram[CHIP_MEMORY_SIZE];
226
        uint16_t mem_control;
227
        uint16_t mem_addr_low;
228
        uint16_t mem_dout;
229
        flash_t flash;
230
 
231
        bool wait;
232
        bool interrupt;
233
        uint8_t interrupt_selector;
234 5 howe.r.j.8
 
235
        uint16_t uart_tx_baud, uart_rx_baud, uart_control;
236 3 howe.r.j.8
} h2_soc_state_t;
237
 
238
typedef uint16_t (*h2_io_get)(h2_soc_state_t *soc, uint16_t addr, bool *debug_on);
239
typedef void     (*h2_io_set)(h2_soc_state_t *soc, uint16_t addr, uint16_t value, bool *debug_on);
240
typedef void     (*h2_io_update)(h2_soc_state_t *soc);
241
 
242
typedef struct {
243
        h2_io_get in;
244
        h2_io_set out;
245
        h2_io_update update;
246
        h2_soc_state_t *soc;
247
} h2_io_t;
248
 
249
typedef enum {
250
        iUart         = 0x4000,
251
        iVT100        = 0x4002,
252
        iTimerDin     = 0x4004,
253
        iSwitches     = 0x4006,
254
        iMemDin       = 0x4008,
255
} h2_input_addr_t;
256
 
257
typedef enum {
258
        oUart         = 0x4000,
259
        oVT100        = 0x4002,
260
        oTimerCtrl    = 0x4004,
261
        oLeds         = 0x4006,
262
        oMemDout      = 0x4008,
263
        oMemControl   = 0x400A,
264
        oMemAddrLow   = 0x400C,
265
        o7SegLED      = 0x400E,
266
        oIrcMask      = 0x4010,
267 5 howe.r.j.8
        oUartTxBaud   = 0x4012,
268
        oUartRxBaud   = 0x4014,
269
        oUartControl  = 0x4016,
270 3 howe.r.j.8
} h2_output_addr_t;
271
 
272
typedef enum {
273
        isrEntry,
274
        isrRxFifoNotEmpty,
275
        isrRxFifoFull,
276
        isrTxFifoNotEmpty,
277
        isrTxFifoFull,
278
        isrKbdNew,
279
        isrTimer,
280
        isrDPadButton,
281
} h2_interrupt_address_t;
282
 
283
void *allocate_or_die(size_t length);
284
FILE *fopen_or_die(const char *file, const char *mode);
285
 
286
h2_t *h2_new(uint16_t start_address);
287
void h2_free(h2_t *h);
288
int h2_load(h2_t *h, FILE *hexfile);
289 5 howe.r.j.8
int h2_save(const h2_t *h, FILE *output, bool full);
290
int h2_run(h2_t *h, h2_io_t *io, FILE *output, unsigned steps, symbol_table_t *symbols, bool run_debugger, FILE *trace);
291 3 howe.r.j.8
 
292 5 howe.r.j.8
uint16_t h2_io_memory_read_operation(const h2_soc_state_t *soc);
293
void soc_print(FILE *out, const h2_soc_state_t *soc);
294 3 howe.r.j.8
h2_soc_state_t *h2_soc_state_new(void);
295
void h2_soc_state_free(h2_soc_state_t *soc);
296
h2_io_t *h2_io_new(void);
297
void h2_io_free(h2_io_t *io);
298
 
299 5 howe.r.j.8
int binary_memory_save(FILE *output, const uint16_t *p, size_t length);
300 3 howe.r.j.8
int binary_memory_load(FILE *input, uint16_t *p, size_t length);
301
int nvram_save(h2_io_t *io, const char *name);
302
int nvram_load_and_transfer(h2_io_t *io, const char *name, bool transfer_to_sram);
303
 
304
typedef uint8_t fifo_data_t;
305
 
306
typedef struct {
307
        size_t head;
308
        size_t tail;
309
        size_t size;
310
        fifo_data_t *buffer;
311
} fifo_t;
312
 
313
fifo_t *fifo_new(size_t size);
314
void fifo_free(fifo_t *fifo);
315 5 howe.r.j.8
bool fifo_is_full(const fifo_t * fifo);
316
bool fifo_is_empty(const fifo_t * fifo);
317
size_t fifo_count(const fifo_t * fifo);
318 3 howe.r.j.8
size_t fifo_push(fifo_t * fifo, fifo_data_t data);
319
size_t fifo_pop(fifo_t * fifo, fifo_data_t * data);
320
 
321
/** @warning LOG_FATAL level kills the program */
322
#define X_MACRO_LOGGING\
323
        X(LOG_MESSAGE_OFF,  "")\
324
        X(LOG_FATAL,        "fatal")\
325
        X(LOG_ERROR,        "error")\
326
        X(LOG_WARNING,      "warning")\
327
        X(LOG_NOTE,         "note")\
328
        X(LOG_DEBUG,        "debug")\
329
        X(LOG_ALL_MESSAGES, "any")
330
 
331
typedef enum {
332
#define X(ENUM, NAME) ENUM,
333
        X_MACRO_LOGGING
334
#undef X
335
} log_level_e;
336
 
337
extern log_level_e log_level;
338
 
339 5 howe.r.j.8
#ifdef __GNUC__
340
#define LOGGER_PRINTF __attribute__((format(printf, 4, 5)))
341
#else
342
#define LOGGER_PRINTF
343
#endif
344
 
345 3 howe.r.j.8
int logger(log_level_e level, const char *func,
346 5 howe.r.j.8
                const unsigned line, const char *fmt, ...) LOGGER_PRINTF;
347 3 howe.r.j.8
 
348 5 howe.r.j.8
#define fatal(...)   logger(LOG_FATAL,   __func__, __LINE__, __VA_ARGS__)
349
#define error(...)   logger(LOG_ERROR,   __func__, __LINE__, __VA_ARGS__)
350
#define warning(...) logger(LOG_WARNING, __func__, __LINE__, __VA_ARGS__)
351
#define note(...)    logger(LOG_NOTE,    __func__, __LINE__, __VA_ARGS__)
352
#define debug(...)   logger(LOG_DEBUG,   __func__, __LINE__, __VA_ARGS__)
353 3 howe.r.j.8
 
354
int memory_load(FILE *input, uint16_t *p, size_t length);
355 5 howe.r.j.8
int memory_save(FILE *output, const uint16_t *p, size_t length);
356 3 howe.r.j.8
 
357
#define BACKSPACE (8)
358
#define ESCAPE    (27)
359
#define DELETE    (127)  /* ASCII delete */
360
 
361
void vt100_update(vt100_t *t, uint8_t c);
362
 
363
#endif

powered by: WebSVN 2.1.0

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