kolibrios/programs/other/dictionary/dictionary.ASM
Kirill Lipatov (Leency) f6e68dbb55 added dictionary (Socrat) to SVN
git-svn-id: svn://kolibrios.org@3230 a494cfbc-eb01-0410-851d-a64ba20cac60
2013-02-06 21:41:47 +00:00

416 lines
7.9 KiB
NASM
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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: