Rev 1803 | Go to most recent revision | 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] - координата ткнутого места |
||
124 | |||
125 | xor eax,eax |
||
126 | g11: ;1st cell====== |
||
127 | cmp word[px],92 |
||
128 | ja g12 ;>92 |
||
129 | cmp word[py],92 |
||
130 | ja g12 ;>92 |
||
131 | |||
132 | ;mov dword[idx],0 ;N=(0..8) |
||
133 | jmp puts |
||
134 | |||
135 | g12: ;2nd cell======== |
||
136 | inc al |
||
137 | cmp word[py],145 |
||
138 | ja g13 ;>142 |
||
139 | cmp word[px],92 |
||
140 | ja g13 ;>92 |
||
141 | ;mov dword[idx],1 ;N=(0..8) |
||
142 | jmp puts |
||
143 | g13: ;3========= |
||
144 | inc al |
||
145 | cmp word[px],92 |
||
146 | ja g21 ;>92 |
||
147 | ;mov dword[idx],2 ;N=(0..8) |
||
148 | jmp puts |
||
149 | g21: ;4======== |
||
150 | inc al |
||
151 | cmp word[px],145 |
||
152 | ja g22 |
||
153 | cmp word[py],92 |
||
154 | ja g22 |
||
155 | ;mov dword[idx],3 ;N=(0..8) |
||
156 | jmp puts |
||
157 | g22: ;5======= |
||
158 | inc al |
||
159 | cmp word[px],145 |
||
160 | ja g23 |
||
161 | cmp word[py],145 |
||
162 | ja g23 |
||
163 | ;mov dword[idx],4 ;N=(0..8) |
||
164 | jmp puts |
||
165 | g23: ;6======= |
||
166 | inc al |
||
167 | cmp word[px],142 |
||
168 | ja g31 ;>142 |
||
169 | ;mov dword[idx],5 ;N=(0..8) |
||
170 | jmp puts |
||
171 | g31: ;7======= |
||
172 | inc al |
||
173 | cmp word[py],92 |
||
174 | ja g32 |
||
175 | ;mov dword[idx],6 ;N=(0..8) |
||
176 | jmp puts |
||
177 | g32: ;8====== |
||
178 | inc al |
||
179 | cmp word[py],145 |
||
180 | ja g33 |
||
181 | ;mov dword[idx],7 ;N=(0..8) |
||
182 | jmp puts |
||
183 | g33: ;9====== |
||
184 | inc al |
||
185 | ;mov dword[idx],8 ;N=(0..8) |
||
186 | |||
187 | puts: ;уже определили клетку |
||
188 | push eax |
||
189 | pop dword[idx] |
||
190 | mov esi,dword[idx] ; |
||
191 | cmp byte[pox+esi],0 ;поле свободно? (0-свободное поле) |
||
192 | jne event_wait ;возвращаемся назад к циклу ожидания |
||
193 | |||
194 | shl esi,2 ;*4 |
||
195 | mov eax,dword[pole+esi] |
||
196 | mov dword[px],eax ;x coord from tabl ->px |
||
197 | ;mov ax,word[pole+esi+2] |
||
198 | ;mov word[py],ax ;y coord from tabl ->py |
||
199 | |||
200 | call x_put ;"X" |
||
201 | |||
202 | mov esi,dword[idx] ;esi - cell number =0..8 |
||
203 | mov byte[pox+esi],'x' |
||
204 | inc byte[fill] ;turn+1 |
||
205 | |||
206 | xor eax,eax ;eax=0 |
||
207 | inc eax ;bit=1 eax=1 |
||
208 | mov ecx,dword[idx] ; esi=n |
||
209 | shl ax,cl ; < |
||
210 | or word[poxl],ax ;set bit in [poxl] |
||
211 | |||
212 | call x_win ;проверка выигрыша Х |
||
213 | cmp byte[xwin],1 ;флаг победы установлен? |
||
214 | jne del5 ;нет - перескок на delay |
||
215 | |||
216 | mov eax,4 ; функ 4: написать текст 'WINNER!' |
||
217 | mov ebx,18*65536+215 ; [x нач] *65536 + [y нач] |
||
2734 | Albom | 218 | mov ecx, [colors+0x20] ; цвет текста RRGGBB |
1803 | yogev_ezra | 219 | mov edx,texts ; указатель на начало текста |
220 | mov esi,textend-texts ; длина текста в байтах |
||
221 | int 0x40 ; |
||
222 | jmp event_wait ; возвращаемся назад к циклу ожидания |
||
223 | |||
224 | ;=========================================================== |
||
225 | del5: mov eax,5 ;=== delay 0,5 sec === |
||
226 | mov ebx,50 |
||
227 | int 0x40 |
||
228 | |||
229 | cmp byte[fill],8 ;все поля заняты - ходить некуда |
||
230 | jnb event_wait ;возвращаемся назад к циклу ожидания - конец. |
||
231 | |||
232 | rnew: ; |
||
233 | call rndnext ; случайное число в eax |
||
234 | and eax, 0111b ; eax = 0..7 |
||
235 | mov esi,eax ; eax->esi |
||
236 | call rndnext ; случайное число в eax |
||
237 | and eax, 01b ; eax= 0..1 |
||
238 | add esi,eax ; esi+=eax |
||
239 | ;esi=0..8 - index |
||
240 | cmp byte[pox+esi],0 ;случайное поле свободно? |
||
241 | jne rnew ;нет - новое случайное число |
||
242 | |||
243 | cmp byte[pox+4],0 ;центр свободен? |
||
244 | jne @F ;нет - случайный ход (уже в esi) |
||
245 | mov esi,4 ;да - ходим в центр (4) вместо случ. |
||
246 | @@: |
||
247 | mov dword[idx],esi ;сохраним в idx |
||
248 | ;esi=0..8 - index |
||
2734 | Albom | 249 | call o_com ;проверка 24х комбинаций XX0 |
250 | call x_com ;проверка 24х комбинаций 00* |
||
1803 | yogev_ezra | 251 | |
252 | mov esi,dword[idx] ;idx-индекс клетки(0..8) куда ход |
||
253 | shl esi,2 ; esi*4 - поле состоит из записей по dword |
||
254 | mov eax,dword[pole+esi] ; |
||
255 | mov dword[px],eax ;x coord from tabl ->px |
||
256 | ; mov ax,word[pole+esi+2] ; |
||
257 | ; mov word[py],ax ;y coord from tabl ->py |
||
258 | call o_put ; рисуем нолик 'O' |
||
259 | |||
260 | mov esi,dword[idx] |
||
261 | mov byte[pox+esi],'o' |
||
262 | inc byte[fill] ;turn++ |
||
263 | |||
264 | xor eax,eax ;eax=0 |
||
265 | inc eax ;bit=1 eax=1 |
||
266 | mov ecx,dword[idx] ; ecx=n |
||
267 | shl ax,cl ; < |
||
268 | or word[pool],ax ;set bit in [pool] |
||
269 | |||
270 | call o_win |
||
271 | cmp byte[owin],1 |
||
272 | jne event_wait |
||
273 | |||
274 | mov eax,4 ; функ 4: написать текст 'LOOSER!' |
||
275 | mov ebx,48*65536+215 ; [x нач] *65536 + [y нач] |
||
2734 | Albom | 276 | mov ecx, [colors+0x20] ; цвет текста RRGGBB |
1803 | yogev_ezra | 277 | mov edx,lootxt ; указатель на начало текста |
278 | mov esi,text-lootxt ; длина текста в байтах |
||
279 | int 0x40 ; |
||
280 | jmp event_wait ; возвращаемся назад к циклу ожидания |
||
281 | ;===========================================-- |
||
282 | ; |
||
283 | } |
||
284 |