f6e68dbb55
git-svn-id: svn://kolibrios.org@3230 a494cfbc-eb01-0410-851d-a64ba20cac60
416 lines
7.9 KiB
NASM
416 lines
7.9 KiB
NASM
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:
|
||
|