📄 block.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 + -