Subversion Repositories Kolibri OS

Rev

Rev 129 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. ;-----------------------------------------------------------------------------
  2. func vm_mike_draw_rect.24 ;///////////////////////////////////////////////////
  3. ;-----------------------------------------------------------------------------
  4. ; eax - x start
  5. ; ebx - y start
  6. ; ecx - x end
  7. ; edx - y end
  8. ; edi - color
  9. ;-----------------------------------------------------------------------------
  10. ;- eax(ebx) [x start]*65536 + [x size]
  11. ;- ebx(ecx) [y start]*65536 + [y size]
  12. ;- ecx(edx) color 0x00RRGGBB
  13. ;-----------------------------------------------------------------------------
  14. begin
  15.         pushad
  16.         cli
  17.         jif     eax,e,ecx,.exit
  18.         jif     ebx,e,edx,.exit
  19.  
  20.         call    get_cursor_rect
  21.  
  22.         mov     ebp,[TASK_BASE]
  23.         movsx   esi,word[ebp-CURRENT_TASK+0]
  24.         add     eax,esi
  25.         add     ecx,esi
  26.         movsx   esi,word[ebp-CURRENT_TASK+4]
  27.         add     ebx,esi
  28.         add     edx,esi
  29. ;       add     eax,[ebp-CURRENT_TASK+0]
  30. ;       add     ebx,[ebp-CURRENT_TASK+4]
  31. ;       add     ecx,[ebp-CURRENT_TASK+0]
  32. ;       add     edx,[ebp-CURRENT_TASK+4]
  33.  
  34.         mov     esi,[CURRENT_TASK]
  35.         mov     esi,[CLIP_RECTS+esi*4]
  36.         mov     ebp,[esi]
  37.         or      ebp,ebp
  38.         jz      .exit
  39.         add     esi,4
  40.   .nx:  jif     ecx,l,[rr.left],.skip
  41.         jif     eax,ge,[rr.right],.skip
  42.         jif     edx,l,[rr.top],.skip
  43.         jif     ebx,ge,[rr.bottom],.skip
  44.         pushad
  45.         jif     eax,ge,[rr.left],@f
  46.         mov     eax,[rr.left]
  47.     @@: jif     ebx,ge,[rr.top],@f
  48.         mov     ebx,[rr.top]
  49.     @@: jif     ecx,l,[rr.right],@f
  50.         mov     ecx,[rr.right]
  51.     @@: jif     edx,l,[rr.bottom],@f
  52.         mov     edx,[rr.bottom]
  53.     @@: call    is_intersect_rc
  54.         jc      .put
  55.         cmp     byte[MOUSE_VISIBLE],0
  56.         je      .put
  57.         call    [SF.draw_mouse_under]
  58.         mov     byte[MOUSE_VISIBLE],0
  59.   .put: mov     ebp,[BytesPerScanLine]
  60.         imul    ebp,ebx
  61.         push    eax
  62.         lea     eax,[eax*3]
  63.         add     ebp,eax
  64.         pop     eax
  65.         add     ebp,[LFBAddress]
  66.   .xxx: push    eax ebp
  67.     @@: push    eax
  68.         mov     eax,edi
  69.         mov     [ebp],ax
  70.         shr     eax,16
  71.         mov     [ebp+2],al
  72.         pop     eax
  73.         add     ebp,3
  74.         inc     eax
  75.         cmp     eax,ecx
  76.         jl      @b
  77.         pop     ebp eax
  78.         add     ebp,[BytesPerScanLine]
  79.         inc     ebx
  80.         cmp     ebx,edx
  81.         jl      .xxx
  82.         popad
  83.   .skip:
  84.         add     esi,SR
  85.         dec     ebp
  86.         jnz     .nx
  87.  
  88.   .exit:
  89.         sti
  90.         popad
  91.         retn
  92. endf
  93.  
  94. ;-----------------------------------------------------------------------------
  95. func vm_mike_draw_line.24 ;///////////////////////////////////////////////////
  96. ;-----------------------------------------------------------------------------
  97. ; eax(ebx)  [x start] shl 16 + [x end]
  98. ; ebx(ecx)  [y start] shl 16 + [y end]
  99. ; ecx(edx)  colour 0x00RRGGBB
  100. ; edi = 0x00000001 force
  101. ;-----------------------------------------------------------------------------
  102. begin
  103.         pushad
  104.         cli
  105.  
  106.         call    get_cursor_rect
  107.  
  108.         movsx   eax,word[esp+4*7]  ; x end
  109.         cmp     ax,[esp+4*7+2]     ; x start
  110.         je      dl.24.vert_line
  111.         movsx   eax,word[esp+4*4]  ; y end
  112.         cmp     ax,[esp+4*4+2]     ; y start
  113.         je      dl.24.horz_line
  114.  
  115.         sti
  116.         popad
  117.         retn
  118.  
  119.   dl.24.vert_line:
  120.         test    edi,1
  121.         jnz     .forced
  122.         mov     esi,[CURRENT_TASK]
  123.         mov     esi,[CLIP_RECTS+esi*4]
  124.         mov     edi,[esi]
  125.         or      edi,edi
  126.         jz      .exit
  127.         add     esi,4
  128.   .nx:  movsx   ebx,word[esp+4*4+2]  ; y start
  129.         movsx   edx,word[esp+4*4]    ; y end
  130.         cmp     ebx,edx
  131.         je      .exit
  132.         jl      @f
  133.         xchg    ebx,edx
  134.     @@: jif     eax,l,[rr.left],.skip
  135.         jif     eax,ge,[rr.right],.skip
  136.         jif     edx,l,[rr.top],.skip
  137.         jif     ebx,ge,[rr.bottom],.skip
  138.         jif     ebx,ge,[rr.top],@f
  139.         mov     ebx,[rr.top]
  140.     @@: jif     edx,l,[rr.bottom],@f
  141.         mov     edx,[rr.bottom]
  142.         dec     edx
  143.   .draw:
  144.     @@: call    is_intersect_vln
  145.         jc      .put
  146.         cmp     byte[MOUSE_VISIBLE],0
  147.         je      .put
  148.         call    [SF.draw_mouse_under]
  149.         mov     byte[MOUSE_VISIBLE],0
  150.   .put: mov     ebp,[BytesPerScanLine]
  151.         imul    ebp,ebx
  152.         push    eax
  153.         lea     eax,[eax*3]
  154.         add     ebp,eax
  155.         pop     eax
  156.         add     ebp,[LFBAddress]
  157.     @@: test    ecx,0x01000000
  158.         jz      .dr
  159.         mov     ecx,[ebp]
  160.         not     ecx
  161.         or      ecx,0x01000000
  162.   .dr:  mov     [ebp],cx
  163.         ror     ecx,8
  164.         mov     [ebp+2],ch
  165.         rol     ecx,8
  166.         add     ebp,[BytesPerScanLine]
  167.         inc     ebx
  168.         cmp     ebx,edx
  169.         jle     @b
  170.   .skip:
  171.         add     esi,SR
  172.         dec     edi
  173.         jnz     .nx
  174.   .exit:
  175.         sti
  176.         popad
  177.         retn
  178.   .forced:
  179.         jif     eax,l,[viewport.left],.exit
  180.         jif     eax,ge,[viewport.right],.exit
  181.         movsx   ebx,word[esp+4*4+2]  ; y start
  182.         movsx   edx,word[esp+4*4]    ; y end
  183.         jif     ebx,e,edx,.exit
  184.         jl      @f
  185.         xchg    ebx,edx
  186.     @@: jif     edx,l,[viewport.top],.exit
  187.         jif     ebx,ge,[viewport.bottom],.exit
  188.         jif     ebx,ge,[viewport.top],@f
  189.         mov     ebx,[viewport.top]
  190.     @@: jif     edx,l,[viewport.bottom],@f
  191.         mov     edx,[viewport.bottom]
  192.         dec     edx
  193.     @@: mov     edi,1
  194.         jmp     .draw
  195.  
  196.   dl.24.horz_line:
  197.         test    edi,1
  198.         jnz     .forced
  199.         mov     esi,[CURRENT_TASK]
  200.         mov     esi,[CLIP_RECTS+esi*4]
  201.         mov     edi,[esi]
  202.         or      edi,edi
  203.         jz      .exit
  204.         add     esi,4
  205.   .nx:  movsx   ebx,word[esp+4*7+2]  ; x start
  206.         movsx   edx,word[esp+4*7]    ; x end
  207.         cmp     ebx,edx
  208.         je      .exit
  209.         jl      @f
  210.         xchg    ebx,edx
  211.     @@: jif     eax,l,[rr.top],.skip
  212.         jif     eax,ge,[rr.bottom],.skip
  213.         jif     edx,l,[rr.left],.skip
  214.         jif     ebx,ge,[rr.right],.skip
  215.         jif     ebx,ge,[rr.left],@f
  216.         mov     ebx,[rr.left]
  217.     @@: jif     edx,l,[rr.right],@f
  218.         mov     edx,[rr.right]
  219.         dec     edx
  220.   .draw:
  221.     @@: call    is_intersect_hln
  222.         jc      .put
  223.         cmp     byte[MOUSE_VISIBLE],0
  224.         je      .put
  225.         call    [SF.draw_mouse_under]
  226.         mov     byte[MOUSE_VISIBLE],0
  227.   .put: mov     ebp,[BytesPerScanLine]
  228.         imul    ebp,eax
  229.         push    eax
  230.         lea     eax,[ebx*3]
  231.         add     ebp,eax
  232.         pop     eax
  233.         add     ebp,[LFBAddress]
  234.     @@: test    ecx,0x01000000
  235.         jz      .dr
  236.         mov     ecx,[ebp]
  237.         not     ecx
  238.         or      ecx,0x01000000
  239.   .dr:  mov     [ebp],cx
  240.         ror     ecx,8
  241.         mov     [ebp+2],ch
  242.         rol     ecx,8
  243.         add     ebp,3
  244.         inc     ebx
  245.         cmp     ebx,edx
  246.         jle     @b
  247.   .skip:
  248.         add     esi,SR
  249.         dec     edi
  250.         jnz     .nx
  251.   .exit:
  252.         sti
  253.         popad
  254.         retn
  255.   .forced:
  256.         jif     eax,l,[viewport.top],.exit
  257.         jif     eax,ge,[viewport.bottom],.exit
  258.         movsx   ebx,word[esp+4*7+2]  ; x start
  259.         movsx   edx,word[esp+4*7]    ; x end
  260.         cmp     ebx,edx
  261.         je      .exit
  262.         jl      @f
  263.         xchg    ebx,edx
  264.     @@: jif     edx,l,[viewport.left],.exit
  265.         jif     ebx,ge,[viewport.right],.exit
  266.         jif     ebx,ge,[viewport.left],@f
  267.         mov     ebx,[viewport.left]
  268.     @@: jif     edx,l,[viewport.right],@f
  269.         mov     edx,[viewport.right]
  270.         dec     edx
  271.     @@: mov     edi,1
  272.         jmp     .draw
  273. endf
  274.  
  275. ;-----------------------------------------------------------------------------
  276. func vm_mike_put_pixel.24 ;///////////////////////////////////////////////////
  277. ;-----------------------------------------------------------------------------
  278. ; eax = x coordinate
  279. ; ebx = y coordinate
  280. ; ecx = ?? RR GG BB    ; 0x01000000 negation
  281. ; edi = 0x00000001 force
  282. ;-----------------------------------------------------------------------------
  283. begin
  284.         pushad
  285.         cli
  286.         mov     edx,[BytesPerScanLine]
  287.         imul    edx,ebx
  288.         add     edx,eax                 ; lea esi,[eax*3]
  289.         lea     edx,[edx+eax*2]         ; add edx,esi
  290.         add     edx,[LFBAddress]
  291.         test    ecx,0x01000000
  292.         jz      @f
  293.         mov     ecx,[edx]
  294.         not     ecx
  295.     @@: test    edi,1
  296.         jnz     .forced
  297.         mov     esi,[CURRENT_TASK]
  298.         mov     esi,[CLIP_RECTS+esi*4]
  299.         mov     edi,[esi]
  300.         or      edi,edi
  301.         jz      .exit
  302.         add     esi,4
  303.     @@: jif     eax,l,[rr.left],.skip
  304.         jif     eax,ge,[rr.right],.skip
  305.         jif     ebx,l,[rr.top],.skip
  306.         jif     ebx,ge,[rr.bottom],.skip
  307.         call    get_cursor_rect
  308.         call    is_intersect_pt
  309.         jc      .put
  310.         cmp     byte[MOUSE_VISIBLE],0
  311.         je      .put
  312.         call    [SF.draw_mouse_under]
  313.         mov     byte[MOUSE_VISIBLE],0
  314.   .put: mov     [edx],cx
  315.         shr     ecx,16
  316.         mov     [edx+2],cl
  317.   .exit:
  318.         sti
  319.         popad
  320.         retn
  321.   .skip:
  322.         add     esi,SR
  323.         dec     edi
  324.         jnz     @b
  325.         jmp     .exit
  326.   .forced:
  327.         jif     eax,l,[viewport.left],.exit
  328.         jif     ebx,l,[viewport.top],.exit
  329.         jif     eax,ge,[viewport.right],.exit
  330.         jif     ebx,ge,[viewport.bottom],.exit
  331.         mov     [edx],cx
  332.         shr     ecx,16
  333.         mov     [edx+2],cl
  334.         sti
  335.         popad
  336.         retn
  337. endf
  338.  
  339. ;-----------------------------------------------------------------------------
  340. func vm_mike_get_pixel.24 ;///////////////////////////////////////////////////
  341. ;-----------------------------------------------------------------------------
  342. ; eax = x coordinate
  343. ; ebx = y coordinate
  344. ;-----------------------------------------------------------------------------
  345. begin
  346.         pushad
  347.         cli
  348.         imul    ebx,[BytesPerScanLine]
  349.         lea     eax,[eax*3]
  350.         add     eax,ebx
  351.         add     eax,[LFBAddress]
  352.         mov     eax,[eax]
  353.         and     eax,0x00FFFFFF
  354.         mov     [esp+4*6],eax
  355.         sti
  356.         popad
  357.         retn
  358. endf
  359.  
  360. ;-----------------------------------------------------------------------------
  361. func vm_mike_put_image.24 ;///////////////////////////////////////////////////
  362. ;-----------------------------------------------------------------------------
  363. ; eax(ebx) pointer to image in memory - RRGGBBRRGGBB..
  364. ; ebx(ecx) image size [x]*65536+[y]
  365. ; ecx(edx) image position in window [x]*65536+[y]
  366. ; ret: eax 0 succesful, 1 overlapped
  367. ;-----------------------------------------------------------------------------
  368. begin
  369.         mov     eax,ebx
  370.         mov     ebx,ecx
  371.         mov     ecx,edx
  372.  
  373.   .direct:
  374.         pushad
  375.         cli
  376.         jif     ebx,z,0x0000FFFF,.exit,test
  377.         jif     ebx,z,0xFFFF0000,.exit,test
  378.  
  379.         call    get_cursor_rect
  380.  
  381.         mov     ebp,eax
  382.         movsx   eax,word[esp+4*6+2]
  383.         movsx   ebx,word[esp+4*6]
  384.         movsx   ecx,word[esp+4*4+2]
  385.         movsx   edx,word[esp+4*4]
  386.  
  387.         lea     edi,[ecx*3]
  388.         push    edi
  389.         add     ecx,eax
  390.         add     edx,ebx
  391.         mov     edi,[TASK_BASE]
  392.         movsx   esi,word[edi-CURRENT_TASK+0]
  393.         add     eax,esi
  394.         add     ecx,esi
  395.         movsx   esi,word[edi-CURRENT_TASK+4]
  396.         add     ebx,esi
  397.         add     edx,esi
  398. ;       add     eax,[edi-CURRENT_TASK+0]
  399. ;       add     ebx,[edi-CURRENT_TASK+4]
  400. ;       add     ecx,[edi-CURRENT_TASK+0]
  401. ;       add     edx,[edi-CURRENT_TASK+4]
  402.  
  403.         mov     esi,[CURRENT_TASK]
  404.         mov     esi,[CLIP_RECTS+esi*4]
  405.         mov     edi,[esi]
  406.         or      edi,edi
  407.         jz      .exit
  408.         add     esi,4
  409.         cld
  410.   .nx:  jif     ecx,l,[rr.left],.skip
  411.         jif     eax,ge,[rr.right],.skip
  412.         jif     edx,l,[rr.top],.skip
  413.         jif     ebx,ge,[rr.bottom],.skip
  414.         pushad
  415.         jif     eax,ge,[rr.left],@f
  416.         mov     eax,[rr.left]
  417.     @@: jif     ebx,ge,[rr.top],@f
  418.         mov     ebx,[rr.top]
  419.     @@: jif     ecx,l,[rr.right],@f
  420.         mov     ecx,[rr.right]
  421.     @@: jif     edx,l,[rr.bottom],@f
  422.         mov     edx,[rr.bottom]
  423.     @@: call    is_intersect_rc
  424.         jc      .put
  425.         cmp     byte[MOUSE_VISIBLE],0
  426.         je      .put
  427.         call    [SF.draw_mouse_under]
  428.         mov     byte[MOUSE_VISIBLE],0
  429.   .put: mov     esi,ebx
  430.         sub     esi,[esp+4*4]
  431.         imul    esi,[esp+4*8]
  432.         mov     edi,eax
  433.         sub     edi,[esp+4*7]
  434.         lea     edi,[edi*3]
  435.         add     esi,edi
  436.         add     esi,ebp
  437.         mov     edi,[BytesPerScanLine]
  438.         imul    edi,ebx
  439.         push    eax
  440.         lea     eax,[eax*3]
  441.         add     edi,eax
  442.         pop     eax
  443.         add     edi,[LFBAddress]
  444.   .xxx: push    eax esi edi eax
  445.     @@: ;movsd
  446.         ;dec    esi
  447.         ;dec    edi
  448.         movsw
  449.         movsb
  450.         inc     dword[esp]
  451.         cmp     [esp],ecx
  452.         jl      @b
  453.         pop     eax edi esi eax
  454.         add     esi,[esp+4*8]
  455.         add     edi,[BytesPerScanLine]
  456.         inc     ebx
  457.         cmp     ebx,edx
  458.         jl      .xxx
  459.         popad
  460.   .skip:
  461.         add     esi,SR
  462.         dec     edi
  463.         jnz     .nx
  464.  
  465.   .exit:
  466.         add     esp,4
  467.         sti
  468.         popad
  469.         xor     eax,eax
  470.         retn
  471. endf
  472.  
  473. ;-----------------------------------------------------------------------------
  474. func vm_mike_draw_bg.24 ;/////////////////////////////////////////////////////
  475. ;-----------------------------------------------------------------------------
  476. begin
  477.         pushad
  478.  
  479.         cmp     byte[bg_type],BGT_TILE
  480.         je      .tiled
  481.  
  482.         mov     eax,[bg_width]
  483.         cmp     eax,[ScreenWidth]
  484.         jne     @f
  485.         mov     eax,[bg_height]
  486.         cmp     eax,[ScreenHeight]
  487.         je      .tiled
  488.     @@:
  489.         imul    eax,[bg_width],3
  490.         mov     [bg_BytesPerScanLine],eax
  491.  
  492.         mov     eax,[viewport.left]
  493.         mov     ebx,[viewport.top]
  494.         mov     ecx,[viewport.right]
  495.         mov     edx,[viewport.bottom]
  496.  
  497.         cmp     [bg_width],1
  498.         jne     @f
  499.         cmp     [bg_height],1
  500.         je      .color
  501.     @@:
  502.         cli
  503.  
  504.         call    [SF.draw_mouse_under]
  505.         mov     byte[MOUSE_VISIBLE],0
  506.  
  507.         mov     esi,[CLIP_RECTS+4]
  508.         mov     ebp,[esi]
  509.         or      ebp,ebp
  510.         jz      .exit
  511.         add     esi,4
  512.   .nx:  jif     ecx,l,[rr.left],.skip
  513.         jif     eax,ge,[rr.right],.skip
  514.         jif     edx,l,[rr.top],.skip
  515.         jif     ebx,ge,[rr.bottom],.skip
  516.         pushad
  517.         jif     eax,ge,[rr.left],@f
  518.         mov     eax,[rr.left]
  519.     @@: jif     ebx,ge,[rr.top],@f
  520.         mov     ebx,[rr.top]
  521.     @@: jif     ecx,l,[rr.right],@f
  522.         mov     ecx,[rr.right]
  523.     @@: jif     edx,l,[rr.bottom],@f
  524.         mov     edx,[rr.bottom]
  525.     @@: ;call   is_intersect_rc
  526.         ;jc     .put
  527.         ;cmp    [mouse_invisible],0
  528.         ;jne    .put
  529.         ;call   [SF.draw_mouse_under]
  530.         ;mov    [mouse_invisible],1
  531.   .put: mov     ebp,[BytesPerScanLine]
  532.         imul    ebp,ebx
  533.         push    eax
  534.         lea     eax,[eax*3]
  535.         add     ebp,eax
  536.         pop     eax
  537.         add     ebp,[LFBAddress]
  538.   .xxx: push    eax ebp
  539.     @@: push    ebp
  540.         call    [set_bank]
  541.         push    eax edx
  542.         mul     [bg_width]
  543.         div     dword[ScreenWidth]
  544.         lea     edi,[eax*3]
  545.         mov     eax,ebx
  546.         mul     [bg_height]
  547.         div     dword[ScreenHeight]
  548.         mul     [bg_BytesPerScanLine]
  549.         add     edi,eax
  550.         add     edi,IMG_BACKGROUND
  551.         mov     eax,[edi]
  552.         mov     [ebp],eax
  553.         pop     edx eax
  554.         pop     ebp
  555.         add     ebp,3
  556.         inc     eax
  557.         cmp     eax,ecx
  558.         jl      @b
  559.         pop     ebp eax
  560.         add     ebp,[BytesPerScanLine]
  561.         inc     ebx
  562.         cmp     ebx,edx
  563.         jl      .xxx
  564.         popad
  565.   .skip:
  566.         add     esi,SR
  567.         dec     ebp
  568.         jnz     .nx
  569.  
  570.   .exit:
  571.         sti
  572.         popad
  573.         retn
  574.  
  575.   .tiled:
  576.         mov     eax,IMG_BACKGROUND
  577.         mov     ebx,[bg_width-2]
  578.         mov     bx,word[bg_height]
  579.         xor     ecx,ecx
  580.   .lp1: push    eax
  581.         call    vm_mike_put_image.24.direct
  582.         pop     eax
  583.         rol     ecx,16
  584.         add     cx,word[bg_width]
  585.         cmp     cx,word[ScreenWidth]
  586.         jae     @f
  587.         rol     ecx,16
  588.         jmp     .lp1
  589.     @@: shr     ecx,16
  590.         add     ecx,[bg_height]
  591.         cmp     ecx,[ScreenHeight]
  592.         jb      .lp1
  593.         popad
  594.         retn
  595.  
  596.   .color:
  597.         mov     edi,[IMG_BACKGROUND]
  598.         and     edi,0x00FFFFFF
  599.         call    vm_mike_draw_rect.24
  600.         popad
  601.         retn
  602. endf