forked from KolibriOS/kolibrios
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:
|
|
|