Subversion Repositories Kolibri OS

Rev

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