Subversion Repositories Kolibri OS

Rev

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