blitbit.asm
来自「开放源码的编译器open watcom 1.6.0版的源代码」· 汇编 代码 · 共 3,447 行 · 第 1/4 页
ASM
3,447 行
sub edi,d[CurrentBankBig]
movsx eax,di
neg eax
shr eax,1
cmp eax,ecx
jc @@b32k_0
mov eax,ecx
@@b32k_0: push ecx
mov ecx,eax
rep_movsw
pop ecx
sub ecx,eax
jz @@b32k_1
add edi,d[CurrentBankBig]
bank edi
sub edi,d[CurrentBankBig]
rep_movsw
@@b32k_1: popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
jmp @@9
;
;64k colour version.
;
@@64k: or ebx,ebx
jz @@b64k
sub edi,d[CurrentBankBig]
@@64k_0: pushm ecx,esi,edi
@@64k_1: lodsw
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
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
;
@@b64k: pushm ecx,esi,edi
@@b64k_0: bank edi
sub edi,d[CurrentBankBig]
lodsw
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
add edi,d[CurrentBankBig]
dec ecx
jnz @@b64k_0
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
jmp @@9
;
;16m colour version.
;
@@16m: or ebx,ebx
jz @@b16m
sub edi,d[CurrentBankBig]
@@16m_0: pushm ecx,esi,edi
@@16m_1: lodsd
dec esi
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
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
;
@@b16m: pushm ecx,esi,edi
@@b16m_0: bank edi
sub edi,d[CurrentBankBig]
lodsd
dec esi
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
add edi,d[CurrentBankBig]
dec ecx
jnz @@b16m_0
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
;
@@9: ret
vPutBitmap32k 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.
;
vPutBitmap64k 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
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
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
;
@@b256: pushm ecx,esi,edi
@@b256_0: bank edi
sub edi,d[CurrentBankBig]
xor eax,eax
lodsb
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
add edi,d[CurrentBankBig]
dec ecx
jnz @@b256_0
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
jmp @@9
;
;32k colour version.
;
@@32k: or ebx,ebx
jz @@b32k
sub edi,d[CurrentBankBig]
@@32k_0: pushm ecx,esi,edi
@@32k_1: lodsw
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
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
;
@@b32k: pushm ecx,esi,edi
@@b32k_0: bank edi
sub edi,d[CurrentBankBig]
lodsw
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
add edi,d[CurrentBankBig]
dec ecx
jnz @@b32k_0
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
jmp @@9
;
;64k colour version.
;
@@64k: or ebx,ebx
jz @@b64k
sub edi,d[CurrentBankBig]
@@64k_0: pushm ecx,esi,edi
rep_movsw
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
dec edx
jnz @@64k_0
add edi,d[CurrentBankBig]
jmp @@9
;
@@b64k: pushm ecx,esi,edi
sub edi,d[CurrentBankBig]
movsx eax,di
neg eax
shr eax,1
cmp eax,ecx
jc @@b64k_0
mov eax,ecx
@@b64k_0: push ecx
mov ecx,eax
rep_movsw
pop ecx
sub ecx,eax
jz @@b64k_1
add edi,d[CurrentBankBig]
bank edi
sub edi,d[CurrentBankBig]
rep_movsw
@@b64k_1: popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
jmp @@9
;
;16m colour version.
;
@@16m: or ebx,ebx
jz @@b16m
sub edi,d[CurrentBankBig]
@@16m_0: pushm ecx,esi,edi
@@16m_1: lodsd
dec esi
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
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
;
@@b16m: pushm ecx,esi,edi
@@b16m_0: bank edi
sub edi,d[CurrentBankBig]
lodsd
dec esi
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
add edi,d[CurrentBankBig]
dec ecx
jnz @@b16m_0
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
;
@@9: ret
vPutBitmap64k 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.
;
vPutBitmap16m 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
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
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
;
@@b256: pushm ecx,esi,edi
@@b256_0: lodsb
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 bh,3
@@b256_1: bank edi
sub edi,d[CurrentBankBig]
stosb
shr eax,8
add edi,d[CurrentBankBig]
dec bh
jnz @@b256_1
dec ecx
jnz @@b256_0
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
jmp @@9
;
;32k colour bitmap.
;
@@32k: or ebx,ebx
jz @@b32k
sub edi,d[CurrentBankBig]
@@32k_0: pushm ecx,esi,edi
@@32k_1: lodsw
movzx ebx,ax
shl ebx,1+16
xor eax,eax
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
stosw
shr eax,16
stosb
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
;
@@b32k: pushm ecx,esi,edi
@@b32k_0: lodsw
movzx ebx,ax
shl ebx,1+16
xor eax,eax
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
mov bl,3
@@b32k_1: bank edi
sub edi,d[CurrentBankBig]
stosb
shr eax,8
add edi,d[CurrentBankBig]
dec bl
jnz @@b32k_1
dec ecx
jnz @@b32k_0
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
jmp @@9
;
;64k colour bitmap.
;
@@64k: or ebx,ebx
jz @@b64k
sub edi,d[CurrentBankBig]
@@64k_0: pushm ecx,esi,edi
@@64k_1: lodsw
movzx ebx,ax
shl ebx,16
xor eax,eax
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
stosw
shr eax,16
stosb
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
;
@@b64k: pushm ecx,esi,edi
@@b64k_0: lodsw
movzx ebx,ax
shl ebx,16
xor eax,eax
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
mov bl,3
@@b64k_1: bank edi
sub edi,d[CurrentBankBig]
stosb
shr eax,8
add edi,d[CurrentBankBig]
dec bl
jnz @@b64k_1
dec ecx
jnz @@b64k_0
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
jmp @@9
;
;16m colour bitmap.
;
@@16m: or ebx,ebx
jz @@b16m
lea ecx,[ecx][ecx*2]
sub edi,d[CurrentBankBig]
@@16m_0: pushm ecx,esi,edi
rep_movsb
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
dec edx
jnz @@16m_0
add edi,d[CurrentBankBig]
jmp @@9
;
@@b16m: pushm ecx,esi,edi
lea ecx,[ecx+ecx*2]
@@b16m_0: bank edi
sub edi,d[CurrentBankBig]
movsb
add edi,d[CurrentBankBig]
dec ecx
jnz @@b16m_0
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
;
@@9: ret
vPutBitmap16m endp
;-------------------------------------------------------------------------
;
;Blit a bitmap in 16m 32-bit colour mode.
;
;On Entry:
;
;EBX - state, 0=broken, !=0=clean.
;ECX - width.
;EDX - depth.
;ESI - source.
;EDI - destination.
;EBP - Bitmap (BM) header.
;
vPutBitmap16m32 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
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
stosd
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
;
@@b256: pushm ecx,esi,edi
@@b256_0: bank edi
sub edi,d[CurrentBankBig]
lodsb
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
stosd
add edi,d[CurrentBankBig]
dec ecx
jnz @@b256_0
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
jmp @@9
;
;32k colour bitmap.
;
@@32k: or ebx,ebx
jz @@b32k
sub edi,d[CurrentBankBig]
@@32k_0: pushm ecx,esi,edi
@@32k_1: lodsw
movzx ebx,ax
shl ebx,1+16
xor eax,eax
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
stosd
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
;
@@b32k: pushm ecx,esi,edi
@@b32k_0: bank edi
sub edi,d[CurrentBankBig]
lodsw
movzx ebx,ax
shl ebx,1+16
xor eax,eax
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
stosd
add edi,d[CurrentBankBig]
dec ecx
jnz @@b32k_0
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
jmp @@9
;
;64k colour bitmap.
;
@@64k: or ebx,ebx
jz @@b64k
sub edi,d[CurrentBankBig]
@@64k_0: pushm ecx,esi,edi
@@64k_1: lodsw
movzx ebx,ax
shl ebx,16
xor eax,eax
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
stosd
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
;
@@b64k: pushm ecx,esi,edi
@@b64k_0: bank edi
sub edi,d[CurrentBankBig]
lodsw
movzx ebx,ax
shl ebx,16
xor eax,eax
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
stosd
add edi,d[CurrentBankBig]
dec ecx
jnz @@b64k_0
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
jmp @@9
;
;16m colour bitmap.
;
@@16m: or ebx,ebx
jz @@b16m
sub edi,d[CurrentBankBig]
@@16m_0: pushm ecx,esi,edi
@@16m_1: lodsd
dec esi
stosd
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
;
@@b16m: pushm ecx,esi,edi
@@b16m_0: bank edi
sub edi,d[CurrentBankBig]
lodsd
dec esi
stosd
add edi,d[CurrentBankBig]
dec ecx
jnz @@b16m_0
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
;
@@9: ret
vPutBitmap16m32 endp
;-------------------------------------------------------------------------
;
;Blit a bitmap in text mode.
;
;On Entry:
;
;EBX - state, 0=broken, !=0=clean.
;ECX - width.
;EDX - depth.
;ESI - source.
;EDI - destination.
;EBP - Bitmap (BM) header.
;
vPutBitmapText 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,1
jz @@chars
dec eax
jz @@chratt
jmp @@9
;
;Just character data.
;
@@chars: sub edi,d[CurrentBankBig]
@@chars_0: pushm ecx,esi,edi
@@chars_1: movsb
inc edi
dec ecx
jnz @@chars_1
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
dec edx
jnz @@chars_0
add edi,d[CurrentBankBig]
jmp @@9
;
;Character and attribute data.
;
@@chratt: sub edi,d[CurrentBankBig]
@@chratt_0: pushm ecx,esi,edi
rep_movsw
popm ecx,esi,edi
add esi,ebp
add edi,VideoHardwareWidth
dec edx
jnz @@chratt_0
add edi,d[CurrentBankBig]
;
@@9: ret
vPutBitmapText endp
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?