Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
3230 leency 1
include "../../macros.inc"
2
include "../../proc32.inc"
3
include "../../dll.inc"
4
include '../../develop/libraries/box_lib/trunk/box_lib.mac'
5
include '../../develop/libraries/box_lib/load_lib.mac'
6
 
7
include "API.inc"
8
 
9
use32		     ; транслятор, использующий 32 разрядных команды
10
    org 0x0		   ; базовый адрес кода, всегда 0x0
11
    db 'MENUET01'	 ; идентификатор исполняемого файла (8 байт)
12
    dd 0x1		  ; версия формата заголовка исполняемого файла
13
    dd start		    ; адрес, на который система передаёт управление
14
			; после загрузки приложения в память
15
    dd i_end		    ; размер приложения
16
    dd mem		    ; Объем используемой памяти, для стека отведем 0х100 байт и выровним на грницу 4 байта
17
    dd mem		    ; расположим позицию стека в области памяти, сразу за телом программы. Вершина стека в диапазоне памяти, указанном выше
18
    dd 0x0		; указатель на строку с параметрами.
19
    dd 0;pathprog 	;путь и имя проги
20
 
21
 
22
start:
23
	mcall 68,11	 ;инициализируем кучу
24
	test eax,eax
25
	jz Win1.Exit
26
	stdcall dll.Load, @IMPORT
27
 
28
 
29
;       mov ecx,1024
30
;       mov edi,pathprog
31
;       xor al,al
32
;
33
;       repne scasb
34
;
35
;       dec edi
36
;       mov esi,WordFile
37
;      @@:
38
;       lodsb
39
;       stosb
40
;       test al,al
41
;       jne @b
42
 
43
	;GetFileInfo fStruc,pathprog,fInfo  ;проверка на наличие файла
44
	;test eax,eax                    ;заодно и получу размер файла
45
	;je WordFileOK
46
 
47
	;stdcall [mb_create],msgNotFound,mbThread
48
	;jmp Win1.Redraw
49
 
50
;WordFileOK:
51
;       stdcall mem.Alloc,dword [fInfo+32]
52
;       mov ebx,dword [fInfo+32]
53
;       mov [filBuffer],eax
54
;       add dword[fInfo+32],eax  ;здесь хранится указатель на конец буфера
55
;       ReadFile fStruc,pathprog,ebx,eax,0
56
;       test eax,eax
57
;       jz Win1.Redraw
58
;
59
;       add al,30h
60
;       mov [NumErr],al
61
;       stdcall [mb_create],msgNotFound1,mbThread
62
;
63
 
64
 
65
align 4
66
Win1.Redraw:
67
	RedrawWinBeg
68
 
69
	xor eax,eax
70
	mov ebx,(524*10000h+500)
71
	mov ecx,(548*10000h+200)
72
	mov edx,73FFFFFFh
73
	mov edi,Win1.Caption
74
	int 40h 		     ;окно с прозрачным фонoм
75
 
76
	mcall 9,ThreadInfo,-1
77
 
78
	mov eax,13
79
	mov ebx,[ThreadInfo+3Eh]
80
	inc ebx
81
	mov ecx,[ThreadInfo+42h]
82
	inc ecx
83
	mov edx,clWhite
84
	int 40h 		     ;а теперь не прозрачным:)
85
 
86
	call Perevod		     ; в перерисовке сразу переводим введённое слово
87
	call NextPerev
88
	stdcall [edit_box_draw],EditIN
89
	RedrawWinEnd
90
 
91
align 4
92
Win1.Events:
93
	WaitMessage
94
	dec eax
95
	jz Win1.Redraw
96
	dec eax
97
	jz Win1.Key
98
	dec eax
99
	jz Win1.ButtonPress
100
 
101
	;stdcall [edit_box_mouse],EditIN
102
 
103
	jmp Win1.Events
104
 
105
Win1.ButtonPress:
106
	GetButtonPressed
107
 
108
	cmp ah,idbExit
109
	je Win1.Exit
110
 
111
	jmp Win1.Events
112
 
113
Win1.Key:
114
	GetKeyPressed
115
	stdcall [edit_box_key],EditIN
116
	jmp Win1.FonRedraw
117
 
118
 
119
Win1.Exit:
120
 
121
	ExitProcess
122
 
123
Win1.FonRedraw: 	      ;перерисовка области вывода
124
	mcall 9,ThreadInfo,-1
125
 
126
	mov eax,13
127
	mov ebx,[ThreadInfo+3Eh]
128
	inc ebx
129
	mov ecx,20
130
	shl ecx,16
131
	add ecx,[ThreadInfo+42h]
132
	sub ecx,19
133
	mov edx,clWhite
134
	int 40h
135
 
136
	call Perevod
137
	call NextPerev
138
jmp Win1.Events
139
 
140
;-------------------------------------------------------------------------------
141
 
142
Perevod:	      ;сам перевод
143
	mov edi,dict;[filBuffer]
144
 
145
    Perev:
146
	xor ebx,ebx
147
      @@:		  ;сравнием исх. слово со словом под esi
148
	mov al,[text+ebx]
149
	test al,al
150
	je endWord
151
	cmp [ebx+edi],al
152
	jne WordNotFound
153
	inc ebx
154
	jmp @b
155
 
156
  endWord:
157
	cmp byte[ebx+edi],20h
158
	jne WordNotFound
159
 
160
	add edi,ebx
161
	dec edi 	     ;пропускаем пробелы после английского слова
162
      @@:
163
	inc edi
164
	cmp byte[edi],20h
165
	je @b
166
 
167
	xor ebx,ebx
168
     CopyWord:		     ;копируем перевод в строку для вывода
169
	mov al,[edi+ebx]
170
	cmp al,0Dh
171
	je @f
172
	mov [perevText+ebx],al
173
	inc ebx
174
	jmp CopyWord
175
      @@:
176
	mov byte[perevText+ebx],0
177
 
178
	OutText 7,25,perevText
179
	ret
180
 
181
  WordNotFound: 	 ;если слово не подошло
182
	add edi,ebx
183
      @@:
184
	cmp byte[edi],0Dh
185
	je NextWord
186
	inc edi
187
	cmp edi,SizeDict;dword [fInfo+32]
188
	jae endPerev
189
	jmp @b
190
 
191
    NextWord:
192
	add edi,2
193
	cmp edi,SizeDict;dword [fInfo+32]
194
	jae endPerev
195
	jmp Perev
196
    endPerev:
197
	ret
198
 
199
 
200
;-------------------------------------------------------------------------------
201
NextPerev:
202
	mov ecx,Lines
203
	mov edi,dict;[filBuffer]
204
  LinePerev:	       ;цикл рисования строки
205
	xor ebx,ebx
206
      @@:		  ;сравнием исх. слово со словом под esi
207
	mov al,[text+ebx]
208
	test al,al
209
	je N_endWord
210
	cmp [ebx+edi],al
211
	jne N_WordNotFound
212
	inc ebx
213
	jmp @b
214
 
215
  N_endWord:
216
	cmp ebx,0
217
	jne N_Ppoisk
218
	ret
219
 
220
      N_Ppoisk: 	    ;поиск начала строки
221
	add edi,ebx
222
      @@:
223
	dec edi
224
	cmp byte[edi],0Ah
225
	jne @b
226
	inc edi
227
 
228
			     ;########пропускаем уже переведённое слово########
229
	xor ebx,ebx
230
    N_NoDouble:
231
	mov al,[text+ebx]
232
	test al,al
233
	je N_Double
234
	cmp [ebx+edi],al
235
	jne N_NoDblOk
236
	inc ebx
237
	jmp N_NoDouble
238
 
239
    N_Double:
240
	cmp byte[ebx+edi],20h
241
	jne N_NoDblOk
242
 
243
	add edi,ebx
244
      @@:
245
	inc edi
246
	cmp byte[edi],0Ah
247
	jne @b
248
	add edi,2
249
	jmp LinePerev
250
 
251
     N_NoDblOk: 	     ;############вывод результатов####################
252
	xor ebx,ebx	   ;копируем результат
253
     N_CopyWord:
254
	mov al,[edi+ebx]
255
	cmp al,20h
256
	je @f
257
	mov [perevText+ebx],al
258
	inc ebx
259
	jmp N_CopyWord
260
      @@:
261
	mov byte[perevText+ebx],0
262
	add edi,ebx
263
 
264
	mov eax,Lines
265
	sub eax,ecx
266
	dec eax
267
	shl eax,3
268
	add eax,45
269
	push ecx
270
	push edi
271
	OutText 7,ax,perevText
272
	pop edi
273
	pop ecx
274
 
275
      @@:
276
	inc edi
277
	cmp byte[edi],20h
278
	je @b
279
 
280
 
281
	xor ebx,ebx
282
     N_CopyPerev:
283
	mov al,[edi+ebx]
284
	cmp al,0Dh
285
	je @f
286
	mov [perevText+ebx],al
287
	inc ebx
288
	jmp N_CopyPerev
289
      @@:
290
	mov byte[perevText+ebx],0
291
 
292
	mov eax,Lines
293
	sub eax,ecx
294
	dec eax
295
	shl eax,3
296
	add eax,45
297
	push ecx
298
	push edi
299
	OutText 127,ax,perevText
300
	pop edi
301
	pop ecx
302
 
303
      @@:
304
	inc edi
305
	cmp byte[edi],0Ah
306
	jne @b
307
	inc edi
308
 
309
	loop @f      ;недотягивается до LinePerev
310
	ret
311
      @@:
312
	jmp LinePerev
313
 
314
  N_WordNotFound:
315
	add edi,ebx
316
      @@:
317
	cmp byte[edi],0Dh
318
	je N_NextWord
319
	inc edi
320
	cmp edi,SizeDict;dword [fInfo+32]
321
	jae N_endPerev
322
	jmp @b
323
 
324
    N_NextWord:
325
	add edi,2
326
	cmp edi,SizeDict;dword [fInfo+32]
327
	jae N_endPerev
328
	jmp LinePerev
329
    N_endPerev:
330
	ret
331
 
332
;-------------------------------------------------------------------------------
333
;-------------------------------------------------------------------------------
334
;------DATA---------------------------------------------------------------------
335
;-------------------------------------------------------------------------------
336
;-------------------------------------------------------------------------------
337
 
338
	idbExit = 1
339
 
340
	Lines	= 16	    ;количеств строк
341
 
342
	clTheme = 080B0FFh
343
 
344
	Win1.Caption	db 'Dictionary RUS -> ENG',0
345
	Win1X		= 524
346
	Win1Y		= 548
347
	Win1W		= 500
348
	Win1H		= 200
349
 
350
	Memo.X	= 5
351
	Memo.Y	= 20
352
	Memo.W	= 400
353
	Memo.H	= 370
354
 
355
	EditIN edit_box 350,5,5,0FFFFFFh,06F9480h,0,00h,0,40,\
356
			text,mouse_dd,ed_focus,0,0
357
 
358
 
359
 
360
;       msgNotFound:
361
;                       dw 0
362
;                       db 'Ошибка',0
363
;                       db 'Файл dictionary.wrd не найден',0
364
;                       db 'Ясно',0
365
;                       db 0
366
;
367
;       msgNotFound1:
368
;                       dw 0
369
;                       db '!!!',0
370
;                       db 'Ошибка чтения '
371
;                    NumErr:    db 0
372
;                               db 0
373
;                       db 'Ясно',0
374
;                       db 0
375
;
376
;       WordFile        db '.wrd',0
377
 
378
 
379
;-------------------------------------------------------------------------------
380
@IMPORT:
381
library box_lib,'box_lib.obj',msgbox,'msgbox.obj'
382
import	box_lib,\
383
	edit_box_draw,'edit_box',\
384
	edit_box_key,'edit_box_key';,\
385
	;edit_box_mouse,'edit_box_mouse'
386
import	msgbox,\
387
	mb_create,'mb_create'
388
 
389
dict:
390
include 'dictionary.wrd'
391
 
392
SizeDict = $;-dict
393
 
394
 
395
i_end:
396
;-------------------------------------------------------------------------------
397
 
398
	;WordFP		rb 1024
399
;        m1 dd 0
400
	;filBuffer	rd 1
401
 
402
 
403
	ThreadInfo:     rb 1024
404
	;pathprog
405
	mouse_dd	rd 1
406
	text		rb 40
407
	perevText	rb 300
408
	;fStruc		rb 30
409
	;fInfo		rb 40
410
	mbThread	rb 1024
411
 
412
 
413
	rb 4096
414
mem:
415