https://github.com/akkartik/mu/blob/main/309stream.subx
1
2
3
4 == code
5
6 stream-empty?:
7
8 55/push-ebp
9 89/<- %ebp 4/r32/esp
10
11 51/push-ecx
12 56/push-esi
13
14 b8/copy-to-eax 0/imm32/false
15
16 8b/-> *(ebp+8) 6/r32/esi
17
18 8b/-> *esi 1/r32/ecx
19 39/compare-with *(esi+4) 1/r32/ecx
20 0f 9d/set-if->= %al
21 $stream-empty?:end:
22
23 5e/pop-to-esi
24 59/pop-to-ecx
25
26 89/<- %esp 5/r32/ebp
27 5d/pop-to-ebp
28 c3/return
29
30 stream-full?:
31
32 55/push-ebp
33 89/<- %ebp 4/r32/esp
34
35 51/push-ecx
36 56/push-esi
37
38 b8/copy-to-eax 0/imm32/false
39
40 8b/-> *(ebp+8) 6/r32/esi
41
42 8b/-> *(esi+8) 1/r32/ecx
43 39/compare-with *esi 1/r32/ecx
44 0f 9d/set-if->= %al
45 $stream-full?:end:
46
47 5e/pop-to-esi
48 59/pop-to-ecx
49
50 89/<- %esp 5/r32/ebp
51 5d/pop-to-ebp
52 c3/return
53
54 write-to-stream:
55
56 55/push-ebp
57 89/<- %ebp 4/r32/esp
58
59 50/push-eax
60 51/push-ecx
61 52/push-edx
62 53/push-ebx
63 57/push-edi
64
65 8b/-> *(ebp+8) 7/r32/edi
66
67 8b/-> *edi 2/r32/edx
68
69 8b/-> *(ebp+0x10) 1/r32/ecx
70 01/add-to %ecx 2/r32/edx
71 3b/compare 1/r32/ecx *(edi+8)
72 0f 8f/jump-if-> $write-to-stream:abort/disp32
73
74 8d/copy-address *(edi+edx+0xc) 2/r32/edx
75
76 8b/-> *(ebp+0x10) 3/r32/ebx
77 8d/copy-address *(edx+ebx) 3/r32/ebx
78
79 8b/-> *(ebp+0xc) 0/r32/eax
80
81 8b/-> *(ebp+0x10) 1/r32/ecx
82 8d/copy-address *(eax+ecx) 1/r32/ecx
83
84 (_append-4 %edx %ebx %eax %ecx)
85
86 8b/-> *(ebp+0x10) 1/r32/ecx
87 01/add-to *edi 1/r32/ecx
88 $write-to-stream:end:
89
90 5f/pop-to-edi
91 5b/pop-to-ebx
92 5a/pop-to-edx
93 59/pop-to-ecx
94 58/pop-to-eax
95
96 89/<- %esp 5/r32/ebp
97 5d/pop-to-ebp
98 c3/return
99
100 $write-to-stream:abort:
101 (draw-text-wrapping-right-then-down-from-cursor-over-full-screen 0 "write-to-stream: stream full" 3 0)
102 {
103 eb/jump loop/disp8
104 }
105
106
107 read-from-stream:
108
109 55/push-ebp
110 89/<- %ebp 4/r32/esp
111
112 50/push-eax
113 51/push-ecx
114 52/push-edx
115 53/push-ebx
116 56/push-esi
117
118 8b/-> *(ebp+8) 6/r32/esi
119
120 8b/-> *(esi+4) 2/r32/edx
121
122 8b/-> *(ebp+0x10) 1/r32/ecx
123 01/add-to %ecx 2/r32/edx
124 3b/compare 1/r32/ecx *esi
125 0f 8f/jump-if-> $read-from-stream:abort/disp32
126
127 8d/copy-address *(esi+edx+0xc) 2/r32/edx
128
129 8b/-> *(ebp+0x10) 3/r32/ebx
130 8d/copy-address *(edx+ebx) 3/r32/ebx
131
132 8b/-> *(ebp+0xc) 0/r32/eax
133
134 8b/-> *(ebp+0x10) 1/r32/ecx
135 8d/copy-address *(eax+ecx) 1/r32/ecx
136
137 (_append-4 %eax %ecx %edx %ebx)
138
139 8b/-> *(ebp+0x10) 1/r32/ecx
140 01/add-to *(esi+4) 1/r32/ecx
141 $read-from-stream:end:
142
143 5e/pop-to-esi
144 5b/pop-to-ebx
145 5a/pop-to-edx
146 59/pop-to-ecx
147 58/pop-to-eax
148
149 89/<- %esp 5/r32/ebp
150 5d/pop-to-ebp
151 c3/return
152
153 $read-from-stream:abort:
154 (draw-text-wrapping-right-then-down-from-cursor-over-full-screen 0 "read-from-stream: stream empty" 3 0)
155 {
156 eb/jump loop/disp8
157 }
158
159
160 stream-first:
161
162 55/push-ebp
163 89/<- %ebp 4/r32/esp
164
165 51/push-ecx
166 56/push-esi
167
168 b8/copy-to-eax 0/imm32
169
170 8b/-> *(ebp+8) 6/r32/esi
171
172 8b/-> *(esi+4) 1/r32/ecx
173
174 3b/compare-with 1/r32/ecx *esi
175 7d/jump-if->= $stream-first:end/disp8
176
177 8a/byte-> *(esi+ecx+0xc) 0/r32/AL
178 $stream-first:end:
179
180 5e/pop-to-esi
181 59/pop-to-ecx
182
183 89/<- %esp 5/r32/ebp
184 5d/pop-to-ebp
185 c3/return
186
187 stream-final:
188
189 55/push-ebp
190 89/<- %ebp 4/r32/esp
191
192 51/push-ecx
193 56/push-esi
194
195 b8/copy-to-eax 0/imm32
196
197 8b/-> *(ebp+8) 6/r32/esi
198
199 8b/-> *esi 1/r32/ecx
200
201 39/compare-with *(esi+4) 1/r32/ecx
202 7d/jump-if->= $stream-final:end/disp8
203
204 49/decrement-ecx
205
206 8a/byte-> *(esi+ecx+0xc) 0/r32/AL
207 $stream-final:end:
208
209 5e/pop-to-esi
210 59/pop-to-ecx
211
212 89/<- %esp 5/r32/ebp
213 5d/pop-to-ebp
214 c3/return
215
216
217 streams-data-equal?:
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240 55/push-ebp
241 89/<- %ebp 4/r32/esp
242
243 51/push-ecx
244 52/push-edx
245 53/push-ebx
246 56/push-esi
247 57/push-edi
248
249 8b/-> *(ebp+8) 6/r32/esi
250
251 8b/-> *(ebp+0xc) 7/r32/edi
252
253 8b/-> *esi 2/r32/edx
254 $streams-data-equal?:sizes:
255
256 39/compare *edi 2/r32/edx
257 75/jump-if-!= $streams-data-equal?:false/disp8
258
259 81 0/subop/add %esi 0xc/imm32
260
261 81 0/subop/add %edi 0xc/imm32
262
263 31/xor-with %ecx 1/r32/ecx
264
265 31/xor-with %eax 0/r32/eax
266
267 31/xor-with %ebx 3/r32/ebx
268 $streams-data-equal?:loop:
269 {
270
271 39/compare %ecx 2/r32/edx
272 7d/jump-if->= $streams-data-equal?:true/disp8
273
274 8a/byte-> *esi 0/r32/eax
275
276 8a/byte-> *edi 3/r32/ebx
277
278 39/compare %eax 3/r32/ebx
279 75/jump-if-!= $streams-data-equal?:false/disp8
280
281 41/increment-ecx
282
283 46/increment-esi
284
285 47/increment-edi
286 eb/jump loop/disp8
287 }
288 $streams-data-equal?:true:
289 b8/copy-to-eax 1/imm32
290 eb/jump $streams-data-equal?:end/disp8
291 $streams-data-equal?:false:
292 b8/copy-to-eax 0/imm32
293 $streams-data-equal?:end:
294
295 5f/pop-to-edi
296 5e/pop-to-esi
297 5b/pop-to-ebx
298 5a/pop-to-edx
299 59/pop-to-ecx
300
301 89/<- %esp 5/r32/ebp
302 5d/pop-to-ebp
303 c3/return