Subversion Repositories Kolibri OS

Rev

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