From 925adfd15a3281e9950af1b3c6bc8a07fc1ab95c Mon Sep 17 00:00:00 2001 From: "Evgeny Grechnikov (Diamond)" Date: Mon, 18 Jun 2007 16:39:42 +0000 Subject: [PATCH] changed background handling git-svn-id: svn://kolibrios.org@546 a494cfbc-eb01-0410-851d-a64ba20cac60 --- kernel/trunk/core/heap.inc | 10 +- kernel/trunk/core/sys32.inc | 5 + kernel/trunk/docs/sysfuncr.txt | 42 ++++++- kernel/trunk/docs/sysfuncs.txt | 32 +++++- kernel/trunk/kernel.asm | 91 ++++++++++++++- kernel/trunk/video/vesa20.inc | 203 ++++++++++++++++----------------- 6 files changed, 268 insertions(+), 115 deletions(-) diff --git a/kernel/trunk/core/heap.inc b/kernel/trunk/core/heap.inc index 74186f7d80..7cd6e1c717 100644 --- a/kernel/trunk/core/heap.inc +++ b/kernel/trunk/core/heap.inc @@ -20,6 +20,7 @@ struc MEM_BLOCK MEM_LIST_OFFSET equ 8 FREE_BLOCK equ 4 USED_BLOCK equ 8 +DONT_FREE_BLOCK equ 10h virtual at 0 MEM_BLOCK MEM_BLOCK @@ -728,8 +729,10 @@ proc user_free stdcall, base:dword sub esi, 4096 shr esi, 12 mov eax, [page_tabs+esi*4] - test eax, USED_BLOCK + test al, USED_BLOCK jz .not_used + test al, DONT_FREE_BLOCK + jnz .cantfree and eax, not 4095 mov ecx, eax @@ -765,6 +768,9 @@ proc user_free stdcall, base:dword xor eax, eax inc eax ret +.cantfree: + xor eax, eax + ret endp user_normalize: @@ -836,6 +842,8 @@ user_realloc: xor eax, eax ret @@: + test edx, DONT_FREE_BLOCK + jnz .ret0 add ebx, 0x1FFF shr edx, 12 shr ebx, 12 diff --git a/kernel/trunk/core/sys32.inc b/kernel/trunk/core/sys32.inc index 9ef6c70741..9428c49456 100644 --- a/kernel/trunk/core/sys32.inc +++ b/kernel/trunk/core/sys32.inc @@ -720,6 +720,11 @@ term9: mov [flp_status], 0 @@: pop esi + cmp [bgrlockpid], esi + jnz @f + and [bgrlockpid], 0 + mov [bgrlock], 0 +@@: pusha ; remove all irq reservations mov eax,esi diff --git a/kernel/trunk/docs/sysfuncr.txt b/kernel/trunk/docs/sysfuncr.txt index 59861c7416..337ebf29d7 100644 --- a/kernel/trunk/docs/sysfuncr.txt +++ b/kernel/trunk/docs/sysfuncr.txt @@ -1,4 +1,4 @@ -СИСТЕМНЫЕ ФУНКЦИИ ОПЕРАЦИОННОЙ СИСТЕМЫ Kolibri 0.6.5.0 +СИСТЕМНЫЕ ФУНКЦИИ ОПЕРАЦИОННОЙ СИСТЕМЫ Kolibri 0.7.0.0 Номер функции помещается в регистр eax. Вызов системной функции осуществляется командой "int 0x40". @@ -574,6 +574,34 @@ * Для обновления экрана (после завершения серии команд, работающих с фоном) вызывайте подфункцию 3 перерисовки фона. +====================================================================== +====================== Функция 15, подфункция 6 ====================== +==== Спроецировать данные фона на адресное пространство процесса. ==== +====================================================================== +Параметры: + * eax = 15 - номер функции + * ebx = 6 - номер подфункции +Возвращаемое значение: + * eax = указатель на данные фона, 0 при ошибке +Замечания: + * Спроецированные данные доступны на чтение и запись. + * Размер данных фона равен 3*xsize*ysize. Изменение размеров фона + блокируется на время работы с спроецированными данными. + * Цвет каждого пикселя хранится как 3-байтовая величина BBGGRR. + * Пиксели фонового изображения записываются последовательно + слева направо, сверху вниз. + +====================================================================== +====================== Функция 15, подфункция 7 ====================== +=== Закрыть проекцию данных фона на адресное пространство процесса. == +====================================================================== +Параметры: + * eax = 15 - номер функции + * ebx = 7 - номер подфункции + * ecx = указатель на данные фона +Возвращаемое значение: + * eax = 1 при успехе, 0 при ошибке + ====================================================================== ============= Функция 16 - сохранить рамдиск на дискету. ============= ====================================================================== @@ -839,7 +867,7 @@ Структура буфера: db a,b,c,d для версии a.b.c.d db UID_xxx: одно из UID_NONE=0, UID_MENUET=1, UID_KOLIBRI=2 -dd REV - номер svn ревизии ядра +dd REV - номер svn-ревизии ядра Для ядра Kolibri 0.7.0.0: db 0,7,0,0 db 2 @@ -2305,12 +2333,11 @@ dword- Параметры: * eax = 48 - номер функции * ebx = 8 - номер подфункции - * ecx = указатель на блок для функции 58, в котором установлено - поле промежуточного буфера и указано имя файла + * ecx = указатель на имя файла скина Возвращаемое значение: * eax = 0 - успешно - * иначе eax = код ошибки файловой системы; если файл не задаёт скин, - то возвращается ошибка 3 (неизвестная файловая система). + * eax = 1 - не удалось загрузить файл + * eax = 2 - файл не является файлом скина Замечания: * При успешной загрузке скина все окна извещаются о необходимости перерисовки (событие 1). @@ -4064,11 +4091,14 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * /CD0/1, /CD1/1, /CD2/1, /CD3/1 для доступа соответственно к CD на IDE0 (Primary Master), IDE1 (Primary Slave), IDE2 (Secondary Master), IDE3 (Secondary Slave) + * /SYS - определяет системную папку; при обычной загрузке системы + с дискеты эквивалентно /RD/1 Примеры: * '/rd/1/kernel.asm',0 * '/HD0/1/kernel.asm',0 * '/hd0/2/menuet/pics/tanzania.bmp',0 * '/hd0/1/Program files/NameOfProgram/SomeFile.SomeExtension',0 + * '/sys/MySuperApp.ini',0 Доступные подфункции: * подфункция 0 - чтение файла * подфункция 1 - чтение папки diff --git a/kernel/trunk/docs/sysfuncs.txt b/kernel/trunk/docs/sysfuncs.txt index b39cf8c618..8da24613b0 100644 --- a/kernel/trunk/docs/sysfuncs.txt +++ b/kernel/trunk/docs/sysfuncs.txt @@ -1,4 +1,4 @@ -SYSTEM FUNCTIONS of OS Kolibri 0.6.5.0 +SYSTEM FUNCTIONS of OS Kolibri 0.7.0.0 Number of the function is located in the register eax. The call of the system function is executed by "int 0x40" command. @@ -567,6 +567,33 @@ Remarks: * For update of the screen (after completion of a series of commands working with a background) call subfunction 3. +====================================================================== +===================== Function 15, subfunction 6 ===================== +======== Map background data to the address space of process. ======== +====================================================================== +Parameters: + * eax = 15 - function number + * ebx = 6 - subfunction number +Returned value: + * eax = pointer to background data, 0 if error +Remarks: + * Mapped data are available for read and write. + * Size of background data is 3*xsize*ysize. The system blocks + changes of background sizes while process works with mapped data. + * Color of each pixel is stored as 3-bytes value BBGGRR. + * Pixels of the background image are written sequentially + from left to right, from up to down. + +====================================================================== +===== Function 15, subfunction 7 - close mapped background data. ===== +====================================================================== +Parameters: + * eax = 15 - function number + * ebx = 7 - subfunction number + * ecx = pointer to mapped data +Returned value: + * eax = 1 - success, 0 - error + ====================================================================== =============== Function 16 - save ramdisk on a floppy. ============== ====================================================================== @@ -4025,11 +4052,14 @@ one of * /CD0/1, /CD1/1, /CD2/1, /CD3/1 to access accordingly to CD on IDE0 (Primary Master), IDE1 (Primary Slave), IDE2 (Secondary Master), IDE3 (Secondary Slave) + * /SYS means system folder; with the usual boot (from floppy) + is equivalent to /RD/1 Examples: * '/rd/1/kernel.asm',0 * '/HD0/1/kernel.asm',0 * '/hd0/2/menuet/pics/tanzania.bmp',0 * '/hd0/1/Program files/NameOfProgram/SomeFile.SomeExtension',0 + * '/sys/MySuperApp.ini',0 Available subfunctions: * subfunction 0 - read file * subfunction 1 - read folder diff --git a/kernel/trunk/kernel.asm b/kernel/trunk/kernel.asm index 03b19fe4c0..ab68475611 100644 --- a/kernel/trunk/kernel.asm +++ b/kernel/trunk/kernel.asm @@ -2346,6 +2346,8 @@ sys_cachetodiskette: uglobal ; bgrchanged dd 0x0 +bgrlock db 0 +bgrlockpid dd 0 endg sys_background: @@ -2356,6 +2358,14 @@ sys_background: je sbgrr cmp ecx,0 je sbgrr +@@: + mov al, 1 + xchg [bgrlock], al + test al, al + jz @f + call change_task + jmp @b +@@: mov [BgrDataWidth],ebx mov [BgrDataHeight],ecx ; mov [bgrchanged],1 @@ -2379,12 +2389,13 @@ sys_background: lea eax,[eax*3] mov [mem_BACKGROUND],eax ; get memory for new background - stdcall kernel_alloc, [mem_BACKGROUND] + stdcall kernel_alloc, eax test eax, eax jz .exit_mem mov [img_background], eax .exit_mem: popad + mov [bgrlock], 0 sbgrr: ret @@ -2444,6 +2455,84 @@ draw_background_temp: ret nosb5: + cmp eax, 6 + jnz nosb6 +@@: + mov al, 1 + xchg [bgrlock], al + test al, al + jz @f + call change_task + jmp @b +@@: + mov eax, [CURRENT_TASK] + mov [bgrlockpid], eax + stdcall user_alloc, [mem_BACKGROUND] + mov [esp+36], eax + test eax, eax + jz .nomem + mov ebx, eax + shr ebx, 12 + or dword [page_tabs+(ebx-1)*4], DONT_FREE_BLOCK + mov esi, [img_background] + shr esi, 12 + mov ecx, [mem_BACKGROUND] + add ecx, 0xFFF + shr ecx, 12 +.z: + mov eax, [page_tabs+ebx*4] + test al, 1 + jz @f + call free_page +@@: + mov eax, [page_tabs+esi*4] + or al, PG_UW + mov [page_tabs+ebx*4], eax + mov eax, ebx + shl eax, 12 + invlpg [eax] + inc ebx + inc esi + loop .z + ret +.nomem: + and [bgrlockpid], 0 + mov [bgrlock], 0 +nosb6: + cmp eax, 7 + jnz nosb7 + cmp [bgrlock], 0 + jz .err + mov eax, [CURRENT_TASK] + cmp [bgrlockpid], eax + jnz .err + mov eax, ebx + shr eax, 12 + mov ecx, [page_tabs+(eax-1)*4] + test cl, USED_BLOCK+DONT_FREE_BLOCK + jz .err + jnp .err + push eax + shr ecx, 12 +@@: + and dword [page_tabs+eax*4], 0 + mov edx, eax + shl edx, 12 + invlpg [edx] + inc eax + loop @b + pop eax + and dword [page_tabs+(eax-1)*4], not DONT_FREE_BLOCK + stdcall user_free, ebx + mov [esp+36], eax + and [bgrlockpid], 0 + mov [bgrlock], 0 + ret +.err: + and dword [esp+36], 0 + ret + +nosb7: ret diff --git a/kernel/trunk/video/vesa20.inc b/kernel/trunk/video/vesa20.inc index c7a6888b66..9c0b64f0cb 100644 --- a/kernel/trunk/video/vesa20.inc +++ b/kernel/trunk/video/vesa20.inc @@ -862,20 +862,24 @@ vesa20_drawbackground_stretch: call [disable_mouse] pushad ; Helper variables +; calculate 2^32*(BgrDataWidth-1) mod (ScreenWidth-1) mov eax, [BgrDataWidth] + dec eax xor edx, edx - mov ecx, [ScreenWidth] - inc ecx - div ecx - push eax ; quo - push edx ; rem + div dword [ScreenWidth] + push eax ; high + xor eax, eax + div dword [ScreenWidth] + push eax ; low +; the same for height mov eax, [BgrDataHeight] + dec eax xor edx, edx - mov ecx, [ScreenHeight] - inc ecx - div ecx - push eax - push edx + div dword [ScreenHeight] + push eax ; high + xor eax, eax + div dword [ScreenHeight] + push eax ; low ; External loop for all y from start to end mov ebx, [draw_data+32+RECT.top] ; y start mov ebp, [draw_data+32+RECT.left] ; x start @@ -897,83 +901,76 @@ vesa20_drawbackground_stretch: xchg edi, ebp ; Now eax=x, ebx=y, edi->output, ebp=offset in WinMapAddress push ebx + push eax ; 2) Calculate offset in background memory block - push eax mov eax, ebx - mul dword [BgrDataHeight] - mov ecx, [ScreenHeight] - inc ecx - div ecx ; eax := y * BgrDataHeight / ScreenHeight - ; edx := (y * BgrDataHeight) mod ScreenHeight - mov esi, eax - pop eax - push edx ; dword [esp] = (y * BgrDataHeight) mod ScreenHeight - ; dword [esp+4] = y * BgrDataHeight / ScreenHeight - push eax - mov ecx, [BgrDataWidth] - lea edx, [ecx*3] - imul edx, [BgrDataHeight] - add edx, [img_background] + imul ebx, dword [esp+12] + mul dword [esp+8] + add edx, ebx ; edx:eax = y * 2^32*(BgrDataHeight-1)/(ScreenHeight-1) + mov esi, edx + imul esi, [BgrDataWidth] push edx - mul ecx - imul esi, ecx - dec ecx - push ecx - mov ecx, [ScreenWidth] - inc ecx - div ecx ; eax := x * BgrDataWidth / ScreenWidth - ; edx := (x * BgrDataWidth) mod ScreenWidth - add esi, eax + push eax + mov eax, [esp+8] + mul dword [esp+28] + push eax + mov eax, [esp+12] + mul dword [esp+28] + add [esp], edx + pop edx ; edx:eax = x * 2^32*(BgrDataWidth-1)/(ScreenWidth-1) + add esi, edx lea esi, [esi*3] add esi, [img_background] - push ecx edx esi + mov ecx, eax + push eax edx esi ; 3) Loop through redraw rectangle and copy background data ; Registers meaning: -; ecx = (x * BgrDataWidth) / ScreenWidth -; edx = (x * BgrDataWidth) mod ScreenWidth (used to fast recalculating of ecx,esi) +; edx:ecx = x * 2^32 * (BgrDataWidth-1) / (ScreenWidth-1) ; esi -> bgr memory, edi -> output ; ebp = offset in WinMapAddress ; dword [esp] = saved esi ; dword [esp+4] = saved edx ; dword [esp+8] = saved ecx -; dword [esp+12] = BgrDataWidth-1, x-limit for overlapping of points -; dword [esp+16] = end of bgr memory (defines y-limit for overlapping of points) +; qword [esp+12] = y * 2^32 * (BgrDataHeight-1) / (ScreenHeight-1) ; dword [esp+20] = x -; dword [esp+24] = (y * BgrDataHeight) mod ScreenHeight (used to fast recalculating of esi) -; dword [esp+28] = y +; dword [esp+24] = y ; precalculated constants: -; dword [esp+32] = BgrDataHeight mod ScreenHeight -; dword [esp+36] = BgrDataHeight div ScreenHeight -; dword [esp+40] = BgrDataWidth mod ScreenWidth -; dword [esp+44] = BgrDataWidth div ScreenWidth +; qword [esp+28] = 2^32*(BgrDataHeight-1)/(ScreenHeight-1) +; qword [esp+36] = 2^32*(BgrDataWidth-1)/(ScreenWidth-1) sdp3: - add edx, [esp+40] cmp [ebp+WinMapAddress], byte 1 jnz snbgp mov al, [esi+2] shl eax, 16 mov ax, [esi] - cmp ecx, [esp+12] - jae @f - cmp edx, [ScreenWidth] - jb @f + test ecx, ecx + jz @f mov ebx, [esi+2] shr ebx, 8 call overlapping_of_points @@: - mov ebx, [esp+24] - add ebx, [esp+32] - cmp ebx, [ScreenHeight] - jbe @f + cmp dword [esp+12], 0 + jz .novert mov ebx, [BgrDataWidth] lea ebx, [ebx*3] add ebx, esi - cmp ebx, [esp+16] - jae @f - mov ebx, [ebx-1] + push eax + mov al, [ebx+2] + shl eax, 16 + mov ax, [ebx] + test ecx, ecx + jz .nohorz + mov ebx, [ebx+2] shr ebx, 8 call overlapping_of_points -@@: +.nohorz: + mov ebx, eax + pop eax + push ecx + mov ecx, [esp+4+12] + call overlapping_of_points + pop ecx +.novert: mov [edi], ax shr eax, 16 mov [edi+2], al @@ -986,23 +983,18 @@ snbgp: mov [esp+20], eax cmp eax, [draw_data+32+RECT.right] ja sdp4 - mov eax, [esp+44] - add ecx, eax + add ecx, [esp+36] + mov eax, edx + adc edx, [esp+40] + sub eax, edx lea eax, [eax*3] - add esi, eax -; add edx, [esp+40] - cmp edx, [ScreenWidth] - jbe sdp3 - sub edx, [ScreenWidth] - add ecx, 1 - add esi, 3 - sub edx, 1 + sub esi, eax jmp sdp3 sdp4: ; next y - mov ebx, [esp+28] + mov ebx, [esp+24] add ebx, 1 - mov [esp+28], ebx + mov [esp+24], ebx cmp ebx, [draw_data+32+RECT.bottom] ja sdpdone ; advance edi, ebp to next scan line @@ -1019,56 +1011,55 @@ sdp4: @@: add edi, [BytesPerScanLine] ; restore ecx,edx; advance esi to next background line + mov eax, [esp+28] + mov ebx, [esp+32] + add [esp+12], eax + mov eax, [esp+16] + adc [esp+16], ebx pop esi edx ecx push ecx edx - xor ebx, ebx - mov eax, [esp+24-4] - add eax, [esp+32-4] - cmp eax, [ScreenHeight] - jbe @f - sub eax, [ScreenHeight] - mov ebx, 1 - sub eax, ebx -@@: - mov [esp+24-4], eax - add ebx, [esp+36-4] - lea ebx, [ebx*3] - imul ebx, [BgrDataWidth] - add esi, ebx + sub eax, [esp+16-4] + lea eax, [eax*3] + imul eax, [BgrDataWidth] + sub esi, eax push esi mov eax, [draw_data+32+RECT.left] mov [esp+20], eax jmp sdp3 sdpdone: - add esp, 48 + add esp, 44 popad mov [EGA_counter],1 call VGA_drawbackground ret overlapping_of_points: - push ecx edx edi - mov ecx, eax - mov edx, ebx + push ecx edx + mov edx, eax + push esi + shr ecx, 24 + mov esi, ecx + mov ecx, ebx + movzx ebx, dl + movzx eax, cl + sub eax, ebx + movzx ebx, dh + imul eax, esi + add dl, ah + movzx eax, ch + sub eax, ebx + imul eax, esi + add dh, ah + ror ecx, 16 + ror edx, 16 movzx eax, cl movzx ebx, dl - add eax, ebx - rcr eax, 1 - movzx edi, ax - movzx eax, ch - movzx ebx, dh - add eax, ebx - rcr eax, 1 - ror edi, 8 - add edi, eax - shr ecx, 8 - shr edx, 8 - movzx eax, ch - movzx ebx, dh - add eax, ebx - rcr eax, 1 - ror edi, 8 - add eax, edi + sub eax, ebx + imul eax, esi + pop esi + add dl, ah + mov eax, edx + pop edx ror eax, 16 - pop edi edx ecx + pop ecx ret