Rev 551 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
31 | halyavin | 1 | use32 |
1446 | diamond | 2 | db 'MENUET01' |
3 | dd 1 |
||
4 | dd start |
||
5 | dd i_end |
||
6 | dd mem |
||
7 | dd mem |
||
8 | dd 0 |
||
9 | dd 0 |
||
31 | halyavin | 10 | |
1446 | diamond | 11 | ; field size in items |
12 | FieldWidth = 10 |
||
13 | FieldHeight = 6 |
||
31 | halyavin | 14 | |
1446 | diamond | 15 | ; size of one picture in pixels |
16 | ImageWidth = 32 |
||
17 | ImageHeight = 32 |
||
31 | halyavin | 18 | |
1446 | diamond | 19 | ; size of one button in pixels |
20 | ButtonWidth = ImageWidth + 6 |
||
21 | ButtonHeight = ImageHeight + 6 |
||
31 | halyavin | 22 | |
1446 | diamond | 23 | SpaceWidth = ButtonWidth + 4 |
24 | SpaceHeight = ButtonHeight + 4 |
||
31 | halyavin | 25 | |
1446 | diamond | 26 | ; size of window in pixels |
27 | WindowWidth = 434 |
||
28 | WindowHeight = 291 ; excluding skin height |
||
31 | halyavin | 29 | |
1446 | diamond | 30 | if FieldWidth*FieldHeight mod 2 |
31 | error field size must be an even number! |
||
32 | end if |
||
31 | halyavin | 33 | |
1446 | diamond | 34 | draw_frame: |
35 | ; in: ebx=[xstart]*65536+[xsize],ecx=[ystart]*65536+[ysize],edx=color |
||
36 | ; ystart is relative to SkinHeight |
||
37 | ; out: nothing |
||
38 | ; destroys: eax,ecx |
||
39 | push 13 |
||
40 | pop eax |
||
41 | ror ecx, 16 |
||
42 | add ecx, [SkinHeight] |
||
43 | push ecx |
||
44 | shl ecx, 16 |
||
45 | inc ecx |
||
46 | int 0x40 ; ebx=[xstart]*65536+[xsize], ecx=[ystart]*65536+1 |
||
47 | ror ecx, 16 |
||
48 | add cx, [esp+2] |
||
49 | ror ecx, 16 |
||
50 | int 0x40 ; ebx=[xstart]*65536+[xsize], ecx=([ystart]+[ysize])*65536+1 |
||
51 | pop ecx |
||
52 | ror ecx, 16 |
||
53 | push ebx |
||
54 | mov bx, 1 |
||
55 | int 0x40 ; ebx=[xstart]*65536+1, ecx=[ystart]*65536+[ysize] |
||
56 | ror ebx, 16 |
||
57 | add bx, [esp] |
||
58 | ror ebx, 16 |
||
59 | inc ecx |
||
60 | int 0x40 ; ebx=([xstart]+[xsize])*65536+1, ecx=[ystart]*65536+([ysize]+1) |
||
61 | dec ecx |
||
62 | pop ebx |
||
63 | ret |
||
31 | halyavin | 64 | |
1446 | diamond | 65 | draw_button: |
66 | ; in: ebx=[xstart]*65536+[xsize],ecx=[ystart]*65536+[ysize],edx=button color,esi=id |
||
67 | ; ystart is relative to SkinHeight |
||
68 | ; out: nothing |
||
69 | ; destroys: eax |
||
70 | push edx |
||
71 | mov edx, 0x94AECE |
||
72 | call draw_frame |
||
73 | mov edx, 0xFFFFFF |
||
74 | push ebx |
||
75 | add ebx, 0xFFFF |
||
76 | push ecx |
||
77 | add ecx, 0x10000 |
||
78 | mov cx, 1 |
||
79 | int 0x40 ; ebx=([xstart]+1)*65536+([xsize]-1), ecx=([ystart]+1)*65536+1 |
||
80 | pop ecx |
||
81 | mov edx, 0xC0C0C0 |
||
82 | dec ebx |
||
83 | push ecx |
||
84 | shr ecx, 16 |
||
85 | add ecx, [esp] |
||
86 | dec ecx |
||
87 | shl ecx, 16 |
||
88 | inc ecx |
||
89 | int 0x40 ; ebx=([xstart]+1)*65536+([xsize]-2), ecx=([ystart]+[ysize]-1)*65536+1 |
||
90 | pop ecx |
||
91 | mov edx, 0xFFFFFF |
||
92 | push ecx |
||
93 | add ecx, 0xFFFF |
||
94 | push ebx |
||
95 | mov bx, 1 |
||
96 | int 0x40 ; ebx=([xstart]+1)*65536+1, ecx=([ystart]+1)*65536+([ysize]-1) |
||
97 | pop ebx |
||
98 | push ebx |
||
99 | shr ebx, 16 |
||
100 | add ebx, [esp] |
||
101 | shl ebx, 16 |
||
102 | inc ebx |
||
103 | mov edx, 0xC0C0C0 |
||
104 | add ecx, 0xFFFF |
||
105 | int 0x40 ; ebx=([xstart]+[xsize]-1)*65536+1, ecx=([ystart]+2)*65536+([ysize]-2) |
||
106 | pop ebx |
||
107 | pop ecx |
||
108 | pop ebx |
||
109 | pop edx |
||
110 | push ebx ecx |
||
111 | add ebx, 20000h - 3 |
||
112 | add ecx, 20000h - 3 |
||
113 | int 0x40 |
||
114 | pop ecx ebx |
||
115 | push edx |
||
116 | mov edx, esi |
||
117 | or edx, 0x80000000 |
||
118 | mov al, 8 |
||
119 | int 0x40 |
||
120 | mov edx, esi |
||
121 | or edx, 0x40000000 |
||
122 | int 0x40 |
||
123 | pop edx |
||
124 | ret |
||
31 | halyavin | 125 | |
1446 | diamond | 126 | ;digits_ptr dd 0 |
127 | ;digits_str rb 11 |
||
31 | halyavin | 128 | |
1446 | diamond | 129 | ;images: |
130 | ; file 'mblocks.raw' |
||
131 | images: |
||
132 | file 'mblocksi.raw' |
||
133 | palette: |
||
134 | file 'mblocksp.raw' |
||
31 | halyavin | 135 | |
1446 | diamond | 136 | aNewGame_ru db 'Новая игра(F2)',0 |
137 | aCount_ru db ' Счет:',0 |
||
138 | aRu db 'RU',0 |
||
139 | aNewGame_en db 'New game (F2)',0 |
||
140 | aCount_en db 'Count:',0 |
||
141 | aEn db 'EN',0 |
||
31 | halyavin | 142 | |
1446 | diamond | 143 | CurLanguage db 0 ; 0=russian, 1=english |
31 | halyavin | 144 | |
1446 | diamond | 145 | field_status rb 60 ; status of field elements: 0=closed, 1=temporarily opened, 2=permanently opened |
146 | field_items rb 60 ; items in field |
||
31 | halyavin | 147 | |
1446 | diamond | 148 | count dd 0 |
31 | halyavin | 149 | |
1446 | diamond | 150 | start: |
151 | push 26 |
||
152 | pop eax |
||
153 | push 5 |
||
154 | pop ebx |
||
155 | int 0x40 |
||
156 | cmp eax, 4 |
||
157 | setnz [CurLanguage] |
||
158 | call generate |
||
159 | ; get skin height |
||
160 | push 48 |
||
161 | pop eax |
||
162 | push 4 |
||
163 | pop ebx |
||
164 | int 0x40 |
||
165 | mov [SkinHeight], eax |
||
166 | ; no previous click |
||
167 | mov eax, 0xBAD |
||
168 | mov [FirstClick], eax |
||
169 | mov [SecondClick], eax |
||
170 | ; draw window |
||
171 | redraw: |
||
172 | call draw_window |
||
173 | ; events loop |
||
174 | evloop: |
||
175 | push 10 |
||
176 | pop eax |
||
177 | int 0x40 |
||
178 | dec eax |
||
179 | jz redraw |
||
180 | dec eax |
||
181 | jz key |
||
182 | mov al, 17 |
||
183 | int 0x40 |
||
184 | shr eax, 8 |
||
185 | ; cmp eax, 6 |
||
186 | ; jz set_lang |
||
187 | cmp eax, 5 |
||
188 | jz new_game |
||
189 | cmp eax, 1 |
||
190 | jnz field_pressed |
||
191 | push -1 |
||
192 | pop eax |
||
193 | int 0x40 |
||
194 | key: |
||
195 | mov al, 2 |
||
196 | int 0x40 |
||
197 | cmp ah, '3' ; F2? |
||
198 | jnz evloop |
||
199 | new_game: |
||
200 | mov edi, field_status |
||
201 | mov ecx, FieldWidth*FieldHeight/2 |
||
202 | xor eax, eax |
||
203 | rep stosd |
||
204 | mov [count], eax |
||
205 | mov eax, 0xBAD |
||
206 | mov [FirstClick], eax |
||
207 | mov [SecondClick], eax |
||
208 | call generate |
||
209 | call draw_field |
||
210 | @@: |
||
211 | call draw_aux |
||
212 | jmp evloop |
||
213 | ;set_lang: |
||
214 | ; xor [CurLanguage], 1 |
||
215 | ; jmp @b |
||
216 | field_pressed: |
||
217 | sub eax, 100 |
||
218 | cmp [field_status+eax], 0 |
||
219 | jnz cont |
||
220 | mov ebx, [FirstClick] |
||
221 | mov ecx, [SecondClick] |
||
222 | cmp ebx, 0xBAD |
||
223 | jz first_click |
||
224 | cmp ecx, 0xBAD |
||
225 | jz second_click |
||
226 | mov dl, [field_items+ecx] |
||
227 | cmp [field_items+ebx], dl |
||
228 | jnz dont_match |
||
229 | mov [field_status+ebx], 2 |
||
230 | mov [field_status+ecx], 2 |
||
231 | jmp @f |
||
232 | dont_match: |
||
233 | mov [field_status+ebx], 0 |
||
234 | mov [field_status+ecx], 0 |
||
235 | @@: |
||
236 | push eax ecx |
||
237 | mov eax, ebx |
||
238 | call draw_field_item |
||
239 | pop eax |
||
240 | call draw_field_item |
||
241 | mov [SecondClick], 0xBAD |
||
242 | pop eax |
||
243 | mov [FirstClick], eax |
||
244 | jmp @f |
||
245 | second_click: |
||
246 | cmp [FirstClick], eax |
||
247 | jz cont |
||
248 | mov [SecondClick], eax |
||
249 | @@: |
||
250 | mov [field_status+eax], 1 |
||
251 | call draw_field_item |
||
252 | inc [count] |
||
253 | cont: |
||
254 | call draw_count |
||
255 | jmp evloop |
||
256 | first_click: |
||
257 | mov [FirstClick], eax |
||
258 | jmp @b |
||
31 | halyavin | 259 | |
260 | draw_window: |
||
1446 | diamond | 261 | push 48 |
262 | pop eax |
||
263 | push 3 |
||
264 | pop ebx |
||
265 | mov ecx, color_table |
||
266 | push 4*10 |
||
267 | pop edx |
||
268 | int 0x40 ; get color table |
||
269 | push 12 |
||
270 | pop eax |
||
271 | push 1 |
||
272 | pop ebx |
||
273 | int 0x40 ; start redraw |
||
274 | push ebx |
||
275 | xor eax, eax |
||
276 | mov ebx, 100*65536 + WindowWidth |
||
277 | mov ecx, 100*65536 + WindowHeight |
||
278 | add ecx, [SkinHeight] |
||
279 | mov edx, 4C0C0C0h |
||
280 | int 0x40 ; define window |
||
281 | mov al, 71 |
||
282 | pop ebx |
||
283 | mov ecx, caption |
||
284 | int 0x40 ; set caption |
||
285 | call draw_aux |
||
286 | call draw_field |
||
287 | push 12 |
||
288 | pop eax |
||
289 | push 2 |
||
290 | pop ebx |
||
291 | int 0x40 |
||
292 | ret |
||
31 | halyavin | 293 | |
1446 | diamond | 294 | caption db 'Memory Blocks L&V Edition',0 |
31 | halyavin | 295 | |
1446 | diamond | 296 | generate: |
297 | ; generate random field |
||
298 | xor edi, edi |
||
299 | .loop: |
||
300 | call random |
||
301 | cmp [field_items+edx], 0 |
||
302 | jnz .loop |
||
303 | mov eax, edi |
||
304 | shr eax, 1 |
||
305 | inc eax |
||
306 | mov [field_items+edx], al |
||
307 | inc edi |
||
308 | cmp edi, FieldWidth*FieldHeight |
||
309 | jb .loop |
||
310 | ret |
||
31 | halyavin | 311 | |
1446 | diamond | 312 | draw_field_item: |
313 | ; in: eax=field item |
||
314 | ; out: nothing |
||
315 | ; destroys: eax,ebx,ecx,edx,esi |
||
316 | mov esi, eax |
||
317 | lea edx, [eax+0x80000000+100] |
||
318 | push 8 |
||
319 | pop eax |
||
320 | int 0x40 ; delete old button |
||
321 | mov ebx, [xstart+esi*4] |
||
322 | shl ebx, 16 |
||
323 | mov bl, ButtonWidth |
||
324 | mov ecx, [ystart+esi*4] |
||
325 | add ecx, [SkinHeight] |
||
326 | shl ecx, 16 |
||
327 | mov cl, ButtonHeight |
||
328 | lea edx, [esi+0x40000000+100] |
||
329 | int 0x40 ; define new button |
||
330 | ror ecx, 16 |
||
331 | sub ecx, [SkinHeight] |
||
332 | ror ecx, 16 |
||
333 | mov al, [field_status+esi] |
||
334 | dec eax |
||
335 | js draw_closed_item |
||
336 | jz draw_current_item |
||
337 | draw_opened_item: |
||
338 | mov edx, 0x94AECE |
||
339 | call draw_frame |
||
340 | mov edx, 0xEFEBEF |
||
341 | add ebx, 0xFFFF |
||
342 | add ecx, 0xFFFF |
||
343 | mov al, 13 |
||
344 | int 0x40 |
||
345 | jmp draw_item_image |
||
346 | draw_current_item: |
||
347 | push ebx ecx |
||
348 | mov edx, 0x94AECE |
||
349 | call draw_frame |
||
350 | pop ecx ebx |
||
351 | add ebx, 10000h |
||
352 | add ecx, 10000h |
||
353 | push ebx ecx |
||
354 | mov bl, ButtonWidth-2 |
||
355 | mov cl, ButtonHeight-2 |
||
356 | mov edx, 0x94DB00 |
||
357 | call draw_frame |
||
358 | pop ecx ebx |
||
359 | add ebx, 10000h |
||
360 | add ecx, 10000h |
||
361 | mov bl, ButtonWidth-4 |
||
362 | mov cl, ButtonHeight-4 |
||
363 | mov edx, 0x94DB00 |
||
364 | call draw_frame |
||
365 | add ebx, 10000h |
||
366 | add ecx, 10000h |
||
367 | mov bl, ButtonWidth-5 |
||
368 | mov cl, ButtonHeight-5 |
||
369 | mov edx, 0xEFEBEF |
||
370 | int 0x40 |
||
371 | draw_item_image: |
||
372 | ; push 7 |
||
373 | ; pop eax |
||
374 | ; movzx ebx, [field_items+esi] |
||
375 | ; dec ebx |
||
376 | ; imul ebx, ImageWidth*ImageHeight*3 |
||
377 | ; add ebx, images |
||
378 | ; mov ecx, ImageWidth*10000h+ImageHeight |
||
379 | ; mov edx, [xstart+esi*4] |
||
380 | ; shl edx, 16 |
||
381 | ; add edx, [ystart+esi*4] |
||
382 | ; add edx, 3*10001h |
||
383 | ; add edx, [SkinHeight] |
||
384 | ; int 0x40 |
||
385 | push 65 |
||
386 | pop eax |
||
387 | movzx ebx, [field_items+esi] |
||
388 | dec ebx |
||
389 | imul ebx, ImageWidth*ImageHeight |
||
390 | add ebx, images |
||
391 | mov ecx, ImageWidth*10000h+ImageHeight |
||
392 | mov edx, [xstart+esi*4] |
||
393 | shl edx, 16 |
||
394 | add edx, [ystart+esi*4] |
||
395 | add edx, 3*10001h |
||
396 | add edx, [SkinHeight] |
||
397 | push 8 |
||
398 | pop esi |
||
399 | mov edi, palette |
||
400 | xor ebp, ebp |
||
401 | int 0x40 |
||
402 | ret |
||
403 | draw_closed_item: |
||
404 | mov edx, 0x94AECE |
||
405 | call draw_frame |
||
406 | push 38 |
||
407 | pop eax |
||
408 | shr ebx, 16 |
||
409 | inc ebx |
||
410 | imul ebx, 0x10001 |
||
411 | push ebx |
||
412 | add ebx, ButtonWidth-2 |
||
413 | shr ecx, 16 |
||
414 | inc ecx |
||
415 | imul ecx, 0x10001 |
||
416 | mov edx, 0xFFFFFF |
||
417 | int 0x40 |
||
418 | pop ebx |
||
419 | push ecx |
||
420 | add ecx, ButtonHeight-3 |
||
421 | int 0x40 |
||
422 | pop ecx |
||
423 | push ebx ecx |
||
424 | add ebx, ButtonWidth-2 |
||
425 | shr ecx, 16 |
||
426 | add ecx, ButtonHeight-2 |
||
427 | imul ecx, 0x10001 |
||
428 | mov edx, 0xDEDEDE |
||
429 | int 0x40 |
||
430 | pop ecx |
||
431 | push ecx |
||
432 | movzx ebx, bx |
||
433 | imul ebx, 0x10001 |
||
434 | add ecx, 10000h+ButtonHeight-3 |
||
435 | int 0x40 |
||
436 | pop ecx ebx |
||
437 | add ebx, 10000h |
||
438 | mov bx, ButtonWidth-3 |
||
439 | add ecx, 10000h |
||
440 | mov cx, ButtonHeight-3 |
||
441 | mov al, 13 |
||
442 | mov edx, 0xBDC7D6 |
||
443 | int 0x40 |
||
444 | ret |
||
31 | halyavin | 445 | |
1446 | diamond | 446 | draw_field: |
447 | xor ebx, ebx |
||
448 | xor ecx, ecx |
||
449 | mov edi, xstart |
||
450 | .loop: |
||
451 | mov eax, ebx |
||
452 | imul eax, SpaceWidth |
||
453 | add eax, 9 |
||
454 | stosd |
||
455 | mov eax, ecx |
||
456 | imul eax, SpaceHeight |
||
457 | add eax, 4 |
||
458 | mov [edi+ystart-xstart-4], eax |
||
459 | lea eax, [edi-xstart-4] |
||
460 | shr eax, 2 |
||
461 | push ebx ecx edi |
||
462 | call draw_field_item |
||
463 | pop edi ecx ebx |
||
464 | inc ecx |
||
465 | cmp ecx, FieldHeight |
||
466 | jb .loop |
||
467 | xor ecx, ecx |
||
468 | inc ebx |
||
469 | cmp ebx, FieldWidth |
||
470 | jb .loop |
||
471 | ret |
||
31 | halyavin | 472 | |
1446 | diamond | 473 | draw_aux: |
474 | push 13 |
||
475 | pop eax |
||
476 | mov ebx, 5*65536 + 425 |
||
477 | mov ecx, [SkinHeight] |
||
478 | shl ecx, 16 |
||
479 | add ecx, 256*65536 + 1 |
||
480 | mov edx, 0xFFFFFF |
||
481 | int 0x40 |
||
482 | add ecx, 1*65536 + 29 |
||
483 | mov edx, [color_table+5*4] |
||
484 | int 0x40 |
||
485 | push 8 |
||
486 | pop eax |
||
487 | mov ebx, 14*65536 + 107 |
||
488 | add ecx, 3*65536 - 7 |
||
489 | push 5 |
||
490 | pop edx |
||
491 | mov esi, [color_table+6*4] |
||
492 | int 0x40 |
||
493 | push 4 |
||
494 | pop eax |
||
495 | mov ebx, 27*65536 + 268 |
||
496 | add ebx, [SkinHeight] |
||
497 | mov ecx, [color_table+7*4] |
||
498 | or ecx, 0x80000000 |
||
499 | mov edx, aNewGame_ru |
||
500 | cmp [CurLanguage], 0 |
||
501 | jz @f |
||
502 | mov edx, aNewGame_en |
||
503 | @@: |
||
504 | int 0x40 |
||
505 | mov ebx, 155*65536 + 268 |
||
506 | add ebx, [SkinHeight] |
||
507 | mov ecx, [color_table+8*4] |
||
508 | or ecx, 0x80000000 |
||
509 | mov edx, aCount_ru |
||
510 | cmp [CurLanguage], 0 |
||
511 | jz @f |
||
512 | mov edx, aCount_en |
||
513 | @@: |
||
514 | int 0x40 |
||
515 | call draw_count |
||
516 | mov al, 13 |
||
517 | mov ecx, [SkinHeight] |
||
518 | shl ecx, 16 |
||
519 | mov ebx, 405*65536 + 2 |
||
520 | add ecx, 265*65536 + 2 |
||
521 | mov edx, 0xBDCBDE |
||
522 | int 0x40 |
||
523 | mov ebx, 403*65536 + 6 |
||
524 | add ecx, (270*65536 + 6) - (265*65536 + 2) |
||
525 | int 0x40 |
||
526 | mov ebx, 411*65536 + 6 |
||
527 | add ecx, (275*65536 + 6) - (270*65536 + 6) |
||
528 | int 0x40 |
||
529 | mov ebx, 412*65536 + 9 |
||
530 | add ecx, (262*65536 + 8) - (275*65536 + 6) |
||
531 | mov edx, 0xD6D7CE |
||
532 | int 0x40 |
||
533 | ret |
||
31 | halyavin | 534 | |
1446 | diamond | 535 | draw_count: |
536 | mov edi, string_for_number+15 |
||
537 | mov eax, [count] |
||
538 | push 10 |
||
539 | pop ecx |
||
540 | @@: |
||
541 | xor edx, edx |
||
542 | div ecx |
||
543 | dec edi |
||
544 | add dl, '0' |
||
545 | mov [edi], dl |
||
546 | test eax, eax |
||
547 | jnz @b |
||
548 | mov al, 4 |
||
549 | mov ebx, [SkinHeight] |
||
550 | add ebx, 195*65536 + 268 |
||
551 | mov ecx, [color_table+8*4] |
||
552 | or ecx, 0xC0000000 |
||
553 | mov edx, edi |
||
554 | mov edi, [color_table+5*4] |
||
555 | int 0x40 |
||
556 | ret |
||
31 | halyavin | 557 | |
1446 | diamond | 558 | random: |
559 | ; in: nothing |
||
560 | ; out: edx = random value in [0..FieldWidth*FieldHeight-1] |
||
561 | ; destroys: eax,ecx,edx |
||
562 | rdtsc |
||
563 | xor edx, eax |
||
564 | not edx |
||
565 | mov eax, [RandSeed] |
||
566 | ror eax, 3 |
||
567 | xor eax, 0DEADBEEFh |
||
568 | add eax, edx |
||
569 | mov [RandSeed], eax |
||
570 | add eax, edx |
||
571 | xor edx, edx |
||
572 | push FieldWidth*FieldHeight |
||
573 | pop ecx |
||
574 | div ecx |
||
575 | ret |
||
31 | halyavin | 576 | |
1446 | diamond | 577 | i_end: |
31 | halyavin | 578 | |
1446 | diamond | 579 | SkinHeight dd ? |
580 | color_table rd 10 |
||
581 | RandSeed dd ? |
||
582 | FirstClick dd ? |
||
583 | SecondClick dd ? |
||
584 | string_for_number rb 16 |
||
585 | xstart rd 60 |
||
586 | ystart rd 60 |
||
31 | halyavin | 587 | |
1446 | diamond | 588 | align 1000h |
589 | stk rb 1000h |
||
590 | mem: |