Subversion Repositories Kolibri OS

Rev

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

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