Subversion Repositories Kolibri OS

Rev

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