diff --git a/kernel/trunk/const.inc b/kernel/trunk/const.inc
index 0863f780e7..3f3ab20568 100644
--- a/kernel/trunk/const.inc
+++ b/kernel/trunk/const.inc
@@ -282,7 +282,6 @@ BUTTON_INFO equ (OS_BASE+0x02C0000)
RESERVED_PORTS equ (OS_BASE+0x02D0000)
IRQ_SAVE equ (OS_BASE+0x02E0000)
BOOT_VAR equ (OS_BASE+0x02f0000)
-IMG_BACKGROUND equ (OS_BASE+0x0300000)
WinMapAddress equ (OS_BASE+0x0460000)
display_data equ (OS_BASE+0x0460000)
diff --git a/kernel/trunk/data32.inc b/kernel/trunk/data32.inc
index e6a70554fb..0d32603153 100644
--- a/kernel/trunk/data32.inc
+++ b/kernel/trunk/data32.inc
@@ -329,6 +329,8 @@ com1_mouse_detected rb 1
com2_mouse_detected rb 1
;* end code - Mario79
+img_background rd 1
+mem_BACKGROUND rd 1
wraw_bacground_select rb 1
lba_read_enabled rd 1 ; 0 = disabled , 1 = enabled
diff --git a/kernel/trunk/kernel.asm b/kernel/trunk/kernel.asm
index 4d2d77a3b3..0aec6edf6c 100644
--- a/kernel/trunk/kernel.asm
+++ b/kernel/trunk/kernel.asm
@@ -500,12 +500,22 @@ high_code:
mov [graph_data_l+4],al
mov [graph_data_l+7],ah
-
mov [CURRENT_TASK],dword 1
mov [TASK_COUNT],dword 1
mov [TASK_BASE],dword TASK_DATA
mov [current_slot], SLOT_BASE+256
+; set background
+ xor eax,eax
+ inc eax
+ mov [display_data-12],eax
+ mov [display_data-8],eax
+ mov [display_data-4],eax
+ mov [mem_BACKGROUND],4095
+ stdcall kernel_alloc, [mem_BACKGROUND]
+ mov [img_background], eax
+
+
;!!!!!!!!!!!!!!!!!!!!!!!!!!
include 'detect/disks.inc'
;!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -2296,8 +2306,37 @@ sys_background:
mov [display_data-8],ebx
mov [display_data-4],ecx
; mov [bgrchanged],1
+
+ pushad
+; return memory for old background
+ stdcall kernel_free, [img_background]
+; calculate RAW size
+ xor eax,eax
+ inc eax
+ cmp [display_data-8],eax
+ jae @f
+ mov [display_data-8],eax
+@@:
+ cmp [display_data-4],eax
+ jae @f
+ mov [display_data-4],eax
+@@:
+ mov eax,[display_data-8]
+ imul eax,[display_data-4]
+ inc eax
+ imul eax,3
+ mov [mem_BACKGROUND],eax
+; get memory for new background
+ stdcall kernel_alloc, [mem_BACKGROUND]
+ test eax, eax
+ jz .exit_mem
+ mov [img_background], eax
+.exit_mem:
+ popad
+
sbgrr:
ret
+
nosb1:
cmp eax,2 ; SET PIXEL
@@ -2309,7 +2348,12 @@ sys_background:
and edx,0xFF000000 ;255*256*256*256
and ecx,0x00FFFFFF ;255*256*256+255*256+255
add edx,ecx
- mov [ebx+IMG_BACKGROUND],edx
+
+; mov [ebx+IMG_BACKGROUND],edx
+ push eax
+ mov eax,[img_background]
+ mov [ebx+eax],edx
+ pop eax
; mov [bgrchanged],1
ret
nosb2:
@@ -2342,29 +2386,17 @@ draw_background_temp:
; bughere
mov edi, [TASK_BASE]
add ebx, [edi+TASKDATA.mem_start]
- ; mov esi, ebx
- ; mov edi, ecx
mov eax, ebx
mov ebx, ecx
add ecx, edx
- cmp ecx, 0x160000-16
- ja .fin
- ; add edi, 0x300000
- add ebx, IMG_BACKGROUND
+ add ebx, [img_background] ;IMG_BACKGROUND
mov ecx, edx
- cmp ecx, 0x160000-16
- ja .fin
-; mov [bgrchanged],1
- ; cld
- ; rep movsb
call memmove
.fin:
ret
nosb5:
-
ret
-
align 4
sys_getbackground:
@@ -2380,10 +2412,13 @@ sys_getbackground:
cmp eax,2 ; PIXEL
jnz nogb2
- mov edx,0x160000-16
- cmp edx,ebx
- jbe nogb2
- mov eax, [ebx+IMG_BACKGROUND]
+; mov edx,0x160000-16
+; cmp edx,ebx
+; jbe nogb2
+; mov eax, [ebx+IMG_BACKGROUND]
+ mov eax,[img_background]
+ mov eax,[ebx+eax]
+
and eax, 0xFFFFFF
mov [esp+36],eax
ret
@@ -3533,12 +3568,12 @@ calculatebackground: ; background
; all black
- mov [display_data-8],dword 4 ; size x
- mov [display_data-4],dword 2 ; size y
+; mov [display_data-8],dword 4 ; size x
+; mov [display_data-4],dword 2 ; size y
- mov edi, IMG_BACKGROUND ; set background to black
+ mov edi, [img_background] ;IMG_BACKGROUND ; set background to black
xor eax, eax
- mov ecx, 0x0fff00 / 4
+ mov ecx, 1023 ;0x0fff00 / 4
cld
rep stosd
diff --git a/kernel/trunk/video/vesa12.inc b/kernel/trunk/video/vesa12.inc
index e548157661..8699b4ef2e 100644
--- a/kernel/trunk/video/vesa12.inc
+++ b/kernel/trunk/video/vesa12.inc
@@ -220,7 +220,7 @@ vesa12_drawbackground:
push eax
push ebx
- mov esi,IMG_BACKGROUND
+ mov esi,[img_background] ;IMG_BACKGROUND
cmp [WinMapAddress-12],dword 1 ; tiled background
jne no_vesa12_tiled_bgr
@@ -282,7 +282,7 @@ vesa12_drawbackground:
add esi,eax
add esi,eax
add esi,eax
- add esi,IMG_BACKGROUND
+ add esi,[img_background] ;IMG_BACKGROUND
pop ebx
pop eax
diff --git a/kernel/trunk/video/vesa20.inc b/kernel/trunk/video/vesa20.inc
index b2a62da4bc..88417efd0f 100644
--- a/kernel/trunk/video/vesa20.inc
+++ b/kernel/trunk/video/vesa20.inc
@@ -41,30 +41,29 @@ $Revision$
; ecx = 00 RR GG BB
getpixel:
- push eax ebx edx edi
- call dword [GETPIXEL]
- pop edi edx ebx eax
- ret
+ push eax ebx edx edi
+ call dword [GETPIXEL]
+ pop edi edx ebx eax
+ ret
Vesa20_getpixel24:
- ; eax = x
- ; ebx = y
- imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier
- lea edi, [eax+eax*2] ; edi = x*3
- add edi, ebx ; edi = x*3+(y*y multiplier)
- add edi, [LFBAddress] ; ebx = where pixel is in memory
- mov ecx, [edi]
- and ecx, 0xffffff
- ret
-
+; eax = x
+; ebx = y
+ imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier
+ lea edi, [eax+eax*2] ; edi = x*3
+ add edi, ebx ; edi = x*3+(y*y multiplier)
+ add edi, [LFBAddress] ; ebx = where pixel is in memory
+ mov ecx, [edi]
+ and ecx, 0xffffff
+ ret
Vesa20_getpixel32:
- imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier
- lea edi, [ebx+eax*4] ; edi = x*4+(y*y multiplier)
- add edi, [LFBAddress] ; ebx = where pixel is in memory
- mov ecx, [edi]
- and ecx, 0xffffff
- ret
+ imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier
+ lea edi, [ebx+eax*4] ; edi = x*4+(y*y multiplier)
+ add edi, [LFBAddress] ; ebx = where pixel is in memory
+ mov ecx, [edi]
+ and ecx, 0xffffff
+ ret
;*************************************************
@@ -102,205 +101,178 @@ align 16
; ebp = pointer to 'get' function
; esi = pointer to 'init' function
; edi = parameter for 'get' function
+
vesa20_putimage:
- pushad
- call [disable_mouse]
-
- sub esp, putimg.stack_data
-
- ; save pointer to image
- mov [putimg.pti], ebx
-
- ; unpack the size
- mov eax, ecx
- and ecx, 0xFFFF
- shr eax, 16
- mov [putimg.image_sx], eax
- mov [putimg.image_sy], ecx
-
- ; unpack the coordinates
- mov eax, edx
- and edx, 0xFFFF
- shr eax, 16
- mov [putimg.image_cx], eax
- mov [putimg.image_cy], edx
-
- ; calculate absolute (i.e. screen) coordinates
- mov eax, [TASK_BASE]
- mov ebx, [eax-twdw + WDATA.box.left]
- add ebx, [putimg.image_cx]
- mov [putimg.abs_cx], ebx
- mov ebx, [eax-twdw + WDATA.box.top]
- add ebx, [putimg.image_cy]
- mov [putimg.abs_cy], ebx
-
- ; real_sx = MIN(wnd_sx-image_cx, image_sx);
- mov ebx, [eax-twdw + WDATA.box.width] ; ebx = wnd_sx
+ pushad
+ call [disable_mouse]
+ sub esp, putimg.stack_data
+; save pointer to image
+ mov [putimg.pti], ebx
+; unpack the size
+ mov eax, ecx
+ and ecx, 0xFFFF
+ shr eax, 16
+ mov [putimg.image_sx], eax
+ mov [putimg.image_sy], ecx
+; unpack the coordinates
+ mov eax, edx
+ and edx, 0xFFFF
+ shr eax, 16
+ mov [putimg.image_cx], eax
+ mov [putimg.image_cy], edx
+; calculate absolute (i.e. screen) coordinates
+ mov eax, [TASK_BASE]
+ mov ebx, [eax-twdw + WDATA.box.left]
+ add ebx, [putimg.image_cx]
+ mov [putimg.abs_cx], ebx
+ mov ebx, [eax-twdw + WDATA.box.top]
+ add ebx, [putimg.image_cy]
+ mov [putimg.abs_cy], ebx
+; real_sx = MIN(wnd_sx-image_cx, image_sx);
+ mov ebx, [eax-twdw + WDATA.box.width] ; ebx = wnd_sx
; \begin{diamond}[20.08.2006]
; note that WDATA.box.width is one pixel less than real window x-size
- inc ebx
+ inc ebx
; \end{diamond}[20.08.2006]
- sub ebx, [putimg.image_cx]
- ja @f
- add esp, putimg.stack_data
- popad
- ret
- @@:
- cmp ebx, [putimg.image_sx]
- jbe .end_x
- mov ebx, [putimg.image_sx]
- .end_x:
- mov [putimg.real_sx], ebx
-
- ; init real_sy
- mov ebx, [eax-twdw + WDATA.box.height] ; ebx = wnd_sy
+ sub ebx, [putimg.image_cx]
+ ja @f
+ add esp, putimg.stack_data
+ popad
+ ret
+@@:
+ cmp ebx, [putimg.image_sx]
+ jbe .end_x
+ mov ebx, [putimg.image_sx]
+.end_x:
+ mov [putimg.real_sx], ebx
+; init real_sy
+ mov ebx, [eax-twdw + WDATA.box.height] ; ebx = wnd_sy
; \begin{diamond}[20.08.2006]
- inc ebx
+ inc ebx
; \end{diamond}[20.08.2006]
- sub ebx, [putimg.image_cy]
- ja @f
- add esp, putimg.stack_data
- popad
- ret
- @@:
- cmp ebx, [putimg.image_sy]
- jbe .end_y
- mov ebx, [putimg.image_sy]
- .end_y:
- mov [putimg.real_sy], ebx
-
- ; line increment
- mov eax, [putimg.image_sx]
- sub eax, [putimg.real_sx]
-;; imul eax, [putimg.source_bpp]
-; lea eax, [eax + eax * 2]
- call esi
- add eax, [putimg.arg_0]
- mov [putimg.line_increment], eax
-
- ; winmap new line increment
- mov eax, [ScreenWidth]
- inc eax
- sub eax, [putimg.real_sx]
- mov [putimg.winmap_newline], eax
-
- ; screen new line increment
- mov eax, [BytesPerScanLine]
- mov ecx, [putimg.real_sx]
- movzx ebx, byte [ScreenBPP]
- shr ebx, 3
- imul ecx, ebx
- sub eax, ecx
- mov [putimg.screen_newline], eax
-
- ; pointer to image
- mov esi, [putimg.pti]
-
- ; pointer to screen
- mov edx, [putimg.abs_cy]
- imul edx, [BytesPerScanLine]
- mov eax, [putimg.abs_cx]
- movzx ebx, byte [ScreenBPP]
- shr ebx, 3
- imul eax, ebx
- add edx, eax
- add edx, [LFBAddress]
-
- ; pointer to pixel map
- mov eax, [putimg.abs_cy]
- imul eax, [ScreenWidth]
- add eax, [putimg.abs_cy]
- add eax, [putimg.abs_cx]
- add eax, WinMapAddress
- xchg eax, ebp
-
- ; get process number
- mov ebx, [CURRENT_TASK]
-
- cmp byte [ScreenBPP], 32
- je put_image_end_32
-
+ sub ebx, [putimg.image_cy]
+ ja @f
+ add esp, putimg.stack_data
+ popad
+ ret
+@@:
+ cmp ebx, [putimg.image_sy]
+ jbe .end_y
+ mov ebx, [putimg.image_sy]
+.end_y:
+ mov [putimg.real_sy], ebx
+; line increment
+ mov eax, [putimg.image_sx]
+ sub eax, [putimg.real_sx]
+;; imul eax, [putimg.source_bpp]
+; lea eax, [eax + eax * 2]
+ call esi
+ add eax, [putimg.arg_0]
+ mov [putimg.line_increment], eax
+; winmap new line increment
+ mov eax, [ScreenWidth]
+ inc eax
+ sub eax, [putimg.real_sx]
+ mov [putimg.winmap_newline], eax
+; screen new line increment
+ mov eax, [BytesPerScanLine]
+ mov ecx, [putimg.real_sx]
+ movzx ebx, byte [ScreenBPP]
+ shr ebx, 3
+ imul ecx, ebx
+ sub eax, ecx
+ mov [putimg.screen_newline], eax
+; pointer to image
+ mov esi, [putimg.pti]
+; pointer to screen
+ mov edx, [putimg.abs_cy]
+ imul edx, [BytesPerScanLine]
+ mov eax, [putimg.abs_cx]
+ movzx ebx, byte [ScreenBPP]
+ shr ebx, 3
+ imul eax, ebx
+ add edx, eax
+ add edx, [LFBAddress]
+; pointer to pixel map
+ mov eax, [putimg.abs_cy]
+ imul eax, [ScreenWidth]
+ add eax, [putimg.abs_cy]
+ add eax, [putimg.abs_cx]
+ add eax, WinMapAddress
+ xchg eax, ebp
+; get process number
+ mov ebx, [CURRENT_TASK]
+ cmp byte [ScreenBPP], 32
+ je put_image_end_32
;put_image_end_24:
- mov edi, [putimg.real_sy]
- align 4
- .new_line:
- mov ecx, [putimg.real_sx]
-
-; push ebp edx
- align 4
- .new_x:
-
- push [putimg.edi]
- mov eax, [putimg.ebp+4]
- call eax
- cmp [ebp], bl
- jne .skip
-; mov eax, [esi] ; eax = RRBBGGRR
- mov [edx], ax
- shr eax, 16
- mov [edx+2], al
- .skip:
-
-; add esi, 3 ;[putimg.source_bpp]
- add edx, 3
- inc ebp
-
- dec ecx
- jnz .new_x
-; pop edx ebp
-
- add esi, [putimg.line_increment]
- add edx, [putimg.screen_newline] ;[BytesPerScanLine]
- add ebp, [putimg.winmap_newline] ;[ScreenWidth]
- ;inc ebp
-
- dec edi
- jnz .new_line
- .finish:
- add esp, putimg.stack_data
- popad
-ret
+ mov edi, [putimg.real_sy]
+align 4
+.new_line:
+ mov ecx, [putimg.real_sx]
+; push ebp edx
+align 4
+.new_x:
+ push [putimg.edi]
+ mov eax, [putimg.ebp+4]
+ call eax
+ cmp [ebp], bl
+ jne .skip
+; mov eax, [esi] ; eax = RRBBGGRR
+ mov [edx], ax
+ shr eax, 16
+ mov [edx+2], al
+.skip:
+; add esi, 3 ;[putimg.source_bpp]
+ add edx, 3
+ inc ebp
+ dec ecx
+ jnz .new_x
+; pop edx ebp
+ add esi, [putimg.line_increment]
+ add edx, [putimg.screen_newline] ;[BytesPerScanLine]
+ add ebp, [putimg.winmap_newline] ;[ScreenWidth]
+; inc ebp
+ dec edi
+ jnz .new_line
+.finish:
+ add esp, putimg.stack_data
+ popad
+ ret
put_image_end_32:
- mov edi, [putimg.real_sy]
- align 4
- .new_line:
- mov ecx, [putimg.real_sx]
-
-; push ebp edx
- align 4
- .new_x:
-
- push [putimg.edi]
- mov eax, [putimg.ebp+4]
- call eax
- cmp [ebp], bl
- jne .skip
-; mov eax, [esi] ; ecx = RRBBGGRR
- mov [edx], eax
- .skip:
-
-; add esi, [putimg.source_bpp]
- add edx, 4
- inc ebp
-
- dec ecx
- jnz .new_x
-; pop edx ebp
-
- add esi, [putimg.line_increment]
- add edx, [putimg.screen_newline] ;[BytesPerScanLine]
- add ebp, [putimg.winmap_newline] ;[ScreenWidth]
- ;inc ebp
-
- dec edi
- jnz .new_line
- .finish:
- add esp, putimg.stack_data
- popad
- call VGA__putimage
- mov [EGA_counter],1
-ret
+ mov edi, [putimg.real_sy]
+align 4
+.new_line:
+ mov ecx, [putimg.real_sx]
+; push ebp edx
+align 4
+.new_x:
+ push [putimg.edi]
+ mov eax, [putimg.ebp+4]
+ call eax
+ cmp [ebp], bl
+ jne .skip
+; mov eax, [esi] ; ecx = RRBBGGRR
+ mov [edx], eax
+.skip:
+; add esi, [putimg.source_bpp]
+ add edx, 4
+ inc ebp
+ dec ecx
+ jnz .new_x
+; pop edx ebp
+ add esi, [putimg.line_increment]
+ add edx, [putimg.screen_newline] ;[BytesPerScanLine]
+ add ebp, [putimg.winmap_newline] ;[ScreenWidth]
+; inc ebp
+ dec edi
+ jnz .new_line
+.finish:
+ add esp, putimg.stack_data
+ popad
+ call VGA__putimage
+ mov [EGA_counter],1
+ ret
;*************************************************
@@ -313,78 +285,69 @@ __sys_putpixel:
; edi = 0x00000001 force
;;; mov [novesachecksum], dword 0
-
- pushad
- test edi,1 ; force ?
- jnz .forced
- ; not forced:
- push ecx ; save 24th bit in case negative pixel wanted
- call checkpixel
- test ecx,ecx
- pop ecx
- jnz .exit
- .forced:
- cmp [ScreenWidth], eax
- jb .exit
- cmp [ScreenHeight], ebx
- jb .exit
- .ok:
- ; check if negation
- test ecx,0x01000000
- jz .noneg
- call getpixel
- not ecx
- mov [esp+32-8],ecx
- .noneg:
- ; OK to set pixel
- call dword [PUTPIXEL] ; call the real put_pixel function
- .exit:
- popad
-
- ret
+ pushad
+ test edi,1 ; force ?
+ jnz .forced
+; not forced:
+ push ecx ; save 24th bit in case negative pixel wanted
+ call checkpixel
+ test ecx,ecx
+ pop ecx
+ jnz .exit
+.forced:
+ cmp [ScreenWidth], eax
+ jb .exit
+ cmp [ScreenHeight], ebx
+ jb .exit
+.ok:
+; check if negation
+ test ecx,0x01000000
+ jz .noneg
+ call getpixel
+ not ecx
+ mov [esp+32-8],ecx
+.noneg:
+; OK to set pixel
+ call dword [PUTPIXEL] ; call the real put_pixel function
+.exit:
+ popad
+ ret
align 4
Vesa20_putpixel24:
-
- ; eax = x
- ; ebx = y
-
- imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier
- lea edi, [eax+eax*2] ; edi = x*3
- mov eax, [esp+32-8+4]
- add edi, [LFBAddress]
- add edi, ebx ; ebx = where to put pixel in memory
- mov [edi], ax
- shr eax, 16
- mov [edi+2], al
-
- ret
+; eax = x
+; ebx = y
+ imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier
+ lea edi, [eax+eax*2] ; edi = x*3
+ mov eax, [esp+32-8+4]
+ add edi, [LFBAddress]
+ add edi, ebx ; ebx = where to put pixel in memory
+ mov [edi], ax
+ shr eax, 16
+ mov [edi+2], al
+ ret
align 4
Vesa20_putpixel32:
-
- ; eax = x
- ; ebx = y
-
- imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier
- lea edi, [ebx+eax*4] ; edi = x*4+(y*y multiplier)
- mov eax, [esp+32-8+4] ; eax = color
- add edi, [LFBAddress] ; ebx = where to put pixel in memory
- mov [edi], eax
-
- ret
-
+; eax = x
+; ebx = y
+ imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier
+ lea edi, [ebx+eax*4] ; edi = x*4+(y*y multiplier)
+ mov eax, [esp+32-8+4] ; eax = color
+ add edi, [LFBAddress] ; ebx = where to put pixel in memory
+ mov [edi], eax
+ ret
;*************************************************
;align 4
calculate_edi:
- mov edi, ebx
- imul edi, [ScreenWidth]
- add edi, ebx
- add edi, eax
-ret
+ mov edi, ebx
+ imul edi, [ScreenWidth]
+ add edi, ebx
+ add edi, eax
+ ret
;*************************************************
@@ -393,7 +356,7 @@ ret
align 4
__sys_draw_line:
; inc [mouse_pause]
- call [disable_mouse]
+ call [disable_mouse]
; draw a line
; eax = HIWORD = x1
@@ -411,126 +374,107 @@ dl_y2 equ esp+8
dl_dx equ esp+4
dl_dy equ esp+0
- xor edx, edx ; clear edx
- xor esi, esi ; unpack arguments
- xor ebp, ebp
- mov si, ax ; esi = x2
- mov bp, bx ; ebp = y2
- shr eax, 16 ; eax = x1
- shr ebx, 16 ; ebx = y1
-
- push eax ; save x1
- push ebx ; save y1
- push esi ; save x2
- push ebp ; save y2
-
- ; checking x-axis...
- sub esi, eax ; esi = x2-x1
- push esi ; save y2-y1
- jl .x2lx1 ; is x2 less than x1 ?
- jg .no_vline ; x1 > x2 ?
- mov edx, ebp ; else (if x1=x2)
- call vline
- push edx ; necessary to rightly restore stack frame at .exit
- jmp .exit
+ xor edx, edx ; clear edx
+ xor esi, esi ; unpack arguments
+ xor ebp, ebp
+ mov si, ax ; esi = x2
+ mov bp, bx ; ebp = y2
+ shr eax, 16 ; eax = x1
+ shr ebx, 16 ; ebx = y1
+ push eax ; save x1
+ push ebx ; save y1
+ push esi ; save x2
+ push ebp ; save y2
+; checking x-axis...
+ sub esi, eax ; esi = x2-x1
+ push esi ; save y2-y1
+ jl .x2lx1 ; is x2 less than x1 ?
+ jg .no_vline ; x1 > x2 ?
+ mov edx, ebp ; else (if x1=x2)
+ call vline
+ push edx ; necessary to rightly restore stack frame at .exit
+ jmp .exit
.x2lx1:
- neg esi ; get esi absolute value
+ neg esi ; get esi absolute value
.no_vline:
+; checking y-axis...
+ sub ebp, ebx ; ebp = y2-y1
+ push ebp ; save y2-y1
+ jl .y2ly1 ; is y2 less than y1 ?
+ jg .no_hline ; y1 > y2 ?
+ mov edx, [dl_x2] ; else (if y1=y2)
+ call hline
+ jmp .exit
- ; checking y-axis...
- sub ebp, ebx ; ebp = y2-y1
- push ebp ; save y2-y1
- jl .y2ly1 ; is y2 less than y1 ?
- jg .no_hline ; y1 > y2 ?
- mov edx, [dl_x2] ; else (if y1=y2)
- call hline
- jmp .exit
.y2ly1:
- neg ebp ; get ebp absolute value
+ neg ebp ; get ebp absolute value
.no_hline:
-
-
- cmp ebp, esi
- jle .x_rules ; |y2-y1| < |x2-x1| ?
-
- cmp [dl_y2], ebx ; make sure y1 is at the begining
- jge .no_reverse1
-
- neg dword [dl_dx]
- mov edx, [dl_x2]
- mov [dl_x2], eax
- mov [dl_x1], edx
- mov edx, [dl_y2]
- mov [dl_y2], ebx
- mov [dl_y1], edx
-
+ cmp ebp, esi
+ jle .x_rules ; |y2-y1| < |x2-x1| ?
+ cmp [dl_y2], ebx ; make sure y1 is at the begining
+ jge .no_reverse1
+ neg dword [dl_dx]
+ mov edx, [dl_x2]
+ mov [dl_x2], eax
+ mov [dl_x1], edx
+ mov edx, [dl_y2]
+ mov [dl_y2], ebx
+ mov [dl_y1], edx
.no_reverse1:
+ mov eax, [dl_dx]
+ cdq ; extend eax sing to edx
+ shl eax, 16 ; using 16bit fix-point maths
+ idiv ebp ; eax = ((x2-x1)*65536)/(y2-y1)
+ mov edx, ebp ; edx = counter (number of pixels to draw)
+ mov ebp, 1 *65536 ; <<16 ; ebp = dy = 1.0
+ mov esi, eax ; esi = dx
+ jmp .y_rules
- mov eax, [dl_dx]
- cdq ; extend eax sing to edx
- shl eax, 16 ; using 16bit fix-point maths
- idiv ebp ; eax = ((x2-x1)*65536)/(y2-y1)
- mov edx, ebp ; edx = counter (number of pixels to draw)
- mov ebp, 1 *65536 ; <<16 ; ebp = dy = 1.0
- mov esi, eax ; esi = dx
-
- jmp .y_rules
.x_rules:
-
- cmp [dl_x2], eax ; make sure x1 is at the begining
- jge .no_reverse2
-
- neg dword [dl_dy]
- mov edx, [dl_x2]
- mov [dl_x2], eax
- mov [dl_x1], edx
- mov edx, [dl_y2]
- mov [dl_y2], ebx
- mov [dl_y1], edx
-
+ cmp [dl_x2], eax ; make sure x1 is at the begining
+ jge .no_reverse2
+ neg dword [dl_dy]
+ mov edx, [dl_x2]
+ mov [dl_x2], eax
+ mov [dl_x1], edx
+ mov edx, [dl_y2]
+ mov [dl_y2], ebx
+ mov [dl_y1], edx
.no_reverse2:
-
- xor edx, edx
- mov eax, [dl_dy]
- cdq ; extend eax sing to edx
- shl eax, 16 ; using 16bit fix-point maths
- idiv esi ; eax = ((y2-y1)*65536)/(x2-x1)
- mov edx, esi ; edx = counter (number of pixels to draw)
- mov esi, 1 *65536 ;<< 16 ; esi = dx = 1.0
- mov ebp, eax ; ebp = dy
-
+ xor edx, edx
+ mov eax, [dl_dy]
+ cdq ; extend eax sing to edx
+ shl eax, 16 ; using 16bit fix-point maths
+ idiv esi ; eax = ((y2-y1)*65536)/(x2-x1)
+ mov edx, esi ; edx = counter (number of pixels to draw)
+ mov esi, 1 *65536 ;<< 16 ; esi = dx = 1.0
+ mov ebp, eax ; ebp = dy
.y_rules:
-
- mov eax, [dl_x1]
- mov ebx, [dl_y1]
- shl eax, 16
- shl ebx, 16
-
+ mov eax, [dl_x1]
+ mov ebx, [dl_y1]
+ shl eax, 16
+ shl ebx, 16
align 4
-
.draw:
- push eax ebx
- shr eax, 16
- shr ebx, 16
- call [putpixel]
- pop ebx eax
-
- add ebx, ebp ; y = y+dy
- add eax, esi ; x = x+dx
-
- dec edx
- jnz .draw
-
- ; force last drawn pixel to be at (x2,y2)
- mov eax, [dl_x2]
- mov ebx, [dl_y2]
- call [putpixel]
+ push eax ebx
+ shr eax, 16
+ shr ebx, 16
+ call [putpixel]
+ pop ebx eax
+ add ebx, ebp ; y = y+dy
+ add eax, esi ; x = x+dx
+ dec edx
+ jnz .draw
+; force last drawn pixel to be at (x2,y2)
+ mov eax, [dl_x2]
+ mov ebx, [dl_y2]
+ call [putpixel]
.exit:
- add esp, 6*4
- popa
+ add esp, 6*4
+ popa
; dec [mouse_pause]
call [draw_pointer]
-ret
+ ret
hline:
@@ -540,20 +484,18 @@ hline:
; ebx = y
; ecx = color
; edi = force ?
- push eax edx
-
- cmp edx, eax ; make sure x2 is above x1
- jge @f
- xchg eax, edx
- align 4
- @@:
- call [putpixel]
- inc eax
- cmp eax, edx
- jle @b
-
- pop edx eax
-ret
+ push eax edx
+ cmp edx, eax ; make sure x2 is above x1
+ jge @f
+ xchg eax, edx
+align 4
+@@:
+ call [putpixel]
+ inc eax
+ cmp eax, edx
+ jle @b
+ pop edx eax
+ ret
vline:
@@ -563,39 +505,37 @@ vline:
; edx = y2
; ecx = color
; edi = force ?
- push ebx edx
-
- cmp edx, ebx ; make sure y2 is above y1
- jge @f
- xchg ebx, edx
- align 4
- @@:
- call [putpixel]
- inc ebx
- cmp ebx, edx
- jle @b
-
- pop edx ebx
-ret
+ push ebx edx
+ cmp edx, ebx ; make sure y2 is above y1
+ jge @f
+ xchg ebx, edx
+align 4
+@@:
+ call [putpixel]
+ inc ebx
+ cmp ebx, edx
+ jle @b
+ pop edx ebx
+ ret
;*************************************************
virtual at esp
- drbar:
- .bar_sx dd ?
- .bar_sy dd ?
- .bar_cx dd ?
- .bar_cy dd ?
- .abs_cx dd ?
- .abs_cy dd ?
- .real_sx dd ?
- .real_sy dd ?
- .color dd ?
- .line_inc_scr dd ?
- .line_inc_map dd ?
- .stack_data = 4*11
+drbar:
+ .bar_sx dd ?
+ .bar_sy dd ?
+ .bar_cx dd ?
+ .bar_cy dd ?
+ .abs_cx dd ?
+ .abs_cy dd ?
+ .real_sx dd ?
+ .real_sy dd ?
+ .color dd ?
+ .line_inc_scr dd ?
+ .line_inc_map dd ?
+ .stack_data = 4*11
end virtual
align 4
@@ -605,114 +545,98 @@ align 4
; edx ye
; edi color
vesa20_drawbar:
-
- pushad
- call [disable_mouse]
-
- sub esp, drbar.stack_data
-
- mov [drbar.color], edi
-
- sub edx, ebx
- jle .exit ;// mike.dld, 2005-01-29
- sub ecx, eax
- jle .exit ;// mike.dld, 2005-01-29
- mov [drbar.bar_sy], edx
- mov [drbar.bar_sx], ecx
-
- mov [drbar.bar_cx], eax
- mov [drbar.bar_cy], ebx
-
- mov edi, [TASK_BASE]
- add eax, [edi-twdw + WDATA.box.left] ; win_cx
- add ebx, [edi-twdw + WDATA.box.top] ; win_cy
- mov [drbar.abs_cx], eax
- mov [drbar.abs_cy], ebx
-
- ; real_sx = MIN(wnd_sx-bar_cx, bar_sx);
- mov ebx, [edi-twdw + WDATA.box.width] ; ebx = wnd_sx
+ pushad
+ call [disable_mouse]
+ sub esp, drbar.stack_data
+ mov [drbar.color], edi
+ sub edx, ebx
+ jle .exit ;// mike.dld, 2005-01-29
+ sub ecx, eax
+ jle .exit ;// mike.dld, 2005-01-29
+ mov [drbar.bar_sy], edx
+ mov [drbar.bar_sx], ecx
+ mov [drbar.bar_cx], eax
+ mov [drbar.bar_cy], ebx
+ mov edi, [TASK_BASE]
+ add eax, [edi-twdw + WDATA.box.left] ; win_cx
+ add ebx, [edi-twdw + WDATA.box.top] ; win_cy
+ mov [drbar.abs_cx], eax
+ mov [drbar.abs_cy], ebx
+; real_sx = MIN(wnd_sx-bar_cx, bar_sx);
+ mov ebx, [edi-twdw + WDATA.box.width] ; ebx = wnd_sx
; \begin{diamond}[20.08.2006]
; note that WDATA.box.width is one pixel less than real window x-size
- inc ebx
+ inc ebx
; \end{diamond}[20.08.2006]
- sub ebx, [drbar.bar_cx]
- ja @f
- .exit: ;// mike.dld, 2005-01-29
- add esp, drbar.stack_data
- popad
- xor eax, eax
- inc eax
-
- ret
- @@:
- cmp ebx, [drbar.bar_sx]
- jbe .end_x
- mov ebx, [drbar.bar_sx]
- .end_x:
- mov [drbar.real_sx], ebx
-
- ; real_sy = MIN(wnd_sy-bar_cy, bar_sy);
- mov ebx, [edi-twdw + WDATA.box.height] ; ebx = wnd_sy
+ sub ebx, [drbar.bar_cx]
+ ja @f
+.exit: ;// mike.dld, 2005-01-29
+ add esp, drbar.stack_data
+ popad
+ xor eax, eax
+ inc eax
+ ret
+@@:
+ cmp ebx, [drbar.bar_sx]
+ jbe .end_x
+ mov ebx, [drbar.bar_sx]
+.end_x:
+ mov [drbar.real_sx], ebx
+; real_sy = MIN(wnd_sy-bar_cy, bar_sy);
+ mov ebx, [edi-twdw + WDATA.box.height] ; ebx = wnd_sy
; \begin{diamond}[20.08.2006]
- inc ebx
+ inc ebx
; \end{diamond}
- sub ebx, [drbar.bar_cy]
- ja @f
- add esp, drbar.stack_data
- popad
- xor eax, eax
- inc eax
-
- ret
- @@:
- cmp ebx, [drbar.bar_sy]
- jbe .end_y
- mov ebx, [drbar.bar_sy]
- .end_y:
- mov [drbar.real_sy], ebx
-
- ; line_inc_map
- mov eax, [ScreenWidth]
- sub eax, [drbar.real_sx]
- inc eax
- mov [drbar.line_inc_map], eax
-
- ; line_inc_scr
- mov eax, [drbar.real_sx]
- movzx ebx, byte [ScreenBPP]
- shr ebx, 3
- imul eax, ebx
- neg eax
- add eax, [BytesPerScanLine]
- mov [drbar.line_inc_scr], eax
-
- ; pointer to screen
- mov edx, [drbar.abs_cy]
- imul edx, [BytesPerScanLine]
- mov eax, [drbar.abs_cx]
-; movzx ebx, byte [ScreenBPP]
-; shr ebx, 3
- imul eax, ebx
- add edx, eax
- add edx, [LFBAddress]
-
- ; pointer to pixel map
- mov eax, [drbar.abs_cy]
- imul eax, [ScreenWidth]
- add eax, [drbar.abs_cy]
- add eax, [drbar.abs_cx]
- add eax, WinMapAddress
- xchg eax, ebp
-
- ; get process number
- mov ebx, [CURRENT_TASK]
-
- cmp byte [ScreenBPP], 24
- jne draw_bar_end_32
+ sub ebx, [drbar.bar_cy]
+ ja @f
+ add esp, drbar.stack_data
+ popad
+ xor eax, eax
+ inc eax
+ ret
+@@:
+ cmp ebx, [drbar.bar_sy]
+ jbe .end_y
+ mov ebx, [drbar.bar_sy]
+.end_y:
+ mov [drbar.real_sy], ebx
+; line_inc_map
+ mov eax, [ScreenWidth]
+ sub eax, [drbar.real_sx]
+ inc eax
+ mov [drbar.line_inc_map], eax
+; line_inc_scr
+ mov eax, [drbar.real_sx]
+ movzx ebx, byte [ScreenBPP]
+ shr ebx, 3
+ imul eax, ebx
+ neg eax
+ add eax, [BytesPerScanLine]
+ mov [drbar.line_inc_scr], eax
+; pointer to screen
+ mov edx, [drbar.abs_cy]
+ imul edx, [BytesPerScanLine]
+ mov eax, [drbar.abs_cx]
+; movzx ebx, byte [ScreenBPP]
+; shr ebx, 3
+ imul eax, ebx
+ add edx, eax
+ add edx, [LFBAddress]
+; pointer to pixel map
+ mov eax, [drbar.abs_cy]
+ imul eax, [ScreenWidth]
+ add eax, [drbar.abs_cy]
+ add eax, [drbar.abs_cx]
+ add eax, WinMapAddress
+ xchg eax, ebp
+; get process number
+ mov ebx, [CURRENT_TASK]
+ cmp byte [ScreenBPP], 24
+ jne draw_bar_end_32
draw_bar_end_24:
- mov eax, [drbar.color] ;; BBGGRR00
- mov bh, al ;; bh = BB
- shr eax, 8 ;; eax = RRGG
+ mov eax, [drbar.color] ;; BBGGRR00
+ mov bh, al ;; bh = BB
+ shr eax, 8 ;; eax = RRGG
; eax - color high RRGG
; bl - process num
; bh - color low BB
@@ -720,93 +644,76 @@ draw_bar_end_24:
; edx - pointer to screen
; esi - counter
; edi - counter
-
- mov esi, [drbar.real_sy]
- align 4
- .new_y:
- mov edi, [drbar.real_sx]
- align 4
- .new_x:
-
- cmp byte [ebp], bl
- jne .skip
- mov [edx], bh
- mov [edx + 1], ax
- .skip:
-
- ; add pixel
- add edx, 3
- inc ebp
-
- dec edi
- jnz .new_x
-
- ; add line
- add edx, [drbar.line_inc_scr]
- add ebp, [drbar.line_inc_map]
-
- ; drawing gradient bars
- test eax, 0x00800000
- jz @f
- test bh, bh
- jz @f
- dec bh
- @@:
- ;
-
- dec esi
- jnz .new_y
-
- add esp, drbar.stack_data
- popad
- xor eax, eax
-ret
+ mov esi, [drbar.real_sy]
+align 4
+.new_y:
+ mov edi, [drbar.real_sx]
+align 4
+.new_x:
+ cmp byte [ebp], bl
+ jne .skip
+ mov [edx], bh
+ mov [edx + 1], ax
+.skip:
+; add pixel
+ add edx, 3
+ inc ebp
+ dec edi
+ jnz .new_x
+; add line
+ add edx, [drbar.line_inc_scr]
+ add ebp, [drbar.line_inc_map]
+; drawing gradient bars
+ test eax, 0x00800000
+ jz @f
+ test bh, bh
+ jz @f
+ dec bh
+@@:
+;
+ dec esi
+ jnz .new_y
+ add esp, drbar.stack_data
+ popad
+ xor eax, eax
+ ret
draw_bar_end_32:
- mov eax, [drbar.color] ;; BBGGRR00
-
- mov esi, [drbar.real_sy]
- align 4
- .new_y:
- mov edi, [drbar.real_sx]
- align 4
- .new_x:
-
- cmp byte [ebp], bl
- jne .skip
- mov [edx], eax
- .skip:
-
- ; add pixel
- add edx, 4
- inc ebp
-
- dec edi
- jnz .new_x
-
- ; add line
- add edx, [drbar.line_inc_scr]
- add ebp, [drbar.line_inc_map]
-
- ; drawing gradient bars
- test eax, 0x80000000
- jz @f
- test al, al
- jz @f
- dec al
- @@:
- ;
-
- dec esi
- jnz .new_y
-
- add esp, drbar.stack_data
- popad
- call VGA_draw_bar
- xor eax, eax
- mov [EGA_counter],1
-ret
-
+ mov eax, [drbar.color] ;; BBGGRR00
+ mov esi, [drbar.real_sy]
+align 4
+.new_y:
+ mov edi, [drbar.real_sx]
+align 4
+.new_x:
+ cmp byte [ebp], bl
+ jne .skip
+ mov [edx], eax
+.skip:
+; add pixel
+ add edx, 4
+ inc ebp
+ dec edi
+ jnz .new_x
+; add line
+ add edx, [drbar.line_inc_scr]
+ add ebp, [drbar.line_inc_map]
+; drawing gradient bars
+ test eax, 0x80000000
+ jz @f
+ test al, al
+ jz @f
+ dec al
+@@:
+;
+ dec esi
+ jnz .new_y
+ add esp, drbar.stack_data
+ popad
+ call VGA_draw_bar
+ xor eax, eax
+ mov [EGA_counter],1
+ ret
;voodoodbcplimit:
@@ -868,75 +775,54 @@ ret
;--------------vbe voodoo ------------------------------------------------
vesa20_drawbackground_tiled:
-
call [disable_mouse]
-
push ebp
push eax
push ebx
push ecx
push edx
-
mov edx,dword [WinMapAddress-8] ; B
add edx,dword [WinMapAddress-8] ; +B
add edx,dword [WinMapAddress-8] ; +B
push edx
-
mov ebp,[draw_data+32+RECT.left] ; x start:=(x+Xwin)
mov ebx,[draw_data+32+RECT.top] ; y start:=(y+Ywin)
-
mov eax,[BytesPerScanLine]
mul ebx
xchg ebp, eax ; BytesPerScanLine*(Ywin+y)
add ebp, eax ; +X
add ebp, eax ; +X
add ebp, eax ; +X
-
cmp [ScreenBPP],byte 24 ; 24 or 32 bpp ? - x size
jz @f
add ebp,eax ; +X
- @@:
+@@:
add ebp,[LFBAddress] ; +LFB
-
- ; ebp:=Y*BytesPerScanLine+X*BytesPerPixel+AddrLFB
-
+; ebp:=Y*BytesPerScanLine+X*BytesPerPixel+AddrLFB
call calculate_edi
-
-
- dp3: ; MAIN LOOP
-
+dp3: ; MAIN LOOP
cmp [edi+WinMapAddress],byte 1 ; ptrBuffer^<>byte(1)
-; je ybgp
-;
-; jmp nbgp
-;
-; ybgp:
jne nbgp
-
push eax
push ebx
-
mov ecx,dword [WinMapAddress-8] ; B
xor edx,edx ; edx:=0
div ecx ; Xstart/B
-
- ; eax=Int(qn) edx:=Rem
-
+; eax=Int(qn) edx:=Rem
lea esi,[edx+edx*2] ; esi:=edx*3
-
mov ecx,dword [WinMapAddress-4] ; ecx:=H
mov eax,[esp+0] ; eax:=Ystart
xor edx,edx ;
div ecx ; Ystart/H
-
mov eax,edx ; eax:=Rem
xor edx,edx ;
mov ebx,[esp+8] ; ebx:=B*3
mul ebx ;
add esi,eax ;
- mov eax,[esi+IMG_BACKGROUND]
+; mov eax,[esi+IMG_BACKGROUND]
+ mov eax,[img_background]
+ mov eax,[esi+eax]
and eax,0xffffff
-
xchg edi, ebp
stosw
shr eax,16
@@ -945,36 +831,24 @@ vesa20_drawbackground_tiled:
cmp [ScreenBPP],byte 24 ; 24 or 32 bpp ? - x size
jz @f
inc ebp ; +1
- @@:
-
+@@:
pop ebx
pop eax
-
jmp hook1
-
- nbgp:
+nbgp:
add ebp,3 ; +3
cmp [ScreenBPP],byte 24 ; 24 or 32 bpp ? - x size
jz @f
inc ebp ; +1
- @@:
-
- hook1:
-
+@@:
+hook1:
inc edi ; ptrBuffer++
add esi,3 ; ptrImage+=3
inc eax
cmp eax,[draw_data+32+RECT.right] ; X > xend?
-; jg nodp3
-; jmp dp3
-;
-; nodp3:
jle dp3
-
mov ebp,[draw_data+32+RECT.left]
-
inc ebx
-
mov eax,[BytesPerScanLine]
mul ebx
xchg ebp, eax ; BytesPerScanLine*(Ywin+y)
@@ -984,23 +858,13 @@ vesa20_drawbackground_tiled:
cmp [ScreenBPP],byte 24 ; 24 or 32 bpp ? - x size
jz @f
add ebp,eax ; +X=X*4
- @@:
+@@:
add ebp,[LFBAddress] ; +LFB
-
- ; ebp:=Y*BytesPerScanLine+X*BytesPerPixel+AddrLFB
-
+; ebp:=Y*BytesPerScanLine+X*BytesPerPixel+AddrLFB
call calculate_edi
-
cmp ebx,[draw_data+32+RECT.bottom]
-; jg dp4
-;
-; jmp dp3
-;
-; dp4:
jle dp3
-
add esp,4
-
pop edx
pop ecx
pop ebx
@@ -1014,160 +878,187 @@ vesa20_drawbackground_tiled:
vesa20_drawbackground_stretch:
-
call [disable_mouse]
-
push ebp
push eax
push ebx
push ecx
push edx
-
mov edx,dword [WinMapAddress-8] ; B
add edx,dword [WinMapAddress-8] ; +B
add edx,dword [WinMapAddress-8] ; +B
push edx
-
mov ebp,[draw_data+32+RECT.left] ; x start:=(x+Xwin)
mov ebx,[draw_data+32+RECT.top] ; y start:=(y+Ywin)
-
+ dec ebx
mov eax,[BytesPerScanLine]
mul ebx
xchg ebp, eax ; BytesPerScanLine*(Ywin+y)
add ebp, eax ; +X
add ebp, eax ; +X
add ebp, eax ; +X
-
cmp [ScreenBPP],byte 24 ; 24 or 32 bpp ? - x size
jz @f
add ebp,eax ; +X
- @@:
+@@:
add ebp,[LFBAddress] ; +LFB
-
- ; ebp:=Y*BytesPerScanLine+X*BytesPerPixel+AddrLFB
-
+; ebp:=Y*BytesPerScanLine+X*BytesPerPixel+AddrLFB
call calculate_edi
-
sdp3: ; MAIN LOOP
-cmp [edi+WinMapAddress],byte 1 ; ptrBuffer^<>byte(1)
-jne snbgp
-push eax
-push ebx
-mov eax,dword [WinMapAddress-8]
-imul eax, [esp+4] ;4
-xor edx,edx
-mov ebx,[ScreenWidth]
-div ebx
-mov cx,dx
-lea esi,[eax+eax*2]
-mov eax,dword [WinMapAddress-4]
-imul eax, [esp+0] ;0
-xor edx,edx
-mov ebx,[ScreenHeight]
-div ebx
-shl ecx,16
-mov cx,dx
-imul eax, [esp+8] ;8
-add esi,eax
-mov eax,[esi+IMG_BACKGROUND]
-push eax
-ror ecx,16
-xor eax,eax
-mov ax,cx
-shl eax,1 ; умножение на 2
-lea eax,[eax+eax*4] ; умножение на 5
-xor edx,edx
-mov ebx,[ScreenWidth]
-div ebx
-cmp eax,5
-pop eax
-jb @f
-mov ebx,[esi+IMG_BACKGROUND+3]
-call overlapping_of_points
+ cmp [edi+WinMapAddress],byte 1 ; ptrBuffer^<>byte(1)
+ jne snbgp
+ push eax
+ push ebx
+ mov eax,dword [WinMapAddress-8]
+ imul eax, [esp+4] ;4
+ xor edx,edx
+ mov ebx,[ScreenWidth]
+ div ebx
+ mov cx,dx
+ lea esi,[eax+eax*2]
+ mov eax,dword [WinMapAddress-4]
+ imul eax, [esp+0] ;0
+ xor edx,edx
+ mov ebx,[ScreenHeight]
+ div ebx
+ shl ecx,16
+ mov cx,dx
+ imul eax, [esp+8] ;8
+ add esi,eax
+; mov eax,[esi+IMG_BACKGROUND]
+ mov eax,[img_background]
+
+ push eax
+ mov eax,[display_data-4]
+ imul eax,[display_data-8]
+ imul eax,3
+ sub eax,3
+ cmp eax,esi
+ pop eax
+ jbe @f
+
+ mov eax,[esi+eax]
@@:
-push eax
-ror ecx,16
-xor eax,eax
-mov ax,cx
-shl eax,1 ; умножение на 2
-lea eax,[eax+eax*4] ; умножение на
-xor edx,edx
-mov ebx,[ScreenHeight]
-div ebx
-cmp eax,5
-pop eax
-jb @f
-mov ebx,[display_data-8]
-shl ebx,1
-add ebx,[display_data-8]
-add ebx,IMG_BACKGROUND
-add ebx,esi
-mov ebx,[ebx]
-call overlapping_of_points
+ push eax
+ ror ecx,16
+ xor eax,eax
+ mov ax,cx
+ shl eax,1 ; умножение на 2
+ lea eax,[eax+eax*4] ; умножение на 5
+ xor edx,edx
+ mov ebx,[ScreenWidth]
+ div ebx
+ cmp eax,5
+ pop eax
+ jb @f
+; mov ebx,[esi+IMG_BACKGROUND+3]
+ mov ebx,[img_background]
+
+ push eax
+ mov eax,[display_data-4]
+ imul eax,[display_data-8]
+ imul eax,3
+ sub eax,3
+ cmp eax,esi
+ pop eax
+ jbe @f
+
+ mov ebx,[esi+ebx+3]
+
+ call overlapping_of_points
@@:
-and eax,0xffffff
-xchg edi, ebp
-stosw
-shr eax,16
-stosb
-xchg ebp, edi ; ebp+=3
-cmp [ScreenBPP],byte 24 ; 24 or 32 bpp ? - x size
-jz @f
-inc ebp ; +1
+ push eax
+ ror ecx,16
+ xor eax,eax
+ mov ax,cx
+ shl eax,1 ; умножение на 2
+ lea eax,[eax+eax*4] ; умножение на
+ xor edx,edx
+ mov ebx,[ScreenHeight]
+ div ebx
+ cmp eax,5
+ pop eax
+ jb @f
+ mov ebx,[display_data-8]
+ shl ebx,1
+ add ebx,[display_data-8]
+ add ebx,[img_background] ;IMG_BACKGROUND
+
+ push eax
+ mov eax,[display_data-4]
+ imul eax,[display_data-8]
+ imul eax,3
+ cmp eax,esi
+ pop eax
+ jbe @f
+
+ add ebx,esi
+ mov ebx,[ebx]
+ call overlapping_of_points
@@:
-pop ebx
-pop eax
-jmp shook1
+ and eax,0xffffff
+ xchg edi, ebp
+ stosw
+ shr eax,16
+ stosb
+ xchg ebp, edi ; ebp+=3
+ cmp [ScreenBPP],byte 24 ; 24 or 32 bpp ? - x size
+ jz @f
+ inc ebp ; +1
+@@:
+ pop ebx
+ pop eax
+ jmp shook1
overlapping_of_points:
-push ecx edi
-mov ecx,eax
-mov edx,ebx
-xor eax,eax
-mov al,cl
-xor ebx,ebx
-mov bl,dl
-add eax,ebx
-rcr eax,1
-xor edi,edi
-mov di,ax
-xor eax,eax
-mov al,ch
-xor ebx,ebx
-mov bl,dh
-add eax,ebx
-rcr eax,1
-ror edi,8
-add edi,eax
-ror ecx,8
-ror edx,8
-xor eax,eax
-mov al,ch
-xor ebx,ebx
-mov bl,dh
-add eax,ebx
-rcr eax,1
-ror edi,8
-add eax,edi
-ror eax,16
-pop edi ecx
-ret
+ push ecx edi
+ mov ecx,eax
+ mov edx,ebx
+ xor eax,eax
+ mov al,cl
+ xor ebx,ebx
+ mov bl,dl
+ add eax,ebx
+ rcr eax,1
+ xor edi,edi
+ mov di,ax
+ xor eax,eax
+ mov al,ch
+ xor ebx,ebx
+ mov bl,dh
+ add eax,ebx
+ rcr eax,1
+ ror edi,8
+ add edi,eax
+ ror ecx,8
+ ror edx,8
+ xor eax,eax
+ mov al,ch
+ xor ebx,ebx
+ mov bl,dh
+ add eax,ebx
+ rcr eax,1
+ ror edi,8
+ add eax,edi
+ ror eax,16
+ pop edi ecx
+ ret
- snbgp:
+snbgp:
add ebp,3 ; +3
cmp [ScreenBPP],byte 24 ; 24 or 32 bpp ? - x size
jz @f
inc ebp ; +1
- @@:
-
- shook1:
+@@:
+shook1:
inc edi ; ptrBuffer++
add esi,3 ; ptrImage+=3
inc eax
cmp eax,[draw_data+32+RECT.right] ; X > xend?
jle sdp3
+; jbe sdp3
mov ebp,[draw_data+32+RECT.left]
@@ -1182,16 +1073,20 @@ ret
cmp [ScreenBPP],byte 24 ; 24 or 32 bpp ? - x size
jz @f
add ebp,eax ; +X=X*4
- @@:
+@@:
add ebp,[LFBAddress] ; +LFB
; ebp:=Y*BytesPerScanLine+X*BytesPerPixel+AddrLFB
call calculate_edi
+; cmp ebx,[ScreenHeight]
+; ja @f
+
cmp ebx,[draw_data+32+RECT.bottom]
jle sdp3
-
+; jbe sdp3
+@@:
add esp,4
pop edx