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

📄 block.asm

📁 一个十六进制编辑器源代码,cool!
💻 ASM
字号:
_GetBlockEnd proto:DWORD ,:DWORD
_ChangeBlockMode proto
_GetBlockSize proto
_InBlock proto:DWORD ,:DWORD
.code
isBlockSelMode equ <(FLAG_ALL & FLAG_BLOCKSEL)>
__posinblock macro @nPos
	xor eax,eax
	.if (FLAG_ALL & FLAG_BLOCKSEL)
		invoke _InBlock,@nPos
	.endif
	exitm<eax>
	endm
;位置是否在列选择范围内
;bAbsPos[in]=True,@nPos[in]是绝对位置(内存中的指针),否则是相对位置
_InBlock proc uses ebx ecx edx esi edi @nPos,bAbsPos
	mov ecx,16
	xor edx,edx
	mov eax,@nPos
	.if bAbsPos
		sub eax,lpMemFile
	.endif
	div ecx
	mov ebx,edx
	mov eax,dwBlockStart
	xor edx,edx
	div ecx
	mov esi,edx
	mov eax,dwBlockEnd
	xor edx,edx
	div ecx
	mov edi,edx
	xor eax,eax
	.if (ebx>=esi && ebx<=edi) ||  (ebx<=esi && ebx>=edi)	
		inc eax	
	.endif
	ret
_InBlock endp
;-------------------------------------------
;返回一行中块结束的指针
;参数同_InBlock
;例如,相对位置18h(绝对位置是lpMemFile+18h),
;块选择的宽度是3个字节,
;则该行的块结束是18h/16*16+3-1+lpMemFile
_GetBlockEnd proc uses ebx @nPos,bAbsPos
	mov eax,@nPos
	.if bAbsPos==TRUE 
		sub eax,lpMemFile
	.endif
	and eax,not 0fh
	mov ebx,dwBlockStart
	and ebx,0fh
	add eax,ebx
	add eax,dwBlockWidth
	add eax,lpMemFile
	dec eax
	ret
_GetBlockEnd endp
;------------------------------------------------
;在行选择与列选择间切换
_ChangeBlockMode proc
		pushad
		call _CanChangeBlockMode
		.if eax
			xor FLAG_ALL,FLAG_BLOCKSEL
			.if (FLAG_ALL & FLAG_BLOCKSEL)
				mov ecx,dwBlockStart
				mov edx,dwBlockEnd
				mov esi,ecx
				mov edi,edx
				and esi,0fh
				and edi,0fh
				xor eax,eax
				.if esi>edi
					xchg edi,esi
					inc eax
				.endif
				mov dwBlockWidth,edi
				sub dwBlockWidth,esi
				inc dwBlockWidth
				and ecx,not 0fh
				and edx,not 0fh
				or ecx,esi
				or edx,edi
				.if eax
					m2m dwCurPos,ecx
				.endif
				mov dwBlockStart,ecx
				mov dwBlockEnd,edx
			.endif
			call _ReDraw
		.endif
		popad
		ret
_ChangeBlockMode endp
;--------------------------------------------------------
;是否可以切换
_CanChangeBlockMode proc uses ecx edx
		mov ecx,dwBlockStart
		mov edx,dwBlockEnd
		;如果dwBlockStart正好是一行的开始,
		;而dwBlockEnd则正好是一行的结束,不用转换
		mov al,cl
		and al,0fh
		jnz @f
		mov al,dl
		and al,0fh
		cmp al,0fh
		jne @f
		xor eax,eax
		jmp _ret_
		@@:
		;如果dwBlockStart和dwBlockEnd在同一行也不用转换
		mov eax,edx
		shr eax,4
		shr ecx,4
		sub eax,ecx
		mov dwBlockHeight,eax
		inc dwBlockHeight
_ret_:
		ret
_CanChangeBlockMode endp
;---------------------------------------
;返回选择区的大小
_GetBlockSize proc uses edx
	.if isBlockSelMode
		xor edx,edx
		mov eax,dwBlockHeight
		mul dwBlockWidth
	.else
		mov eax,__sub2(dwBlockEnd,dwBlockStart)
		inc eax
	.endif
	ret
_GetBlockSize endp

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -