blitbit.asm
来自「开放源码的编译器open watcom 1.6.0版的源代码」· 汇编 代码 · 共 3,447 行 · 第 1/4 页
ASM
3,447 行
;-------------------------------------------------------------------------
;
;Blit a bitmap in 256 colour mode.
;
;On Entry:
;
;EBX - state, 0=broken, !=0=clean.
;ECX - width.
;EDX - depth.
;ESI - source.
;EDI - destination.
;EBP - Bitmap (BM) header.
;
vPutORBitmap256 proc near
push edx
mov eax,BM_Wide[ebp]
mul BM_PWide[ebp]
pop edx
mov ebp,BM_Flags[ebp]
xchg ebp,eax
and eax,15
jz @@256
dec eax
jz @@32k
dec eax
jz @@64k
dec eax
jz @@16m
jmp @@9
;
;256 colour bitmap.
;
@@256: or ebx,ebx
jz @@b256
sub edi,d[CurrentBankBig]
@@256_0: pushm ecx,esi,edi
@@256_1: lodsb
cmp al,b[_VBB_Chroma]
jz @@256_3
stosb
@@256_2: dec ecx
jnz @@256_1
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
dec edx
jnz @@256_0
add edi,d[CurrentBankBig]
jmp @@9
@@256_3: inc edi
jmp @@256_2
;
@@b256: pushm ecx,esi,edi
@@b256_0: bank edi
sub edi,d[CurrentBankBig]
lodsb
cmp al,b[_VBB_Chroma]
jz @@b256_3
stosb
@@b256_2: add edi,d[CurrentBankBig]
dec ecx
jnz @@b256_0
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
jmp @@9
@@b256_3: inc edi
jmp @@b256_2
;
;32k colour bitmap.
;
@@32k: or ebx,ebx
jz @@b32k
sub edi,d[CurrentBankBig]
@@32k_0: pushm ecx,esi,edi
@@32k_1: lodsw
cmp ax,w[_VBB_Chroma]
jz @@32k_3
mov ebx,eax
shl ebx,16+1
shld eax,ebx,5
shl eax,3
shl ebx,5
shld eax,ebx,5
shl eax,3
shl ebx,5
shld eax,ebx,5
shl eax,3
; call SearchRGB
stosb
@@32k_2: dec ecx
jnz @@32k_1
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
dec edx
jnz @@32k_0
add edi,d[CurrentBankBig]
jmp @@9
@@32k_3: inc edi
jmp @@32k_2
;
@@b32k: pushm ecx,esi,edi
@@b32k_0: bank edi
sub edi,d[CurrentBankBig]
lodsw
cmp ax,w[_VBB_Chroma]
jz @@b32k_3
add edi,d[CurrentBankBig]
mov ebx,eax
shl ebx,16+1
shld eax,ebx,5
shl eax,3
shl ebx,5
shld eax,ebx,5
shl eax,3
shl ebx,5
shld eax,ebx,5
shl eax,3
; call SearchRGB
stosb
@@b32k_2: dec ecx
jnz @@b32k_0
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
jmp @@9
@@b32k_3: inc edi
jmp @@b32k_2
;
;64k colour bitmap.
;
@@64k: or ebx,ebx
jz @@b64k
sub edi,d[CurrentBankBig]
@@64k_0: pushm ecx,esi,edi
@@64k_1: lodsw
cmp ax,w[_VBB_Chroma]
jz @@64k_3
mov ebx,eax
shl ebx,16
shld eax,ebx,5
shl eax,3
shl ebx,5
shld eax,ebx,6
shl eax,2
shl ebx,6
shld eax,ebx,5
shl eax,3
; call SearchRGB
stosb
@@64k_2: dec ecx
jnz @@64k_1
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
dec edx
jnz @@64k_0
add edi,d[CurrentBankBig]
jmp @@9
@@64k_3: inc edi
jmp @@64k_2
;
@@b64k: pushm ecx,esi,edi
@@b64k_0: bank edi
sub edi,d[CurrentBankBig]
lodsw
cmp ax,w[_VBB_Chroma]
jz @@b64k_3
add edi,d[CurrentBankBig]
mov ebx,eax
shl ebx,16
shld eax,ebx,5
shl eax,3
shl ebx,5
shld eax,ebx,6
shl eax,2
shl ebx,6
shld eax,ebx,5
shl eax,3
; call SearchRGB
stosb
@@b64k_2: dec ecx
jnz @@b64k_0
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
jmp @@9
@@b64k_3: inc edi
jmp @@b64k_2
;
;16m colour bitmap.
;
@@16m: or ebx,ebx
jz @@b16m
sub edi,d[CurrentBankBig]
@@16m_0: pushm ecx,esi,edi
@@16m_1: lodsd
dec esi
and eax,0ffffffh
cmp eax,d[_VBB_Chroma]
jz @@16m_3
; call SearchRGB
stosb
@@16m_2: dec ecx
jnz @@16m_1
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
dec edx
jnz @@16m_0
add edi,d[CurrentBankBig]
jmp @@9
@@16m_3: inc edi
jmp @@16m_2
;
@@b16m: pushm ecx,esi,edi
@@b16m_0: bank edi
sub edi,d[CurrentBankBig]
lodsd
dec esi
and eax,0ffffffh
cmp eax,d[_VBB_Chroma]
jz @@b16m_3
; call SearchRGB
stosb
@@b16m_2: add edi,d[CurrentBankBig]
dec ecx
jnz @@b16m_0
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
jmp @@9
@@b16m_3: inc edi
jmp @@b16m_2
;
@@9: ret
vPutORBitmap256 endp
;-------------------------------------------------------------------------
;
;Blit a bitmap in 32k colour mode.
;
;On Entry:
;
;EBX - state, 0=broken, !=0=clean.
;ECX - width.
;EDX - depth.
;ESI - source.
;EDI - destination.
;EBP - Bitmap (BM) header.
;
vPutORBitmap32k proc near
push edx
mov eax,BM_Wide[ebp]
mul BM_PWide[ebp]
pop edx
mov ebp,BM_Flags[ebp]
xchg ebp,eax
and eax,15
jz @@256
dec eax
jz @@32k
dec eax
jz @@64k
dec eax
jz @@16m
jmp @@9
;
;256 colour bitmap.
;
@@256: or ebx,ebx
jz @@b256
sub edi,d[CurrentBankBig]
@@256_0: pushm ecx,esi,edi
@@256_1: xor eax,eax
lodsb
cmp al,b[_VBB_Chroma]
jz @@256_3
mov eax,d[HardwarePalette+eax+eax*2]
mov bl,al
shr eax,8
xchg ah,bl
shl eax,8
mov al,bl
mov ebx,eax
shl ebx,2+8 ;Convert 0-63 value to 0-255 value.
xor eax,eax
shld eax,ebx,5
shl ebx,8
shld eax,ebx,5
shl ebx,8
shld eax,ebx,5
stosw
@@256_2: dec ecx
jnz @@256_1
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
dec edx
jnz @@256_0
add edi,d[CurrentBankBig]
jmp @@9
@@256_3: add edi,2
jmp @@256_2
;
@@b256: pushm ecx,esi,edi
@@b256_0: bank edi
sub edi,d[CurrentBankBig]
xor eax,eax
lodsb
cmp al,b[_VBB_Chroma]
jz @@b256_3
mov eax,d[HardwarePalette+eax+eax*2]
mov bl,al
shr eax,8
xchg ah,bl
shl eax,8
mov al,bl
mov ebx,eax
shl ebx,2+8 ;Convert 0-63 value to 0-255 value.
xor eax,eax
shld eax,ebx,5
shl ebx,8
shld eax,ebx,5
shl ebx,8
shld eax,ebx,5
stosw
@@b256_2: add edi,d[CurrentBankBig]
dec ecx
jnz @@b256_0
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
jmp @@9
@@b256_3: add edi,2
jmp @@b256_2
;
;32k colour version.
;
@@32k: or ebx,ebx
jz @@b32k
sub edi,d[CurrentBankBig]
@@32k_0: pushm ecx,esi,edi
@@32k_1: lodsw
cmp ax,w[_VBB_Chroma]
jz @@32k_3
stosw
@@32k_2: dec ecx
jnz @@32k_1
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
dec edx
jnz @@32k_0
add edi,d[CurrentBankBig]
jmp @@9
@@32k_3: add edi,2
jmp @@32k_2
;
@@b32k: pushm ecx,esi,edi
@@b32k_0: bank edi
sub edi,d[CurrentBankBig]
lodsw
cmp ax,w[_VBB_Chroma]
jz @@b32k_3
stosw
@@b32k_2: add edi,d[CurrentBankBig]
dec ecx
jnz @@b32k_0
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
jmp @@9
@@b32k_3: add edi,2
jmp @@b32k_2
;
;64k colour version.
;
@@64k: or ebx,ebx
jz @@b64k
sub edi,d[CurrentBankBig]
@@64k_0: pushm ecx,esi,edi
@@64k_1: lodsw
cmp ax,w[_VBB_Chroma]
jz @@64k_3
movzx ebx,ax
xor eax,eax
shl ebx,16
shld eax,ebx,5
shl ebx,5
shld eax,ebx,5
shl ebx,6
shld eax,ebx,5
stosw
@@64k_2: dec ecx
jnz @@64k_1
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
dec edx
jnz @@64k_0
add edi,d[CurrentBankBig]
jmp @@9
@@64k_3: add edi,2
jmp @@64k_2
;
@@b64k: pushm ecx,esi,edi
@@b64k_0: bank edi
sub edi,d[CurrentBankBig]
lodsw
cmp ax,w[_VBB_Chroma]
jz @@b64k_3
movzx ebx,ax
xor eax,eax
shl ebx,16
shld eax,ebx,5
shl ebx,5
shld eax,ebx,5
shl ebx,6
shld eax,ebx,5
stosw
@@b64k_2: add edi,d[CurrentBankBig]
dec ecx
jnz @@b64k_0
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
jmp @@9
@@b64k_3: add edi,2
jmp @@b64k_2
;
;16m colour version.
;
@@16m: or ebx,ebx
jz @@b16m
sub edi,d[CurrentBankBig]
@@16m_0: pushm ecx,esi,edi
@@16m_1: lodsd
dec esi
and eax,0ffffffh
cmp eax,d[_VBB_Chroma]
jz @@16m_3
shl eax,8
mov ebx,eax
xor eax,eax
shld eax,ebx,5
shl ebx,8
shld eax,ebx,5
shl ebx,8
shld eax,ebx,5
stosw
@@16m_2: dec ecx
jnz @@16m_1
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
dec edx
jnz @@16m_0
add edi,d[CurrentBankBig]
jmp @@9
@@16m_3: add edi,2
jmp @@16m_2
;
@@b16m: pushm ecx,esi,edi
@@b16m_0: bank edi
sub edi,d[CurrentBankBig]
lodsd
dec esi
and eax,0ffffffh
cmp eax,d[_VBB_Chroma]
jz @@b16m_3
shl eax,8
mov ebx,eax
xor eax,eax
shld eax,ebx,5
shl ebx,8
shld eax,ebx,5
shl ebx,8
shld eax,ebx,5
stosw
@@b16m_2: add edi,d[CurrentBankBig]
dec ecx
jnz @@b16m_0
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
jmp @@9
@@b16m_3: add edi,2
jmp @@b16m_2
;
@@9: ret
vPutORBitmap32k endp
;-------------------------------------------------------------------------
;
;Blit a bitmap in 256 colour mode.
;
;On Entry:
;
;EBX - state, 0=broken, !=0=clean.
;ECX - width.
;EDX - depth.
;ESI - source.
;EDI - destination.
;EBP - Bitmap (BM) header.
;
vPutORBitmap64k proc near
push edx
mov eax,BM_Wide[ebp]
mul BM_PWide[ebp]
pop edx
mov ebp,BM_Flags[ebp]
xchg ebp,eax
and eax,15
jz @@256
dec eax
jz @@32k
dec eax
jz @@64k
dec eax
jz @@16m
jmp @@9
;
;256 colour bitmap.
;
@@256: or ebx,ebx
jz @@b256
sub edi,d[CurrentBankBig]
@@256_0: pushm ecx,esi,edi
@@256_1: xor eax,eax
lodsb
cmp al,b[_VBB_Chroma]
jz @@256_3
mov eax,d[HardwarePalette+eax+eax*2]
shl eax,2
mov bl,al
shr eax,8
xchg ah,bl
shl eax,8
mov al,bl
mov ebx,eax
shl ebx,8
xor eax,eax
shld eax,ebx,5
shl ebx,8
shld eax,ebx,6
shl ebx,8
shld eax,ebx,5
stosw
@@256_2: dec ecx
jnz @@256_1
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
dec edx
jnz @@256_0
add edi,d[CurrentBankBig]
jmp @@9
@@256_3: add edi,2
jmp @@256_2
;
@@b256: pushm ecx,esi,edi
@@b256_0: bank edi
sub edi,d[CurrentBankBig]
xor eax,eax
lodsb
cmp al,b[_VBB_Chroma]
jz @@b256_3
mov eax,d[HardwarePalette+eax+eax*2]
shl eax,2
mov bl,al
shr eax,8
xchg ah,bl
shl eax,8
mov al,bl
mov ebx,eax
shl ebx,8
xor eax,eax
shld eax,ebx,5
shl ebx,8
shld eax,ebx,6
shl ebx,8
shld eax,ebx,5
stosw
@@b256_2: add edi,d[CurrentBankBig]
dec ecx
jnz @@b256_0
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
jmp @@9
@@b256_3: add edi,2
jmp @@b256_2
;
;32k colour version.
;
@@32k: or ebx,ebx
jz @@b32k
sub edi,d[CurrentBankBig]
@@32k_0: pushm ecx,esi,edi
@@32k_1: lodsw
cmp ax,w[_VBB_Chroma]
jz @@32k_3
movzx ebx,ax
xor eax,eax
shl ebx,16+1
shld eax,ebx,5
shl ebx,5
shld eax,ebx,5
shl eax,1
shl ebx,5
shld eax,ebx,5
stosw
@@32k_2: dec ecx
jnz @@32k_1
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
dec edx
jnz @@32k_0
add edi,d[CurrentBankBig]
jmp @@9
@@32k_3: add edi,2
jmp @@32k_2
;
@@b32k: pushm ecx,esi,edi
@@b32k_0: bank edi
sub edi,d[CurrentBankBig]
lodsw
cmp ax,w[_VBB_Chroma]
jz @@b32k_3
movzx ebx,ax
xor eax,eax
shl ebx,16+1
shld eax,ebx,5
shl ebx,5
shld eax,ebx,5
shl eax,1
shl ebx,5
shld eax,ebx,5
stosw
@@b32k_2: add edi,d[CurrentBankBig]
dec ecx
jnz @@b32k_0
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
jmp @@9
@@b32k_3: add edi,2
jmp @@b32k_2
;
;64k colour version.
;
@@64k: or ebx,ebx
jz @@b64k
sub edi,d[CurrentBankBig]
@@64k_0: pushm ecx,esi,edi
@@64k_1: lodsw
cmp ax,w[_VBB_Chroma]
jz @@64k_3
stosw
@@64k_2: dec ecx
jnz @@64k_1
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
dec edx
jnz @@64k_0
add edi,d[CurrentBankBig]
jmp @@9
@@64k_3: add edi,2
jmp @@64k_2
;
@@b64k: pushm ecx,esi,edi
@@b64k_0: bank edi
sub edi,d[CurrentBankBig]
lodsw
cmp ax,w[_VBB_Chroma]
jz @@b64k_3
stosw
@@b64k_2: add edi,d[CurrentBankBig]
dec ecx
jnz @@b64k_0
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
jmp @@9
@@b64k_3: add edi,2
jmp @@b64k_2
;
;16m colour version.
;
@@16m: or ebx,ebx
jz @@b16m
sub edi,d[CurrentBankBig]
@@16m_0: pushm ecx,esi,edi
@@16m_1: lodsd
dec esi
and eax,0ffffffh
cmp eax,d[_VBB_Chroma]
jz @@16m_3
shl eax,8
mov ebx,eax
xor eax,eax
shld eax,ebx,5
shl ebx,8
shld eax,ebx,6
shl ebx,8
shld eax,ebx,5
stosw
@@16m_2: dec ecx
jnz @@16m_1
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
dec edx
jnz @@16m_0
add edi,d[CurrentBankBig]
jmp @@9
@@16m_3: add edi,2
jmp @@16m_2
;
@@b16m: pushm ecx,esi,edi
@@b16m_0: bank edi
sub edi,d[CurrentBankBig]
lodsd
dec esi
and eax,0ffffffh
cmp eax,d[_VBB_Chroma]
jz @@b16m_3
shl eax,8
mov ebx,eax
xor eax,eax
shld eax,ebx,5
shl ebx,8
shld eax,ebx,6
shl ebx,8
shld eax,ebx,5
stosw
@@b16m_2: add edi,d[CurrentBankBig]
dec ecx
jnz @@b16m_0
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
jmp @@9
@@b16m_3: add edi,2
jmp @@b16m_2
;
@@9: ret
vPutORBitmap64k endp
;-------------------------------------------------------------------------
;
;Blit a bitmap in 256 colour mode.
;
;On Entry:
;
;EBX - state, 0=broken, !=0=clean.
;ECX - width.
;EDX - depth.
;ESI - source.
;EDI - destination.
;EBP - Bitmap (BM) header.
;
vPutORBitmap16m proc near
push edx
mov eax,BM_Wide[ebp]
mul BM_PWide[ebp]
pop edx
mov ebp,BM_Flags[ebp]
xchg ebp,eax
and eax,15
jz @@256
dec eax
jz @@32k
dec eax
jz @@64k
dec eax
jz @@16m
jmp @@9
;
;256 colour bitmap.
;
@@256: or ebx,ebx
jz @@b256
sub edi,d[CurrentBankBig]
@@256_0: pushm ecx,esi,edi
@@256_1: lodsb
movzx eax,al
cmp al,b[_VBB_Chroma]
jz @@256_3
mov eax,d[HardwarePalette+eax][eax*2]
shl eax,2
mov bl,al
shr eax,8
xchg ah,bl
shl eax,8
mov al,bl
stosw
shr eax,16
stosb
@@256_2: dec ecx
jnz @@256_1
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
dec edx
jnz @@256_0
add edi,d[CurrentBankBig]
jmp @@9
@@256_3: add edi,3
jmp @@256_2
;
@@b256: pushm ecx,esi,edi
@@b256_0: lodsb
cmp al,b[_VBB_Chroma]
jz @@b256_3
movzx eax,al
mov eax,d[HardwarePalette+eax][eax*2]
shl eax,2
mov bl,al
shr eax,8
xchg ah,bl
shl eax,8
mov al,bl
mov bl,3
@@b256_4: bank edi
sub edi,d[CurrentBankBig]
stosb
shr eax,8
add edi,d[CurrentBankBig]
dec bl
jnz @@b256_4
@@b256_2: dec ecx
jnz @@b256_0
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
jmp @@9
@@b256_3: add edi,3
jmp @@b256_2
;
;32k colour bitmap.
;
@@32k: or ebx,ebx
jz @@b32k
sub edi,d[CurrentBankBig]
@@32k_0: pushm ecx,esi,edi
@@32k_1: lodsw
cmp ax,w[_VBB_Chroma]
jz @@32k_3
movzx ebx,ax
shl ebx,1+16
xor eax,eax
shld eax,ebx,5
shl eax,3
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?