Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1803 | yogev_ezra | 1 | ;************************************ |
2 | ;******** МАКРОСЫ ******************* |
||
3 | ;************************************ |
||
4 | ;------------------------------------ |
||
5 | ; constants |
||
6 | ;-----------------------цвет:0xRRGGBB |
||
7 | cBLACK = 0x000000 ; черный |
||
8 | cRED = 0xFF0000 ; красный |
||
9 | cYELLOW = 0xFFFF00 ; желтый |
||
10 | cGREEN = 0x00FF00 ; зеленый |
||
11 | cNAVY = 0x0000FF ; синий |
||
12 | cMAGENTA = 0xFF00FF ; малиновый |
||
13 | cBLUE = 0x00FFFF ; голубой |
||
14 | cWHITE = 0xFFFFFF ; белый |
||
15 | cBROWN = 0x554433 ; коричневый |
||
16 | |||
17 | ;------------------------------- |
||
18 | cMAGENTAl = 0xB800B8 ; magenta light |
||
19 | cVIOLETl = 0xF800F8 ; фиолетовый светл |
||
20 | |||
21 | macro BeginProgram |
||
22 | { |
||
23 | use32 |
||
24 | org 0x0 |
||
25 | |||
26 | db 'MENUET01' |
||
27 | dd 0x01 |
||
28 | dd __start |
||
29 | dd __end |
||
30 | dd 0x10000 ;__memory |
||
31 | dd 0x10000 ;__stack |
||
32 | dd 0x0 ; dd __params |
||
33 | dd 0x0 |
||
34 | __start: |
||
35 | } |
||
36 | |||
37 | macro EndProgram |
||
38 | { |
||
39 | align 32 |
||
40 | rb 256 |
||
41 | __end: |
||
42 | ;org 0x10000 |
||
43 | __stack: |
||
44 | __memory: |
||
45 | } |
||
46 | |||
47 | |||
48 | macro LoopBegin lab,begi |
||
49 | { |
||
50 | push ecx ; ECX->STACK store old |
||
51 | mov ecx,begi |
||
52 | lab: |
||
53 | push ecx ; ECX->STACK counter store |
||
54 | } |
||
55 | |||
56 | macro LoopEnd lab,endi |
||
57 | { |
||
58 | pop ecx ;ECX<-STACK counter restore |
||
59 | inc ecx |
||
60 | cmp ecx,endi |
||
61 | jne lab |
||
62 | pop ecx ;ECX<-STACK restore old |
||
63 | } |
||
64 | |||
65 | macro SetEventMask mmm |
||
66 | { |
||
67 | mov eax,40 |
||
68 | mov ebx,mmm |
||
69 | int 0x40 |
||
70 | } |
||
71 | |||
72 | macro Subroutines |
||
73 | { |
||
74 | ;------------------------------------------------------------------------------ |
||
75 | rndseed: |
||
76 | mov eax,26 |
||
77 | mov ebx,9 |
||
78 | int 0x40 |
||
79 | mov dword[seed],eax |
||
80 | ret |
||
81 | rndnext: |
||
82 | mov eax,3 |
||
83 | int 0x40 |
||
84 | shr eax,16 |
||
85 | add eax,dword[seed] |
||
86 | ; not eax |
||
87 | ror eax,3 |
||
88 | xor eax,0xdeadbeef |
||
89 | mov dword[seed],eax |
||
90 | ret |
||
91 | ;============0========== word[px],word[py] |
||
92 | o_put: |
||
93 | mov ax,word[px] |
||
94 | shl eax,16 ;*65536 |
||
95 | add eax,35 ;+35 |
||
96 | mov ebx,eax ;posX*65536+dX ; [x0] *65536 + [dx] |
||
97 | mov ax,word[py] ; |
||
98 | shl eax,16 ;*65536 |
||
99 | add eax,35 ;+35 |
||
100 | mov ecx,eax ;posY*65536+dY ; [y0] *65536 + [dy] |
||
101 | mov edx,cB |
||
102 | mov eax,13 ; функция 13 - box |
||
103 | int 0x40 ;BLACK BOX--------------- |
||
104 | |||
105 | mov ax,word[px] |
||
106 | inc ax ;+1 |
||
107 | inc ax ;+1 |
||
108 | shl eax,16 ;*65536 |
||
109 | add eax,31 ;3 ;+35 |
||
110 | mov ebx,eax ;posX*65536+dX ; [x0] *65536 + [dx] |
||
111 | |||
112 | mov ax,word[py] |
||
113 | add eax,2 |
||
114 | ;inc eax |
||
115 | ;inc eax |
||
116 | shl eax,16 |
||
117 | add eax,31 ;3 ;-2 |
||
118 | mov ecx,eax ;posY*65536+dY ; [y0] *65536 + [dy] |
||
119 | mov edx,cW |
||
120 | mov eax,13 ; функция 13 - box |
||
121 | int 0x40 ;WHITE BOX---------- |
||
122 | ret |
||
123 | ;============X========== |
||
124 | x_put: |
||
125 | ;xor eax,eax |
||
126 | mov ax,word[px] |
||
127 | shl eax,16 ;*65536 |
||
128 | add ax,word[px] |
||
129 | add eax,35 ;+35 |
||
130 | mov ebx,eax ;posX*65536+dX |
||
131 | |||
132 | xor eax,eax |
||
133 | mov ax,word[py] |
||
134 | shl eax,16 ;*65536 |
||
135 | add ax,word[py] |
||
136 | add eax,35 ;+35 |
||
137 | mov ecx,eax ;posX*65536+dX |
||
138 | mov edx,cB |
||
139 | mov eax,38 ; функция 38 - line \ |
||
140 | int 0x40 |
||
141 | ;------------------------------xx |
||
142 | xor eax,eax |
||
143 | mov ax,word[px] |
||
144 | inc eax |
||
145 | shl eax,16 ;*65536 |
||
146 | add ax,word[px] |
||
147 | add eax,36 ;+35+1 |
||
148 | mov ebx,eax ;posX*65536+dX |
||
149 | xor eax,eax |
||
150 | mov ax,word[py] |
||
151 | shl eax,16 ;*65536 |
||
152 | add ax,word[py] |
||
153 | add eax,35 ;+35 |
||
154 | mov ecx,eax ;posX*65536+dX ; [x0] *65536 + [dx] |
||
155 | mov edx,cB |
||
156 | mov eax,38 ; функция 38 - line \\ |
||
157 | int 0x40 |
||
158 | ;--------------------------------- |
||
159 | xor eax,eax |
||
160 | mov ax,word[px] |
||
161 | shl eax,16 ;*65536 |
||
162 | mov ebx,eax ;posX*65536 = .BX |
||
163 | |||
164 | xor eax,eax |
||
165 | mov ax,word[px] |
||
166 | add eax,35 |
||
167 | add ebx,eax ;---------------------------BX |
||
168 | |||
169 | xor eax,eax |
||
170 | mov ax,word[py] |
||
171 | add eax,35 |
||
172 | shl eax,16 ;*65536 |
||
173 | add ax,word[py] ;+y |
||
174 | mov ecx,eax ;(posY+35)*65536+posY = .CX |
||
175 | mov edx,cB ; цвет : черный |
||
176 | mov eax,38 ; функция 38 - line / |
||
177 | int 0x40 |
||
178 | ;---------------------------------------- |
||
179 | xor eax,eax |
||
180 | mov ax,word[px] |
||
181 | inc ax |
||
182 | shl eax,16 ;*65536 |
||
183 | mov ebx,eax ;posX*65536 = .BX |
||
184 | |||
185 | xor eax,eax |
||
186 | mov ax,word[px] |
||
187 | add eax,36 ;+35+1 |
||
188 | add ebx,eax ;---------------------------BX |
||
189 | |||
190 | xor eax,eax |
||
191 | mov ax,word[py] |
||
192 | add eax,35 |
||
193 | shl eax,16 ;*65536 |
||
194 | add ax,word[py] ;+y |
||
195 | mov ecx,eax ;(posY+35)*65536+posY = .CX |
||
196 | mov edx,cB |
||
197 | mov eax,38 ; функция 38 - line // |
||
198 | int 0x40 |
||
199 | ret |
||
200 | ;------------------------------------ПРОВЕРКА Hа выигрышную ситуацию-----x |
||
201 | x_win: xor ecx,ecx |
||
202 | xor ebx,ebx |
||
203 | xor eax,eax |
||
204 | lx0: mov bx,word[poxl] ;сравнить текущую ситуацию на поле X |
||
205 | mov esi,ecx |
||
206 | shl esi,1 ;*2 |
||
207 | mov ax,word[oxwall+esi] ; next pattern |
||
208 | and ebx,eax ;с победными , если хоть одна совпадает - |
||
209 | sub eax,ebx |
||
210 | jz wx ;победа -> set byte xwin=1 |
||
211 | inc ecx |
||
212 | cmp ecx,8 ;цикл ecx < 8 |
||
213 | jb lx0 |
||
214 | g00: ;нет совпадений |
||
215 | ret |
||
216 | wx: |
||
217 | inc byte[xwin] ;mov byte[xwin],1 |
||
218 | ret |
||
219 | ;------------------------------------ПРОВЕРКА Hа выигрышную ситуацию-----0 |
||
220 | o_win: xor ecx,ecx |
||
221 | xor ebx,ebx |
||
222 | xor eax,eax |
||
223 | lo0: mov bx,word[pool] ;сравнить текущую ситуацию на поле O |
||
224 | mov esi,ecx |
||
225 | shl esi,1 ;*2 |
||
226 | mov ax,word[oxwall+esi] ; next pattern |
||
227 | and ebx,eax ;с победными , если хоть одна совпадает - |
||
228 | sub eax,ebx |
||
229 | jz wo ;победа -> set byte owin=1 |
||
230 | inc ecx |
||
231 | cmp ecx,8 ;цикл |
||
232 | jb lo0 |
||
233 | ret |
||
234 | wo: inc byte[owin] ;mov byte[owin],1 |
||
235 | ret |
||
236 | ;==================================COmbinations -0- ============= |
||
237 | o_com: xor ecx,ecx |
||
238 | xor ebx,ebx |
||
239 | xor eax,eax |
||
240 | l000: mov bx,word[poxl] ; текущую ситуацию на поле X |
||
241 | ; or bx,word[pool] ;+ текущую ситуацию на поле O |
||
242 | mov esi,ecx |
||
243 | shl esi,2 ;*4 -сдвиг -слов |
||
244 | mov ax,word[prav+esi] ; следующее правило |
||
245 | and ebx,eax ; если не совпадает - |
||
246 | sub eax,ebx |
||
247 | jnz @F ;next ecx |
||
248 | xor eax,eax |
||
249 | xor ebx,ebx |
||
250 | mov ax,word[prav+esi+2] ;esi<-из таблицы правил |
||
251 | mov bl,byte[pox+eax] |
||
252 | cmp ebx,0 ;empty? |
||
253 | je g00d |
||
254 | @@: |
||
255 | inc ecx |
||
256 | cmp ecx,24 ;цикл до 24 |
||
257 | jb l000 |
||
258 | ret ;нет совпадений - do nothing |
||
259 | g00d: |
||
260 | ;применить его |
||
261 | xor eax,eax |
||
262 | mov ax,word[prav+esi+2] ;esi<-из таблицы правил |
||
263 | mov esi,eax |
||
264 | mov dword[idx],esi ;сохраним в idx |
||
265 | ret |
||
266 | |||
267 | ;==================================предвыигрышная комбинация... |
||
268 | x_com: xor ecx,ecx |
||
269 | xor ebx,ebx |
||
270 | xor eax,eax |
||
271 | l111: mov bx,word[pool] ; текущую ситуацию на поле O |
||
272 | mov esi,ecx |
||
273 | shl esi,2 ;*4 -сдвиг -слов |
||
274 | mov ax,word[prav+esi] ; следующее правило |
||
275 | and ebx,eax ; если не совпадает - |
||
276 | sub eax,ebx |
||
277 | jnz @F ;next ecx |
||
278 | xor eax,eax |
||
279 | xor ebx,ebx |
||
280 | mov ax,word[prav+esi+2] ;esi<-из таблицы правил |
||
281 | mov bl,byte[pox+eax] |
||
282 | cmp ebx,0 ;empty? |
||
283 | je g11d |
||
284 | @@: |
||
285 | inc ecx |
||
286 | cmp ecx,24 ;цикл до 24 |
||
287 | jb l111 |
||
288 | ret ;нет совпадений - do nothing |
||
289 | |||
290 | g11d: |
||
291 | ;применить его |
||
292 | xor eax,eax |
||
293 | mov ax,word[prav+esi+2] ;esi<-из таблицы правил |
||
294 | mov esi,eax |
||
295 | mov dword[idx],esi ;сохраним в idx |
||
296 | ret |
||
297 | } |
||
298 | |||
299 | macro playing_field |
||
300 | { |
||
301 | pole_x0: |
||
302 | mov eax,38 ; func 38 |
||
303 | mov edx,cB ; the color is black |
||
304 | |||
305 | mov ebx,92*65536+92 ;x |
||
306 | mov ecx,42*65536+192 ;y |
||
307 | int 0x40 ;- line vert 1 |
||
308 | mov ebx,142*65536+142 ;x |
||
309 | mov ecx,42*65536+192 ;y |
||
310 | int 0x40 ;- line vert 2 |
||
311 | mov ebx,42*65536+192 ;x |
||
312 | mov ecx,92*65536+92 ;y |
||
313 | int 0x40 ;- line horiz 1 |
||
314 | mov ebx,42*65536+192 ;x |
||
315 | mov ecx,142*65536+142 ;y |
||
316 | int 0x40 ;- line horiz 2 |
||
317 | }-из>-из>-из>-из>>-STACK>-STACK> |