Skip to content

Commit 04bd74c

Browse files
committed
refactor(core/assembler): extract file for codes
1 parent 4e26594 commit 04bd74c

File tree

3 files changed

+147
-65
lines changed

3 files changed

+147
-65
lines changed

src/core/assembler/assembler.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { expectNever } from 'ts-expect'
33
import { compose } from '@/common/utils/context'
44
import { invariant } from '@/common/utils/invariant'
55

6+
import { Register } from '../code'
67
import { AssemblerState, createAssemblerState } from './assembler.state'
78
import { getSize, hasIdentifier, type WithIdentifier } from './assembler.utils'
89
import {
@@ -14,7 +15,6 @@ import {
1415
} from './assemblyunit'
1516
import * as AST from './ast'
1617
import { AssemblerError, type AssemblyError, ErrorCode, ParserError, Severity } from './errors'
17-
import * as InstrSet from './instrset'
1818
import { resolveOpcode } from './instrset.utils'
1919
import { createLexer } from './lexer'
2020
import { createParser } from './parser'
@@ -254,7 +254,7 @@ function resolveIdentifier({ children: [name], loc }: AST.Identifier): number {
254254
}
255255

256256
function resolveRegister({ children: [name] }: AST.Register): number {
257-
return InstrSet.Register[name]
257+
return Register[name]
258258
}
259259

260260
function resolveImmediate({ children: [value], loc }: AST.Immediate): number {

src/core/assembler/instrset.ts

Lines changed: 57 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { Opcode } from '../code'
12
import * as AST from './ast'
23

34
export 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-
}

src/core/code.ts

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
export enum Opcode {
2+
HALT = 0x00,
3+
4+
// Direct Arithmetic
5+
ADD_REG_REG = 0xa0,
6+
SUB_REG_REG = 0xa1,
7+
MUL_REG_REG = 0xa2,
8+
DIV_REG_REG = 0xa3,
9+
INC_REG = 0xa4,
10+
DEC_REG = 0xa5,
11+
MOD_REG_REG = 0xa6,
12+
AND_REG_REG = 0xaa,
13+
OR_REG_REG = 0xab,
14+
XOR_REG_REG = 0xac,
15+
NOT_REG = 0xad,
16+
ROL_REG = 0x9a,
17+
ROR_REG = 0x9b,
18+
SHL_REG = 0x9c,
19+
SHR_REG = 0x9d,
20+
21+
// Immediate Arithmetic
22+
ADD_REG_IMM = 0xb0,
23+
SUB_REG_IMM = 0xb1,
24+
MUL_REG_IMM = 0xb2,
25+
DIV_REG_IMM = 0xb3,
26+
MOD_REG_IMM = 0xb6,
27+
AND_REG_IMM = 0xba,
28+
OR_REG_IMM = 0xbb,
29+
XOR_REG_IMM = 0xbc,
30+
31+
// Jump
32+
JMP = 0xc0,
33+
JZ = 0xc1,
34+
JNZ = 0xc2,
35+
JS = 0xc3,
36+
JNS = 0xc4,
37+
JO = 0xc5,
38+
JNO = 0xc6,
39+
40+
// Immediate Move
41+
MOV_REG_IMM = 0xd0,
42+
43+
// Direct Move
44+
MOV_REG_ADDR = 0xd1,
45+
MOV_ADDR_REG = 0xd2,
46+
47+
// Indirect Move
48+
MOV_REG_REG_ADDR = 0xd3,
49+
MOV_REG_ADDR_REG = 0xd4,
50+
51+
// Direct Register Comparison
52+
CMP_REG_REG = 0xda,
53+
54+
// Immediate Comparison
55+
CMP_REG_IMM = 0xdb,
56+
57+
// Direct Memory Comparison
58+
CMP_REG_ADDR = 0xdc,
59+
60+
// Stack
61+
PUSH_REG = 0xe0,
62+
POP_REG = 0xe1,
63+
PUSHF = 0xea,
64+
POPF = 0xeb,
65+
66+
// Procedures and Interrupts
67+
CALL_ADDR = 0xca,
68+
RET = 0xcb,
69+
INT_ADDR = 0xcc,
70+
IRET = 0xcd,
71+
72+
// Input and Output
73+
IN_IMM = 0xf0,
74+
OUT_IMM = 0xf1,
75+
76+
// Miscellaneous
77+
STI = 0xfc,
78+
CLI = 0xfd,
79+
CLO = 0xfe,
80+
NOP = 0xff,
81+
}
82+
83+
export enum Register {
84+
AL = 0x00,
85+
BL = 0x01,
86+
CL = 0x02,
87+
DL = 0x03,
88+
}

0 commit comments

Comments
 (0)