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

Subversion Repositories forth-cpu

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

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

powered by: WebSVN 2.1.0

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