Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
7723 dunkaist 1
;
2
; Newton fractal demo
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
WS_DRAW_NOTHING        = 0x0100_0000
17
WS_SKINNED_FIXED       = 0x0400_0000
18
WS_BACKGROUND_NOREDRAW = 0x4000_0000
19
WS_COORD_CLIENT        = 0x2000_0000
20
WS_CAPTION             = 0x1000_0000
21
 
22
CS_MOVABLE        = 0
23
 
24
WINDOW_STATE_ROLLED_UP = 4
25
 
26
WINDOW_BORDER_SIZE = 5
27
 
28
;COUNT = 16
29
COUNT = 100
30
 
31
struct TSize
32
  SizeY dw ?
33
  SizeX dw ?
34
ends
35
 
36
struct TBox
37
  X     dd ?
38
  Y     dd ?
39
  SizeX dd ?
40
  SizeY dd ?
41
ends
42
 
43
struct Complex
44
  X dd ?
45
  Y dd ?
46
ends
47
 
48
 
49
proc get_newton_fractal uses ebx edi, _width, _height
50
locals
51
        Pow2_Z_X dd ?
52
        Pow2_D_X dd ?
53
        Pow2_T_Y dd ?
54
        Pow2_T_X dd ?
55
        P        dd ?
56
        N        dd ?
57
        YMax     dd ?
58
        XMax     dd ?
59
        Y        dd ?
60
        X        dd ?
61
        D        Complex
62
        T        Complex
63
        Z        Complex
64
        Buf      dd ?
65
        ImgH     dd ?
66
        ImgW     dd ?
67
endl
68
        mov     eax, [_width]
69
        mov     [ImgW], eax
70
        shr     eax, 1
71
        mov     [XMax], eax
72
 
73
        mov     eax, [_height]
74
        mov     [ImgH], eax
75
        shr     eax, 1
76
        mov     [YMax], eax
77
 
78
        mov     eax, [ImgH]
79
        dec     eax
80
        imul    eax, [ImgW]
81
        mov     [line_shift], eax
82
 
83
        ; allocate buffer for image
84
        mov     ecx, [ImgW]
85
        imul    ecx, [ImgH]
86
        mcall   68, 12,
87
        mov     [Buf], eax
88
 
89
        mov     edi, [Buf]
90
        mov     eax, [YMax]
91
        neg     eax
92
        mov     [Y], eax
93
.next_line:
94
        mov     eax, [XMax]
95
        neg     eax
96
        mov     [X], eax
97
.next_pixel:
98
        mov     [N], 0
99
        fild    [X]
100
        fdiv    [Float_250]
101
        fstp    [Z.X]
102
        fild    [Y]
103
        fdiv    [Float_250]
104
        fstp    [Z.Y]
105
        mov     eax, [Z.X]
106
        mov     ecx, [Z.Y]
107
        mov     [D.X], eax
108
        mov     [D.Y], ecx
109
@@:
110
        fld     [Z.X]
111
        fmul    st0, st0
112
        fstp    [Pow2_Z_X]
113
        fld     [Z.Y]
114
        fmul    st0, st0
115
        fadd    [Pow2_Z_X]
116
        fcomp   [Max]
117
        fnstsw  ax
118
;.Break .If !(ah & 1)   ; >= Max
119
        test    ah, 1
120
        jz      @f
121
        fld     [D.X]
122
        fmul    st0, st0
123
        fstp    [Pow2_D_X]
124
        fld     [D.Y]
125
        fmul    st0, st0
126
        fadd    [Pow2_D_X]
127
        fcomp   [Min]
128
        fnstsw  ax
129
;.Break .If ah & 1      ; <= Min
130
        test    ah, 1
131
        jnz     @f
132
        mov     eax, [Z.X]
133
        mov     ecx, [Z.Y]
134
        mov     [T.X], eax
135
        mov     [T.Y], ecx
136
 
137
        fld     [T.X]
138
        fmul    st0, st0        ; Pow2_T_X = T.X * T.X
139
        fstp    [Pow2_T_X]
140
 
141
        fld     [T.Y]
142
        fmul    st0, st0
143
        fst     [Pow2_T_Y]      ; Pow2_T_Y = T.Y * T.Y
144
        fadd    [Pow2_T_X]
145
        fmul    st0, st0
146
        fstp    [P]             ; P = (Pow2_T_X + Pow2_T_Y) * (Pow2_T_X + Pow2_T_Y)
147
 
148
        fld     [Pow2_T_X]
149
        fsub    [Pow2_T_Y]
150
        fld     [Float_3]
151
        fmul    [P]
152
        fxch    st1
153
        fdivrp                  ; Z.X = (Pow2_T_X - Pow2_T_Y) / (3 * P) + 2 * T.X / 3
154
        fld     [Float_2]
155
        fmul    [T.X]
156
        fdiv    [Float_3]
157
        fxch    st1
158
        faddp
159
        fstp    [Z.X]
160
 
161
        fld     [P]
162
        fsub    [T.X]
163
        fdiv    [P]
164
        fmul    [T.Y]           ; Z.Y = (P - T.X) / P * 2 * T.Y / 3
165
        fmul    [Float_2]
166
        fdiv    [Float_3]
167
        fstp    [Z.Y]
168
 
169
        fld     [T.X]
170
        fsub    [Z.X]
171
        fabs
172
        fstp    [D.X]
173
 
174
        fld     [T.Y]
175
        fsub    [Z.Y]
176
        fabs
177
        fstp    [D.Y]
178
 
179
        inc     [N]
180
        cmp     [N], COUNT
181
        jbe     @b
182
@@:
183
        mov     eax, [N]
184
        mov     ecx, palette_colors
185
        xor     edx, edx
186
        div     ecx
187
 
188
        ; Set next pixel
189
        mov     [edi], dl
190
        mov     eax, [line_shift]
191
        mov     [edi+eax], dl
192
        inc     edi
193
        mov     eax, [X]
194
        inc     eax
195
        mov     [X], eax
196
        cmp     eax, [XMax]
197
        jnz     .next_pixel
198
 
199
        mov     eax, [ImgW]
200
        add     eax, eax
201
        sub     [line_shift], eax
202
        mov     eax, [Y]
203
        inc     eax
204
        mov     [Y], eax
205
        cmp     eax, 0
206
        jle     .next_line
207
.done:
208
        mov     eax, [Buf]
209
        ret
210
endp
211
 
212
 
213
start:
214
        mcall   68, 11
215
        cmp     dword[params], '@ss'
216
        setz    [screensaver]
217
        jnz     .windowed
218
        ; fullscreen
219
        mcall   14
220
        movzx   ecx, ax
221
        shr     eax, 16
222
        mov     [Window.SizeX], eax
223
        mov     [Window.SizeY], ecx
224
        xor     [window_style], WS_SKINNED_FIXED + WS_DRAW_NOTHING
225
        mov     [window_border_size], 0
226
        mov     [skin_height], 0
227
 
228
        mov     edi, transparent_cursor
229
        xor     eax, eax
230
        mov     ecx, 32*32
231
        rep     stosd
232
        mcall   37, 4, transparent_cursor, 2
233
        mov     ecx, eax
234
        mcall   37, 5
235
 
236
        mov     ebx, EVM_REDRAW + EVM_KEY + EVM_BUTTON + EVM_MOUSE
237
        jmp     .common
238
.windowed:
239
        mcall   48, 4
240
        mov     [skin_height], eax
241
        bt      eax, 0
242
        sbb     [Window.SizeY], 0
243
        mcall   14
244
        movzx   ecx, ax
245
        shr     eax, 16
246
        sub     eax, [Window.SizeX]
247
        sub     ecx, [Window.SizeY]
248
        shr     eax, 1
249
        shr     ecx, 1
250
        mov     [Window.X], eax
251
        mov     [Window.Y], ecx
252
 
253
        mov     ebx, EVM_REDRAW + EVM_KEY + EVM_BUTTON
254
.common:
255
        mcall   40
256
 
257
        mov     ebx, [Window.SizeX]
258
        inc     ebx
259
        sub     ebx, [window_border_size]
260
        sub     ebx, [window_border_size]
261
        mov     ecx, [Window.SizeY]
262
        inc     ecx
263
        sub     ecx, [skin_height]
264
        sub     ecx, [window_border_size]
265
        stdcall get_newton_fractal, ebx, ecx
266
        mov     [image], eax
267
 
268
.still:
269
;        mcall   11
270
;        dec     eax
271
;        jz      .redraw
272
;        jns     .exit
273
;        mcall   5, 10
274
        mcall   10
275
        dec     eax
276
        jnz     .exit
277
.redraw:
278
        mcall   12, 1
279
        mcall   0, <[Window.X],[Window.SizeX]>, <[Window.Y],[Window.SizeY]>, [window_style], 0, window_title
280
        mcall   9, proc_info, -1
281
        test    [proc_info.wnd_state], WINDOW_STATE_ROLLED_UP
282
        jnz     .no_draw
283
        inc     [proc_info.client_box.width]
284
        inc     [proc_info.client_box.height]
285
        mcall   65, [image], <[proc_info.client_box.width],[proc_info.client_box.height]>, 0, 8, palette, 0
286
;        call    rotate_palette
287
.no_draw:
288
        mcall   12, 2
289
        jmp     .still
290
.exit:
291
        mcall   -1
292
 
293
 
294
proc rotate_palette
295
        mov     esi, palette
296
        mov     edi, esi
297
        mov     ecx, palette_colors
298
.next_color:
299
        mov     ebx, 2
300
        lodsd
301
.next_channel:
302
        cmp     [palette_rotate_direction+ebx], 1
303
        jnz     .down
304
.up:
305
        add     al, 1
306
        jnc     .ok
307
        btc     word[palette_rotate_direction+ebx], 0
308
        sub     al, 1
309
.down:
310
        sub     al, 1
311
        jnc     .ok
312
        btc     word[palette_rotate_direction+ebx], 0
313
        add     al, 2
314
.ok:
315
        ror     eax, 8
316
        dec     ebx
317
        jns     .next_channel
318
        ror     eax, 8
319
        stosd
320
        dec     ecx
321
        jnz     .next_color
322
        ret
323
endp
324
 
325
palette:
326
        dd 0x00C5037D, 0x006D398B, 0x00454E99, 0x002A71AF, \
327
           0x000696BB, 0x00008F5A, 0x008DBB25, 0x00F3E500, \
328
           0x00FCC609, 0x00F28E1C, 0x00E96220, 0x00E32322
329
palette_colors = ($-palette)/4
330
 
331
;        dd 0x00C21460, 0x008601AF, 0x004424D6, 0x000247FE, \
332
;           0x00347C98, 0x0066B032, 0x00B2D732, 0x00FEFE33, \
333
;           0x00FCCC1A, 0x00FB9902, 0x00FC600A, 0x00FE2712
334
 
335
;        dd 0x00C21460, 0x008601AF, 0x004424D6, 0x00347C98, \
336
;           0x0066B032, 0x00B2D732, 0x00FCCC1A, 0x00FB9902, \
337
;           0x00FC600A
338
 
339
;        dd 0x00C21460, 0x004424D6, 0x00347C98, 0x0066B032, \
340
;           0x00B2D732, 0x00FEFE33, 0x00FCCC1A, 0x00FC600A, \
341
;           0x00FE2712
342
 
343
;        dd 0x00FE2712, 0x00FC600A, 0x00FCCC1A, 0x00FEFE33, \
344
;           0x00B2D732, 0x0066B032, 0x00347C98, 0x004424D6, \
345
;           0x00C21460
346
 
347
;        dd 0x00347C98, 0x004424D6, 0x00C21460, 0x00FE2712, \
348
;           0x00FC600A, 0x00FCCC1A, 0x00FEFE33, 0x00B2D732, \
349
;           0x0066B032
350
 
351
Float_250 dd 250.0
352
Float_3   dd 3.0
353
Float_2   dd 2.0
354
 
355
;Max dd 10000.0
356
;Min dd 0.0001
357
Max dd 10000000.0
358
Min dd 0.0000001
359
 
360
Window TBox 0, 0, 320*3+1, 240*3+1
361
window_style dd WS_SKINNED_FIXED + WS_COORD_CLIENT + WS_CAPTION + \
362
                WS_BACKGROUND_NOREDRAW
363
window_border_size dd WINDOW_BORDER_SIZE
364
image dd 0
365
line_shift dd 0
366
;palette_rotate_direction db 1, 0, 1, 0
367
window_title db "Newton fractal",0
368
 
369
i_end:
370
align 4
371
proc_info process_information
372
 
373
transparent_cursor rd 32*32
374
skin_height dd ?
375
screensaver db ?
376
params rb 0x400
377
align 4
378
rb 0x200
379
e_end: