;************************************
;******** *******************
;************************************
;------------------------------------
; constants
;-----------------------梥â:0xRRGGBB
cBLACK = 0x000000 ; ç¥àë©
cRED = 0xFF0000 ; ªà áë©
cYELLOW = 0xFFFF00 ; ¦¥«âë©
cGREEN = 0x00FF00 ; §¥«¥ë©
cNAVY = 0x0000FF ; ᨨ©
cMAGENTA = 0xFF00FF ; ¬ «¨®¢ë©
cBLUE = 0x00FFFF ; £®«ã¡®©
cWHITE = 0xFFFFFF ; ¡¥«ë©
cBROWN = 0x554433 ; ª®à¨ç¥¢ë©
;-------------------------------
cMAGENTAl = 0xB800B8 ; magenta light
cVIOLETl = 0xF800F8 ; 䨮«¥â®¢ë© ᢥâ«
macro BeginProgram
{
use32
org 0x0
db 'MENUET01'
dd 0x01
dd __start
dd __end
dd 0x10000 ;__memory
dd 0x10000 ;__stack
dd 0x0 ; dd __params
dd 0x0
__start:
}
macro EndProgram
{
align 32
rb 256
__end:
;org 0x10000
__stack:
__memory:
}
macro LoopBegin lab,begi
{
push ecx ; ECX->STACK store old
mov ecx,begi
lab:
push ecx ; ECX->STACK counter store
}
macro LoopEnd lab,endi
{
pop ecx ;ECX<-STACK counter restore
inc ecx
cmp ecx,endi
jne lab
pop ecx ;ECX<-STACK restore old
}
macro SetEventMask mmm
{
mov eax,40
mov ebx,mmm
int 0x40
}
macro Subroutines
{
;------------------------------------------------------------------------------
rndseed:
mov eax,26
mov ebx,9
int 0x40
mov dword[seed],eax
ret
rndnext:
mov eax,3
int 0x40
shr eax,16
add eax,dword[seed]
; not eax
ror eax,3
xor eax,0xdeadbeef
mov dword[seed],eax
ret
;============0========== word[px],word[py]
o_put:
mov ax,word[px]
shl eax,16 ;*65536
add eax,35 ;+35
mov ebx,eax ;posX*65536+dX ; [x0] *65536 + [dx]
mov ax,word[py] ;
shl eax,16 ;*65536
add eax,35 ;+35
mov ecx,eax ;posY*65536+dY ; [y0] *65536 + [dy]
mov edx,cB
mov eax,13 ; äãªæ¨ï 13 - box
int 0x40 ;BLACK BOX---------------
mov ax,word[px]
inc ax ;+1
inc ax ;+1
shl eax,16 ;*65536
add eax,31 ;3 ;+35
mov ebx,eax ;posX*65536+dX ; [x0] *65536 + [dx]
mov ax,word[py]
add eax,2
;inc eax
;inc eax
shl eax,16
add eax,31 ;3 ;-2
mov ecx,eax ;posY*65536+dY ; [y0] *65536 + [dy]
mov edx,cW
mov eax,13 ; äãªæ¨ï 13 - box
int 0x40 ;WHITE BOX----------
ret
;============X==========
x_put:
;xor eax,eax
mov ax,word[px]
shl eax,16 ;*65536
add ax,word[px]
add eax,35 ;+35
mov ebx,eax ;posX*65536+dX
xor eax,eax
mov ax,word[py]
shl eax,16 ;*65536
add ax,word[py]
add eax,35 ;+35
mov ecx,eax ;posX*65536+dX
mov edx,cB
mov eax,38 ; äãªæ¨ï 38 - line \
int 0x40
;------------------------------xx
xor eax,eax
mov ax,word[px]
inc eax
shl eax,16 ;*65536
add ax,word[px]
add eax,36 ;+35+1
mov ebx,eax ;posX*65536+dX
xor eax,eax
mov ax,word[py]
shl eax,16 ;*65536
add ax,word[py]
add eax,35 ;+35
mov ecx,eax ;posX*65536+dX ; [x0] *65536 + [dx]
mov edx,cB
mov eax,38 ; äãªæ¨ï 38 - line \\
int 0x40
;---------------------------------
xor eax,eax
mov ax,word[px]
shl eax,16 ;*65536
mov ebx,eax ;posX*65536 = .BX
xor eax,eax
mov ax,word[px]
add eax,35
add ebx,eax ;---------------------------BX
xor eax,eax
mov ax,word[py]
add eax,35
shl eax,16 ;*65536
add ax,word[py] ;+y
mov ecx,eax ;(posY+35)*65536+posY = .CX
mov edx,cB ; 梥â : ç¥àë©
mov eax,38 ; äãªæ¨ï 38 - line /
int 0x40
;----------------------------------------
xor eax,eax
mov ax,word[px]
inc ax
shl eax,16 ;*65536
mov ebx,eax ;posX*65536 = .BX
xor eax,eax
mov ax,word[px]
add eax,36 ;+35+1
add ebx,eax ;---------------------------BX
xor eax,eax
mov ax,word[py]
add eax,35
shl eax,16 ;*65536
add ax,word[py] ;+y
mov ecx,eax ;(posY+35)*65536+posY = .CX
mov edx,cB
mov eax,38 ; äãªæ¨ï 38 - line //
int 0x40
ret
;------------------------------------
H ¢ë¨£àëèãî á¨âã æ¨î-----x
x_win: xor ecx,ecx
xor ebx,ebx
xor eax,eax
lx0: mov bx,word[poxl] ;áà ¢¨âì ⥪ãéãî á¨âã æ¨î ¯®«¥ X
mov esi,ecx
shl esi,1 ;*2
mov ax,word[oxwall+esi] ; next pattern
and ebx,eax ;á ¯®¡¥¤ë¬¨ , ¥á«¨ å®âì ®¤ ᮢ¯ ¤ ¥â -
sub eax,ebx
jz wx ;¯®¡¥¤ -> set byte xwin=1
inc ecx
cmp ecx,8 ;横« ecx < 8
jb lx0
g00: ;¥â ᮢ¯ ¤¥¨©
ret
wx:
inc byte[xwin] ;mov byte[xwin],1
ret
;------------------------------------
H ¢ë¨£àëèãî á¨âã æ¨î-----0
o_win: xor ecx,ecx
xor ebx,ebx
xor eax,eax
lo0: mov bx,word[pool] ;áà ¢¨âì ⥪ãéãî á¨âã æ¨î ¯®«¥ O
mov esi,ecx
shl esi,1 ;*2
mov ax,word[oxwall+esi] ; next pattern
and ebx,eax ;á ¯®¡¥¤ë¬¨ , ¥á«¨ å®âì ®¤ ᮢ¯ ¤ ¥â -
sub eax,ebx
jz wo ;¯®¡¥¤ -> set byte owin=1
inc ecx
cmp ecx,8 ;横«
jb lo0
ret
wo: inc byte[owin] ;mov byte[owin],1
ret
;==================================COmbinations -0- =============
o_com: xor ecx,ecx
xor ebx,ebx
xor eax,eax
l000: mov bx,word[poxl] ; ⥪ãéãî á¨âã æ¨î ¯®«¥ X
; or bx,word[pool] ;+ ⥪ãéãî á¨âã æ¨î ¯®«¥ O
mov esi,ecx
shl esi,2 ;*4 -ᤢ¨£ -á«®¢
mov ax,word[prav+esi] ; á«¥¤ãî饥 ¯à ¢¨«®
and ebx,eax ; ¥á«¨ ¥ ᮢ¯ ¤ ¥â -
sub eax,ebx
jnz @F ;next ecx
xor eax,eax
xor ebx,ebx
mov ax,word[prav+esi+2] ;esi<-¨§ â ¡«¨æë ¯à ¢¨«
mov bl,byte[pox+eax]
cmp ebx,0 ;empty?
je g00d
@@:
inc ecx
cmp ecx,24 ;横« ¤® 24
jb l000
ret ;¥â ᮢ¯ ¤¥¨© - do nothing
g00d:
;¯à¨¬¥¨âì ¥£®
xor eax,eax
mov ax,word[prav+esi+2] ;esi<-¨§ â ¡«¨æë ¯à ¢¨«
mov esi,eax
mov dword[idx],esi ;á®åà ¨¬ ¢ idx
ret
;==================================¯à¥¤¢ë¨£àëè ï ª®¬¡¨ æ¨ï...
x_com: xor ecx,ecx
xor ebx,ebx
xor eax,eax
l111: mov bx,word[pool] ; ⥪ãéãî á¨âã æ¨î ¯®«¥ O
mov esi,ecx
shl esi,2 ;*4 -ᤢ¨£ -á«®¢
mov ax,word[prav+esi] ; á«¥¤ãî饥 ¯à ¢¨«®
and ebx,eax ; ¥á«¨ ¥ ᮢ¯ ¤ ¥â -
sub eax,ebx
jnz @F ;next ecx
xor eax,eax
xor ebx,ebx
mov ax,word[prav+esi+2] ;esi<-¨§ â ¡«¨æë ¯à ¢¨«
mov bl,byte[pox+eax]
cmp ebx,0 ;empty?
je g11d
@@:
inc ecx
cmp ecx,24 ;横« ¤® 24
jb l111
ret ;¥â ᮢ¯ ¤¥¨© - do nothing
g11d:
;¯à¨¬¥¨âì ¥£®
xor eax,eax
mov ax,word[prav+esi+2] ;esi<-¨§ â ¡«¨æë ¯à ¢¨«
mov esi,eax
mov dword[idx],esi ;á®åà ¨¬ ¢ idx
ret
}
macro playing_field
{
pole_x0:
mov eax,38 ; func 38
mov edx,cB ; the color is black
mov ebx,92*65536+92 ;x
mov ecx,42*65536+192 ;y
int 0x40 ;- line vert 1
mov ebx,142*65536+142 ;x
mov ecx,42*65536+192 ;y
int 0x40 ;- line vert 2
mov ebx,42*65536+192 ;x
mov ecx,92*65536+92 ;y
int 0x40 ;- line horiz 1
mov ebx,42*65536+192 ;x
mov ecx,142*65536+142 ;y
int 0x40 ;- line horiz 2
}