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 + -
显示快捷键?