-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathassembler_types.h
130 lines (114 loc) · 2.1 KB
/
assembler_types.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include <stdint.h>
#define SEP_SPACE " "
enum
{
TYPE_OPCODE,
TYPE_DATA
};
enum
{
OP_HALT,
OP_ADD,
OP_SUB,
OP_AND,
OP_XOR,
OP_LSI,
OP_RS,
OP_LDA,
OP_LD,
OP_ST,
OP_LDI,
OP_STI,
OP_BZ,
OP_BP,
OP_JMP,
OP_JL,
OP_NUMBER
};
enum
{
MACRO_INC,
MACRO_DEC,
MACRO_PUSH,
MACRO_POP,
MACRO_CALL,
MACRO_RET,
MACRO_NUMBER
};
enum
{
INST_FORMAT_1 = 1,
INST_FORMAT_2,
INST_FORMAT_J,
INST_HALT
};
enum
{
IMM_DIRECT,
IMM_OFFSET,
IMM_SEGMENT
};
enum
{
LINE_UNKNOWN = 0,
LINE_DATA,
LINE_OPCODE,
LINE_MACRO
};
enum
{
MEM_TYPE_INST,
MEM_TYPE_DATA,
MEM_TYPE_MACRO
};
struct instr_struct
{
uint8_t opcode;
uint8_t format;
uint16_t addr;
uint8_t imm_labeled;
uint8_t imm_type;
uint8_t rd, rs, rt;
char label_name[50];
char *filename;
int linenum;
};
typedef struct instr_struct instr_t;
struct mem_loc_struct
{
int type;
uint16_t addr;
uint16_t data;
instr_t instr;
int label_id;
};
typedef struct mem_loc_struct mem_loc_t;
struct label_struct
{
uint16_t addr;
char name[50];
};
typedef struct label_struct label_t;
enum
{
REG_INVALID_REG = -3,
REG_EXPECT_COMMA,
REG_EXPECT_NAME
};
extern char opcode_strings[][10];
extern char macro_strings[][10];
extern char reg_names[][10];
uint16_t machine_inst(instr_t *inst);
int getReg(char name[], int comma);
void assert_reg(int reg, int linenum, char *filename);
int getValue(char token_ptr[]);
void getImm(char str1[], char str2[], int *imm_p, int *type_p);
void parseLine(char *lineptr, int linenum, char *filename, mem_loc_t *mem, int *ca_ptr);
uint16_t machine_inst(instr_t *inst);
void format1inst(instr_t *instr, int opcode, int rd, int rs, int rt);
void macroIncDec(int macro, int rd, mem_loc_t *mem, int *current_addr);
void showMemLoc(mem_loc_t *mem);
void macroPop(int rd, mem_loc_t *mem, int *current_addr);
void macroPush(int rd, mem_loc_t *mem, int *current_addr);
void macroCall(mem_loc_t *mem, int *current_addr);
void macroRet(mem_loc_t *mem, int *current_addr);