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 |