Subversion Repositories Kolibri OS

Rev

Rev 1728 | Go to most recent revision | Details | Last modification | View Log | RSS feed

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