forked from KolibriOS/kolibrios
changed background handling
git-svn-id: svn://kolibrios.org@546 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
b5bc8a7c09
commit
925adfd15a
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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 - ç⥨¥ ¯ ¯ª¨
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user