Subversion Repositories Kolibri OS

Rev

Rev 6573 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
6573 leency 1
;             program to generate files            ;
2
;              path to folder in edit1             ;
3
;              count of files in edit2             ;
4
; to compile: nasm -f bin GenFiles.asm -o GenFiles ;
5
ORG 0
6
BITS 32
7
; ------------------------------------- ;
8
STACK_SIZE             equ 256
9
; ------------------------------------- ;
10
EM_REDRAW              equ 0b1
11
EM_KEY                 equ 0b10
12
EM_BUTTON              equ 0b100
13
EM_MOUSE               equ 0b100000
14
; ------------------------------------- ;
15
BUTTON_START           equ 2
16
; ------------------------------------- ;
17
ED_DISABLED            equ 0b100000000000
18
; ------------------------------------- ;
19
EDIT1_MAX_LENGTH       equ 1024
20
EDIT2_MAX_LENGTH       equ 10
21
FILE_NAME_LENGTH       equ 256
22
; ------------------------------------- ;
23
text_buffer1           equ END + STACK_SIZE
24
text_buffer2           equ END + STACK_SIZE + (EDIT1_MAX_LENGTH + 2)
25
file_name              equ END + STACK_SIZE + (EDIT1_MAX_LENGTH + 2) + (EDIT2_MAX_LENGTH + 2)
26
; ------------------------------------- ;
27
MENUET01                db 'MENUET01'
28
version                 dd 1
29
program.start           dd START
30
program.end             dd END
31
program.memory          dd END + STACK_SIZE + (EDIT1_MAX_LENGTH + 2) + (EDIT2_MAX_LENGTH + 2) + FILE_NAME_LENGTH
32
program.stack           dd END + STACK_SIZE
33
program.params          dd 0
34
program.path            dd 0
35
; ------------------------------------- ;
36
align 4
37
Events:
38
.0:                     dd  On_Idle
39
.1:                     dd  On_Redraw
40
.2:                     dd  On_Key
41
.3:                     dd  On_Button
42
.4:                     dd  0
43
.5:                     dd  0
44
.6:                     dd  On_Mouse
45
; ------------------------------------- ;
46
ButtonEvents:
47
.0:                     dd  0
48
.1:                     dd  On_ButtonClose
49
.2:                     dd  On_ButtonStart
50
; ------------------------------------- ;
51
count                   dd  0
52
; ------------------------------------- ;
53
pb:
54
.value                  dd 0
55
.left                   dd 8
7637 leency 56
.top                    dd 38
6573 leency 57
.width                  dd 269
7637 leency 58
.height                 dd 15
6573 leency 59
.style                  dd 0
60
.min                    dd 0
61
.max                    dd 0
62
.back_color             dd 0x00C8D0D4
63
.progress_color         dd 0x8072B7EB
64
.frame_color            dd 0x00406175
65
; ------------------------------------- ;
66
edit1:
67
.width                  dd 100
68
.left                   dd 48
69
.top                    dd 8
70
.color                  dd 0X00FFFFFF
7637 leency 71
.shift_color            dd 0x94AECE
6573 leency 72
.focus_border_color     dd 0
73
.blur_border_color      dd 0
7637 leency 74
.text_color             dd 0x10000000
6573 leency 75
.max                    dd EDIT1_MAX_LENGTH
76
.text                   dd text_buffer1
77
.mouse_variable         dd 0
78
.flags                  dd 10b ; active
79
.size                   dd 0
80
.pos                    dd 0
81
.offset                 dd 0
82
.cl_curs_x              dd 0
83
.cl_curs_y              dd 0
84
.shift                  dd 0
85
.shift_old              dd 0
86
; ------------------------------------- ;
87
edit2:
88
.width                  dd 60
89
.left                   dd 216
90
.top                    dd 8
91
.color                  dd 0X00FFFFFF
7637 leency 92
.shift_color            dd 0x94AECE
6573 leency 93
.focus_border_color     dd 0
94
.blur_border_color      dd 0
7637 leency 95
.text_color             dd 0x10000000
6573 leency 96
.max                    dd EDIT2_MAX_LENGTH
97
.text                   dd text_buffer2
98
.mouse_variable         dd 0
99
.flags                  dd 1000000000000000b ; only numbers
100
.size                   dd 0
101
.pos                    dd 0
102
.offset                 dd 0
103
.cl_curs_x              dd 0
104
.cl_curs_y              dd 0
105
.shift                  dd 0
106
.shift_old              dd 0
107
; ------------------------------------- ;
108
progressbar_progress    dd 0
109
progressbar_draw        dd 0
110
; ------------------------------------- ;
111
edit_box_draw           dd 0
112
edit_box_key            dd 0
113
edit_box_mouse          dd 0
114
edit_box_set_text       dd 0
115
; ------------------------------------- ;
116
status_string           dd sz_empty
117
; ------------------------------------- ;
118
box_lib                 dd 0
119
; ------------------------------------- ;
120
sz_box_lib              db "/sys/lib/box_lib.obj",0
121
; ------------------------------------- ;
122
sz_progressbar_draw     db 'progressbar_draw', 0
123
sz_progressbar_progress db 'progressbar_progress', 0
124
; ------------------------------------- ;
125
sz_edit_box             db "edit_box",0
126
sz_edit_box_key         db "edit_box_key",0
127
sz_edit_box_mouse       db "edit_box_mouse",0
128
sz_edit_box_set_text    db "edit_box_set_text",0
129
; ------------------------------------- ;
130
sz_path                 db "Path:",0
131
sz_count                db "Count:",0
132
sz_start                db "Start",0
133
sz_caption              db "Generate files",0
134
; ------------------------------------- ;
135
sz_empty                db "",0
136
sz_doing                db "doing",0
137
sz_done                 db "done ",0
138
sz_error                db "error",0
139
; ------------------------------------- ;
140
digits                  db "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
141
; ------------------------------------- ;
142
START:
143
; LoadLibrary:
144
        mov    eax, 68
145
        mov    ebx, 19
146
        mov    ecx, sz_box_lib
147
        int    64
148
        mov    [box_lib], eax
149
 
150
        push   dword[box_lib]
151
        push   sz_edit_box
152
        call   GetProcAddress
153
        mov    [edit_box_draw], eax
154
 
155
        push   dword[box_lib]
156
        push   sz_edit_box_key
157
        call   GetProcAddress
158
        mov    [edit_box_key], eax
159
 
160
        push   dword[box_lib]
161
        push   sz_edit_box_mouse
162
        call   GetProcAddress
163
        mov    [edit_box_mouse], eax
164
 
165
        push   dword[box_lib]
166
        push   sz_edit_box_set_text
167
        call   GetProcAddress
168
        mov    [edit_box_set_text], eax
169
 
170
        push   dword[box_lib]
171
        push   sz_progressbar_draw
172
        call   GetProcAddress
173
        mov    [progressbar_draw], eax
174
 
175
        push   dword[box_lib]
176
        push   sz_progressbar_progress
177
        call   GetProcAddress
178
        mov    [progressbar_progress], eax
179
; ------------------------------------- ;
180
; SetEventMask
181
        mov    eax, 40
182
        mov    ebx, EM_REDRAW | EM_KEY | EM_BUTTON | EM_MOUSE
183
        int    64
184
; ------------------------------------- ;
185
align 4
186
WaitEvent:
187
        mov    eax, 10
188
        int    64
189
        call   [eax * 4 + Events]
190
        jmp    WaitEvent
191
; ------------------------------------- ;
192
%macro CreateNextFile 0
193
; Base36(count)
194
        mov    eax, [count]
195
        mov    ecx, 36        ; because our base is 36
196
        mov    esi, file_name
197
        mov    edi, esi
198
        add    esi, 7         ; base36(0xFFFFFFFF) = 1Z141Z3 : 7 simbols
199
        mov    [esi], byte 0
200
%%next:
201
        xor    edx, edx
202
        div    ecx
203
        dec    esi
204
        mov    dl, [edx + digits]
205
        mov    [esi], dl
206
        test   eax, eax
207
        jnz    %%next
208
        mov    eax, esi
209
        sub    eax, edi
210
        mov    ecx, 7 + 1
211
        sub    ecx, eax
212
        rep    movsb
213
; ------------------------------------- ;
214
        push   dword file_name
215
        dec    esp
216
        mov    [esp], byte 0
217
        push   dword 0
218
        push   dword 0
219
        push   dword 0
220
        push   dword 0
221
        push   dword 2  ; SubFunction #2 Create/Rewrite file
222
        mov    ebx, esp
223
        mov    eax, 70  ; Function #70
224
        int    64
225
        add    esp, 25  ; restore stack
226
%endmacro
227
; ------------------------------------- ;
228
align 4
229
DoAction:
230
; convert text in edit2 to number
231
        mov    edx, [edit2.text]
232
        xor    eax, eax
233
        xor    ecx, ecx
234
.convert:
235
        mov    al, [edx]
236
        test   al, al
237
        jz     .converted
238
        lea    ecx, [ecx + ecx * 4]
239
        lea    ecx, [eax + ecx * 2 - 48]
240
        inc    edx
241
        jmp    .convert
242
.converted:
243
        mov    [count], ecx
244
; ------------------------------------- ;
245
        mov    [pb.max], ecx
246
        mov    [pb.value], dword 0
247
; draw progressbar
248
        push   pb
249
        call   [progressbar_draw]
250
; ------------------------------------- ;
251
        cmp    [count], dword 0
252
        jz     .done
253
; SetCurrentDirectory
254
        mov    eax, 30
255
        mov    ebx, 1
256
        mov    ecx, [edit1.text]
257
        int    64
258
;
259
        mov    [status_string], dword sz_doing
260
        call   DrawStatus
261
.do:
262
        CreateNextFile
263
        test   eax, eax
264
        jnz    .error
265
; increase progress
266
        push   pb
267
        call   [progressbar_progress]
268
; CheckEvent
269
        mov    eax, 11
270
        int    64
271
        call   [eax * 4 + Events]
272
        dec    dword [count]
273
        jnz   .do
274
.done:
275
        mov    [status_string], dword sz_done
276
        call   DrawStatus
277
								ret
278
.error:
279
        mov    [status_string], dword sz_error
280
        call   DrawStatus
281
								ret
282
; ------------------------------------- ;
283
DrawStatus:
284
        mov    eax, 4
7637 leency 285
        mov    ecx, 0xD0000000
286
        mov    ebx, (297 << 16) | 38
6573 leency 287
        mov    edx, [status_string]
288
        mov    edi, 0x00FFFFFF
289
        int    64
290
        ret
291
; ------------------------------------- ;
292
align 4
293
On_Idle:
294
        ret
295
; ------------------------------------- ;
296
align 4
297
On_Redraw:
298
; RedrawStart
299
        mov    eax, 12
300
        mov    ebx, 1
301
        int    64
302
; DrawWindow
303
        xor    eax, eax
7637 leency 304
        mov    ebx, (50 << 16) | 360
305
        mov    ecx, (50 << 16) | 88
6573 leency 306
        mov    edx, 0x34FFFFFF
307
        mov    edi, sz_caption
308
        xor    esi, esi
309
        int    64
310
; draw progressbar
311
        push   pb
312
        call   [progressbar_draw]
313
; draw edit1
314
        push   edit1
315
        call   [edit_box_draw]
316
; draw edit2
317
        push   edit2
318
        call   [edit_box_draw]
319
; DrawButton
320
        mov    eax, 8
321
        mov    ecx, (8   << 16) | 26
322
        mov    ebx, (288 << 16) | 53
323
        mov    edx, BUTTON_START
324
        mov    esi, 0x00DDDDDD
325
        int    64
326
; DrawTexts
327
        mov    eax, 4
7637 leency 328
        mov    ecx, 0x90000000
6573 leency 329
;   Path:
330
        mov    ebx, (8   << 16) | 11
331
        mov    edx, sz_path
332
        int    64
333
;   Count:
7637 leency 334
        mov    ebx, (168 << 16) | 11
6573 leency 335
        mov    edx, sz_count
336
        int    64
337
;   Start:
7637 leency 338
        mov    ebx, (297 << 16) | 15
6573 leency 339
        mov    edx, sz_start
340
        int    64
341
; draw status
7637 leency 342
        call   DrawStatus
6573 leency 343
; RedrawFinish
344
        mov    eax, 12
345
        mov    ebx, 2
346
        int    64
347
        ret
348
; ------------------------------------- ;
349
align 4
350
On_Key:
351
; GetKeyCode
352
        mov    eax, 2
353
        int    64
354
; notify edit1 about key event
355
        push   edit1
356
        call   [edit_box_key]
357
; notify edit2 about key event
358
        push   edit2
359
        call   [edit_box_key]
360
        ret
361
; ------------------------------------- ;
362
align 4
363
On_Button:
364
; GetButtonNumber
365
        mov    eax, 17
366
        int    64
367
        movzx  eax, ah
368
        call   [eax * 4 + ButtonEvents]
369
        ret
370
; ------------------------------------- ;
371
align 4
372
On_ButtonClose:
373
; Terminate
374
        or     eax, -1
375
        int    64
376
        ; ret is not needed here because we are not back after terminate
377
; ------------------------------------- ;
378
align 4
379
On_ButtonStart:
380
        mov    [ButtonEvents.2], dword On_Idle        ; disable ButtonStart | because
381
        or     [edit1.flags], dword ED_DISABLED       ; disable edit1       |   we will
382
        or     [edit2.flags], dword ED_DISABLED       ; disable edit2       |     in Action
383
; redraw edit1 after change flag
384
        push   edit1
385
        call   [edit_box_draw]
386
; redraw edit2 after change flag
387
        push   edit2
388
        call   [edit_box_draw]
389
        call   DoAction
390
        mov    [ButtonEvents.2], dword On_ButtonStart ; enable ButtonStart
391
        and    [edit1.flags], dword ~ED_DISABLED      ; enable edit1
392
        and    [edit2.flags], dword ~ED_DISABLED      ; enable edit2
393
; redraw edit1 after change flag
394
        push   edit1
395
        call   [edit_box_draw]
396
; redraw edit2 after change flag
397
        push   edit2
398
        call   [edit_box_draw]
399
        ret
400
; ------------------------------------- ;
401
align 4
402
On_Mouse:
403
; notify edit1 about mouse event
404
        push   edit1
405
        call   [edit_box_mouse]
406
; notify edit2 about mouse event
407
        push   edit2
408
        call   [edit_box_mouse]
409
        ret
410
; ------------------------------------- ;
411
align 4
412
GetProcAddress:
413
        mov    edx, [esp + 8]
414
        xor    eax, eax
415
        test   edx, edx
416
        jz     .end
417
.next:
418
        xor    eax, eax
419
        cmp    [edx], dword 0
420
        jz     .end
421
        mov    esi, [edx]
422
        mov    edi, [esp + 4]
423
.next_:
424
        lodsb
425
        scasb
426
        jne    .fail
427
        test   al, al
428
        jnz    .next_
429
        jmp    .ok
430
.fail:
431
        add    edx, 8
432
        jmp    .next
433
.ok:
434
        mov    eax, [edx + 4]
435
.end:
436
        ret    8
437
; ------------------------------------- ;
438
align 4
439
END: