Subversion Repositories Kolibri OS

Rev

Rev 139 | Rev 485 | 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. ;
  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 20
  12. CHARW equ 6
  13. CHARH equ 11
  14. WINW equ 600
  15. WINH equ 450
  16. WIN_COLOR equ 0x3f0f0f0
  17. DEFCOLOR equ 0x303030
  18. ;RENDER equ PIX
  19. ;RENDER equ BGI
  20. RENDER equ FREE
  21.  
  22. BGIFONT_PATH equ '/rd/1/fonts/'
  23. FONT_NAME equ 'LITT'
  24. TOP =35
  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.   use32              ; включить 32-битный режим ассемблера
  44.   org    0x0         ; адресация с нуля
  45.  
  46.   db     'MENUET01'  ; 8-байтный идентификатор MenuetOS
  47.   dd     0x01        ; версия заголовка (всегда 1)
  48.   dd     START       ; адрес первой команды
  49.   dd     I_END0      ; размер программы
  50.   dd     esp_end     ; количество памяти
  51.   dd     sys_mem     ; адрес вершины стэка
  52.   dd     fname_buf   ; адрес буфера для параметров (не используется)
  53.   dd     0x0         ; зарезервировано
  54.  
  55. include 'MACROS.INC' ; макросы облегчают жизнь ассемблерщиков!
  56. include 'debug.inc'
  57. if ~ RENDER eq PIX
  58.   TOP=TOP+4
  59.   include 'bgifont.inc'
  60. end if
  61. include 'rtf_lite.inc'
  62. include 'ascl.inc'
  63. ;---------------------------------------------------------------------
  64. ;---  НАЧАЛО ПРОГРАММЫ  ----------------------------------------------
  65. ;---------------------------------------------------------------------
  66. help_file:
  67. file  'reader.rtf'
  68. help_end:
  69.  
  70. START:
  71.     mov  [pitch],2
  72.   if ~ RENDER eq PIX
  73.     mov  edx,FONT_NAME
  74.     mov  edi,save_limit
  75.     BGIfont_Prepare
  76.   end if
  77.  start2:
  78.     cmp  byte[fname_buf],0
  79.     je   load_file;top_red
  80.     jmp  noactivate
  81.  prep_load:
  82. ;    mcall 18,3,dword[prcinfo+30]
  83.  noactivate:
  84. ;    and  ebp,not RTF_OPENING
  85. ;    and  ebp,not RTF_HELP
  86.  
  87. ;    and  [mode],not RTF_OPENING
  88.     and  [mode],not (RTF_HELP+RTF_OPENING)
  89.     mov  ecx,16
  90.     mov  edi,fileinfo.name
  91.     mov  esi,fname_buf
  92.     rep  movsd
  93.  load_file:
  94.         mov     eax, 70
  95.         and     [fileattr+32], 0
  96.         mov     ebx, attrinfo
  97.         int     0x40
  98.         mov     ebx, [fileattr+32]
  99.         test    eax, eax
  100.         jz      .sizok
  101.         mov     dword [fileinfo.name], N_A
  102. .sizok:
  103.     and  [wSave],0
  104.     mov  [HClick],-100
  105.     mov  eax,ebx
  106.     and  eax,RTFSIZE-1
  107.     add  eax,I_END
  108.     mov  [tail],eax
  109.     shr  ebx,16
  110. ;    dpd ebx
  111.     mov  [max_block],ebx
  112.     xor  eax,eax
  113.     mov  ecx,256
  114.     mov  edi,fileinfo.name
  115.     repne scasb
  116.     sub  edi,fileinfo.name+1
  117.     mov  [fname_size],edi
  118. top_red:
  119.     mov  [top],TOP
  120. red:                    ; перерисовать окно
  121.  
  122.     call draw_window    ; вызываем процедуру отрисовки окна
  123.  
  124. ;---------------------------------------------------------------------
  125. ;---  ЦИКЛ ОБРАБОТКИ СОБЫТИЙ  ----------------------------------------
  126. ;---------------------------------------------------------------------
  127.  
  128. still:
  129.     mcall 10            ; функция 10 - ждать события
  130.  
  131.     cmp  eax,1          ; перерисовать окно ?
  132.     je   red            ; если да - на метку red
  133.     cmp  eax,3          ; нажата кнопка ?
  134.     je   button         ; если да - на button
  135.     cmp  eax,2          ; нажата клавиша ?
  136.     je   key            ; если да - на key
  137.  
  138.     jmp  still          ; если другое событие - в начало цикла
  139.  
  140.  
  141. ;---------------------------------------------------------------------
  142.  
  143.  
  144.   key:                  ; нажата клавиша на клавиатуре
  145.     mcall 2             ; функция 2 - считать код символа (в ah)
  146.     cmp  ah,104         ; HELP
  147.     jne  .nohelp
  148.   .help:
  149.     xor  [mode],RTF_HELP
  150.     test [mode],RTF_HELP
  151.     jz   load_file
  152.     mov  ecx,help_end-help_file
  153.     mov  [block_end],ecx
  154.     add  [block_end],I_END
  155.     mov  [tail],ecx
  156.     add  [tail],I_END
  157.     mov  esi,help_file
  158.     mov  edi,I_END
  159.     rep  movsb
  160. ;    or   [mode],RTF_HELP
  161.     xor  eax,eax
  162.     mov  [max_block],eax
  163.     jmp  top_red
  164.   .nohelp:
  165. ;    test [mode],RTF_HELP
  166. ;    jz   .nohelp2
  167. ;    and  [mode],not RTF_HELP
  168. ;    cmp  dword[fileinfo.name],N_A
  169. ;    je   still
  170. ;    jmp  prep_load
  171.   .nohelp2:
  172.     cmp  ah,114         ; R - redraw
  173.     je   red
  174.     cmp  ah,99          ; C - color
  175.     jne  .nocolor
  176.   .color:
  177.     xor  [mode],RTF_COLORLESS
  178.     jmp  red
  179.   .nocolor:
  180.     cmp  ah,97          ; A - alignment
  181.     jne  .noalign
  182.   .alignment:
  183.     xor  [mode],RTF_ALIGNLESS
  184.     jmp  red
  185.   .noalign:
  186.     cmp  ah,44          ; < - pitch dec
  187.     jne  .nopd
  188.   .decp:
  189.     dec  [pitch]
  190.     jmp  red
  191.   .nopd:
  192.     cmp  ah,46          ; < - pitch inc
  193.     jne  .nopi
  194.   .incp:
  195.     inc  [pitch]
  196.     jmp  red
  197.   .nopi:
  198.     cmp  ah,180         ; Home
  199.     je   top_red
  200.     mov  ebx,dword[prcinfo+46]
  201.     sub  ebx,TOP+15
  202.     cmp  ah,183 ;PgDn
  203.     jne  .nopgdn
  204.     sub  [top],bx
  205.     jmp  red
  206.   .nopgdn:
  207.     cmp  ah,177 ;arrDn
  208.     jne  .noardn
  209.     sub  [top],CHARH
  210.     jmp  red
  211.   .noardn:
  212.     mov  cx,[top]
  213.     cmp  ah,184 ;PgUp
  214.     jne  .nopgup
  215.     add  [top],bx
  216.     cmp  [top],TOP
  217.     jl   red
  218.     mov  [top],TOP
  219.     cmp  cx,[top]
  220.     je   still
  221.     jmp  red
  222.   .nopgup:
  223.     cmp  ah,178 ;arrUp
  224.     jne  .noarup
  225.     add  [top],CHARH
  226.     cmp  [top],TOP
  227.     jl   red
  228.     mov  [top],TOP
  229.     cmp  cx,[top]
  230.     je   still
  231.     jmp  red
  232.   .noarup:
  233.   if  RENDER eq FREE
  234.     cmp  ah,56 ;zoom+
  235.     jne  .noplus
  236.   .zplus:
  237.     fld  [FreeFontscale]
  238.     fmul [Zoomscale]
  239.   .zoom:
  240.     fstp [FreeFontscale]
  241.     jmp  red
  242.   .noplus:
  243.     cmp  ah,54 ;zoom-
  244.     jne  .nominus
  245.   .zminus:
  246.     fld  [FreeFontscale]
  247.     fdiv [Zoomscale]
  248.     jmp  .zoom
  249.   .nominus:
  250.   end if
  251.     cmp  ah,108         ; L - load
  252.     jne  stilld
  253.   .file_open:
  254.     or   [mode],RTF_OPENING
  255.     opendialog draw_window, prep_load, st_1, fname_buf
  256.   st_1:
  257.     and  [mode],not RTF_OPENING
  258.     jmp  still;red
  259.   stilld:
  260.     jmp  still
  261.  
  262. ;---------------------------------------------------------------------
  263.  
  264.   button:
  265.     mcall 17            ; 17 - получить идентификатор нажатой кнопки
  266.     cmp   ah,2
  267.     je    key.help
  268.     cmp   ah,3
  269.     je    key.color
  270.     cmp   ah,4
  271.     je    key.alignment
  272.     cmp   ah,5
  273.     je    key.file_open
  274.     cmp   ah,6
  275.     je    key.incp
  276.     cmp   ah,7
  277.     je    key.decp
  278.   if RENDER eq FREE
  279.     cmp   ah,8
  280.     je    key.zminus
  281.     cmp   ah,9
  282.     je    key.zplus
  283.   end if
  284.     cmp   ah, 1         ; если НЕ нажата кнопка с номером 1,
  285.     jne   .noexit       ;  вернуться
  286.  
  287.   .exit:
  288.     mcall -1            ; иначе конец программы
  289.   .noexit:
  290.     cmp   ah,20
  291.     jne   still
  292.     mcall 37,1
  293.     and   eax,0xffff
  294.     cmp   eax,[HClick]
  295.     je    still
  296.     mov   [HClick],eax
  297.     sub   eax,25
  298.     mul   [HDoc]
  299.     mov   ebx,dword[prcinfo+46]
  300.     sub   ebx,25
  301.     div   ebx
  302.     dpd   eax
  303.     mov   [top],TOP
  304.     sub   [top],ax
  305.     dps   'B'
  306.     jmp   red;still
  307. ;---------------------------------------------------------------------
  308. ;---  ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА  ----------------------------------
  309. ;---------------------------------------------------------------------
  310.  
  311. draw_window:
  312.  
  313.     mcall 12, 1                    ; функция 12: сообщить ОС об отрисовке окна
  314.                                    ; 1 - начинаем рисовать
  315.  
  316.     mcall 0, <10,WINW>, <100,WINH>, WIN_COLOR,0x805080D0, 0x005080D0
  317.     mcall 9,procinfo,-1
  318.     mov   eax,[procinfo.x_size]
  319.     cmp   eax,1
  320.     ja      .temp12345
  321.     ret
  322.   .temp12345:
  323.  
  324.     mcall 4, <8,8>, 0x10DDEEFF, header, headersize-header
  325.     mov  esi,ecx
  326.     mcall 47,0x30000,isymImplemented,<114,8>
  327.     add  edx,36 shl 16
  328.     mcall ,,isymMax
  329.     add  edx,40 shl 16
  330.     mov  esi,0x104e00e7;0x10f27840
  331.     cmp  dword[fileinfo.name],N_A
  332.     jne  .noNA
  333.     mov  esi,0x10ff0000
  334.   .noNA:
  335.     mcall 4,edx,esi,fileinfo.name,[fname_size]
  336.     mov  edi,prcinfo
  337.     mcall 9,edi,-1
  338.     and  [mode],not RTF_TOEOF
  339.     mov  ebx,[edi+42]
  340.     cmp  ebx,[wSave]
  341.     je   .nochg
  342.   .chg:
  343.     mov  [wSave],ebx
  344.     or   [mode],RTF_TOEOF
  345.     and  [HDoc],0
  346.     and  [line_count],0
  347.     mov  [HClick],-100
  348.   .nochg:
  349.     sub  ebx,60
  350.     shl  ebx,16
  351.     mov  bx,12
  352.     mov  ecx,5 shl 16+12
  353.     mov  esi,0xb810e7
  354.     mov  edx,2
  355.  BTN_SPACE equ 14 shl 16
  356.     mcall 8             ;2
  357.     sub  ebx,BTN_SPACE
  358.     inc  edx
  359.     mcall 8,,,,0x459a    ;3
  360.     sub  ebx,BTN_SPACE
  361.     inc  edx
  362.     mcall ,,,,0x107a30  ;4
  363.     sub  ebx,BTN_SPACE
  364.     inc  edx
  365.     mcall ,,,,0xcc0000  ;5
  366.     sub  ebx,BTN_SPACE
  367.     inc  edx
  368.     mcall ,,,,0x575f8c  ;6
  369.     sub  ebx,BTN_SPACE
  370.     inc  edx
  371.     mcall ,,,,0x575f8c  ;7
  372.   if RENDER eq FREE
  373.     sub  ebx,BTN_SPACE
  374.     inc  edx
  375.     mcall ,,,,0x6a73d0  ;8
  376.     sub  ebx,BTN_SPACE
  377.     inc  edx
  378.     mcall ,,,,0xd048c8  ;9
  379.   end if
  380.     shr  ecx,16
  381.     mov  bx,cx
  382.     add  ebx,3 shl 16+3
  383.     mcall 4,,0x10ddeeff,btn_text,btn_end-btn_text
  384.     sub  dword[prcinfo+42],LMARGIN
  385.     sub  dword[prcinfo+46],CHARH
  386.  if GUTTER eq 1
  387.     mov  ebx,LMARGIN shl 16+20
  388.     mov  ecx,20
  389.     mov  eax,4
  390.     mov  edx,arrow
  391.     mov  esi,1
  392.   .loop1:
  393.     push ecx
  394.     mcall ,,0xff0000
  395.     pop  ecx
  396.     add  ebx,50 shl 16
  397.     loop .loop1
  398.  end if
  399.     mov  ebx,dword[prcinfo+42]
  400.     shl  ebx,16
  401.     add  ebx,7 shl 16+7
  402.     mov  ecx,dword[prcinfo+46]
  403.     add  ecx,25 shl 16-25
  404.     mov  edx,20+1 shl 29
  405.     mcall 8
  406.     mov  ecx,[HClick]
  407.     shl  ecx,16
  408.     add  ecx,6-3 shl 16
  409.     mcall 13,,,0xe26830
  410.  if MODE eq RTF
  411.     test [mode],RTF_OPENING
  412.     jne  .ex
  413.     and  [mode],not (RTF_BOTTOM);+RTF_TOEOF)
  414.     mov  [colorptr],colortbl
  415.     mov  eax,DEFCOLOR
  416.     mov  edi,colortbl
  417.     mov  ecx,16
  418.     rep  stosd
  419.     xor  eax,eax
  420.     mov  [cGroup],eax
  421.     mov  edi,Chp
  422.     mov  ecx,SIZE_save
  423.     rep  stosb
  424.     mov  ax,[top]
  425.     mov  word[Free+6],10
  426.     mov  word[Free+4],ax
  427.     mov  esi,I_END
  428.     call RtfParse
  429.     dpd  eax
  430.     dps  'Lines='
  431.     mov  eax,[line_count]
  432.     dpd  eax
  433.     newline
  434. ;    movzx  eax,word[Free+4]
  435. ;    dpd  eax
  436.     mov  eax,dword[prcinfo+42]
  437.     mov  edx,WIN_COLOR
  438.     call draw_progress
  439. if BENCH eq 1
  440.     mcall 26,9
  441.     sub  eax,[bench]
  442.     dps  <13,10,'Bench='>
  443.     dpd  eax
  444. end if
  445.  else
  446.     mov  [char],0
  447.     mov  ebx,10 shl 16+TOP
  448.     mov  ecx,16
  449.   .l0:
  450.     push ecx
  451.     mov  ecx,16
  452.   .l1:
  453.     push ecx
  454.   if RENDER eq BGI
  455.     mov  edx,char
  456.     mov  ecx,0x48000000
  457.     mov  esi,1
  458.     BGIfont_Outtext
  459.   else
  460.     mcall 4,,0x10000000,char,1
  461.   end if
  462.     pop  ecx
  463.     inc  [char]
  464.     add  ebx,(CHARW+3) shl 16
  465.     loop .l1
  466.     pop  ecx
  467.     add  ebx,CHARH+2
  468.     and  ebx,0x0000ffff
  469.     add  ebx,10 shl 16
  470.     loop .l0
  471.  end if
  472.  .ex:
  473.     mcall 12, 2                    ; функция 12: сообщить ОС об отрисовке окна
  474.                                    ; 2, закончили рисовать
  475.     ret                            ; выходим из процедуры
  476.  
  477. if GUTTER eq 1
  478.    arrow db 0x19
  479. end if
  480. ;---------------------------------------------------------------------
  481. ;---  ДАННЫЕ ПРОГРАММЫ  ----------------------------------------------
  482. ;---------------------------------------------------------------------
  483.  
  484. ; интерфейс программы многоязычный
  485. ;  Вы можете задать язык в MACROS.INC (lang fix язык)
  486. procinfo process_information
  487. header:
  488.   db 'RTF READER v1.    (     ):'
  489. headersize:
  490. btn_text:
  491.   if RENDER eq FREE
  492.     db '+ - '
  493.   end if
  494.     db '< > L A C H'
  495. btn_end:
  496.  
  497. attrinfo:
  498.         dd      5
  499.         dd      0
  500.         dd      0
  501.         dd      0
  502.         dd      fileattr
  503.         db      0
  504.         dd      fileinfo.name
  505.  
  506. fileinfo:
  507.   dd 0
  508. .block:
  509.   dd 0
  510.   dd 0
  511. .size  dd 1
  512.   dd I_END
  513. .name:
  514. ;   db '//'
  515. ;  db ' /HD/1/RTF/texts/FASM.TXT',0
  516. ;  db '/HD/1/RTF/TEST2.RTF',0
  517. ;  db '/HD/1/RTF/texts/index_ru.RTF',0
  518. ;  db '/HD/1/RTF/texts/stas.RTF',0
  519. ;  db '/HD/1/RTF/texts/zed.RTF',0
  520. ;  db '/HD/1/RTF/PRACT.RTF',0
  521. ;  db '/HD/1/RTF/SETUP2.RTF',0
  522. ;  db '/HD/1/RTF/texts/TC_RU.RTF',0
  523. ;  db '/HD/1/RTF/texts/WORD.RTF',0
  524. ;  db '/HD/1/RTF/texts/WORD97.RTF',0
  525. ;  db '/HD/1/RTF/texts/MASTAPP.RTF',0
  526. ;  db '/HD/1/RTF/texts/1c_tor77.RTF',0
  527. ;  db '/HD/1/RTF/texts/RELATION.RTF',0
  528. ;  db '/HD/1/RTF/texts/PLANETS.RTF',0
  529. ;  db '/HD/1/RTF/texts/LOTRRUS.RTF',0
  530.   db '/HD/1/RTF/texts/RULEBOOK.RTF',0
  531. ;  db '/HD/1/RTF/texts/RULEBK2.RTF',0
  532. ;  db '/HD/1/RTF/texts/GLEB.RTF',0
  533. ;  db '/HD/1/RTF/texts/DWG13_14.RTF',0
  534. ;  db '/HD/1/RTF/texts/LK.RTF',0
  535.  
  536. ;  db '/HD/1/RTF/texts/JUSTIFY.RTF',0
  537.    rb  256-($-.name)
  538. ;---------------------------------------------------------------------
  539. ;blind db ?
  540. if RENDER eq PIX
  541. ;  rd 2
  542.   Free rd 9
  543. else
  544. if RENDER eq BGI
  545.   FreeFontscale dd 0.07
  546. else
  547.   Zoomscale dd 1.15
  548.   FreeFontscale dd 0.04
  549. end if
  550.   Free BGIfree FONT_NAME,0,0,1.0,1.0,char,1,0x44000000,0
  551. end if
  552. I_END0:
  553. fname_buf:
  554.         rb      1024+16
  555. fileattr rd 40/4
  556. if BENCH eq 1
  557.   bench dd ?
  558. end if
  559. tail dd ?
  560. cGroup dd ?
  561. Chp:
  562.   CHP
  563. Pap:
  564.   PAP
  565. Sep:
  566.   SEP
  567. Dop:
  568.   DOP
  569. rds db ?
  570. ris db ?
  571. cbBin dd ?
  572. lParam dd ?
  573. fSkipDestIfUnk db ?
  574. mode dd ?
  575. curheight dw ?
  576. maxheight dw ?
  577. RetroBlock dd ?
  578. RetroSave:
  579.   SAVE
  580. prcinfo rb 1024
  581. RetroPtr dd ?
  582. colorptr dd ?
  583. colortbl rd 16
  584. ct_end:
  585. fname_size dd ?
  586. max_block dd ?
  587. cur_block dd ?
  588. HDoc dd ?
  589. HClick dd ?
  590. top dw ?
  591. line_count dd ?
  592. par_count  dd ?
  593. char db ?
  594. pitch db ?
  595. wSave dd ?
  596. RetroXY dd ?
  597. RetroGroup dd ?
  598.  
  599. save_stack:
  600. rb RTFSTACKSIZE
  601. save_limit:
  602. rb BGIFONTSIZE
  603.  
  604. listptr dd ?
  605. szKeyword rb 31
  606. szParameter rb 21
  607. block_end dd ?
  608. I_END:                             ; метка конца программы
  609. rb RTFSIZE
  610. esp1:
  611. rb ESPSIZE
  612. sys_mem:
  613. rb ESPSIZE
  614. esp_end:
  615.