Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 3229 → Rev 3230

/programs/other/dictionary/dictionary.ASM
0,0 → 1,415
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: