Subversion Repositories Kolibri OS

Rev

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: