Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
31 halyavin 1
;
2
;    MAGNIFY SCREEN
3
;
4
;    Compile with FASM for Menuet
5
;
6
 
7
use32
8
 
9
                org     0x0
10
 
11
                db      'MENUET00'              ; 8 byte id
12
                dd      38                      ; required os
13
                dd      START                   ; program start
14
                dd      I_END                   ; program image size
15
                dd      0x10000                ; required amount of memory
16
                dd      0x10000
17
                dd      0x00000000              ; reserved=no extended header
18
 
19
include 'lang.inc'
20
include 'macros.inc'
21
scr     equ     0x1000
22
 
23
 
24
START:                          ; start of execution
25
 
26
    mov  esp,0xfff0
27
 
28
    mov  eax,14                 ; get screen size
29
    int  0x40
30
    push eax
31
    and  eax,0x0000ffff
32
    add  eax,1
33
    mov  [size_y],eax
34
    pop  eax
35
    shr  eax,16
36
    add  eax,1
37
    mov  [size_x],eax
38
 
39
    mov  eax,[size_x]
40
    shr  eax,2
41
    mov  [cmp_ecx],eax
42
 
43
    mov  eax,[size_x]
44
    xor  edx,edx
45
    mov  ebx,3
46
    mul  ebx
47
    mov  [add_esi],eax
48
 
49
    mov  eax,[size_y]
50
    shr  eax,2
51
    mov  [cmp_edx],eax
52
 
53
 
54
 
55
    call draw_window            ; at first, draw the window
56
 
57
still:
58
 
59
    call draw_screen
60
 
61
    mov  eax,23                 ; wait here for event with timeout
62
    mov  ebx,[delay]
63
    int  0x40
64
 
65
    cmp  eax,1                  ; redraw request ?
66
    jz   red
67
    cmp  eax,2                  ; key in buffer ?
68
    jz   key
69
    cmp  eax,3                  ; button in buffer ?
70
    jz   button
71
 
72
    jmp  still
73
 
74
  red:                          ; redraw
75
    call draw_window
76
    jmp  still
77
 
78
  key:                          ; key
79
    mov  eax,2                  ; just read it and ignore
80
    int  0x40
81
    jmp  still
82
 
83
  button:                       ; button
84
    mov  eax,17                 ; get id
85
    int  0x40
86
 
87
    cmp  ah,1                   ; button id=1 ?
88
    jnz  noclose
89
    mov  eax,0xffffffff         ; close this program
90
    int  0x40
91
  noclose:
92
 
93
    cmp  ah,2
94
    jnz  nosave
95
    call save_screen
96
  nosave:
97
 
98
    jmp  still
99
 
100
 
101
 
102
save_screen:
103
 
104
     pusha
105
 
106
     mov  ebx,0
107
     mov  edi,0x10000
108
 
109
   ss1:
110
 
111
     mov  eax,35
112
     int  0x40
113
 
114
     add  ebx,1
115
 
116
     mov  [edi],eax
117
     add  edi,3
118
 
119
     cmp  edi,0xFFFF0
120
     jb   ss1
121
 
122
     mov  eax,33
123
     mov  ebx,filename
124
     mov  ecx,0x10000
125
     mov  edx,0xEFFF0
126
     mov  esi,0
127
     int  0x40
128
 
129
     popa
130
 
131
     ret
132
 
133
 
134
filename  db  'SCREEN  RAW'
135
 
136
;   *********************************************
137
;   *******  WINDOW DEFINITIONS AND DRAW ********
138
;   *********************************************
139
 
140
 
141
draw_window:
142
 
143
    mov  eax,12                    ; function 12:tell os about windowdraw
144
    mov  ebx,1                     ; 1, start of draw
145
    int  0x40
146
 
147
                                   ; DRAW WINDOW
148
    mov  eax,0                     ; function 0 : define and draw window
149
    mov  ebx,100*65536             ; [x start] *65536 + [x size]
150
    mov  ebx,100*65536+322
151
    mov  ecx,100*65536+262         ; [y start] *65536 + [y size]
152
    mov  edx,0x0;01111cc            ; color of work area RRGGBB
153
    mov  esi,0x809977ff            ; color of grab bar  RRGGBB,8->color glide
154
    mov  edi,0x00ffff00            ; color of frames    RRGGBB
155
    int  0x40
156
 
157
                                   ; WINDOW LABEL
158
    mov  eax,4                     ; function 4 : write text to window
159
    mov  ebx,8*65536+8             ; [x start] *65536 + [y start]
160
    mov  ecx,0x00ffffff            ; color of text RRGGBB
161
    mov  edx,labelt                ; pointer to text beginning
162
    mov  esi,labellen-labelt       ; text length
163
    int  0x40
164
 
165
                                   ; CLOSE BUTTON
166
    mov  eax,8                     ; function 8 : define and draw button
167
    mov  bx,12                     ; [x start] *65536 + [x size]
168
    mov  ebx,(322-19)*65536+12
169
    mov  ecx,5*65536+12            ; [y start] *65536 + [y size]
170
    mov  edx,1                     ; button id
171
    mov  esi,0x22aacc              ; button color RRGGBB
172
    int  0x40
173
 
174
    call draw_screen
175
 
176
    mov  eax,12                    ; function 12:tell os about windowdraw
177
    mov  ebx,2                     ; 2, end of draw
178
    int  0x40
179
 
180
    ret
181
 
182
 
183
draw_screen:
184
 
185
    call draw_magnify
186
 
187
    ret
188
 
189
    pusha
190
 
191
    mov  edi,scr
192
 
193
    mov  ecx,0
194
    mov  edx,0
195
 
196
    mov  esi,0
197
 
198
  ds1:
199
 
200
    mov  eax,35
201
    mov  ebx,esi
202
    int  0x40
203
    stosd
204
    sub  edi,1
205
 
206
    add  esi,4
207
    add  ecx,1
208
    cmp  ecx,[cmp_ecx] ; 800/4
209
    jb   ds1
210
 
211
    add  esi,[add_esi] ; 800*3
212
    mov  ecx,0
213
    add  edx,1
214
    cmp  edx,[cmp_edx] ; 600/4
215
    jb   ds1
216
 
217
    mov  eax,7
218
    mov  ebx,scr
219
    mov  ecx,200*65536+160
220
    mov  ecx,[size_x]
221
    shr  ecx,2
222
    shl  ecx,16
223
    mov  cx,word [size_y]
224
    shr  cx,2
225
    mov  edx,20*65536+35
226
    int  0x40
227
 
228
    popa
229
 
230
    call draw_magnify
231
 
232
    ret
233
 
234
 
235
draw_magnify:
236
 
237
    pusha
238
 
239
    mov  eax,37
240
    mov  ebx,0
241
    int  0x40
242
 
243
    mov  ecx,eax
244
    mov  edx,eax
245
    shr  ecx,16
246
    and  edx,65535
247
 
248
    sub  ecx,39
249
    sub  edx,29
250
 
251
    cmp  ecx,3000
252
    jb   co1
253
    popa
254
    ret
255
  co1:
256
    cmp  edx,3000
257
    jb   co2
258
    popa
259
    ret
260
 
261
  co2:
262
 
263
    and  ecx,2047
264
    and  edx,2047
265
 
266
    mov  [m_x],ecx
267
    mov  [m_y],edx
268
 
269
    add  ecx,40
270
    add  edx,30
271
 
272
    mov  [m_xe],ecx
273
    mov  [m_ye],edx
274
 
275
    mov  ecx,[m_x]
276
    mov  edx,[m_y]
277
 
278
  dm1:
279
 
280
    push edx
281
    mov  eax,edx
282
    mul  [size_x]
283
    pop  edx
284
    add  eax,ecx
285
 
286
    mov  ebx,eax
287
    mov  eax,35
288
    int  0x40
289
 
290
    pusha
291
    mov  ebx,ecx
292
    sub  ebx,[m_x]
293
    mov  ecx,edx
294
    sub  ecx,[m_y]
295
    shl  ebx,3
296
    add  ebx,2
297
    shl  ebx,16
298
    mov  bx,7
299
    shl  ecx,3
300
    add  ecx,22
301
    shl  ecx,16
302
    mov  cx,7
303
 
304
    mov  edx,eax
305
    mov  eax,13
306
    int  0x40
307
    popa
308
 
309
    add  ecx,1
310
    cmp  ecx,[m_xe]
311
    jnz  dm1
312
    mov  ecx,[m_x]
313
    add  edx,1
314
    cmp  edx,[m_ye]
315
    jnz  dm1
316
 
317
    popa
318
 
319
    ret
320
 
321
 
322
 
323
; DATA AREA
324
 
325
m_x      dd  100
326
m_y      dd  100
327
 
328
m_xe     dd  110
329
m_ye     dd  110
330
 
331
size_x   dd  0
332
size_y   dd  0
333
 
334
cmp_ecx  dd  0
335
add_esi  dd  0
336
cmp_edx  dd  0
337
 
338
delay    dd  20
339
 
340
labelt:
341
    db   'MAGNIFIER - MOVE MOUSE POINTER'
342
labellen:
343
 
344
 
345
I_END:
346