Subversion Repositories Kolibri OS

Rev

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

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