Subversion Repositories Kolibri OS

Rev

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

  1. include "lang.inc"
  2. include "macros.inc"
  3.  
  4. WND_SIZE_X              = 320
  5. WND_SIZE_Y              = 200
  6.  
  7. VC_DELTA = 1
  8. HC_DELTA = 2
  9.  
  10. MEOS_APP_START
  11. CODE
  12.     fninit
  13.     call init_sinus_table
  14.     call init_background
  15.     call init_palette
  16.     mov eax,40
  17.     mov ebx,101b
  18.     int 0x40
  19.     jmp .paint_window
  20.  
  21. .event_loop:
  22.     mov eax,23
  23.     mov ebx,1
  24.     int 0x40
  25.  
  26.     test eax,eax
  27.     je .draw_screen
  28.     dec eax
  29.     je .paint_window
  30.  
  31.     or  eax,-1
  32.     int 0x40
  33.  
  34. .draw_screen:
  35.     add word [ver_counter],VC_DELTA
  36.     add word [hor_counter],HC_DELTA
  37.     call handle_animation
  38.     mov eax,7
  39.     mov ebx,virtual_screen_32
  40.     mov ecx,(WND_SIZE_X shl 16)+WND_SIZE_Y
  41.     xor edx,edx
  42.     int 0x40
  43.     jmp .event_loop
  44.  
  45. .paint_window:
  46.     mov eax,12
  47.     mov ebx,1
  48.     int 0x40
  49.  
  50.     xor eax,eax
  51.     mov ebx,(100 shl 16)+(WND_SIZE_X+9)
  52.     mov ecx,(100 shl 16)+(WND_SIZE_Y+28)
  53.     mov edx,0x33000000
  54.     mov edi,header
  55.     int 0x40
  56.  
  57.     mov eax,7
  58.     mov ebx,virtual_screen_32
  59.     mov ecx,(WND_SIZE_X shl 16)+WND_SIZE_Y
  60.     xor edx,edx
  61.     int 0x40
  62.  
  63.     mov eax,12
  64.     mov ebx,2
  65.     int 0x40
  66.  
  67.     jmp .event_loop
  68.  
  69. init_palette:
  70.     mov ecx,256
  71.     mov edi,_palette
  72.     xor eax,eax
  73. .next_pal:
  74.     mov al,ah
  75.     shr al,2
  76.     stosb
  77.     stosb
  78.     stosb
  79.     inc edi
  80.     inc ah
  81.     loop .next_pal
  82.     ret
  83.  
  84. init_sinus_table:
  85.     sub esp,4
  86.     mov ecx,256
  87.     mov edi,sinetable
  88. .sin_loop:
  89.     fld dword [esp]
  90.     fld st0
  91.     fsin
  92.     fmul [scale_sin]
  93.     fistp word [edi]
  94.     fadd [delta_angle]
  95.     fstp dword [esp]
  96.     add edi,2
  97.     loop .sin_loop
  98.     add esp,4
  99.     ret
  100.  
  101. init_background:
  102.     mov edi,background
  103.     xor edx,edx
  104. .ib_vertical:
  105.     xor ecx,ecx
  106. .ib_horizontal:
  107.     mov eax,ecx
  108.     xor eax,edx
  109.     stosb
  110.     inc ecx
  111.     cmp ecx,256
  112.     jne .ib_horizontal
  113.     inc edx
  114.     cmp edx,256
  115.     jne .ib_vertical
  116.     ret
  117.  
  118. s_OFFX          = 0
  119. s_OFFY          = 2
  120.  
  121. handle_animation:
  122.     sub esp,4
  123.     mov ebx,[ver_counter]
  124.     and ebx,255
  125.     add ebx,ebx
  126.     mov ax,[sinetable+ebx]
  127.     mov [esp+s_OFFY],ax
  128.     mov ebx,[hor_counter]
  129.     and ebx,255
  130.     add ebx,ebx
  131.     mov ax,[sinetable+ebx]
  132.     mov [esp+s_OFFX],ax
  133.     mov edi,virtual_screen_32
  134.     mov edx,WND_SIZE_Y-1
  135. .a_ver:
  136.     mov ecx,WND_SIZE_X-1
  137.     mov bx,[esp+s_OFFY]
  138.     add bx,dx
  139.     and ebx,255
  140.     shl ebx,8
  141. .a_hor:
  142.     mov ax,[esp+s_OFFX]
  143.     add ax,cx
  144.     and eax,255
  145.     lea esi,[background+ebx+eax]
  146.     mov al,[esi]
  147.     and eax,0xff
  148.     mov eax,[_palette+eax*4]
  149.     stosw
  150.     shr eax,16
  151.     stosb
  152.     dec ecx
  153.     jge .a_hor
  154.     dec edx
  155.     jge .a_ver
  156.     add esp,4
  157.     ret
  158.  
  159. DATA
  160.   delta_angle dd 0.0245436926066                ; pi/128
  161.   scale_sin dd 128.0
  162.  
  163.   header      db 'MoveBack',0
  164.  
  165. UDATA
  166.   ver_counter dd ?
  167.   hor_counter dd ?
  168.  
  169.   _palette:     rd 256
  170.  
  171.   virtual_screen_32:
  172.         rb WND_SIZE_X*WND_SIZE_Y*3
  173.  
  174.   background:
  175.         rb 256*256
  176.  
  177.   sinetable:
  178.         rw 256
  179.  
  180. MEOS_APP_END