Subversion Repositories Kolibri OS

Rev

Rev 1547 | Rev 2095 | 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 "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.  
  371.