kolibrios-gitea/kernel/branches/gfx_kernel/vmode/norm_08.inc

747 lines
15 KiB
PHP
Raw Normal View History

;-----------------------------------------------------------------------------
func vm_mike_draw_rect.08 ;///////////////////////////////////////////////////
;-----------------------------------------------------------------------------
; eax - x start
; ebx - y start
; ecx - x end
; edx - y end
; edi - color
;-----------------------------------------------------------------------------
;- eax(ebx) [x start]*65536 + [x size]
;- ebx(ecx) [y start]*65536 + [y size]
;- ecx(edx) color 0x00RRGGBB
;-----------------------------------------------------------------------------
begin
pushad
cli
jif eax,e,ecx,.exit
jif ebx,e,edx,.exit
call get_cursor_rect
mov ebp,[TASK_BASE]
movsx esi,word[ebp-CURRENT_TASK+0]
add eax,esi
add ecx,esi
movsx esi,word[ebp-CURRENT_TASK+4]
add ebx,esi
add edx,esi
; add eax,[ebp-CURRENT_TASK+0]
; add ebx,[ebp-CURRENT_TASK+4]
; add ecx,[ebp-CURRENT_TASK+0]
; add edx,[ebp-CURRENT_TASK+4]
push ecx
mov ecx,edi
call color_24_to_8_bits
mov edi,ecx
pop ecx
mov esi,[CURRENT_TASK]
mov esi,[CLIP_RECTS+esi*4]
mov ebp,[esi]
or ebp,ebp
jz .exit
add esi,4
.nx: jif ecx,l,[rr.left],.skip
jif eax,ge,[rr.right],.skip
jif edx,l,[rr.top],.skip
jif ebx,ge,[rr.bottom],.skip
pushad
jif eax,ge,[rr.left],@f
mov eax,[rr.left]
@@: jif ebx,ge,[rr.top],@f
mov ebx,[rr.top]
@@: jif ecx,l,[rr.right],@f
mov ecx,[rr.right]
@@: jif edx,l,[rr.bottom],@f
mov edx,[rr.bottom]
@@: call is_intersect_rc
jc .put
cmp byte[MOUSE_VISIBLE],0
je .put
call [SF.draw_mouse_under]
mov byte[MOUSE_VISIBLE],0
.put: mov ebp,[BytesPerScanLine]
imul ebp,ebx
add ebp,eax
add ebp,[LFBAddress]
.xxx: push eax ebp
xchg eax,edi
@@: push ebp
call [set_bank]
mov [ebp],al
pop ebp
; mov [ebp],di
inc ebp
inc edi
cmp edi,ecx
jl @b
xchg eax,edi
pop ebp eax
add ebp,[BytesPerScanLine]
inc ebx
cmp ebx,edx
jl .xxx
popad
.skip:
add esi,SR
dec ebp
jnz .nx
.exit:
sti
popad
retn
endf
;-----------------------------------------------------------------------------
func vm_mike_draw_line.08 ;///////////////////////////////////////////////////
;-----------------------------------------------------------------------------
; eax(ebx) [x start] shl 16 + [x end]
; ebx(ecx) [y start] shl 16 + [y end]
; ecx(edx) colour 0x00RRGGBB
; edi = 0x00000001 force
;-----------------------------------------------------------------------------
begin
pushad
cli
call get_cursor_rect
mov eax,ecx
call color_24_to_8_bits
and eax,0x01000000
or ecx,eax
movsx eax,word[esp+4*7] ; x end
cmp ax,[esp+4*7+2] ; x start
je dl.08.vert_line
movsx eax,word[esp+4*4] ; y end
cmp ax,[esp+4*4+2] ; y start
je dl.08.horz_line
sti
popad
retn
dl.08.vert_line:
test edi,1
jnz .forced
mov esi,[CURRENT_TASK]
mov esi,[CLIP_RECTS+esi*4]
mov edi,[esi]
or edi,edi
jz .exit
add esi,4
.nx: movsx ebx,word[esp+4*4+2] ; y start
movsx edx,word[esp+4*4] ; y end
cmp ebx,edx
je .exit
jl @f
xchg ebx,edx
@@: jif eax,l,[rr.left],.skip
jif eax,ge,[rr.right],.skip
jif edx,l,[rr.top],.skip
jif ebx,ge,[rr.bottom],.skip
jif ebx,ge,[rr.top],@f
mov ebx,[rr.top]
@@: jif edx,l,[rr.bottom],@f
mov edx,[rr.bottom]
dec edx
.draw:
@@: call is_intersect_vln
jc .put
cmp byte[MOUSE_VISIBLE],0
je .put
call [SF.draw_mouse_under]
mov byte[MOUSE_VISIBLE],0
.put: mov ebp,[BytesPerScanLine]
imul ebp,ebx
add ebp,eax
add ebp,[LFBAddress]
@@: push ebp
call [set_bank]
test ecx,0x01000000
jz .dr
movzx ecx,byte[ebp]
mov ecx,dword[palette_8_256+ecx*3]
not ecx
call color_24_to_8_bits
or ecx,0x01000000
.dr: mov [ebp],cl
pop ebp
; test ecx,0x01000000
; jz .dr
; mov cx,[ebp]
; not cx
; .dr: mov [ebp],cx
add ebp,[BytesPerScanLine]
inc ebx
cmp ebx,edx
jle @b
.skip:
add esi,SR
dec edi
jnz .nx
.exit:
sti
popad
retn
.forced:
jif eax,l,[viewport.left],.exit
jif eax,ge,[viewport.right],.exit
movsx ebx,word[esp+4*4+2] ; y start
movsx edx,word[esp+4*4] ; y end
jif ebx,e,edx,.exit
jl @f
xchg ebx,edx
@@: jif edx,l,[viewport.top],.exit
jif ebx,ge,[viewport.bottom],.exit
jif ebx,ge,[viewport.top],@f
mov ebx,[viewport.top]
@@: jif edx,l,[viewport.bottom],@f
mov edx,[viewport.bottom]
dec edx
@@: mov edi,1
jmp .draw
dl.08.horz_line:
test edi,1
jnz .forced
mov esi,[CURRENT_TASK]
mov esi,[CLIP_RECTS+esi*4]
mov edi,[esi]
or edi,edi
jz .exit
add esi,4
.nx: movsx ebx,word[esp+4*7+2] ; x start
movsx edx,word[esp+4*7] ; x end
cmp ebx,edx
je .exit
jl @f
xchg ebx,edx
@@: jif eax,l,[rr.top],.skip
jif eax,ge,[rr.bottom],.skip
jif edx,l,[rr.left],.skip
jif ebx,ge,[rr.right],.skip
jif ebx,ge,[rr.left],@f
mov ebx,[rr.left]
@@: jif edx,l,[rr.right],@f
mov edx,[rr.right]
dec edx
.draw:
@@: call is_intersect_hln
jc .put
cmp byte[MOUSE_VISIBLE],0
je .put
call [SF.draw_mouse_under]
mov byte[MOUSE_VISIBLE],0
.put: mov ebp,[BytesPerScanLine]
imul ebp,eax
add ebp,ebx
add ebp,[LFBAddress]
@@: push ebp
call [set_bank]
test ecx,0x01000000
jz .dr
movzx ecx,byte[ebp]
mov ecx,dword[palette_8_256+ecx*3]
not ecx
call color_24_to_8_bits
or ecx,0x01000000
.dr: mov [ebp],cl
pop ebp
; test ecx,0x01000000
; jz .dr
; mov cx,[ebp]
; not cx
; .dr: mov [ebp],cx
inc ebp
inc ebx
cmp ebx,edx
jle @b
.skip:
add esi,SR
dec edi
jnz .nx
.exit:
sti
popad
retn
.forced:
jif eax,l,[viewport.top],.exit
jif eax,ge,[viewport.bottom],.exit
movsx ebx,word[esp+4*7+2] ; x start
movsx edx,word[esp+4*7] ; x end
cmp ebx,edx
je .exit
jl @f
xchg ebx,edx
@@: jif edx,l,[viewport.left],.exit
jif ebx,ge,[viewport.right],.exit
jif ebx,ge,[viewport.left],@f
mov ebx,[viewport.left]
@@: jif edx,l,[viewport.right],@f
mov edx,[viewport.right]
dec edx
@@: mov edi,1
jmp .draw
endf
func color_24_to_8_bits
begin
push ecx
cmp byte[esp+2],0 ; red=0 ?
pop ecx
jne .lp1
cmp ch,0 ; green=0 ?
jne @f
shr cl,2
add cl,192
ret
@@: cmp cl,0 ; blue=0 ?
jne .lp1
shr cx,8+2
add cl,128
ret
.lp1: cmp cx,0 ; green=0 && blue=0 ?
jne @f
shr ecx,16+2
and cl,0x3F
add cl,64
ret
@@: and ecx,0x00FFFFFF
shr ecx,6
shl cx,6
shr ecx,6
shl cl,6
shr ecx,6
ret
endf
;-----------------------------------------------------------------------------
func vm_mike_put_pixel.08 ;///////////////////////////////////////////////////
;-----------------------------------------------------------------------------
; eax = x coordinate
; ebx = y coordinate
; ecx = ?? RR GG BB ; 0x01000000 negation
; edi = 0x00000001 force
;-----------------------------------------------------------------------------
begin
pushad
cli
mov edx,[BytesPerScanLine]
imul edx,ebx
add edx,eax
add edx,[LFBAddress]
test edi,1
jnz .forced
mov esi,[CURRENT_TASK]
mov esi,[CLIP_RECTS+esi*4]
mov edi,[esi]
or edi,edi
jz .exit
add esi,4
@@: jif eax,l,[rr.left],.skip
jif eax,ge,[rr.right],.skip
jif ebx,l,[rr.top],.skip
jif ebx,ge,[rr.bottom],.skip
call get_cursor_rect
call is_intersect_pt
jc .put
cmp byte[MOUSE_VISIBLE],0
je .put
call [SF.draw_mouse_under]
mov byte[MOUSE_VISIBLE],0
.put: push edx
call [set_bank]
pop edx
test ecx,0x01000000
jz .lp1
not byte[ebp]
jmp .exit
.lp1: call color_24_to_8_bits
mov [ebp],cl
.exit:
sti
popad
retn
.skip:
add esi,SR
dec edi
jnz @b
jmp .exit
.forced:
jif eax,l,[viewport.left],.exit
jif ebx,l,[viewport.top],.exit
jif eax,ge,[viewport.right],.exit
jif ebx,ge,[viewport.bottom],.exit
push edx
call [set_bank]
pop edx
test ecx,0x01000000
jz @f
movzx eax,byte[ebp]
mov ecx,dword[palette_8_256+eax*3]
not ecx
call color_24_to_8_bits
mov byte[ebp],cl
;not byte[ebp]
jmp .exit
@@: call color_24_to_8_bits
mov [ebp],cl
jmp .exit
endf
;-----------------------------------------------------------------------------
func vm_mike_get_pixel.08 ;///////////////////////////////////////////////////
;-----------------------------------------------------------------------------
; eax = x coordinate
; ebx = y coordinate
;-----------------------------------------------------------------------------
begin
pushad
cli
imul ebx,[BytesPerScanLine]
add eax,ebx
add eax,[LFBAddress]
push eax
call [set_bank]
pop eax
movzx eax,byte[ebp]
mov eax,dword[palette_8_256+eax*3]
and eax,0x00FFFFFF
mov [esp+4*6],eax
sti
popad
retn
endf
;-----------------------------------------------------------------------------
func vm_mike_put_image.08 ;///////////////////////////////////////////////////
;-----------------------------------------------------------------------------
; eax(ebx) pointer to image in memory - RRGGBBRRGGBB..
; ebx(ecx) image size [x]*65536+[y]
; ecx(edx) image position in window [x]*65536+[y]
; ret: eax 0 succesful, 1 overlapped
;-----------------------------------------------------------------------------
begin
mov eax,ebx
mov ebx,ecx
mov ecx,edx
.direct:
pushad
cli
jif ebx,z,0x0000FFFF,.exit,test
jif ebx,z,0xFFFF0000,.exit,test
call get_cursor_rect
mov ebp,eax
movsx eax,word[esp+4*6+2]
movsx ebx,word[esp+4*6]
movsx ecx,word[esp+4*4+2]
movsx edx,word[esp+4*4]
lea edi,[ecx*3]
push edi
add ecx,eax
add edx,ebx
mov edi,[TASK_BASE]
movsx esi,word[edi-CURRENT_TASK+0]
add eax,esi
add ecx,esi
movsx esi,word[edi-CURRENT_TASK+4]
add ebx,esi
add edx,esi
; add eax,[esi-CURRENT_TASK+0]
; add ebx,[esi-CURRENT_TASK+4]
; add ecx,[esi-CURRENT_TASK+0]
; add edx,[esi-CURRENT_TASK+4]
mov esi,[CURRENT_TASK]
mov esi,[CLIP_RECTS+esi*4]
mov edi,[esi]
or edi,edi
jz .exit
add esi,4
cld
.nx: jif ecx,l,[rr.left],.skip
jif eax,ge,[rr.right],.skip
jif edx,l,[rr.top],.skip
jif ebx,ge,[rr.bottom],.skip
pushad
jif eax,ge,[rr.left],@f
mov eax,[rr.left]
@@: jif ebx,ge,[rr.top],@f
mov ebx,[rr.top]
@@: jif ecx,l,[rr.right],@f
mov ecx,[rr.right]
@@: jif edx,l,[rr.bottom],@f
mov edx,[rr.bottom]
@@: call is_intersect_rc
jc .put
cmp byte[MOUSE_VISIBLE],0
je .put
call [SF.draw_mouse_under]
mov byte[MOUSE_VISIBLE],0
.put: mov esi,ebx
sub esi,[esp+4*4]
imul esi,[esp+4*8]
mov edi,eax
sub edi,[esp+4*7]
lea edi,[edi*3]
add esi,edi
add esi,ebp
mov edi,[BytesPerScanLine]
imul edi,ebx
add edi,eax
add edi,[LFBAddress]
.xxx: push eax esi edi eax
@@: lodsd
xchg eax,ecx
call color_24_to_8_bits
xchg eax,ecx
push ebp edi
call [set_bank]
mov [ebp],al
pop edi ebp
inc edi
dec esi
inc dword[esp]
cmp [esp],ecx
jl @b
pop eax edi esi eax
add esi,[esp+4*8]
add edi,[BytesPerScanLine]
inc ebx
cmp ebx,edx
jl .xxx
popad
.skip:
add esi,SR
dec edi
jnz .nx
.exit:
add esp,4
sti
popad
xor eax,eax
retn
endf
;-----------------------------------------------------------------------------
func vm_mike_draw_bg.08 ;/////////////////////////////////////////////////////
;-----------------------------------------------------------------------------
begin
pushad
mov eax,[viewport.left]
mov ebx,[viewport.top]
mov ecx,[viewport.right]
mov edx,[viewport.bottom]
cli
call [SF.draw_mouse_under]
mov byte[MOUSE_VISIBLE],0
mov esi,[CLIP_RECTS+4]
mov ebp,[esi]
or ebp,ebp
jz .exit
add esi,4
.nx: pushad
; jif eax,ge,[rr.left],@f
; mov eax,[rr.left]
; @@: jif ebx,ge,[rr.top],@f
; mov ebx,[rr.top]
; @@: jif ecx,l,[rr.right],@f
; mov ecx,[rr.right]
; @@: jif edx,l,[rr.bottom],@f
; mov edx,[rr.bottom]
; @@:
mov eax,[rr.left]
mov ebx,[rr.top]
mov ecx,[rr.right]
mov edx,[rr.bottom]
dec ecx
dec edx
mov edi,0x007F7F7F
call vm_mike_draw_rect.08
xor edi,edi
pushad
shl eax,16
mov ax,cx
push bx
shl ebx,16
pop bx
mov ecx,0x00CCCCCC
call vm_mike_draw_line.08
add ebx,0x00010001
call vm_mike_draw_line.08
popad
pushad
shl ebx,16
mov bx,dx
push ax
shl eax,16
pop ax
mov ecx,0x00CCCCCC
call vm_mike_draw_line.08
add eax,0x00010001
call vm_mike_draw_line.08
popad
pushad
shl eax,16
mov ax,cx
mov ebx,edx
shl ebx,16
mov bx,dx
mov ecx,0x00333333
call vm_mike_draw_line.08
sub ebx,0x00010001
add eax,0x00010000
call vm_mike_draw_line.08
popad
pushad
mov eax,ecx
shl eax,16
mov ax,cx
shl ebx,16
mov bx,dx
mov ecx,0x00333333
call vm_mike_draw_line.08
sub eax,0x00010001
add ebx,0x00010000
call vm_mike_draw_line.08
popad
popad
.skip:
add esi,SR
dec ebp
jnz .nx
.exit:
sti
popad
retn
macro sdfsdSAFSDFG {
pushad
cmp byte[bg_type],BGT_TILE
je .tiled
mov eax,[bg_width]
cmp eax,[screen_width]
jne @f
mov eax,[bg_height]
cmp eax,[screen_height]
je .tiled
@@:
imul eax,[bg_width],3
mov [bg_BytesPerScanLine],eax
mov eax,[viewport.left]
mov ebx,[viewport.top]
mov ecx,[viewport.right]
mov edx,[viewport.bottom]
cmp [bg_width],1
jne @f
cmp [bg_height],1
je .color
@@:
cli
call [SF.draw_mouse_under]
mov [mouse_invisible],1
mov esi,[CLIP_RECTS+4]
mov ebp,[esi]
or ebp,ebp
jz .exit
add esi,4
.nx: jif ecx,l,[rr.left],.skip
jif eax,ge,[rr.right],.skip
jif edx,l,[rr.top],.skip
jif ebx,ge,[rr.bottom],.skip
pushad
jif eax,ge,[rr.left],@f
mov eax,[rr.left]
@@: jif ebx,ge,[rr.top],@f
mov ebx,[rr.top]
@@: jif ecx,l,[rr.right],@f
mov ecx,[rr.right]
@@: jif edx,l,[rr.bottom],@f
mov edx,[rr.bottom]
@@: call is_intersect_rc
jc .put
cmp [mouse_invisible],0
jne .put
call [SF.draw_mouse_under]
mov [mouse_invisible],1
.put: mov ebp,[BytesPerScanLine]
imul ebp,ebx
add ebp,eax
add ebp,[LFBAddress]
.xxx: push eax ebp
@@: push ebp
call [set_bank]
mov [ebp],di
pop ebp
; mov [ebp],di
inc ebp
inc eax
cmp eax,ecx
jl @b
pop ebp eax
add ebp,[BytesPerScanLine]
inc ebx
cmp ebx,edx
jl .xxx
popad
.skip:
add esi,SR
dec ebp
jnz .nx
.exit:
sti
popad
retn
.tiled:
mov eax,IMG_BACKGROUND
mov ebx,[bg_width-2]
mov bx,word[bg_height]
xor ecx,ecx
.lp1: push eax
call vm_mike_put_image.08.direct
pop eax
rol ecx,16
add cx,word[bg_width]
cmp cx,word[screen_width]
jae @f
rol ecx,16
jmp .lp1
@@: shr ecx,16
add ecx,[bg_height]
cmp ecx,[screen_height]
jb .lp1
popad
retn
.color:
mov edi,[IMG_BACKGROUND]
and edi,0x00FFFFFF
call vm_mike_draw_rect.08
popad
retn
}
endf