1+ import { Opcode } from '../code'
12import * as AST from './ast'
23
34export type OperandPattern =
@@ -7,158 +8,151 @@ export type OperandPattern =
78 children : OperandPattern [ ]
89 }
910
10- export const patterns : Record < AST . Mnemonic , [ number , OperandPattern [ ] ] [ ] > = {
11+ export const patterns : Record < AST . Mnemonic , [ Opcode , OperandPattern [ ] ] [ ] > = {
12+ HALT : [
13+ [ Opcode . HALT , [ ] ] ,
14+ ] ,
1115 ADD : [
12- [ 0xa0 , [ AST . NodeType . Register , AST . NodeType . Register ] ] ,
13- [ 0xb0 , [ AST . NodeType . Register , AST . NodeType . Immediate ] ] ,
16+ [ Opcode . ADD_REG_REG , [ AST . NodeType . Register , AST . NodeType . Register ] ] ,
17+ [ Opcode . ADD_REG_IMM , [ AST . NodeType . Register , AST . NodeType . Immediate ] ] ,
1418 ] ,
1519 SUB : [
16- [ 0xa1 , [ AST . NodeType . Register , AST . NodeType . Register ] ] ,
17- [ 0xb1 , [ AST . NodeType . Register , AST . NodeType . Immediate ] ] ,
20+ [ Opcode . SUB_REG_REG , [ AST . NodeType . Register , AST . NodeType . Register ] ] ,
21+ [ Opcode . SUB_REG_IMM , [ AST . NodeType . Register , AST . NodeType . Immediate ] ] ,
1822 ] ,
1923 MUL : [
20- [ 0xa2 , [ AST . NodeType . Register , AST . NodeType . Register ] ] ,
21- [ 0xb2 , [ AST . NodeType . Register , AST . NodeType . Immediate ] ] ,
24+ [ Opcode . MUL_REG_REG , [ AST . NodeType . Register , AST . NodeType . Register ] ] ,
25+ [ Opcode . MUL_REG_IMM , [ AST . NodeType . Register , AST . NodeType . Immediate ] ] ,
2226 ] ,
2327 DIV : [
24- [ 0xa3 , [ AST . NodeType . Register , AST . NodeType . Register ] ] ,
25- [ 0xb3 , [ AST . NodeType . Register , AST . NodeType . Immediate ] ] ,
28+ [ Opcode . DIV_REG_REG , [ AST . NodeType . Register , AST . NodeType . Register ] ] ,
29+ [ Opcode . DIV_REG_IMM , [ AST . NodeType . Register , AST . NodeType . Immediate ] ] ,
2630 ] ,
2731 INC : [
28- [ 0xa4 , [ AST . NodeType . Register ] ] ,
32+ [ Opcode . INC_REG , [ AST . NodeType . Register ] ] ,
2933 ] ,
3034 DEC : [
31- [ 0xa5 , [ AST . NodeType . Register ] ] ,
35+ [ Opcode . DEC_REG , [ AST . NodeType . Register ] ] ,
3236 ] ,
3337 MOD : [
34- [ 0xa6 , [ AST . NodeType . Register , AST . NodeType . Register ] ] ,
35- [ 0xb6 , [ AST . NodeType . Register , AST . NodeType . Immediate ] ] ,
38+ [ Opcode . MOD_REG_REG , [ AST . NodeType . Register , AST . NodeType . Register ] ] ,
39+ [ Opcode . MOD_REG_IMM , [ AST . NodeType . Register , AST . NodeType . Immediate ] ] ,
3640 ] ,
3741 AND : [
38- [ 0xaa , [ AST . NodeType . Register , AST . NodeType . Register ] ] ,
39- [ 0xba , [ AST . NodeType . Register , AST . NodeType . Immediate ] ] ,
42+ [ Opcode . AND_REG_REG , [ AST . NodeType . Register , AST . NodeType . Register ] ] ,
43+ [ Opcode . AND_REG_IMM , [ AST . NodeType . Register , AST . NodeType . Immediate ] ] ,
4044 ] ,
4145 OR : [
42- [ 0xab , [ AST . NodeType . Register , AST . NodeType . Register ] ] ,
43- [ 0xbb , [ AST . NodeType . Register , AST . NodeType . Immediate ] ] ,
46+ [ Opcode . OR_REG_REG , [ AST . NodeType . Register , AST . NodeType . Register ] ] ,
47+ [ Opcode . OR_REG_IMM , [ AST . NodeType . Register , AST . NodeType . Immediate ] ] ,
4448 ] ,
4549 XOR : [
46- [ 0xac , [ AST . NodeType . Register , AST . NodeType . Register ] ] ,
47- [ 0xbc , [ AST . NodeType . Register , AST . NodeType . Immediate ] ] ,
50+ [ Opcode . XOR_REG_REG , [ AST . NodeType . Register , AST . NodeType . Register ] ] ,
51+ [ Opcode . XOR_REG_IMM , [ AST . NodeType . Register , AST . NodeType . Immediate ] ] ,
4852 ] ,
4953 NOT : [
50- [ 0xad , [ AST . NodeType . Register ] ] ,
54+ [ Opcode . NOT_REG , [ AST . NodeType . Register ] ] ,
5155 ] ,
5256 ROL : [
53- [ 0x9a , [ AST . NodeType . Register ] ] ,
57+ [ Opcode . ROL_REG , [ AST . NodeType . Register ] ] ,
5458 ] ,
5559 ROR : [
56- [ 0x9b , [ AST . NodeType . Register ] ] ,
60+ [ Opcode . ROR_REG , [ AST . NodeType . Register ] ] ,
5761 ] ,
5862 SHL : [
59- [ 0x9c , [ AST . NodeType . Register ] ] ,
63+ [ Opcode . SHL_REG , [ AST . NodeType . Register ] ] ,
6064 ] ,
6165 SHR : [
62- [ 0x9d , [ AST . NodeType . Register ] ] ,
66+ [ Opcode . SHR_REG , [ AST . NodeType . Register ] ] ,
6367 ] ,
6468 JMP : [
65- [ 0xc0 , [ AST . NodeType . Identifier ] ] ,
69+ [ Opcode . JMP , [ AST . NodeType . Identifier ] ] ,
6670 ] ,
6771 JZ : [
68- [ 0xc1 , [ AST . NodeType . Identifier ] ] ,
72+ [ Opcode . JZ , [ AST . NodeType . Identifier ] ] ,
6973 ] ,
7074 JNZ : [
71- [ 0xc2 , [ AST . NodeType . Identifier ] ] ,
75+ [ Opcode . JNZ , [ AST . NodeType . Identifier ] ] ,
7276 ] ,
7377 JS : [
74- [ 0xc3 , [ AST . NodeType . Identifier ] ] ,
78+ [ Opcode . JS , [ AST . NodeType . Identifier ] ] ,
7579 ] ,
7680 JNS : [
77- [ 0xc4 , [ AST . NodeType . Identifier ] ] ,
81+ [ Opcode . JNS , [ AST . NodeType . Identifier ] ] ,
7882 ] ,
7983 JO : [
80- [ 0xc5 , [ AST . NodeType . Identifier ] ] ,
84+ [ Opcode . JO , [ AST . NodeType . Identifier ] ] ,
8185 ] ,
8286 JNO : [
83- [ 0xc6 , [ AST . NodeType . Identifier ] ] ,
87+ [ Opcode . JNO , [ AST . NodeType . Identifier ] ] ,
8488 ] ,
8589 MOV : [
86- [ 0xd0 , [ AST . NodeType . Register , AST . NodeType . Immediate ] ] ,
87- [ 0xd1 , [
90+ [ Opcode . MOV_REG_IMM , [ AST . NodeType . Register , AST . NodeType . Immediate ] ] ,
91+ [ Opcode . MOV_REG_ADDR , [
8892 AST . NodeType . Register ,
8993 { type : AST . NodeType . MemoryOperand , children : [ AST . NodeType . Immediate ] } ,
9094 ] ] ,
91- [ 0xd2 , [
95+ [ Opcode . MOV_ADDR_REG , [
9296 { type : AST . NodeType . MemoryOperand , children : [ AST . NodeType . Immediate ] } ,
9397 AST . NodeType . Register ,
9498 ] ] ,
95- [ 0xd3 , [
99+ [ Opcode . MOV_REG_REG_ADDR , [
96100 AST . NodeType . Register ,
97101 { type : AST . NodeType . MemoryOperand , children : [ AST . NodeType . Register ] } ,
98102 ] ] ,
99- [ 0xd4 , [
103+ [ Opcode . MOV_REG_ADDR_REG , [
100104 { type : AST . NodeType . MemoryOperand , children : [ AST . NodeType . Register ] } ,
101105 AST . NodeType . Register ,
102106 ] ] ,
103107 ] ,
104108 CMP : [
105- [ 0xda , [ AST . NodeType . Register , AST . NodeType . Register ] ] ,
106- [ 0xdb , [ AST . NodeType . Register , AST . NodeType . Immediate ] ] ,
107- [ 0xdc , [
109+ [ Opcode . CMP_REG_REG , [ AST . NodeType . Register , AST . NodeType . Register ] ] ,
110+ [ Opcode . CMP_REG_IMM , [ AST . NodeType . Register , AST . NodeType . Immediate ] ] ,
111+ [ Opcode . CMP_REG_ADDR , [
108112 AST . NodeType . Register ,
109113 { type : AST . NodeType . MemoryOperand , children : [ AST . NodeType . Immediate ] } ,
110114 ] ] ,
111115 ] ,
112116 PUSH : [
113- [ 0xe0 , [ AST . NodeType . Register ] ] ,
117+ [ Opcode . PUSH_REG , [ AST . NodeType . Register ] ] ,
114118 ] ,
115119 POP : [
116- [ 0xe1 , [ AST . NodeType . Register ] ] ,
120+ [ Opcode . POP_REG , [ AST . NodeType . Register ] ] ,
117121 ] ,
118122 PUSHF : [
119- [ 0xea , [ ] ] ,
123+ [ Opcode . PUSHF , [ ] ] ,
120124 ] ,
121125 POPF : [
122- [ 0xeb , [ ] ] ,
126+ [ Opcode . POPF , [ ] ] ,
123127 ] ,
124128 CALL : [
125- [ 0xca , [ AST . NodeType . Immediate ] ] ,
129+ [ Opcode . CALL_ADDR , [ AST . NodeType . Immediate ] ] ,
126130 ] ,
127131 RET : [
128- [ 0xcb , [ ] ] ,
132+ [ Opcode . RET , [ ] ] ,
129133 ] ,
130134 INT : [
131- [ 0xcc , [ AST . NodeType . Immediate ] ] ,
135+ [ Opcode . INT_ADDR , [ AST . NodeType . Immediate ] ] ,
132136 ] ,
133137 IRET : [
134- [ 0xcd , [ ] ] ,
138+ [ Opcode . IRET , [ ] ] ,
135139 ] ,
136140 IN : [
137- [ 0xf0 , [ AST . NodeType . Immediate ] ] ,
141+ [ Opcode . IN_IMM , [ AST . NodeType . Immediate ] ] ,
138142 ] ,
139143 OUT : [
140- [ 0xf1 , [ AST . NodeType . Immediate ] ] ,
141- ] ,
142- HALT : [
143- [ 0x00 , [ ] ] ,
144+ [ Opcode . OUT_IMM , [ AST . NodeType . Immediate ] ] ,
144145 ] ,
145146 STI : [
146- [ 0xfc , [ ] ] ,
147+ [ Opcode . STI , [ ] ] ,
147148 ] ,
148149 CLI : [
149- [ 0xfd , [ ] ] ,
150+ [ Opcode . CLI , [ ] ] ,
150151 ] ,
151152 CLO : [
152- [ 0xfe , [ ] ] ,
153+ [ Opcode . CLO , [ ] ] ,
153154 ] ,
154155 NOP : [
155- [ 0xff , [ ] ] ,
156+ [ Opcode . NOP , [ ] ] ,
156157 ] ,
157158}
158-
159- export enum Register {
160- AL = 0x00 ,
161- BL = 0x01 ,
162- CL = 0x02 ,
163- DL = 0x03 ,
164- }
0 commit comments