Subversion Repositories Kolibri OS

Rev

Rev 3683 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.  
  2. use32                ; транслятор, использующий 32 разрядных команды
  3.     org 0x0                ; базовый адрес кода, всегда 0x0
  4.     db 'MENUET01'        ; идентификатор исполняемого файла (8 байт)
  5.     dd 0x1                ; версия формата заголовка исполняемого файла
  6.     dd start                ; адрес, на который система передаёт управление
  7.                         ; после загрузки приложения в память
  8.     dd i_end                ; размер приложения
  9.     dd mem                  ; Объем используемой памяти, для стека отведем 0х100 байт и выровним на грницу 4 байта
  10.     dd mem                  ; расположим позицию стека в области памяти, сразу за телом программы. Вершина стека в диапазоне памяти, указанном выше
  11.     dd 0x0              ; указатель на строку с параметрами.
  12.     dd 0;pathprog       ;путь и имя проги
  13.  
  14. include "../../macros.inc"
  15. include "../../proc32.inc"
  16. include "API.INC"
  17. include "../../dll.inc"
  18. include '../../develop/libraries/box_lib/trunk/box_lib.mac'
  19. include '../../develop/libraries/box_lib/load_lib.mac'
  20.  
  21. start:
  22.         mcall 68,11      ;инициализируем кучу
  23.         test eax,eax
  24.         jz Win1.Exit
  25.         stdcall dll.Load, @IMPORT
  26.  
  27.  
  28. ;       mov ecx,1024
  29. ;       mov edi,pathprog
  30. ;       xor al,al
  31. ;
  32. ;       repne scasb
  33. ;
  34. ;       dec edi
  35. ;       mov esi,WordFile
  36. ;      @@:
  37. ;       lodsb
  38. ;       stosb
  39. ;       test al,al
  40. ;       jne @b
  41.  
  42.         ;GetFileInfo fStruc,pathprog,fInfo  ;проверка на наличие файла
  43.         ;test eax,eax                    ;заодно и получу размер файла
  44.         ;je WordFileOK
  45.  
  46.         ;stdcall [mb_create],msgNotFound,mbThread
  47.         ;jmp Win1.Redraw
  48.  
  49. ;WordFileOK:
  50. ;       stdcall mem.Alloc,dword [fInfo+32]
  51. ;       mov ebx,dword [fInfo+32]
  52. ;       mov [filBuffer],eax
  53. ;       add dword[fInfo+32],eax  ;здесь хранится указатель на конец буфера
  54. ;       ReadFile fStruc,pathprog,ebx,eax,0
  55. ;       test eax,eax
  56. ;       jz Win1.Redraw
  57. ;
  58. ;       add al,30h
  59. ;       mov [NumErr],al
  60. ;       stdcall [mb_create],msgNotFound1,mbThread
  61. ;
  62.  
  63.  
  64. align 4
  65. Win1.Redraw:
  66.         RedrawWinBeg
  67.  
  68.         xor eax,eax
  69.         mov ebx,(524*10000h+500)
  70.         mov ecx,(548*10000h+200)
  71.         mov edx,73FFFFFFh
  72.         mov edi,Win1.Caption
  73.         int 40h                      ;окно с прозрачным фонoм
  74.  
  75.         mcall 9,ThreadInfo,-1
  76.  
  77.         mov eax,13
  78.         mov ebx,[ThreadInfo+3Eh]
  79.         inc ebx
  80.         mov ecx,[ThreadInfo+42h]
  81.         inc ecx
  82.         mov edx,clWhite
  83.         int 40h                      ;а теперь не прозрачным:)
  84.  
  85.         call Perevod                 ; в перерисовке сразу переводим введённое слово
  86.         call NextPerev
  87.         stdcall [edit_box_draw],EditIN
  88.         RedrawWinEnd
  89.  
  90. align 4
  91. Win1.Events:
  92.         WaitMessage
  93.         dec eax
  94.         jz Win1.Redraw
  95.         dec eax
  96.         jz Win1.Key
  97.         dec eax
  98.         jz Win1.ButtonPress
  99.  
  100.         ;stdcall [edit_box_mouse],EditIN
  101.  
  102.         jmp Win1.Events
  103.  
  104. Win1.ButtonPress:
  105.         GetButtonPressed
  106.  
  107.         cmp ah,idbExit
  108.         je Win1.Exit
  109.  
  110.         jmp Win1.Events
  111.  
  112. Win1.Key:
  113.         GetKeyPressed
  114.         stdcall [edit_box_key],EditIN
  115.         jmp Win1.FonRedraw
  116.  
  117.  
  118. Win1.Exit:
  119.  
  120.         ExitProcess
  121.  
  122. Win1.FonRedraw:               ;перерисовка области вывода
  123.         mcall 9,ThreadInfo,-1
  124.  
  125.         mov eax,13
  126.         mov ebx,[ThreadInfo+3Eh]
  127.         inc ebx
  128.         mov ecx,20
  129.         shl ecx,16
  130.         add ecx,[ThreadInfo+42h]
  131.         sub ecx,19
  132.         mov edx,clWhite
  133.         int 40h
  134.  
  135.         call Perevod
  136.         call NextPerev
  137. jmp Win1.Events
  138.  
  139. ;-------------------------------------------------------------------------------
  140.  
  141. Perevod:              ;сам перевод
  142.         mov edi,dict;[filBuffer]
  143.  
  144.     Perev:
  145.         xor ebx,ebx
  146.       @@:                 ;сравнием исх. слово со словом под esi
  147.         mov al,[text+ebx]
  148.         test al,al
  149.         je endWord
  150.         cmp [ebx+edi],al
  151.         jne WordNotFound
  152.         inc ebx
  153.         jmp @b
  154.  
  155.   endWord:
  156.         cmp byte[ebx+edi],20h
  157.         jne WordNotFound
  158.  
  159.         add edi,ebx
  160.         dec edi              ;пропускаем пробелы после английского слова
  161.       @@:
  162.         inc edi
  163.         cmp byte[edi],20h
  164.         je @b
  165.  
  166.         xor ebx,ebx
  167.      CopyWord:               ;копируем перевод в строку для вывода
  168.         mov al,[edi+ebx]
  169.         cmp al,0Dh
  170.         je @f
  171.         mov [perevText+ebx],al
  172.         inc ebx
  173.         jmp CopyWord
  174.       @@:
  175.         mov byte[perevText+ebx],0
  176.  
  177.         OutText 7,25,perevText
  178.         ret
  179.  
  180.   WordNotFound:          ;если слово не подошло
  181.         add edi,ebx
  182.       @@:
  183.         cmp byte[edi],0Dh
  184.         je NextWord
  185.         inc edi
  186.         cmp edi,SizeDict;dword [fInfo+32]
  187.         jae endPerev
  188.         jmp @b
  189.  
  190.     NextWord:
  191.         add edi,2
  192.         cmp edi,SizeDict;dword [fInfo+32]
  193.         jae endPerev
  194.         jmp Perev
  195.     endPerev:
  196.         ret
  197.  
  198.  
  199. ;-------------------------------------------------------------------------------
  200. NextPerev:
  201.         mov ecx,Lines
  202.         mov edi,dict;[filBuffer]
  203.   LinePerev:           ;цикл рисования строки
  204.         xor ebx,ebx
  205.       @@:                 ;сравнием исх. слово со словом под esi
  206.         mov al,[text+ebx]
  207.         test al,al
  208.         je N_endWord
  209.         cmp [ebx+edi],al
  210.         jne N_WordNotFound
  211.         inc ebx
  212.         jmp @b
  213.  
  214.   N_endWord:
  215.         cmp ebx,0
  216.         jne N_Ppoisk
  217.         ret
  218.  
  219.       N_Ppoisk:             ;поиск начала строки
  220.         add edi,ebx
  221.       @@:
  222.         dec edi
  223.         cmp byte[edi],0Ah
  224.         jne @b
  225.         inc edi
  226.  
  227.                              ;########пропускаем уже переведённое слово########
  228.         xor ebx,ebx
  229.     N_NoDouble:
  230.         mov al,[text+ebx]
  231.         test al,al
  232.         je N_Double
  233.         cmp [ebx+edi],al
  234.         jne N_NoDblOk
  235.         inc ebx
  236.         jmp N_NoDouble
  237.  
  238.     N_Double:
  239.         cmp byte[ebx+edi],20h
  240.         jne N_NoDblOk
  241.  
  242.         add edi,ebx
  243.       @@:
  244.         inc edi
  245.         cmp byte[edi],0Ah
  246.         jne @b
  247.         add edi,2
  248.         jmp LinePerev
  249.  
  250.      N_NoDblOk:              ;############вывод результатов####################
  251.         xor ebx,ebx        ;копируем результат
  252.      N_CopyWord:
  253.         mov al,[edi+ebx]
  254.         cmp al,20h
  255.         je @f
  256.         mov [perevText+ebx],al
  257.         inc ebx
  258.         jmp N_CopyWord
  259.       @@:
  260.         mov byte[perevText+ebx],0
  261.         add edi,ebx
  262.  
  263.         mov eax,Lines
  264.         sub eax,ecx
  265.         dec eax
  266.         shl eax,3
  267.         add eax,45
  268.         push ecx
  269.         push edi
  270.         OutText 7,ax,perevText
  271.         pop edi
  272.         pop ecx
  273.  
  274.       @@:
  275.         inc edi
  276.         cmp byte[edi],20h
  277.         je @b
  278.  
  279.  
  280.         xor ebx,ebx
  281.      N_CopyPerev:
  282.         mov al,[edi+ebx]
  283.         cmp al,0Dh
  284.         je @f
  285.         mov [perevText+ebx],al
  286.         inc ebx
  287.         jmp N_CopyPerev
  288.       @@:
  289.         mov byte[perevText+ebx],0
  290.  
  291.         mov eax,Lines
  292.         sub eax,ecx
  293.         dec eax
  294.         shl eax,3
  295.         add eax,45
  296.         push ecx
  297.         push edi
  298.         OutText 127,ax,perevText
  299.         pop edi
  300.         pop ecx
  301.  
  302.       @@:
  303.         inc edi
  304.         cmp byte[edi],0Ah
  305.         jne @b
  306.         inc edi
  307.  
  308.         loop @f      ;недотягивается до LinePerev
  309.         ret
  310.       @@:
  311.         jmp LinePerev
  312.  
  313.   N_WordNotFound:
  314.         add edi,ebx
  315.       @@:
  316.         cmp byte[edi],0Dh
  317.         je N_NextWord
  318.         inc edi
  319.         cmp edi,SizeDict;dword [fInfo+32]
  320.         jae N_endPerev
  321.         jmp @b
  322.  
  323.     N_NextWord:
  324.         add edi,2
  325.         cmp edi,SizeDict;dword [fInfo+32]
  326.         jae N_endPerev
  327.         jmp LinePerev
  328.     N_endPerev:
  329.         ret
  330.  
  331. ;-------------------------------------------------------------------------------
  332. ;-------------------------------------------------------------------------------
  333. ;------DATA---------------------------------------------------------------------
  334. ;-------------------------------------------------------------------------------
  335. ;-------------------------------------------------------------------------------
  336.  
  337.         idbExit = 1
  338.  
  339.         Lines   = 16        ;количеств строк
  340.  
  341.         clTheme = 080B0FFh
  342.  
  343.         Win1.Caption    db 'Dictionary ENG -> RUS',0
  344.         Win1X           = 524
  345.         Win1Y           = 548
  346.         Win1W           = 500
  347.         Win1H           = 200
  348.  
  349.         Memo.X  = 5
  350.         Memo.Y  = 20
  351.         Memo.W  = 400
  352.         Memo.H  = 370
  353.  
  354.         EditIN edit_box 350,5,5,0FFFFFFh,06F9480h,0,00h,0,40,\
  355.                         text,mouse_dd,ed_focus,0,0
  356.  
  357.  
  358.  
  359. ;       msgNotFound:
  360. ;                       dw 0
  361. ;                       db 'Ошибка',0
  362. ;                       db 'Файл dictionary.wrd не найден',0
  363. ;                       db 'Ясно',0
  364. ;                       db 0
  365. ;
  366. ;       msgNotFound1:
  367. ;                       dw 0
  368. ;                       db '!!!',0
  369. ;                       db 'Ошибка чтения '
  370. ;                    NumErr:    db 0
  371. ;                               db 0
  372. ;                       db 'Ясно',0
  373. ;                       db 0
  374. ;
  375. ;       WordFile        db '.wrd',0
  376.  
  377.  
  378. ;-------------------------------------------------------------------------------
  379. @IMPORT:
  380. library box_lib,'box_lib.obj',msgbox,'msgbox.obj'
  381. import  box_lib,\
  382.         edit_box_draw,'edit_box',\
  383.         edit_box_key,'edit_box_key';,\
  384.         ;edit_box_mouse,'edit_box_mouse'
  385. import  msgbox,\
  386.         mb_create,'mb_create'
  387.  
  388. dict:
  389. include 'dictionary.wrd'
  390.  
  391. SizeDict = $;-dict
  392.  
  393.  
  394. i_end:
  395. ;-------------------------------------------------------------------------------
  396.  
  397.         ;WordFP         rb 1024
  398. ;        m1 dd 0
  399.         ;filBuffer      rd 1
  400.  
  401.  
  402.         ThreadInfo:     rb 1024
  403.         ;pathprog
  404.         mouse_dd        rd 1
  405.         text            rb 40
  406.         perevText       rb 300
  407.         ;fStruc         rb 30
  408.         ;fInfo          rb 40
  409.         mbThread        rb 1024
  410.  
  411.  
  412.         rb 4096
  413. mem:
  414.  
  415.