forked from KolibriOS/kolibrios
333b0bbae6
2) Detection PS2 mouse. 3) Switching FPU in PM with reset. 4) Click on the application button - works only if during release of a up-button mouse the cursor is on the button application. Realization Victor Alberto Gil Hanla (vhanla). Version 1.1 5) Return of focus (activated window) on previous application at completion of the active application 6) Change skin of header of windows type 4, at loss and return of focus (activated window). git-svn-id: svn://kolibrios.org@33 a494cfbc-eb01-0410-851d-a64ba20cac60
1623 lines
37 KiB
PHP
1623 lines
37 KiB
PHP
setwindowdefaults:
|
|
pushad
|
|
|
|
xor eax,eax
|
|
mov ecx,0xc000
|
|
@@:
|
|
inc eax
|
|
add ecx,2
|
|
mov [ecx+0x000],ax ; process no
|
|
mov [ecx+0x400],ax ; positions in stack
|
|
cmp ecx,0xc400-2 ; the more high, the more surface
|
|
jnz @b
|
|
|
|
popad
|
|
ret
|
|
|
|
|
|
|
|
; eax = cx
|
|
; ebx = cy
|
|
; ecx = ex
|
|
; edx = ey
|
|
; èäåÿ: ïåðåáðàòü âñå îêíà, íà÷èíàÿ ñ ñàìîãî íèæíåãî,
|
|
; è äëÿ êàæäîãî âûçâàòü setscreen
|
|
align 4
|
|
calculatescreen:
|
|
pushad
|
|
cli
|
|
|
|
mov esi, 1
|
|
xor eax, eax
|
|
xor ebx, ebx
|
|
mov ecx, [0xFE00]
|
|
mov edx, [0xFE04]
|
|
call setscreen
|
|
|
|
mov ebp, [0x3004] ; number of processes
|
|
cmp ebp, 1
|
|
jbe .finish
|
|
align 4
|
|
.new_wnd:
|
|
movzx edi, word [0xC400 + esi * 2]
|
|
shl edi, 5
|
|
add edi, window_data
|
|
mov eax, [edi+0]
|
|
mov ebx, [edi+4]
|
|
mov ecx, [edi+8]
|
|
test ecx, ecx
|
|
jz .not_wnd
|
|
add ecx, eax
|
|
mov edx, [edi+12]
|
|
add edx, ebx
|
|
push esi
|
|
movzx esi, word [0xC400 + esi * 2]
|
|
call setscreen
|
|
pop esi
|
|
.not_wnd:
|
|
inc esi
|
|
dec ebp
|
|
jnz .new_wnd
|
|
.finish:
|
|
sti
|
|
popad
|
|
ret
|
|
|
|
|
|
|
|
virtual at esp
|
|
ff_xsz dd ?
|
|
ff_ysz dd ?
|
|
ff_scale dd ?
|
|
end virtual
|
|
|
|
align 4
|
|
; ðåçåðâèðóåò ìåñòî ïîä îêíî çàäàííîãî ïðîöåññà
|
|
setscreen:
|
|
; eax x start
|
|
; ebx y start
|
|
; ecx x end
|
|
; edx y end
|
|
; esi process number
|
|
pushad
|
|
mov edi, esi ;;;word [esi*2+0xc400]
|
|
shl edi, 8
|
|
add edi, 0x80000+0x80 ; address of random shaped window area
|
|
cmp [edi], dword 0
|
|
jne .free_form
|
|
|
|
; get x&y size
|
|
sub ecx, eax
|
|
sub edx, ebx
|
|
inc ecx
|
|
inc edx
|
|
|
|
; get WinMap start
|
|
mov edi, [0xFE00] ; screen_sx
|
|
inc edi
|
|
imul edi, ebx
|
|
add edi, eax
|
|
add edi, WinMapAddress
|
|
|
|
.new_y:
|
|
push ecx ; sx
|
|
push edx
|
|
|
|
mov edx, esi
|
|
align 4
|
|
.new_x:
|
|
mov byte [edi], dl
|
|
inc edi
|
|
dec ecx
|
|
jnz .new_x
|
|
|
|
pop edx
|
|
pop ecx
|
|
add edi, [0xFE00]
|
|
inc edi
|
|
sub edi, ecx
|
|
dec edx
|
|
jnz .new_y
|
|
popad
|
|
ret
|
|
.read_byte:
|
|
;eax - address
|
|
;esi - slot
|
|
push eax
|
|
push ebx
|
|
push ecx
|
|
push edx
|
|
mov edx,eax
|
|
mov eax,esi
|
|
lea ebx,[esp+12]
|
|
mov ecx,1
|
|
call read_process_memory
|
|
pop edx
|
|
pop ecx
|
|
pop ebx
|
|
pop eax
|
|
ret
|
|
.free_form:
|
|
|
|
; for (y=0; y <= x_size; y++)
|
|
; for (x=0; x <= x_size; x++)
|
|
; if (shape[coord(x,y,scale)]==1)
|
|
; set_pixel(x, y, process_number);
|
|
|
|
sub ecx, eax
|
|
sub edx, ebx
|
|
inc ecx
|
|
inc edx
|
|
|
|
push dword [edi+4] ; push scale first -> for loop
|
|
|
|
; get WinMap start -> ebp
|
|
push eax
|
|
mov eax, [0xFE00] ; screen_sx
|
|
inc eax
|
|
imul eax, ebx ;ebx
|
|
add eax, [esp] ;eax
|
|
add eax, WinMapAddress
|
|
mov ebp, eax
|
|
|
|
mov edi, [edi]
|
|
; mov eax, esi
|
|
; shl eax, 5
|
|
; add edi, [eax+0x3000+0x10]
|
|
pop eax
|
|
|
|
; eax = x_start
|
|
; ebx = y_start
|
|
; ecx = x_size
|
|
; edx = y_size
|
|
; esi = process_number
|
|
; edi = &shape
|
|
; [scale]
|
|
push edx ecx ;ebx eax
|
|
xor ebx, ebx
|
|
align 4
|
|
.ff_new_y:
|
|
xor edx, edx
|
|
align 4
|
|
.ff_new_x:
|
|
; -- body --
|
|
mov ecx, [ff_scale]
|
|
mov eax, [ff_xsz]
|
|
shr eax, cl
|
|
push ebx edx
|
|
shr ebx, cl
|
|
shr edx, cl
|
|
imul eax, ebx
|
|
add eax, edx
|
|
pop edx ebx
|
|
add eax, edi ;[ff_shape]
|
|
call .read_byte
|
|
; cmp byte [eax], 1
|
|
; jne @f
|
|
test al,al
|
|
jz @f
|
|
mov eax, esi ; [ff_proc]
|
|
mov [ebp], al
|
|
@@:
|
|
; -- end body --
|
|
inc ebp
|
|
inc edx
|
|
cmp edx, [ff_xsz]
|
|
jb .ff_new_x
|
|
sub ebp, [ff_xsz]
|
|
add ebp, [0xFE00] ; screen.x
|
|
inc ebp
|
|
inc ebx
|
|
cmp ebx, [ff_ysz]
|
|
jb .ff_new_y
|
|
|
|
pop ecx edx ; eax ebx first
|
|
add esp, 4
|
|
popad
|
|
ret
|
|
|
|
|
|
display_settings:
|
|
|
|
; eax = 0 ; DISPLAY redraw
|
|
; ebx = 0 ; all
|
|
;
|
|
; eax = 1 ; BUTTON type
|
|
; ebx = 0 ; flat
|
|
; ebx = 1 ; 3D
|
|
; eax = 2 ; set WINDOW colours
|
|
; ebx = pointer to table
|
|
; ecx = number of bytes define
|
|
; eax = 3 ; get WINDOW colours
|
|
; ebx = pointer to table
|
|
; ecx = number of bytes wanted
|
|
; eax = 4 ; get skin height
|
|
; input : nothing
|
|
; output : eax = skin height in pixel
|
|
|
|
|
|
pushad
|
|
|
|
test eax, eax ; redraw display
|
|
jnz dspl0
|
|
test ebx, ebx
|
|
jnz dspl0
|
|
cmp [windowtypechanged],dword 1
|
|
jne dspl00
|
|
mov [windowtypechanged],dword 0
|
|
mov [dlx],dword 0
|
|
mov [dly],dword 0
|
|
mov eax,[0xfe00]
|
|
mov [dlxe],eax
|
|
mov eax,[0xfe04]
|
|
mov [dlye],eax
|
|
mov eax,window_data
|
|
call redrawscreen
|
|
dspl00:
|
|
popad
|
|
ret
|
|
dspl0:
|
|
|
|
cmp eax,1 ; button type
|
|
jne dspl1
|
|
and ebx,1
|
|
cmp ebx,[buttontype]
|
|
je dspl9
|
|
mov [buttontype],ebx
|
|
mov [windowtypechanged],dword 1
|
|
dspl9:
|
|
popad
|
|
ret
|
|
dspl1:
|
|
|
|
cmp eax,2 ; set common window colours
|
|
jne no_com_colours
|
|
mov [windowtypechanged],dword 1
|
|
mov esi,[0x3010]
|
|
add esi,0x10
|
|
add ebx,[esi]
|
|
mov esi,ebx
|
|
mov edi,common_colours
|
|
and ecx,127
|
|
cld
|
|
rep movsb
|
|
popad
|
|
ret
|
|
no_com_colours:
|
|
|
|
cmp eax,3 ; get common window colours
|
|
jne no_get_com
|
|
mov esi,[0x3010]
|
|
add esi,0x10
|
|
add ebx,[esi]
|
|
mov edi,ebx
|
|
mov esi,common_colours
|
|
and ecx,127
|
|
cld
|
|
rep movsb
|
|
popad
|
|
ret
|
|
no_get_com:
|
|
|
|
cmp eax,4 ; get skin height
|
|
jne no_skin_height
|
|
popad
|
|
mov eax,[_skinh]
|
|
mov [esp+36],eax
|
|
ret
|
|
no_skin_height:
|
|
|
|
popad
|
|
ret
|
|
|
|
uglobal
|
|
common_colours:
|
|
times 128 db 0x0
|
|
endg
|
|
|
|
check_window_move_request:
|
|
|
|
pushad
|
|
|
|
mov edi,[window_move_pr] ; requestor process base
|
|
|
|
cmp edi,0
|
|
je window_move_return
|
|
|
|
shl edi,5
|
|
add edi,window_data
|
|
|
|
push dword [edi+0] ; save old coordinates
|
|
push dword [edi+4]
|
|
push dword [edi+8]
|
|
push dword [edi+12]
|
|
|
|
mov eax,[window_move_eax]
|
|
mov ebx,[window_move_ebx]
|
|
mov ecx,[window_move_ecx]
|
|
mov edx,[window_move_edx]
|
|
|
|
cmp eax,-1 ; set new position and size
|
|
je no_x_reposition
|
|
mov [edi+0],eax
|
|
no_x_reposition:
|
|
cmp ebx,-1
|
|
je no_y_reposition
|
|
mov [edi+4],ebx
|
|
no_y_reposition:
|
|
cmp ecx,-1
|
|
je no_x_resizing
|
|
mov [edi+8],ecx
|
|
no_x_resizing:
|
|
cmp edx,-1
|
|
je no_y_resizing
|
|
mov [edi+12],edx
|
|
no_y_resizing:
|
|
|
|
call check_window_position
|
|
|
|
pushad ; save for window fullscreen/resize
|
|
mov esi,edi
|
|
sub edi,window_data
|
|
shr edi,5
|
|
shl edi,8
|
|
add edi,0x80000+0x90
|
|
mov ecx,4
|
|
cld
|
|
rep movsd
|
|
popad
|
|
|
|
pushad ; calculcate screen at new position
|
|
mov eax,[edi+00]
|
|
mov ebx,[edi+04]
|
|
mov ecx,[edi+8]
|
|
mov edx,[edi+12]
|
|
add ecx,eax
|
|
add edx,ebx
|
|
call calculatescreen
|
|
popad
|
|
|
|
pop edx ; calculcate screen at old position
|
|
pop ecx
|
|
pop ebx
|
|
pop eax
|
|
add ecx,eax
|
|
add edx,ebx
|
|
mov [dlx],eax ; save for drawlimits
|
|
mov [dly],ebx
|
|
mov [dlxe],ecx
|
|
mov [dlye],edx
|
|
call calculatescreen
|
|
|
|
mov [edi+31],byte 1 ; flag the process as redraw
|
|
|
|
mov eax,edi ; redraw screen at old position
|
|
xor esi,esi
|
|
call redrawscreen
|
|
|
|
mov [0xfff5],byte 0 ; mouse pointer
|
|
mov [0xfff4],byte 0 ; no mouse under
|
|
mov [0xfb44],byte 0 ; react to mouse up/down
|
|
|
|
mov ecx,10 ; wait 1/10 second
|
|
wmrl3:
|
|
call [draw_pointer]
|
|
mov eax,1
|
|
call delay_hs
|
|
loop wmrl3
|
|
|
|
mov [window_move_pr],0
|
|
|
|
window_move_return:
|
|
|
|
popad
|
|
|
|
ret
|
|
|
|
|
|
|
|
|
|
check_window_position:
|
|
|
|
pushad ; window inside screen ?
|
|
|
|
movzx eax,word [edi+0]
|
|
movzx ebx,word [edi+4]
|
|
movzx ecx,word [edi+8]
|
|
movzx edx,word [edi+12]
|
|
|
|
mov esi,ecx ; check x pos
|
|
add esi,eax
|
|
cmp esi,[0xfe00]
|
|
jbe x_pos_ok
|
|
mov [edi+0],dword 0
|
|
xor eax, eax
|
|
x_pos_ok:
|
|
|
|
mov esi,edx ; check y pos
|
|
add esi,ebx
|
|
cmp esi,[0xfe04]
|
|
jbe y_pos_ok
|
|
mov [edi+4],dword 0
|
|
mov ebx,0
|
|
y_pos_ok:
|
|
|
|
mov esi,ecx ; check x size
|
|
add esi,eax
|
|
cmp esi,[0xfe00]
|
|
jbe x_size_ok
|
|
mov ecx,[0xfe00]
|
|
mov [edi+8],ecx
|
|
x_size_ok:
|
|
|
|
mov esi,edx ; check y size
|
|
add esi,ebx
|
|
cmp esi,[0xfe04]
|
|
jbe y_size_ok
|
|
mov edx,[0xfe04]
|
|
mov [edi+12],edx
|
|
y_size_ok:
|
|
|
|
popad
|
|
|
|
ret
|
|
|
|
|
|
uglobal
|
|
new_window_starting dd 0
|
|
endg
|
|
|
|
|
|
sys_window_mouse:
|
|
|
|
push eax
|
|
|
|
mov eax,[timer_ticks] ;[0xfdf0]
|
|
cmp [new_window_starting],eax
|
|
jb swml1
|
|
|
|
mov [0xfff4],byte 0 ; no mouse background
|
|
mov [0xfff5],byte 0 ; draw mouse
|
|
|
|
mov [new_window_starting],eax
|
|
|
|
swml1:
|
|
|
|
pop eax
|
|
|
|
ret
|
|
|
|
drawwindow_I:
|
|
|
|
pushad
|
|
|
|
mov esi,[edx+24] ; rectangle
|
|
mov eax,[edx+0]
|
|
shl eax,16
|
|
add eax,[edx+0]
|
|
add eax,[edx+8]
|
|
mov ebx,[edx+04]
|
|
shl ebx,16
|
|
add ebx,[edx+4]
|
|
add ebx,[edx+12]
|
|
call draw_rectangle
|
|
|
|
mov ecx,[edx+20] ; grab bar
|
|
push ecx
|
|
mov esi,edx
|
|
mov edx,[esi+04]
|
|
add edx,1
|
|
mov ebx,[esi+04]
|
|
add ebx,25
|
|
mov eax,[esi+04]
|
|
add eax,[esi+12]
|
|
cmp ebx,eax
|
|
jb wdsizeok
|
|
mov ebx,eax
|
|
wdsizeok:
|
|
push ebx
|
|
drwi:
|
|
mov ebx,edx
|
|
shl ebx,16
|
|
add ebx,edx
|
|
mov eax,[esi+00]
|
|
inc eax
|
|
shl eax,16
|
|
add eax,[esi+00]
|
|
add eax,[esi+8]
|
|
sub eax,1
|
|
push edx
|
|
mov edx,0x80000000
|
|
mov ecx,[esi+20]
|
|
and ecx,edx
|
|
cmp ecx,edx
|
|
jnz nofa
|
|
mov ecx,[esi+20]
|
|
sub ecx,0x00040404
|
|
mov [esi+20],ecx
|
|
and ecx,0x00ffffff
|
|
jmp faj
|
|
nofa:
|
|
mov ecx,[esi+20]
|
|
and ecx,0x00ffffff
|
|
faj:
|
|
pop edx
|
|
mov edi,0
|
|
call [draw_line]
|
|
inc edx
|
|
cmp edx,[esp]
|
|
jb drwi
|
|
add esp,4
|
|
pop ecx
|
|
mov [esi+20],ecx
|
|
|
|
mov edx,[esi+04] ; inside work area
|
|
add edx,21+5
|
|
mov ebx,[esi+04]
|
|
add ebx,[esi+12]
|
|
cmp edx,ebx
|
|
jg noinside
|
|
mov eax,1
|
|
mov ebx,21
|
|
mov ecx,[esi+8]
|
|
mov edx,[esi+12]
|
|
mov edi,[esi+16]
|
|
call [drawbar]
|
|
noinside:
|
|
|
|
popad
|
|
|
|
ret
|
|
|
|
|
|
draw_rectangle:
|
|
|
|
r_eax equ [esp+28] ; x start
|
|
r_ax equ [esp+30] ; x end
|
|
r_ebx equ [esp+16] ; y start
|
|
r_bx equ [esp+18] ; y end
|
|
;esi ; color
|
|
|
|
pushad
|
|
|
|
mov ecx,esi ; yb,xb -> yb,xe
|
|
;<<< 14.11.2004 Ivan Poddubny <faster and smaller>
|
|
; mov eax,r_eax
|
|
; shl eax,16
|
|
; mov ax,r_ax
|
|
mov eax, r_eax
|
|
rol eax, 16
|
|
;>>> 14.11.2004 Ivan Poddubny <faster and smaller>
|
|
mov ebx,r_ebx
|
|
shl ebx,16
|
|
mov bx,r_ebx
|
|
xor edi, edi
|
|
call [draw_line]
|
|
|
|
mov ebx,r_bx ; ye,xb -> ye,xe
|
|
shl ebx,16
|
|
mov bx,r_bx
|
|
call [draw_line]
|
|
|
|
mov ecx,esi ; ya,xa -> ye,xa
|
|
mov eax,r_eax
|
|
shl eax,16
|
|
mov ax,r_eax
|
|
mov ebx,r_ebx
|
|
shl ebx,16
|
|
mov bx,r_bx
|
|
mov edi,0
|
|
call [draw_line]
|
|
|
|
mov eax,r_ax ; ya,xe -> ye,xe
|
|
shl eax,16
|
|
mov ax,r_ax
|
|
call [draw_line]
|
|
|
|
popad
|
|
ret
|
|
|
|
|
|
drawwindow_III:
|
|
|
|
pushad
|
|
|
|
mov edi,edx ; RECTANGLE
|
|
mov eax,[edi+0]
|
|
shl eax,16
|
|
mov ax,[edi+0]
|
|
add ax,[edi+8]
|
|
mov ebx,[edi+4]
|
|
shl ebx,16
|
|
mov bx,[edi+4]
|
|
add bx,[edi+12]
|
|
mov esi,[edi+24]
|
|
shr esi,1
|
|
and esi,0x007f7f7f
|
|
push esi
|
|
call draw_rectangle
|
|
mov ecx,3
|
|
dw3l:
|
|
add eax,1*65536-1
|
|
add ebx,1*65536-1
|
|
mov esi,[edi+24]
|
|
call draw_rectangle
|
|
dec ecx
|
|
jnz dw3l
|
|
pop esi
|
|
add eax,1*65536-1
|
|
add ebx,1*65536-1
|
|
call draw_rectangle
|
|
|
|
mov ecx,[edx+20] ; GRAB BAR
|
|
push ecx
|
|
mov esi,edx
|
|
mov edx,[esi+04]
|
|
add edx,4
|
|
mov ebx,[esi+04]
|
|
add ebx,20
|
|
mov eax,[esi+04]
|
|
add eax,[esi+12]
|
|
cmp ebx,eax
|
|
jb wdsizeok2
|
|
mov ebx,eax
|
|
wdsizeok2:
|
|
push ebx
|
|
drwi2:
|
|
mov ebx,edx
|
|
shl ebx,16
|
|
add ebx,edx
|
|
mov eax,[esi+00]
|
|
shl eax,16
|
|
add eax,[esi+00]
|
|
add eax,[esi+8]
|
|
add eax,4*65536-4
|
|
mov ecx,[esi+20]
|
|
test ecx,0x40000000
|
|
jz nofa3
|
|
add ecx,0x040404
|
|
nofa3:
|
|
test ecx,0x80000000
|
|
jz nofa2
|
|
sub ecx,0x040404
|
|
nofa2:
|
|
mov [esi+20],ecx
|
|
and ecx,0xffffff
|
|
xor edi, edi
|
|
call [draw_line]
|
|
inc edx
|
|
cmp edx,[esp]
|
|
jb drwi2
|
|
add esp,4
|
|
pop ecx
|
|
mov [esi+20],ecx
|
|
|
|
mov edx,[esi+04] ; WORK AREA
|
|
add edx,21+5
|
|
mov ebx,[esi+04]
|
|
add ebx,[esi+12]
|
|
cmp edx,ebx
|
|
jg noinside2
|
|
mov eax,5
|
|
mov ebx,20
|
|
mov ecx,[esi+8]
|
|
mov edx,[esi+12]
|
|
sub ecx,4
|
|
sub edx,4
|
|
mov edi,[esi+16]
|
|
call [drawbar]
|
|
noinside2:
|
|
|
|
popad
|
|
|
|
ret
|
|
|
|
|
|
|
|
; activate window
|
|
align 4
|
|
windowactivate:
|
|
|
|
; esi = abs mem position in stack 0xC400+
|
|
|
|
pushad
|
|
push esi
|
|
movzx eax, word [esi] ; ax <- process no
|
|
movzx eax, word [0xC000+eax*2] ; ax <- position in window stack
|
|
|
|
xor esi, esi ; drop others
|
|
waloop:
|
|
cmp esi, dword [0x3004]
|
|
jae wacont
|
|
inc esi
|
|
lea edi, [0xC000 + esi*2]
|
|
mov bx, [edi] ; position of the current process
|
|
cmp bx, ax
|
|
jbe @f
|
|
dec bx ; upper? => drop!
|
|
mov [edi], bx
|
|
@@:
|
|
jmp waloop
|
|
wacont:
|
|
; set to no 1
|
|
pop esi ; esi = pointer at 0xC400
|
|
|
|
movzx eax, word [esi]
|
|
mov bx, [0x3004] ; number of processes
|
|
mov [0xC000+eax*2], bx ; this is the last (and the upper)
|
|
|
|
;* start code - get active process (4) - Mario79
|
|
cli
|
|
cmp [active_process_flag],1
|
|
jne @f
|
|
mov [active_process_flag],0
|
|
jmp end_save_active_process
|
|
@@:
|
|
call save_active_process_stack
|
|
end_save_active_process:
|
|
mov [active_process],eax
|
|
push eax
|
|
mov eax,[active_process]
|
|
shl eax,5
|
|
add eax,0x3000
|
|
mov [eax-twdw+31],byte 1
|
|
pop eax
|
|
sti
|
|
;* end code - get active process (4) - Mario79
|
|
|
|
; update on screen -window stack
|
|
xor esi, esi
|
|
waloop2:
|
|
mov edi, [0x3004]
|
|
cmp esi, edi
|
|
jae wacont2
|
|
inc esi
|
|
movzx ebx, word [esi*2 + 0xC000]
|
|
mov [ebx*2 + 0xC400], si
|
|
jmp waloop2
|
|
wacont2:
|
|
mov [0xf400], byte 0 ; empty keyboard buffer
|
|
mov [0xf500], byte 0 ; empty button buffer
|
|
popad
|
|
ret
|
|
|
|
|
|
; check if window is necessary to draw
|
|
|
|
checkwindowdraw:
|
|
|
|
; edi = position in window_data+
|
|
|
|
mov esi, edi
|
|
sub esi, window_data
|
|
shr esi, 5
|
|
|
|
; esi = process number
|
|
|
|
; <IP 15.08.2004>
|
|
movzx eax, word [0xC000 + esi * 2] ; get value of the curr process
|
|
lea esi, [0xC400 + eax * 2] ; get address of this process at 0xC400
|
|
; </IP 15.08.2004>
|
|
|
|
push esi
|
|
|
|
.new_check:
|
|
|
|
pop esi
|
|
add esi, 2
|
|
push esi
|
|
|
|
mov eax, [0x3004]
|
|
lea eax, word [0xC400 + eax * 2] ; number of the upper window
|
|
|
|
cmp esi, eax
|
|
ja .all_wnds_to_top
|
|
|
|
movzx eax, word [esi]
|
|
shl eax, 5
|
|
add eax, window_data
|
|
mov esi, eax
|
|
|
|
mov ebx, [edi+4]
|
|
mov edx, [edi+12]
|
|
add edx, ebx
|
|
|
|
mov ecx, [esi+4] ; y check
|
|
cmp ecx, edx
|
|
jae .new_check
|
|
mov eax, [esi+12]
|
|
add ecx, eax
|
|
cmp ebx, ecx
|
|
ja .new_check
|
|
|
|
mov eax, [edi+0]
|
|
mov ecx, [edi+8]
|
|
add ecx, eax
|
|
|
|
mov edx, [esi+0] ; x check
|
|
cmp edx, ecx
|
|
jae .new_check
|
|
mov ecx, [esi+8]
|
|
add edx, ecx
|
|
cmp eax, edx
|
|
ja .new_check
|
|
|
|
pop esi
|
|
mov ecx,1 ; overlap some window
|
|
ret
|
|
|
|
.all_wnds_to_top:
|
|
|
|
pop esi
|
|
|
|
xor ecx, ecx ; passed all windows to top
|
|
ret
|
|
|
|
|
|
|
|
|
|
waredraw: ; if redraw necessary at activate
|
|
|
|
pushad
|
|
|
|
call checkwindowdraw ; draw window on activation ?
|
|
test ecx, ecx
|
|
jz .do_not_draw
|
|
|
|
popad
|
|
mov [0xfb44], byte 1 ; do draw mouse
|
|
call windowactivate
|
|
|
|
; update screen info
|
|
pushad
|
|
mov edi, [0x3004] ; the last process (number)
|
|
movzx esi, word [0xC400 + edi * 2]
|
|
shl esi, 5
|
|
add esi, window_data
|
|
|
|
; coordinates of the upper window
|
|
mov eax, [esi+00] ; cx
|
|
mov ebx, [esi+04] ; cy
|
|
mov ecx, [esi+08] ; sx
|
|
mov edx, [esi+12] ; sy
|
|
|
|
add ecx, eax ; ecx = x_end
|
|
add edx, ebx ; edx = y_end
|
|
|
|
mov edi, [0x3004]
|
|
movzx esi, word [0xC400 + edi * 2]
|
|
shl esi, 5
|
|
movzx esi, byte [esi + 0x3000 + 0xE]
|
|
call setscreen ;;;calculatescreen ; setscreen
|
|
popad
|
|
|
|
cmp [0xff01], dword 1 ; if > 1 then activate process
|
|
jbe .not_activate
|
|
|
|
;;; mov eax, 10 ; wait for putimages to finish
|
|
;;; call delay_hs
|
|
|
|
mov [edi+31],byte 1 ; redraw flag for app
|
|
mov [0xfb44],byte 0 ; mouse down checks
|
|
|
|
ret
|
|
|
|
.not_activate:
|
|
|
|
; mov eax,5 ; wait for putimages to finish
|
|
; call delay_hs
|
|
|
|
mov [edi+31],byte 1 ; redraw flag for app
|
|
|
|
mov ecx, 25 ;100
|
|
.waitflagdown:
|
|
dec ecx
|
|
jz .nowait
|
|
; mov eax, 2
|
|
; call delay_hs
|
|
cmp [edi+31], byte 0 ; wait flag to drop
|
|
jnz .waitflagdown
|
|
.nowait:
|
|
|
|
; mov ecx,10
|
|
; .wait:
|
|
; mov eax,1 ; wait for draw to finish
|
|
; call delay_hs
|
|
; loop .wait
|
|
|
|
mov [0xfb44],byte 0
|
|
|
|
ret
|
|
|
|
.do_not_draw:
|
|
|
|
popad
|
|
|
|
call windowactivate
|
|
mov [0xfb44],byte 0 ; mouse down checks
|
|
mov [0xfff4],byte 0 ; no mouse background
|
|
mov [0xfff5],byte 0 ; draw mouse
|
|
ret
|
|
|
|
|
|
iglobal
|
|
window_moving db 'K : Window - move/resize',13,10,0
|
|
window_moved db 'K : Window - done',13,10,0
|
|
endg
|
|
|
|
; check window touch
|
|
align 4
|
|
checkwindows:
|
|
pushad
|
|
|
|
cmp [0xff01],dword 1 ; activate request from app ?
|
|
jbe .no_activate_request
|
|
mov edi,[0xff01] ; process number
|
|
shl edi,5
|
|
add edi,window_data
|
|
mov ebx,[0xff01]
|
|
movzx esi, word [0xC000 + ebx * 2]
|
|
lea esi, [0xC400 + esi * 2]
|
|
call waredraw
|
|
|
|
;* start code - get active process (2) - Mario79
|
|
; mov eax,[0xff01]
|
|
; mov [active_process],eax
|
|
;* end code - get active process (2) - Mario79
|
|
|
|
mov [0xff01],dword 0 ; activated
|
|
|
|
popad
|
|
ret
|
|
|
|
.no_activate_request:
|
|
|
|
cmp [0xfb40],byte 0 ; mouse buttons pressed ?
|
|
jne .mouse_buttons_pressed
|
|
; cmp [window_minimize],2
|
|
; jne .no_activate_request_1
|
|
cmp [window_minimize],0
|
|
je .no_activate_request_2
|
|
cmp [window_minimize],1
|
|
je .mouse_buttons_pressed
|
|
mov esi,[0x3004]
|
|
movzx edi, word [0xC400 + esi * 2]
|
|
shl edi, 5
|
|
add edi, window_data
|
|
cmp [edi+12],dword 0
|
|
je .mouse_buttons_pressed
|
|
; jne .no_activate_request_2
|
|
; .no_activate_request_1:
|
|
; cmp [window_minimize],1
|
|
; jge .mouse_buttons_pressed
|
|
; jmp .mouse_buttons_pressed
|
|
.no_activate_request_2:
|
|
mov [window_minimize],0
|
|
popad
|
|
ret
|
|
|
|
.mouse_buttons_pressed:
|
|
|
|
mov esi,[0x3004]
|
|
inc esi
|
|
|
|
cwloop:
|
|
cmp esi,2
|
|
jb .exit
|
|
.temp_window_minimize_1:
|
|
dec esi
|
|
movzx edi, word [0xC400 + esi * 2] ; ebx
|
|
shl edi, 5
|
|
add edi, window_data
|
|
; mov edi, ebx
|
|
mov ecx, [edi+0]
|
|
mov edx, [edi+4]
|
|
|
|
mov eax,ecx
|
|
mov ebx,edx
|
|
cmp [window_minimize],1
|
|
jge .window_minimize_no_check_mouse
|
|
|
|
movzx eax, word [0xfb0a]
|
|
movzx ebx, word [0xfb0c]
|
|
|
|
cmp ecx, eax
|
|
jae cwloop
|
|
cmp edx, ebx
|
|
jae cwloop
|
|
add ecx, [edi+8]
|
|
add edx, [edi+12]
|
|
cmp eax, ecx
|
|
jae cwloop
|
|
cmp ebx, edx
|
|
jae cwloop
|
|
|
|
.window_minimize_no_check_mouse:
|
|
|
|
pushad
|
|
mov eax, esi
|
|
mov ebx, [0x3004]
|
|
cmp eax, ebx ; is this window active?
|
|
jz .move_resize_window
|
|
|
|
; eax = position in windowing stack
|
|
; redraw must ?
|
|
lea esi, [0xC400 + esi * 2]
|
|
call waredraw
|
|
add esp, 32
|
|
|
|
.exit:
|
|
popad
|
|
ret
|
|
|
|
.move_resize_window: ; MOVE OR RESIZE WINDOW
|
|
|
|
popad
|
|
|
|
; Check for user enabled fixed window
|
|
mov edx, [edi+0x14]
|
|
and edx, 0x0f000000
|
|
cmp edx, 0x01000000
|
|
jne .window_move_enabled_for_user
|
|
popad
|
|
ret
|
|
.window_move_enabled_for_user:
|
|
|
|
mov [do_resize_from_corner],byte 0 ; resize for skinned window
|
|
mov edx, [edi+0x10]
|
|
and edx, 0x0f000000
|
|
cmp edx, 0x02000000
|
|
jb .no_resize_2 ; not type 2 wnd
|
|
|
|
mov edx, [edi+4]
|
|
add edx, [edi+12]
|
|
sub edx, 6 ; edx = y_end - 6
|
|
cmp ebx, edx ; ebx = mouse_y
|
|
jb .no_resize_2
|
|
mov [do_resize_from_corner],byte 1
|
|
jmp .continue
|
|
.no_resize_2:
|
|
|
|
;// mike.dld [
|
|
mov dl,[edi+0x10+3]
|
|
and dl,0x0F
|
|
cmp dl,0x03
|
|
jne @f
|
|
mov edx, [edi+4] ; check if touch on bar
|
|
add edx, [_skinh]
|
|
cmp ebx, edx
|
|
jae .exit
|
|
jmp .continue
|
|
@@:
|
|
;// mike.dld ]
|
|
|
|
mov edx, [edi+4] ; check if touch on bar
|
|
add edx, 21
|
|
cmp ebx, edx
|
|
jae .exit
|
|
|
|
.continue:
|
|
|
|
push esi
|
|
mov esi, window_moving
|
|
call sys_msg_board_str
|
|
pop esi
|
|
|
|
mov ecx, [timer_ticks] ;[0xfdf0] ; double-click ?
|
|
mov edx, ecx
|
|
sub edx, [latest_window_touch]
|
|
mov [latest_window_touch], ecx
|
|
mov [latest_window_touch_delta], edx
|
|
|
|
mov cl, [0xfb40] ; save for shade check
|
|
mov [do_resize], cl
|
|
cmp [window_minimize],0
|
|
je no_emulation_righ_button
|
|
mov [do_resize], byte 2
|
|
no_emulation_righ_button:
|
|
mov ecx, [edi+0]
|
|
mov edx, [edi+4]
|
|
|
|
push eax ecx edx
|
|
mov [dlx], ecx ; save for drawlimits
|
|
mov [dly], edx
|
|
mov eax, [edi+8]
|
|
add ecx, eax
|
|
mov eax, [edi+12]
|
|
add edx, eax
|
|
mov [dlxe], ecx
|
|
mov [dlye], edx
|
|
pop edx ecx eax
|
|
|
|
sub eax, ecx
|
|
sub ebx, edx
|
|
|
|
mov esi, [0xfb0a]
|
|
mov [0xf300], esi
|
|
|
|
pushad ; wait for putimages to finish
|
|
; mov eax,5
|
|
; call delay_hs
|
|
mov eax,[edi+0]
|
|
mov [npx],eax
|
|
mov eax,[edi+4]
|
|
mov [npy],eax
|
|
popad
|
|
|
|
push eax ; save old coordinates
|
|
mov ax,[edi+00]
|
|
mov word [oldc+00],ax
|
|
mov ax,[edi+04]
|
|
mov word [oldc+04],ax
|
|
mov ax,[edi+8]
|
|
mov word [oldc+8],ax
|
|
mov word [npxe],ax
|
|
mov ax,[edi+12]
|
|
mov word [oldc+12],ax
|
|
mov word [npye],ax
|
|
pop eax
|
|
|
|
call drawwindowframes
|
|
|
|
mov [reposition],0
|
|
mov [0xfb44],byte 1 ; no reaction to mouse up/down
|
|
|
|
; move window
|
|
|
|
newchm:
|
|
|
|
mov [0xfff5],byte 1
|
|
|
|
call checkidle
|
|
|
|
call checkEgaCga
|
|
|
|
mov [0xfff4],byte 0
|
|
|
|
call [draw_pointer]
|
|
|
|
pushad
|
|
call stack_handler
|
|
popad
|
|
|
|
mov esi,[0xf300]
|
|
cmp esi,[0xfb0a]
|
|
je cwb
|
|
|
|
mov cx,[0xfb0a]
|
|
mov dx,[0xfb0c]
|
|
sub cx,ax
|
|
sub dx,bx
|
|
|
|
push ax
|
|
push bx
|
|
|
|
call drawwindowframes
|
|
|
|
mov ax,[0xfe00]
|
|
mov bx,[0xfe04]
|
|
|
|
cmp [do_resize_from_corner],1
|
|
je no_new_position
|
|
|
|
mov word [npx],word 0 ; x repos ?
|
|
cmp ax,cx
|
|
jb noreposx
|
|
mov [reposition],1
|
|
sub ax,word [npxe]
|
|
mov word [npx],ax
|
|
cmp ax,cx
|
|
jb noreposx
|
|
mov word [npx],cx
|
|
noreposx:
|
|
|
|
mov word [npy],word 0 ; y repos ?
|
|
cmp bx,dx
|
|
jb noreposy
|
|
mov [reposition],1
|
|
sub bx,word [npye]
|
|
mov word [npy],bx
|
|
cmp bx,dx
|
|
jb noreposy
|
|
mov word [npy],dx
|
|
noreposy:
|
|
|
|
no_new_position:
|
|
|
|
cmp [do_resize_from_corner],0 ; resize from right corner
|
|
je norepos_size
|
|
pushad
|
|
|
|
mov edx,edi
|
|
sub edx,window_data
|
|
shr edx,5
|
|
shl edx,8
|
|
add edx,0x80000 ; process base at 0x80000+
|
|
|
|
movzx eax,word [0xfb0a]
|
|
cmp eax,[edi+0]
|
|
jb nnepx
|
|
sub eax,[edi+0]
|
|
cmp eax,[edx+0x90+8]
|
|
jge nnepx2
|
|
mov eax,[edx+0x90+8]
|
|
nnepx2:
|
|
mov [npxe],eax
|
|
nnepx:
|
|
|
|
movzx eax,word [0xfb0c]
|
|
cmp eax,[edi+4]
|
|
jb nnepy
|
|
sub eax,[edi+4]
|
|
cmp eax,23 ; [edx+0x90+12]
|
|
jge nnepy2
|
|
mov eax,23 ; [edx+0x90+12]
|
|
nnepy2:
|
|
mov [npye],eax
|
|
nnepy:
|
|
|
|
mov [reposition],1
|
|
|
|
popad
|
|
norepos_size:
|
|
|
|
pop bx
|
|
pop ax
|
|
call drawwindowframes
|
|
|
|
mov esi,[0xfb0a]
|
|
mov [0xf300],esi
|
|
|
|
cwb:
|
|
cmp [0xfb40],byte 0
|
|
jne newchm
|
|
; new position done
|
|
call drawwindowframes
|
|
mov [0xfff5],byte 1
|
|
|
|
mov eax,[npx]
|
|
mov [edi+0],eax
|
|
mov eax,[npy]
|
|
mov [edi+4],eax
|
|
mov eax,[npxe]
|
|
mov [edi+8],eax
|
|
mov eax,[npye]
|
|
mov [edi+12],eax
|
|
|
|
cmp [reposition],1 ; save new X and Y start
|
|
jne no_xy_save
|
|
; <IP 28.08.2004>
|
|
push esi edi ecx
|
|
mov esi,edi
|
|
sub edi,window_data
|
|
shr edi,5
|
|
shl edi,8
|
|
add edi,0x80000+0x90
|
|
mov ecx,2
|
|
cld
|
|
rep movsd
|
|
pop ecx edi esi
|
|
; </IP 28.08.2004>
|
|
no_xy_save:
|
|
|
|
pushad ; WINDOW SHADE/FULLSCREEN
|
|
|
|
cmp [reposition],1
|
|
je no_window_sizing
|
|
mov edx,edi
|
|
sub edx,window_data
|
|
shr edx,5
|
|
shl edx,8
|
|
add edx,0x80000 ; process base at 0x80000+
|
|
|
|
cmp [do_resize],2 ; window shade ?
|
|
jb no_window_shade
|
|
mov [reposition],1
|
|
|
|
cmp [window_minimize],1
|
|
jge for_window_minimize
|
|
cmp [edi+12],dword 23
|
|
jle window_shade_up
|
|
jmp for_window_shade
|
|
for_window_minimize:
|
|
cmp [edi+12],dword 0
|
|
je window_shade_up
|
|
for_window_shade:
|
|
cmp [window_minimize],0
|
|
je no_window_minimize
|
|
cmp [window_minimize],2
|
|
je window_minimize_no_shade_full ;window_shade_up
|
|
mov [edi+8],dword 0 ;66
|
|
mov [edi+12],dword 0 ;279 ; on
|
|
jmp no_window_shade
|
|
no_window_minimize:
|
|
mov [edi+12],dword 23 ; on
|
|
jmp no_window_shade
|
|
window_shade_up:
|
|
cmp [window_minimize],1
|
|
jge window_minimize_no_shade_full
|
|
mov eax,[edi+0]
|
|
add eax,[edi+4]
|
|
test eax, eax
|
|
je shade_full
|
|
push edi
|
|
lea esi, [edx + 0x90]
|
|
mov ecx,4
|
|
cld
|
|
rep movsd
|
|
pop edi
|
|
|
|
window_minimize_no_shade_full:
|
|
; mov eax,[edx+0x90] ; off
|
|
; mov [edi+0],eax
|
|
; mov eax,[edx+0x94] ; off
|
|
; mov [edi+4],eax
|
|
; mov eax,[edx+0x98] ; off
|
|
; mov [edi+8],eax
|
|
; mov eax,[edx+0x9C] ; off
|
|
; mov [edi+12],eax
|
|
|
|
push edi
|
|
lea esi, [edx + 0x90]
|
|
mov ecx,4
|
|
cld
|
|
rep movsd
|
|
pop edi
|
|
jmp no_window_shade
|
|
|
|
shade_full:
|
|
; mov eax,[0xfe00]
|
|
; mov [edi+8],eax
|
|
mov eax,[0xfe04]
|
|
sub eax,19
|
|
mov [edi+12],eax
|
|
no_window_shade:
|
|
|
|
cmp [do_resize],1 ; fullscreen/restore ?
|
|
jne no_fullscreen_restore
|
|
cmp [latest_window_touch_delta],dword 50
|
|
jg no_fullscreen_restore
|
|
mov [reposition],1
|
|
mov eax,[edi+12]
|
|
add eax,19
|
|
cmp eax,[0xfe04]
|
|
je restore_from_fullscreen
|
|
mov [edi+0],dword 0 ; set fullscreen
|
|
mov [edi+4],dword 0
|
|
mov eax,[0xfe00]
|
|
mov [edi+8],eax
|
|
mov eax,[0xfe04]
|
|
sub eax,19
|
|
mov [edi+12],eax
|
|
jmp no_fullscreen_restore
|
|
restore_from_fullscreen:
|
|
push edi ; restore
|
|
; mov esi,edx
|
|
; add esi,0x90
|
|
lea esi, [edx + 0x90]
|
|
mov ecx,4
|
|
cld
|
|
rep movsd
|
|
pop edi
|
|
|
|
no_fullscreen_restore:
|
|
|
|
mov eax,[edi+4] ; check Y inside screen
|
|
add eax,[edi+12]
|
|
cmp eax,[0xfe04]
|
|
jbe no_window_sizing
|
|
mov eax,[edi+0] ; check X inside screen
|
|
add eax,[edi+8]
|
|
cmp eax,[0xfe00]
|
|
jbe no_window_sizing
|
|
mov eax,[0xfe00]
|
|
sub eax,[edi+8]
|
|
mov [edi+0],eax
|
|
mov eax,[0xfe04]
|
|
sub eax,[edi+12]
|
|
mov [edi+4],eax
|
|
no_window_sizing:
|
|
|
|
popad
|
|
|
|
cmp [reposition],0
|
|
je retwm
|
|
|
|
pushad
|
|
mov eax,[edi+00]
|
|
mov ebx,[edi+04]
|
|
mov ecx,[edi+8]
|
|
mov edx,[edi+12]
|
|
add ecx,eax
|
|
add edx,ebx
|
|
mov edi,[0x3004]
|
|
shl edi,1
|
|
add edi,0xc400
|
|
movzx esi,byte [edi]
|
|
shl esi,5
|
|
add esi,0x3000+0xe
|
|
movzx esi,byte [esi]
|
|
|
|
sub edi,draw_data
|
|
shr edi,5
|
|
shl edi,8
|
|
add edi,0x80000+0x80
|
|
;cmp [edi],dword 0
|
|
;jne no_rect_shaped_move
|
|
call setscreen
|
|
jmp move_calculated
|
|
no_rect_shaped_move:
|
|
call calculatescreen
|
|
move_calculated:
|
|
|
|
popad
|
|
|
|
mov [edi+31],byte 1 ; mark first as redraw
|
|
mov [0xfff5],byte 1 ; no mouse
|
|
|
|
push eax ebx ecx edx
|
|
mov eax,[oldc+00]
|
|
mov ebx,[oldc+04]
|
|
mov ecx,[oldc+8]
|
|
mov edx,[oldc+12]
|
|
add ecx,eax
|
|
add edx,ebx
|
|
call calculatescreen
|
|
pop edx ecx ebx eax
|
|
|
|
mov eax,edi
|
|
call redrawscreen
|
|
|
|
mov ecx,100 ; wait to avoid mouse residuals
|
|
waitre2:
|
|
mov [0xfff5],byte 1
|
|
call checkidle
|
|
cmp [edi+31],byte 0
|
|
jz retwm
|
|
loop waitre2
|
|
|
|
retwm:
|
|
|
|
mov [0xfff5],byte 0 ; mouse pointer
|
|
mov [0xfff4],byte 0 ; no mouse under
|
|
mov [0xfb44],byte 0 ; react to mouse up/down
|
|
|
|
mov esi,window_moved
|
|
call sys_msg_board_str
|
|
|
|
popad
|
|
|
|
mov [window_minimize],0
|
|
; sti
|
|
ret
|
|
|
|
;temp_mouse_1 dw 0
|
|
;temp_mouse_2 dw 0
|
|
|
|
uglobal
|
|
add_window_data dd 0
|
|
do_resize_from_corner db 0x0
|
|
reposition db 0x0
|
|
latest_window_touch dd 0x0
|
|
latest_window_touch_delta dd 0x0
|
|
|
|
do_resize db 0x0
|
|
|
|
oldc dd 0x0,0x0,0x0,0x0
|
|
|
|
dlx dd 0x0
|
|
dly dd 0x0
|
|
dlxe dd 0x0
|
|
dlye dd 0x0
|
|
|
|
npx dd 0x0
|
|
npy dd 0x0
|
|
npxe dd 0x0
|
|
npye dd 0x0
|
|
|
|
mpx dd 0x0
|
|
mpy dd 0x0
|
|
endg
|
|
|
|
|
|
; draw negative window frames
|
|
|
|
drawwindowframes:
|
|
|
|
pushad
|
|
|
|
mov eax,[npx]
|
|
shl eax,16
|
|
add eax,[npx]
|
|
add eax,[npxe]
|
|
add eax,65536*1-1
|
|
mov ebx,[npy]
|
|
shl ebx,16
|
|
add ebx,[npy]
|
|
mov ecx,0x01000000
|
|
push edi
|
|
mov edi,1
|
|
call [draw_line]
|
|
pop edi
|
|
|
|
mov eax,[npx]
|
|
shl eax,16
|
|
add eax,[npx]
|
|
add eax,[npxe]
|
|
add eax,65536*1-1
|
|
mov ebx,[npy]
|
|
add ebx,[npye]
|
|
shl ebx,16
|
|
add ebx,[npy]
|
|
add ebx,[npye]
|
|
mov ecx,0x01000000
|
|
push edi
|
|
mov edi,1
|
|
call [draw_line]
|
|
pop edi
|
|
|
|
mov eax,[npx]
|
|
shl eax,16
|
|
add eax,[npx]
|
|
mov ebx,[npy]
|
|
shl ebx,16
|
|
add ebx,[npy]
|
|
add ebx,[npye]
|
|
mov ecx,0x01000000
|
|
push edi
|
|
mov edi,1
|
|
call [draw_line]
|
|
pop edi
|
|
|
|
mov eax,[npx]
|
|
add eax,[npxe]
|
|
shl eax,16
|
|
add eax,[npx]
|
|
add eax,[npxe]
|
|
mov ebx,[npy]
|
|
shl ebx,16
|
|
add ebx,[npy]
|
|
add ebx,[npye]
|
|
mov ecx,0x01000000
|
|
push edi
|
|
mov edi,1
|
|
call [draw_line]
|
|
mov edi,[0x3000]
|
|
shl edi,5
|
|
add edi,window_data
|
|
mov [edi+30],byte 1
|
|
pop edi
|
|
|
|
popad
|
|
|
|
ret
|
|
|
|
|
|
|
|
random_shaped_window:
|
|
|
|
;
|
|
; eax = 0 giving address of data area
|
|
; ebx address
|
|
; ebx = 1 shape area scale
|
|
; ebx 2^ebx scale
|
|
|
|
test eax, eax
|
|
jne rsw_no_address
|
|
mov eax,[0x3000]
|
|
shl eax,8
|
|
|
|
mov [eax+0x80000+0x80],ebx
|
|
rsw_no_address:
|
|
|
|
cmp eax,1
|
|
jne rsw_no_scale
|
|
mov eax,[0x3000]
|
|
shl eax,8
|
|
mov [eax+0x80000+0x84],bl
|
|
rsw_no_scale:
|
|
|
|
ret
|
|
|
|
|