Subversion Repositories Kolibri OS

Rev

Rev 7665 | Go to most recent revision | Details | 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]
288
        fcomip  st1
289
        fstp    st0
290
        jna     @f
291
        inc     [sleep_time]
292
        jmp     .end
293
    @@:
294
        fld     [min_frame_rate]
295
        fld     [instant]
296
        fcomip  st1
297
        fstp    st0
298
        jnc     .end
299
        cmp     [sleep_time], 0
300
        jz      .end
301
        dec     [sleep_time]
302
  .end:
303
        mcall   5, [sleep_time]
304
        ret
305
endp
306
 
307
 
308
proc drawing
309
locals
310
        .i    dd ?
311
        .n    dd ?
312
        .posx dd ?
313
        .posy dd ?
314
endl
315
        mov     [turtle.Orientation], 0
316
        mov     eax, [window_width]
317
        mov     ecx, [window_height]
318
        shr     eax, 1
319
        shr     ecx, 1
320
        mov     [.posx], eax
321
        mov     [.posy], ecx
322
        fild    [.posx]
323
        fstp    [.posx]
324
        fild    [.posy]
325
        fstp    [.posy]
326
        stdcall reposition, turtle, [.posx], [.posy]
327
        mov     [.n], 5.0
328
        mov     eax, [window_height]
329
        imul    eax, 15
330
        shr     eax, 4
331
        mov     ecx, eax
332
        xor     edx, edx
333
        div     [dword_360]
334
        neg     edx
335
        add     edx, ecx
336
        sub     edx, 10
337
        mov     [.i], edx
338
    @@:
339
        stdcall hue_shift, turtle, 1
340
        stdcall forward, turtle, [.n]
341
        stdcall turn, turtle, 72.5
342
        fld     [.n]
343
        fadd    [ndelta]
344
        fstp    [.n]
345
        dec     [.i]
346
        jnz     @b
347
        ret
348
endp
349
 
350
 
351
start:
352
        cmp     dword[params], '@ss'
353
        setz    [screensaver]
354
        mov     ebx, EVM_REDRAW + EVM_KEY
355
        cmovz   ebx, EVM_REDRAW + EVM_KEY + EVM_MOUSE
356
        mcall   40
357
 
358
        mov     edi, transparent_cursor
359
        xor     eax, eax
360
        mov     ecx, 32*32
361
        rep     stosd
362
        mcall   37, 4, transparent_cursor, 2
363
        mov     ecx, eax
364
        mcall   37, 5
365
 
366
        mcall   14
367
        add     eax, 0x00010001
368
        movzx   ecx, ax
369
        shr     eax, 16
370
        mov     [window_width], eax
371
        mov     [window_height], ecx
372
        mcall   26, 9
373
        mov     [frame_start], eax
374
  .still:
375
	mcall	11
376
        dec     eax
377
        js      .draw_spiral    ; no event
378
        jnz     .quit
379
        mcall   12, 1
380
        mcall   0, [window_width], [window_height], 0, 0x01000000
381
        mcall   12, 2
382
  .draw_spiral:
383
        cmp     [screensaver], 0
384
        jz      @f
385
        mcall   9, proc_info, -1
386
        cmp     [proc_info.window_stack_position], ax
387
        jnz     .quit
388
    @@:
389
        stdcall query_perf
390
        stdcall drawing
391
        stdcall waiting
392
        jmp     .still
393
  .quit:
394
        cmp     [screensaver], 0
395
        jz      @f
396
        mcall   70, f70
397
    @@:
398
        mcall   -1
399
 
400
 
401
align 4
402
dword_255_mul_60 dd 255 * 60
403
dword_255        dd 255
404
dword_360        dd 360
405
float_180        dd 180.0
406
ndelta           dd 0.6  ; used in drawing Proc: n = n + ndelta
407
max_frame_rate   dd 15.0 ; to keep the FrameRate
408
min_frame_rate   dd 8.0  ; around min_frame_rate..max_frame_rate FPS
409
 
410
freq       dd 100  ; GetTickCount return count of 1/100s of second
411
instant    dd 0.0
412
sleep_time dd 0
413
 
414
turtle Turtle 0.0, 0.0, 0.0, <180, 255, 255>
415
 
416
f70:    ; run
417
        dd 7, 0, 0, 0, 0
418
        db '/sys/@ss',0
419
i_end:
420
 
421
align 4
422
window_width  dd ?
423
window_height dd ?
424
frame_start   dd ?
425
color         dd ?
426
 
427
proc_info process_information
428
params rb 0x400
429
transparent_cursor rd 32*32
430
screensaver db ?
431
align 4
432
rb 0x200
433
e_end: