changed background handling
git-svn-id: svn://kolibrios.org@546 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -1,4 +1,4 @@
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Kolibri 0.6.5.0
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Kolibri 0.7.0.0
|
||||
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>㭪樨 <20><><EFBFBD><EFBFBD>頥<EFBFBD><E9A0A5><EFBFBD> <20> ॣ<><E0A5A3><EFBFBD><EFBFBD> eax.
|
||||
<EFBFBD>맮<EFBFBD> <20><><EFBFBD>⥬<EFBFBD><E2A5AC><EFBFBD> <20>㭪樨 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⢫<EFBFBD><E2A2AB><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "int 0x40".
|
||||
@@ -574,6 +574,34 @@
|
||||
* <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>࠭<EFBFBD> (<28><> <20><><EFBFBD><EFBFBD><EFBFBD>襭<EFBFBD><E8A5AD> <20><>ਨ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, ࠡ<><E0A0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>
|
||||
䮭<><E4AEAD>) <20><><EFBFBD>뢠<EFBFBD><EBA2A0><EFBFBD> <20><><EFBFBD><EFBFBD>㭪<EFBFBD><E3ADAA><EFBFBD> 3 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ᮢ<EFBFBD><E1AEA2> 䮭<>.
|
||||
|
||||
======================================================================
|
||||
====================== <20>㭪<EFBFBD><E3ADAA><EFBFBD> 15, <20><><EFBFBD><EFBFBD>㭪<EFBFBD><E3ADAA><EFBFBD> 6 ======================
|
||||
==== <20><><EFBFBD><E0AEA5><EFBFBD><E0AEA2><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 䮭<> <20><> <20><><EFBFBD><EFBFBD>᭮<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>࠭<EFBFBD>⢮ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. ====
|
||||
======================================================================
|
||||
<EFBFBD><EFBFBD>ࠬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
||||
* eax = 15 - <20><><EFBFBD><EFBFBD><EFBFBD> <20>㭪樨
|
||||
* ebx = 6 - <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>㭪樨
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>頥<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>祭<EFBFBD><E7A5AD>:
|
||||
* eax = 㪠<><E3AAA0>⥫<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 䮭<>, 0 <20><><EFBFBD> <20>訡<EFBFBD><E8A8A1>
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>砭<EFBFBD><EFBFBD>:
|
||||
* <20><><EFBFBD><E0AEA5><EFBFBD><E0AEA2><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>㯭<EFBFBD> <20><> <20>⥭<EFBFBD><E2A5AD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 䮭<> ࠢ<><E0A0A2> 3*xsize*ysize. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ࠧ<><E0A0A7> 䮭<>
|
||||
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>६<EFBFBD> ࠡ<><E0A0A1><EFBFBD> <20> <20><><EFBFBD><E0AEA5><EFBFBD><E0AEA2><EFBFBD>묨 <20><><EFBFBD><EFBFBD>묨.
|
||||
* <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ᥫ<EFBFBD> <20>࠭<EFBFBD><E0A0AD><EFBFBD><EFBFBD> <20><><EFBFBD> 3-<2D><><EFBFBD>⮢<EFBFBD><E2AEA2> <20><><EFBFBD><EFBFBD>稭<EFBFBD> BBGGRR.
|
||||
* <20><><EFBFBD>ᥫ<EFBFBD> 䮭<><E4AEAD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ࠦ<EFBFBD><E0A0A6><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>뢠<EFBFBD><EBA2A0><EFBFBD><EFBFBD> <20><><EFBFBD><E1ABA5><EFBFBD><EFBFBD>⥫쭮
|
||||
<><E1ABA5> <20><><EFBFBD>ࠢ<EFBFBD>, ᢥ<><E1A2A5><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
|
||||
======================================================================
|
||||
====================== <20>㭪<EFBFBD><E3ADAA><EFBFBD> 15, <20><><EFBFBD><EFBFBD>㭪<EFBFBD><E3ADAA><EFBFBD> 7 ======================
|
||||
=== <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0AEA5><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 䮭<> <20><> <20><><EFBFBD><EFBFBD>᭮<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>࠭<EFBFBD>⢮ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. ==
|
||||
======================================================================
|
||||
<EFBFBD><EFBFBD>ࠬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
||||
* eax = 15 - <20><><EFBFBD><EFBFBD><EFBFBD> <20>㭪樨
|
||||
* ebx = 7 - <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>㭪樨
|
||||
* ecx = 㪠<><E3AAA0>⥫<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 䮭<>
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>頥<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>祭<EFBFBD><E7A5AD>:
|
||||
* eax = 1 <20><><EFBFBD> <20>ᯥ<EFBFBD><E1AFA5>, 0 <20><><EFBFBD> <20>訡<EFBFBD><E8A8A1>
|
||||
|
||||
======================================================================
|
||||
============= <20>㭪<EFBFBD><E3ADAA><EFBFBD> 16 - <20><><EFBFBD>࠭<EFBFBD><E0A0AD><EFBFBD> ࠬ<><E0A0AC><EFBFBD><EFBFBD> <20><> <20><>᪥<EFBFBD><E1AAA5>. =============
|
||||
======================================================================
|
||||
@@ -839,7 +867,7 @@
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
||||
db a,b,c,d <20><><EFBFBD> <20><><EFBFBD>ᨨ a.b.c.d
|
||||
db UID_xxx: <20><><EFBFBD><EFBFBD> <20><> UID_NONE=0, UID_MENUET=1, UID_KOLIBRI=2
|
||||
dd REV - <20><><EFBFBD><EFBFBD><EFBFBD> svn ॢ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
dd REV - <20><><EFBFBD><EFBFBD><EFBFBD> svn-ॢ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Kolibri 0.7.0.0:
|
||||
db 0,7,0,0
|
||||
db 2
|
||||
@@ -2305,12 +2333,11 @@ dword-
|
||||
<EFBFBD><EFBFBD>ࠬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
||||
* eax = 48 - <20><><EFBFBD><EFBFBD><EFBFBD> <20>㭪樨
|
||||
* ebx = 8 - <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>㭪樨
|
||||
* ecx = 㪠<><E3AAA0>⥫<EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20>㭪樨 58, <20> <20><><EFBFBD><EFBFBD> <20><>⠭<EFBFBD><E2A0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
<20><><EFBFBD><EFBFBD> <20><EFBFBD><E0AEAC><EFBFBD><EFBFBD><EFBFBD>筮<EFBFBD><E7ADAE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> 㪠<><E3AAA0><EFBFBD><EFBFBD> <20><><EFBFBD> 䠩<><E4A0A9>
|
||||
* ecx = 㪠<><E3AAA0>⥫<EFBFBD> <20><> <20><><EFBFBD> 䠩<><E4A0A9> ᪨<EFBFBD><EFBFBD>
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>頥<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>祭<EFBFBD><E7A5AD>:
|
||||
* eax = 0 - <20>ᯥ譮
|
||||
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> eax = <20><><EFBFBD> <20>訡<EFBFBD><E8A8A1> 䠩<><E4A0A9><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>⥬<EFBFBD>; <20> 䠩<> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ᪨<>,
|
||||
<20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>頥<EFBFBD><E9A0A5><EFBFBD> <20>訡<EFBFBD><E8A8A1> 3 (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⭠<EFBFBD> 䠩<><E4A0A9><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>⥬<EFBFBD>).
|
||||
* eax = 1 - <20><> 㤠<><E3A4A0><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>㧨<EFBFBD><E3A7A8> 䠩<>
|
||||
* eax = 2 - 䠩<> <20><> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 䠩<><E4A0A9><EFBFBD> ᪨<EFBFBD><EFBFBD>
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>砭<EFBFBD><EFBFBD>:
|
||||
* <20><><EFBFBD> <20>ᯥ譮<E1AFA5> <20><><EFBFBD><EFBFBD>㧪<EFBFBD> ᪨<><E1AAA8> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD>室<EFBFBD><E5AEA4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ᮢ<EFBFBD><E1AEA2> (ᮡ<>⨥ 1).
|
||||
@@ -4064,11 +4091,14 @@ Architecture Software Developer's Manual, Volume 3, Appendix B);
|
||||
* /CD0/1, /CD1/1, /CD2/1, /CD3/1 <20><><EFBFBD> <20><><EFBFBD><EFBFBD>㯠 ᮮ⢥<E1AEAE><E2A2A5>⢥<EFBFBD><E2A2A5><EFBFBD>
|
||||
<20> CD <20><> IDE0 (Primary Master), IDE1 (Primary Slave),
|
||||
IDE2 (Secondary Master), IDE3 (Secondary Slave)
|
||||
* /SYS - <20><>।<EFBFBD><E0A5A4><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>⥬<EFBFBD><E2A5AC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>; <20><><EFBFBD> <20><><EFBFBD>筮<EFBFBD> <20><><EFBFBD><EFBFBD>㧪<EFBFBD> <20><><EFBFBD>⥬<EFBFBD>
|
||||
<20> <20><>᪥<EFBFBD><E1AAA5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⭮ /RD/1
|
||||
<EFBFBD>ਬ<EFBFBD><EFBFBD><EFBFBD>:
|
||||
* '/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
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>㯭<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>㭪樨:
|
||||
* <20><><EFBFBD><EFBFBD>㭪<EFBFBD><E3ADAA><EFBFBD> 0 - <20>⥭<EFBFBD><E2A5AD> 䠩<><E4A0A9>
|
||||
* <20><><EFBFBD><EFBFBD>㭪<EFBFBD><E3ADAA><EFBFBD> 1 - <20>⥭<EFBFBD><E2A5AD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
||||
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user