2023-02-05 06:44:37 -05:00
|
|
|
#ifndef CREOLE_H
|
|
|
|
#define CREOLE_H
|
|
|
|
|
|
|
|
#include <limits.h>
|
2023-02-07 00:25:30 -05:00
|
|
|
#include <stddef.h>
|
2023-02-05 06:44:37 -05:00
|
|
|
|
|
|
|
#ifndef CREOLE_WORD
|
|
|
|
# define CREOLE_WORD unsigned int
|
|
|
|
# define CREOLE_WORD_MAX UINT_MAX
|
2023-02-11 15:49:39 -05:00
|
|
|
# define CREOLE_SIGNED_WORD int
|
|
|
|
# define CREOLE_SIGNED_MAX INT_MAX
|
2023-02-05 06:44:37 -05:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#define CREOLE_MAX_ARG 3
|
|
|
|
|
|
|
|
typedef CREOLE_WORD creole_word;
|
2023-02-11 15:49:39 -05:00
|
|
|
typedef CREOLE_SIGNED_WORD creole_signed;
|
2023-02-05 06:44:37 -05:00
|
|
|
|
|
|
|
enum creole_opcode {
|
2023-02-12 13:06:08 -05:00
|
|
|
CREOLE_NOOP,
|
|
|
|
CREOLE_PUSH,
|
|
|
|
CREOLE_POP,
|
|
|
|
CREOLE_ADD,
|
|
|
|
CREOLE_MUL,
|
|
|
|
CREOLE_DIV,
|
|
|
|
CREOLE_SYS,
|
|
|
|
CREOLE_CLB,
|
|
|
|
CREOLE_JL,
|
|
|
|
CREOLE_JLE,
|
|
|
|
CREOLE_JE,
|
|
|
|
CREOLE_JNE,
|
2023-02-05 06:44:37 -05:00
|
|
|
CREOLE_OPCODE_LEN
|
|
|
|
};
|
|
|
|
|
|
|
|
enum creole_word_flag {
|
|
|
|
CREOLE_IMMEDIATE,
|
|
|
|
CREOLE_REGISTER,
|
|
|
|
CREOLE_WORD_FLAGS_LEN
|
|
|
|
};
|
|
|
|
|
|
|
|
enum creole_compiler_ret {
|
|
|
|
CREOLE_COMPILE_OK,
|
2023-02-07 23:15:54 -05:00
|
|
|
CREOLE_OPCODE_READ_ERROR,
|
|
|
|
CREOLE_OPCODE_MALFORMED,
|
|
|
|
CREOLE_ARG_READ_ERROR,
|
|
|
|
CREOLE_ARG_MALFORMED,
|
|
|
|
CREOLE_LAST_READ_ERROR,
|
|
|
|
CREOLE_LAST_MALFORMED,
|
2023-02-05 06:44:37 -05:00
|
|
|
CREOLE_LABEL_OVERFLOW,
|
|
|
|
CREOLE_TYPE_ERROR,
|
2023-02-09 11:16:41 -05:00
|
|
|
CREOLE_COMPILE_CLEARED_INSTRUCTION,
|
|
|
|
CREOLE_PROGRAM_OVERFLOW,
|
2023-02-05 06:44:37 -05:00
|
|
|
CREOLE_COMPILE_RET_LEN
|
|
|
|
};
|
|
|
|
|
2023-02-11 09:28:43 -05:00
|
|
|
enum creole_run_ret {
|
|
|
|
CREOLE_STEP_CONTINUE,
|
|
|
|
CREOLE_STEP_SYSCALL,
|
|
|
|
CREOLE_STEP_STOP,
|
|
|
|
CREOLE_STACK_OVERFLOW,
|
|
|
|
CREOLE_STACK_UNDERFLOW,
|
|
|
|
CREOLE_RUN_LABEL_OVERFLOW,
|
|
|
|
CREOLE_REGISTER_OVERFLOW,
|
|
|
|
CREOLE_STEP_UNKNOWN_OPCODE,
|
2023-02-11 15:49:39 -05:00
|
|
|
CREOLE_DIV_BY_ZERO,
|
2023-02-12 13:06:08 -05:00
|
|
|
CREOLE_STEP_HIGH_BIT_MALFORMED,
|
2023-02-11 09:28:43 -05:00
|
|
|
CREOLE_RUN_RET_LEN
|
|
|
|
};
|
|
|
|
|
2023-02-05 06:44:37 -05:00
|
|
|
struct creole_ins {
|
|
|
|
enum creole_opcode opcode;
|
|
|
|
unsigned char w_flags[3];
|
|
|
|
creole_word w[3];
|
|
|
|
};
|
|
|
|
|
|
|
|
struct creole_env {
|
|
|
|
creole_word *reg;
|
|
|
|
size_t reglen;
|
|
|
|
|
|
|
|
size_t *lab;
|
|
|
|
size_t lablen;
|
|
|
|
|
|
|
|
creole_word *stk;
|
|
|
|
size_t stkptr, stklen;
|
|
|
|
|
|
|
|
struct creole_ins *prg;
|
|
|
|
size_t prgptr, prgend, prglen;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct creole_reader {
|
|
|
|
unsigned char *p;
|
|
|
|
size_t left;
|
|
|
|
};
|
|
|
|
|
2023-02-07 23:15:54 -05:00
|
|
|
int creole_encode(creole_word i, unsigned encode_to, unsigned high_bits,
|
|
|
|
unsigned char buf[7]);
|
|
|
|
enum creole_compiler_ret
|
|
|
|
creole_parse_line(struct creole_ins *ins, struct creole_reader *r);
|
2023-02-09 11:16:41 -05:00
|
|
|
enum creole_compiler_ret
|
|
|
|
creole_compile(struct creole_env *env, struct creole_reader *r);
|
2023-02-07 23:15:54 -05:00
|
|
|
|
2023-02-11 12:04:17 -05:00
|
|
|
enum creole_run_ret creole_reg_write(struct creole_env *env, unsigned reg,
|
|
|
|
creole_word w);
|
|
|
|
enum creole_run_ret creole_reg_read(struct creole_env *env, unsigned reg,
|
|
|
|
creole_word *w);
|
2023-02-11 09:28:43 -05:00
|
|
|
enum creole_run_ret creole_push(struct creole_env *env, creole_word w);
|
|
|
|
enum creole_run_ret creole_pop(struct creole_env *env, creole_word *w);
|
|
|
|
enum creole_run_ret creole_step(struct creole_env *env, creole_word *sc);
|
|
|
|
|
2023-02-05 06:44:37 -05:00
|
|
|
#endif /* CREOLE_H */
|