use32                ; âà ­á«ïâ®à, ¨á¯®«ì§ãî騩 32 à §à來ëå ª®¬ ­¤ë
    org 0x0                ; ¡ §®¢ë©  ¤à¥á ª®¤ , ¢á¥£¤  0x0
    db 'MENUET01'        ; ¨¤¥­â¨ä¨ª â®à ¨á¯®«­ï¥¬®£® ä ©«  (8 ¡ ©â)
    dd 0x1                ; ¢¥àá¨ï ä®à¬ â  § £®«®¢ª  ¨á¯®«­ï¥¬®£® ä ©« 
    dd start                ;  ¤à¥á, ­  ª®â®àë© á¨á⥬  ¯¥à¥¤ ñâ ã¯à ¢«¥­¨¥
                        ; ¯®á«¥ § £à㧪¨ ¯à¨«®¦¥­¨ï ¢ ¯ ¬ïâì
    dd i_end                ; à §¬¥à ¯à¨«®¦¥­¨ï
    dd mem                  ; Ž¡ê¥¬ ¨á¯®«ì§ã¥¬®© ¯ ¬ïâ¨, ¤«ï á⥪  ®â¢¥¤¥¬ 0å100 ¡ ©â ¨ ¢ë஢­¨¬ ­  £à­¨æã 4 ¡ ©â 
    dd mem                  ; à á¯®«®¦¨¬ ¯®§¨æ¨î á⥪  ¢ ®¡« á⨠¯ ¬ïâ¨, áࠧ㠧  ⥫®¬ ¯à®£à ¬¬ë. ‚¥à設  á⥪  ¢ ¤¨ ¯ §®­¥ ¯ ¬ïâ¨, 㪠§ ­­®¬ ¢ëè¥
    dd 0x0              ; 㪠§ â¥«ì ­  áâபã á ¯ à ¬¥âà ¬¨.
    dd 0;pathprog       ;¯ãâì ¨ ¨¬ï ¯à®£¨

include "../../macros.inc"
include "../../proc32.inc"
include "API.INC"
include "../../dll.inc"
include '../../develop/libraries/box_lib/trunk/box_lib.mac'
include '../../develop/libraries/box_lib/load_lib.mac'

start:
        mcall 68,11      ;¨­¨æ¨ «¨§¨à㥬 ªãçã
        test eax,eax
        jz Win1.Exit
        stdcall dll.Load, @IMPORT


;       mov ecx,1024
;       mov edi,pathprog
;       xor al,al
;
;       repne scasb
;
;       dec edi
;       mov esi,WordFile
;      @@:
;       lodsb
;       stosb
;       test al,al
;       jne @b

        ;GetFileInfo fStruc,pathprog,fInfo  ;¯à®¢¥àª  ­  ­ «¨ç¨¥ ä ©« 
        ;test eax,eax                    ;§ ®¤­® ¨ ¯®«ãçã à §¬¥à ä ©« 
        ;je WordFileOK

        ;stdcall [mb_create],msgNotFound,mbThread
        ;jmp Win1.Redraw

;WordFileOK:
;       stdcall mem.Alloc,dword [fInfo+32]
;       mov ebx,dword [fInfo+32]
;       mov [filBuffer],eax
;       add dword[fInfo+32],eax  ;§¤¥áì åà ­¨âáï 㪠§ â¥«ì ­  ª®­¥æ ¡ãä¥à 
;       ReadFile fStruc,pathprog,ebx,eax,0
;       test eax,eax
;       jz Win1.Redraw
;
;       add al,30h
;       mov [NumErr],al
;       stdcall [mb_create],msgNotFound1,mbThread
;


align 4
Win1.Redraw:
        RedrawWinBeg

        xor eax,eax
        mov ebx,(524*10000h+500)
        mov ecx,(548*10000h+200)
        mov edx,73FFFFFFh
        mov edi,Win1.Caption
        int 40h                      ;®ª­® á ¯à®§à ç­ë¬ ä®­o¬

        mcall 9,ThreadInfo,-1

        mov eax,13
        mov ebx,[ThreadInfo+3Eh]
        inc ebx
        mov ecx,[ThreadInfo+42h]
        inc ecx
        mov edx,clWhite
        int 40h                      ;  ⥯¥àì ­¥ ¯à®§à ç­ë¬:)

        call Perevod                 ; ¢ ¯¥à¥à¨á®¢ª¥ áࠧ㠯¥à¥¢®¤¨¬ ¢¢¥¤ñ­­®¥ á«®¢®
        call NextPerev
        stdcall [edit_box_draw],EditIN
        RedrawWinEnd

align 4
Win1.Events:
        WaitMessage
        dec eax
        jz Win1.Redraw
        dec eax
        jz Win1.Key
        dec eax
        jz Win1.ButtonPress

        ;stdcall [edit_box_mouse],EditIN

        jmp Win1.Events

Win1.ButtonPress:
        GetButtonPressed

        cmp ah,idbExit
        je Win1.Exit

        jmp Win1.Events

Win1.Key:
        GetKeyPressed
        stdcall [edit_box_key],EditIN
        jmp Win1.FonRedraw


Win1.Exit:

        ExitProcess

Win1.FonRedraw:               ;¯¥à¥à¨á®¢ª  ®¡« á⨠¢ë¢®¤ 
        mcall 9,ThreadInfo,-1

        mov eax,13
        mov ebx,[ThreadInfo+3Eh]
        inc ebx
        mov ecx,20
        shl ecx,16
        add ecx,[ThreadInfo+42h]
        sub ecx,19
        mov edx,clWhite
        int 40h

        call Perevod
        call NextPerev
jmp Win1.Events

;-------------------------------------------------------------------------------

Perevod:              ;á ¬ ¯¥à¥¢®¤
        mov edi,dict;[filBuffer]

    Perev:
        xor ebx,ebx
      @@:                 ;áà ¢­¨¥¬ ¨áå. á«®¢® á® á«®¢®¬ ¯®¤ esi
        mov al,[text+ebx]
        test al,al
        je endWord
        cmp [ebx+edi],al
        jne WordNotFound
        inc ebx
        jmp @b

  endWord:
        cmp byte[ebx+edi],20h
        jne WordNotFound

        add edi,ebx
        dec edi              ;¯à®¯ã᪠¥¬ ¯à®¡¥«ë ¯®á«¥  ­£«¨©áª®£® á«®¢ 
      @@:
        inc edi
        cmp byte[edi],20h
        je @b

        xor ebx,ebx
     CopyWord:               ;ª®¯¨à㥬 ¯¥à¥¢®¤ ¢ áâப㠤«ï ¢ë¢®¤ 
        mov al,[edi+ebx]
        cmp al,0Dh
        je @f
        mov [perevText+ebx],al
        inc ebx
        jmp CopyWord
      @@:
        mov byte[perevText+ebx],0

        OutText 7,25,perevText
        ret

  WordNotFound:          ;¥á«¨ á«®¢® ­¥ ¯®¤®è«®
        add edi,ebx
      @@:
        cmp byte[edi],0Dh
        je NextWord
        inc edi
        cmp edi,SizeDict;dword [fInfo+32]
        jae endPerev
        jmp @b

    NextWord:
        add edi,2
        cmp edi,SizeDict;dword [fInfo+32]
        jae endPerev
        jmp Perev
    endPerev:
        ret


;-------------------------------------------------------------------------------
NextPerev:
        mov ecx,Lines
        mov edi,dict;[filBuffer]
  LinePerev:           ;横« à¨á®¢ ­¨ï áâப¨
        xor ebx,ebx
      @@:                 ;áà ¢­¨¥¬ ¨áå. á«®¢® á® á«®¢®¬ ¯®¤ esi
        mov al,[text+ebx]
        test al,al
        je N_endWord
        cmp [ebx+edi],al
        jne N_WordNotFound
        inc ebx
        jmp @b

  N_endWord:
        cmp ebx,0
        jne N_Ppoisk
        ret

      N_Ppoisk:             ;¯®¨áª ­ ç «  áâப¨
        add edi,ebx
      @@:
        dec edi
        cmp byte[edi],0Ah
        jne @b
        inc edi

                             ;########¯à®¯ã᪠¥¬ 㦥 ¯¥à¥¢¥¤ñ­­®¥ á«®¢®########
        xor ebx,ebx
    N_NoDouble:
        mov al,[text+ebx]
        test al,al
        je N_Double
        cmp [ebx+edi],al
        jne N_NoDblOk
        inc ebx
        jmp N_NoDouble

    N_Double:
        cmp byte[ebx+edi],20h
        jne N_NoDblOk

        add edi,ebx
      @@:
        inc edi
        cmp byte[edi],0Ah
        jne @b
        add edi,2
        jmp LinePerev

     N_NoDblOk:              ;############¢ë¢®¤ १ã«ìâ â®¢####################
        xor ebx,ebx        ;ª®¯¨à㥬 १ã«ìâ â
     N_CopyWord:
        mov al,[edi+ebx]
        cmp al,20h
        je @f
        mov [perevText+ebx],al
        inc ebx
        jmp N_CopyWord
      @@:
        mov byte[perevText+ebx],0
        add edi,ebx

        mov eax,Lines
        sub eax,ecx
        dec eax
        shl eax,3
        add eax,45
        push ecx
        push edi
        OutText 7,ax,perevText
        pop edi
        pop ecx

      @@:
        inc edi
        cmp byte[edi],20h
        je @b


        xor ebx,ebx
     N_CopyPerev:
        mov al,[edi+ebx]
        cmp al,0Dh
        je @f
        mov [perevText+ebx],al
        inc ebx
        jmp N_CopyPerev
      @@:
        mov byte[perevText+ebx],0

        mov eax,Lines
        sub eax,ecx
        dec eax
        shl eax,3
        add eax,45
        push ecx
        push edi
        OutText 127,ax,perevText
        pop edi
        pop ecx

      @@:
        inc edi
        cmp byte[edi],0Ah
        jne @b
        inc edi

        loop @f      ;­¥¤®â¢ ¥âáï ¤® LinePerev
        ret
      @@:
        jmp LinePerev

  N_WordNotFound:
        add edi,ebx
      @@:
        cmp byte[edi],0Dh
        je N_NextWord
        inc edi
        cmp edi,SizeDict;dword [fInfo+32]
        jae N_endPerev
        jmp @b

    N_NextWord:
        add edi,2
        cmp edi,SizeDict;dword [fInfo+32]
        jae N_endPerev
        jmp LinePerev
    N_endPerev:
        ret

;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
;------DATA---------------------------------------------------------------------
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------

        idbExit = 1

        Lines   = 16        ;ª®«¨ç¥á⢠áâப

        clTheme = 080B0FFh

        Win1.Caption    db 'Dictionary ENG -> RUS',0
        Win1X           = 524
        Win1Y           = 548
        Win1W           = 500
        Win1H           = 200

        Memo.X  = 5
        Memo.Y  = 20
        Memo.W  = 400
        Memo.H  = 370

        EditIN edit_box 350,5,5,0FFFFFFh,06F9480h,0,00h,0,40,\
                        text,mouse_dd,ed_focus,0,0



;       msgNotFound:
;                       dw 0
;                       db 'Žè¨¡ª ',0
;                       db '” ©« dictionary.wrd ­¥ ­ ©¤¥­',0
;                       db 'Ÿá­®',0
;                       db 0
;
;       msgNotFound1:
;                       dw 0
;                       db '!!!',0
;                       db 'Žè¨¡ª  ç⥭¨ï '
;                    NumErr:    db 0
;                               db 0
;                       db 'Ÿá­®',0
;                       db 0
;
;       WordFile        db '.wrd',0


;-------------------------------------------------------------------------------
@IMPORT:
library box_lib,'box_lib.obj',msgbox,'msgbox.obj'
import  box_lib,\
        edit_box_draw,'edit_box',\
        edit_box_key,'edit_box_key';,\
        ;edit_box_mouse,'edit_box_mouse'
import  msgbox,\
        mb_create,'mb_create'

dict:
include 'dictionary.wrd'

SizeDict = $;-dict


i_end:
;-------------------------------------------------------------------------------

        ;WordFP         rb 1024
;        m1 dd 0
        ;filBuffer      rd 1


        ThreadInfo:     rb 1024
        ;pathprog
        mouse_dd        rd 1
        text            rb 40
        perevText       rb 300
        ;fStruc         rb 30
        ;fInfo          rb 40
        mbThread        rb 1024


        rb 4096
mem: