Subversion Repositories Kolibri OS

Rev

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