blob: 2d8e311bd957b7867994abfb02f45b59010a7a3e (
plain)
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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
|
;; BEGIN BOOTSTRAP
@use ext_std:*
@let sp RH
@let vector_table 0x10
@let vt_ISR0 0x10 ; ISR0
@let vt_ISR1 0x11 ; ISR1
@let vt_ISR2 0x12 ; ISR2
@let vt_ISR3 0x13 ; ISR3
@let vt_stack_addr 0x14 ; Stack address
@let vt_term_pp_addr 0x15 ; Terminal peripheral address
@let vt_kb_pp_addr 0x16 ; Keyboard peripheral address
@let vt_gr_mode_addr 0x17 ; Graphics mode setting address
@let vt_sprite_mem 0x18 ; Sprite memory address
@let vt_text_mem 0x19 ; Text memory buffer address
@let stack_segment 0x8000
@let mmio_segment 0xE000
@let terminal_addr 0xE000
@let keyboard_addr 0xE001
@let gr_mode_addr 0xE002
@let sprite_mem 0xE800
@let text_mem 0xF800
@let gr_disabled_mode 0b00
@let gr_text_mode 0b01
@let gr_sprite_mode 0b10
@address 0x0
ldi vt_stack_addr RA
ldr RA SP
jpi program_segment
@address vector_table
keyboard_isr ; 0x10
hlt_isr ; 0x11
hlt_isr ; 0x12
hlt_isr ; 0x13
stack_segment ; 0x14
terminal_addr ; 0x15
keyboard_addr ; 0x16
gr_mode_addr ; 0x17
sprite_mem ; 0x18
text_mem ; 0x19
@label hlt_isr
ldi 0x55 RE
hlt
@label keyboard_isr
spu RA
spu RB
ldi vt_kb_pp_addr RA
ldr RA RA
ldr RA RA
ldi vt_term_pp_addr RB
ldr RB RB
str RA RB
spo RB
spo RA
rti
@label program_segment
ldi vt_gr_mode_addr RA
ldr RA RA
ldi gr_disabled_mode RB
str RB RA
jpi main
;; END BOOTSTRAP
@label text_mode
1
@label graphics_mode_addr_p
23
@label text_mem_addr_p
25
@label int_1
65
@label int_5
26
; <ast.FunctionDef object at 0x1048ce500>
@label nth_letter
; stack frame with offsets
; return_address_0 3
; n 4
; <ast.Return object at 0x1048ce440>
; <ast.Add object at 0x1045f6ad0>
; BinOp lhs <ast.BinOp object at 0x1048ce410>
; <ast.Name object at 0x1048ce3e0> (n)
ldi vt_stack_addr RA
ldr RA RA
ldi 4 RB
add RA RB RA
ldr RA RA
spu RA
; BinOp rhs <ast.BinOp object at 0x1048ce410>
; <ast.Constant object at 0x1048ce3b0>
ldi int_1 RA
ldr RA RA
spu RA
spo RB
spo RA
add RA RB RA
spu RA
ldi vt_stack_addr RA
ldr RA RA
ldi 3 RB
add RA RB RA
; stack address of return address is stored in reg RA
spo RB
; return value is stored in reg RB
mov RA SP
ldr RA RA
spu RB
; return from function
jpr RA
@label main
; stack frame with offsets
; graphics_mode_addr 0
; text_mem_addr 1
; i 2
addi SP 3 SP
; <ast.Assign object at 0x1048ce860>
; assigning graphics_mode_addr at stack segment + 0
; evaluating value to be assigned
; <ast.Call object at 0x1048ce800>
; Builtin call load [<ast.Name object at 0x1048ce770>]
; <ast.Name object at 0x1048ce770> (GRAPHICS_MODE_ADDR_P)
ldi graphics_mode_addr_p RC
ldr RC RC
spu RC
spo RC
ldr RC RC
spu RC
; assigning value to stack segment + 0
ldi vt_stack_addr RA
ldr RA RA
ldi 0 RB
add RA RB RA
spo RB
str RB RA
; <ast.Assign object at 0x1048ce740>
; assigning text_mem_addr at stack segment + 1
; evaluating value to be assigned
; <ast.Call object at 0x1048ce6e0>
; Builtin call load [<ast.Name object at 0x1048ce650>]
; <ast.Name object at 0x1048ce650> (TEXT_MEM_ADDR_P)
ldi text_mem_addr_p RC
ldr RC RC
spu RC
spo RC
ldr RC RC
spu RC
; assigning value to stack segment + 1
ldi vt_stack_addr RA
ldr RA RA
ldi 1 RB
add RA RB RA
spo RB
str RB RA
; <ast.Call object at 0x1048ce5f0>
; Builtin call store [<ast.Name object at 0x1048ce560>, <ast.Name object at 0x1048ce530>]
; <ast.Name object at 0x1048ce560> (graphics_mode_addr)
ldi vt_stack_addr RA
ldr RA RA
ldi 0 RB
add RA RB RA
ldr RA RA
spu RA
; <ast.Name object at 0x1048ce530> (TEXT_MODE)
ldi text_mode RA
ldr RA RA
spu RA
spo RB
spo RA
str RB RA
; <ast.Assign object at 0x1048ce350>
; assigning i at stack segment + 2
; evaluating value to be assigned
; <ast.Constant object at 0x1048ce2f0>
ldi 0 RC
spu RC
; assigning value to stack segment + 2
ldi vt_stack_addr RA
ldr RA RA
ldi 2 RB
add RA RB RA
spo RB
str RB RA
; <ast.Call object at 0x1048ce290>
; Builtin call asm [<ast.Constant object at 0x1048ce200>]
ldi 0b111111111 RG
; <ast.While object at 0x1048ce1d0>
@label while_test_2
; <ast.Name object at 0x1048ce170> (i)
ldi vt_stack_addr RB
ldr RB RB
ldi 2 RC
add RB RC RB
ldr RB RB
spu RB
; <ast.Constant object at 0x1048ce140>
ldi int_5 RB
ldr RB RB
spu RB
spo RC
spo RB
sub RB RC RB
bri carry Compare_true_6
ldi 0 RB
spu RB
jpi Compare_end_7
@label compare_true_6
ldi 1 RB
spu RB
@label compare_end_7
spo RA
addi RA 0 RA
bri zero While_else_3
; <ast.Call object at 0x1048ce0e0>
; Builtin call store [<ast.BinOp object at 0x1048ce050>, <ast.Call object at 0x1048cdd80>]
; <ast.Add object at 0x1045f6ad0>
; BinOp lhs <ast.BinOp object at 0x1048ce050>
; <ast.Name object at 0x1048ce020> (text_mem_addr)
ldi vt_stack_addr RA
ldr RA RA
ldi 1 RB
add RA RB RA
ldr RA RA
spu RA
; BinOp rhs <ast.BinOp object at 0x1048ce050>
; <ast.Name object at 0x1048cdff0> (i)
ldi vt_stack_addr RA
ldr RA RA
ldi 2 RB
add RA RB RA
ldr RA RA
spu RA
spo RB
spo RA
add RA RB RA
spu RA
; <ast.Call object at 0x1048cdd80>
; Call function nth_letter
ldi 0 RA
spu RA
; <ast.Name object at 0x1048cdd20> (i)
ldi vt_stack_addr RA
ldr RA RA
ldi 2 RB
add RA RB RA
ldr RA RA
spu RA
; set up return address and jump to subroutine
subi SP 2 RA
lpc RB
addi RB 3 RB
str RB RA
jpi nth_letter
spo RB
spo RA
str RB RA
; <ast.Assign object at 0x1048ccc70>
; assigning i at stack segment + 2
; evaluating value to be assigned
; <ast.Add object at 0x1045f6ad0>
; BinOp lhs <ast.BinOp object at 0x1048cda50>
; <ast.Name object at 0x1048cd750> (i)
ldi vt_stack_addr RC
ldr RC RC
ldi 2 RD
add RC RD RC
ldr RC RC
spu RC
; BinOp rhs <ast.BinOp object at 0x1048cda50>
; <ast.Constant object at 0x1048cd720>
ldi 1 RC
spu RC
spo RD
spo RC
add RC RD RC
spu RC
; assigning value to stack segment + 2
ldi vt_stack_addr RA
ldr RA RA
ldi 2 RB
add RA RB RA
spo RB
str RB RA
jpi While_test_2
@label while_else_3
@label while_end_4
; <ast.While object at 0x1048cd0f0>
@label while_test_8
; <ast.Constant object at 0x1048cd060>
ldi 1 RB
spu RB
spo RA
addi RA 0 RA
bri zero While_else_9
; <ast.Pass object at 0x1048ccfa0>
jpi While_test_8
@label while_else_9
@label while_end_10
subi SP 3 SP
|