Subversion Repositories Kolibri OS

Rev

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