📄 go.asm
字号:
; mov al, ']'
; repne scasb
;
.elseif
;如果对所取值不感冒,则直接到其未尾;
mov ecx, 1000h
mov al, ']'
repne scasb
.endif
.break .if esi > @Top
.until FALSE
;save new file here
MessageHex @Level
invoke CloseHandle, @hNewFile
invoke CloseHandle, @hOrgFile
invoke GlobalFree, @lpMem
;
ret
_MakeDingShiKu1 endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_Esi2XY proc _Esi
;将ESI转换成棋子的X,Y坐标值
;在eax中返回;eax中高位为Y值,ax为X值。(从1计数)
local @theX
local @theY
pushad
mov edx, _Esi
mov ebx, offset memQipan
sub edx, ebx
mov eax, 0
.repeat
sub edx, iTableStep
inc eax
.break .if edx <= iTableStep
.until FALSE
mov @theY, eax
mov eax, 0
.repeat
sub edx, sizeof QIPAN
inc eax
.break .if edx < sizeof QIPAN
.until FALSE
mov @theX, eax
mov ebx, @theY
shl ebx, 16
or ebx, eax
mov @theX, ebx
popad
mov eax, @theX
ret
_Esi2XY endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_UnPutScrStone proc _psX1, _psY1
;在屏幕上提掉X,Y处的棋子。
local @stRect:RECT
invoke _TransXY, _psX1, _psY1
invoke BitBlt, hQipanDC, iX, iY, iQiziStep, iQiziStep, \
hOrgQipanDC, iX , iY, SRCCOPY
;这里要重画客户区域
mov eax, iX
mov @stRect.left, eax
add eax, iQiziStep
mov @stRect.right, eax
mov eax, iY
mov @stRect.top, eax
add eax, iQiziStep
mov @stRect.bottom, eax
invoke InvalidateRect, hWinMain, addr @stRect, 0
ret
_UnPutScrStone endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_UnPutMemStone proc _iMemX, _iMemY
;在内存棋盘中提掉X,Y处的棋子。
mov ebx, _iMemY
shl ebx, 1
mov edi, offset iTable
add edi, ebx
mov bx, [edi]
movzx ebx, bx
mov esi,offset memQipan
add esi, ebx
mov ecx,3
mov ebx,_iMemX
shl ebx,cl
add esi,ebx
assume esi:ptr QIPAN
mov ecx, 0
mov [esi].color,cx
assume esi: nothing
ret
_UnPutMemStone endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ShuQiAk proc _Addr, Color
;
;Message 'tz'
ret
_ShuQiAk endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ShuQiB proc _sqAddr, _Color
;提子程序数气专用
;生成iTizi中的数据
local @iQishu ;气数
local @lpQishuI ;放入iShuqi中的未进一步数气的棋子个数
local @lpQishu ;指向iShuqi中正处理的坐标的指针(为求快速)
local @iCount ;iShuqiCount的本地值
local @save
local @offiTizi
pushad
mov dword ptr iTiziI, 0
mov ebx, offset iTizi
mov @offiTizi, ebx
add word ptr iShuqiCount, 1
.if CARRY?
mov dword ptr iShuqiCount, 100h
.endif
mov eax, iShuqiCount
mov @iCount, eax
mov @iQishu, 0
mov @lpQishuI, 0
mov edi, offset iShuqi
mov ebx, _sqAddr
mov [edi], ebx
add edi, 4
add @lpQishuI, 1
mov ebx, eax
;;mov edx, _Color
;;movzx edx, dx
;esi 内存棋盘之当前正处理之棋子
;edi 待处理的同色棋子的列表
;ax 本轮处理的标记值
;bx 当前棋子的标记值
;cx 当前棋子的颜色值
;dx 本轮处理的棋子颜色值
;
@@:
;dx为当前点的棋子颜色(可能是黑、白,不可能是边界, 空?)
;MessageHex edi
sub edi, 4
sub @lpQishuI, 1
mov esi, [edi]
mov edx, _Color
;;movzx edx, dx
mov @save, esi
;dx应等于_Color
push edi
mov edi, @offiTizi
mov [edi], esi
add edi, 4
mov @offiTizi, edi
add dword ptr iTiziI, 1
pop edi
;下方一子
add esi, iTableStep
mov cx, [esi]
.if cx == 0
mov bx, [esi] + 2
.if ax != bx
inc @iQishu
mov [esi] + 2,ax
.endif
.elseif cx == dx
mov bx, [esi] + 2
.if ax != bx
mov [esi]+2, ax
mov [edi], esi
add edi, 4
add @lpQishuI, 1
push edi
mov edi, @offiTizi
mov [edi], esi
add edi, 4
mov @offiTizi, edi
add dword ptr iTiziI, 1
pop edi
.endif
.endif
;上方一子
mov esi, @save
sub esi, iTableStep
mov cx, [esi]
.if cx == 0
mov bx, [esi] + 2
.if ax != bx
inc @iQishu
mov [esi] + 2,ax
.endif
.elseif cx == dx
mov bx, [esi] + 2
.if ax != bx
mov [esi]+2, ax
mov [edi], esi
add edi, 4
add @lpQishuI, 1
push edi
mov edi, @offiTizi
mov [edi], esi
add edi, 4
mov @offiTizi, edi
add dword ptr iTiziI, 1
pop edi
.endif
.endif
;左方一子
mov esi, @save
sub esi, 8
mov cx, [esi]
.if cx == 0
mov bx, [esi] + 2
.if ax != bx
inc @iQishu
mov [esi] + 2,ax
.endif
.elseif cx == dx
mov bx, [esi] + 2
.if ax != bx
mov [esi]+2, ax
mov [edi], esi
add edi, 4
add @lpQishuI, 1
push edi
mov edi, @offiTizi
mov [edi], esi
add edi, 4
mov @offiTizi, edi
add dword ptr iTiziI, 1
pop edi
.endif
.endif
;右方一子
mov esi, @save
add esi, 8
mov cx, [esi]
.if cx == 0
mov bx, [esi] + 2
.if ax != bx
inc @iQishu
mov [esi] + 2,ax
.endif
.elseif cx == dx
mov bx, [esi] + 2
.if ax != bx
mov [esi]+2, ax
mov [edi], esi
add edi, 4
add @lpQishuI, 1
push edi
mov edi, @offiTizi
mov [edi], esi
add edi, 4
mov @offiTizi, edi
add dword ptr iTiziI, 1
pop edi
.endif
.endif
;写此轮数气之标记值
mov esi,@save
mov [esi]+2, ax
cmp @lpQishuI, 0
jz @F
jmp @B
@@:
popad
mov eax, @iQishu
ret
_ShuQiB endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ShuQiA proc _sqAddr, _Color
;界面程序数气专用
local @iQishu ;气数
local @lpQishuI ;放入iShuqi中的未进一步数气的棋子个数
local @lpQishu ;指向iShuqi中正处理的坐标的指针(为求快速)
local @iCount ;iShuqiCount的本地值
local @save
;
;初始化数据
pushad
add word ptr iShuqiCount, 1
.if CARRY?
mov dword ptr iShuqiCount, 100h
.endif
mov eax, iShuqiCount
mov @iCount, eax
mov @iQishu, 0
mov @lpQishuI, 0
mov edi, offset iShuqi
mov ebx, _sqAddr
mov [edi], ebx
add edi, 4
add @lpQishuI, 1
mov ebx, eax
;;mov edx, _Color
;;movzx edx, dx
;esi 内存棋盘之当前正处理之棋子
;edi 待处理的同色棋子的列表
;ax 本轮处理的标记值
;bx 当前棋子的标记值
;cx 当前棋子的颜色值
;dx 本轮处理的棋子颜色值
;
@@:
;dx为当前点的棋子颜色(可能是黑、白,不可能是边界, 空?)
sub edi, 4
sub @lpQishuI, 1
mov esi, [edi]
mov edx, _Color
;;movzx edx, dx
mov @save, esi
;dx应等于_Color
;下方一子
add esi, iTableStep
mov cx, [esi]
.if cx == 0
mov bx, [esi] + 2
.if ax != bx
inc @iQishu
mov [esi] + 2,ax
.endif
.elseif cx == dx
mov bx, [esi] + 2
.if ax != bx
mov [esi]+2, ax
mov [edi], esi
add edi, 4
add @lpQishuI, 1
.endif
.endif
;上方一子
mov esi, @save
sub esi, iTableStep
mov cx, [esi]
.if cx == 0
mov bx, [esi] + 2
.if ax != bx
inc @iQishu
mov [esi] + 2,ax
.endif
.elseif cx == dx
mov bx, [esi] + 2
.if ax != bx
mov [esi]+2, ax
mov [edi], esi
add edi, 4
add @lpQishuI, 1
.endif
.endif
;左方一子
mov esi, @save
sub esi, 8
mov cx, [esi]
.if cx == 0
mov bx, [esi] + 2
.if ax != bx
inc @iQishu
mov [esi] + 2,ax
.endif
.elseif cx == dx
mov bx, [esi] + 2
.if ax != bx
mov [esi]+2, ax
mov [edi], esi
add edi, 4
add @lpQishuI, 1
.endif
.endif
;右方一子
mov esi, @save
add esi, 8
mov cx, [esi]
.if cx == 0
mov bx, [esi] + 2
.if ax != bx
inc @iQishu
mov [esi] + 2,ax
.endif
.elseif cx == dx
mov bx, [esi] + 2
.if ax != bx
mov [esi]+2, ax
mov [edi], esi
add edi, 4
add @lpQishuI, 1
.endif
.endif
;写此轮数气之标记值
mov esi,@save
mov [esi]+2, ax
cmp @lpQishuI, 0
jz @F
jmp @B
@@:
popad
mov eax, @iQishu
ret
_ShuQiA endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_TiZiA proc _Addr
;XX在某处返回所提子的坐标
;XX且将提子处设为空
;与_ShuQiA配合使用
local @theX
local @theY
pushad
mov esi, _Addr
mov cx, [esi]
movzx ecx, cx
invoke _ShuQiB, esi, ecx
mov ecx, iTiziI
mov ebx, offset iTizi
mov esi, [ebx]
.repeat
invoke _Esi2XY, esi
mov edx, eax
and edx, 0ffff0000h
shr edx, 16
mov @theY, edx
and eax, 0ffffh
mov @theX, eax
push esi
push ebx
invoke _UnPutScrStone, @theX, @theY
invoke _UnPutMemStone, @theX, @theY
pop ebx
pop esi
sub dword ptr iTiziI, 1
.break .if iTiziI == 0
add ebx, 4
mov esi, [ebx]
.until FALSE
;Message 'tzl'
popad
ret
_TiZiA endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_CheckRule proc _iMemX, _iMemY, _iMemColor
;==查看当前一点是否为空点,为空返回0
;不为空则返回当前点的棋子颜色
;==如本身气数为零,则返回0FFFF FFFFh
;
;
local @NowPs
local @TiziLe
local @Temp
mov @TiziLe, 0 ;还没有提过子
;以下使esi指向当前点(_iMemX, _iMemY)的内存棋盘位置
mov ebx, _iMemY
sal ebx, 1
mov edi, offset iTable
add
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -