Subversion Repositories Kolibri OS

Rev

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