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

include "API.inc"

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 	;путь и имя проги


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 RUS -> ENG',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: