Subversion Repositories Kolibri OS

Rev

Rev 7433 | Rev 7505 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1524 dunkaist 1
;   RTF READER FOR KOLIBRI >= 0.7.7.0
31 halyavin 2
;   Written in pure assembler by Ivushkin Andrey aka Willow
1515 dunkaist 3
;   Menu_bar and scroll_bar from box_lib provided by dunkaist
31 halyavin 4
;---------------------------------------------------------------------
5
M64 equ 64*1024
6
N_A equ 0x412f4e
7
RTFSIZE equ M64
8
RTFSTACKSIZE equ M64
9
BGIFONTSIZE equ 120*1024
10
ESPSIZE equ M64
1515 dunkaist 11
LMARGIN equ 15
31 halyavin 12
CHARW equ 6
13
CHARH equ 11
14
WINW  equ 600
15
WINH  equ 450
2813 leency 16
WIN_COLOR equ 0x73f0f0f0
31 halyavin 17
DEFCOLOR equ 0x303030
18
RENDER equ FREE
19
 
529 spraid 20
BGIFONT_PATH equ '/sys/fonts/'
31 halyavin 21
FONT_NAME equ 'LITT'
1515 dunkaist 22
TOP = 45
31 halyavin 23
MODE equ RTF
24
INVALHEX equ 0
25
RTF_COLORLESS equ 1
26
RTF_ALIGNLESS equ 2
27
RTF_NO1STLINE equ 4
28
RTF_OPENING   equ 8
29
RTF_HELP      equ 16
30
RTF_VALID     equ 32
31
RTF_BLIND     equ 64
32
RTF_TOEOF     equ 128
33
RTF_BOTTOM    equ 256
34
STEPBYSTEP equ 10
35
DEBUG_BLOCK equ 10
36
SHOWALIGN equ 10
37
GUTTER equ 10
38
BENCH  equ 0;1
39
syms equ 12
40
 
1515 dunkaist 41
;-------------------------------
42
 
2813 leency 43
SCROLL_WIDTH_SIZE       equ     15
1515 dunkaist 44
AR_OFFSET               equ     10
45
 
46
;-------------------------------
47
 
134 diamond 48
  use32              ; включить 32-битный режим ассемблера
49
  org    0x0         ; адресация с нуля
31 halyavin 50
 
134 diamond 51
  db     'MENUET01'  ; 8-байтный идентификатор MenuetOS
52
  dd     0x01        ; версия заголовка (всегда 1)
53
  dd     START       ; адрес первой команды
54
  dd     I_END0      ; размер программы
55
  dd     esp_end     ; количество памяти
56
  dd     sys_mem     ; адрес вершины стэка
7433 leency 57
  dd     fname_buf   ; адрес буфера для параметров
58
  dd     cur_dir_path ; путь к программе
31 halyavin 59
 
7433 leency 60
include '../../../config.inc' ;for nightbuild
1515 dunkaist 61
include '../../../macros.inc' ; макросы облегчают жизнь ассемблерщиков!
62
include '../../../develop/libraries/box_lib/trunk/box_lib.mac'
63
include '../../../develop/libraries/box_lib/load_lib.mac'
1418 mario79 64
 
1512 mario79 65
@use_library
66
 
7433 leency 67
; include '../../../debug.inc'
1418 mario79 68
 
7433 leency 69
TOP=TOP+4
70
include 'bgifont.inc'
31 halyavin 71
include 'rtf_lite.inc'
72
;---------------------------------------------------------------------
73
;---  НАЧАЛО ПРОГРАММЫ  ----------------------------------------------
74
;---------------------------------------------------------------------
75
START:
1418 mario79 76
        mcall 68, 11
3944 mario79 77
        mcall 40, 0x80000027
1418 mario79 78
 
1512 mario79 79
load_libraries l_libs_start,end_l_libs
80
 
1515 dunkaist 81
;OpenDialog     initialisation
82
        push    dword OpenDialog_data
83
        call    [OpenDialog_Init]
1512 mario79 84
 
31 halyavin 85
    mov  [pitch],2
86
    mov  edx,FONT_NAME
87
    mov  edi,save_limit
88
    BGIfont_Prepare
89
 start2:
90
    cmp  byte[fname_buf],0
134 diamond 91
    je   load_file;top_red
31 halyavin 92
    jmp  noactivate
93
 prep_load:
1524 dunkaist 94
    mov  [is_scroll_bar_needed],    0
31 halyavin 95
;    mcall 18,3,dword[prcinfo+30]
96
 noactivate:
97
;    and  ebp,not RTF_OPENING
98
;    and  ebp,not RTF_HELP
99
 
100
;    and  [mode],not RTF_OPENING
101
    and  [mode],not (RTF_HELP+RTF_OPENING)
102
    mov  ecx,16
103
    mov  edi,fileinfo.name
104
    mov  esi,fname_buf
105
    rep  movsd
106
 load_file:
139 diamond 107
        mov     eax, 70
108
        and     [fileattr+32], 0
109
        mov     ebx, attrinfo
485 heavyiron 110
        mcall
139 diamond 111
        mov     ebx, [fileattr+32]
112
        test    eax, eax
113
        jz      .sizok
114
        mov     dword [fileinfo.name], N_A
115
.sizok:
31 halyavin 116
    and  [wSave],0
1515 dunkaist 117
;    mov  [HClick],-100
31 halyavin 118
    mov  eax,ebx
119
    and  eax,RTFSIZE-1
120
    add  eax,I_END
121
    mov  [tail],eax
122
    shr  ebx,16
123
;    dpd ebx
124
    mov  [max_block],ebx
125
    xor  eax,eax
126
    mov  ecx,256
127
    mov  edi,fileinfo.name
128
    repne scasb
129
    sub  edi,fileinfo.name+1
130
    mov  [fname_size],edi
131
top_red:
132
    mov  [top],TOP
1515 dunkaist 133
    mov  [scroll_bar_data_vertical.position],0
134 diamond 134
red:                    ; перерисовать окно
135
    call draw_window    ; вызываем процедуру отрисовки окна
31 halyavin 136
 
137
;---------------------------------------------------------------------
138
;---  ЦИКЛ ОБРАБОТКИ СОБЫТИЙ  ----------------------------------------
139
;---------------------------------------------------------------------
140
 
141
still:
134 diamond 142
    mcall 10            ; функция 10 - ждать события
31 halyavin 143
 
134 diamond 144
    cmp  eax,1          ; перерисовать окно ?
145
    je   red            ; если да - на метку red
146
    cmp  eax,3          ; нажата кнопка ?
147
    je   button         ; если да - на button
1515 dunkaist 148
    cmp  eax,6
149
    je   mouse
31 halyavin 150
 
151
;---------------------------------------------------------------------
152
 
153
 
2194 leency 154
key:                  ; нажата клавиша на клавиатуре
155
    mcall 2           ; функция 2 - считать код символа (в ah)
156
	;Leency[
157
	cmp eax,1
158
	jne .getkeyi
159
	mov ah,dh
160
	jmp .next
161
 
162
.getkeyi:
163
	mov dh,ah
164
	jmp key
165
 
7434 leency 166
.next:
167
    cmp  ah,'h'         ; H - help
31 halyavin 168
    jne  .nohelp
169
  .help:
1524 dunkaist 170
    mov  [is_scroll_bar_needed],    0
31 halyavin 171
    xor  [mode],RTF_HELP
172
    test [mode],RTF_HELP
134 diamond 173
    jz   load_file
1515 dunkaist 174
    mov  dword[HDoc],200                        ; it makes the help page not scroll
31 halyavin 175
    mov  ecx,help_end-help_file
176
    mov  [block_end],ecx
177
    add  [block_end],I_END
178
    mov  [tail],ecx
179
    add  [tail],I_END
180
    mov  esi,help_file
181
    mov  edi,I_END
182
    rep  movsb
183
;    or   [mode],RTF_HELP
184
    xor  eax,eax
185
    mov  [max_block],eax
186
    jmp  top_red
187
  .nohelp:
188
;    test [mode],RTF_HELP
189
;    jz   .nohelp2
190
;    and  [mode],not RTF_HELP
191
;    cmp  dword[fileinfo.name],N_A
192
;    je   still
193
;    jmp  prep_load
194
  .nohelp2:
7434 leency 195
    cmp  ah,'r'         ; R - redraw
134 diamond 196
    je   red
7434 leency 197
    cmp  ah,'c'          ; C - color
31 halyavin 198
    jne  .nocolor
199
  .color:
200
    xor  [mode],RTF_COLORLESS
201
    jmp  red
202
  .nocolor:
7434 leency 203
    cmp  ah,'a'          ; A - alignment
31 halyavin 204
    jne  .noalign
205
  .alignment:
206
    xor  [mode],RTF_ALIGNLESS
207
    jmp  red
208
  .noalign:
134 diamond 209
    cmp  ah,44          ; < - pitch dec
31 halyavin 210
    jne  .nopd
211
  .decp:
212
    dec  [pitch]
213
    jmp  red
214
  .nopd:
7434 leency 215
    cmp  ah,46          ; > - pitch inc
31 halyavin 216
    jne  .nopi
217
  .incp:
218
    inc  [pitch]
219
    jmp  red
220
  .nopi:
7434 leency 221
    cmp  ah,43 ;zoom+
222
    je  .zplus
223
    cmp  ah,61 ;zoom=
224
    jne  .noplus
225
  .zplus:
226
    fld  [FreeFontscale]
227
    fmul [Zoomscale]
228
  .zoom:
229
    fstp [FreeFontscale]
230
    jmp  red
231
  .noplus:
232
    cmp  ah,45 ;zoom-
233
    jne  .home
234
  .zminus:
235
    fld  [FreeFontscale]
236
    fdiv [Zoomscale]
237
    jmp  .zoom
238
  .home:
134 diamond 239
    cmp  ah,180         ; Home
240
    je   top_red
1515 dunkaist 241
 
1524 dunkaist 242
    cmp  dword[is_scroll_bar_needed], 0
1515 dunkaist 243
     je  still
244
 
31 halyavin 245
    mov  ebx,dword[prcinfo+46]
246
    sub  ebx,TOP+15
247
    cmp  ah,183 ;PgDn
248
    jne  .nopgdn
1515 dunkaist 249
;    sub  [top],bx
250
 
1524 dunkaist 251
    cmp  dword[is_scroll_bar_needed], 0
1515 dunkaist 252
     je  still
253
 
254
    mov  eax, [scroll_bar_data_vertical.position]
255
    add  eax, AR_OFFSET*7
256
    mov  ebx, [scroll_bar_data_vertical.max_area]
257
    sub  ebx, [scroll_bar_data_vertical.cur_area]
258
    cmp  eax, ebx
259
    mov  dword[scroll_bar_data_vertical.position], eax
260
    jl  @f
261
    mov  dword[scroll_bar_data_vertical.position], ebx
262
  @@:
263
    call Set_position
31 halyavin 264
    jmp  red
265
  .nopgdn:
266
    cmp  ah,177 ;arrDn
267
    jne  .noardn
1515 dunkaist 268
;    sub  [top],CHARH
269
 
1524 dunkaist 270
    cmp  dword[is_scroll_bar_needed], 0
1515 dunkaist 271
     je  still
272
 
273
    mov  eax, [scroll_bar_data_vertical.position]
274
    add  eax, AR_OFFSET
275
    mov  ebx, [scroll_bar_data_vertical.max_area]
276
    sub  ebx, [scroll_bar_data_vertical.cur_area]
277
    cmp  eax, ebx
278
    mov  dword[scroll_bar_data_vertical.position], eax
279
    jl  @f
280
    mov  dword[scroll_bar_data_vertical.position], ebx
281
  @@:
282
    call Set_position
283
 
31 halyavin 284
    jmp  red
285
  .noardn:
286
    mov  cx,[top]
287
    cmp  ah,184 ;PgUp
288
    jne  .nopgup
1515 dunkaist 289
;    add  [top],bx
290
;    cmp  [top],TOP
291
;    jl   red
292
;    mov  [top],TOP
293
;    cmp  cx,[top]
294
;    je   still
295
 
1524 dunkaist 296
    cmp  dword[is_scroll_bar_needed], 0
1515 dunkaist 297
     je  still
298
 
299
    cmp  dword[scroll_bar_data_vertical.position], AR_OFFSET*7
300
    sub  dword[scroll_bar_data_vertical.position], AR_OFFSET*7
301
    jg  @f
302
    mov  dword[scroll_bar_data_vertical.position], 0
303
  @@:
304
    call Set_position
31 halyavin 305
    jmp  red
306
  .nopgup:
307
    cmp  ah,178 ;arrUp
308
    jne  .noarup
1515 dunkaist 309
;    add  [top],CHARH
310
 
1524 dunkaist 311
    cmp  dword[is_scroll_bar_needed], 0
1515 dunkaist 312
     je  still
313
 
314
    cmp  dword[scroll_bar_data_vertical.position], AR_OFFSET
315
    sub  dword[scroll_bar_data_vertical.position], AR_OFFSET
316
    jg  @f
317
    mov  dword[scroll_bar_data_vertical.position], 0
318
  @@:
319
    call Set_position
320
 
321
;    cmp  [top],TOP
322
;    jl   red
323
;    mov  [top],TOP
324
;    cmp  cx,[top]
325
;    je   still
31 halyavin 326
    jmp  red
327
  .noarup:
7434 leency 328
 
31 halyavin 329
  .nominus:
1515 dunkaist 330
    cmp  ah,0xB5        ; end
331
    jne  .pre_file_open
332
  .end:
333
 
1524 dunkaist 334
    cmp  dword[is_scroll_bar_needed], 0
1515 dunkaist 335
     je  still
336
 
1524 dunkaist 337
    mov  eax, [scroll_bar_data_vertical.max_area]
338
    sub  eax, [scroll_bar_data_vertical.cur_area]
339
    mov  dword[scroll_bar_data_vertical.position], eax
1515 dunkaist 340
    call Set_position
341
    jmp  red
342
  .pre_file_open:
7434 leency 343
    cmp  ah,'l'         ; L - load
1512 mario79 344
    jne  still
31 halyavin 345
  .file_open:
1418 mario79 346
;---------------------------------------------------------------------
347
;OpenDialog_start:
1515 dunkaist 348
;       copy_path       open_dialog_name,path,library_path,0
349
 
350
        push    dword OpenDialog_data
351
        call    [OpenDialog_Start]
1418 mario79 352
 
1515 dunkaist 353
;       cmp     [OpenDialog_data.status],2 ; OpenDialog does not start
354
;       je      .sysxtree  ;    some kind of alternative, instead OpenDialog
355
        cmp     [OpenDialog_data.status],1
356
        je      prep_load
357
        jmp     still
31 halyavin 358
 
359
  button:
134 diamond 360
    mcall 17            ; 17 - получить идентификатор нажатой кнопки
31 halyavin 361
 
1515 dunkaist 362
    cmp   ah, 1         ; если нажата кнопка с номером 1,
363
    je    .exit
364
    jmp still
365
 
31 halyavin 366
  .exit:
134 diamond 367
    mcall -1            ; иначе конец программы
1515 dunkaist 368
 
369
 
31 halyavin 370
;---------------------------------------------------------------------
1515 dunkaist 371
;---  MOUSE EVENT PROCESSING  ----------------------------------------
372
;---------------------------------------------------------------------
373
mouse:
374
        mcall   37,7
375
        test    eax,    eax
376
        je      .menu_bar_1;.mouse
377
        jmp     still
378
 
379
 
380
.menu_bar_1:
381
        call    .set_mouse_flag
382
@@:
383
        push    dword menu_data_1       ;mouse event for Menu 1
384
        call    [menu_bar_mouse]
385
        cmp     [menu_data_1.click],dword 1
386
        jne     .menu_bar_2
387
        cmp     [menu_data_1.cursor_out],dword 0
388
        jne     .analyse_out_menu_1
389
        jmp     .menu_bar_1
390
.menu_bar_2:
391
        push    dword menu_data_2
392
        call    [menu_bar_mouse]
393
        cmp     [menu_data_2.click],dword 1
394
        jne     .menu_bar_3
395
        cmp     [menu_data_2.cursor_out],dword 0
396
        jne     .analyse_out_menu_2
397
        jmp     .menu_bar_1
398
.menu_bar_3:
399
        push    dword menu_data_3
400
        call    [menu_bar_mouse]
401
        cmp     [menu_data_3.click],dword 1
402
        jne     .scroll_bar
403
        cmp     [menu_data_3.cursor_out],dword 0
404
        jne     .analyse_out_menu_3
405
        jmp     .menu_bar_1
406
 
407
.set_mouse_flag:
408
        xor     eax,eax
409
        inc     eax
410
        mov     [menu_data_1.get_mouse_flag],eax
411
        mov     [menu_data_2.get_mouse_flag],eax
412
        mov     [menu_data_3.get_mouse_flag],eax
413
        ret
414
 
415
.analyse_out_menu_1:
416
        cmp     [menu_data_1.cursor_out],dword 1
417
        je      key.file_open
418
        cmp     [menu_data_1.cursor_out],dword 2
419
        je      button.exit
420
        jmp     red
421
 
422
.analyse_out_menu_2:
423
        cmp     [menu_data_2.cursor_out],dword 1
424
        je      key.zplus
425
        cmp     [menu_data_2.cursor_out],dword 2
426
        je      key.zminus
427
        cmp     [menu_data_2.cursor_out],dword 3
428
        je      key.incp
429
        cmp     [menu_data_2.cursor_out],dword 4
430
        je      key.decp
431
        cmp     [menu_data_2.cursor_out],dword 5
432
        je      key.alignment
433
        cmp     [menu_data_2.cursor_out],dword 6
434
        je      key.color
435
        jmp     red
436
 
437
.analyse_out_menu_3:
438
        cmp     [menu_data_3.cursor_out],dword 1
439
        je      key.help
440
        jmp     red
441
 
442
.scroll_bar:
1524 dunkaist 443
        cmp     dword[is_scroll_bar_needed], 0
1515 dunkaist 444
        je      still
445
.vertical:
446
        mov     eax,[scroll_bar_data_vertical.max_area]
447
        cmp     eax,[scroll_bar_data_vertical.cur_area]
448
        jbe     still
449
; mouse event for Vertical ScrollBar
450
 
451
        push    dword scroll_bar_data_vertical
452
        call    [scrollbar_ver_mouse]
453
 
454
        call    Set_position
455
 
456
        mov     eax,scroll_bar_data_vertical.redraw
457
        xor     ebx,ebx
458
        cmp     [eax],ebx
459
        je      @f
460
        mov     [eax],ebx
461
        jmp     red
462
@@:
463
        cmp     [scroll_bar_data_vertical.delta2],0
464
        jne     still
465
.other:
466
        jmp     still
467
;---------------------------------------------------------------------
31 halyavin 468
;---  ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА  ----------------------------------
469
;---------------------------------------------------------------------
470
 
471
draw_window:
472
 
1524 dunkaist 473
    mcall 9, procinfo2, -1
2074 dunkaist 474
    test [procinfo2.wnd_state], 0x04
475
    jz   @f
476
    mcall 0, <10,WINW>, <100,WINH>, WIN_COLOR,0x80000000, window_title
477
    ret
478
  @@:
1524 dunkaist 479
    mov  edx, -1
480
    mov  esi, -1
481
 
482
    mov  eax, [procinfo2.box.width]
1525 dunkaist 483
    cmp  eax, [window_width]
1524 dunkaist 484
     je  @f
485
    mov  [is_scroll_bar_needed],    0
1525 dunkaist 486
    cmp  eax, 140
487
     jnl @f
488
    mov  eax, 140
1524 dunkaist 489
  @@:
1525 dunkaist 490
    mov  edx, eax
491
    mov  [window_width],    eax
1524 dunkaist 492
 
493
    mov  eax, [procinfo2.box.height]
1525 dunkaist 494
    cmp  eax, [window_height]
1524 dunkaist 495
     je  @f
496
    mov  [is_scroll_bar_needed],    0
1525 dunkaist 497
    cmp  eax, 80
498
     jnl @f
499
    mov  eax, 80
1524 dunkaist 500
  @@:
1525 dunkaist 501
    mov  esi, eax
502
    mov  [window_height],   eax
1524 dunkaist 503
 
504
    mcall 67, -1, -1
505
 
1515 dunkaist 506
    mcall 12, 1
507
;    mcall 0, <10,WINW>, <100,WINH>, WIN_COLOR,0x805080D0, 0x005080D0
508
;    mcall 4, <8,8>, 0x10DDEEFF, title, titlesize-title
509
    mcall 0, <10,WINW>, <100,WINH>, WIN_COLOR,0x80000000, window_title
2813 leency 510
 
1524 dunkaist 511
;---------------------------------------------
2813 leency 512
    mcall 9, procinfo2, -1
513
 
514
	mcall 48,4
515
	mov [skin_height], eax
516
 
517
	mov  ebx,0*65536-9
518
    add  ebx, [procinfo2.box.width]
519
 
520
	cmp  [is_scroll_bar_needed], 0
521
	je  @f
522
	  sub ebx, SCROLL_WIDTH_SIZE
523
	  dec ebx
524
	@@:
525
 
526
	mov  ecx, 19*65536-23
527
    add  ecx, [procinfo2.box.height]
528
	sub  ecx, [skin_height]
529
 
530
	mov  eax, 13
531
	mov  edx, 0xf0f0f0
532
	int 0x40
533
;---------------------------------------------
1524 dunkaist 534
    cmp  [is_scroll_bar_needed],    0
535
     je  @f
536
    call Set_scroll_position
537
        xor     eax,eax
538
        inc     eax
539
        mov     [scroll_bar_data_vertical.all_redraw],eax
540
; draw for Vertical ScrollBar
541
        push    dword scroll_bar_data_vertical
542
        call    [scrollbar_ver_draw]
543
; reset all_redraw flag
544
        xor     eax,eax
545
        mov     [scroll_bar_data_vertical.all_redraw],eax
546
  @@:
547
;---------------------------------------------
2813 leency 548
	;po-moumu eto govno mamonta
549
 
550
    ;mcall 47,0x30000,isymImplemented,<114,8>, 0x10DDEEFF
551
    ;add  edx,36 shl 16
552
    ;mcall ,,isymMax
31 halyavin 553
    add  edx,40 shl 16
554
    mov  esi,0x104e00e7;0x10f27840
555
    cmp  dword[fileinfo.name],N_A
556
    jne  .noNA
557
    mov  esi,0x10ff0000
558
  .noNA:
1524 dunkaist 559
;    mcall 4,edx,esi,fileinfo.name,[fname_size]
2813 leency 560
    mcall 9,prcinfo,-1
31 halyavin 561
    and  [mode],not RTF_TOEOF
562
    mov  ebx,[edi+42]
563
    cmp  ebx,[wSave]
134 diamond 564
    je   .nochg
31 halyavin 565
  .chg:
566
    mov  [wSave],ebx
134 diamond 567
    or   [mode],RTF_TOEOF
31 halyavin 568
    and  [HDoc],0
569
    and  [line_count],0
1515 dunkaist 570
;    mov  [HClick],-100
31 halyavin 571
  .nochg:
1195 diamond 572
 
1515 dunkaist 573
;---------------------------------------------
1524 dunkaist 574
    call  Set_scroll_position
1195 diamond 575
 
2813 leency 576
;---------------------------------------------
1515 dunkaist 577
    mov ebx, dword[prcinfo+0x3E]
578
    mcall     38, , 65536*18+18, 0x8b8b89
579
    inc ebx
580
    mcall     13, , 65536*0+18, 0xe9e9e2
581
;---------------------------------------------
582
; draw for Menu 1
583
        push    dword menu_data_1
584
        call    [menu_bar_draw]
585
; draw for Menu 2
586
        push    dword menu_data_2
587
        call    [menu_bar_draw]
588
; draw for Menu 3
589
        push    dword menu_data_3
590
        call    [menu_bar_draw]
591
;---------------------------------------------
1195 diamond 592
 
2813 leency 593
    sub  dword[prcinfo+42],2*LMARGIN+SCROLL_WIDTH_SIZE
1515 dunkaist 594
    sub  dword[prcinfo+46],CHARH+25
595
 
31 halyavin 596
 if GUTTER eq 1
597
    mov  ebx,LMARGIN shl 16+20
598
    mov  ecx,20
599
    mov  eax,4
600
    mov  edx,arrow
601
    mov  esi,1
602
  .loop1:
603
    push ecx
604
    mcall ,,0xff0000
605
    pop  ecx
606
    add  ebx,50 shl 16
607
    loop .loop1
608
 end if
609
 if MODE eq RTF
610
    test [mode],RTF_OPENING
611
    jne  .ex
612
    and  [mode],not (RTF_BOTTOM);+RTF_TOEOF)
613
    mov  [colorptr],colortbl
614
    mov  eax,DEFCOLOR
615
    mov  edi,colortbl
616
    mov  ecx,16
617
    rep  stosd
618
    xor  eax,eax
619
    mov  [cGroup],eax
620
    mov  edi,Chp
621
    mov  ecx,SIZE_save
622
    rep  stosb
623
    mov  ax,[top]
624
    mov  word[Free+6],10
625
    mov  word[Free+4],ax
626
    mov  esi,I_END
627
    call RtfParse
1515 dunkaist 628
;    dpd  eax
629
;    dps  'Lines='
31 halyavin 630
    mov  eax,[line_count]
1515 dunkaist 631
;    dpd  eax
632
;    newline
31 halyavin 633
;    movzx  eax,word[Free+4]
634
;    dpd  eax
635
    mov  eax,dword[prcinfo+42]
636
    mov  edx,WIN_COLOR
637
    call draw_progress
638
if BENCH eq 1
639
    mcall 26,9
640
    sub  eax,[bench]
1515 dunkaist 641
;    dps  <13,10,'Bench='>
642
;    dpd  eax
31 halyavin 643
end if
644
 else
645
    mov  [char],0
646
    mov  ebx,10 shl 16+TOP
647
    mov  ecx,16
648
  .l0:
649
    push ecx
650
    mov  ecx,16
651
  .l1:
652
    push ecx
653
    mcall 4,,0x10000000,char,1
654
    pop  ecx
655
    inc  [char]
656
    add  ebx,(CHARW+3) shl 16
657
    loop .l1
658
    pop  ecx
659
    add  ebx,CHARH+2
660
    and  ebx,0x0000ffff
661
    add  ebx,10 shl 16
662
    loop .l0
663
 end if
664
 .ex:
1515 dunkaist 665
call Set_position
666
;---------------------------------------------
1524 dunkaist 667
    cmp  dword[is_scroll_bar_needed], 0
1515 dunkaist 668
     je  @f
669
        xor     eax,eax
670
        inc     eax
671
        mov     [scroll_bar_data_vertical.all_redraw],eax
672
; draw for Vertical ScrollBar
673
        push    dword scroll_bar_data_vertical
674
        call    [scrollbar_ver_draw]
675
; reset all_redraw flag
676
        xor     eax,eax
677
        mov     [scroll_bar_data_vertical.all_redraw],eax
678
  @@:
679
;---------------------------------------------
680
    mcall 12, 2
681
    ret
31 halyavin 682
 
1515 dunkaist 683
;---------------------------------------------------------------------
684
Set_position:
685
    mov  eax, dword[prcinfo+46]
686
    cmp  eax, [HDoc]
1524 dunkaist 687
    mov  dword[is_scroll_bar_needed], 0
1515 dunkaist 688
     jnl .quit
1524 dunkaist 689
    mov  dword[is_scroll_bar_needed], 1
1515 dunkaist 690
 
691
    mov  eax, [scroll_bar_data_vertical.max_area]
692
    mul  dword[prcinfo+46]
693
    div  dword[HDoc]
694
    cmp  eax, [scroll_bar_data_vertical.max_area]
695
    mov  dword[scroll_bar_data_vertical.cur_area],eax
696
     jng @f
697
    mov  eax, [scroll_bar_data_vertical.max_area]
698
    mov  dword[scroll_bar_data_vertical.cur_area], eax
699
  @@:
700
    mov eax, [HDoc]
701
    cmp eax, dword[prcinfo+46]
702
    sub eax, dword[prcinfo+46]
1524 dunkaist 703
    add eax, 20                    ; height of clear area under text when you are at the end of document
1515 dunkaist 704
     jg @f
705
    mov eax, 0
706
  @@:
707
    mul [scroll_bar_data_vertical.position]
708
    mov ebx, [scroll_bar_data_vertical.max_area]
709
    sub ebx, [scroll_bar_data_vertical.cur_area]
710
    div ebx
711
 
712
    mov dword[top], TOP
713
    sub dword[top], eax
714
 
715
  .quit:
716
    ret
717
;---------------------------------------------------------------------
1524 dunkaist 718
Set_scroll_position:
719
    mcall 9, procinfo2, -1
720
    mov eax, dword[procinfo2+0x3E]
2813 leency 721
    sub eax, SCROLL_WIDTH_SIZE
1524 dunkaist 722
    mov word[scroll_bar_data_vertical.start_x], ax
723
 
724
    mov eax, dword[procinfo2+0x42]
725
    sub eax, 17
726
    mov word[scroll_bar_data_vertical.size_y], ax
727
 
728
    ret
729
;---------------------------------------------------------------------
730
 
31 halyavin 731
if GUTTER eq 1
732
   arrow db 0x19
733
end if
734
;---------------------------------------------------------------------
735
;---  ДАННЫЕ ПРОГРАММЫ  ----------------------------------------------
736
;---------------------------------------------------------------------
737
 
738
; интерфейс программы многоязычный
739
;  Вы можете задать язык в MACROS.INC (lang fix язык)
485 heavyiron 740
 
7434 leency 741
window_title:           db      'RtfRead v1.5',0
1524 dunkaist 742
is_scroll_bar_needed    dd      0x0
1525 dunkaist 743
window_width            dd      0x0
744
window_height           dd      0x0
2813 leency 745
skin_height             dd      0x0
1418 mario79 746
;---------------------------------------------------------------------
1512 mario79 747
l_libs_start:
748
 
749
library01  l_libs system_dir_ProcLib+9, cur_dir_path, library_path, system_dir_ProcLib, \
750
err_message_found_lib2, head_f_l, ProcLib_import, err_message_import2, head_f_i
751
 
1524 dunkaist 752
library02  l_libs system_dir_Boxlib+9, cur_dir_path, library_path, system_dir_Boxlib, \
1515 dunkaist 753
err_message_found_lib1, head_f_l, Box_lib_import, err_message_import1, head_f_i
754
 
1512 mario79 755
end_l_libs:
756
;---------------------------------------------------------------------
1515 dunkaist 757
system_dir_ProcLib      db '/sys/lib/proc_lib.obj',0
758
system_dir_Boxlib       db '/sys/lib/box_lib.obj',0
1512 mario79 759
 
760
head_f_i:
1515 dunkaist 761
head_f_l                db 'error',0
1512 mario79 762
 
1515 dunkaist 763
err_message_found_lib1  db 'box_lib.obj - Not found!',0
764
err_message_found_lib2  db 'proc_lib.obj - Not found!',0
1512 mario79 765
 
1515 dunkaist 766
err_message_import1     db 'box_lib.obj - Wrong import!',0
767
err_message_import2     db 'proc_lib.obj - Wrong import!',0
1512 mario79 768
 
769
;---------------------------------------------------------------------
770
align 4
771
ProcLib_import:
1515 dunkaist 772
OpenDialog_Init         dd aOpenDialog_Init
773
OpenDialog_Start        dd aOpenDialog_Start
774
;OpenDialog__Version    dd aOpenDialog_Version
1512 mario79 775
        dd      0
776
        dd      0
1515 dunkaist 777
aOpenDialog_Init        db 'OpenDialog_init',0
778
aOpenDialog_Start       db 'OpenDialog_start',0
779
;aOpenDialog_Version    db 'Version_OpenDialog',0
1512 mario79 780
;---------------------------------------------------------------------
1418 mario79 781
OpenDialog_data:
1515 dunkaist 782
.type                   dd 0
783
.procinfo               dd procinfo ;+4
784
.com_area_name          dd communication_area_name ;+8
785
.com_area               dd 0 ;+12
786
.opendir_pach           dd temp_dir_pach ;+16
787
.dir_default_pach       dd communication_area_default_pach ;+20
788
.start_path             dd open_dialog_path ;+24
789
.draw_window            dd draw_window ;+28
790
.status                 dd 0 ;+32
791
.openfile_pach          dd fname_buf ;+36
792
.filename_area          dd 0    ;+40
793
.filter_area            dd Filter
1582 mario79 794
.x:
795
.x_size			dw 420 ;+48 ; Window X size
796
.x_start		dw 10 ;+50 ; Window X position
797
.y:
798
.y_size			dw 320 ;+52 ; Window y size
799
.y_start		dw 10 ;+54 ; Window Y position
31 halyavin 800
 
1418 mario79 801
communication_area_name:
1515 dunkaist 802
        db 'FFFFFFFF_open_dialog',0
1418 mario79 803
open_dialog_path:
1702 Lrz 804
if __nightbuild eq yes
805
    db '/sys/MANAGERS/opendial',0
806
else
807
    db '/sys/File Managers/opendial',0
808
end if
1418 mario79 809
communication_area_default_pach:
1515 dunkaist 810
        db '/rd/1',0
1418 mario79 811
 
812
Filter:
1436 mario79 813
dd Filter.end - Filter
814
.1:
1418 mario79 815
db 'RTF',0
816
.end:
817
db 0
818
;---------------------------------------------------------------------
139 diamond 819
attrinfo:
820
        dd      5
821
        dd      0
822
        dd      0
823
        dd      0
824
        dd      fileattr
825
        db      0
826
        dd      fileinfo.name
827
 
31 halyavin 828
fileinfo:
829
  dd 0
830
.block:
831
  dd 0
139 diamond 832
  dd 0
31 halyavin 833
.size  dd 1
834
  dd I_END
835
.name:
1515 dunkaist 836
 
31 halyavin 837
;  db '/HD/1/RTF/texts/index_ru.RTF',0
838
 
839
   rb  256-($-.name)
840
;---------------------------------------------------------------------
1515 dunkaist 841
align   4
842
Box_lib_import:
843
 
844
menu_bar_draw           dd aMenu_bar_draw
845
menu_bar_mouse          dd aMenu_bar_mouse
846
 
847
scrollbar_ver_draw      dd aScrollbar_ver_draw
848
scrollbar_ver_mouse     dd aScrollbar_ver_mouse
849
 
850
        dd 0
851
        dd 0
852
 
853
aMenu_bar_draw          db 'menu_bar_draw',0
854
aMenu_bar_mouse         db 'menu_bar_mouse',0
855
;aVersion_menu_bar       db 'version_menu_bar',0
856
 
857
aScrollbar_ver_draw     db 'scrollbar_v_draw',0
858
aScrollbar_ver_mouse    db 'scrollbar_v_mouse',0
859
;---------------------------------------------------------------------
860
align   4
861
menu_data_1:
862
.type:          dd 0    ;+0
863
.x:
864
.size_x         dw 40   ;+4
865
.start_x        dw 2    ;+6
866
.y:
867
.size_y         dw 15   ;+8
868
.start_y        dw 2    ;+10
869
.text_pointer:  dd menu_text_area       ;0      ;+12
870
.pos_pointer:   dd menu_text_area.1     ;0      ;+16
871
.text_end       dd menu_text_area.end   ;0      ;+20
872
.mouse_pos      dd 0    ;+24
873
.mouse_keys     dd 0    ;+28
874
.x1:
875
.size_x1        dw 40   ;+32
876
.start_x1       dw 2    ;+34
877
.y1:
878
.size_y1        dw 100  ;+36
879
.start_y1       dw 18   ;+38
880
.bckg_col       dd 0xeeeeee     ;+40
881
.frnt_col       dd 0xff ;+44
882
.menu_col       dd 0xffffff     ;+48
883
.select         dd 0    ;+52
884
.out_select     dd 0    ;+56
885
.buf_adress     dd 0    ;+60
886
.procinfo       dd 0    ;+64
887
.click          dd 0    ;+68
888
.cursor         dd 0    ;+72
889
.cursor_old     dd 0    ;+76
890
.interval       dd 16   ;+80
891
.cursor_max     dd 0    ;+84
892
.extended_key   dd 0    ;+88
893
.menu_sel_col   dd 0x00cc00     ;+92
894
.bckg_text_col  dd 0    ;+96
895
.frnt_text_col  dd 0xffffff     ;+100
896
.mouse_keys_old dd 0    ;+104
897
.font_height    dd 8    ;+108
898
.cursor_out     dd 0    ;+112
899
.get_mouse_flag dd 0    ;+116
900
 
901
menu_text_area:
902
        db 'File',0
903
.1:
904
        db 'Open',0
905
        db 'Exit',0
906
.end:
907
        db 0
908
;---------------------------------------------------------------------
909
align   4
910
menu_data_2:
911
.type:          dd 0    ;+0
912
.x:
913
.size_x         dw 40   ;+4
914
.start_x        dw 43   ;+6
915
.y:
916
.size_y         dw 15   ;+8
917
.start_y        dw 2    ;+10
918
.text_pointer:  dd menu_text_area_2     ;0      ;+12
919
.pos_pointer:   dd menu_text_area_2.1   ;0      ;+16
920
.text_end       dd menu_text_area_2.end ;0      ;+20
921
.mouse_pos      dd 0    ;+24
922
.mouse_keys     dd 0    ;+28
923
.x1:
924
.size_x1        dw 50   ;+32
925
.start_x1       dw 43   ;+34
926
.y1:
927
.size_y1        dw 100  ;+36
928
.start_y1       dw 18   ;+38
929
.bckg_col       dd 0xeeeeee     ;+40
930
.frnt_col       dd 0xff ;+44
931
.menu_col       dd 0xffffff     ;+48
932
.select         dd 0    ;+52
933
.out_select     dd 0    ;+56
934
.buf_adress     dd 0    ;+60
935
.procinfo       dd 0    ;+64
936
.click          dd 0    ;+68
937
.cursor         dd 0    ;+72
938
.cursor_old     dd 0    ;+76
939
.interval       dd 16   ;+80
940
.cursor_max     dd 0    ;+84
941
.extended_key   dd 0    ;+88
942
.menu_sel_col   dd 0x00cc00     ;+92
943
.bckg_text_col  dd 0    ;       +96
944
.frnt_text_col  dd 0xffffff     ;+100
945
.mouse_keys_old dd 0    ;+104
946
.font_height    dd 8    ;+108
947
.cursor_out     dd 0    ;+112
948
.get_mouse_flag dd 0    ;+116
949
 
950
menu_text_area_2:
951
        db 'View',0
952
.1:
953
        db 'Zoom +',0
954
        db 'Zoom -',0
1524 dunkaist 955
        db ' > >',0
956
        db ' << ',0
1515 dunkaist 957
        db 'Align',0
958
        db 'Color',0
959
.end:
960
        db 0
961
;---------------------------------------------------------------------
962
align   4
963
menu_data_3:
964
.type:          dd 0    ;+0
965
.x:
966
.size_x         dw 40   ;+4
967
.start_x        dw 84   ;+6
968
.y:
969
.size_y         dw 15   ;+8
970
.start_y        dw 2    ;+10
971
.text_pointer:  dd menu_text_area_3     ;0      ;+12
972
.pos_pointer:   dd menu_text_area_3.1   ;0      ;+16
973
.text_end       dd menu_text_area_3.end ;0      ;+20
974
.mouse_pos      dd 0    ;+24
975
.mouse_keys     dd 0    ;+28
976
.x1:
977
.size_x1        dw 40   ;+32
978
.start_x1       dw 84   ;+34
979
.y1:
980
.size_y1        dw 100  ;+36
981
.start_y1       dw 18   ;+38
982
.bckg_col       dd 0xeeeeee     ;+40
983
.frnt_col       dd 0xff ;+44
984
.menu_col       dd 0xffffff     ;+48
985
.select         dd 0    ;+52
986
.out_select     dd 0    ;+56
987
.buf_adress     dd 0    ;+60
988
.procinfo       dd 0    ;+64
989
.click          dd 0    ;+68
990
.cursor         dd 0    ;+72
991
.cursor_old     dd 0    ;+76
992
.interval       dd 16   ;+80
993
.cursor_max     dd 0    ;+84
994
.extended_key   dd 0    ;+88
995
.menu_sel_col   dd 0x00cc00     ;+92
996
.bckg_text_col  dd 0    ;       +96
997
.frnt_text_col  dd 0xffffff     ;+100
998
.mouse_keys_old dd 0    ;+104
999
.font_height    dd 8    ;+108
1000
.cursor_out     dd 0    ;+112
1001
.get_mouse_flag dd 0    ;+116
1002
 
1003
menu_text_area_3:
1004
        db 'Help',0
1005
.1:
1006
        db 'Home',0
1007
.end:
1008
        db 0
1009
;---------------------------------------------------------------------
1010
align   4
1011
scroll_bar_data_vertical:
1012
.x:
2813 leency 1013
.size_x         dw SCROLL_WIDTH_SIZE;+0
1515 dunkaist 1014
.start_x        dw WINW-25  ;+2
1015
.y:
1016
.size_y         dw WINH-45  ;+4
1017
.start_y        dw 19   ;+6
2813 leency 1018
.btn_high       dd SCROLL_WIDTH_SIZE    ;+8
1019
.type           dd 0    ;+12
1515 dunkaist 1020
.max_area       dd 300       ;+16
1021
.cur_area       dd 50   ;+20
1022
.position       dd 0    ;+24
1023
.bckg_col       dd 0xAAAAAA     ;+28
1024
.frnt_col       dd 0xCCCCCC     ;+32
1025
.line_col       dd 0    ;+36
1026
.redraw         dd 0    ;+40
1027
.delta          dw 0    ;+44
1028
.delta2         dw 0    ;+46
1029
.run_x:
1030
.r_size_x       dw 0    ;+48
1031
.r_start_x      dw 0    ;+50
1032
.run_y:
1033
.r_size_y       dw 0    ;+52
1034
.r_start_y      dw 0    ;+54
1035
.m_pos          dd 0    ;+56
1036
.m_pos_2        dd 0    ;+60
1037
.m_keys         dd 0    ;+64
1038
.run_size       dd 0    ;+68
1039
.position2      dd 0    ;+72
1040
.work_size      dd 0    ;+76
1041
.all_redraw     dd 0    ;+80
1042
.ar_offset      dd AR_OFFSET   ;+84
2805 dunkaist 1043
 
1515 dunkaist 1044
;---------------------------------------------------------------------
2805 dunkaist 1045
;blind db ?
7433 leency 1046
 
2805 dunkaist 1047
  Zoomscale dd 1.15
1048
  FreeFontscale dd 0.04
7433 leency 1049
 
2805 dunkaist 1050
  Free BGIfree FONT_NAME,0,0,1.0,1.0,char,1,0x44000000,0
7433 leency 1051
 
1052
 
1524 dunkaist 1053
I_END0:
2805 dunkaist 1054
fname_buf:
1055
        rb      1024+16
1056
fileattr rd 40/4
1057
if BENCH eq 1
1058
  bench dd ?
1059
end if
1060
tail dd ?
1061
cGroup dd ?
1062
Chp:
1063
  CHP
1064
Pap:
1065
  PAP
1066
Sep:
1067
  SEP
1068
Dop:
1069
  DOP
1070
rds db ?
1071
ris db ?
1072
cbBin dd ?
1073
lParam dd ?
1074
fSkipDestIfUnk db ?
1075
mode dd ?
1076
curheight dw ?
1077
maxheight dw ?
1078
RetroBlock dd ?
1079
RetroSave:
1080
  SAVE
1081
prcinfo rb 1024
1082
RetroPtr dd ?
1083
colorptr dd ?
1084
colortbl rd 16
1085
ct_end:
1086
fname_size dd ?
1087
max_block dd ?
1088
cur_block dd ?
1089
HDoc dd ?
1090
;HClick dd ?
1091
top dw ?
1092
line_count dd ?
1093
par_count  dd ?
1094
char db ?
1095
pitch db ?
1096
wSave dd ?
1097
RetroXY dd ?
1098
RetroGroup dd ?
1099
 
1100
save_stack:
1101
rb RTFSTACKSIZE
1102
save_limit:
1103
rb BGIFONTSIZE
1104
 
1105
listptr dd ?
1106
szKeyword rb 31
1107
szParameter rb 21
1108
block_end dd ?
1109
 
7433 leency 1110
help_file:
1111
    file  'reader.rtf'
1112
help_end:
1113
 
1114
litt_file:
1115
	file 'litt.chr'
1116
litt_end:
1117
 
2805 dunkaist 1118
;---------------------------------------------------------------------
134 diamond 1119
I_END:                             ; метка конца программы
31 halyavin 1120
rb RTFSIZE
1121
esp1:
1122
rb ESPSIZE
3939 mario79 1123
procinfo process_information
1524 dunkaist 1124
procinfo2 process_information
1418 mario79 1125
;---------------------------------------------------------------------
1126
temp_dir_pach:
1127
        rb 4096
1512 mario79 1128
cur_dir_path:
1515 dunkaist 1129
        rb 4096
1512 mario79 1130
library_path:
1515 dunkaist 1131
        rb 4096
1418 mario79 1132
;---------------------------------------------------------------------
1524 dunkaist 1133
    rb ESPSIZE                      ;stack
134 diamond 1134
esp_end:
1524 dunkaist 1135
sys_mem: