https://github.com/akkartik/mu/blob/main/103glyph.subx
1
2
3
4
5
6
7
8
9
10
11 == code
12
13
14
15
16
17
18 draw-code-point-on-real-screen:
19
20 55/push-ebp
21 89/<- %ebp 4/r32/esp
22
23 (draw-code-point-on-screen-buffer *Video-memory-addr *(ebp+8) *(ebp+0xc) *(ebp+0x10) *(ebp+0x14) *(ebp+0x18) 0x80 0x30)
24 $draw-code-point-on-real-screen:end:
25
26 89/<- %esp 5/r32/ebp
27 5d/pop-to-ebp
28 c3/return
29
30 draw-code-point-on-screen-array:
31
32 55/push-ebp
33 89/<- %ebp 4/r32/esp
34
35 51/push-ecx
36 52/push-edx
37
38 {
39
40 8b/-> *(ebp+8) 1/r32/ecx
41 8b/-> *ecx 1/r32/ecx
42
43 ba/copy-to-edx 0/imm32
44 8b/-> *(ebp+0x20) 0/r32/eax
45 f7 4/subop/multiply-into-eax *(ebp+0x24)
46 81 7/subop/compare %edx 0/imm32
47 0f 85/jump-if-!= $draw-code-point-on-screen-array:overflow/disp32
48
49 39/compare %eax 1/r32/ecx
50 0f 8f/jump-if-> $draw-code-point-on-screen-array:abort/disp32
51 }
52
53 8b/-> *(ebp+8) 0/r32/eax
54 05/add-to-eax 4/imm32
55
56 (draw-code-point-on-screen-buffer %eax *(ebp+0xc) *(ebp+0x10) *(ebp+0x14) *(ebp+0x18) *(ebp+0x1c) *(ebp+0x20) *(ebp+0x24))
57 $draw-code-point-on-screen-array:end:
58
59 5a/pop-to-edx
60 59/pop-to-ecx
61
62 89/<- %esp 5/r32/ebp
63 5d/pop-to-ebp
64 c3/return
65
66 $draw-code-point-on-screen-array:overflow:
67 (abort "draw-code-point-on-screen-array: screen dimensions too large")
68
69 $draw-code-point-on-screen-array:abort:
70 (abort "draw-code-point-on-screen-array: coordinates are off the screen. Are the screen dimensions correct?")
71
72
73
74 draw-code-point-on-screen-buffer:
75
76 55/push-ebp
77 89/<- %ebp 4/r32/esp
78
79 56/push-esi
80
81 c1 4/subop/shift-left *(ebp+20) 3/imm8/log2-font-width
82 c1 4/subop/shift-left *(ebp+24) 4/imm8/log2-font-height
83
84 8b/-> *(ebp+0xc) 6/r32/esi
85
86
87 81 7/subop/compare %esi 0x1100/imm32=4352
88 0f 8d/jump-if->= $draw-code-point-on-screen-buffer:end/disp32
89
90 69/multiply %esi 0x21/imm32/glyph-size 6/r32/esi
91 81 0/subop/add %esi 0x0010000c/imm32/Font
92
93 b8/copy-to-eax 0/imm32
94 8a/byte-> *esi 0/r32/AL
95 46/increment-esi
96 3d/compare-eax-and 8/imm32
97 {
98 75/jump-if-!= break/disp8
99 (draw-narrow-code-point-on-screen-buffer *(ebp+8) %esi *(ebp+0x10) *(ebp+0x14) *(ebp+0x18) *(ebp+0x1c) *(ebp+0x20) *(ebp+0x24))
100 b8/copy-to-eax 1/imm32
101 eb/jump $draw-code-point-on-screen-buffer:end/disp8
102 }
103 (draw-wide-code-point-on-screen-buffer *(ebp+8) %esi *(ebp+0x10) *(ebp+0x14) *(ebp+0x18) *(ebp+0x1c) *(ebp+0x20) *(ebp+0x24))
104 b8/copy-to-eax 2/imm32
105 $draw-code-point-on-screen-buffer:end:
106
107 5e/pop-to-esi
108
109 89/<- %esp 5/r32/ebp
110 5d/pop-to-ebp
111 c3/return
112
113 wide-code-point?:
114
115 55/push-ebp
116 89/<- %ebp 4/r32/esp
117
118 8b/-> *(ebp+8) 0/r32/eax
119
120 3d/compare-eax-and 0x80/imm32
121 0f 8d/jump-if->= $wide-code-point?:end/disp32
122
123 69/multiply %eax 0x21/imm32/glyph-size 0/r32/eax
124 05/add-to-eax 0x0010000c/imm32/Font
125
126 8a/byte-> *eax 0/r32/AL
127 25/and-eax-with 0xff/imm32
128 3d/compare-eax-and 8/imm32
129 0f 95/set-if-!= %eax
130 $wide-code-point?:end:
131
132 89/<- %esp 5/r32/ebp
133 5d/pop-to-ebp
134 c3/return
135
136
137
138 draw-narrow-code-point-on-screen-buffer:
139
140 55/push-ebp
141 89/<- %ebp 4/r32/esp
142
143 52/push-edx
144 53/push-ebx
145 56/push-esi
146 57/push-edi
147
148 8b/-> *(ebp+0xc) 6/r32/esi
149
150 8b/-> *(ebp+0x14) 2/r32/edx
151 c1 4/subop/shift-left %edx 4/imm8
152
153 8b/-> *(ebp+0x14) 7/r32/edi
154 c1 4/subop/shift-left %edi 4/imm8
155 81 0/subop/add %edi 0x10/imm32
156 {
157
158 39/compare %edx 7/r32/edi
159 0f 8d/jump-if->= break/disp32
160
161 bb/copy-to-ebx 0/imm32
162 8a/byte-> *esi 3/r32/BL
163 (draw-run-of-pixels-from-glyph *(ebp+8) %ebx *(ebp+0x10) %edx *(ebp+0x18) *(ebp+0x1c) *(ebp+0x20) *(ebp+0x24))
164
165 42/increment-edx
166
167 46/increment-esi
168
169 e9/jump loop/disp32
170 }
171 $draw-narrow-code-point-on-screen-buffer:end:
172
173 5f/pop-to-edi
174 5e/pop-to-esi
175 5b/pop-to-ebx
176 5a/pop-to-edx
177
178 89/<- %esp 5/r32/ebp
179 5d/pop-to-ebp
180 c3/return
181
182
183
184 draw-wide-code-point-on-screen-buffer:
185
186 55/push-ebp
187 89/<- %ebp 4/r32/esp
188
189 50/push-eax
190 51/push-ecx
191 52/push-edx
192 53/push-ebx
193 56/push-esi
194 57/push-edi
195
196 8b/-> *(ebp+0xc) 6/r32/esi
197
198 bb/copy-to-ebx 0/imm32
199
200 8b/-> *(ebp+0x14) 2/r32/edx
201 c1 4/subop/shift-left %edx 4/imm8
202
203 8b/-> *(ebp+0x14) 7/r32/edi
204 c1 4/subop/shift-left %edi 4/imm8
205 81 0/subop/add %edi 0x10/imm32
206 {
207
208 39/compare %edx 7/r32/edi
209 0f 8d/jump-if->= break/disp32
210
211 8a/byte-> *esi 3/r32/BL
212
213 8b/-> *(ebp+0x10) 1/r32/ecx
214
215 (draw-run-of-pixels-from-glyph *(ebp+8) %ebx %ecx %edx *(ebp+0x18) *(ebp+0x1c) *(ebp+0x20) *(ebp+0x24))
216
217 8a/byte-> *(esi+1) 3/r32/BL
218 41/increment-ecx
219 (draw-run-of-pixels-from-glyph *(ebp+8) %ebx %ecx %edx *(ebp+0x18) *(ebp+0x1c) *(ebp+0x20) *(ebp+0x24))
220
221 42/increment-edx
222
223 81 0/subop/add %esi 2/imm32
224
225 e9/jump loop/disp32
226 }
227 $draw-wide-code-point-on-screen-buffer:end:
228
229 5f/pop-to-edi
230 5e/pop-to-esi
231 5b/pop-to-ebx
232 5a/pop-to-edx
233 59/pop-to-ecx
234 58/pop-to-eax
235
236 89/<- %esp 5/r32/ebp
237 5d/pop-to-ebp
238 c3/return
239
240
241 draw-run-of-pixels-from-glyph:
242
243 55/push-ebp
244 89/<- %ebp 4/r32/esp
245
246 50/push-eax
247 51/push-ecx
248 56/push-esi
249
250 8b/-> *(ebp+0xc) 6/r32/esi
251
252 8b/-> *(ebp+0x10) 0/r32/eax
253 c1 4/subop/shift-left %eax 3/imm8
254 05/add-to-eax 7/imm32
255
256 8b/-> *(ebp+0x10) 1/r32/ecx
257 c1 4/subop/shift-left %ecx 3/imm8
258 {
259
260 39/compare %eax 1/r32/ecx
261 7c/jump-if-< break/disp8
262
263 c1 5/subop/shift-right-logical %esi 1/imm8
264
265 {
266 73/jump-if-not-CF break/disp8
267 (pixel-on-screen-buffer *(ebp+8) %eax *(ebp+0x14) *(ebp+0x18) *(ebp+0x20) *(ebp+0x24))
268 eb/jump $draw-code-point-on-screen-buffer:continue/disp8
269 }
270
271 (pixel-on-screen-buffer *(ebp+8) %eax *(ebp+0x14) *(ebp+0x1c) *(ebp+0x20) *(ebp+0x24))
272 $draw-code-point-on-screen-buffer:continue:
273
274 48/decrement-eax
275
276 eb/jump loop/disp8
277 }
278 $draw-run-of-pixels-from-glyph:end:
279
280 5e/pop-to-esi
281 59/pop-to-ecx
282 58/pop-to-eax
283
284 89/<- %esp 5/r32/ebp
285 5d/pop-to-ebp
286 c3/return
287
288 cursor-position-on-real-screen:
289
290 55/push-ebp
291 89/<- %ebp 4/r32/esp
292
293 8b/-> *Real-screen-cursor-x 0/r32/eax
294 8b/-> *Real-screen-cursor-y 1/r32/ecx
295 $cursor-position-on-real-screen:end:
296
297 89/<- %esp 5/r32/ebp
298 5d/pop-to-ebp
299 c3/return
300
301 set-cursor-position-on-real-screen:
302
303 55/push-ebp
304 89/<- %ebp 4/r32/esp
305
306 50/push-eax
307
308 8b/-> *(ebp+8) 0/r32/eax
309 89/<- *Real-screen-cursor-x 0/r32/eax
310 8b/-> *(ebp+0xc) 0/r32/eax
311 89/<- *Real-screen-cursor-y 0/r32/eax
312 $set-cursor-position-on-real-screen:end:
313
314 58/pop-to-eax
315
316 89/<- %esp 5/r32/ebp
317 5d/pop-to-ebp
318 c3/return
319
320
321
322
323
324
325
326 draw-cursor-on-real-screen:
327
328 55/push-ebp
329 89/<- %ebp 4/r32/esp
330
331 50/push-eax
332 51/push-ecx
333
334 (cursor-position-on-real-screen)
335 (draw-code-point-on-real-screen *(ebp+8) %eax %ecx 0 7)
336 $draw-cursor-on-real-screen:end:
337
338 59/pop-to-ecx
339 58/pop-to-eax
340
341 89/<- %esp 5/r32/ebp
342 5d/pop-to-ebp
343 c3/return
344
345 == data
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362 Real-screen-cursor-x:
363 0/imm32
364 Real-screen-cursor-y:
365 0/imm32