Subversion Repositories Kolibri OS

Rev

Rev 2552 | Rev 7276 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2552 Rev 7125
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
; A firework demo 
2
; A firework demo
3
; Programmed by Yaniv LEVIATHAN 
3
; Programmed by Yaniv LEVIATHAN
4
; http://yaniv.leviathanonline.com 
4
; http://yaniv.leviathanonline.com
5
; Converted to DexOS, By Dex 
5
; Converted to DexOS, By Dex
6
; Converted to KolibriOS, By Asper
6
; Converted to KolibriOS, By Asper
7
; Optimized for KolibriOS, By Diamond
7
; Optimized for KolibriOS, By Diamond
8
; Assemble with
8
; Assemble with
9
; c:fasm firework.asm firework.kex
9
; c:fasm firework.asm firework.kex
10
; NOTE: Needs MMX & SSE 
10
; NOTE: Needs MMX & SSE, optionally AVX
11
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
11
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
12
use32 
12
use32
13
	org	0x0
13
        org     0x0
14
 
14
 
15
	db	'MENUET00'	; 8 byte id
15
        db      'MENUET01'      ; 8 byte id
16
	dd	38		; required os
16
        dd      0x01            ; version
17
	dd	STARTAPP	; program start
17
        dd      STARTAPP        ; program start
18
	dd	I_END		; program image size
18
        dd      I_END           ; program image size
19
	dd	0x100000	; required amount of memory
19
        dd      E_END           ; required amount of memory
-
 
20
        dd      stacktop        ; reserved=no extended header
20
	dd	0x00000000	; reserved=no extended header
21
        dd      0, 0
21
 
-
 
22
include '../../../macros.inc'
22
 
23
include "aspapi.inc"
23
include '../../../macros.inc'
-
 
24
SCREEN_WIDTH   = 320
-
 
25
SCREEN_HEIGHT  = 200
-
 
26
SIMD equ SSE
24
SCREEN_WIDTH   equ    320
27
SIMD_BYTES = 8
25
SCREEN_HEIGHT  equ    200
28
assert SCREEN_WIDTH mod SIMD_BYTES = 0
26
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
29
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
27
; Global defines 
30
; Global defines
28
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
31
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
29
 
32
 
30
   NUM_PARTS   = 150
33
NUM_PARTS      = 150
31
   X_OFFSET   = 0
34
X_OFFSET       = 0
32
   Y_OFFSET   = 4
35
Y_OFFSET       = 4
33
   X_SPEED_OFFSET   = 8
36
X_SPEED_OFFSET = 8
34
   Y_SPEED_OFFSET   = 12
37
Y_SPEED_OFFSET = 12
35
   COLOR_OFFSET   = 16
38
COLOR_OFFSET   = 16
36
   PART_SIZE   = 20
39
PART_SIZE      = 20
37
 
40
 
38
macro draw_window
41
macro shade
39
{
-
 
40
local x, xsize, y, ysize, areacolor, caption
42
{
41
x = 100
-
 
42
y = 70
-
 
43
xsize = SCREEN_WIDTH+9
-
 
44
ysize = SCREEN_HEIGHT+4
-
 
45
areacolor = 0x54224466
-
 
46
caption = labelt
-
 
47
	mov	eax, 12 		; function 12:tell os about windowdraw
-
 
48
	mov	ebx, 1			; 1, start of draw
-
 
49
	int	0x40
43
local .lop
50
	; DRAW WINDOW
-
 
51
	mov	eax, 48
-
 
52
	mov	ebx, 4
-
 
53
	int	0x40
-
 
54
	lea	ecx, [y*65536+ysize+eax]
-
 
55
	xor	eax, eax		; function 0 : define and draw window
-
 
56
	mov	ebx, x*65536+xsize	; [x start] *65536 + [x size]
-
 
57
	mov	edx, areacolor		 ; color of work area RRGGBB
-
 
58
	mov	edi, caption
-
 
59
	int	0x40
-
 
60
;  start_draw_window 100,70,SCREEN_WIDTH+9,SCREEN_HEIGHT+29,0x04224466,labelt;, 14;labellen-labelt
-
 
61
  end_draw_window
-
 
62
}
-
 
63
 
-
 
64
macro mmx_shade
-
 
65
{
44
if SIMD eq SSE
66
      mov ecx, SCREEN_WIDTH*SCREEN_HEIGHT/8
45
        mov     ecx, SCREEN_WIDTH * SCREEN_HEIGHT / SIMD_BYTES
67
      mov  edi,buffer 
46
        mov     edi, buffer
68
      movq mm1, [sub_mask] 
47
        movq    mm1, qword [sub_mask]
69
.lop: 
48
  .lop:
70
      movq mm0, [edi] 
49
        movq    mm0, [edi]
71
      psubusb mm0, mm1 
50
        psubusb mm0, mm1
72
      movq [edi], mm0 
51
        movq    [edi], mm0
73
      add edi, 8 
52
        add     edi, SIMD_BYTES
74
      loop .lop 
53
        loop    .lop
-
 
54
else if SIMD eq AVX
-
 
55
        mov     ecx, SCREEN_WIDTH * SCREEN_HEIGHT / SIMD_BYTES
-
 
56
        mov     edi, buffer
-
 
57
        vmovdqa xmm1, xword [sub_mask]
-
 
58
  .lop:
-
 
59
        vmovdqa xmm0, [edi]
-
 
60
        vpsubusb xmm0, xmm0, xmm1
-
 
61
        vmovdqa [edi], xmm0
-
 
62
        add     edi, SIMD_BYTES
-
 
63
        loop    .lop
-
 
64
else if SIMD eq AVX2
-
 
65
        mov     ecx, SCREEN_WIDTH * SCREEN_HEIGHT / SIMD_BYTES
-
 
66
        mov     edi, buffer
-
 
67
        vmovdqa ymm1, yword [sub_mask]
-
 
68
  .lop:
-
 
69
        vmovdqa ymm0, [edi]
-
 
70
        vpsubusb ymm0, ymm0, ymm1
-
 
71
        vmovdqa [edi], ymm0
-
 
72
        add     edi, SIMD_BYTES
-
 
73
        loop    .lop
-
 
74
else if SIMD eq AVX512
-
 
75
        mov     ecx, SCREEN_WIDTH * SCREEN_HEIGHT / SIMD_BYTES
-
 
76
        mov     edi, buffer
-
 
77
        vmovdqa64 zmm1, zword [sub_mask]
-
 
78
  .lop:
-
 
79
        vmovdqa64 zmm0, [edi]
-
 
80
        vpsubusb zmm0, zmm0, zmm1
-
 
81
        vmovdqa64 [edi], zmm0
-
 
82
        add     edi, SIMD_BYTES
-
 
83
        loop    .lop
-
 
84
end if
75
}
85
}
76
 
86
 
77
macro mmx_blur_prepare
87
macro blur_prepare
78
{
88
{
79
      mov ecx, (SCREEN_WIDTH*SCREEN_HEIGHT-330*2)/8
89
        mov     ecx, (SCREEN_WIDTH * SCREEN_HEIGHT - SCREEN_WIDTH * 2 - SIMD_BYTES*2) / SIMD_BYTES
80
      mov edi,buffer + 328
90
        mov     edi, buffer + SCREEN_WIDTH + SIMD_BYTES
81
}
91
}
82
 
92
 
83
macro mmx_blur
93
macro blur
-
 
94
{
84
{
95
local .lop
85
local .lop
96
if SIMD eq SSE
86
.lop: 
97
.lop:
87
      movq mm0, [edi] 
98
        movq    mm0, [edi]
88
      movq mm1, [edi+1] 
99
        movq    mm1, [edi + 1]
89
      movq mm2, [edi-1] 
100
        movq    mm2, [edi - 1]
90
      movq mm3, mm0 
101
        movq    mm3, mm0
91
      movq mm4, [edi-SCREEN_WIDTH]
102
        movq    mm4, [edi - SCREEN_WIDTH]
92
      movq mm5, [edi+SCREEN_WIDTH]
103
        movq    mm5, [edi + SCREEN_WIDTH]
93
 
104
 
94
      pavgb mm0, mm1 ; mm0 = avg(cur,cur+1) 
105
        pavgb   mm0, mm1 ; mm0 = avg(cur,cur+1)
95
      pavgb mm3, mm2 ; mm3 = avg(cur,cur-1) 
106
        pavgb   mm3, mm2 ; mm3 = avg(cur,cur-1)
96
      pavgb mm4, mm5 ; mm4 = avg(cur+320,cur-320) 
107
        pavgb   mm4, mm5 ; mm4 = avg(cur+width,cur-width)
97
      pavgb mm3, mm4 ; mm3 = avg(avg(cur,cur-1),avg(cur+320,cur-320)) 
108
        pavgb   mm3, mm4 ; mm3 = avg(avg(cur,cur-1),avg(cur+width,cur-width))
98
      pavgb mm0, mm3 ; mm0 = avg(avg(cur,cur+1), 
109
        pavgb   mm0, mm3 ; mm0 = avg(avg(cur,cur+1),
99
 
110
 
100
      movq [edi], mm0 
111
        movq    [edi], mm0
101
      add edi, 8 
112
        add     edi, SIMD_BYTES
102
      loop .lop 
113
        loop    .lop
-
 
114
else if SIMD eq AVX
-
 
115
.lop:
-
 
116
        vmovdqa xmm0, [edi]
-
 
117
        vmovdqa xmm1, xmm0
-
 
118
        vmovdqa xmm2, [edi - SCREEN_WIDTH]
103
}
119
 
-
 
120
        vpavgb  xmm0, xmm0, [edi + 1]
-
 
121
        vpavgb  xmm1, xmm1, [edi - 1]
-
 
122
        vpavgb  xmm2, xmm2, [edi + SCREEN_WIDTH]
-
 
123
        vpavgb  xmm1, xmm1, xmm2
-
 
124
        vpavgb  xmm0, xmm0, xmm1
-
 
125
 
-
 
126
        vmovdqa [edi], xmm0
-
 
127
        add     edi, SIMD_BYTES
-
 
128
        loop    .lop
-
 
129
else if SIMD eq AVX2
-
 
130
.lop:
-
 
131
        vmovdqa ymm0, [edi]
-
 
132
        vmovdqa ymm1, ymm0
-
 
133
        vmovdqa ymm2, [edi - SCREEN_WIDTH]
-
 
134
 
-
 
135
        vpavgb  ymm0, ymm0, [edi + 1]
-
 
136
        vpavgb  ymm1, ymm1, [edi - 1]
-
 
137
        vpavgb  ymm2, ymm2, [edi + SCREEN_WIDTH]
-
 
138
        vpavgb  ymm1, ymm1, ymm2
-
 
139
        vpavgb  ymm0, ymm0, ymm1
-
 
140
 
-
 
141
        vmovdqa [edi], ymm0
-
 
142
        add     edi, SIMD_BYTES
-
 
143
        loop    .lop
-
 
144
else if SIMD eq AVX512
-
 
145
.lop:
-
 
146
        vmovdqa64 zmm0, [edi]
-
 
147
        vmovdqa64 zmm1, zmm0
-
 
148
        vmovdqa64 zmm2, [edi - SCREEN_WIDTH]
-
 
149
 
-
 
150
        vpavgb  zmm0, zmm0, [edi + 1]
-
 
151
        vpavgb  zmm1, zmm1, [edi - 1]
-
 
152
        vpavgb  zmm2, zmm2, [edi + SCREEN_WIDTH]
-
 
153
        vpavgb  zmm1, zmm1, zmm2
-
 
154
        vpavgb  zmm0, zmm0, zmm1
-
 
155
 
-
 
156
        vmovdqa64 [edi], zmm0
-
 
157
        add     edi, SIMD_BYTES
-
 
158
        loop    .lop
-
 
159
end if
104
 
160
}
105
 
161
 
106
macro mmx_blur_right
162
macro blur_right
-
 
163
{
107
{
164
local .lop
108
local .lop
165
if SIMD eq SSE
109
.lop: 
166
  .lop:
110
      movq mm0, [edi] 
167
        movq    mm0, [edi]
111
      movq mm1, [edi+1]
168
        movq    mm1, [edi + 1]
112
      movq mm2, [edi+SCREEN_WIDTH]
169
        movq    mm2, [edi + SCREEN_WIDTH]
113
      movq mm3, [edi+SCREEN_WIDTH+1]
170
        movq    mm3, [edi + SCREEN_WIDTH + 1]
114
      pavgb mm0, mm1 
171
        pavgb   mm0, mm1
115
      pavgb mm3, mm2 
172
        pavgb   mm3, mm2
116
      pavgb mm0, mm3 
173
        pavgb   mm0, mm3
117
      movq [edi], mm0 
174
        movq    [edi], mm0
-
 
175
        add     edi, SIMD_BYTES
-
 
176
        loop    .lop
-
 
177
else if SIMD eq AVX
-
 
178
  .lop:
-
 
179
        vmovdqa xmm0, [edi]
-
 
180
        vmovdqu xmm1, [edi + SCREEN_WIDTH + 1]
-
 
181
        vpavgb  xmm2, xmm0, [edi + 1]
-
 
182
        vpavgb  xmm3, xmm1, [edi + SCREEN_WIDTH]
-
 
183
        vpavgb  xmm4, xmm2, xmm3
118
      add edi, 8 
184
        vmovdqa [edi], xmm4
-
 
185
        add     edi, SIMD_BYTES
-
 
186
        loop    .lop
-
 
187
else if SIMD eq AVX2
-
 
188
  .lop:
-
 
189
        vmovdqa ymm0, [edi]
-
 
190
        vmovdqu ymm1, [edi + SCREEN_WIDTH + 1]
-
 
191
        vpavgb  ymm2, ymm0, [edi + 1]
-
 
192
        vpavgb  ymm3, ymm1, [edi + SCREEN_WIDTH]
-
 
193
        vpavgb  ymm4, ymm2, ymm3
-
 
194
        vmovdqa [edi], ymm4
-
 
195
        add     edi, SIMD_BYTES
119
      loop .lop 
196
        loop    .lop
-
 
197
else if SIMD eq AVX512
-
 
198
  .lop:
-
 
199
        vmovdqa64 zmm0, [edi]
-
 
200
        vmovdqu64 zmm1, [edi + SCREEN_WIDTH + 1]
-
 
201
        vpavgb  zmm2, zmm0, [edi + 1]
-
 
202
        vpavgb  zmm3, zmm1, [edi + SCREEN_WIDTH]
-
 
203
        vpavgb  zmm4, zmm2, zmm3
-
 
204
        vmovdqa64 [edi], zmm4
-
 
205
        add     edi, SIMD_BYTES
-
 
206
        loop    .lop
-
 
207
end if 
120
}
208
}
121
 
209
 
122
STARTAPP:
210
STARTAPP:
123
 
211
 
124
init_palette:
212
init_palette:
125
   mov edi, pal
213
        mov     edi, pal
126
	xor	eax, eax
214
        xor     eax, eax
127
red_loop:
215
red_loop:
128
	stosd
216
        stosd
129
	stosd
217
        stosd
130
	add	eax, 0x040000
218
        add     eax, 0x040000
131
	and	eax, 0xFFFFFF
219
        and     eax, 0xFFFFFF
132
	jnz	red_loop
220
        jnz     red_loop
133
 
221
 
134
	mov	eax, 63*4*65536
222
        mov     eax, 63*4 SHL 16
135
@@:
223
@@:
136
	stosd
224
        stosd
137
	stosd
225
        stosd
138
	add	ax, 0x0404
226
        add     ax, 0x0404
139
	jnc	@b
227
        jnc     @b
140
    
228
 
141
;zero_buffer: 
229
;zero_buffer:
142
   mov ecx, SCREEN_WIDTH*SCREEN_HEIGHT/4
230
        mov     ecx, SCREEN_WIDTH * SCREEN_HEIGHT / 4
143
;   mov edi,buffer 
231
;       mov     edi, buffer
144
   xor eax, eax 
232
        xor     eax, eax
145
   rep stosd
233
        rep     stosd
-
 
234
 
146
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
235
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
147
; Main Functions 
236
; Main Functions
148
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
237
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
149
virtual at esp
238
virtual at esp
150
global_x	dd	?
239
        global_x        dd ?
151
global_y	dd	?
240
        global_y        dd ?
152
seed		dd	?
241
        seed            dd ?
153
end virtual
242
end virtual
154
 
243
 
155
   db 0x0f, 0x31 
244
        rdtsc
156
	push	eax	; seed
245
        push    eax      ; seed
157
	push	100*64	; global_y
246
        push    100 * 64 ; global_y
158
	push	160*64	; global_x
247
        push    160 * 64 ; global_x
159
 
248
 
160
   jmp MAIN 
249
   jmp MAIN
161
 
250
 
162
 
251
 
163
red:
252
red:
164
	mcall	9,proc_info,-1
253
        mcall   9, proc_info, -1
-
 
254
x = 100
-
 
255
y = 70
-
 
256
xsize = SCREEN_WIDTH+9
-
 
257
ysize = SCREEN_HEIGHT+4
-
 
258
areacolor = 0x54224466
-
 
259
        mov     eax, 12                 ; function 12:tell os about windowdraw
-
 
260
        mov     ebx, 1                  ; 1, start of draw
165
   draw_window
261
        int     0x40
-
 
262
        mov     eax, 48
-
 
263
        mov     ebx, 4
-
 
264
        int     0x40
-
 
265
        lea     ecx, [(y SHL 16) + ysize + eax]
-
 
266
        xor     eax, eax                ; function 0 : define and draw window
-
 
267
        mov     ebx, (x SHL 16) + xsize ; [x start] *65536 + [x size]
-
 
268
        mov     edx, areacolor          ; color of work area RRGGBB
-
 
269
        mov     edi, window_title
-
 
270
        int     0x40
-
 
271
        mov     eax, 12                 ; end of redraw
-
 
272
        mov     ebx, 2
-
 
273
        int     0x40
-
 
274
 
166
MAIN:
275
MAIN:
167
	test	[proc_info.wnd_state], 0x04
276
        test    [proc_info.wnd_state], 0x04
168
	jnz	still
277
        jnz     still
169
   mov ecx, NUM_PARTS 
278
        mov     ecx, NUM_PARTS
170
   mov ebp, particles 
279
        mov     ebp, particles
171
   .advance_particles: 
280
  .advance_particles:
172
      mov eax, [ebp+X_OFFSET] 
281
        mov     eax, [ebp + X_OFFSET]
173
      mov ebx, [ebp+Y_OFFSET] 
282
        mov     ebx, [ebp + Y_OFFSET]
174
 
283
 
175
      sar eax, 6 
284
        sar     eax, 6
176
      sar ebx, 6 
285
        sar     ebx, 6
177
 
286
 
178
      cmp eax, 5 
287
        cmp     eax, 5
179
      jb .new_particle 
288
        jb      .new_particle
180
      cmp eax, SCREEN_WIDTH-5;315
289
        cmp     eax, SCREEN_WIDTH - 5
181
      jge .new_particle 
290
        jge     .new_particle
182
      cmp ebx, 5 
291
        cmp     ebx, 5
183
      jb .new_particle 
292
        jb      .new_particle
184
      cmp ebx, SCREEN_HEIGHT-5;195
293
        cmp     ebx, SCREEN_HEIGHT - 5
185
      jl .part_ok
294
        jl      .part_ok
186
 
295
 
187
   .new_particle: 
296
  .new_particle:
188
      call init_particle 
297
        call    init_particle
189
      jmp .advance_particles 
298
        jmp     .advance_particles
190
 
299
 
191
   .part_ok: 
300
  .part_ok:
192
;      mov edi, eax 
-
 
193
 ;     add edi,buffer 
-
 
194
;      mov eax, SCREEN_WIDTH
-
 
195
;      mul ebx 
-
 
196
	imul	edi, ebx, SCREEN_WIDTH
301
        imul    edi, ebx, SCREEN_WIDTH
197
      mov dl, [ebp+COLOR_OFFSET] 
302
        mov     dl, [ebp+COLOR_OFFSET]
198
      mov [buffer+eax+edi], dl
303
        mov     [buffer+eax+edi], dl
199
 
-
 
200
;      mov eax, [ebp+X_OFFSET] 
-
 
201
;      mov ebx, [ebp+Y_OFFSET] 
-
 
202
;      add eax, [ebp+X_SPEED_OFFSET] 
-
 
203
;      add ebx, [ebp+Y_SPEED_OFFSET] 
-
 
204
;      mov [ebp+X_OFFSET], eax 
-
 
205
;      mov [ebp+Y_OFFSET], ebx 
304
 
206
	mov	eax, [ebp+X_SPEED_OFFSET]
305
        mov     eax, [ebp+X_SPEED_OFFSET]
207
	add	[ebp+X_OFFSET], eax
306
        add     [ebp+X_OFFSET], eax
208
	mov	eax, [ebp+Y_SPEED_OFFSET]
307
        mov     eax, [ebp+Y_SPEED_OFFSET]
209
	add	[ebp+Y_OFFSET], eax
308
        add     [ebp+Y_OFFSET], eax
210
 
309
 
211
      db 0x0f, 0x31 
310
        rdtsc
212
      and al, 0x7F 
311
        and     al, 0x7F
213
      jnz .dont_inc_y_speed 
312
        jnz     .dont_inc_y_speed
214
      inc dword [ebp+Y_SPEED_OFFSET] 
313
        inc     dword [ebp+Y_SPEED_OFFSET]
215
      .dont_inc_y_speed: 
314
    .dont_inc_y_speed:
216
    
315
 
217
      add ebp, PART_SIZE 
316
        add     ebp, PART_SIZE
218
   loop .advance_particles 
317
        loop    .advance_particles
219
 
318
 
220
   mmx_shade 
319
        shade
221
; jmp .copy_buffer_to_video
320
;       jmp     .copy_buffer_to_video
222
   mmx_blur_prepare
321
        blur_prepare
223
   test dword [blur_right_flag] , 0x800000
322
        test    dword [blur_right_flag] , 0x800000
224
   jnz .do_blur_right 
323
        jnz     .do_blur_right
225
   mmx_blur 
324
        blur
226
   db 0x0f, 0x31 
325
        rdtsc
227
   and al, 1 
326
        and     al, 1
228
   jz .blur_ok 
327
        jz      .blur_ok
229
   jmp .dont_blur 
328
        jmp     .dont_blur
230
   .do_blur_right: 
329
    .do_blur_right:
231
   mmx_blur_right 
330
        blur_right
232
   .blur_ok: 
331
    .blur_ok:
233
   add dword [blur_right_flag], 0x1000
332
        add     dword [blur_right_flag], 0x1000
234
   .dont_blur: 
333
    .dont_blur:
235
 
334
 
236
   .copy_buffer_to_video: 
335
    .copy_buffer_to_video:
237
    ;    mov     eax, 18 ;@WAITVSYNC();
-
 
238
    ;    mov     ebx, 14
-
 
239
    ;    int     0x40
-
 
240
 
336
 
241
	mov	eax, 48
-
 
242
	mov	ebx, 4
-
 
243
	int	0x40
337
        mcall   48, 4
244
	lea	edx, [5*65536+eax]
338
        lea     edx, [(5 SHL 16) + eax]
245
 
339
 
246
	mov	eax, 65 ;copyfard(0xA000,0,screen,0,16000);
340
        mov     eax, 65
247
	mov	ebx, buffer;dword [screen]
-
 
248
	mov	ecx, SCREEN_WIDTH*65536+SCREEN_HEIGHT ;ecx = w*65536+h
341
        mov     ebx, buffer
249
;	mov	edx, 5*65536+25 ;edx = x*65536+y
342
        mov     ecx, (SCREEN_WIDTH SHL 16) + SCREEN_HEIGHT
250
	push	8
-
 
251
	pop	esi
343
        push    8
252
	;mov	esi, 8
344
        pop     esi
253
	mov	edi, pal
345
        mov     edi, pal
254
	xor	ebp, ebp
346
        xor     ebp, ebp
255
	int	0x40
347
        int     0x40
256
 
348
 
257
 
349
 
258
still:
350
still:
259
	mov	eax, 11 	    ; Test if there is an event in the queue.
351
        mov     eax, 11             ; Test if there is an event in the queue.
260
	int	0x40
352
        int     0x40
261
 
353
 
262
	dec	eax		      ; redraw request ?
354
        dec     eax                   ; redraw request ?
263
	jz	red
355
        jz      red
264
	dec	eax		      ; key in buffer ?
356
        dec     eax                   ; key in buffer ?
265
	jz	key
357
        jz      key
266
	dec	eax		      ; button in buffer ?
358
        dec     eax                   ; button in buffer ?
267
	jz	button
359
        jz      button
268
 
360
 
269
	jmp	MAIN
361
        jmp     MAIN
270
 
362
 
271
 
363
 
272
key:
364
key:
273
	mov	eax, 2
365
        mov     eax, 2
274
	int	0x40
366
        int     0x40
275
;	cmp	ah, 1		    ; Test Esc in Scan
367
;       cmp     ah, 1               ; Test Esc in Scan
276
;	je	close_app
368
;       je      close_app
277
	cmp	ah, 27		    ; Test Esc in ASCII
369
        cmp     ah, 27              ; Test Esc in ASCII
278
	je	close_app
370
        je      close_app
279
	jmp	MAIN
371
        jmp     MAIN
280
 
372
 
281
button:
373
button:
282
; we have only one button, close
374
; we have only one button, close
283
;	mov	eax, 17 	    ; Get pressed button code
-
 
284
;	int	0x40
-
 
285
;	cmp	ah, 1		    ; Test x button
-
 
286
;	je	close_app
-
 
287
;	jmp	MAIN
-
 
288
; fall through to close_app
-
 
289
 
-
 
290
fail:
-
 
291
	; Type something here.
-
 
292
close_app:
375
close_app:
293
    mov  eax,-1 		 ; close this program
376
        mov     eax, -1         ; close this program
294
    int  0x40
377
        int     0x40
295
 
378
 
296
init_particle: 
379
init_particle:
297
   db 0x0f, 0x31 
380
        rdtsc
298
   and al, 0x1F 
381
        and     al, 0x1F
299
jnz .dont_re_init_globals 
382
        jnz     .dont_re_init_globals
300
   ; init x 
383
        ; init x
301
   call rand 
384
        call    rand
302
   cdq
385
        cdq
303
   ;xor dx, dx 
386
        ;xor dx, dx
304
   mov ebx, SCREEN_WIDTH
387
        mov     ebx, SCREEN_WIDTH
305
   div ebx 
388
        div     ebx
306
   shl edx, 6 
389
        shl     edx, 6
307
   mov [4+global_x], edx 
390
        mov     [4 + global_x], edx
308
   ; init y 
391
        ; init y
309
   call rand 
392
        call    rand
310
   cdq
393
        cdq
311
   ;xor dx, dx 
394
        ;xor    dx, dx
312
   mov ebx, SCREEN_HEIGHT
395
        mov     ebx, SCREEN_HEIGHT
313
   div ebx
396
        div     ebx
314
   shl edx, 6
397
        shl     edx, 6
315
   mov [4+global_y], edx 
398
        mov     [4 + global_y], edx
316
.dont_re_init_globals: 
399
  .dont_re_init_globals:
317
   ; init x 
400
        ; init x
318
   mov eax, [4+global_x] 
401
        mov     eax, [4 + global_x]
319
   mov [ebp+X_OFFSET], eax 
402
        mov     [ebp + X_OFFSET], eax
320
   ; init y 
403
        ; init y
321
   mov eax, [4+global_y] 
404
        mov     eax, [4 + global_y]
322
   mov [ebp+Y_OFFSET], eax 
405
        mov     [ebp + Y_OFFSET], eax
323
   ; init x speed 
406
        ; init x speed
324
   call rand 
407
        call    rand
325
   and eax, 31 
408
        and     eax, 31
326
   sub eax, 15 
409
        sub     eax, 15
327
   ;shl ax, 6 
410
        ;shl    ax, 6
328
   mov [ebp+X_SPEED_OFFSET], eax 
411
        mov     [ebp + X_SPEED_OFFSET], eax
329
   ; init y speed 
412
        ; init y speed
330
   call rand 
413
        call    rand
331
   and eax, 31 
414
        and     eax, 31
332
   sub eax, 15 
415
        sub     eax, 15
333
   ;shl ax, 6
416
        ;shl    ax, 6
334
   mov [ebp+Y_SPEED_OFFSET], eax 
417
        mov     [ebp + Y_SPEED_OFFSET], eax
335
   ; init color 
418
        ; init color
336
;   mov ax, 255 
-
 
337
   ;call rand
-
 
338
   ;and ax, 0xFF
-
 
339
   mov [ebp+COLOR_OFFSET], dword 255;ax 
419
        mov     [ebp + COLOR_OFFSET], dword 255
340
   ret 
420
        ret
341
 
-
 
342
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
 
343
; Misc. Functions 
-
 
344
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
-
 
345
 
-
 
346
 
421
 
347
rand: 
422
rand:
348
      mov eax, [8+seed] 
423
        mov     eax, [8 + seed]
349
      imul eax, 214013 
424
        imul    eax, 214013
350
      add eax, 2531011 
425
        add     eax, 2531011
351
      mov [8+seed], eax 
426
        mov     [8 + seed], eax
352
      shr eax, 16 
427
        shr     eax, 16
353
      ret 
428
        ret
354
 
429
 
355
; DATA AREA
430
; DATA AREA
356
 
-
 
357
; Application Title
-
 
358
labelt          db      'Firework demo',0
431
window_title    db 'Firework demo',0
359
;labelt		db	'Matrix demo',0
-
 
360
 
-
 
361
;seed:	     dd 0
432
align SIMD_BYTES
362
;global_x:    dd 160*64 
-
 
363
;global_y:    dd 100*64 
-
 
364
sub_mask:    dd 0x01010101, 0x01010101 
433
sub_mask        db SIMD_BYTES dup 0x01
365
;                             x, y, x_speed, y_speed, color 
434
;                             x, y, x_speed, y_speed, color
366
particles: times NUM_PARTS dd 0, 0, 0,	      0,       0 
435
particles: times NUM_PARTS dd 0, 0, 0,       0,       0
367
blur_right_flag: dd 0 
436
blur_right_flag dd 0
368
;include 'Dex.inc'
-
 
369
I_END:
437
I_END:
370
proc_info	process_information
438
proc_info       process_information
371
pal	     rb 256*4	;dup(0)
439
align 16
372
;pal             dd      256   dup(0)
440
pal             rb 256 * 4
373
;buffer       rb 1024*64
441
align SIMD_BYTES
374
buffer	     rb SCREEN_WIDTH*SCREEN_HEIGHT
442
buffer          rb SCREEN_WIDTH * SCREEN_HEIGHT
375
443
E_END:
-
 
444
rd 0x200
-
 
445
stacktop: