changed background handling

git-svn-id: svn://kolibrios.org@546 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Evgeny Grechnikov (Diamond) 2007-06-18 16:39:42 +00:00
parent b5bc8a7c09
commit 925adfd15a
6 changed files with 268 additions and 115 deletions

View File

@ -20,6 +20,7 @@ struc MEM_BLOCK
MEM_LIST_OFFSET equ 8 MEM_LIST_OFFSET equ 8
FREE_BLOCK equ 4 FREE_BLOCK equ 4
USED_BLOCK equ 8 USED_BLOCK equ 8
DONT_FREE_BLOCK equ 10h
virtual at 0 virtual at 0
MEM_BLOCK MEM_BLOCK MEM_BLOCK MEM_BLOCK
@ -728,8 +729,10 @@ proc user_free stdcall, base:dword
sub esi, 4096 sub esi, 4096
shr esi, 12 shr esi, 12
mov eax, [page_tabs+esi*4] mov eax, [page_tabs+esi*4]
test eax, USED_BLOCK test al, USED_BLOCK
jz .not_used jz .not_used
test al, DONT_FREE_BLOCK
jnz .cantfree
and eax, not 4095 and eax, not 4095
mov ecx, eax mov ecx, eax
@ -765,6 +768,9 @@ proc user_free stdcall, base:dword
xor eax, eax xor eax, eax
inc eax inc eax
ret ret
.cantfree:
xor eax, eax
ret
endp endp
user_normalize: user_normalize:
@ -836,6 +842,8 @@ user_realloc:
xor eax, eax xor eax, eax
ret ret
@@: @@:
test edx, DONT_FREE_BLOCK
jnz .ret0
add ebx, 0x1FFF add ebx, 0x1FFF
shr edx, 12 shr edx, 12
shr ebx, 12 shr ebx, 12

View File

@ -720,6 +720,11 @@ term9:
mov [flp_status], 0 mov [flp_status], 0
@@: @@:
pop esi pop esi
cmp [bgrlockpid], esi
jnz @f
and [bgrlockpid], 0
mov [bgrlock], 0
@@:
pusha ; remove all irq reservations pusha ; remove all irq reservations
mov eax,esi mov eax,esi

View File

@ -1,4 +1,4 @@
<EFBFBD><EFBFBD><EFBFBD>… ”“<E2809D><E2809C><EFBFBD><E28093> <20><><EFBFBD><E282AC><E28093><EFBFBD><EFBFBD><EFBFBD><><E28099> Kolibri 0.6.5.0 ˆ…Œ<EFBFBD>… ”“<E2809D>Šˆˆ Ž<><EFBFBD>ˆŽ<CB86><C5BD>Ž‰ ‘ˆ‘’…Œ› Kolibri 0.7.0.0
<EFBFBD>®¬¥à ä㭪樨 ¯®¬¥é ¥âáï ¢ ॣ¨áâà eax. <EFBFBD>®¬¥à ä㭪樨 ¯®¬¥é ¥âáï ¢ ॣ¨áâà eax.
‚맮¢ á¨á⥬­®© ä㭪樨 ®áãé¥á⢫ï¥âáï ª®¬ ­¤®© "int 0x40". ‚맮¢ á¨á⥬­®© ä㭪樨 ®áãé¥á⢫ï¥âáï ª®¬ ­¤®© "int 0x40".
@ -574,6 +574,34 @@
* „«ï ®¡­®¢«¥­¨ï íªà ­  (¯®á«¥ § ¢¥à襭¨ï á¥à¨¨ ª®¬ ­¤, à ¡®â îé¨å á * „«ï ®¡­®¢«¥­¨ï íªà ­  (¯®á«¥ § ¢¥à襭¨ï á¥à¨¨ ª®¬ ­¤, à ¡®â îé¨å á
ä®­®¬) ¢ë§ë¢ ©â¥ ¯®¤äã­ªæ¨î 3 ¯¥à¥à¨á®¢ª¨ ä®­ . ä®­®¬) ¢ë§ë¢ ©â¥ ¯®¤äã­ªæ¨î 3 ¯¥à¥à¨á®¢ª¨ ä®­ .
======================================================================
====================== ”ã­ªæ¨ï 15, ¯®¤äã­ªæ¨ï 6 ======================
==== ‘¯à®¥æ¨à®¢ âì ¤ ­­ë¥ ä®­  ­   ¤à¥á­®¥ ¯à®áâà ­á⢮ ¯à®æ¥áá . ====
======================================================================
<EFBFBD> à ¬¥âàë:
* eax = 15 - ­®¬¥à ä㭪樨
* ebx = 6 - ­®¬¥à ¯®¤ä㭪樨
‚®§¢à é ¥¬®¥ §­ ç¥­¨¥:
* eax = 㪠§ â¥«ì ­  ¤ ­­ë¥ ä®­ , 0 ¯à¨ ®è¨¡ª¥
‡ ¬¥ç ­¨ï:
* ‘¯à®¥æ¨à®¢ ­­ë¥ ¤ ­­ë¥ ¤®áâã¯­ë ­  ç⥭¨¥ ¨ § ¯¨áì.
* <20> §¬¥à ¤ ­­ëå ä®­  à ¢¥­ 3*xsize*ysize. ˆ§¬¥­¥­¨¥ à §¬¥à®¢ ä®­ 
¡«®ª¨àã¥âáï ­  ¢à¥¬ï à ¡®âë á á¯à®¥æ¨à®¢ ­­ë¬¨ ¤ ­­ë¬¨.
* –¢¥â ª ¦¤®£® ¯¨ªá¥«ï åà ­¨âáï ª ª 3-¡ ©â®¢ ï ¢¥«¨ç¨­  BBGGRR.
* <20>¨ªá¥«¨ ä®­®¢®£® ¨§®¡à ¦¥­¨ï § ¯¨á뢠îâáï ¯®á«¥¤®¢ â¥«ì­®
á«¥¢  ­ ¯à ¢®, ᢥàåã ¢­¨§.
======================================================================
====================== ”ã­ªæ¨ï 15, ¯®¤äã­ªæ¨ï 7 ======================
=== ‡ ªàëâì ¯à®¥ªæ¨î ¤ ­­ëå ä®­  ­   ¤à¥á­®¥ ¯à®áâà ­á⢮ ¯à®æ¥áá . ==
======================================================================
<EFBFBD> à ¬¥âàë:
* eax = 15 - ­®¬¥à ä㭪樨
* ebx = 7 - ­®¬¥à ¯®¤ä㭪樨
* ecx = 㪠§ â¥«ì ­  ¤ ­­ë¥ ä®­ 
‚®§¢à é ¥¬®¥ §­ ç¥­¨¥:
* eax = 1 ¯à¨ ãᯥå¥, 0 ¯à¨ ®è¨¡ª¥
====================================================================== ======================================================================
============= ”ã­ªæ¨ï 16 - á®åà ­¨âì à ¬¤¨áª ­  ¤¨áª¥âã. ============= ============= ”ã­ªæ¨ï 16 - á®åà ­¨âì à ¬¤¨áª ­  ¤¨áª¥âã. =============
====================================================================== ======================================================================
@ -839,7 +867,7 @@
‘âàãªâãà  ¡ãä¥à : ‘âàãªâãà  ¡ãä¥à :
db a,b,c,d ¤«ï ¢¥àᨨ a.b.c.d db a,b,c,d ¤«ï ¢¥àᨨ a.b.c.d
db UID_xxx: ®¤­® ¨§ UID_NONE=0, UID_MENUET=1, UID_KOLIBRI=2 db UID_xxx: ®¤­® ¨§ UID_NONE=0, UID_MENUET=1, UID_KOLIBRI=2
dd REV - ­®¬¥ΰ svn ΰ¥Ά¨§¨¨ ο¤ΰ  dd REV - ­®¬¥à svn-ॢ¨§¨¨ ï¤à 
„«ï ï¤à  Kolibri 0.7.0.0: „«ï ï¤à  Kolibri 0.7.0.0:
db 0,7,0,0 db 0,7,0,0
db 2 db 2
@ -2305,12 +2333,11 @@ dword-
<EFBFBD> à ¬¥âàë: <EFBFBD> à ¬¥âàë:
* eax = 48 - ­®¬¥à ä㭪樨 * eax = 48 - ­®¬¥à ä㭪樨
* ebx = 8 - ­®¬¥à ¯®¤ä㭪樨 * ebx = 8 - ­®¬¥à ¯®¤ä㭪樨
* ecx = γ<> § β¥«μ ­  ΅«®<C2AB> ¤«ο δγ­<CEB3>樨 58, Ά <20>®β®ΰ®¬ γαβ ­®Ά«¥­® * ecx = 㪠§ â¥«ì ­  ¨¬ï ä ©«  ᪨­ 
―®«¥ ―஬¥¦γβ®η­®£® ΅γδ¥ΰ  ¨ γ<> § ­® ¨¬ο δ ©« 
‚®§¢à é ¥¬®¥ §­ ç¥­¨¥: ‚®§¢à é ¥¬®¥ §­ ç¥­¨¥:
* eax = 0 - ãᯥ譮 * eax = 0 - ãᯥ譮
* ¨­ η¥ eax = <20>®¤ ®θ¨΅<C2A8>¨ δ ©«®Ά®© α¨α⥬λ; ¥α«¨ δ ©« ­¥ § ¤ ρβ α<>¨­, * eax = 1 - ­¥ 㤠«®áì § £à㧨âì ä ©«
β® Ά®§Άΰ ι ¥βαο ®θ¨΅<C2A8>  3 (­¥¨§Ά¥αβ­ ο δ ©«®Ά ο α¨α⥬ ). * eax = 2 - ä ©« ­¥ ï¥âáï ä ©«®¬ ᪨­ 
‡ ¬¥ç ­¨ï: ‡ ¬¥ç ­¨ï:
* <20>ਠãᯥ譮© § £à㧪¥ ᪨­  ¢á¥ ®ª­  ¨§¢¥é îâáï ® ­¥®¡å®¤¨¬®á⨠* <20>ਠãᯥ譮© § £à㧪¥ ᪨­  ¢á¥ ®ª­  ¨§¢¥é îâáï ® ­¥®¡å®¤¨¬®áâ¨
¯¥à¥à¨á®¢ª¨ (ᮡë⨥ 1). ¯¥à¥à¨á®¢ª¨ (ᮡë⨥ 1).
@ -4064,11 +4091,14 @@ Architecture Software Developer's Manual, Volume 3, Appendix B);
* /CD0/1, /CD1/1, /CD2/1, /CD3/1 ¤«ï ¤®áâ㯠 ᮮ⢥âá⢥­­® * /CD0/1, /CD1/1, /CD2/1, /CD3/1 ¤«ï ¤®áâ㯠 ᮮ⢥âá⢥­­®
ª CD ­  IDE0 (Primary Master), IDE1 (Primary Slave), ª CD ­  IDE0 (Primary Master), IDE1 (Primary Slave),
IDE2 (Secondary Master), IDE3 (Secondary Slave) IDE2 (Secondary Master), IDE3 (Secondary Slave)
* /SYS - ®¯à¥¤¥«ï¥â á¨á⥬­ãî ¯ ¯ªã; ¯à¨ ®¡ëç­®© § £à㧪¥ á¨á⥬ë
á ¤¨áª¥âë íª¢¨¢ «¥­â­® /RD/1
<EFBFBD>ਬ¥àë: <EFBFBD>ਬ¥àë:
* '/rd/1/kernel.asm',0 * '/rd/1/kernel.asm',0
* '/HD0/1/kernel.asm',0 * '/HD0/1/kernel.asm',0
* '/hd0/2/menuet/pics/tanzania.bmp',0 * '/hd0/2/menuet/pics/tanzania.bmp',0
* '/hd0/1/Program files/NameOfProgram/SomeFile.SomeExtension',0 * '/hd0/1/Program files/NameOfProgram/SomeFile.SomeExtension',0
* '/sys/MySuperApp.ini',0
„®áâã¯­ë¥ ¯®¤ä㭪樨: „®áâã¯­ë¥ ¯®¤ä㭪樨:
* ¯®¤äã­ªæ¨ï 0 - ç⥭¨¥ ä ©«  * ¯®¤äã­ªæ¨ï 0 - ç⥭¨¥ ä ©« 
* ¯®¤äã­ªæ¨ï 1 - ç⥭¨¥ ¯ ¯ª¨ * ¯®¤äã­ªæ¨ï 1 - ç⥭¨¥ ¯ ¯ª¨

View File

@ -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. Number of the function is located in the register eax.
The call of the system function is executed by "int 0x40" command. 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 * For update of the screen (after completion of a series of commands
working with a background) call subfunction 3. 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. ============== =============== 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 * /CD0/1, /CD1/1, /CD2/1, /CD3/1 to access accordingly to
CD on IDE0 (Primary Master), IDE1 (Primary Slave), CD on IDE0 (Primary Master), IDE1 (Primary Slave),
IDE2 (Secondary Master), IDE3 (Secondary Slave) IDE2 (Secondary Master), IDE3 (Secondary Slave)
* /SYS means system folder; with the usual boot (from floppy)
is equivalent to /RD/1
Examples: Examples:
* '/rd/1/kernel.asm',0 * '/rd/1/kernel.asm',0
* '/HD0/1/kernel.asm',0 * '/HD0/1/kernel.asm',0
* '/hd0/2/menuet/pics/tanzania.bmp',0 * '/hd0/2/menuet/pics/tanzania.bmp',0
* '/hd0/1/Program files/NameOfProgram/SomeFile.SomeExtension',0 * '/hd0/1/Program files/NameOfProgram/SomeFile.SomeExtension',0
* '/sys/MySuperApp.ini',0
Available subfunctions: Available subfunctions:
* subfunction 0 - read file * subfunction 0 - read file
* subfunction 1 - read folder * subfunction 1 - read folder

View File

@ -2346,6 +2346,8 @@ sys_cachetodiskette:
uglobal uglobal
; bgrchanged dd 0x0 ; bgrchanged dd 0x0
bgrlock db 0
bgrlockpid dd 0
endg endg
sys_background: sys_background:
@ -2356,6 +2358,14 @@ sys_background:
je sbgrr je sbgrr
cmp ecx,0 cmp ecx,0
je sbgrr je sbgrr
@@:
mov al, 1
xchg [bgrlock], al
test al, al
jz @f
call change_task
jmp @b
@@:
mov [BgrDataWidth],ebx mov [BgrDataWidth],ebx
mov [BgrDataHeight],ecx mov [BgrDataHeight],ecx
; mov [bgrchanged],1 ; mov [bgrchanged],1
@ -2379,12 +2389,13 @@ sys_background:
lea eax,[eax*3] lea eax,[eax*3]
mov [mem_BACKGROUND],eax mov [mem_BACKGROUND],eax
; get memory for new background ; get memory for new background
stdcall kernel_alloc, [mem_BACKGROUND] stdcall kernel_alloc, eax
test eax, eax test eax, eax
jz .exit_mem jz .exit_mem
mov [img_background], eax mov [img_background], eax
.exit_mem: .exit_mem:
popad popad
mov [bgrlock], 0
sbgrr: sbgrr:
ret ret
@ -2444,6 +2455,84 @@ draw_background_temp:
ret ret
nosb5: 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 ret

View File

@ -862,20 +862,24 @@ vesa20_drawbackground_stretch:
call [disable_mouse] call [disable_mouse]
pushad pushad
; Helper variables ; Helper variables
; calculate 2^32*(BgrDataWidth-1) mod (ScreenWidth-1)
mov eax, [BgrDataWidth] mov eax, [BgrDataWidth]
dec eax
xor edx, edx xor edx, edx
mov ecx, [ScreenWidth] div dword [ScreenWidth]
inc ecx push eax ; high
div ecx xor eax, eax
push eax ; quo div dword [ScreenWidth]
push edx ; rem push eax ; low
; the same for height
mov eax, [BgrDataHeight] mov eax, [BgrDataHeight]
dec eax
xor edx, edx xor edx, edx
mov ecx, [ScreenHeight] div dword [ScreenHeight]
inc ecx push eax ; high
div ecx xor eax, eax
push eax div dword [ScreenHeight]
push edx push eax ; low
; External loop for all y from start to end ; External loop for all y from start to end
mov ebx, [draw_data+32+RECT.top] ; y start mov ebx, [draw_data+32+RECT.top] ; y start
mov ebp, [draw_data+32+RECT.left] ; x start mov ebp, [draw_data+32+RECT.left] ; x start
@ -897,83 +901,76 @@ vesa20_drawbackground_stretch:
xchg edi, ebp xchg edi, ebp
; Now eax=x, ebx=y, edi->output, ebp=offset in WinMapAddress ; Now eax=x, ebx=y, edi->output, ebp=offset in WinMapAddress
push ebx push ebx
push eax
; 2) Calculate offset in background memory block ; 2) Calculate offset in background memory block
push eax
mov eax, ebx mov eax, ebx
mul dword [BgrDataHeight] imul ebx, dword [esp+12]
mov ecx, [ScreenHeight] mul dword [esp+8]
inc ecx add edx, ebx ; edx:eax = y * 2^32*(BgrDataHeight-1)/(ScreenHeight-1)
div ecx ; eax := y * BgrDataHeight / ScreenHeight mov esi, edx
; edx := (y * BgrDataHeight) mod ScreenHeight imul esi, [BgrDataWidth]
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]
push edx push edx
mul ecx push eax
imul esi, ecx mov eax, [esp+8]
dec ecx mul dword [esp+28]
push ecx push eax
mov ecx, [ScreenWidth] mov eax, [esp+12]
inc ecx mul dword [esp+28]
div ecx ; eax := x * BgrDataWidth / ScreenWidth add [esp], edx
; edx := (x * BgrDataWidth) mod ScreenWidth pop edx ; edx:eax = x * 2^32*(BgrDataWidth-1)/(ScreenWidth-1)
add esi, eax add esi, edx
lea esi, [esi*3] lea esi, [esi*3]
add esi, [img_background] add esi, [img_background]
push ecx edx esi mov ecx, eax
push eax edx esi
; 3) Loop through redraw rectangle and copy background data ; 3) Loop through redraw rectangle and copy background data
; Registers meaning: ; Registers meaning:
; ecx = (x * BgrDataWidth) / ScreenWidth ; edx:ecx = x * 2^32 * (BgrDataWidth-1) / (ScreenWidth-1)
; edx = (x * BgrDataWidth) mod ScreenWidth (used to fast recalculating of ecx,esi)
; esi -> bgr memory, edi -> output ; esi -> bgr memory, edi -> output
; ebp = offset in WinMapAddress ; ebp = offset in WinMapAddress
; dword [esp] = saved esi ; dword [esp] = saved esi
; dword [esp+4] = saved edx ; dword [esp+4] = saved edx
; dword [esp+8] = saved ecx ; dword [esp+8] = saved ecx
; dword [esp+12] = BgrDataWidth-1, x-limit for overlapping of points ; qword [esp+12] = y * 2^32 * (BgrDataHeight-1) / (ScreenHeight-1)
; dword [esp+16] = end of bgr memory (defines y-limit for overlapping of points)
; dword [esp+20] = x ; dword [esp+20] = x
; dword [esp+24] = (y * BgrDataHeight) mod ScreenHeight (used to fast recalculating of esi) ; dword [esp+24] = y
; dword [esp+28] = y
; precalculated constants: ; precalculated constants:
; dword [esp+32] = BgrDataHeight mod ScreenHeight ; qword [esp+28] = 2^32*(BgrDataHeight-1)/(ScreenHeight-1)
; dword [esp+36] = BgrDataHeight div ScreenHeight ; qword [esp+36] = 2^32*(BgrDataWidth-1)/(ScreenWidth-1)
; dword [esp+40] = BgrDataWidth mod ScreenWidth
; dword [esp+44] = BgrDataWidth div ScreenWidth
sdp3: sdp3:
add edx, [esp+40]
cmp [ebp+WinMapAddress], byte 1 cmp [ebp+WinMapAddress], byte 1
jnz snbgp jnz snbgp
mov al, [esi+2] mov al, [esi+2]
shl eax, 16 shl eax, 16
mov ax, [esi] mov ax, [esi]
cmp ecx, [esp+12] test ecx, ecx
jae @f jz @f
cmp edx, [ScreenWidth]
jb @f
mov ebx, [esi+2] mov ebx, [esi+2]
shr ebx, 8 shr ebx, 8
call overlapping_of_points call overlapping_of_points
@@: @@:
mov ebx, [esp+24] cmp dword [esp+12], 0
add ebx, [esp+32] jz .novert
cmp ebx, [ScreenHeight]
jbe @f
mov ebx, [BgrDataWidth] mov ebx, [BgrDataWidth]
lea ebx, [ebx*3] lea ebx, [ebx*3]
add ebx, esi add ebx, esi
cmp ebx, [esp+16] push eax
jae @f mov al, [ebx+2]
mov ebx, [ebx-1] shl eax, 16
mov ax, [ebx]
test ecx, ecx
jz .nohorz
mov ebx, [ebx+2]
shr ebx, 8 shr ebx, 8
call overlapping_of_points 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 mov [edi], ax
shr eax, 16 shr eax, 16
mov [edi+2], al mov [edi+2], al
@ -986,23 +983,18 @@ snbgp:
mov [esp+20], eax mov [esp+20], eax
cmp eax, [draw_data+32+RECT.right] cmp eax, [draw_data+32+RECT.right]
ja sdp4 ja sdp4
mov eax, [esp+44] add ecx, [esp+36]
add ecx, eax mov eax, edx
adc edx, [esp+40]
sub eax, edx
lea eax, [eax*3] lea eax, [eax*3]
add esi, eax sub esi, eax
; add edx, [esp+40]
cmp edx, [ScreenWidth]
jbe sdp3
sub edx, [ScreenWidth]
add ecx, 1
add esi, 3
sub edx, 1
jmp sdp3 jmp sdp3
sdp4: sdp4:
; next y ; next y
mov ebx, [esp+28] mov ebx, [esp+24]
add ebx, 1 add ebx, 1
mov [esp+28], ebx mov [esp+24], ebx
cmp ebx, [draw_data+32+RECT.bottom] cmp ebx, [draw_data+32+RECT.bottom]
ja sdpdone ja sdpdone
; advance edi, ebp to next scan line ; advance edi, ebp to next scan line
@ -1019,56 +1011,55 @@ sdp4:
@@: @@:
add edi, [BytesPerScanLine] add edi, [BytesPerScanLine]
; restore ecx,edx; advance esi to next background line ; 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 pop esi edx ecx
push ecx edx push ecx edx
xor ebx, ebx sub eax, [esp+16-4]
mov eax, [esp+24-4] lea eax, [eax*3]
add eax, [esp+32-4] imul eax, [BgrDataWidth]
cmp eax, [ScreenHeight] sub esi, eax
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
push esi push esi
mov eax, [draw_data+32+RECT.left] mov eax, [draw_data+32+RECT.left]
mov [esp+20], eax mov [esp+20], eax
jmp sdp3 jmp sdp3
sdpdone: sdpdone:
add esp, 48 add esp, 44
popad popad
mov [EGA_counter],1 mov [EGA_counter],1
call VGA_drawbackground call VGA_drawbackground
ret ret
overlapping_of_points: overlapping_of_points:
push ecx edx edi push ecx edx
mov ecx, eax mov edx, eax
mov edx, ebx 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 eax, cl
movzx ebx, dl movzx ebx, dl
add eax, ebx sub eax, ebx
rcr eax, 1 imul eax, esi
movzx edi, ax pop esi
movzx eax, ch add dl, ah
movzx ebx, dh mov eax, edx
add eax, ebx pop edx
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
ror eax, 16 ror eax, 16
pop edi edx ecx pop ecx
ret ret