-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathassembler.test.js
160 lines (150 loc) · 2.73 KB
/
assembler.test.js
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
const { assembler } = require('./assembler.js');
describe('assembler', () => {
it('should hoist labels', () => {
expect(
assembler(`
@HELLO
(HELLO)
@3
`)
).toBe('1 3');
});
it('works', () => {
expect(
assembler(`
@2
D=A
@2
D=D+A
@0
M=D
`)
).toBe('2 ec10 2 e090 0 e308');
});
it('break', () => {
expect(
assembler(`
@2
D=A
BREAK
@2
@0
BREAK
M=D
`)
).toBe('2 ec10 8000 2 0 8000 e308');
});
it('works 2', () => {
expect(
assembler(`
// Adds 1+...+100.
@i // i refers to some mem. location.
M=1 // i=1
@sum // sum refers to some mem. location.
M=0 // sum=0
(LOOP)
@i
D=M // D=i
@100
D=D-A // D=i-100
@END
D;JGT // If (i-100)>0 goto END
@i
D=M // D=i
@sum
M=D+M // sum=sum+i
@i
M=M+1 // i=i+1
@LOOP
0;JMP // Goto LOOP
(END)
@END
0;JMP // Infinite loop
`)
).toBe(
'10 efc8 11 ea88 10 fc10 64 e4d0 12 e301 10 fc10 11 f088 10 fdc8 4 ea87 12 ea87'
);
expect(
assembler(`
// Draw a straight vertical line in the first line of the first panel
@32767
D=A
@32767
D=D+A
D=D+1
@SCREEN
M=D
(END)
@END
0;JMP // Infinite loop
`)
).toBe('7fff ec10 7fff e090 e7d0 4000 e308 7 ea87');
expect(
assembler(`
// Animate binary counting in the first line of the second panel
(LOOP)
@i
DM=M+1
@SCREEN
A=A+1
M=D
@LOOP
0;JMP
`)
).toBe('10 fdd8 4000 ede0 e308 0 ea87');
expect(
assembler(`
// ANIMATE BINARY COUNTING IN THE FIRST LINE OF THE THIRD PANEL OF THE SECOND PANEL ROW
@SCREEN
D=A
@130
D=D+A
@X
M=D
(LOOP)
@i
DM=M+1
@X
A=M
M=D
@LOOP
0;JMP
`)
).toBe('4000 ec10 82 e090 10 e308 11 fdd8 10 fc20 e308 6 ea87');
expect(
assembler(
`
@SCREEN // test
D=A
@130
D=D+A
@X
M=D
(LOOP)
@i
DM=M+1
@X
A=M // A equals to M
M=D
@LOOP
0;JMP
`,
{ renderUnlabeled: true }
)
).toEqual([
'@16384 // test',
'D=A',
'@130',
'D=D+A',
'@16',
'M=D',
'@17',
'DM=M+1',
'@16',
'A=M // A equals to M',
'M=D',
'@6',
'0;JMP',
]);
});
});