From c8ddc270155a483a3210f688060b9cdffe7e9264 Mon Sep 17 00:00:00 2001 From: "Rustem Gimadutdinov (rgimad)" Date: Mon, 27 Dec 2021 15:34:18 +0000 Subject: [PATCH] [KERNEL] Sysfn 15, 25, 39 (working with background graphics) moved from kernel.asm to gui/background.inc file git-svn-id: svn://kolibrios.org@9486 a494cfbc-eb01-0410-851d-a64ba20cac60 --- kernel/trunk/kernel.asm | 589 -------------------------------------- kernel/trunk/kernel32.inc | 1 + 2 files changed, 1 insertion(+), 589 deletions(-) diff --git a/kernel/trunk/kernel.asm b/kernel/trunk/kernel.asm index a27a832a7c..e82fba881a 100644 --- a/kernel/trunk/kernel.asm +++ b/kernel/trunk/kernel.asm @@ -2692,506 +2692,7 @@ sys_cachetodiskette: mov [esp + 32], dword 1 ret ;------------------------------------------------------------------------------ -uglobal -; bgrchanged dd 0x0 -align 4 -bgrlockpid dd 0 -bgrlock db 0 -endg -;------------------------------------------------------------------------------ -align 4 -sys_background: - cmp ebx, 1 ; BACKGROUND SIZE - jnz nosb1 - test ecx, ecx - jz sbgrr - test edx, edx - jz sbgrr -;-------------------------------------- -align 4 -@@: -;;Maxis use atomic bts for mutexes 4.4.2009 - bts dword [bgrlock], 0 - jnc @f - call change_task - jmp @b -;-------------------------------------- -align 4 -@@: - mov [BgrDataWidth], ecx - mov [BgrDataHeight], edx -; mov [bgrchanged],1 - - pushad -; return memory for old background - mov eax, [img_background] - cmp eax, static_background_data - jz @f - stdcall kernel_free, eax -;-------------------------------------- -align 4 -@@: -; calculate RAW size - xor eax, eax - inc eax - cmp [BgrDataWidth], eax - jae @f - mov [BgrDataWidth], eax -;-------------------------------------- -align 4 -@@: - cmp [BgrDataHeight], eax - jae @f - mov [BgrDataHeight], eax -;-------------------------------------- -align 4 -@@: - mov eax, [BgrDataWidth] - imul eax, [BgrDataHeight] - lea eax, [eax*3] -; it is reserved with aligned to the boundary of 4 KB pages, -; otherwise there may be exceptions a page fault for vesa20_drawbackground_tiled -; because the 32 bit read is used for high performance: "mov eax,[esi]" - shr eax, 12 - inc eax - shl eax, 12 - mov [mem_BACKGROUND], eax -; get memory for new background - stdcall kernel_alloc, eax - test eax, eax - jz .memfailed - mov [img_background], eax - jmp .exit -;-------------------------------------- -align 4 -.memfailed: -; revert to static monotone data - mov [img_background], static_background_data - xor eax, eax - inc eax - mov [BgrDataWidth], eax - mov [BgrDataHeight], eax - mov [mem_BACKGROUND], 4 -;-------------------------------------- -align 4 -.exit: - popad - mov [bgrlock], 0 -;-------------------------------------- -align 4 -sbgrr: - ret -;------------------------------------------------------------------------------ -align 4 -nosb1: - cmp ebx, 2 ; SET PIXEL - jnz nosb2 - - mov eax, [img_background] - test ecx, ecx - jz @f - cmp eax, static_background_data - jz .ret -;-------------------------------------- -align 4 -@@: - mov ebx, [mem_BACKGROUND] - add ebx, 4095 - and ebx, -4096 - sub ebx, 4 - cmp ecx, ebx - ja .ret - - mov ebx, [eax+ecx] - and ebx, 0xFF000000;255*256*256*256 - and edx, 0x00FFFFFF;255*256*256+255*256+255 - add edx, ebx - mov [eax+ecx], edx -;-------------------------------------- -align 4 -.ret: - ret -;------------------------------------------------------------------------------ -align 4 -nosb2: - cmp ebx, 3 ; DRAW BACKGROUND - jnz nosb3 -;-------------------------------------- -align 4 -draw_background_temp: - mov [background_defined], 1 - call force_redraw_background -;-------------------------------------- -align 4 -nosb31: - ret -;------------------------------------------------------------------------------ -align 4 -nosb3: - cmp ebx, 4 ; TILED / STRETCHED - jnz nosb4 - cmp ecx, [BgrDrawMode] - je nosb41 - mov [BgrDrawMode], ecx -;-------------------------------------- -align 4 -nosb41: - ret -;------------------------------------------------------------------------------ -align 4 -nosb4: - cmp ebx, 5 ; BLOCK MOVE TO BGR - jnz nosb5 - -; add check pointer - stdcall is_region_userspace, ecx, esi - jnz .fin - - cmp [img_background], static_background_data - jnz @f - test edx, edx - jnz .fin - cmp esi, 4 - ja .fin -;-------------------------------------- -align 4 -@@: - ; bughere - mov eax, ecx - mov ebx, edx - add ebx, [img_background];IMG_BACKGROUND - mov ecx, esi - call memmove -;-------------------------------------- -align 4 -.fin: - ret -;------------------------------------------------------------------------------ -align 4 -nosb5: - cmp ebx, 6 - jnz nosb6 -;-------------------------------------- -align 4 -;;Maxis use atomic bts for mutex 4.4.2009 -@@: - bts dword [bgrlock], 0 - jnc @f - call change_task - jmp @b -;-------------------------------------- -align 4 -@@: - mov eax, [current_slot_idx] - mov [bgrlockpid], eax - cmp [img_background], static_background_data - jz .nomem - stdcall user_alloc, [mem_BACKGROUND] - mov [esp+32], eax - test eax, eax - jz .nomem - mov ebx, eax - shr ebx, 12 - or dword [page_tabs+(ebx-1)*4], MEM_BLOCK_DONT_FREE - mov esi, [img_background] - shr esi, 12 - mov ecx, [mem_BACKGROUND] - add ecx, 0xFFF - shr ecx, 12 -;-------------------------------------- -align 4 -.z: - mov eax, [page_tabs+ebx*4] - test al, 1 - jz @f - call free_page -;-------------------------------------- -align 4 -@@: - mov eax, [page_tabs+esi*4] - or al, PG_UWR - mov [page_tabs+ebx*4], eax - mov eax, ebx - shl eax, 12 - invlpg [eax] - inc ebx - inc esi - loop .z - ret -;-------------------------------------- -align 4 -.nomem: - and [bgrlockpid], 0 - mov [bgrlock], 0 -;------------------------------------------------------------------------------ -align 4 -nosb6: - cmp ebx, 7 - jnz nosb7 - cmp [bgrlock], 0 - jz .err - mov eax, [current_slot_idx] - cmp [bgrlockpid], eax - jnz .err - mov eax, ecx - mov ebx, ecx - shr eax, 12 - mov ecx, [page_tabs+(eax-1)*4] - test cl, MEM_BLOCK_USED or MEM_BLOCK_DONT_FREE - jz .err - jnp .err - push eax - shr ecx, 12 - dec ecx -;-------------------------------------- -align 4 -@@: - and dword [page_tabs+eax*4], 0 - mov edx, eax - shl edx, 12 - push eax - invlpg [edx] - pop eax - inc eax - loop @b - pop eax - and dword [page_tabs+(eax-1)*4], not MEM_BLOCK_DONT_FREE - stdcall user_free, ebx - mov [esp+32], eax - and [bgrlockpid], 0 - mov [bgrlock], 0 - ret -;-------------------------------------- -align 4 -.err: - and dword [esp+32], 0 - ret -;------------------------------------------------------------------------------ -align 4 -nosb7: - cmp ebx, 8 - jnz nosb8 - - mov ecx, [current_slot] - xor eax, eax - xchg eax, [ecx+APPDATA.draw_bgr_x] - mov [esp + 32], eax ; eax = [left]*65536 + [right] - xor eax, eax - xchg eax, [ecx+APPDATA.draw_bgr_y] - mov [esp + 20], eax ; ebx = [top]*65536 + [bottom] - ret -;------------------------------------------------------------------------------ -align 4 -nosb8: - cmp ebx, 9 - jnz nosb9 -; ecx = [left]*65536 + [right] -; edx = [top]*65536 + [bottom] - mov eax, [_display.width] - mov ebx, [_display.height] -; check [right] - cmp cx, ax - jae .exit -; check [left] - ror ecx, 16 - cmp cx, ax - jae .exit -; check [bottom] - cmp dx, bx - jae .exit -; check [top] - ror edx, 16 - cmp dx, bx - jae .exit - - movzx eax, cx ; [left] - movzx ebx, dx ; [top] - - shr ecx, 16 ; [right] - shr edx, 16 ; [bottom] - - mov [background_defined], 1 - - mov [draw_data+32 + RECT.left], eax - mov [draw_data+32 + RECT.top], ebx - - mov [draw_data+32 + RECT.right], ecx - mov [draw_data+32 + RECT.bottom], edx - - inc [REDRAW_BACKGROUND] - call wakeup_osloop -;-------------------------------------- -align 4 -.exit: - ret -;------------------------------------------------------------------------------ -align 4 -nosb9: - ret -;------------------------------------------------------------------------------ -align 4 -uglobal - BG_Rect_X_left_right dd 0x0 - BG_Rect_Y_top_bottom dd 0x0 -endg -;------------------------------------------------------------------------------ -align 4 -force_redraw_background: - and [draw_data+32 + RECT.left], 0 - and [draw_data+32 + RECT.top], 0 - push eax ebx - mov eax, [_display.width] - mov ebx, [_display.height] - dec eax - dec ebx - mov [draw_data+32 + RECT.right], eax - mov [draw_data+32 + RECT.bottom], ebx - pop ebx eax - inc [REDRAW_BACKGROUND] - call wakeup_osloop - ret -;------------------------------------------------------------------------------ -align 4 -sys_getbackground: ; sysfn 39 - dec ebx - jnz .nogb1 - ; sysfn 39.1: - mov eax, [BgrDataWidth] - shl eax, 16 - mov ax, word [BgrDataHeight] - mov [esp+32], eax - ret -;------------------------------------------------------------------------------ -align 4 -.nogb1: - dec ebx - jnz .nogb2 - ; sysfn 39.2: - mov eax, [img_background] - test ecx, ecx - jz @f - cmp eax, static_background_data - jz .ret -align 4 -@@: - mov ebx, [mem_BACKGROUND] - add ebx, 4095 - and ebx, -4096 - sub ebx, 4 - cmp ecx, ebx - ja .ret - - mov eax, [ecx+eax] - - and eax, 0xFFFFFF - mov [esp+32], eax -align 4 -.ret: - ret -;------------------------------------------------------------------------------ -align 4 - .x dd ? - .y dd ? - .w dd ? - .h dd ? - .subrect_startptr dd ? - .subrect_bytes dd ? -align 4 -.nogb2: - dec ebx - jnz .nogb3 - ; sysfn 39.3 read background subrect to buffer - ; ecx - - ; edx - - ; esi - buffer of 0x00RRGGBB - mov eax, [img_background] - cmp eax, static_background_data - jz .ret_39_3 -align 4 -@@: - movzx eax, cx ; store y in eax - mov [.y], eax - - shr ecx, 16 ; ecx = x - mov [.x], ecx - - imul eax, [BgrDataWidth] - add eax, ecx - imul eax, 3 - mov [.subrect_startptr], eax - - movzx eax, dx ; store h in eax - mov [.h], eax - - shr edx, 16 ; edx = w - mov [.w], edx - - imul eax, edx - mov [.subrect_bytes], eax - - ; check bounds - mov ebx, [mem_BACKGROUND] - add ebx, 4095 - and ebx, -4096 - sub ebx, 4 - add eax, [.subrect_startptr] - cmp eax, ebx - ja .fail_39_3 - - ; copy contents - mov edi, [img_background] - xor ecx, ecx ; ecx - row index -.copy_rect: - cmp ecx, [.h] - jae .end_copy_rect - - xor edx, edx ; edx - column index -.copy_row: - cmp edx, [.w] - jae .end_copy_row - - mov ebx, ecx - imul ebx, [BgrDataWidth] - add ebx, edx - imul ebx, 3 - add ebx, [.subrect_startptr] - mov eax, [edi + ebx] - mov ebx, ecx - imul ebx, [.w] - add ebx, edx - and eax, 0xFFFFFF - mov [esi + ebx*4], eax - - inc edx - jmp .copy_row -.end_copy_row: - - inc ecx - jmp .copy_rect -.end_copy_rect: - xor eax, eax - mov [esp+32], eax -;-------------------------------------- -align 4 -.fail_39_3: - mov eax, -1 -align 4 -.ret_39_3: - ret -;-------------------------------------- -align 4 -.nogb3: - dec ebx - jnz .nogb4 - ; sysfn 39.4: - mov eax, [BgrDrawMode] -;-------------------------------------- -align 4 -.nogb4: - mov [esp+32], eax - ret -;------------------------------------------------------------------------------ align 4 sys_getkey: mov [esp + 32], dword 1 @@ -5465,96 +4966,6 @@ align 4 dec edx jnz .start_y -.exit: - popad - ret -;----------------------------------------------------------------------------- -align 4 -syscall_putarea_backgr: -;eax = 25 -;ebx = pointer to bufer for img BBGGRRBBGGRR... -;ecx = [size x]*65536 + [size y] -;edx = [start x]*65536 + [start y] - pushad - mov edi, ebx - mov eax, edx - shr eax, 16 - mov ebx, edx - and ebx, 0xffff - dec eax - dec ebx -; eax - x, ebx - y - mov edx, ecx - shr ecx, 16 - and edx, 0xffff - mov esi, ecx -; ecx - size x, edx - size y - mov ebp, edx - - lea ebp, [ebp*4] - imul ebp, esi - stdcall is_region_userspace, edi, ebp - jnz .exit - - mov ebp, edx - - dec ebp - shl ebp, 2 - - imul ebp, esi - - mov esi, ecx - dec esi - shl esi, 2 - - add ebp, esi - add ebp, edi - - add ebx, edx -;-------------------------------------- -align 4 -.start_y: - push ecx edx -;-------------------------------------- -align 4 -.start_x: - push eax ecx - add eax, ecx - - mov ecx, [ebp] - rol ecx, 8 - test cl, cl ; transparensy = 0 - jz .no_put - - xor cl, cl - ror ecx, 8 - - pushad - mov edx, [d_width_calc_area + ebx*4] - add edx, [_display.win_map] - movzx edx, byte [eax+edx] - cmp dl, byte 1 - jne @f - - call dword [PUTPIXEL]; eax - x, ebx - y -;-------------------------------------- -align 4 -@@: - popad -;-------------------------------------- -align 4 -.no_put: - pop ecx eax - - sub ebp, 4 - dec ecx - jnz .start_x - - pop edx ecx - dec ebx - dec edx - jnz .start_y - .exit: popad ret diff --git a/kernel/trunk/kernel32.inc b/kernel/trunk/kernel32.inc index 5b920094c4..d82f5de1e9 100644 --- a/kernel/trunk/kernel32.inc +++ b/kernel/trunk/kernel32.inc @@ -47,6 +47,7 @@ include "gui/font.inc" include "gui/button.inc" include "gui/mouse.inc" ; cursor include "gui/skincode.inc" ; windows' skin +include "gui/background.inc" include "hid/keyboard.inc" include "hid/mousedrv.inc"