⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 go.asm

📁 一个汇编写的Win32围棋程序.测试版本.
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	;		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 + -