Subversion Repositories Kolibri OS

Rev

Rev 1728 | Rev 2552 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  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 '../../../macros.inc'
  23. include "aspapi.inc"
  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:
  164.         mcall   9,proc_info,-1
  165.    draw_window
  166. MAIN:
  167.         test    [proc_info.wnd_state], 0x04
  168.         jnz     still
  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:
  370. proc_info       process_information
  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.  
  376.