Subversion Repositories Kolibri OS

Rev

Rev 57 | Rev 105 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 57 Rev 102
1
get_titlebar_height: ; edi = window draw_data pointer
1
get_titlebar_height: ; edi = window draw_data pointer
2
        mov     al,[edi+WDATA.fl_wstyle]
2
        mov     al,[edi+WDATA.fl_wstyle]
3
        and     al,0x0F
3
        and     al,0x0F
4
        cmp     al,0x03
4
        cmp     al,0x03
5
        jne     @f
5
        jne     @f
6
        mov     eax,[_skinh]
6
        mov     eax,[_skinh]
7
        ret
7
        ret
8
    @@: mov     eax,21
8
    @@: mov     eax,21
9
        ret
9
        ret
10
 
10
 
11
get_rolledup_height: ; edi = window draw_data pointer
11
get_rolledup_height: ; edi = window draw_data pointer
12
        mov     al,[edi+WDATA.fl_wstyle]
12
        mov     al,[edi+WDATA.fl_wstyle]
13
        and     al,0x0F
13
        and     al,0x0F
14
        cmp     al,0x03
14
        cmp     al,0x03
15
        jne     @f
15
        jne     @f
16
        mov     eax,[_skinh]
16
        mov     eax,[_skinh]
17
        add     eax,3
17
        add     eax,3
18
        ret
18
        ret
19
    @@: or      al,al
19
    @@: or      al,al
20
        jnz     @f
20
        jnz     @f
21
        mov     eax,21
21
        mov     eax,21
22
        ret
22
        ret
23
    @@: mov     eax,21+2
23
    @@: mov     eax,21+2
24
        ret
24
        ret
25
 
25
 
26
 
26
 
27
setwindowdefaults:
27
setwindowdefaults:
28
        pushad
28
        pushad
29
 
29
 
30
        xor   eax,eax
30
        xor   eax,eax
31
        mov   ecx,0xc000
31
        mov   ecx,0xc000
32
       @@:
32
       @@:
33
        inc   eax
33
        inc   eax
34
        add   ecx,2
34
        add   ecx,2
35
        mov   [ecx+0x000],ax          ; process no
35
        mov   [ecx+0x000],ax          ; process no
36
        mov   [ecx+0x400],ax          ; positions in stack
36
        mov   [ecx+0x400],ax          ; positions in stack
37
        cmp   ecx,0xc400-2            ; the more high, the more surface
37
        cmp   ecx,0xc400-2            ; the more high, the more surface
38
        jnz   @b
38
        jnz   @b
39
 
39
 
40
        popad
40
        popad
41
        ret
41
        ret
42
 
42
 
43
 
43
 
44
 
44
 
45
; eax = cx
45
; eax = cx
46
; ebx = cy
46
; ebx = cy
47
; ecx = ex
47
; ecx = ex
48
; edx = ey
48
; edx = ey
49
; èäåÿ: ïåðåáðàòü âñå îêíà, íà÷èíàÿ ñ ñàìîãî íèæíåãî,
49
; èäåÿ: ïåðåáðàòü âñå îêíà, íà÷èíàÿ ñ ñàìîãî íèæíåãî,
50
;       è äëÿ êàæäîãî âûçâàòü setscreen
50
;       è äëÿ êàæäîãî âûçâàòü setscreen
51
align 4
51
align 4
52
calculatescreen:
52
calculatescreen:
53
        pushad
53
        pushad
-
 
54
        pushfd
54
        cli
55
        cli
55
 
56
 
56
        mov   esi, 1
57
        mov   esi, 1
57
        xor   eax, eax
58
        xor   eax, eax
58
        xor   ebx, ebx
59
        xor   ebx, ebx
59
        mov   ecx, [0xFE00]
60
        mov   ecx, [0xFE00]
60
        mov   edx, [0xFE04]
61
        mov   edx, [0xFE04]
61
        call  setscreen
62
        call  setscreen
62
 
63
 
63
        mov   ebp, [0x3004]        ; number of processes
64
        mov   ebp, [0x3004]        ; number of processes
64
        cmp   ebp, 1
65
        cmp   ebp, 1
65
        jbe   .finish
66
        jbe   .finish
66
        align 4
67
        align 4
67
      .new_wnd:
68
      .new_wnd:
68
        movzx edi, word [0xC400 + esi * 2]
69
        movzx   edi, word [0xC400 + esi * 2]
69
        shl   edi, 5
70
        shl     edi, 5
-
 
71
 
-
 
72
        cmp     [0x3000+edi+0xa], byte 9
-
 
73
        je      .not_wnd
-
 
74
 
70
        add   edi, window_data
75
        add     edi, window_data
71
        test    [edi+WDATA.fl_wstate],WSTATE_MINIMIZED
76
        test    [edi+WDATA.fl_wstate],WSTATE_MINIMIZED
72
        jnz     .not_wnd
77
        jnz     .not_wnd
73
        mov     eax,[edi+WDATA.left]
78
        mov     eax,[edi+WDATA.left]
74
        mov     ebx,[edi+WDATA.top]
79
        mov     ebx,[edi+WDATA.top]
75
        mov     ecx,[edi+WDATA.width]
80
        mov     ecx,[edi+WDATA.width]
76
        add     ecx,eax
81
        add     ecx,eax
77
        mov     edx,[edi+WDATA.height]
82
        mov     edx,[edi+WDATA.height]
78
        add     edx,ebx
83
        add     edx,ebx
79
        push  esi
84
        push  esi
80
        movzx esi, word [0xC400 + esi * 2]
85
        movzx esi, word [0xC400 + esi * 2]
81
        call  setscreen
86
        call  setscreen
82
        pop   esi
87
        pop   esi
83
      .not_wnd:
88
      .not_wnd:
84
        inc   esi
89
        inc   esi
85
        dec   ebp
90
        dec   ebp
86
        jnz   .new_wnd
91
        jnz   .new_wnd
87
      .finish:
92
      .finish:
88
        sti
93
        popfd
89
        popad
94
        popad
90
ret
95
ret
91
 
96
 
92
 
97
 
93
 
98
 
94
virtual at esp
99
virtual at esp
95
  ff_xsz   dd ?
100
  ff_xsz   dd ?
96
  ff_ysz   dd ?
101
  ff_ysz   dd ?
97
  ff_scale dd ?
102
  ff_scale dd ?
98
end virtual
103
end virtual
99
 
104
 
100
align 4
105
align 4
101
; ðåçåðâèðóåò ìåñòî ïîä îêíî çàäàííîãî ïðîöåññà
106
; ðåçåðâèðóåò ìåñòî ïîä îêíî çàäàííîãî ïðîöåññà
102
setscreen:
107
setscreen:
103
;  eax  x start
108
;  eax  x start
104
;  ebx  y start
109
;  ebx  y start
105
;  ecx  x end
110
;  ecx  x end
106
;  edx  y end
111
;  edx  y end
107
;  esi  process number
112
;  esi  process number
108
pushad
113
pushad
109
        mov edi, esi ;;;word [esi*2+0xc400]
114
        mov edi, esi ;;;word [esi*2+0xc400]
110
        shl   edi, 8
115
        shl   edi, 8
111
        add   edi, 0x80000+0x80  ; address of random shaped window area
116
        add   edi, 0x80000+0x80  ; address of random shaped window area
112
        cmp   [edi], dword 0
117
        cmp   [edi], dword 0
113
        jne   .free_form
118
        jne   .free_form
114
 
119
 
115
        ; get x&y size
120
        ; get x&y size
116
        sub   ecx, eax
121
        sub   ecx, eax
117
        sub   edx, ebx
122
        sub   edx, ebx
118
        inc   ecx
123
        inc   ecx
119
        inc   edx
124
        inc   edx
120
 
125
 
121
        ; get WinMap start
126
        ; get WinMap start
122
        mov   edi, [0xFE00] ; screen_sx
127
        mov   edi, [0xFE00] ; screen_sx
123
        inc   edi
128
        inc   edi
124
        imul  edi, ebx
129
        imul  edi, ebx
125
        add   edi, eax
130
        add   edi, eax
126
        add   edi, WinMapAddress
131
        add   edi, WinMapAddress
127
 
132
 
128
  .new_y:
133
  .new_y:
129
        push  ecx ; sx
134
        push  ecx ; sx
130
        push  edx
135
        push  edx
131
 
136
 
132
        mov   edx, esi
137
        mov   edx, esi
133
        align 4
138
        align 4
134
  .new_x:
139
  .new_x:
135
        mov   byte [edi], dl
140
        mov   byte [edi], dl
136
        inc   edi
141
        inc   edi
137
        dec   ecx
142
        dec   ecx
138
        jnz   .new_x
143
        jnz   .new_x
139
 
144
 
140
        pop   edx
145
        pop   edx
141
        pop   ecx
146
        pop   ecx
142
        add   edi, [0xFE00]
147
        add   edi, [0xFE00]
143
        inc   edi
148
        inc   edi
144
        sub   edi, ecx
149
        sub   edi, ecx
145
        dec   edx
150
        dec   edx
146
        jnz   .new_y
151
        jnz   .new_y
147
 popad
152
 popad
148
 ret
153
 ret
149
  .read_byte:
154
  .read_byte:
150
   ;eax - address
155
   ;eax - address
151
   ;esi - slot
156
   ;esi - slot
152
        push  eax
157
        push  eax
153
        push  ebx
158
        push  ebx
154
        push  ecx
159
        push  ecx
155
        push  edx
160
        push  edx
156
        mov   edx,eax
161
        mov   edx,eax
157
        mov   eax,esi
162
        mov   eax,esi
158
        lea   ebx,[esp+12]
163
        lea   ebx,[esp+12]
159
        mov   ecx,1
164
        mov   ecx,1
160
        call  read_process_memory
165
        call  read_process_memory
161
        pop   edx
166
        pop   edx
162
        pop   ecx
167
        pop   ecx
163
        pop   ebx
168
        pop   ebx
164
        pop   eax
169
        pop   eax
165
        ret  
170
        ret  
166
  .free_form:
171
  .free_form:
167
 
172
 
168
        ;  for (y=0; y <= x_size; y++)
173
        ;  for (y=0; y <= x_size; y++)
169
        ;      for (x=0; x <= x_size; x++)
174
        ;      for (x=0; x <= x_size; x++)
170
        ;          if (shape[coord(x,y,scale)]==1)
175
        ;          if (shape[coord(x,y,scale)]==1)
171
        ;             set_pixel(x, y, process_number);
176
        ;             set_pixel(x, y, process_number);
172
 
177
 
173
        sub  ecx, eax
178
        sub  ecx, eax
174
        sub  edx, ebx
179
        sub  edx, ebx
175
        inc  ecx
180
        inc  ecx
176
        inc  edx
181
        inc  edx
177
 
182
 
178
        push  dword [edi+4]  ; push scale first -> for loop
183
        push  dword [edi+4]  ; push scale first -> for loop
179
 
184
 
180
        ; get WinMap start  -> ebp
185
        ; get WinMap start  -> ebp
181
        push  eax
186
        push  eax
182
        mov   eax, [0xFE00] ; screen_sx
187
        mov   eax, [0xFE00] ; screen_sx
183
        inc   eax
188
        inc   eax
184
        imul  eax, ebx   ;ebx
189
        imul  eax, ebx   ;ebx
185
        add   eax, [esp] ;eax
190
        add   eax, [esp] ;eax
186
        add   eax, WinMapAddress
191
        add   eax, WinMapAddress
187
        mov   ebp, eax
192
        mov   ebp, eax
188
 
193
 
189
        mov   edi, [edi]
194
        mov   edi, [edi]
190
;        mov   eax, esi
195
;        mov   eax, esi
191
;        shl   eax, 5
196
;        shl   eax, 5
192
;        add   edi, [eax+0x3000+0x10]
197
;        add   edi, [eax+0x3000+0x10]
193
        pop   eax
198
        pop   eax
194
 
199
 
195
        ; eax = x_start
200
        ; eax = x_start
196
        ; ebx = y_start
201
        ; ebx = y_start
197
        ; ecx = x_size
202
        ; ecx = x_size
198
        ; edx = y_size
203
        ; edx = y_size
199
        ; esi = process_number
204
        ; esi = process_number
200
        ; edi = &shape
205
        ; edi = &shape
201
        ;       [scale]
206
        ;       [scale]
202
        push edx ecx ;ebx eax
207
        push edx ecx ;ebx eax
203
        xor  ebx, ebx
208
        xor  ebx, ebx
204
        align 4
209
        align 4
205
      .ff_new_y:
210
      .ff_new_y:
206
        xor  edx, edx
211
        xor  edx, edx
207
        align 4
212
        align 4
208
      .ff_new_x:
213
      .ff_new_x:
209
        ; -- body --
214
        ; -- body --
210
        mov  ecx, [ff_scale]
215
        mov  ecx, [ff_scale]
211
        mov  eax, [ff_xsz]
216
        mov  eax, [ff_xsz]
212
        shr  eax, cl
217
        shr  eax, cl
213
        push ebx edx
218
        push ebx edx
214
        shr  ebx, cl
219
        shr  ebx, cl
215
        shr  edx, cl
220
        shr  edx, cl
216
        imul eax, ebx
221
        imul eax, ebx
217
        add  eax, edx
222
        add  eax, edx
218
        pop  edx ebx
223
        pop  edx ebx
219
        add  eax, edi ;[ff_shape]
224
        add  eax, edi ;[ff_shape]
220
        call .read_byte
225
        call .read_byte
221
;        cmp  byte [eax], 1
226
;        cmp  byte [eax], 1
222
;        jne  @f
227
;        jne  @f
223
        test al,al
228
        test al,al
224
        jz   @f
229
        jz   @f
225
        mov  eax, esi  ; [ff_proc]
230
        mov  eax, esi  ; [ff_proc]
226
        mov  [ebp], al
231
        mov  [ebp], al
227
       @@:
232
       @@:
228
        ; -- end body --
233
        ; -- end body --
229
        inc  ebp
234
        inc  ebp
230
        inc  edx
235
        inc  edx
231
        cmp  edx, [ff_xsz]
236
        cmp  edx, [ff_xsz]
232
        jb   .ff_new_x
237
        jb   .ff_new_x
233
        sub  ebp, [ff_xsz]
238
        sub  ebp, [ff_xsz]
234
        add  ebp, [0xFE00]  ; screen.x
239
        add  ebp, [0xFE00]  ; screen.x
235
        inc  ebp
240
        inc  ebp
236
        inc  ebx
241
        inc  ebx
237
        cmp  ebx, [ff_ysz]
242
        cmp  ebx, [ff_ysz]
238
        jb   .ff_new_y
243
        jb   .ff_new_y
239
 
244
 
240
        pop  ecx edx   ; eax ebx first
245
        pop  ecx edx   ; eax ebx first
241
        add  esp, 4
246
        add  esp, 4
242
popad
247
popad
243
ret
248
ret
244
 
249
 
245
 
250
 
246
display_settings:
251
display_settings:
247
 
252
 
248
;    eax = 0         ; DISPLAY redraw
253
;    eax = 0         ; DISPLAY redraw
249
;          ebx = 0   ; all
254
;          ebx = 0   ; all
250
;
255
;
251
;    eax = 1         ; BUTTON type
256
;    eax = 1         ; BUTTON type
252
;          ebx = 0   ; flat
257
;          ebx = 0   ; flat
253
;          ebx = 1   ; 3D
258
;          ebx = 1   ; 3D
254
;    eax = 2         ; set WINDOW colours
259
;    eax = 2         ; set WINDOW colours
255
;          ebx = pointer to table
260
;          ebx = pointer to table
256
;          ecx = number of bytes define
261
;          ecx = number of bytes define
257
;    eax = 3         ; get WINDOW colours
262
;    eax = 3         ; get WINDOW colours
258
;          ebx = pointer to table
263
;          ebx = pointer to table
259
;          ecx = number of bytes wanted
264
;          ecx = number of bytes wanted
260
;    eax = 4         ; get skin height
265
;    eax = 4         ; get skin height
261
;          input  : nothing
266
;          input  : nothing
262
;          output : eax = skin height in pixel
267
;          output : eax = skin height in pixel
263
;    eax = 5         ; get screen workarea
268
;    eax = 5         ; get screen workarea
264
;          input  : nothing
269
;          input  : nothing
265
;          output : eax = [left]*65536+[right]
270
;          output : eax = [left]*65536+[right]
266
;                   ebx = [top]*65536+[bottom]
271
;                   ebx = [top]*65536+[bottom]
267
;    eax = 6         ; set screen workarea
272
;    eax = 6         ; set screen workarea
268
;          input  : ecx = [left]*65536+[right]
273
;          input  : ecx = [left]*65536+[right]
269
;                   edx = [top]*65536+[bottom]
274
;                   edx = [top]*65536+[bottom]
270
;          output : nothing
275
;          output : nothing
271
;    eax = 7         ; get skin margins
276
;    eax = 7         ; get skin margins
272
;          input  : nothing
277
;          input  : nothing
273
;          output : eax = [left]*65536+[right]
278
;          output : eax = [left]*65536+[right]
274
;                   ebx = [top]*65536+[bottom]
279
;                   ebx = [top]*65536+[bottom]
275
;    eax = 8         ; set window skin
280
;    eax = 8         ; set window skin
276
;          input  : ecx = pointer to file info block
281
;          input  : ecx = pointer to file info block
277
;          output : eax = FS error code
282
;          output : eax = FS error code
278
 
283
 
279
 
284
 
280
     pushad
285
     pushad
281
 
286
 
282
     test eax, eax      ; redraw display
287
     test eax, eax      ; redraw display
283
     jnz  dspl0
288
     jnz  dspl0
284
     test ebx, ebx
289
     test ebx, ebx
285
     jnz  dspl0
290
     jnz  dspl0
286
     cmp  [windowtypechanged],dword 1
291
     cmp  [windowtypechanged],dword 1
287
     jne  dspl00
292
     jne  dspl00
288
     mov  [windowtypechanged],dword 0
293
     mov  [windowtypechanged],dword 0
289
  redraw_screen_direct:
294
  redraw_screen_direct:
290
     mov  [dlx],dword 0
295
     mov  [dlx],dword 0
291
     mov  [dly],dword 0
296
     mov  [dly],dword 0
292
     mov  eax,[0xfe00]
297
     mov  eax,[0xfe00]
293
     mov  [dlxe],eax
298
     mov  [dlxe],eax
294
     mov  eax,[0xfe04]
299
     mov  eax,[0xfe04]
295
     mov  [dlye],eax
300
     mov  [dlye],eax
296
     mov  eax,window_data
301
     mov  eax,window_data
297
     call redrawscreen
302
     call redrawscreen
298
   dspl00:
303
   dspl00:
299
     popad
304
     popad
300
     ret
305
     ret
301
   dspl0:
306
   dspl0:
302
 
307
 
303
     cmp  eax,1       ; button type
308
     cmp  eax,1       ; button type
304
     jne  dspl1
309
     jne  dspl1
305
     and  ebx,1
310
     and  ebx,1
306
     cmp  ebx,[buttontype]
311
     cmp  ebx,[buttontype]
307
     je   dspl9
312
     je   dspl9
308
     mov  [buttontype],ebx
313
     mov  [buttontype],ebx
309
     mov  [windowtypechanged],dword 1
314
     mov  [windowtypechanged],dword 1
310
    dspl9:
315
    dspl9:
311
     popad
316
     popad
312
     ret
317
     ret
313
   dspl1:
318
   dspl1:
314
 
319
 
315
     cmp  eax,2       ; set common window colours
320
     cmp  eax,2       ; set common window colours
316
     jne  no_com_colours
321
     jne  no_com_colours
317
     mov  [windowtypechanged],dword 1
322
     mov  [windowtypechanged],dword 1
318
     mov  esi,[0x3010]
323
     mov  esi,[0x3010]
319
     add  esi,0x10
324
     add  esi,0x10
320
     add  ebx,[esi]
325
     add  ebx,[esi]
321
     mov  esi,ebx
326
     mov  esi,ebx
322
     mov  edi,common_colours
327
     mov  edi,common_colours
323
     and  ecx,127
328
     and  ecx,127
324
     cld
329
     cld
325
     rep  movsb
330
     rep  movsb
326
     popad
331
     popad
327
     ret
332
     ret
328
   no_com_colours:
333
   no_com_colours:
329
 
334
 
330
     cmp  eax,3       ; get common window colours
335
     cmp  eax,3       ; get common window colours
331
     jne  no_get_com
336
     jne  no_get_com
332
     mov  esi,[0x3010]
337
     mov  esi,[0x3010]
333
     add  esi,0x10
338
     add  esi,0x10
334
     add  ebx,[esi]
339
     add  ebx,[esi]
335
     mov  edi,ebx
340
     mov  edi,ebx
336
     mov  esi,common_colours
341
     mov  esi,common_colours
337
     and  ecx,127
342
     and  ecx,127
338
     cld
343
     cld
339
     rep  movsb
344
     rep  movsb
340
     popad
345
     popad
341
     ret
346
     ret
342
   no_get_com:
347
   no_get_com:
343
 
348
 
344
     cmp  eax,4       ; get skin height
349
     cmp  eax,4       ; get skin height
345
     jne  no_skin_height
350
     jne  no_skin_height
346
     popad
351
     popad
347
     mov  eax,[_skinh]
352
     mov  eax,[_skinh]
348
     mov  [esp+36],eax
353
     mov  [esp+36],eax
349
     ret
354
     ret
350
   no_skin_height:
355
   no_skin_height:
351
 
356
 
352
        cmp     eax,5       ; get screen workarea
357
        cmp     eax,5       ; get screen workarea
353
        jne     no_get_workarea
358
        jne     no_get_workarea
354
        popad
359
        popad
355
        mov     eax,[screen_workarea.left-2]
360
        mov     eax,[screen_workarea.left-2]
356
        mov     ax,word[screen_workarea.right]
361
        mov     ax,word[screen_workarea.right]
357
        mov     [esp+36],eax
362
        mov     [esp+36],eax
358
        mov     eax,[screen_workarea.top-2]
363
        mov     eax,[screen_workarea.top-2]
359
        mov     ax,word[screen_workarea.bottom]
364
        mov     ax,word[screen_workarea.bottom]
360
        mov     [esp+24],eax
365
        mov     [esp+24],eax
361
        ret
366
        ret
362
   no_get_workarea:
367
   no_get_workarea:
363
 
368
 
364
        cmp     eax,6       ; set screen workarea
369
        cmp     eax,6       ; set screen workarea
365
        jne     no_set_workarea
370
        jne     no_set_workarea
366
        movsx   eax,word[esp+16+2]
371
        movsx   eax,word[esp+16+2]
367
        movsx   ebx,word[esp+16]
372
        movsx   ebx,word[esp+16]
368
        cmp     eax,ebx
373
        cmp     eax,ebx
369
        jge     .lp1
374
        jge     .lp1
370
        or      eax,eax;[0xFE00]
375
        or      eax,eax;[0xFE00]
371
        jl      @f
376
        jl      @f
372
        mov     [screen_workarea.left],eax
377
        mov     [screen_workarea.left],eax
373
    @@: cmp     ebx,[0xFE00]
378
    @@: cmp     ebx,[0xFE00]
374
        jg      .lp1
379
        jg      .lp1
375
        mov     [screen_workarea.right],ebx
380
        mov     [screen_workarea.right],ebx
376
  .lp1: movsx   eax,word[esp+24+2]
381
  .lp1: movsx   eax,word[esp+24+2]
377
        movsx   ebx,word[esp+24]
382
        movsx   ebx,word[esp+24]
378
        cmp     eax,ebx
383
        cmp     eax,ebx
379
        jge     .lp2
384
        jge     .lp2
380
        or      eax,eax;[0xFE04]
385
        or      eax,eax;[0xFE04]
381
        jl      @f
386
        jl      @f
382
        mov     [screen_workarea.top],eax
387
        mov     [screen_workarea.top],eax
383
    @@: cmp     ebx,[0xFE04]
388
    @@: cmp     ebx,[0xFE04]
384
        jg      .lp2
389
        jg      .lp2
385
        mov     [screen_workarea.bottom],ebx
390
        mov     [screen_workarea.bottom],ebx
386
  .lp2: call	repos_windows
391
  .lp2: call	repos_windows
387
	call	calculatescreen
392
	call	calculatescreen
388
;	jmp	redraw_screen_direct
393
;	jmp	redraw_screen_direct
389
    .exit:
394
    .exit:
390
        popad
395
        popad
391
        ret
396
        ret
392
   no_set_workarea:
397
   no_set_workarea:
393
 
398
 
394
        cmp     eax,7       ; get skin margins
399
        cmp     eax,7       ; get skin margins
395
        jne     no_get_skinmargins
400
        jne     no_get_skinmargins
396
        popad
401
        popad
397
        mov     eax,dword[_skinmargins+0]
402
        mov     eax,dword[_skinmargins+0]
398
        mov     [esp+36],eax
403
        mov     [esp+36],eax
399
        mov     eax,dword[_skinmargins+4]
404
        mov     eax,dword[_skinmargins+4]
400
        mov     [esp+24],eax
405
        mov     [esp+24],eax
401
        ret
406
        ret
402
   no_get_skinmargins:
407
   no_get_skinmargins:
403
 
408
 
404
        cmp     eax,8       ; set window skin
409
        cmp     eax,8       ; set window skin
405
        jne     no_set_skin
410
        jne     no_set_skin
406
        mov     eax,ebx
411
        mov     eax,ebx
407
        mov     edi,[0x3010]
412
        mov     edi,[0x3010]
408
        add     ebx,[edi+0x10]        ; abs start of info block
413
        add     ebx,[edi+0x10]        ; abs start of info block
409
        pushd   [ebx+0] [ebx+4] [ebx+8] [ebx+12]
414
        pushd   [ebx+0] [ebx+4] [ebx+8] [ebx+12]
410
        mov     dword[ebx+0],0        ; read
415
        mov     dword[ebx+0],0        ; read
411
        mov     dword[ebx+4],0        ; from the beginning
416
        mov     dword[ebx+4],0        ; from the beginning
412
        mov     dword[ebx+8],64       ; 32 KBytes maximum
417
        mov     dword[ebx+8],64       ; 32 KBytes maximum
413
        mov     ecx,skin_data+64*512
418
        mov     ecx,skin_data+64*512
414
        sub     ecx,[edi+0x10]
419
        sub     ecx,[edi+0x10]
415
        mov     dword[ebx+12],ecx     ; destination
420
        mov     dword[ebx+12],ecx     ; destination
416
        push	eax
421
        push	eax
417
        pushad
422
        pushad
418
        call    file_system
423
        call    file_system
419
        popad
424
        popad
420
        pop	eax
425
        pop	eax
421
        popd    [ebx+12] [ebx+8] [ebx+4] [ebx+0]
426
        popd    [ebx+12] [ebx+8] [ebx+4] [ebx+0]
422
        cmp     eax,ERROR_SUCCESS
427
        cmp     eax,ERROR_SUCCESS
423
        je      @f
428
        je      @f
424
        cmp     eax,ERROR_END_OF_FILE
429
        cmp     eax,ERROR_END_OF_FILE
425
        jne     .exit
430
        jne     .exit
426
    @@: cmp     [skin_data+64*512+SKIN_HEADER.ident],'SKIN'
431
    @@: cmp     [skin_data+64*512+SKIN_HEADER.ident],'SKIN'
427
        mov     eax,ERROR_UNKNOWN_FS
432
        mov     eax,ERROR_UNKNOWN_FS
428
        jne     .exit
433
        jne     .exit
429
        mov     esi,skin_data+64*512
434
        mov     esi,skin_data+64*512
430
        mov     edi,skin_data
435
        mov     edi,skin_data
431
        mov     ecx,(64*512)/4
436
        mov     ecx,(64*512)/4
432
        rep     movsd
437
        rep     movsd
433
        call    parse_skin_data
438
        call    parse_skin_data
434
        call    calculatescreen
439
        call    calculatescreen
435
        mov     dword[esp+32+36],0
440
        mov     dword[esp+32+36],0
436
        jmp     redraw_screen_direct
441
        jmp     redraw_screen_direct
437
  .exit:
442
  .exit:
438
        mov     [esp+32+36],eax
443
        mov     [esp+32+36],eax
439
        popad
444
        popad
440
        ret
445
        ret
441
   no_set_skin:
446
   no_set_skin:
442
 
447
 
443
     popad
448
     popad
444
     ret
449
     ret
445
 
450
 
446
 
451
 
447
repos_windows:
452
repos_windows:
448
        mov     ecx,[0x3004]
453
        mov     ecx,[0x3004]
449
        mov     esi,0x20*2
454
        mov     esi,0x20*2
450
	mov	byte[0x0000fff0],1
455
	mov	byte[0x0000fff0],1
451
        dec     ecx
456
        dec     ecx
452
        jge	@f
457
        jge	@f
453
        ret
458
        ret
454
    @@: mov	[esi+WDATA.fl_redraw],1
459
    @@: mov	[esi+WDATA.fl_redraw],1
455
	test    [esi+WDATA.fl_wstate],WSTATE_MAXIMIZED
460
	test    [esi+WDATA.fl_wstate],WSTATE_MAXIMIZED
456
        jz      .lp2
461
        jz      .lp2
457
        mov     eax,[screen_workarea.left]
462
        mov     eax,[screen_workarea.left]
458
        mov     [esi+WDATA.left],eax
463
        mov     [esi+WDATA.left],eax
459
        sub     eax,[screen_workarea.right]
464
        sub     eax,[screen_workarea.right]
460
        neg     eax
465
        neg     eax
461
        mov     [esi+WDATA.width],eax
466
        mov     [esi+WDATA.width],eax
462
        mov     eax,[screen_workarea.top]
467
        mov     eax,[screen_workarea.top]
463
        mov     [esi+WDATA.top],eax
468
        mov     [esi+WDATA.top],eax
464
        test    [esi+WDATA.fl_wstate],WSTATE_ROLLEDUP
469
        test    [esi+WDATA.fl_wstate],WSTATE_ROLLEDUP
465
        jnz     .lp1
470
        jnz     .lp1
466
        sub     eax,[screen_workarea.bottom]
471
        sub     eax,[screen_workarea.bottom]
467
        neg     eax
472
        neg     eax
468
        mov     [esi+WDATA.height],eax
473
        mov     [esi+WDATA.height],eax
469
  .lp1: add     esi,0x20
474
  .lp1: add     esi,0x20
470
        loop    @b
475
        loop    @b
471
        ret
476
        ret
472
  .lp2: mov	eax,[esi+WDATA.left]
477
  .lp2: mov	eax,[esi+WDATA.left]
473
	add	eax,[esi+WDATA.width]
478
	add	eax,[esi+WDATA.width]
474
	mov	ebx,[0x0000fe00]
479
	mov	ebx,[0x0000fe00]
475
;	inc	ebx
480
;	inc	ebx
476
	cmp	eax,ebx
481
	cmp	eax,ebx
477
	jle	.lp4
482
	jle	.lp4
478
	mov	eax,[esi+WDATA.width]
483
	mov	eax,[esi+WDATA.width]
479
	sub	eax,ebx
484
	sub	eax,ebx
480
	jle	.lp3
485
	jle	.lp3
481
	mov	[esi+WDATA.width],ebx
486
	mov	[esi+WDATA.width],ebx
482
  .lp3: sub	ebx,[esi+WDATA.width]
487
  .lp3: sub	ebx,[esi+WDATA.width]
483
	mov	[esi+WDATA.left],ebx
488
	mov	[esi+WDATA.left],ebx
484
  .lp4: mov	eax,[esi+WDATA.top]
489
  .lp4: mov	eax,[esi+WDATA.top]
485
	add	eax,[esi+WDATA.height]
490
	add	eax,[esi+WDATA.height]
486
	mov	ebx,[0x0000fe04]
491
	mov	ebx,[0x0000fe04]
487
;	inc	ebx
492
;	inc	ebx
488
	cmp	eax,ebx
493
	cmp	eax,ebx
489
	jle	.lp6
494
	jle	.lp6
490
	mov	eax,[esi+WDATA.height]
495
	mov	eax,[esi+WDATA.height]
491
	sub	eax,ebx
496
	sub	eax,ebx
492
	jle	.lp5
497
	jle	.lp5
493
	mov	[esi+WDATA.height],ebx
498
	mov	[esi+WDATA.height],ebx
494
  .lp5: sub	ebx,[esi+WDATA.height]
499
  .lp5: sub	ebx,[esi+WDATA.height]
495
	mov	[esi+WDATA.top],ebx
500
	mov	[esi+WDATA.top],ebx
496
  .lp6: add     esi,0x20
501
  .lp6: add     esi,0x20
497
        loop    @b
502
        loop    @b
498
	ret
503
	ret
499
 
504
 
500
uglobal
505
uglobal
501
  common_colours:
506
  common_colours:
502
     times 128 db 0x0
507
     times 128 db 0x0
503
endg
508
endg
504
 
509
 
505
 
510
 
506
 
511
 
507
 
512
 
508
check_window_position:
513
check_window_position:
509
 
514
 
510
    pushad                           ; window inside screen ?
515
    pushad                           ; window inside screen ?
511
 
516
 
512
    movzx eax,word [edi+0]
517
    movzx eax,word [edi+0]
513
    movzx ebx,word [edi+4]
518
    movzx ebx,word [edi+4]
514
    movzx ecx,word [edi+8]
519
    movzx ecx,word [edi+8]
515
    movzx edx,word [edi+12]
520
    movzx edx,word [edi+12]
516
 
521
 
517
    mov   esi,ecx             ; check x pos
522
    mov   esi,ecx             ; check x pos
518
    add   esi,eax
523
    add   esi,eax
519
    cmp   esi,[0xfe00]
524
    cmp   esi,[0xfe00]
520
    jbe   x_pos_ok
525
    jbe   x_pos_ok
521
    mov   [edi+0],dword 0
526
    mov   [edi+0],dword 0
522
    xor   eax, eax
527
    xor   eax, eax
523
  x_pos_ok:
528
  x_pos_ok:
524
 
529
 
525
    mov   esi,edx             ; check y pos
530
    mov   esi,edx             ; check y pos
526
    add   esi,ebx
531
    add   esi,ebx
527
    cmp   esi,[0xfe04]
532
    cmp   esi,[0xfe04]
528
    jbe   y_pos_ok
533
    jbe   y_pos_ok
529
    mov   [edi+4],dword 0
534
    mov   [edi+4],dword 0
530
    mov   ebx,0
535
    mov   ebx,0
531
  y_pos_ok:
536
  y_pos_ok:
532
 
537
 
533
    mov   esi,ecx             ; check x size
538
    mov   esi,ecx             ; check x size
534
    add   esi,eax
539
    add   esi,eax
535
    cmp   esi,[0xfe00]
540
    cmp   esi,[0xfe00]
536
    jbe   x_size_ok
541
    jbe   x_size_ok
537
    mov   ecx,[0xfe00]
542
    mov   ecx,[0xfe00]
538
    mov   [edi+8],ecx
543
    mov   [edi+8],ecx
539
  x_size_ok:
544
  x_size_ok:
540
 
545
 
541
    mov   esi,edx             ; check y size
546
    mov   esi,edx             ; check y size
542
    add   esi,ebx
547
    add   esi,ebx
543
    cmp   esi,[0xfe04]
548
    cmp   esi,[0xfe04]
544
    jbe   y_size_ok
549
    jbe   y_size_ok
545
    mov   edx,[0xfe04]
550
    mov   edx,[0xfe04]
546
    mov   [edi+12],edx
551
    mov   [edi+12],edx
547
  y_size_ok:
552
  y_size_ok:
548
 
553
 
549
    popad
554
    popad
550
 
555
 
551
    ret
556
    ret
552
 
557
 
553
 
558
 
554
uglobal
559
uglobal
555
  new_window_starting dd 0
560
  new_window_starting dd 0
556
endg
561
endg
557
 
562
 
558
 
563
 
559
sys_window_mouse:
564
sys_window_mouse:
560
 
565
 
561
    push  eax
566
    push  eax
562
 
567
 
563
    mov   eax,[timer_ticks] ;[0xfdf0]
568
    mov   eax,[timer_ticks] ;[0xfdf0]
564
    cmp   [new_window_starting],eax
569
    cmp   [new_window_starting],eax
565
    jb    swml1
570
    jb    swml1
566
 
571
 
567
    mov   [0xfff4],byte 0  ; no mouse background
572
    mov   [0xfff4],byte 0  ; no mouse background
568
    mov   [0xfff5],byte 0  ; draw mouse
573
    mov   [0xfff5],byte 0  ; draw mouse
569
 
574
 
570
    mov   [new_window_starting],eax
575
    mov   [new_window_starting],eax
571
 
576
 
572
  swml1:
577
  swml1:
573
 
578
 
574
    pop   eax
579
    pop   eax
575
 
580
 
576
    ret
581
    ret
577
 
582
 
578
drawwindow_I:
583
drawwindow_I:
579
 
584
 
580
        pushad
585
        pushad
581
 
586
 
582
        mov   esi,[edx+24]   ; rectangle
587
        mov   esi,[edx+24]   ; rectangle
583
        mov   eax,[edx+0]
588
        mov   eax,[edx+0]
584
        shl   eax,16
589
        shl   eax,16
585
        add   eax,[edx+0]
590
        add   eax,[edx+0]
586
        add   eax,[edx+8]
591
        add   eax,[edx+8]
587
        mov   ebx,[edx+04]
592
        mov   ebx,[edx+04]
588
        shl   ebx,16
593
        shl   ebx,16
589
        add   ebx,[edx+4]
594
        add   ebx,[edx+4]
590
        add   ebx,[edx+12]
595
        add   ebx,[edx+12]
591
        call  draw_rectangle
596
        call  draw_rectangle
592
 
597
 
593
        mov   ecx,[edx+20]   ; grab bar
598
        mov   ecx,[edx+20]   ; grab bar
594
        push  ecx
599
        push  ecx
595
        mov   esi,edx
600
        mov   esi,edx
596
        mov   edx,[esi+04]
601
        mov   edx,[esi+04]
597
        add   edx,1
602
        add   edx,1
598
        mov   ebx,[esi+04]
603
        mov   ebx,[esi+04]
599
        add   ebx,25
604
        add   ebx,25
600
        mov   eax,[esi+04]
605
        mov   eax,[esi+04]
601
        add   eax,[esi+12]
606
        add   eax,[esi+12]
602
        cmp   ebx,eax
607
        cmp   ebx,eax
603
        jb    wdsizeok
608
        jb    wdsizeok
604
        mov   ebx,eax
609
        mov   ebx,eax
605
      wdsizeok:
610
      wdsizeok:
606
        push  ebx
611
        push  ebx
607
      drwi:
612
      drwi:
608
        mov   ebx,edx
613
        mov   ebx,edx
609
        shl   ebx,16
614
        shl   ebx,16
610
        add   ebx,edx
615
        add   ebx,edx
611
        mov   eax,[esi+00]
616
        mov   eax,[esi+00]
612
        inc   eax
617
        inc   eax
613
        shl   eax,16
618
        shl   eax,16
614
        add   eax,[esi+00]
619
        add   eax,[esi+00]
615
        add   eax,[esi+8]
620
        add   eax,[esi+8]
616
        sub   eax,1
621
        sub   eax,1
617
        push  edx
622
        push  edx
618
        mov   edx,0x80000000
623
        mov   edx,0x80000000
619
        mov   ecx,[esi+20]
624
        mov   ecx,[esi+20]
620
        and   ecx,edx
625
        and   ecx,edx
621
        cmp   ecx,edx
626
        cmp   ecx,edx
622
        jnz   nofa
627
        jnz   nofa
623
        mov   ecx,[esi+20]
628
        mov   ecx,[esi+20]
624
        sub   ecx,0x00040404
629
        sub   ecx,0x00040404
625
        mov   [esi+20],ecx
630
        mov   [esi+20],ecx
626
        and   ecx,0x00ffffff
631
        and   ecx,0x00ffffff
627
        jmp   faj
632
        jmp   faj
628
      nofa:
633
      nofa:
629
        mov   ecx,[esi+20]
634
        mov   ecx,[esi+20]
630
        and   ecx,0x00ffffff
635
        and   ecx,0x00ffffff
631
      faj:
636
      faj:
632
        pop   edx
637
        pop   edx
633
        mov   edi,0
638
        mov   edi,0
634
        call  [draw_line]
639
        call  [draw_line]
635
        inc   edx
640
        inc   edx
636
        cmp   edx,[esp]
641
        cmp   edx,[esp]
637
        jb    drwi
642
        jb    drwi
638
        add   esp,4
643
        add   esp,4
639
        pop   ecx
644
        pop   ecx
640
        mov   [esi+20],ecx
645
        mov   [esi+20],ecx
641
 
646
 
642
        mov   edx,[esi+04]      ; inside work area
647
        mov   edx,[esi+04]      ; inside work area
643
        add   edx,21+5
648
        add   edx,21+5
644
        mov   ebx,[esi+04]
649
        mov   ebx,[esi+04]
645
        add   ebx,[esi+12]
650
        add   ebx,[esi+12]
646
        cmp   edx,ebx
651
        cmp   edx,ebx
647
        jg    noinside
652
        jg    noinside
648
        mov   eax,1
653
        mov   eax,1
649
        mov   ebx,21
654
        mov   ebx,21
650
        mov   ecx,[esi+8]
655
        mov   ecx,[esi+8]
651
        mov   edx,[esi+12]
656
        mov   edx,[esi+12]
652
        mov   edi,[esi+16]
657
        mov   edi,[esi+16]
653
        call  [drawbar]
658
        call  [drawbar]
654
      noinside:
659
      noinside:
655
 
660
 
656
        popad
661
        popad
657
 
662
 
658
        ret
663
        ret
659
 
664
 
660
 
665
 
661
draw_rectangle:
666
draw_rectangle:
662
 
667
 
663
r_eax equ [esp+28]   ; x start
668
r_eax equ [esp+28]   ; x start
664
r_ax  equ [esp+30]   ; x end
669
r_ax  equ [esp+30]   ; x end
665
r_ebx equ [esp+16]   ; y start
670
r_ebx equ [esp+16]   ; y start
666
r_bx  equ [esp+18]   ; y end
671
r_bx  equ [esp+18]   ; y end
667
;esi                 ; color
672
;esi                 ; color
668
 
673
 
669
        pushad
674
        pushad
670
 
675
 
671
        mov   ecx,esi          ; yb,xb -> yb,xe
676
        mov   ecx,esi          ; yb,xb -> yb,xe
672
     ;<<< 14.11.2004 Ivan Poddubny  
-
 
673
;        mov   eax,r_eax
-
 
674
;        shl   eax,16
-
 
675
;        mov   ax,r_ax
-
 
676
        mov   eax, r_eax
677
        mov   eax, r_eax
677
        rol   eax, 16
678
        rol   eax, 16
678
     ;>>> 14.11.2004 Ivan Poddubny  
-
 
679
        mov   ebx,r_ebx
679
        mov   ebx,r_ebx
680
        shl   ebx,16
680
        shl   ebx,16
681
        mov   bx,r_ebx
681
        mov   bx,r_ebx
682
        xor   edi, edi
682
        xor   edi, edi
683
        call  [draw_line]
683
        call  [draw_line]
684
 
684
 
685
        mov   ebx,r_bx         ; ye,xb -> ye,xe
685
        mov   ebx,r_bx         ; ye,xb -> ye,xe
686
        shl   ebx,16
686
        shl   ebx,16
687
        mov   bx,r_bx
687
        mov   bx,r_bx
688
        call  [draw_line]
688
        call  [draw_line]
689
 
689
 
690
        mov   ecx,esi          ; ya,xa -> ye,xa
690
        mov   ecx,esi          ; ya,xa -> ye,xa
691
        mov   eax,r_eax
691
        mov   eax,r_eax
692
        shl   eax,16
692
        shl   eax,16
693
        mov   ax,r_eax
693
        mov   ax,r_eax
694
        mov   ebx,r_ebx
694
        mov   ebx,r_ebx
695
        shl   ebx,16
695
        shl   ebx,16
696
        mov   bx,r_bx
696
        mov   bx,r_bx
697
        mov   edi,0
697
        mov   edi,0
698
        call  [draw_line]
698
        call  [draw_line]
699
 
699
 
700
        mov   eax,r_ax       ; ya,xe -> ye,xe
700
        mov   eax,r_ax       ; ya,xe -> ye,xe
701
        shl   eax,16
701
        shl   eax,16
702
        mov   ax,r_ax
702
        mov   ax,r_ax
703
        call  [draw_line]
703
        call  [draw_line]
704
 
704
 
705
        popad
705
        popad
706
        ret
706
        ret
707
 
707
 
708
 
708
 
709
drawwindow_III:
709
drawwindow_III:
710
 
710
 
711
        pushad
711
        pushad
712
 
712
 
713
        mov   edi,edx                              ; RECTANGLE
713
        mov   edi,edx                              ; RECTANGLE
714
        mov   eax,[edi+0]
714
        mov   eax,[edi+0]
715
        shl   eax,16
715
        shl   eax,16
716
        mov   ax,[edi+0]
716
        mov   ax,[edi+0]
717
        add   ax,[edi+8]
717
        add   ax,[edi+8]
718
        mov   ebx,[edi+4]
718
        mov   ebx,[edi+4]
719
        shl   ebx,16
719
        shl   ebx,16
720
        mov   bx,[edi+4]
720
        mov   bx,[edi+4]
721
        add   bx,[edi+12]
721
        add   bx,[edi+12]
722
        mov   esi,[edi+24]
722
        mov   esi,[edi+24]
723
        shr   esi,1
723
        shr   esi,1
724
        and   esi,0x007f7f7f
724
        and   esi,0x007f7f7f
725
        push  esi
725
        push  esi
726
        call  draw_rectangle
726
        call  draw_rectangle
727
        mov   ecx,3
727
        mov   ecx,3
728
      dw3l:
728
      dw3l:
729
        add   eax,1*65536-1
729
        add   eax,1*65536-1
730
        add   ebx,1*65536-1
730
        add   ebx,1*65536-1
731
        mov   esi,[edi+24]
731
        mov   esi,[edi+24]
732
        call  draw_rectangle
732
        call  draw_rectangle
733
        dec   ecx
733
        dec   ecx
734
        jnz   dw3l
734
        jnz   dw3l
735
        pop   esi
735
        pop   esi
736
        add   eax,1*65536-1
736
        add   eax,1*65536-1
737
        add   ebx,1*65536-1
737
        add   ebx,1*65536-1
738
        call  draw_rectangle
738
        call  draw_rectangle
739
 
739
 
740
        mov   ecx,[edx+20]                       ; GRAB BAR
740
        mov   ecx,[edx+20]                       ; GRAB BAR
741
        push  ecx
741
        push  ecx
742
        mov   esi,edx
742
        mov   esi,edx
743
        mov   edx,[esi+04]
743
        mov   edx,[esi+04]
744
        add   edx,4
744
        add   edx,4
745
        mov   ebx,[esi+04]
745
        mov   ebx,[esi+04]
746
        add   ebx,20
746
        add   ebx,20
747
        mov   eax,[esi+04]
747
        mov   eax,[esi+04]
748
        add   eax,[esi+12]
748
        add   eax,[esi+12]
749
        cmp   ebx,eax
749
        cmp   ebx,eax
750
        jb    wdsizeok2
750
        jb    wdsizeok2
751
        mov   ebx,eax
751
        mov   ebx,eax
752
      wdsizeok2:
752
      wdsizeok2:
753
        push  ebx
753
        push  ebx
754
      drwi2:
754
      drwi2:
755
        mov   ebx,edx
755
        mov   ebx,edx
756
        shl   ebx,16
756
        shl   ebx,16
757
        add   ebx,edx
757
        add   ebx,edx
758
        mov   eax,[esi+00]
758
        mov   eax,[esi+00]
759
        shl   eax,16
759
        shl   eax,16
760
        add   eax,[esi+00]
760
        add   eax,[esi+00]
761
        add   eax,[esi+8]
761
        add   eax,[esi+8]
762
        add   eax,4*65536-4
762
        add   eax,4*65536-4
763
        mov   ecx,[esi+20]
763
        mov   ecx,[esi+20]
764
        test  ecx,0x40000000
764
        test  ecx,0x40000000
765
        jz    nofa3
765
        jz    nofa3
766
        add   ecx,0x040404
766
        add   ecx,0x040404
767
      nofa3:
767
      nofa3:
768
        test  ecx,0x80000000
768
        test  ecx,0x80000000
769
        jz    nofa2
769
        jz    nofa2
770
        sub   ecx,0x040404
770
        sub   ecx,0x040404
771
      nofa2:
771
      nofa2:
772
        mov   [esi+20],ecx
772
        mov   [esi+20],ecx
773
        and   ecx,0xffffff
773
        and   ecx,0xffffff
774
        xor   edi, edi
774
        xor   edi, edi
775
        call  [draw_line]
775
        call  [draw_line]
776
        inc   edx
776
        inc   edx
777
        cmp   edx,[esp]
777
        cmp   edx,[esp]
778
        jb    drwi2
778
        jb    drwi2
779
        add   esp,4
779
        add   esp,4
780
        pop   ecx
780
        pop   ecx
781
        mov   [esi+20],ecx
781
        mov   [esi+20],ecx
782
 
782
 
783
        mov   edx,[esi+04]                       ; WORK AREA
783
        mov   edx,[esi+04]                       ; WORK AREA
784
        add   edx,21+5
784
        add   edx,21+5
785
        mov   ebx,[esi+04]
785
        mov   ebx,[esi+04]
786
        add   ebx,[esi+12]
786
        add   ebx,[esi+12]
787
        cmp   edx,ebx
787
        cmp   edx,ebx
788
        jg    noinside2
788
        jg    noinside2
789
        mov   eax,5
789
        mov   eax,5
790
        mov   ebx,20
790
        mov   ebx,20
791
        mov   ecx,[esi+8]
791
        mov   ecx,[esi+8]
792
        mov   edx,[esi+12]
792
        mov   edx,[esi+12]
793
        sub   ecx,4
793
        sub   ecx,4
794
        sub   edx,4
794
        sub   edx,4
795
        mov   edi,[esi+16]
795
        mov   edi,[esi+16]
796
        call  [drawbar]
796
        call  [drawbar]
797
      noinside2:
797
      noinside2:
798
 
798
 
799
        popad
799
        popad
800
 
800
 
801
        ret
801
        ret
802
 
802
 
803
 
803
 
804
 
804
 
805
; activate window
805
; activate window
806
align 4
806
align 4
807
windowactivate:
807
windowactivate:
808
 
808
 
809
        ; esi = abs mem position in stack 0xC400+
809
        ; esi = abs mem position in stack 0xC400+
810
 
810
 
811
        pushad
811
        pushad
-
 
812
 
-
 
813
     ; if type of current active window is 3,
-
 
814
     ; it must be redrawn
-
 
815
        mov   eax, [0x3004]
-
 
816
        movzx eax, word [0xC400 + eax*2]
-
 
817
        shl   eax, 5
-
 
818
        add   eax, window_data
-
 
819
        mov   ebx, [eax + WDATA.cl_workarea]
-
 
820
        and   ebx, 0x0f000000
-
 
821
        cmp   ebx, 0x03000000
-
 
822
        jne   @f
-
 
823
        mov   [eax + WDATA.fl_redraw], byte 1
-
 
824
     @@:
-
 
825
 
812
        push   esi
826
        push   esi
813
      movzx   eax, word [esi] ; ax <- process no
827
      movzx   eax, word [esi] ; ax <- process no
814
      movzx   eax, word [0xC000+eax*2] ; ax <- position in window stack
828
      movzx   eax, word [0xC000+eax*2] ; ax <- position in window stack
815
 
829
 
816
        xor   esi, esi        ; drop others
830
        xor   esi, esi        ; drop others
817
      waloop:
831
      waloop:
818
        cmp   esi, dword [0x3004]
832
        cmp   esi, dword [0x3004]
819
        jae   wacont
833
        jae   wacont
820
        inc   esi
834
        inc   esi
821
        lea   edi, [0xC000 + esi*2]
835
        lea   edi, [0xC000 + esi*2]
822
        mov   bx, [edi] ; position of the current process
836
        mov   bx, [edi] ; position of the current process
823
        cmp   bx, ax
837
        cmp   bx, ax
824
        jbe   @f
838
        jbe   @f
825
        dec   bx       ; upper? => drop!
839
        dec   bx       ; upper? => drop!
826
        mov   [edi], bx
840
        mov   [edi], bx
827
      @@:
841
      @@:
828
        jmp   waloop
842
        jmp   waloop
829
      wacont:
843
      wacont:
830
                            ; set to no 1
844
                            ; set to no 1
831
        pop   esi           ;   esi = pointer at 0xC400
845
        pop   esi           ;   esi = pointer at 0xC400
832
 
846
 
833
      movzx   eax, word [esi]
847
      movzx   eax, word [esi]
834
        mov   bx, [0x3004]  ; number of processes
848
        mov   bx, [0x3004]  ; number of processes
835
        mov   [0xC000+eax*2], bx     ; this is the last (and the upper)
849
        mov   [0xC000+eax*2], bx     ; this is the last (and the upper)
836
 
-
 
837
;* start code - get active process (4) - Mario79
-
 
838
        cli
-
 
839
        cmp  [active_process_flag],1
-
 
840
        jne  @f
-
 
841
        mov   [active_process_flag],0
-
 
842
        jmp   end_save_active_process
-
 
843
    @@:
-
 
844
        call save_active_process_stack
-
 
845
    end_save_active_process:
-
 
846
        mov  [active_process],eax
-
 
847
        push  eax
-
 
848
        mov   eax,[active_process]
-
 
849
        shl   eax,5
-
 
850
        add   eax,0x3000
-
 
851
        mov   [eax-twdw+31],byte 1
-
 
852
        pop   eax
-
 
853
        sti
-
 
854
;* end code - get active process (4) - Mario79
-
 
855
 
850
 
856
        ; update on screen -window stack
851
        ; update on screen -window stack
857
        xor   esi, esi
852
        xor   esi, esi
858
      waloop2:
853
      waloop2:
859
        mov   edi, [0x3004]
854
        mov   edi, [0x3004]
860
        cmp   esi, edi
855
        cmp   esi, edi
861
        jae   wacont2
856
        jae   wacont2
862
        inc   esi
857
        inc   esi
863
        movzx ebx, word [esi*2 + 0xC000]
858
        movzx ebx, word [esi*2 + 0xC000]
864
        mov   [ebx*2 + 0xC400], si
859
        mov   [ebx*2 + 0xC400], si
865
        jmp   waloop2
860
        jmp   waloop2
866
      wacont2:
861
      wacont2:
867
        mov   [0xf400], byte 0           ; empty keyboard buffer
862
        mov   [0xf400], byte 0           ; empty keyboard buffer
868
        mov   [0xf500], byte 0           ; empty button buffer
863
        mov   [0xf500], byte 0           ; empty button buffer
869
        popad
864
        popad
870
        ret
865
        ret
871
 
866
 
872
 
867
 
873
; check if window is necessary to draw
868
; check if window is necessary to draw
874
 
869
 
875
checkwindowdraw:
870
checkwindowdraw:
876
 
871
 
877
        ; edi = position in window_data+
872
        ; edi = position in window_data+
-
 
873
 
-
 
874
        mov   eax, [edi + WDATA.cl_workarea]
-
 
875
        and   eax, 0x0f000000
-
 
876
        cmp   eax, 0x03000000
-
 
877
        je    .return_yes      ; window type 3
878
 
878
 
879
        mov   esi, edi
879
        mov   esi, edi
880
        sub   esi, window_data
880
        sub   esi, window_data
881
        shr   esi, 5
881
        shr   esi, 5
882
 
882
 
883
        ; esi = process number
883
        ; esi = process number
884
 
-
 
885
; 
884
 
886
        movzx eax, word [0xC000 + esi * 2] ; get value of the curr process
885
        movzx eax, word [0xC000 + esi * 2] ; get value of the curr process
887
        lea   esi, [0xC400 + eax * 2]      ; get address of this process at 0xC400
-
 
888
; 
886
        lea   esi, [0xC400 + eax * 2]      ; get address of this process at 0xC400
889
 
887
 
890
        push  esi
888
        push  esi
891
 
889
 
892
      .new_check:
890
      .new_check:
893
 
891
 
894
        pop   esi
892
        pop   esi
895
        add   esi, 2
893
        add   esi, 2
896
        push  esi
894
        push  esi
897
 
895
 
898
        mov   eax, [0x3004]
896
        mov   eax, [0x3004]
899
        lea   eax, word [0xC400 + eax * 2] ; number of the upper window
897
        lea   eax, word [0xC400 + eax * 2] ; number of the upper window
900
 
898
 
901
        cmp   esi, eax
899
        cmp   esi, eax
902
        ja    .all_wnds_to_top
900
        ja    .all_wnds_to_top
903
 
901
 
904
        movzx eax, word [esi]
902
        movzx eax, word [esi]
905
        shl   eax, 5
903
        shl   eax, 5
906
        add   eax, window_data
904
        cmp   [0x3000 + eax + 0xa], byte 9
907
        mov   esi, eax
905
        je    .new_check                    ; skip dead windows
-
 
906
 
-
 
907
        lea   esi, [eax+window_data]
908
 
908
 
909
        mov   ebx, [edi+4]
909
        mov   ebx, [edi+4]  ; y0
910
        mov   edx, [edi+12]
910
        mov   edx, [edi+12]
911
        add   edx, ebx
911
        add   edx, ebx      ; y0e
912
 
912
 
913
        mov   ecx, [esi+4]    ; y check
913
        mov   ecx, [esi+4]  ; y  ; y check
914
        cmp   ecx, edx
914
        cmp   ecx, edx      
915
        jae   .new_check
915
        jae   .new_check     ; y < y0e
916
        mov   eax, [esi+12]
916
        mov   eax, [esi+12]
917
        add   ecx, eax
917
        add   ecx, eax       ; ye
918
        cmp   ebx, ecx
918
        cmp   ebx, ecx       ; y0 >= ye
919
        ja    .new_check
919
        ja    .new_check
920
 
920
 
921
        mov   eax, [edi+0]
921
        mov   eax, [edi+0]   ; x0
922
        mov   ecx, [edi+8]
922
        mov   ecx, [edi+8]
923
        add   ecx, eax
923
        add   ecx, eax       ; x0e
924
 
924
 
925
        mov   edx, [esi+0]    ; x check
925
        mov   edx, [esi+0]   ; x ; x check
926
        cmp   edx, ecx
926
        cmp   edx, ecx
927
        jae   .new_check
927
        jae   .new_check     ; x < x0e
928
        mov   ecx, [esi+8]
928
        mov   ecx, [esi+8]
929
        add   edx, ecx
929
        add   edx, ecx
930
        cmp   eax, edx
930
        cmp   eax, edx
931
        ja    .new_check
931
        ja    .new_check
932
 
932
 
933
        pop   esi
933
        pop   esi
-
 
934
  .return_yes:
934
        mov   ecx,1   ; overlap some window
935
        mov   ecx,1   ; overlap some window
935
        ret
936
        ret
936
 
937
 
937
  .all_wnds_to_top:
938
  .all_wnds_to_top:
938
 
939
 
939
        pop   esi
940
        pop   esi
940
 
941
 
941
        xor   ecx, ecx       ; passed all windows to top
942
        xor   ecx, ecx       ; passed all windows to top
942
        ret
943
        ret
943
 
944
 
944
 
945
 
945
 
946
 
946
 
947
 
947
waredraw:     ; if redraw necessary at activate
948
waredraw:     ; if redraw necessary at activate
948
 
949
 
949
        pushad
950
        pushad
950
 
951
 
951
        call  checkwindowdraw      ; draw window on activation ?
952
        call  checkwindowdraw      ; draw window on activation ?
952
        test  ecx, ecx
953
        test  ecx, ecx
953
        jz    .do_not_draw
954
        jz    .do_not_draw
954
 
955
 
955
        popad
956
        popad
956
        mov   [0xfb44], byte 1     ; do draw mouse
957
        mov   [0xfb44], byte 1     ; do draw mouse
957
        call  windowactivate
958
        call  windowactivate
958
 
959
 
959
        ; update screen info
960
        ; update screen info
960
        pushad
961
        pushad
961
        mov   edi, [0x3004] ; the last process (number)
962
        mov   edi, [0x3004] ; the last process (number)
962
        movzx esi, word [0xC400 + edi * 2]
963
        movzx esi, word [0xC400 + edi * 2]
963
        shl   esi, 5
964
        shl   esi, 5
964
        add   esi, window_data
965
        add   esi, window_data
965
 
966
 
966
        ; coordinates of the upper window
967
        ; coordinates of the upper window
967
        mov   eax, [esi+00] ; cx
968
        mov   eax, [esi+00] ; cx
968
        mov   ebx, [esi+04] ; cy
969
        mov   ebx, [esi+04] ; cy
969
        mov   ecx, [esi+08] ; sx
970
        mov   ecx, [esi+08] ; sx
970
        mov   edx, [esi+12] ; sy
971
        mov   edx, [esi+12] ; sy
971
 
972
 
972
        add   ecx, eax       ; ecx = x_end
973
        add   ecx, eax       ; ecx = x_end
973
        add   edx, ebx       ; edx = y_end
974
        add   edx, ebx       ; edx = y_end
974
 
975
 
975
        mov   edi, [0x3004]
976
        mov   edi, [0x3004]
976
        movzx esi, word [0xC400 + edi * 2]
977
        movzx esi, word [0xC400 + edi * 2]
977
        shl   esi, 5
978
        call  setscreen
978
        movzx esi, byte [esi + 0x3000 + 0xE]
-
 
979
        call  setscreen ;;;calculatescreen ; setscreen
-
 
980
        popad
979
        popad
981
 
980
 
982
        cmp   [0xff01], dword 1 ; if > 1 then activate process
981
        cmp   [0xff01], dword 1 ; if > 1 then activate process
983
        jbe   .not_activate
982
        jbe   .not_activate
984
 
983
 
985
;;;        mov   eax, 10            ; wait for putimages to finish
984
;;;        mov   eax, 10            ; wait for putimages to finish
986
;;;        call  delay_hs
985
;;;        call  delay_hs
987
 
986
 
988
        mov   [edi+31],byte 1  ; redraw flag for app
987
        mov   [edi+31],byte 1  ; redraw flag for app
989
        mov   [0xfb44],byte 0  ; mouse down checks
988
        mov   [0xfb44],byte 0  ; mouse down checks
990
 
989
 
991
        ret
990
        ret
992
 
991
 
993
     .not_activate:
992
     .not_activate:
994
 
993
 
995
;        mov   eax,5            ; wait for putimages to finish
994
;        mov   eax,5            ; wait for putimages to finish
996
;        call  delay_hs
995
;        call  delay_hs
997
 
996
 
998
        mov   [edi+31],byte 1  ; redraw flag for app
997
        mov   [edi+31],byte 1  ; redraw flag for app
999
 
998
 
1000
        mov   ecx, 25 ;100
999
        mov   ecx, 25 ;100
1001
     .waitflagdown:
1000
     .waitflagdown:
1002
        dec   ecx
1001
        dec   ecx
1003
        jz    .nowait
1002
        jz    .nowait
1004
;        mov   eax, 2
1003
;        mov   eax, 2
1005
;        call  delay_hs
1004
;        call  delay_hs
1006
        cmp   [edi+31], byte 0 ; wait flag to drop
1005
        cmp   [edi+31], byte 0 ; wait flag to drop
1007
        jnz   .waitflagdown
1006
        jnz   .waitflagdown
1008
      .nowait:
1007
      .nowait:
1009
 
1008
 
1010
;        mov   ecx,10
1009
;        mov   ecx,10
1011
;      .wait:
1010
;      .wait:
1012
;        mov   eax,1           ; wait for draw to finish
1011
;        mov   eax,1           ; wait for draw to finish
1013
;        call  delay_hs
1012
;        call  delay_hs
1014
;        loop  .wait
1013
;        loop  .wait
1015
 
1014
 
1016
        mov   [0xfb44],byte 0
1015
        mov   [0xfb44],byte 0
1017
 
1016
 
1018
        ret
1017
        ret
1019
 
1018
 
1020
     .do_not_draw:
1019
     .do_not_draw:
1021
 
1020
 
1022
        popad
1021
        popad
1023
 
1022
 
1024
        call  windowactivate
1023
        call  windowactivate
1025
        mov   [0xfb44],byte 0  ; mouse down checks
1024
        mov   [0xfb44],byte 0  ; mouse down checks
1026
        mov   [0xfff4],byte 0  ; no mouse background
1025
        mov   [0xfff4],byte 0  ; no mouse background
1027
        mov   [0xfff5],byte 0  ; draw mouse
1026
        mov   [0xfff5],byte 0  ; draw mouse
1028
        ret
1027
        ret
1029
 
1028
 
1030
 
1029
 
1031
iglobal
1030
iglobal
1032
  window_moving   db 'K : Window - move/resize',13,10,0
1031
  window_moving   db 'K : Window - move/resize',13,10,0
1033
  window_moved    db 'K : Window - done',13,10,0
1032
  window_moved    db 'K : Window - done',13,10,0
1034
endg
1033
endg
1035
 
1034
 
1036
; check window touch
1035
; check window touch
1037
align 4
1036
align 4
1038
checkwindows:
1037
checkwindows:
1039
        pushad
1038
        pushad
1040
 
1039
 
1041
        cmp  [0xff01],dword 1  ; activate request from app ?
1040
        cmp  [0xff01],dword 1  ; activate request from app ?
1042
        jbe  .no_activate_request
1041
        jbe  .no_activate_request
1043
        mov  edi,[0xff01]     ; process number
1042
        mov  edi,[0xff01]     ; process number
1044
        shl  edi,5
1043
        shl  edi,5
1045
        add  edi,window_data
1044
        add  edi,window_data
1046
        mov  ebx,[0xff01]
1045
        mov  ebx,[0xff01]
1047
        movzx esi, word [0xC000 + ebx * 2]
1046
        movzx esi, word [0xC000 + ebx * 2]
1048
        lea  esi, [0xC400 + esi * 2]
1047
        lea  esi, [0xC400 + esi * 2]
1049
        call waredraw
1048
        call waredraw
1050
 
-
 
1051
;* start code - get active process (2) - Mario79
-
 
1052
;        mov  eax,[0xff01]
-
 
1053
;        mov  [active_process],eax
-
 
1054
;* end code - get active process  (2) - Mario79
-
 
1055
 
1049
 
1056
        mov  [0xff01],dword 0  ; activated
1050
        mov  [0xff01],dword 0  ; activated
1057
 
1051
 
1058
        popad
1052
        popad
1059
        ret
1053
        ret
1060
 
1054
 
1061
    .no_activate_request:
1055
    .no_activate_request:
1062
    
1056
    
1063
        cmp   [0xfb40],byte 0    ; mouse buttons pressed ?
1057
        cmp   [0xfb40],byte 0    ; mouse buttons pressed ?
1064
        jne   .mouse_buttons_pressed
1058
        jne   .mouse_buttons_pressed
1065
;        cmp   [window_minimize],2
-
 
1066
;        jne   .no_activate_request_1
-
 
1067
        cmp   [window_minimize],0
1059
        cmp   [window_minimize],0
1068
        je   .no_activate_request_2
1060
        je   .no_activate_request_2
1069
        cmp   [window_minimize],1
1061
        cmp   [window_minimize],1
1070
        je    .mouse_buttons_pressed
1062
        je    .mouse_buttons_pressed
1071
        mov   esi,[0x3004]
1063
        mov   esi,[0x3004]
1072
        movzx edi, word [0xC400 + esi * 2]
1064
        movzx edi, word [0xC400 + esi * 2]
1073
        shl   edi, 5
1065
        shl   edi, 5
1074
        add   edi, window_data
1066
        add   edi, window_data
1075
        test    [edi+WDATA.fl_wstate],WSTATE_MINIMIZED
1067
        test    [edi+WDATA.fl_wstate],WSTATE_MINIMIZED
1076
        jnz     .mouse_buttons_pressed
1068
        jnz     .mouse_buttons_pressed
1077
;        jne   .no_activate_request_2
-
 
1078
;    .no_activate_request_1:
-
 
1079
;        cmp   [window_minimize],1
-
 
1080
;        jge   .mouse_buttons_pressed
-
 
1081
;        jmp   .mouse_buttons_pressed
-
 
1082
    .no_activate_request_2:
1069
    .no_activate_request_2:
1083
        mov   [window_minimize],0
1070
        mov   [window_minimize],0
1084
        popad
1071
        popad
1085
        ret
1072
        ret
1086
 
1073
 
1087
    .mouse_buttons_pressed:
1074
    .mouse_buttons_pressed:
1088
 
1075
 
1089
        mov   esi,[0x3004]
1076
        mov   esi,[0x3004]
1090
        inc   esi
1077
        inc   esi
1091
 
1078
 
1092
      cwloop:
1079
      cwloop:
1093
        cmp   esi,2
1080
        cmp   esi,2
1094
        jb   .exit
1081
        jb   .exit
1095
        .temp_window_minimize_1:
1082
        .temp_window_minimize_1:
1096
        dec   esi
1083
        dec   esi
1097
        movzx edi, word [0xC400 + esi * 2] ; ebx
1084
        movzx edi, word [0xC400 + esi * 2] ; ebx
1098
        shl   edi, 5
1085
        shl   edi, 5
1099
        add   edi, window_data
1086
        add   edi, window_data
1100
;        mov   edi, ebx
1087
;        mov   edi, ebx
1101
        mov   ecx, [edi+0]
1088
        mov   ecx, [edi+0]
1102
        mov   edx, [edi+4]
1089
        mov   edx, [edi+4]
1103
 
1090
 
1104
        mov   eax,ecx
1091
        mov   eax,ecx
1105
        mov   ebx,edx
1092
        mov   ebx,edx
1106
       cmp   [window_minimize],1
1093
       cmp   [window_minimize],1
1107
       jge   .window_minimize_no_check_mouse
1094
       jge   .window_minimize_no_check_mouse
1108
        test    [edi+WDATA.fl_wstate],WSTATE_MINIMIZED
1095
        test    [edi+WDATA.fl_wstate],WSTATE_MINIMIZED
1109
        jnz     cwloop
1096
        jnz     cwloop
1110
 
1097
 
1111
       movzx  eax, word [0xfb0a]
1098
       movzx  eax, word [0xfb0a]
1112
       movzx  ebx, word [0xfb0c]
1099
       movzx  ebx, word [0xfb0c]
1113
       
1100
       
1114
        cmp   ecx, eax
1101
        cmp   ecx, eax
1115
        jae   cwloop
1102
        jae   cwloop
1116
        cmp   edx, ebx
1103
        cmp   edx, ebx
1117
        jae   cwloop
1104
        jae   cwloop
1118
        add   ecx, [edi+8]
1105
        add   ecx, [edi+8]
1119
        add   edx, [edi+12]
1106
        add   edx, [edi+12]
1120
        cmp   eax, ecx
1107
        cmp   eax, ecx
1121
        jae   cwloop
1108
        jae   cwloop
1122
        cmp   ebx, edx
1109
        cmp   ebx, edx
1123
        jae   cwloop
1110
        jae   cwloop
1124
 
1111
 
1125
      .window_minimize_no_check_mouse:
1112
      .window_minimize_no_check_mouse:
1126
 
1113
 
1127
        pushad
1114
        pushad
1128
        mov   eax, esi
1115
        mov   eax, esi
1129
        mov   ebx, [0x3004]
1116
        mov   ebx, [0x3004]
1130
        cmp   eax, ebx      ; is this window active?
1117
        cmp   eax, ebx      ; is this window active?
1131
        jz    .move_resize_window
1118
        jz    .move_resize_window
1132
 
1119
 
1133
        ; eax = position in windowing stack
1120
        ; eax = position in windowing stack
1134
        ; redraw must ?
1121
        ; redraw must ?
1135
        lea   esi, [0xC400 + esi * 2]
1122
        lea   esi, [0xC400 + esi * 2]
1136
        call  waredraw
1123
        call  waredraw
1137
        add   esp, 32
1124
        add   esp, 32
1138
 
1125
 
1139
      .exit:
1126
      .exit:
1140
        popad
1127
        popad
1141
        ret
1128
        ret
1142
 
1129
 
1143
   .move_resize_window:    ; MOVE OR RESIZE WINDOW
1130
   .move_resize_window:    ; MOVE OR RESIZE WINDOW
1144
 
1131
 
1145
        popad
1132
        popad
1146
 
1133
 
1147
        ; Check for user enabled fixed window
1134
        ; Check for user enabled fixed window
1148
        mov   edx, [edi+0x14]
1135
        mov   edx, [edi+0x14]
1149
        and   edx, 0x0f000000
1136
        and   edx, 0x0f000000
1150
        cmp   edx, 0x01000000
1137
        cmp   edx, 0x01000000
1151
        jne   .window_move_enabled_for_user
1138
        jne   .window_move_enabled_for_user
1152
        popad
1139
        popad
1153
        ret
1140
        ret
1154
      .window_move_enabled_for_user:
1141
      .window_move_enabled_for_user:
1155
 
1142
 
1156
        test    [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP
1143
        test    [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP
1157
        jnz     .no_resize_2
1144
        jnz     .no_resize_2
1158
 
1145
 
1159
        mov   [do_resize_from_corner],byte 0   ; resize for skinned window
1146
        mov   [do_resize_from_corner],byte 0   ; resize for skinned window
1160
        mov   edx, [edi+0x10]
1147
        mov   edx, [edi+0x10]
1161
        and   edx, 0x0f000000
1148
        and   edx, 0x0f000000
1162
        cmp   edx, 0x02000000
1149
        cmp   edx, 0x02000000
1163
        jb    .no_resize_2 ; not type 2 wnd
1150
        jb    .no_resize_2 ; not type 2 wnd
1164
 
1151
 
1165
        mov   edx, [edi+4]
1152
        mov   edx, [edi+4]
1166
        add   edx, [edi+12]
1153
        add   edx, [edi+12]
1167
        sub   edx, 6       ; edx = y_end - 6
1154
        sub   edx, 6       ; edx = y_end - 6
1168
        cmp   ebx, edx     ; ebx = mouse_y
1155
        cmp   ebx, edx     ; ebx = mouse_y
1169
        jb    .no_resize_2
1156
        jb    .no_resize_2
1170
        mov   [do_resize_from_corner],byte 1
1157
        mov   [do_resize_from_corner],byte 1
1171
        jmp   .continue
1158
        jmp   .continue
1172
      .no_resize_2:
1159
      .no_resize_2:
1173
 
1160
 
1174
        push    eax
1161
        push    eax
1175
        call    get_titlebar_height
1162
        call    get_titlebar_height
1176
        add     eax,[edi+4]
1163
        add     eax,[edi+4]
1177
        cmp     ebx,eax
1164
        cmp     ebx,eax
1178
        pop     eax
1165
        pop     eax
1179
        jae     .exit
1166
        jae     .exit
1180
 
1167
 
1181
     .continue:
1168
     .continue:
1182
 
1169
 
1183
        push  esi
1170
        push  esi
1184
        mov   esi, window_moving
1171
        mov   esi, window_moving
1185
        call  sys_msg_board_str
1172
        call  sys_msg_board_str
1186
        pop   esi
1173
        pop   esi
1187
 
1174
 
1188
        mov   ecx, [timer_ticks] ;[0xfdf0]    ; double-click ?
1175
        mov   ecx, [timer_ticks] ;[0xfdf0]    ; double-click ?
1189
        mov   edx, ecx
1176
        mov   edx, ecx
1190
        sub   edx, [latest_window_touch]
1177
        sub   edx, [latest_window_touch]
1191
        mov   [latest_window_touch], ecx
1178
        mov   [latest_window_touch], ecx
1192
        mov   [latest_window_touch_delta], edx
1179
        mov   [latest_window_touch_delta], edx
1193
 
1180
 
1194
        mov   cl, [0xfb40]     ; save for shade check
1181
        mov   cl, [0xfb40]     ; save for shade check
1195
        mov   [do_resize], cl
1182
        mov   [do_resize], cl
1196
     no_emulation_righ_button:
1183
     no_emulation_righ_button:
1197
        mov   ecx, [edi+0]
1184
        mov   ecx, [edi+0]
1198
        mov   edx, [edi+4]
1185
        mov   edx, [edi+4]
1199
 
1186
 
1200
        push  eax ecx edx
1187
        push  eax ecx edx
1201
        mov   [dlx], ecx      ; save for drawlimits
1188
        mov   [dlx], ecx      ; save for drawlimits
1202
        mov   [dly], edx
1189
        mov   [dly], edx
1203
        mov   eax, [edi+8]
1190
        mov   eax, [edi+8]
1204
        add   ecx, eax
1191
        add   ecx, eax
1205
        mov   eax, [edi+12]
1192
        mov   eax, [edi+12]
1206
        add   edx, eax
1193
        add   edx, eax
1207
        mov   [dlxe], ecx
1194
        mov   [dlxe], ecx
1208
        mov   [dlye], edx
1195
        mov   [dlye], edx
1209
        pop   edx ecx eax
1196
        pop   edx ecx eax
1210
 
1197
 
1211
        sub   eax, ecx
1198
        sub   eax, ecx
1212
        sub   ebx, edx
1199
        sub   ebx, edx
1213
 
1200
 
1214
        mov   esi, [0xfb0a]
1201
        mov   esi, [0xfb0a]
1215
        mov   [0xf300], esi
1202
        mov   [0xf300], esi
1216
 
1203
 
1217
        pushad           ; wait for putimages to finish
1204
        pushad           ; wait for putimages to finish
1218
;        mov   eax,5
1205
;        mov   eax,5
1219
;        call  delay_hs
1206
;        call  delay_hs
1220
        mov   eax,[edi+0]
1207
        mov   eax,[edi+0]
1221
        mov   [npx],eax
1208
        mov   [npx],eax
1222
        mov   eax,[edi+4]
1209
        mov   eax,[edi+4]
1223
        mov   [npy],eax
1210
        mov   [npy],eax
1224
        popad
1211
        popad
1225
 
1212
 
1226
        push eax                  ; save old coordinates
1213
        push eax                  ; save old coordinates
1227
        mov   ax,[edi+00]
1214
        mov   ax,[edi+00]
1228
        mov   word [oldc+00],ax
1215
        mov   word [oldc+00],ax
1229
        mov   ax,[edi+04]
1216
        mov   ax,[edi+04]
1230
        mov   word [oldc+04],ax
1217
        mov   word [oldc+04],ax
1231
        mov   ax,[edi+8]
1218
        mov   ax,[edi+8]
1232
        mov   word [oldc+8],ax
1219
        mov   word [oldc+8],ax
1233
        mov   word [npxe],ax
1220
        mov   word [npxe],ax
1234
        mov   ax,[edi+12]
1221
        mov   ax,[edi+12]
1235
        mov   word [oldc+12],ax
1222
        mov   word [oldc+12],ax
1236
        mov   word [npye],ax
1223
        mov   word [npye],ax
1237
        pop eax
1224
        pop eax
1238
 
1225
 
1239
        test    [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED
1226
        test    [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED
1240
        jnz     @f
1227
        jnz     @f
1241
        call  drawwindowframes
1228
        call  drawwindowframes
1242
    @@:
1229
    @@:
1243
 
1230
 
1244
        mov   [reposition],0
1231
        mov   [reposition],0
1245
        mov   [0xfb44],byte 1   ; no reaction to mouse up/down
1232
        mov   [0xfb44],byte 1   ; no reaction to mouse up/down
1246
 
1233
 
1247
        ; move window
1234
        ; move window
1248
 
1235
 
1249
      newchm:
1236
      newchm:
1250
 
1237
 
1251
        mov   [0xfff5],byte 1
1238
        mov   [0xfff5],byte 1
1252
 
1239
 
1253
        call  checkidle
1240
        call  checkidle
1254
 
1241
 
1255
        call  checkEgaCga
1242
        call  checkEgaCga
1256
 
1243
 
1257
        mov   [0xfff4],byte 0
1244
        mov   [0xfff4],byte 0
1258
 
1245
 
1259
        call  [draw_pointer]
1246
        call  [draw_pointer]
1260
 
1247
 
1261
        pushad
1248
        pushad
1262
        call   stack_handler
1249
        call   stack_handler
1263
        popad
1250
        popad
1264
 
1251
 
1265
        mov   esi,[0xf300]
1252
        mov   esi,[0xf300]
1266
        cmp   esi,[0xfb0a]
1253
        cmp   esi,[0xfb0a]
1267
        je    cwb
1254
        je    cwb
1268
 
1255
 
1269
        mov   cx,[0xfb0a]
1256
        mov   cx,[0xfb0a]
1270
        mov   dx,[0xfb0c]
1257
        mov   dx,[0xfb0c]
1271
        sub   cx,ax
1258
        sub   cx,ax
1272
        sub   dx,bx
1259
        sub   dx,bx
1273
 
1260
 
1274
        push  ax
1261
        push  ax
1275
        push  bx
1262
        push  bx
1276
 
1263
 
1277
        test    [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED
1264
        test    [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED
1278
        jnz     @f
1265
        jnz     @f
1279
        call  drawwindowframes
1266
        call  drawwindowframes
1280
    @@:
1267
    @@:
1281
 
1268
 
1282
        mov   ax,[0xfe00]
1269
        mov   ax,[0xfe00]
1283
        mov   bx,[0xfe04]
1270
        mov   bx,[0xfe04]
1284
 
1271
 
1285
        cmp   [do_resize_from_corner],1
1272
        cmp   [do_resize_from_corner],1
1286
        je    no_new_position
1273
        je    no_new_position
1287
 
1274
 
1288
        mov   word [npx],word 0     ; x repos ?
1275
        mov   word [npx],word 0     ; x repos ?
1289
        cmp   ax,cx
1276
        cmp   ax,cx
1290
        jb    noreposx
1277
        jb    noreposx
1291
        mov   [reposition],1
1278
        mov   [reposition],1
1292
        sub   ax,word [npxe]
1279
        sub   ax,word [npxe]
1293
        mov   word [npx],ax
1280
        mov   word [npx],ax
1294
        cmp   ax,cx
1281
        cmp   ax,cx
1295
        jb    noreposx
1282
        jb    noreposx
1296
        mov   word [npx],cx
1283
        mov   word [npx],cx
1297
      noreposx:
1284
      noreposx:
1298
 
1285
 
1299
        mov   word [npy],word 0     ; y repos ?
1286
        mov   word [npy],word 0     ; y repos ?
1300
        cmp   bx,dx
1287
        cmp   bx,dx
1301
        jb    noreposy
1288
        jb    noreposy
1302
        mov   [reposition],1
1289
        mov   [reposition],1
1303
        sub   bx,word [npye]
1290
        sub   bx,word [npye]
1304
        mov   word [npy],bx
1291
        mov   word [npy],bx
1305
        cmp   bx,dx
1292
        cmp   bx,dx
1306
        jb    noreposy
1293
        jb    noreposy
1307
        mov   word [npy],dx
1294
        mov   word [npy],dx
1308
      noreposy:
1295
      noreposy:
1309
 
1296
 
1310
      no_new_position:
1297
      no_new_position:
1311
 
1298
 
1312
        cmp   [do_resize_from_corner],0    ; resize from right corner
1299
        cmp   [do_resize_from_corner],0    ; resize from right corner
1313
        je    norepos_size
1300
        je    norepos_size
1314
        pushad
1301
        pushad
1315
 
1302
 
1316
        mov   edx,edi
1303
        mov   edx,edi
1317
        sub   edx,window_data
1304
        sub   edx,window_data
1318
        shr   edx,5
1305
        shr   edx,5
1319
        shl   edx,8
1306
        shl   edx,8
1320
        add   edx,0x80000                 ; process base at 0x80000+
1307
        add   edx,0x80000                 ; process base at 0x80000+
1321
 
1308
 
1322
        movzx eax,word [0xfb0a]
1309
        movzx eax,word [0xfb0a]
1323
        cmp   eax,[edi+0]
1310
        cmp   eax,[edi+0]
1324
        jb    nnepx
1311
        jb    nnepx
1325
        sub   eax,[edi+0]
1312
        sub   eax,[edi+0]
1326
        cmp   eax,32 ; [edx+0x90+8]
1313
        cmp   eax,32 ; [edx+0x90+8]
1327
        jge   nnepx2
1314
        jge   nnepx2
1328
        mov   eax,32 ; [edx+0x90+8]
1315
        mov   eax,32 ; [edx+0x90+8]
1329
      nnepx2:
1316
      nnepx2:
1330
        mov   [npxe],eax
1317
        mov   [npxe],eax
1331
      nnepx:
1318
      nnepx:
1332
 
1319
 
1333
        call    get_rolledup_height
1320
        call    get_rolledup_height
1334
        mov     ebx,eax
1321
        mov     ebx,eax
1335
        movzx eax,word [0xfb0c]
1322
        movzx eax,word [0xfb0c]
1336
        cmp   eax,[edi+4]
1323
        cmp   eax,[edi+4]
1337
        jb    nnepy
1324
        jb    nnepy
1338
        sub   eax,[edi+4]
1325
        sub   eax,[edi+4]
1339
        cmp     eax,ebx ; [edx+0x90+12]
1326
        cmp     eax,ebx ; [edx+0x90+12]
1340
        jge     nnepy2
1327
        jge     nnepy2
1341
        mov     eax,ebx ; [edx+0x90+12]
1328
        mov     eax,ebx ; [edx+0x90+12]
1342
      nnepy2:
1329
      nnepy2:
1343
        mov   [npye],eax
1330
        mov   [npye],eax
1344
      nnepy:
1331
      nnepy:
1345
 
1332
 
1346
        mov   [reposition],1
1333
        mov   [reposition],1
1347
 
1334
 
1348
        popad
1335
        popad
1349
      norepos_size:
1336
      norepos_size:
1350
 
1337
 
1351
        pop   bx
1338
        pop   bx
1352
        pop   ax
1339
        pop   ax
1353
        test    [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED
1340
        test    [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED
1354
        jnz     @f
1341
        jnz     @f
1355
        call  drawwindowframes
1342
        call  drawwindowframes
1356
    @@:
1343
    @@:
1357
 
1344
 
1358
        mov   esi,[0xfb0a]
1345
        mov   esi,[0xfb0a]
1359
        mov   [0xf300],esi
1346
        mov   [0xf300],esi
1360
 
1347
 
1361
      cwb:
1348
      cwb:
1362
        cmp   [0xfb40],byte 0
1349
        cmp   [0xfb40],byte 0
1363
        jne   newchm 
1350
        jne   newchm 
1364
                                     ; new position done
1351
                                     ; new position done
1365
        mov     [0xfff5],byte 1
1352
        mov     [0xfff5],byte 1
1366
        mov     cl,0
1353
        mov     cl,0
1367
        test    [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED
1354
        test    [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED
1368
        jnz     @f
1355
        jnz     @f
1369
        mov     cl,[reposition]
1356
        mov     cl,[reposition]
1370
        call    drawwindowframes
1357
        call    drawwindowframes
1371
 
1358
 
1372
        mov   eax,[npx]
1359
        mov   eax,[npx]
1373
        mov   [edi+0],eax
1360
        mov   [edi+0],eax
1374
        mov   eax,[npy]
1361
        mov   eax,[npy]
1375
        mov   [edi+4],eax
1362
        mov   [edi+4],eax
1376
        mov   eax,[npxe]
1363
        mov   eax,[npxe]
1377
        mov   [edi+8],eax
1364
        mov   [edi+8],eax
1378
        mov   eax,[npye]
1365
        mov   eax,[npye]
1379
        mov   [edi+12],eax
1366
        mov   [edi+12],eax
1380
 
1367
 
1381
    @@: mov     [reposition],cl
1368
    @@: mov     [reposition],cl
1382
 
1369
 
1383
        cmp   [reposition],1         ; save new position and size
1370
        cmp   [reposition],1         ; save new position and size
1384
        jne   no_bounds_save
1371
        jne   no_bounds_save
1385
        ; 
1372
        ; 
1386
        push  esi edi ecx
1373
        push  esi edi ecx
1387
        mov   esi,edi
1374
        mov   esi,edi
1388
        mov   ecx,2
1375
        mov   ecx,2
1389
        test  [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP or WSTATE_MAXIMIZED
1376
        test  [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP or WSTATE_MAXIMIZED
1390
        jnz   @f
1377
        jnz   @f
1391
        add   ecx,2
1378
        add   ecx,2
1392
    @@: sub   edi,window_data
1379
    @@: sub   edi,window_data
1393
        shr   edi,5
1380
        shr   edi,5
1394
        shl   edi,8
1381
        shl   edi,8
1395
        add   edi,0x80000+0x90
1382
        add   edi,0x80000+0x90
1396
        cld
1383
        cld
1397
        rep   movsd
1384
        rep   movsd
1398
        pop   ecx edi esi
1385
        pop   ecx edi esi
1399
        ; 
1386
        ; 
1400
      no_bounds_save:
1387
      no_bounds_save:
1401
 
1388
 
1402
        pushad                             ; WINDOW SHADE/FULLSCREEN
1389
        pushad                             ; WINDOW SHADE/FULLSCREEN
1403
 
1390
 
1404
        cmp   [reposition],1
1391
        cmp   [reposition],1
1405
        je    no_window_sizing
1392
        je    no_window_sizing
1406
        mov   edx,edi
1393
        mov   edx,edi
1407
        sub   edx,window_data
1394
        sub   edx,window_data
1408
        shr   edx,5
1395
        shr   edx,5
1409
        shl   edx,8
1396
        shl   edx,8
1410
        add   edx,0x80000                 ; process base at 0x80000+
1397
        add   edx,0x80000                 ; process base at 0x80000+
1411
 
1398
 
1412
        cmp     [window_minimize],0
1399
        cmp     [window_minimize],0
1413
        je      no_wnd_minimize_restore
1400
        je      no_wnd_minimize_restore
1414
        mov     [reposition],1
1401
        mov     [reposition],1
1415
  wnd_minimize:
1402
  wnd_minimize:
1416
        cmp     [window_minimize],1
1403
        cmp     [window_minimize],1
1417
        jne     wnd_restore
1404
        jne     wnd_restore
1418
        or      [edi+WDATA.fl_wstate],WSTATE_MINIMIZED
1405
        or      [edi+WDATA.fl_wstate],WSTATE_MINIMIZED
1419
        jmp     no_wnd_minimize_restore
1406
        jmp     no_wnd_minimize_restore
1420
  wnd_restore:
1407
  wnd_restore:
1421
        cmp     [window_minimize],2
1408
        cmp     [window_minimize],2
1422
        jne     no_wnd_minimize_restore
1409
        jne     no_wnd_minimize_restore
1423
        and     [edi+WDATA.fl_wstate],not WSTATE_MINIMIZED
1410
        and     [edi+WDATA.fl_wstate],not WSTATE_MINIMIZED
1424
  no_wnd_minimize_restore:
1411
  no_wnd_minimize_restore:
1425
 
1412
 
1426
 
1413
 
1427
        cmp   [do_resize],2               ; window shade ?
1414
        cmp   [do_resize],2               ; window shade ?
1428
        jne   no_window_shade
1415
        jne   no_window_shade
1429
        mov   [reposition],1
1416
        mov   [reposition],1
1430
 
1417
 
1431
        test    [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP
1418
        test    [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP
1432
        jnz     wnd_rolldown
1419
        jnz     wnd_rolldown
1433
  wnd_rollup:
1420
  wnd_rollup:
1434
        or      [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP
1421
        or      [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP
1435
        call    get_rolledup_height
1422
        call    get_rolledup_height
1436
        jmp     @f
1423
        jmp     @f
1437
  wnd_rolldown:
1424
  wnd_rolldown:
1438
        and     [edi+WDATA.fl_wstate],not WSTATE_ROLLEDUP
1425
        and     [edi+WDATA.fl_wstate],not WSTATE_ROLLEDUP
1439
        mov     eax,[edx+0x90+BOX.height]
1426
        mov     eax,[edx+0x90+BOX.height]
1440
        test    [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED
1427
        test    [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED
1441
        jz      @f
1428
        jz      @f
1442
        mov     eax,[screen_workarea.bottom]
1429
        mov     eax,[screen_workarea.bottom]
1443
        sub     eax,[screen_workarea.top]
1430
        sub     eax,[screen_workarea.top]
1444
    @@: mov     [edi+WDATA.height],eax
1431
    @@: mov     [edi+WDATA.height],eax
1445
 
1432
 
1446
      no_window_shade:
1433
      no_window_shade:
1447
 
1434
 
1448
        cmp   [do_resize],1               ; fullscreen/restore ?
1435
        cmp   [do_resize],1               ; fullscreen/restore ?
1449
        jne   no_fullscreen_restore
1436
        jne   no_fullscreen_restore
1450
        cmp   [latest_window_touch_delta],dword 50
1437
        cmp   [latest_window_touch_delta],dword 50
1451
        jg    no_fullscreen_restore
1438
        jg    no_fullscreen_restore
1452
        mov   [reposition],1
1439
        mov   [reposition],1
1453
        test    [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED
1440
        test    [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED
1454
        jnz     restore_from_fullscreen
1441
        jnz     restore_from_fullscreen
1455
        or      [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED
1442
        or      [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED
1456
        mov     eax,[screen_workarea.left]
1443
        mov     eax,[screen_workarea.left]
1457
        mov     [edi+WDATA.left],eax
1444
        mov     [edi+WDATA.left],eax
1458
        sub     eax,[screen_workarea.right]
1445
        sub     eax,[screen_workarea.right]
1459
        neg     eax
1446
        neg     eax
1460
        mov     [edi+WDATA.width],eax
1447
        mov     [edi+WDATA.width],eax
1461
        mov     eax,[screen_workarea.top]
1448
        mov     eax,[screen_workarea.top]
1462
        mov     [edi+WDATA.top],eax
1449
        mov     [edi+WDATA.top],eax
1463
        test    [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP
1450
        test    [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP
1464
        jnz     @f
1451
        jnz     @f
1465
        sub     eax,[screen_workarea.bottom]
1452
        sub     eax,[screen_workarea.bottom]
1466
        neg     eax
1453
        neg     eax
1467
        mov     [edi+WDATA.height],eax
1454
        mov     [edi+WDATA.height],eax
1468
    @@:
1455
    @@:
1469
        jmp   no_fullscreen_restore
1456
        jmp   no_fullscreen_restore
1470
      restore_from_fullscreen:
1457
      restore_from_fullscreen:
1471
        and     [edi+WDATA.fl_wstate],not WSTATE_MAXIMIZED
1458
        and     [edi+WDATA.fl_wstate],not WSTATE_MAXIMIZED
1472
        push    [edi+WDATA.height]
1459
        push    [edi+WDATA.height]
1473
        push  edi                         ; restore
1460
        push  edi                         ; restore
1474
        lea   esi, [edx + 0x90]
1461
        lea   esi, [edx + 0x90]
1475
        mov   ecx,4
1462
        mov   ecx,4
1476
        cld
1463
        cld
1477
        rep   movsd
1464
        rep   movsd
1478
        pop   edi
1465
        pop   edi
1479
        pop     eax
1466
        pop     eax
1480
        test    [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP
1467
        test    [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP
1481
        jz      @f
1468
        jz      @f
1482
        mov     [edi+WDATA.height],eax
1469
        mov     [edi+WDATA.height],eax
1483
    @@:
1470
    @@:
1484
 
1471
 
1485
      no_fullscreen_restore:
1472
      no_fullscreen_restore:
1486
 
1473
 
1487
        mov   eax,[edi+4]                 ; check Y inside screen
1474
        mov   eax,[edi+4]                 ; check Y inside screen
1488
        add   eax,[edi+12]
1475
        add   eax,[edi+12]
1489
        cmp   eax,[0xfe04]
1476
        cmp   eax,[0xfe04]
1490
        jbe   no_window_sizing
1477
        jbe   no_window_sizing
1491
        mov   eax,[edi+0]                 ; check X inside screen
1478
        mov   eax,[edi+0]                 ; check X inside screen
1492
        add   eax,[edi+8]
1479
        add   eax,[edi+8]
1493
        cmp   eax,[0xfe00]
1480
        cmp   eax,[0xfe00]
1494
        jbe   no_window_sizing
1481
        jbe   no_window_sizing
1495
        mov   eax,[0xfe00]
1482
        mov   eax,[0xfe00]
1496
        sub   eax,[edi+8]
1483
        sub   eax,[edi+8]
1497
        mov   [edi+0],eax
1484
        mov   [edi+0],eax
1498
        mov   eax,[0xfe04]
1485
        mov   eax,[0xfe04]
1499
        sub   eax,[edi+12]
1486
        sub   eax,[edi+12]
1500
        mov   [edi+4],eax
1487
        mov   [edi+4],eax
1501
      no_window_sizing:
1488
      no_window_sizing:
1502
 
1489
 
1503
        popad
1490
        popad
1504
 
1491
 
1505
        cmp   [reposition],0
1492
        cmp   [reposition],0
1506
        je    retwm
1493
        je    retwm
1507
 
-
 
1508
        pushad
-
 
1509
        mov   eax,[edi+00]
-
 
1510
        mov   ebx,[edi+04]
-
 
1511
        mov   ecx,[edi+8]
-
 
1512
        mov   edx,[edi+12]
-
 
1513
        add   ecx,eax
-
 
1514
        add   edx,ebx
-
 
1515
        mov   edi,[0x3004]
-
 
1516
        shl   edi,1
-
 
1517
        add   edi,0xc400
-
 
1518
        movzx esi,byte [edi]
-
 
1519
        shl   esi,5
-
 
1520
        add   esi,0x3000+0xe
-
 
1521
        movzx esi,byte [esi]
-
 
1522
 
-
 
1523
        sub   edi,draw_data
-
 
1524
        shr   edi,5
-
 
1525
        shl   edi,8
-
 
1526
        add   edi,0x80000+0x80
-
 
1527
        ;cmp   [edi],dword 0
-
 
1528
        ;jne   no_rect_shaped_move
-
 
1529
        call  setscreen
-
 
1530
        jmp   move_calculated
-
 
1531
      no_rect_shaped_move:
-
 
1532
        call  calculatescreen
-
 
1533
      move_calculated:
-
 
1534
 
-
 
1535
        popad
-
 
1536
 
1494
 
1537
        mov     [edi+WDATA.fl_redraw],1
1495
        mov     [edi+WDATA.fl_redraw],1
1538
        mov   [0xfff5],byte 1 ; no mouse
1496
        mov   [0xfff5],byte 1 ; no mouse
1539
 
1497
 
1540
        push  eax ebx ecx edx
1498
        push  eax ebx ecx edx
1541
        mov   eax,[oldc+00]
1499
        mov   eax,[oldc+00]
1542
        mov   ebx,[oldc+04]
1500
        mov   ebx,[oldc+04]
1543
        mov   ecx,[oldc+8]
1501
        mov   ecx,[oldc+8]
1544
        mov   edx,[oldc+12]
1502
        mov   edx,[oldc+12]
1545
        add   ecx,eax
1503
        add   ecx,eax
1546
        add   edx,ebx
1504
        add   edx,ebx
1547
        call  calculatescreen
1505
        call  calculatescreen
1548
        pop   edx ecx ebx eax
1506
        pop   edx ecx ebx eax
1549
 
1507
 
1550
        mov   eax,edi
1508
        mov   eax,edi
1551
        call  redrawscreen
1509
        call  redrawscreen
1552
 
1510
 
1553
        mov   ecx,100         ; wait to avoid mouse residuals
1511
        mov   ecx,100         ; wait to avoid mouse residuals
1554
      waitre2:
1512
      waitre2:
1555
        mov   [0xfff5],byte 1
1513
        mov   [0xfff5],byte 1
1556
        call  checkidle
1514
        call  checkidle
1557
        cmp     [edi+WDATA.fl_redraw],0
1515
        cmp     [edi+WDATA.fl_redraw],0
1558
        jz    retwm
1516
        jz    retwm
1559
        loop  waitre2
1517
        loop  waitre2
1560
 
1518
 
1561
      retwm:
1519
      retwm:
1562
 
1520
 
1563
        mov   [0xfff5],byte 0 ; mouse pointer
1521
        mov   [0xfff5],byte 0 ; mouse pointer
1564
        mov   [0xfff4],byte 0 ; no mouse under
1522
        mov   [0xfff4],byte 0 ; no mouse under
1565
        mov   [0xfb44],byte 0 ; react to mouse up/down
1523
        mov   [0xfb44],byte 0 ; react to mouse up/down
1566
 
1524
 
1567
        mov    esi,window_moved
1525
        mov    esi,window_moved
1568
        call   sys_msg_board_str
1526
        call   sys_msg_board_str
1569
 
1527
 
1570
        popad
1528
        popad
1571
 
1529
 
1572
       mov   [window_minimize],0
1530
       mov   [window_minimize],0
1573
;        sti
1531
 
1574
        ret
1532
        ret
1575
 
-
 
1576
;temp_mouse_1 dw 0
-
 
1577
;temp_mouse_2 dw 0
1533
 
1578
 
1534
 
1579
uglobal
1535
uglobal
1580
  add_window_data            dd  0
1536
  add_window_data            dd  0
1581
  do_resize_from_corner      db  0x0
1537
  do_resize_from_corner      db  0x0
1582
  reposition                 db  0x0
1538
  reposition                 db  0x0
1583
  latest_window_touch        dd  0x0
1539
  latest_window_touch        dd  0x0
1584
  latest_window_touch_delta  dd  0x0
1540
  latest_window_touch_delta  dd  0x0
1585
 
1541
 
1586
  do_resize db 0x0
1542
  do_resize db 0x0
1587
 
1543
 
1588
  oldc    dd 0x0,0x0,0x0,0x0
1544
  oldc    dd 0x0,0x0,0x0,0x0
1589
 
1545
 
1590
  dlx     dd 0x0
1546
  dlx     dd 0x0
1591
  dly     dd 0x0
1547
  dly     dd 0x0
1592
  dlxe    dd 0x0
1548
  dlxe    dd 0x0
1593
  dlye    dd 0x0
1549
  dlye    dd 0x0
1594
 
1550
 
1595
  npx     dd 0x0
1551
  npx     dd 0x0
1596
  npy     dd 0x0
1552
  npy     dd 0x0
1597
  npxe    dd 0x0
1553
  npxe    dd 0x0
1598
  npye    dd 0x0
1554
  npye    dd 0x0
1599
 
1555
 
1600
  mpx     dd 0x0
1556
  mpx     dd 0x0
1601
  mpy     dd 0x0
1557
  mpy     dd 0x0
1602
endg
1558
endg
1603
 
1559
 
1604
 
1560
 
1605
; draw negative window frames
1561
; draw negative window frames
1606
 
1562
 
1607
drawwindowframes:
1563
drawwindowframes:
1608
 
1564
 
1609
        pushad
1565
        pushad
1610
 
1566
 
1611
        mov   eax,[npx]
1567
        mov   eax,[npx]
1612
        shl   eax,16
1568
        shl   eax,16
1613
        add   eax,[npx]
1569
        add   eax,[npx]
1614
        add   eax,[npxe]
1570
        add   eax,[npxe]
1615
        add   eax,65536*1-1
1571
        add   eax,65536*1-1
1616
        mov   ebx,[npy]
1572
        mov   ebx,[npy]
1617
        shl   ebx,16
1573
        shl   ebx,16
1618
        add   ebx,[npy]
1574
        add   ebx,[npy]
1619
        mov   ecx,0x01000000
1575
        mov   ecx,0x01000000
1620
        push  edi
1576
        push  edi
1621
        mov   edi,1
1577
        mov   edi,1
1622
        call  [draw_line]
1578
        call  [draw_line]
1623
        pop   edi
1579
        pop   edi
1624
 
1580
 
1625
        mov   eax,[npx]
1581
        mov   eax,[npx]
1626
        shl   eax,16
1582
        shl   eax,16
1627
        add   eax,[npx]
1583
        add   eax,[npx]
1628
        add   eax,[npxe]
1584
        add   eax,[npxe]
1629
        add   eax,65536*1-1
1585
        add   eax,65536*1-1
1630
        mov   ebx,[npy]
1586
        mov   ebx,[npy]
1631
        add   ebx,[npye]
1587
        add   ebx,[npye]
1632
        shl   ebx,16
1588
        shl   ebx,16
1633
        add   ebx,[npy]
1589
        add   ebx,[npy]
1634
        add   ebx,[npye]
1590
        add   ebx,[npye]
1635
        mov   ecx,0x01000000
1591
        mov   ecx,0x01000000
1636
        push  edi
1592
        push  edi
1637
        mov   edi,1
1593
        mov   edi,1
1638
        call  [draw_line]
1594
        call  [draw_line]
1639
        pop   edi
1595
        pop   edi
1640
 
1596
 
1641
        mov   eax,[npx]
1597
        mov   eax,[npx]
1642
        shl   eax,16
1598
        shl   eax,16
1643
        add   eax,[npx]
1599
        add   eax,[npx]
1644
        mov   ebx,[npy]
1600
        mov   ebx,[npy]
1645
        shl   ebx,16
1601
        shl   ebx,16
1646
        add   ebx,[npy]
1602
        add   ebx,[npy]
1647
        add   ebx,[npye]
1603
        add   ebx,[npye]
1648
        mov   ecx,0x01000000
1604
        mov   ecx,0x01000000
1649
        push  edi
1605
        push  edi
1650
        mov   edi,1
1606
        mov   edi,1
1651
        call  [draw_line]
1607
        call  [draw_line]
1652
        pop   edi
1608
        pop   edi
1653
 
1609
 
1654
        mov   eax,[npx]
1610
        mov   eax,[npx]
1655
        add   eax,[npxe]
1611
        add   eax,[npxe]
1656
        shl   eax,16
1612
        shl   eax,16
1657
        add   eax,[npx]
1613
        add   eax,[npx]
1658
        add   eax,[npxe]
1614
        add   eax,[npxe]
1659
        mov   ebx,[npy]
1615
        mov   ebx,[npy]
1660
        shl   ebx,16
1616
        shl   ebx,16
1661
        add   ebx,[npy]
1617
        add   ebx,[npy]
1662
        add   ebx,[npye]
1618
        add   ebx,[npye]
1663
        mov   ecx,0x01000000
1619
        mov   ecx,0x01000000
1664
        push  edi
1620
        push  edi
1665
        mov   edi,1
1621
        mov   edi,1
1666
        call  [draw_line]
1622
        call  [draw_line]
1667
        mov   edi,[0x3000]
1623
        mov   edi,[0x3000]
1668
        shl   edi,5
1624
        shl   edi,5
1669
        add   edi,window_data
1625
        add   edi,window_data
1670
        mov   [edi+30],byte 1
1626
        mov   [edi+30],byte 1
1671
        pop   edi
1627
        pop   edi
1672
 
1628
 
1673
        popad
1629
        popad
1674
 
1630
 
1675
        ret
1631
        ret
1676
 
1632
 
1677
 
1633
 
1678
 
1634
 
1679
random_shaped_window:
1635
random_shaped_window:
1680
 
1636
 
1681
;
1637
;
1682
;  eax = 0    giving address of data area
1638
;  eax = 0    giving address of data area
1683
;      ebx    address
1639
;      ebx    address
1684
;  ebx = 1    shape area scale
1640
;  ebx = 1    shape area scale
1685
;      ebx    2^ebx scale
1641
;      ebx    2^ebx scale
1686
 
1642
 
1687
     test eax, eax
1643
     test eax, eax
1688
     jne  rsw_no_address
1644
     jne  rsw_no_address
1689
     mov  eax,[0x3000]
1645
     mov  eax,[0x3000]
1690
     shl  eax,8
1646
     shl  eax,8
1691
 
1647
 
1692
     mov  [eax+0x80000+0x80],ebx
1648
     mov  [eax+0x80000+0x80],ebx
1693
   rsw_no_address:
1649
   rsw_no_address:
1694
 
1650
 
1695
     cmp  eax,1
1651
     cmp  eax,1
1696
     jne  rsw_no_scale
1652
     jne  rsw_no_scale
1697
     mov  eax,[0x3000]
1653
     mov  eax,[0x3000]
1698
     shl  eax,8
1654
     shl  eax,8
1699
     mov  [eax+0x80000+0x84],bl
1655
     mov  [eax+0x80000+0x84],bl
1700
   rsw_no_scale:
1656
   rsw_no_scale:
1701
 
1657
 
1702
     ret
1658
     ret