Rev 2734 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1803 | yogev_ezra | 1 | ;#************************** |
2 | ;#* X-0-X = MAIN() |
||
3 | ;#************************** 21/10/2007 |
||
4 | cB equ cBLACK |
||
5 | cW equ cWHITE |
||
6 | |||
7 | macro main_loop |
||
8 | { |
||
9 | |||
2734 | Albom | 10 | ; Получить стандартные цвета окон |
11 | ;======================================== |
||
12 | mov eax, 48 |
||
13 | mov ebx, 3 |
||
14 | mov ecx, colors |
||
15 | mov edx, 40 |
||
16 | int 0x40 |
||
17 | |||
18 | |||
19 | |||
1803 | yogev_ezra | 20 | ; функция отрисовки окна |
21 | ;======================================== |
||
22 | draw_window: |
||
23 | mov eax,12 ; функция 12: сообщить системе |
||
24 | mov ebx,1 ; подфункция 1, начало перерисовки |
||
25 | int 0x40 |
||
26 | ; ===== ОКНО !!! |
||
27 | mov eax,0 ; функция 0: определить и вывести окно |
||
28 | mov ebx,100*65536+250 ; [x начальный] *65536 + [x размер] |
||
29 | mov ecx,ebx ;,100*65536+250 ; [y начальный] *65536 + [y размер] |
||
2734 | Albom | 30 | mov edx, 0x34FFFFFF |
1803 | yogev_ezra | 31 | |
2734 | Albom | 32 | mov esi, 0x808899AA ; цвет заголовка RRGGBB |
33 | mov edi, caption ; заголовок |
||
1803 | yogev_ezra | 34 | int 0x40 |
2734 | Albom | 35 | |
1803 | yogev_ezra | 36 | ;-----------------------------------#----------------------------------------- |
37 | ; SCENE OF GAME - PLAY YARD - BOARD - DESK - PLAYING FIELD |
||
38 | ;--------------- |
||
39 | playing_field ;macro in macs.inc |
||
40 | ;------------------------------------------------------------------------------- |
||
41 | ; ----КНОПКИ---- |
||
42 | ;------------------------------------------------------------------------------- |
||
43 | ;buttons: |
||
44 | mov eax,8 ; |
||
2734 | Albom | 45 | mov ebx,200*65536+35 ; |
46 | mov ecx,15*65536+20 ; |
||
1803 | yogev_ezra | 47 | mov edx,200 ;== NEW GAME == |
2734 | Albom | 48 | mov esi, [colors+0x18] |
1803 | yogev_ezra | 49 | int 0x40 |
50 | ;-------------------------------------------- |
||
51 | mov eax,4 ; написать текст на кнопке NEW |
||
2734 | Albom | 52 | mov ebx,210*65536+20 |
53 | mov ecx,[colors+0x1C] |
||
1803 | yogev_ezra | 54 | mov edx,textend |
55 | mov esi,3 |
||
56 | int 0x40 |
||
57 | endbut: |
||
58 | mov eax,12 |
||
59 | mov ebx,2 |
||
60 | int 0x40 |
||
61 | ;============================= draw_window: END |
||
62 | event_wait: |
||
63 | mov eax,23 ;==СОБЫТИЯ== |
||
64 | mov ebx,100 ;ждать секунду |
||
65 | int 0x40 |
||
66 | ;------------------------------------------------------------------------------- |
||
67 | ; тип события возвращён в eax, далее проверяем, какое событие произошло |
||
68 | ;------------------------------------------------------------------------------- |
||
69 | cmp eax,1 ; запрос на перерисовку? |
||
70 | je redraw |
||
71 | cmp eax,2 ; нажата клавиша клавиатуры? |
||
72 | je key |
||
73 | cmp eax,3 ; нажата кнопка в окне программы? |
||
74 | je button |
||
75 | cmp eax,6 ; mouse - click or move? |
||
76 | je MOUSE |
||
77 | jmp event_wait ; возвращаемся к началу цикла ожидания событий |
||
78 | ; если событий нет |
||
79 | ;------------------------------------------------------------------------------- |
||
80 | ; обработка событий |
||
81 | ;------------------------------------------------------------------------------- |
||
82 | redraw: |
||
83 | call draw_window ; вызываем функцию draw_window и |
||
84 | jmp event_wait ; возвращаемся назад к циклу ожидания |
||
85 | key: |
||
86 | mov eax,2 ; считываем код нажатой клавиши. Возвращен в ah. |
||
87 | int 0x40 ; Клавиша должна быть прочитана для очистки |
||
88 | jmp event_wait ; возврат к event_wait |
||
89 | button: |
||
90 | mov eax,17 ; считываем идентификатор нажатой кнопки |
||
91 | int 0x40 ; возвращен в ah. |
||
92 | ;------------------------------------------------------------------------------- |
||
93 | ; смотрим, какая кнопка была нажата и соответствующим образом реагируем. |
||
94 | ;------------------------------------------------------------------------------- |
||
2734 | Albom | 95 | cmp ah, 1 ; кнопка с id=1 ("закрыть")? |
1803 | yogev_ezra | 96 | jne noclose ; |
97 | clos0: ; |
||
98 | mov eax,-1 ; функция -1: завершить программу |
||
99 | int 0x40 ; |
||
100 | noclose: ; кнопка id=200( "New" ) |
||
101 | mov dword[pox],0 |
||
102 | mov dword[pox+4],0 ;clear memory |
||
103 | mov dword[pox_],0 ;rest and other stuff |
||
104 | mov word[poxl],0 ; bits of pole X |
||
105 | mov word[pool],0 ; bits of pole O |
||
106 | ;mov byte[fill],0 ; обнуляем счетчик ходов |
||
107 | ;mov byte[xwin],0 ; flag - x winner |
||
108 | ;mov byte[owin],0 ; flag - o winner |
||
109 | jmp redraw ; чистое игровое поле ==>> |
||
110 | ;------------------------------------------------------------------------------- |
||
111 | ; смотрим, где была нажата мышь |
||
112 | ;------------------------------------------------------------------------------- |
||
113 | MOUSE: |
||
114 | mov eax,37 ; мышью.. |
||
115 | mov ebx,2 |
||
116 | int 0x40 |
||
117 | cmp eax,0 ; ..ничего не нажато - ждать событий |
||
118 | je event_wait |
||
119 | ;нажата кнопка мыши |
||
120 | mov eax,37 ; cursor coords |
||
121 | mov ebx,1 |
||
122 | int 0x40 ;eax=x*65536+y |
||
123 | mov [px],eax ;[px][py] - координата ткнутого места |
||
3457 | mario79 | 124 | |
125 | cmp [px],word 40 |
||
126 | jb event_wait |
||
127 | |||
128 | cmp [px],word 200 |
||
129 | ja event_wait |
||
130 | |||
131 | cmp [py],word 40 |
||
132 | jb event_wait |
||
133 | |||
134 | cmp [py],word 200 |
||
135 | ja event_wait |
||
1803 | yogev_ezra | 136 | |
137 | xor eax,eax |
||
138 | g11: ;1st cell====== |
||
139 | cmp word[px],92 |
||
140 | ja g12 ;>92 |
||
141 | cmp word[py],92 |
||
142 | ja g12 ;>92 |
||
143 | |||
144 | ;mov dword[idx],0 ;N=(0..8) |
||
145 | jmp puts |
||
146 | |||
147 | g12: ;2nd cell======== |
||
148 | inc al |
||
149 | cmp word[py],145 |
||
150 | ja g13 ;>142 |
||
151 | cmp word[px],92 |
||
152 | ja g13 ;>92 |
||
153 | ;mov dword[idx],1 ;N=(0..8) |
||
154 | jmp puts |
||
155 | g13: ;3========= |
||
156 | inc al |
||
157 | cmp word[px],92 |
||
158 | ja g21 ;>92 |
||
159 | ;mov dword[idx],2 ;N=(0..8) |
||
160 | jmp puts |
||
161 | g21: ;4======== |
||
162 | inc al |
||
163 | cmp word[px],145 |
||
164 | ja g22 |
||
165 | cmp word[py],92 |
||
166 | ja g22 |
||
167 | ;mov dword[idx],3 ;N=(0..8) |
||
168 | jmp puts |
||
169 | g22: ;5======= |
||
170 | inc al |
||
171 | cmp word[px],145 |
||
172 | ja g23 |
||
173 | cmp word[py],145 |
||
174 | ja g23 |
||
175 | ;mov dword[idx],4 ;N=(0..8) |
||
176 | jmp puts |
||
177 | g23: ;6======= |
||
178 | inc al |
||
179 | cmp word[px],142 |
||
180 | ja g31 ;>142 |
||
181 | ;mov dword[idx],5 ;N=(0..8) |
||
182 | jmp puts |
||
183 | g31: ;7======= |
||
184 | inc al |
||
185 | cmp word[py],92 |
||
186 | ja g32 |
||
187 | ;mov dword[idx],6 ;N=(0..8) |
||
188 | jmp puts |
||
189 | g32: ;8====== |
||
190 | inc al |
||
191 | cmp word[py],145 |
||
192 | ja g33 |
||
193 | ;mov dword[idx],7 ;N=(0..8) |
||
194 | jmp puts |
||
195 | g33: ;9====== |
||
196 | inc al |
||
197 | ;mov dword[idx],8 ;N=(0..8) |
||
198 | |||
199 | puts: ;уже определили клетку |
||
200 | push eax |
||
201 | pop dword[idx] |
||
202 | mov esi,dword[idx] ; |
||
203 | cmp byte[pox+esi],0 ;поле свободно? (0-свободное поле) |
||
204 | jne event_wait ;возвращаемся назад к циклу ожидания |
||
205 | |||
206 | shl esi,2 ;*4 |
||
207 | mov eax,dword[pole+esi] |
||
208 | mov dword[px],eax ;x coord from tabl ->px |
||
209 | ;mov ax,word[pole+esi+2] |
||
210 | ;mov word[py],ax ;y coord from tabl ->py |
||
211 | |||
212 | call x_put ;"X" |
||
213 | |||
214 | mov esi,dword[idx] ;esi - cell number =0..8 |
||
215 | mov byte[pox+esi],'x' |
||
216 | inc byte[fill] ;turn+1 |
||
217 | |||
218 | xor eax,eax ;eax=0 |
||
219 | inc eax ;bit=1 eax=1 |
||
220 | mov ecx,dword[idx] ; esi=n |
||
221 | shl ax,cl ; < |
||
222 | or word[poxl],ax ;set bit in [poxl] |
||
223 | |||
224 | call x_win ;проверка выигрыша Х |
||
225 | cmp byte[xwin],1 ;флаг победы установлен? |
||
226 | jne del5 ;нет - перескок на delay |
||
227 | |||
228 | mov eax,4 ; функ 4: написать текст 'WINNER!' |
||
229 | mov ebx,18*65536+215 ; [x нач] *65536 + [y нач] |
||
2734 | Albom | 230 | mov ecx, [colors+0x20] ; цвет текста RRGGBB |
1803 | yogev_ezra | 231 | mov edx,texts ; указатель на начало текста |
232 | mov esi,textend-texts ; длина текста в байтах |
||
233 | int 0x40 ; |
||
234 | jmp event_wait ; возвращаемся назад к циклу ожидания |
||
235 | |||
236 | ;=========================================================== |
||
237 | del5: mov eax,5 ;=== delay 0,5 sec === |
||
238 | mov ebx,50 |
||
239 | int 0x40 |
||
240 | |||
241 | cmp byte[fill],8 ;все поля заняты - ходить некуда |
||
242 | jnb event_wait ;возвращаемся назад к циклу ожидания - конец. |
||
243 | |||
244 | rnew: ; |
||
245 | call rndnext ; случайное число в eax |
||
246 | and eax, 0111b ; eax = 0..7 |
||
247 | mov esi,eax ; eax->esi |
||
248 | call rndnext ; случайное число в eax |
||
249 | and eax, 01b ; eax= 0..1 |
||
250 | add esi,eax ; esi+=eax |
||
251 | ;esi=0..8 - index |
||
252 | cmp byte[pox+esi],0 ;случайное поле свободно? |
||
253 | jne rnew ;нет - новое случайное число |
||
254 | |||
255 | cmp byte[pox+4],0 ;центр свободен? |
||
256 | jne @F ;нет - случайный ход (уже в esi) |
||
257 | mov esi,4 ;да - ходим в центр (4) вместо случ. |
||
258 | @@: |
||
259 | mov dword[idx],esi ;сохраним в idx |
||
260 | ;esi=0..8 - index |
||
2734 | Albom | 261 | call o_com ;проверка 24х комбинаций XX0 |
262 | call x_com ;проверка 24х комбинаций 00* |
||
1803 | yogev_ezra | 263 | |
264 | mov esi,dword[idx] ;idx-индекс клетки(0..8) куда ход |
||
265 | shl esi,2 ; esi*4 - поле состоит из записей по dword |
||
266 | mov eax,dword[pole+esi] ; |
||
267 | mov dword[px],eax ;x coord from tabl ->px |
||
268 | ; mov ax,word[pole+esi+2] ; |
||
269 | ; mov word[py],ax ;y coord from tabl ->py |
||
270 | call o_put ; рисуем нолик 'O' |
||
271 | |||
272 | mov esi,dword[idx] |
||
273 | mov byte[pox+esi],'o' |
||
274 | inc byte[fill] ;turn++ |
||
275 | |||
276 | xor eax,eax ;eax=0 |
||
277 | inc eax ;bit=1 eax=1 |
||
278 | mov ecx,dword[idx] ; ecx=n |
||
279 | shl ax,cl ; < |
||
280 | or word[pool],ax ;set bit in [pool] |
||
281 | |||
282 | call o_win |
||
283 | cmp byte[owin],1 |
||
284 | jne event_wait |
||
285 | |||
286 | mov eax,4 ; функ 4: написать текст 'LOOSER!' |
||
287 | mov ebx,48*65536+215 ; [x нач] *65536 + [y нач] |
||
2734 | Albom | 288 | mov ecx, [colors+0x20] ; цвет текста RRGGBB |
1803 | yogev_ezra | 289 | mov edx,lootxt ; указатель на начало текста |
290 | mov esi,text-lootxt ; длина текста в байтах |
||
291 | int 0x40 ; |
||
292 | jmp event_wait ; возвращаемся назад к циклу ожидания |
||
293 | ;===========================================-- |
||
294 | ; |
||
295 | } |
||
296 |