Rev 7599 | Rev 9449 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
7599 | dunkaist | 1 | ; |
2 | ; Spiral demo using Turtle graphics |
||
3 | ; |
||
4 | ; Written in UASM by 0CorErr |
||
5 | ; Translated to FASM by dunkaist |
||
6 | ; |
||
7 | |||
8 | use32 |
||
9 | org 0 |
||
10 | db 'MENUET01' |
||
11 | dd 0x01,start,i_end,e_end,e_end,params,0 |
||
12 | |||
13 | include 'proc32.inc' |
||
14 | include 'macros.inc' |
||
15 | |||
16 | struct RGB |
||
17 | Blue db ? |
||
18 | Green db ? |
||
19 | Red db ? |
||
20 | ends |
||
21 | |||
22 | struct HSV |
||
23 | Hue dw ? |
||
24 | Sat db ? |
||
25 | Val db ? |
||
26 | ends |
||
27 | |||
28 | struct Turtle |
||
29 | PosX dd ? |
||
30 | PosY dd ? |
||
31 | Orientation dd ? |
||
32 | PenColor HSV |
||
33 | ends |
||
34 | |||
35 | |||
36 | proc forward _t, _d |
||
37 | locals |
||
38 | .x1 dd ? |
||
39 | .x2 dd ? |
||
40 | .y1 dd ? |
||
41 | .y2 dd ? |
||
42 | endl |
||
43 | mov eax, [_t] |
||
44 | |||
45 | fld [eax+Turtle.PosX] |
||
46 | fistp [.x1] |
||
47 | |||
48 | fld [eax+Turtle.PosY] |
||
49 | fistp [.y1] |
||
50 | |||
51 | fld [eax+Turtle.Orientation] |
||
52 | fcos |
||
53 | fmul [_d] |
||
54 | fadd [eax+Turtle.PosX] |
||
55 | fstp [eax+Turtle.PosX] |
||
56 | |||
57 | fld [eax+Turtle.Orientation] |
||
58 | fsin |
||
59 | fmul [_d] |
||
60 | fadd [eax+Turtle.PosY] |
||
61 | fstp [eax+Turtle.PosY] |
||
62 | |||
63 | fld [eax+Turtle.PosX] |
||
64 | fistp [.x2] |
||
65 | |||
66 | fld [eax+Turtle.PosY] |
||
67 | fistp [.y2] |
||
68 | |||
69 | mov ebx, [.x1] |
||
70 | shl ebx, 16 |
||
71 | add ebx, [.x2] |
||
72 | mov ecx, [.y1] |
||
73 | shl ecx, 16 |
||
74 | add ecx, [.y2] |
||
75 | mov edx, [color] |
||
76 | mcall 38 |
||
77 | ret |
||
78 | endp |
||
79 | |||
80 | |||
81 | proc turn _t, _degrees |
||
82 | mov eax, [_t] |
||
83 | fldpi |
||
84 | fmul [_degrees] |
||
85 | fdiv [float_180] |
||
86 | fadd [eax+Turtle.Orientation] |
||
87 | fstp [eax+Turtle.Orientation] |
||
88 | ret |
||
89 | endp |
||
90 | |||
91 | |||
92 | proc reposition _t, _x, _y |
||
93 | mov eax, [_t] |
||
94 | mov ecx, [_x] |
||
95 | mov [eax+Turtle.PosX], ecx |
||
96 | mov ecx, [_y] |
||
97 | mov [eax+Turtle.PosY], ecx |
||
98 | ret |
||
99 | endp |
||
100 | |||
101 | |||
102 | ; H = 0..360, S = 0..255, V = 0..255 --> R = 0..255, G = 0..255, B = 0..255 |
||
103 | proc hsv_to_rgb uses ebx, _h, _s, _v, _rgb |
||
104 | locals |
||
105 | .f dd ? |
||
106 | .vs dd ? |
||
107 | endl |
||
108 | mov ebx, [_rgb] |
||
109 | cmp [_s], 0 |
||
110 | jnz @f |
||
111 | mov eax, [_v] |
||
112 | mov [ebx+RGB.Red], al |
||
113 | mov [ebx+RGB.Green], al |
||
114 | mov [ebx+RGB.Blue], al |
||
115 | jmp .end |
||
116 | @@: |
||
117 | cmp [_h], 360 |
||
118 | jnz @f |
||
119 | mov [_h], 0 |
||
120 | @@: |
||
121 | mov eax, [_v] |
||
122 | mul [_s] |
||
123 | mov [.vs], eax |
||
124 | mov eax, [_h] |
||
125 | mov ecx, 60 |
||
126 | xor edx, edx |
||
127 | div ecx |
||
128 | mov [.f], edx |
||
129 | |||
130 | test eax, eax |
||
131 | jnz @f |
||
132 | mov eax, [_v] |
||
133 | mov [ebx+RGB.Red], al |
||
134 | mov eax, 60 |
||
135 | sub eax, [.f] |
||
136 | mul [.vs] |
||
137 | xor edx, edx |
||
138 | div [dword_255_mul_60] |
||
139 | mov edx, [_v] |
||
140 | sub dl, al |
||
141 | mov [ebx+RGB.Green], dl |
||
142 | mov eax, [.vs] |
||
143 | xor edx, edx |
||
144 | div [dword_255] |
||
145 | mov edx, [_v] |
||
146 | sub dl, al |
||
147 | mov [ebx+RGB.Blue], dl |
||
148 | jmp .end |
||
149 | @@: |
||
150 | cmp eax, 1 |
||
151 | jnz @f |
||
152 | mov eax, [.vs] |
||
153 | mul [.f] |
||
154 | xor edx, edx |
||
155 | div [dword_255_mul_60] |
||
156 | mov edx, [_v] |
||
157 | sub dl, al |
||
158 | mov [ebx+RGB.Red], dl |
||
159 | mov eax, [_v] |
||
160 | mov [ebx+RGB.Green], al |
||
161 | mov eax, [.vs] |
||
162 | xor edx, edx |
||
163 | div [dword_255] |
||
164 | mov edx, [_v] |
||
165 | sub dl, al |
||
166 | mov [ebx+RGB.Blue], dl |
||
167 | jmp .end |
||
168 | @@: |
||
169 | cmp eax, 2 |
||
170 | jnz @f |
||
171 | mov eax, [.vs] |
||
172 | xor edx, edx |
||
173 | div [dword_255] |
||
174 | mov edx, [_v] |
||
175 | sub dl, al |
||
176 | mov [ebx+RGB.Red], dl |
||
177 | mov eax, [_v] |
||
178 | mov [ebx+RGB.Green], al |
||
179 | mov eax, 60 |
||
180 | sub eax, [.f] |
||
181 | mul [.vs] |
||
182 | xor edx, edx |
||
183 | div [dword_255_mul_60] |
||
184 | mov edx, [_v] |
||
185 | sub dl, al |
||
186 | mov [ebx+RGB.Blue], dl |
||
187 | jmp .end |
||
188 | @@: |
||
189 | cmp eax, 3 |
||
190 | jnz @f |
||
191 | mov eax, [.vs] |
||
192 | xor edx, edx |
||
193 | div [dword_255] |
||
194 | mov edx, [_v] |
||
195 | sub dl, al |
||
196 | mov [ebx+RGB.Red], dl |
||
197 | mov eax, [.vs] |
||
198 | mul [.f] |
||
199 | xor edx, edx |
||
200 | div [dword_255_mul_60] |
||
201 | mov edx, [_v] |
||
202 | sub dl, al |
||
203 | mov [ebx+RGB.Green], dl |
||
204 | mov eax, [_v] |
||
205 | mov [ebx+RGB.Blue], al |
||
206 | jmp .end |
||
207 | @@: |
||
208 | cmp eax, 4 |
||
209 | jnz @f |
||
210 | mov eax, 60 |
||
211 | sub eax, [.f] |
||
212 | mul [.vs] |
||
213 | xor edx, edx |
||
214 | div [dword_255_mul_60] |
||
215 | mov edx, [_v] |
||
216 | sub dl, al |
||
217 | mov [ebx+RGB.Red], dl |
||
218 | mov eax, [.vs] |
||
219 | xor edx, edx |
||
220 | div [dword_255] |
||
221 | mov edx, [_v] |
||
222 | sub dl, al |
||
223 | mov [ebx+RGB.Green], dl |
||
224 | mov eax, [_v] |
||
225 | mov [ebx+RGB.Blue], al |
||
226 | jmp .end |
||
227 | @@: |
||
228 | cmp eax, 5 |
||
229 | jnz @f |
||
230 | mov eax, [_v] |
||
231 | mov [ebx+RGB.Red], al |
||
232 | mov eax, [.vs] |
||
233 | xor edx, edx |
||
234 | div [dword_255] |
||
235 | mov edx, [_v] |
||
236 | sub dl, al |
||
237 | mov [ebx+RGB.Green], dl |
||
238 | mov eax, [.vs] |
||
239 | mul [.f] |
||
240 | xor edx, edx |
||
241 | div [dword_255_mul_60] |
||
242 | mov edx, [_v] |
||
243 | sub dl, al |
||
244 | mov [ebx+RGB.Blue], dl |
||
245 | @@: |
||
246 | .end: |
||
247 | ret |
||
248 | endp |
||
249 | |||
250 | |||
251 | proc hue_shift _t, _n |
||
252 | mov ecx, [_t] |
||
253 | movzx eax, [ecx+Turtle.PenColor.Hue] |
||
254 | add eax, [_n] |
||
255 | xor edx, edx |
||
256 | div [dword_360] |
||
257 | mov [ecx+Turtle.PenColor.Hue], dx |
||
258 | |||
259 | movzx eax, [ecx+Turtle.PenColor.Hue] |
||
260 | movzx edx, [ecx+Turtle.PenColor.Sat] |
||
261 | movzx ecx, [ecx+Turtle.PenColor.Val] |
||
262 | |||
263 | stdcall hsv_to_rgb, eax, edx, ecx, color |
||
264 | ret |
||
265 | endp |
||
266 | |||
267 | |||
268 | proc query_perf |
||
269 | locals |
||
270 | .diff dd ? |
||
271 | endl |
||
272 | mcall 26, 9 |
||
273 | sub eax, [frame_start] |
||
274 | mov [.diff], eax |
||
275 | fild [.diff] |
||
276 | fild [freq] |
||
277 | fdivrp |
||
278 | fstp [instant] |
||
279 | mcall 26, 9 |
||
280 | mov [frame_start], eax |
||
281 | ret |
||
282 | endp |
||
283 | |||
284 | |||
285 | proc waiting |
||
286 | fld [max_frame_rate] |
||
287 | fld [instant] |
||
7665 | dunkaist | 288 | fcompp |
289 | fstsw ax |
||
290 | sahf |
||
291 | jc @f |
||
7599 | dunkaist | 292 | inc [sleep_time] |
293 | jmp .end |
||
294 | @@: |
||
295 | fld [min_frame_rate] |
||
296 | fld [instant] |
||
7665 | dunkaist | 297 | fcompp |
298 | fstsw ax |
||
299 | sahf |
||
7599 | dunkaist | 300 | jnc .end |
301 | cmp [sleep_time], 0 |
||
302 | jz .end |
||
303 | dec [sleep_time] |
||
304 | .end: |
||
305 | mcall 5, [sleep_time] |
||
306 | ret |
||
307 | endp |
||
308 | |||
309 | |||
310 | proc drawing |
||
311 | locals |
||
312 | .i dd ? |
||
313 | .n dd ? |
||
314 | .posx dd ? |
||
315 | .posy dd ? |
||
316 | endl |
||
317 | mov [turtle.Orientation], 0 |
||
318 | mov eax, [window_width] |
||
319 | mov ecx, [window_height] |
||
320 | shr eax, 1 |
||
321 | shr ecx, 1 |
||
322 | mov [.posx], eax |
||
323 | mov [.posy], ecx |
||
324 | fild [.posx] |
||
325 | fstp [.posx] |
||
326 | fild [.posy] |
||
327 | fstp [.posy] |
||
328 | stdcall reposition, turtle, [.posx], [.posy] |
||
329 | mov [.n], 5.0 |
||
330 | mov eax, [window_height] |
||
331 | imul eax, 15 |
||
332 | shr eax, 4 |
||
333 | mov ecx, eax |
||
334 | xor edx, edx |
||
335 | div [dword_360] |
||
336 | neg edx |
||
337 | add edx, ecx |
||
338 | sub edx, 10 |
||
339 | mov [.i], edx |
||
340 | @@: |
||
341 | stdcall hue_shift, turtle, 1 |
||
342 | stdcall forward, turtle, [.n] |
||
343 | stdcall turn, turtle, 72.5 |
||
344 | fld [.n] |
||
345 | fadd [ndelta] |
||
346 | fstp [.n] |
||
347 | dec [.i] |
||
348 | jnz @b |
||
349 | ret |
||
350 | endp |
||
351 | |||
352 | |||
353 | start: |
||
354 | cmp dword[params], '@ss' |
||
355 | setz [screensaver] |
||
356 | mov ebx, EVM_REDRAW + EVM_KEY |
||
357 | cmovz ebx, EVM_REDRAW + EVM_KEY + EVM_MOUSE |
||
358 | mcall 40 |
||
359 | |||
360 | mov edi, transparent_cursor |
||
361 | xor eax, eax |
||
362 | mov ecx, 32*32 |
||
363 | rep stosd |
||
364 | mcall 37, 4, transparent_cursor, 2 |
||
365 | mov ecx, eax |
||
366 | mcall 37, 5 |
||
367 | |||
368 | mcall 14 |
||
369 | add eax, 0x00010001 |
||
370 | movzx ecx, ax |
||
371 | shr eax, 16 |
||
372 | mov [window_width], eax |
||
373 | mov [window_height], ecx |
||
374 | mcall 26, 9 |
||
375 | mov [frame_start], eax |
||
376 | .still: |
||
7665 | dunkaist | 377 | mcall 11 |
7599 | dunkaist | 378 | dec eax |
379 | js .draw_spiral ; no event |
||
380 | jnz .quit |
||
381 | mcall 12, 1 |
||
382 | mcall 0, [window_width], [window_height], 0, 0x01000000 |
||
383 | mcall 12, 2 |
||
384 | .draw_spiral: |
||
385 | cmp [screensaver], 0 |
||
386 | jz @f |
||
387 | mcall 9, proc_info, -1 |
||
388 | cmp [proc_info.window_stack_position], ax |
||
389 | jnz .quit |
||
390 | @@: |
||
391 | stdcall query_perf |
||
392 | stdcall drawing |
||
393 | stdcall waiting |
||
394 | jmp .still |
||
395 | .quit: |
||
396 | cmp [screensaver], 0 |
||
397 | jz @f |
||
398 | mcall 70, f70 |
||
399 | @@: |
||
400 | mcall -1 |
||
401 | |||
402 | |||
403 | align 4 |
||
404 | dword_255_mul_60 dd 255 * 60 |
||
405 | dword_255 dd 255 |
||
406 | dword_360 dd 360 |
||
407 | float_180 dd 180.0 |
||
408 | ndelta dd 0.6 ; used in drawing Proc: n = n + ndelta |
||
409 | max_frame_rate dd 15.0 ; to keep the FrameRate |
||
410 | min_frame_rate dd 8.0 ; around min_frame_rate..max_frame_rate FPS |
||
411 | |||
412 | freq dd 100 ; GetTickCount return count of 1/100s of second |
||
413 | instant dd 0.0 |
||
414 | sleep_time dd 0 |
||
415 | |||
416 | turtle Turtle 0.0, 0.0, 0.0, <180, 255, 255> |
||
417 | |||
418 | f70: ; run |
||
419 | dd 7, 0, 0, 0, 0 |
||
420 | db '/sys/@ss',0 |
||
421 | i_end: |
||
422 | |||
423 | align 4 |
||
424 | window_width dd ? |
||
425 | window_height dd ? |
||
426 | frame_start dd ? |
||
427 | color dd ? |
||
428 | |||
429 | proc_info process_information |
||
430 | params rb 0x400 |
||
431 | transparent_cursor rd 32*32 |
||
432 | screensaver db ? |
||
433 | align 4 |
||
434 | rb 0x200 |
||
435 | e_end:180,> |