Subversion Repositories Kolibri OS

Rev

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

  1. ;   RTF READER FOR MENUET v1.
  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 0x33f0f0f0;0x3f0f0f0
  17. DEFCOLOR equ 0x303030
  18. ;RENDER equ PIX
  19. ;RENDER equ BGI
  20. RENDER equ FREE
  21.  
  22. BGIFONT_PATH equ '/sys/fonts/'
  23. FONT_NAME equ 'LITT'
  24. TOP = 45
  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.  
  43. ;-------------------------------
  44.  
  45. scroll_width_size       equ     15
  46. AR_OFFSET               equ     10
  47.  
  48. ;-------------------------------
  49.  
  50.   use32              ; включить 32-битный режим ассемблера
  51.   org    0x0         ; адресация с нуля
  52.  
  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   ; адрес буфера для параметров (не используется)
  60.   dd     cur_dir_path         ; зарезервировано
  61.  
  62. include '../../../macros.inc' ; макросы облегчают жизнь ассемблерщиков!
  63. include '../../../develop/libraries/box_lib/trunk/box_lib.mac'
  64. include '../../../develop/libraries/box_lib/load_lib.mac'
  65.  
  66. ;include 'MACROS.INC'
  67. ;include 'load_lib.mac'
  68.  
  69. @use_library
  70.  
  71. include 'debug.inc'
  72.  
  73. if ~ RENDER eq PIX
  74.   TOP=TOP+4
  75.   include 'bgifont.inc'
  76. end if
  77. include 'rtf_lite.inc'
  78. ;include 'ascl.inc'
  79. ;---------------------------------------------------------------------
  80. ;---  НАЧАЛО ПРОГРАММЫ  ----------------------------------------------
  81. ;---------------------------------------------------------------------
  82. help_file:
  83.     file  'reader.rtf'
  84. help_end:
  85.  
  86. START:
  87.         mcall 68, 11
  88.         mcall 40, 0x27
  89.  
  90. load_libraries l_libs_start,end_l_libs
  91.  
  92. ;OpenDialog     initialisation
  93.         push    dword OpenDialog_data
  94.         call    [OpenDialog_Init]
  95.  
  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
  104.     je   load_file;top_red
  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:
  119.         mov     eax, 70
  120.         and     [fileattr+32], 0
  121.         mov     ebx, attrinfo
  122.         mcall
  123.         mov     ebx, [fileattr+32]
  124.         test    eax, eax
  125.         jz      .sizok
  126.         mov     dword [fileinfo.name], N_A
  127. .sizok:
  128.     and  [wSave],0
  129. ;    mov  [HClick],-100
  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
  145.     mov  [scroll_bar_data_vertical.position],0
  146. red:                    ; перерисовать окно
  147.     call draw_window    ; вызываем процедуру отрисовки окна
  148.  
  149. ;---------------------------------------------------------------------
  150. ;---  ЦИКЛ ОБРАБОТКИ СОБЫТИЙ  ----------------------------------------
  151. ;---------------------------------------------------------------------
  152.  
  153. still:
  154.     mcall 10            ; функция 10 - ждать события
  155.  
  156.     cmp  eax,1          ; перерисовать окно ?
  157.     je   red            ; если да - на метку red
  158.     cmp  eax,3          ; нажата кнопка ?
  159.     je   button         ; если да - на button
  160.     cmp  eax,6
  161.     je   mouse
  162.  
  163. ;---------------------------------------------------------------------
  164.  
  165.  
  166.   key:                  ; нажата клавиша на клавиатуре
  167.     mcall 2             ; функция 2 - считать код символа (в ah)
  168.     cmp  ah,104         ; HELP
  169.     jne  .nohelp
  170.   .help:
  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,114         ; R - redraw
  196.     je   red
  197.     cmp  ah,99          ; C - color
  198.     jne  .nocolor
  199.   .color:
  200.     xor  [mode],RTF_COLORLESS
  201.     jmp  red
  202.   .nocolor:
  203.     cmp  ah,97          ; 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,180         ; Home
  222.     je   top_red
  223.    
  224.     cmp  byte[is_scroll_bar_needed], 0
  225.      je  still
  226.    
  227.     mov  ebx,dword[prcinfo+46]
  228.     sub  ebx,TOP+15
  229.     cmp  ah,183 ;PgDn
  230.     jne  .nopgdn
  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
  246.     jmp  red
  247.   .nopgdn:
  248.     cmp  ah,177 ;arrDn
  249.     jne  .noardn
  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.  
  266.     jmp  red
  267.   .noardn:
  268.     mov  cx,[top]
  269.     cmp  ah,184 ;PgUp
  270.     jne  .nopgup
  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
  287.     jmp  red
  288.   .nopgup:
  289.     cmp  ah,178 ;arrUp
  290.     jne  .noarup
  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
  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
  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:
  339.     cmp  ah,108         ; L - load
  340.     jne  still
  341.   .file_open:
  342. ;---------------------------------------------------------------------
  343. ;OpenDialog_start:
  344. ;       copy_path       open_dialog_name,path,library_path,0
  345.        
  346.         push    dword OpenDialog_data
  347.         call    [OpenDialog_Start]
  348.  
  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
  354. ;---------------------------------------------------------------------  
  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
  363. ;---------------------------------------------------------------------
  364.  
  365.   button:
  366.     mcall 17            ; 17 - получить идентификатор нажатой кнопки
  367.  
  368.     cmp   ah, 1         ; если нажата кнопка с номером 1,
  369.     je    .exit
  370.     jmp still
  371.    
  372.   .exit:
  373.     mcall -1            ; иначе конец программы
  374.    
  375.  
  376. ;---------------------------------------------------------------------
  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. ;---------------------------------------------------------------------
  474. ;---  ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА  ----------------------------------
  475. ;---------------------------------------------------------------------
  476.  
  477. draw_window:
  478.  
  479.     mcall 12, 1
  480.  
  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.  
  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]
  501.     je   .nochg
  502.   .chg:
  503.     mov  [wSave],ebx
  504.     or   [mode],RTF_TOEOF
  505.     and  [HDoc],0
  506.     and  [line_count],0
  507. ;    mov  [HClick],-100
  508.   .nochg:
  509.  
  510. ;---------------------------------------------
  511.     mov eax, dword[prcinfo+0x3E]
  512.     sub eax, scroll_width_size
  513.     mov word[scroll_bar_data_vertical.start_x], ax
  514.  
  515.     mov eax, dword[prcinfo+0x42]
  516.     sub eax, 17
  517.     mov word[scroll_bar_data_vertical.size_y], ax
  518.  
  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. ;---------------------------------------------
  534.  
  535.     sub  dword[prcinfo+42],2*LMARGIN+scroll_width_size
  536.     sub  dword[prcinfo+46],CHARH+25
  537.    
  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
  570. ;    dpd  eax
  571. ;    dps  'Lines='
  572.     mov  eax,[line_count]
  573. ;    dpd  eax
  574. ;    newline
  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]
  583. ;    dps  <13,10,'Bench='>
  584. ;    dpd  eax
  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:
  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
  631.  
  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. ;---------------------------------------------------------------------
  668. if GUTTER eq 1
  669.    arrow db 0x19
  670. end if
  671. ;---------------------------------------------------------------------
  672. ;---  ДАННЫЕ ПРОГРАММЫ  ----------------------------------------------
  673. ;---------------------------------------------------------------------
  674.  
  675. ; интерфейс программы многоязычный
  676. ;  Вы можете задать язык в MACROS.INC (lang fix язык)
  677.  
  678. window_title:           db      'RtfRead v1.033',0
  679. buf_cmd_lin             rb      0
  680. is_scroll_bar_needed    db      0
  681. ;---------------------------------------------------------------------
  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.  
  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.  
  690. end_l_libs:
  691. ;---------------------------------------------------------------------
  692. system_dir_ProcLib      db '/sys/lib/proc_lib.obj',0
  693. system_dir_Boxlib       db '/sys/lib/box_lib.obj',0
  694.  
  695. head_f_i:
  696. head_f_l                db 'error',0
  697.  
  698. err_message_found_lib1  db 'box_lib.obj - Not found!',0
  699. err_message_found_lib2  db 'proc_lib.obj - Not found!',0
  700.  
  701. err_message_import1     db 'box_lib.obj - Wrong import!',0
  702. err_message_import2     db 'proc_lib.obj - Wrong import!',0
  703.  
  704. ;---------------------------------------------------------------------
  705. align 4
  706. ProcLib_import:
  707. OpenDialog_Init         dd aOpenDialog_Init
  708. OpenDialog_Start        dd aOpenDialog_Start
  709. ;OpenDialog__Version    dd aOpenDialog_Version
  710.         dd      0
  711.         dd      0
  712. aOpenDialog_Init        db 'OpenDialog_init',0
  713. aOpenDialog_Start       db 'OpenDialog_start',0
  714. ;aOpenDialog_Version    db 'Version_OpenDialog',0
  715. ;---------------------------------------------------------------------
  716. OpenDialog_data:
  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
  729.  
  730. communication_area_name:
  731.         db 'FFFFFFFF_open_dialog',0
  732. open_dialog_path:
  733.         db '/sys/File Managers/opendial',0
  734. communication_area_default_pach:
  735.         db '/rd/1',0
  736.  
  737. Filter:
  738. dd Filter.end - Filter
  739. .1:
  740. db 'RTF',0
  741. .end:
  742. db 0
  743. ;---------------------------------------------------------------------
  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.  
  753. fileinfo:
  754.   dd 0
  755. .block:
  756.   dd 0
  757.   dd 0
  758. .size  dd 1
  759.   dd I_END
  760. .name:
  761.  
  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:
  780. fname_buf:
  781.         rb      1024+16
  782. fileattr rd 40/4
  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 ?
  816. ;HClick dd ?
  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 ?
  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. ;---------------------------------------------------------------------
  1040. I_END:                             ; метка конца программы
  1041.  
  1042. procinfo process_information
  1043. rb RTFSIZE
  1044. esp1:
  1045. rb ESPSIZE
  1046. sys_mem:
  1047. rb ESPSIZE
  1048. ;---------------------------------------------------------------------
  1049. temp_dir_pach:
  1050.         rb 4096
  1051. cur_dir_path:
  1052.         rb 4096
  1053. library_path:
  1054.         rb 4096
  1055. ;---------------------------------------------------------------------
  1056. esp_end:
  1057.