Subversion Repositories Kolibri OS

Rev

Rev 2552 | Rev 7276 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2552 Rev 7125
Line 1... Line 1...
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	0x00000000	; reserved=no extended header
20
        dd      stacktop        ; reserved=no extended header
-
 
21
        dd      0, 0
Line 21... Line 22...
21
 
22
 
22
include '../../../macros.inc'
-
 
23
include "aspapi.inc"
23
include '../../../macros.inc'
24
SCREEN_WIDTH   equ    320
24
SCREEN_WIDTH   = 320
-
 
25
SCREEN_HEIGHT  = 200
-
 
26
SIMD equ SSE
-
 
27
SIMD_BYTES = 8
-
 
28
assert SCREEN_WIDTH mod SIMD_BYTES = 0
-
 
29
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
25
SCREEN_HEIGHT  equ    200
30
; Global defines
26
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
 
27
; Global defines 
-
 
Line 28... Line 31...
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
Line 35... Line 38...
35
   COLOR_OFFSET   = 16
38
COLOR_OFFSET   = 16
36
   PART_SIZE   = 20
39
PART_SIZE      = 20
-
 
40
 
-
 
41
macro shade
-
 
42
{
-
 
43
local .lop
37
 
44
if SIMD eq SSE
38
macro draw_window
45
        mov     ecx, SCREEN_WIDTH * SCREEN_HEIGHT / SIMD_BYTES
39
{
46
        mov     edi, buffer
40
local x, xsize, y, ysize, areacolor, caption
47
        movq    mm1, qword [sub_mask]
41
x = 100
48
  .lop:
-
 
49
        movq    mm0, [edi]
42
y = 70
50
        psubusb mm0, mm1
43
xsize = SCREEN_WIDTH+9
51
        movq    [edi], mm0
44
ysize = SCREEN_HEIGHT+4
52
        add     edi, SIMD_BYTES
-
 
53
        loop    .lop
45
areacolor = 0x54224466
54
else if SIMD eq AVX
46
caption = labelt
55
        mov     ecx, SCREEN_WIDTH * SCREEN_HEIGHT / SIMD_BYTES
47
	mov	eax, 12 		; function 12:tell os about windowdraw
56
        mov     edi, buffer
48
	mov	ebx, 1			; 1, start of draw
57
        vmovdqa xmm1, xword [sub_mask]
49
	int	0x40
58
  .lop:
-
 
59
        vmovdqa xmm0, [edi]
50
	; DRAW WINDOW
60
        vpsubusb xmm0, xmm0, xmm1
51
	mov	eax, 48
61
        vmovdqa [edi], xmm0
52
	mov	ebx, 4
62
        add     edi, SIMD_BYTES
53
	int	0x40
63
        loop    .lop
54
	lea	ecx, [y*65536+ysize+eax]
64
else if SIMD eq AVX2
-
 
65
        mov     ecx, SCREEN_WIDTH * SCREEN_HEIGHT / SIMD_BYTES
55
	xor	eax, eax		; function 0 : define and draw window
66
        mov     edi, buffer
-
 
67
        vmovdqa ymm1, yword [sub_mask]
56
	mov	ebx, x*65536+xsize	; [x start] *65536 + [x size]
68
  .lop:
57
	mov	edx, areacolor		 ; color of work area RRGGBB
69
        vmovdqa ymm0, [edi]
58
	mov	edi, caption
70
        vpsubusb ymm0, ymm0, ymm1
59
	int	0x40
-
 
60
;  start_draw_window 100,70,SCREEN_WIDTH+9,SCREEN_HEIGHT+29,0x04224466,labelt;, 14;labellen-labelt
-
 
61
  end_draw_window
71
        vmovdqa [edi], ymm0
62
}
-
 
63
 
72
        add     edi, SIMD_BYTES
64
macro mmx_shade
73
        loop    .lop
65
{
74
else if SIMD eq AVX512
66
      mov ecx, SCREEN_WIDTH*SCREEN_HEIGHT/8
75
        mov     ecx, SCREEN_WIDTH * SCREEN_HEIGHT / SIMD_BYTES
67
      mov  edi,buffer 
76
        mov     edi, buffer
68
      movq mm1, [sub_mask] 
77
        vmovdqa64 zmm1, zword [sub_mask]
69
.lop: 
78
  .lop:
70
      movq mm0, [edi] 
79
        vmovdqa64 zmm0, [edi]
71
      psubusb mm0, mm1 
80
        vpsubusb zmm0, zmm0, zmm1
-
 
81
        vmovdqa64 [edi], zmm0
72
      movq [edi], mm0 
82
        add     edi, SIMD_BYTES
Line 73... Line 83...
73
      add edi, 8 
83
        loop    .lop
74
      loop .lop 
84
end if
75
}
85
}
76
 
86
 
77
macro mmx_blur_prepare
87
macro blur_prepare
Line 78... Line 88...
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
-
 
91
}
81
}
92
 
82
 
93
macro blur
83
macro mmx_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)
-
 
107
        pavgb   mm4, mm5 ; mm4 = avg(cur+width,cur-width)
-
 
108
        pavgb   mm3, mm4 ; mm3 = avg(avg(cur,cur-1),avg(cur+width,cur-width))
-
 
109
        pavgb   mm0, mm3 ; mm0 = avg(avg(cur,cur+1),
-
 
110
 
-
 
111
        movq    [edi], mm0
-
 
112
        add     edi, SIMD_BYTES
-
 
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]
-
 
119
 
-
 
120
        vpavgb  xmm0, xmm0, [edi + 1]
96
      pavgb mm4, mm5 ; mm4 = avg(cur+320,cur-320) 
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]
97
      pavgb mm3, mm4 ; mm3 = avg(avg(cur,cur-1),avg(cur+320,cur-320)) 
153
        vpavgb  zmm1, zmm1, zmm2
-
 
154
        vpavgb  zmm0, zmm0, zmm1
98
      pavgb mm0, mm3 ; mm0 = avg(avg(cur,cur+1), 
155
 
Line 99... Line -...
99
 
-
 
100
      movq [edi], mm0 
156
        vmovdqa64 [edi], zmm0
101
      add edi, 8 
157
        add     edi, SIMD_BYTES
102
      loop .lop 
158
        loop    .lop
-
 
159
end if
103
}
160
}
104
 
161
 
105
 
162
macro blur_right
106
macro mmx_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]
-
 
169
        movq    mm2, [edi + SCREEN_WIDTH]
-
 
170
        movq    mm3, [edi + SCREEN_WIDTH + 1]
-
 
171
        pavgb   mm0, mm1
-
 
172
        pavgb   mm3, mm2
-
 
173
        pavgb   mm0, mm3
-
 
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
-
 
184
        vmovdqa [edi], xmm4
-
 
185
        add     edi, SIMD_BYTES
-
 
186
        loop    .lop
-
 
187
else if SIMD eq AVX2
112
      movq mm2, [edi+SCREEN_WIDTH]
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
-
 
196
        loop    .lop
-
 
197
else if SIMD eq AVX512
-
 
198
  .lop:
-
 
199
        vmovdqa64 zmm0, [edi]
113
      movq mm3, [edi+SCREEN_WIDTH+1]
200
        vmovdqu64 zmm1, [edi + SCREEN_WIDTH + 1]
-
 
201
        vpavgb  zmm2, zmm0, [edi + 1]
114
      pavgb mm0, mm1 
202
        vpavgb  zmm3, zmm1, [edi + SCREEN_WIDTH]
Line 115... Line 203...
115
      pavgb mm3, mm2 
203
        vpavgb  zmm4, zmm2, zmm3
Line 116... Line 204...
116
      pavgb mm0, mm3 
204
        vmovdqa64 [edi], zmm4
117
      movq [edi], mm0 
205
        add     edi, SIMD_BYTES
118
      add edi, 8 
206
        loop    .lop
119
      loop .lop 
207
end if 
120
}
208
}
121
 
209
 
122
STARTAPP:
210
STARTAPP:
123
 
211
 
124
init_palette:
212
init_palette:
Line 125... Line 213...
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
-
 
225
        stosd
137
	stosd
226
        add     ax, 0x0404
138
	add	ax, 0x0404
227
        jnc     @b
139
	jnc	@b
228
 
140
    
229
;zero_buffer:
141
;zero_buffer: 
230
        mov     ecx, SCREEN_WIDTH * SCREEN_HEIGHT / 4
142
   mov ecx, SCREEN_WIDTH*SCREEN_HEIGHT/4
231
;       mov     edi, buffer
143
;   mov edi,buffer 
232
        xor     eax, eax
144
   xor eax, eax 
233
        rep     stosd
Line 145... Line 234...
145
   rep stosd
234
 
146
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
235
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
147
; Main Functions 
236
; Main Functions
148
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
237
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 149... Line 238...
149
virtual at esp
238
virtual at esp
Line 150... Line 239...
150
global_x	dd	?
239
        global_x        dd ?
151
global_y	dd	?
240
        global_y        dd ?
-
 
241
        seed            dd ?
-
 
242
end virtual
-
 
243
 
-
 
244
        rdtsc
-
 
245
        push    eax      ; seed
-
 
246
        push    100 * 64 ; global_y
-
 
247
        push    160 * 64 ; global_x
-
 
248
 
-
 
249
   jmp MAIN
-
 
250
 
-
 
251
 
-
 
252
red:
-
 
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
152
seed		dd	?
260
        mov     ebx, 1                  ; 1, start of draw
-
 
261
        int     0x40
153
end virtual
262
        mov     eax, 48
154
 
263
        mov     ebx, 4
155
   db 0x0f, 0x31 
264
        int     0x40
156
	push	eax	; seed
265
        lea     ecx, [(y SHL 16) + ysize + eax]
157
	push	100*64	; global_y
266
        xor     eax, eax                ; function 0 : define and draw window
158
	push	160*64	; global_x
267
        mov     ebx, (x SHL 16) + xsize ; [x start] *65536 + [x size]
159
 
268
        mov     edx, areacolor          ; color of work area RRGGBB
160
   jmp MAIN 
269
        mov     edi, window_title
161
 
270
        int     0x40
162
 
271
        mov     eax, 12                 ; end of redraw
163
red:
272
        mov     ebx, 2
164
	mcall	9,proc_info,-1
273
        int     0x40
165
   draw_window
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 
-
 
180
      cmp eax, SCREEN_WIDTH-5;315
-
 
181
      jge .new_particle 
-
 
182
      cmp ebx, 5 
-
 
183
      jb .new_particle 
288
        jb      .new_particle
184
      cmp ebx, SCREEN_HEIGHT-5;195
289
        cmp     eax, SCREEN_WIDTH - 5
185
      jl .part_ok
290
        jge     .new_particle
186
 
291
        cmp     ebx, 5
187
   .new_particle: 
-
 
188
      call init_particle 
-
 
189
      jmp .advance_particles 
292
        jb      .new_particle
190
 
-
 
191
   .part_ok: 
293
        cmp     ebx, SCREEN_HEIGHT - 5
192
;      mov edi, eax 
-
 
193
 ;     add edi,buffer 
-
 
194
;      mov eax, SCREEN_WIDTH
-
 
195
;      mul ebx 
294
        jl      .part_ok
196
	imul	edi, ebx, SCREEN_WIDTH
295
 
197
      mov dl, [ebp+COLOR_OFFSET] 
296
  .new_particle:
198
      mov [buffer+eax+edi], dl
297
        call    init_particle
199
 
298
        jmp     .advance_particles
200
;      mov eax, [ebp+X_OFFSET] 
299
 
201
;      mov ebx, [ebp+Y_OFFSET] 
300
  .part_ok:
202
;      add eax, [ebp+X_SPEED_OFFSET] 
301
        imul    edi, ebx, SCREEN_WIDTH
203
;      add ebx, [ebp+Y_SPEED_OFFSET] 
302
        mov     dl, [ebp+COLOR_OFFSET]
204
;      mov [ebp+X_OFFSET], eax 
303
        mov     [buffer+eax+edi], dl
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 
-
 
225
   mmx_blur 
-
 
226
   db 0x0f, 0x31 
-
 
227
   and al, 1 
323
        jnz     .do_blur_right
228
   jz .blur_ok 
324
        blur
229
   jmp .dont_blur 
-
 
230
   .do_blur_right: 
-
 
231
   mmx_blur_right 
325
        rdtsc
232
   .blur_ok: 
326
        and     al, 1
233
   add dword [blur_right_flag], 0x1000
327
        jz      .blur_ok
234
   .dont_blur: 
328
        jmp     .dont_blur
235
 
329
    .do_blur_right:
236
   .copy_buffer_to_video: 
-
 
237
    ;    mov     eax, 18 ;@WAITVSYNC();
330
        blur_right
238
    ;    mov     ebx, 14
331
    .blur_ok:
239
    ;    int     0x40
-
 
240
 
332
        add     dword [blur_right_flag], 0x1000
241
	mov	eax, 48
333
    .dont_blur:
242
	mov	ebx, 4
334
 
Line 243... Line 335...
243
	int	0x40
335
    .copy_buffer_to_video:
244
	lea	edx, [5*65536+eax]
336
 
245
 
337
        mcall   48, 4
Line 246... Line 338...
246
	mov	eax, 65 ;copyfard(0xA000,0,screen,0,16000);
338
        lea     edx, [(5 SHL 16) + eax]
247
	mov	ebx, buffer;dword [screen]
339
 
248
	mov	ecx, SCREEN_WIDTH*65536+SCREEN_HEIGHT ;ecx = w*65536+h
340
        mov     eax, 65
249
;	mov	edx, 5*65536+25 ;edx = x*65536+y
341
        mov     ebx, buffer
250
	push	8
342
        mov     ecx, (SCREEN_WIDTH SHL 16) + SCREEN_HEIGHT
251
	pop	esi
343
        push    8
Line 252... Line 344...
252
	;mov	esi, 8
344
        pop     esi
Line 253... Line 345...
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
Line 261... Line 353...
261
 
353
 
262
	dec	eax		      ; redraw request ?
354
        dec     eax                   ; redraw request ?
263
	jz	red
-
 
264
	dec	eax		      ; key in buffer ?
-
 
265
	jz	key
-
 
266
	dec	eax		      ; button in buffer ?
-
 
267
	jz	button
-
 
268
 
-
 
269
	jmp	MAIN
-
 
270
 
-
 
271
 
-
 
272
key:
355
        jz      red
273
	mov	eax, 2
356
        dec     eax                   ; key in buffer ?
274
	int	0x40
357
        jz      key
275
;	cmp	ah, 1		    ; Test Esc in Scan
-
 
276
;	je	close_app
-
 
277
	cmp	ah, 27		    ; Test Esc in ASCII
-
 
278
	je	close_app
-
 
279
	jmp	MAIN
-
 
280
 
-
 
281
button:
-
 
282
; 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:
-
 
293
    mov  eax,-1 		 ; close this program
-
 
294
    int  0x40
-
 
295
 
-
 
296
init_particle: 
-
 
297
   db 0x0f, 0x31 
-
 
298
   and al, 0x1F 
-
 
299
jnz .dont_re_init_globals 
-
 
300
   ; init x 
-
 
301
   call rand 
-
 
302
   cdq
-
 
303
   ;xor dx, dx 
-
 
304
   mov ebx, SCREEN_WIDTH
-
 
305
   div ebx 
-
 
306
   shl edx, 6 
-
 
307
   mov [4+global_x], edx 
-
 
308
   ; init y 
-
 
309
   call rand 
-
 
310
   cdq
-
 
311
   ;xor dx, dx 
-
 
312
   mov ebx, SCREEN_HEIGHT
-
 
313
   div ebx
-
 
314
   shl edx, 6
-
 
315
   mov [4+global_y], edx 
-
 
316
.dont_re_init_globals: 
-
 
317
   ; init x 
-
 
318
   mov eax, [4+global_x] 
-
 
319
   mov [ebp+X_OFFSET], eax 
-
 
320
   ; init y 
-
 
321
   mov eax, [4+global_y] 
-
 
322
   mov [ebp+Y_OFFSET], eax 
-
 
323
   ; init x speed 
-
 
324
   call rand 
-
 
Line -... Line 358...
-
 
358
        dec     eax                   ; button in buffer ?
-
 
359
        jz      button
-
 
360
 
-
 
361
        jmp     MAIN
-
 
362
 
-
 
363
 
-
 
364
key:
-
 
365
        mov     eax, 2
-
 
366
        int     0x40
-
 
367
;       cmp     ah, 1               ; Test Esc in Scan
-
 
368
;       je      close_app
-
 
369
        cmp     ah, 27              ; Test Esc in ASCII
-
 
370
        je      close_app
-
 
371
        jmp     MAIN
-
 
372
 
-
 
373
button:
-
 
374
; we have only one button, close
-
 
375
close_app:
-
 
376
        mov     eax, -1         ; close this program
-
 
377
        int     0x40
-
 
378
 
-
 
379
init_particle:
-
 
380
        rdtsc
-
 
381
        and     al, 0x1F
-
 
382
        jnz     .dont_re_init_globals
-
 
383
        ; init x
-
 
384
        call    rand
-
 
385
        cdq
-
 
386
        ;xor dx, dx
-
 
387
        mov     ebx, SCREEN_WIDTH
-
 
388
        div     ebx
-
 
389
        shl     edx, 6
-
 
390
        mov     [4 + global_x], edx
-
 
391
        ; init y
-
 
392
        call    rand
-
 
393
        cdq
-
 
394
        ;xor    dx, dx
-
 
395
        mov     ebx, SCREEN_HEIGHT
-
 
396
        div     ebx
-
 
397
        shl     edx, 6
-
 
398
        mov     [4 + global_y], edx
-
 
399
  .dont_re_init_globals:
325
   and eax, 31 
400
        ; init x
326
   sub eax, 15 
401
        mov     eax, [4 + global_x]
327
   ;shl ax, 6 
402
        mov     [ebp + X_OFFSET], eax
328
   mov [ebp+X_SPEED_OFFSET], eax 
403
        ; init y
329
   ; init y speed 
404
        mov     eax, [4 + global_y]
330
   call rand 
405
        mov     [ebp + Y_OFFSET], eax
331
   and eax, 31 
406
        ; init x speed
332
   sub eax, 15 
407
        call    rand
Line 333... Line 408...
333
   ;shl ax, 6
408
        and     eax, 31
334
   mov [ebp+Y_SPEED_OFFSET], eax 
-
 
335
   ; init color 
-
 
336
;   mov ax, 255 
409
        sub     eax, 15
337
   ;call rand
-
 
338
   ;and ax, 0xFF
-
 
339
   mov [ebp+COLOR_OFFSET], dword 255;ax 
410
        ;shl    ax, 6
340
   ret 
-
 
341
 
-
 
342
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
411
        mov     [ebp + X_SPEED_OFFSET], eax
343
; Misc. Functions 
412
        ; init y speed
344
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
413
        call    rand
345
 
414
        and     eax, 31
346
 
-
 
347
rand: 
415
        sub     eax, 15
348
      mov eax, [8+seed] 
416
        ;shl    ax, 6
349
      imul eax, 214013 
417
        mov     [ebp + Y_SPEED_OFFSET], eax
350
      add eax, 2531011 
418
        ; init color
351
      mov [8+seed], eax 
419
        mov     [ebp + COLOR_OFFSET], dword 255
352
      shr eax, 16 
420
        ret
353
      ret 
421
 
-
 
422
rand:
-
 
423
        mov     eax, [8 + seed]