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