-
Notifications
You must be signed in to change notification settings - Fork 0
/
base.py
121 lines (102 loc) · 3.82 KB
/
base.py
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
import enum
class AddressingMode(enum.Flag):
LABEL_VALUE = 0x0001
VALUE = 0x0002
REGISTER = 0x0004
INDEXED = 0x0008
REG_INDEXED = 0x0010
POST_INC = 0x0020
PRE_DEC = 0x0040
IND_INDEXED = 0x0080
IND_REG_INDEXED = 0x0100
ANY_ADDRESSING_MODE = 0x01FF
class Token(enum.Flag):
AM_LABEL = 0x0001
AM_VALUE = 0x0002
AM_REGISTER = 0x0004
AM_INDEXED = 0x0008
AM_REG_INDEXED = 0x0010
AM_POST_INC = 0x0020
AM_PRE_DEC = 0x0040
AM_IND_INDEXED = 0x0080
AM_IND_REG_INDEXED = 0x0100
ANY_ADDRESSING_MODE = 0x01FF
DATA = 0x0200
MNEMONIC = 0x0400
LABEL = 0x0800
CODE_SEGMENT_START = 0x1000
DATA_SEGMENT_START = 0x2000
# Section 4.4
BinaryInstructions = {
"LOAD", "ADD", "SUB", "CMP", "MULS", "MULL", "CHCK", "DIV", "MOD", "DVMOD",
"AND", "OR", "XOR", "STOR"
}
# Section 4.5
UnaryInstructions = {
"JMP", "JSR", "CLRI", "SETI", "PSEM", "VSEM"
}
# Section 4.6
BranchInstructions = {
"BRA", "BRS", "BEQ", "BNE", "BCS", "BCC", "BLS", "BHI", "BVC", "BVS", "BPL",
"BMI", "BLT", "BGE", "BLE", "BGT"
}
# Section 4.7
Traps = {
"TRA0", "TRA1", "TREQ", "TRNE", "TRCS", "TRCC", "TRLS", "TRHI", "TRVC",
"TRVS", "TRPL", "TRMI", "TRLT", "TRGE", "TRLE", "TRGT", "RST"
}
# Section 4.8
MiscInstructions = {
"RTS", "RTE", "PUSH", "PULL", "CONS"
}
# Dict to map number of operands to possible mnemonics
Instructions = {
0: Traps | {"RTS", "RTE"},
1: UnaryInstructions | BranchInstructions | {"PUSH", "PULL", "CONS"},
2: BinaryInstructions,
}
# Dict to map the mnemonic to operand types
InstructionOperands = {
"RTE": [],
"TRA0": [], "TRA1": [], "TREQ": [], "TRNE": [], "TRCS": [], "TRCC": [], "TRLS": [], "TRHI": [], "TRVC": [],
"TRVS": [], "TRPL": [], "TRMI": [], "TRLT": [], "TRGE": [], "TRLE": [], "TRGT": [], "RST": [],
"JMP": [Token.ANY_ADDRESSING_MODE ^ Token.AM_VALUE],
"JSR": [Token.ANY_ADDRESSING_MODE ^ Token.AM_VALUE],
"CLRI": [Token.ANY_ADDRESSING_MODE],
"SETI": [Token.ANY_ADDRESSING_MODE],
# Apparently PSEM and VSEM can also be used without operands... No clue how
# that works though, so that's unsupported for now.
"PSEM": [Token.ANY_ADDRESSING_MODE ^ Token.AM_VALUE ^ Token.AM_REGISTER],
"VSEM": [Token.ANY_ADDRESSING_MODE ^ Token.AM_VALUE ^ Token.AM_REGISTER],
"BRA": [Token.AM_LABEL],
"BRS": [Token.AM_LABEL],
"BEQ": [Token.AM_LABEL],
"BNE": [Token.AM_LABEL],
"BCS": [Token.AM_LABEL],
"BCC": [Token.AM_LABEL],
"BLS": [Token.AM_LABEL],
"BHI": [Token.AM_LABEL],
"BVC": [Token.AM_LABEL],
"BVS": [Token.AM_LABEL],
"BPL": [Token.AM_LABEL],
"BMI": [Token.AM_LABEL],
"BLT": [Token.AM_LABEL],
"BGE": [Token.AM_LABEL],
"BLE": [Token.AM_LABEL],
"BGT": [Token.AM_LABEL],
"CONS": [Token.AM_VALUE],
"LOAD": [Token.AM_REGISTER, Token.ANY_ADDRESSING_MODE],
"ADD": [Token.AM_REGISTER, Token.ANY_ADDRESSING_MODE],
"SUB": [Token.AM_REGISTER, Token.ANY_ADDRESSING_MODE],
"CMP": [Token.AM_REGISTER, Token.ANY_ADDRESSING_MODE],
"MULS": [Token.AM_REGISTER, Token.ANY_ADDRESSING_MODE],
"MULL": [Token.AM_REGISTER, Token.ANY_ADDRESSING_MODE],
"CHCK": [Token.AM_REGISTER, Token.ANY_ADDRESSING_MODE],
"DIV": [Token.AM_REGISTER, Token.ANY_ADDRESSING_MODE],
"MOD": [Token.AM_REGISTER, Token.ANY_ADDRESSING_MODE],
"DVMOD":[Token.AM_REGISTER, Token.ANY_ADDRESSING_MODE],
"AND": [Token.AM_REGISTER, Token.ANY_ADDRESSING_MODE],
"OR": [Token.AM_REGISTER, Token.ANY_ADDRESSING_MODE],
"XOR": [Token.AM_REGISTER, Token.ANY_ADDRESSING_MODE],
"STOR": [Token.AM_REGISTER, Token.ANY_ADDRESSING_MODE ^ Token.AM_VALUE ^ Token.AM_REGISTER],
}