Subversion Repositories Kolibri OS

Rev

Rev 1728 | Rev 2552 | Go to most recent revision | Details | Compare with Previous | 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
 
2095 dunkaist 22
include '../../../macros.inc'
1728 clevermous 23
include "aspapi.inc"
1547 Asper 24
SCREEN_WIDTH   equ    320
25
SCREEN_HEIGHT  equ    200
26
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
27
; Global defines
28
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
29
 
30
   NUM_PARTS   = 150
31
   X_OFFSET   = 0
32
   Y_OFFSET   = 4
33
   X_SPEED_OFFSET   = 8
34
   Y_SPEED_OFFSET   = 12
35
   COLOR_OFFSET   = 16
36
   PART_SIZE   = 20
37
 
38
macro draw_window
39
{
40
local x, xsize, y, ysize, areacolor, caption
41
x = 100
42
y = 70
43
xsize = SCREEN_WIDTH+9
44
ysize = SCREEN_HEIGHT+4
45
areacolor = 0x14224466
46
caption = labelt
47
	mov	eax, 12 		; function 12:tell os about windowdraw
48
	mov	ebx, 1			; 1, start of draw
49
	int	0x40
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
{
66
      mov ecx, SCREEN_WIDTH*SCREEN_HEIGHT/8
67
      mov  edi,buffer
68
      movq mm1, [sub_mask]
69
.lop:
70
      movq mm0, [edi]
71
      psubusb mm0, mm1
72
      movq [edi], mm0
73
      add edi, 8
74
      loop .lop
75
}
76
 
77
macro mmx_blur_prepare
78
{
79
      mov ecx, (SCREEN_WIDTH*SCREEN_HEIGHT-330*2)/8
80
      mov edi,buffer + 328
81
}
82
 
83
macro mmx_blur
84
{
85
local .lop
86
.lop:
87
      movq mm0, [edi]
88
      movq mm1, [edi+1]
89
      movq mm2, [edi-1]
90
      movq mm3, mm0
91
      movq mm4, [edi-SCREEN_WIDTH]
92
      movq mm5, [edi+SCREEN_WIDTH]
93
 
94
      pavgb mm0, mm1 ; mm0 = avg(cur,cur+1)
95
      pavgb mm3, mm2 ; mm3 = avg(cur,cur-1)
96
      pavgb mm4, mm5 ; mm4 = avg(cur+320,cur-320)
97
      pavgb mm3, mm4 ; mm3 = avg(avg(cur,cur-1),avg(cur+320,cur-320))
98
      pavgb mm0, mm3 ; mm0 = avg(avg(cur,cur+1),
99
 
100
      movq [edi], mm0
101
      add edi, 8
102
      loop .lop
103
}
104
 
105
 
106
macro mmx_blur_right
107
{
108
local .lop
109
.lop:
110
      movq mm0, [edi]
111
      movq mm1, [edi+1]
112
      movq mm2, [edi+SCREEN_WIDTH]
113
      movq mm3, [edi+SCREEN_WIDTH+1]
114
      pavgb mm0, mm1
115
      pavgb mm3, mm2
116
      pavgb mm0, mm3
117
      movq [edi], mm0
118
      add edi, 8
119
      loop .lop
120
}
121
 
122
STARTAPP:
123
 
124
init_palette:
125
   mov edi, pal
126
	xor	eax, eax
127
red_loop:
128
	stosd
129
	stosd
130
	add	eax, 0x040000
131
	and	eax, 0xFFFFFF
132
	jnz	red_loop
133
 
134
	mov	eax, 63*4*65536
135
@@:
136
	stosd
137
	stosd
138
	add	ax, 0x0404
139
	jnc	@b
140
 
141
;zero_buffer:
142
   mov ecx, SCREEN_WIDTH*SCREEN_HEIGHT/4
143
;   mov edi,buffer
144
   xor eax, eax
145
   rep stosd
146
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
147
; Main Functions
148
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
149
virtual at esp
150
global_x	dd	?
151
global_y	dd	?
152
seed		dd	?
153
end virtual
154
 
155
   db 0x0f, 0x31
156
	push	eax	; seed
157
	push	100*64	; global_y
158
	push	160*64	; global_x
159
 
160
   jmp MAIN
161
 
162
 
163
red:
2095 dunkaist 164
	mcall	9,proc_info,-1
1547 Asper 165
   draw_window
166
MAIN:
2095 dunkaist 167
	test	[proc_info.wnd_state], 0x04
168
	jnz	still
1547 Asper 169
   mov ecx, NUM_PARTS
170
   mov ebp, particles
171
   .advance_particles:
172
      mov eax, [ebp+X_OFFSET]
173
      mov ebx, [ebp+Y_OFFSET]
174
 
175
      sar eax, 6
176
      sar ebx, 6
177
 
178
      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
184
      cmp ebx, SCREEN_HEIGHT-5;195
185
      jl .part_ok
186
 
187
   .new_particle:
188
      call init_particle
189
      jmp .advance_particles
190
 
191
   .part_ok:
192
;      mov edi, eax
193
 ;     add edi,buffer
194
;      mov eax, SCREEN_WIDTH
195
;      mul ebx
196
	imul	edi, ebx, SCREEN_WIDTH
197
      mov dl, [ebp+COLOR_OFFSET]
198
      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
206
	mov	eax, [ebp+X_SPEED_OFFSET]
207
	add	[ebp+X_OFFSET], eax
208
	mov	eax, [ebp+Y_SPEED_OFFSET]
209
	add	[ebp+Y_OFFSET], eax
210
 
211
      db 0x0f, 0x31
212
      and al, 0x7F
213
      jnz .dont_inc_y_speed
214
      inc dword [ebp+Y_SPEED_OFFSET]
215
      .dont_inc_y_speed:
216
 
217
      add ebp, PART_SIZE
218
   loop .advance_particles
219
 
220
   mmx_shade
221
; jmp .copy_buffer_to_video
222
   mmx_blur_prepare
223
   test dword [blur_right_flag] , 0x800000
224
   jnz .do_blur_right
225
   mmx_blur
226
   db 0x0f, 0x31
227
   and al, 1
228
   jz .blur_ok
229
   jmp .dont_blur
230
   .do_blur_right:
231
   mmx_blur_right
232
   .blur_ok:
233
   add dword [blur_right_flag], 0x1000
234
   .dont_blur:
235
 
236
   .copy_buffer_to_video:
237
    ;    mov     eax, 18 ;@WAITVSYNC();
238
    ;    mov     ebx, 14
239
    ;    int     0x40
240
 
241
	mov	eax, 48
242
	mov	ebx, 4
243
	int	0x40
244
	lea	edx, [5*65536+eax]
245
 
246
	mov	eax, 65 ;copyfard(0xA000,0,screen,0,16000);
247
	mov	ebx, buffer;dword [screen]
248
	mov	ecx, SCREEN_WIDTH*65536+SCREEN_HEIGHT ;ecx = w*65536+h
249
;	mov	edx, 5*65536+25 ;edx = x*65536+y
250
	push	8
251
	pop	esi
252
	;mov	esi, 8
253
	mov	edi, pal
254
	xor	ebp, ebp
255
	int	0x40
256
 
257
 
258
still:
259
	mov	eax, 11 	    ; Test if there is an event in the queue.
260
	int	0x40
261
 
262
	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:
273
	mov	eax, 2
274
	int	0x40
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
325
   and eax, 31
326
   sub eax, 15
327
   ;shl ax, 6
328
   mov [ebp+X_SPEED_OFFSET], eax
329
   ; init y speed
330
   call rand
331
   and eax, 31
332
   sub eax, 15
333
   ;shl ax, 6
334
   mov [ebp+Y_SPEED_OFFSET], eax
335
   ; init color
336
;   mov ax, 255
337
   ;call rand
338
   ;and ax, 0xFF
339
   mov [ebp+COLOR_OFFSET], dword 255;ax
340
   ret
341
 
342
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
343
; Misc. Functions
344
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
345
 
346
 
347
rand:
348
      mov eax, [8+seed]
349
      imul eax, 214013
350
      add eax, 2531011
351
      mov [8+seed], eax
352
      shr eax, 16
353
      ret
354
 
355
; DATA AREA
356
 
357
; Application Title
358
labelt          db      'Firework demo',0
359
;labelt		db	'Matrix demo',0
360
 
361
;seed:	     dd 0
362
;global_x:    dd 160*64
363
;global_y:    dd 100*64
364
sub_mask:    dd 0x01010101, 0x01010101
365
;                             x, y, x_speed, y_speed, color
366
particles: times NUM_PARTS dd 0, 0, 0,	      0,       0
367
blur_right_flag: dd 0
368
;include 'Dex.inc'
369
I_END:
2095 dunkaist 370
proc_info	process_information
1547 Asper 371
pal	     rb 256*4	;dup(0)
372
;pal             dd      256   dup(0)
373
;buffer       rb 1024*64
374
buffer	     rb SCREEN_WIDTH*SCREEN_HEIGHT
375