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

📄 q cir earth.asm

📁 用汇编语言实现的3d动画
💻 ASM
📖 第 1 页 / 共 2 页
字号:

		.386
		.model flat,stdcall
		option casemap:none
		
include		windows.inc
include		gdi32.inc
includelib	gdi32.lib
include		user32.inc
includelib	user32.lib
include		kernel32.inc
includelib	kernel32.lib

		.data?
hInstance	dd		?
hWinMain	dd		?
Table1		dd	326 dup(?)
Table2		dd	326 dup(?)
Rtable		dd	326 dup(?)
Table3		dd  326*256 dup(?)
hFile		dd		?
hFileMap	dd		?
lpFile		dd		?
lpMem		dd		?
lpMem1		dd		?
lpMem2		dd		?
lpMem3		dd		?
lpOffset	dd		?
mouX		dd		?
mouY		dd		?
moveJh		dd		?
Xscreen		dd		?
Yscreen		dd		?
frame		dd		?
hdc		dd		?
thjh		dd		?
buff		db	20 dup(?)
winRect		RECT		<?>

		.const
szClassName	db	'My 3D',0
BitMapAddr	db	'BitMap.bmp',0
over		db	'OVER',0
OpenError	db	'文件打开失败(请您确定在当前目录下有BitMap.bmp的位图)',0dh,0ah
		db	'运行时请务必在此程序所在目录中放一文件名为BitMap.bmp的地图位图',0

		.code
		

_arcsin		proc	bord,hypotenuse,lpResult;此模块用来求arcsin值(qword ptr lpResult = arcsin(bord÷hypotenuse(bord≤hypotenuse) ) )
		local	a:qword;                        ___________
		local	b:qword;arcsin(x/y)=arctan(x/(√  y^2-x^2   ))
		push	ebx
		mov	dword ptr[b+4],0
		mov	eax,bord
		mul	eax
		mov	ebx,eax
		mov	ecx,edx
		mov	eax,hypotenuse
		mul	eax
		sub	eax,ebx
		sbb	edx,ecx
		mov	dword ptr a,eax
		mov	dword ptr[a+4],edx
		push	bord
		pop	dword ptr b
		finit
		fild	b
		fild	a
		fsqrt
		fpatan
		fst	a
		mov	ebx,lpResult
		mov	eax,ebx
		push	dword ptr a
		push	dword ptr[a+4]
		pop	dword ptr[ebx+4]
		pop	dword ptr[ebx]
		pop	ebx
		ret
_arcsin		endp

_arccos		proc	bord,hypotenuse,lpResult;此模块用来求arccos值(qword ptr lpResult = arccos(bord÷hypotenuse(bord≤hypotenuse)))
		local	a:qword;                     __________
		local	b:qword;arccos(x/y)=arctan(√  y^2-x^2  /x ))
		push	ebx
		mov	dword ptr[b+4],0
		mov	eax,bord
		mul	eax
		mov	ebx,eax
		mov	ecx,edx
		mov	eax,hypotenuse
		mul	eax
		sub	eax,ebx
		sbb	edx,ecx
		mov	dword ptr a,eax
		mov	dword ptr[a+4],edx
		push	bord
		pop	dword ptr b
		finit
		fild	a
		fsqrt
		fild	b
		fpatan
		fst	a
		mov	ebx,lpResult
		mov	eax,ebx
		push	dword ptr a
		push	dword ptr[a+4]
		pop	dword ptr[ebx+4]
		pop	dword ptr[ebx]
		pop	ebx
		ret
_arccos		endp

_prop		proc	DesAddr,SourAddr,DesWidth,DesHeigth;此模块用来对打开的位图进行缩放
		LOCAL	@propx;(DesAddr:目的位图首地址,SourAddr:源位图首地址,
		LOCAL	@propy;DesWidth:目的位图宽度,DesHeigth:目的位图高度)
		LOCAL	@Null1
		LOCAL	@Null2
		LOCAL	@LS
		LOCAL	@SourWidth
		pushad
			mov	edi,DesAddr
			mov	esi,SourAddr
			mov	ecx,dword ptr[esi+10]
			cld
			rep	movsb
			mov	edi,DesAddr
			mov	esi,SourAddr
			push	DesWidth
			pop	dword ptr[edi+18]
			push	DesHeigth
			pop	dword ptr[edi+22]
			
			finit
			fild	dword ptr[esi+18]
			fild	dword ptr[edi+18]
			fdiv
			fst	@propx
			fild	dword ptr[esi+22]
			fild	dword ptr[edi+22]
			fdiv
			fst	@propy
			mov	eax,dword ptr[esi+18]
			mov	ebx,3
			mul	ebx
			and	eax,3h
			mov	ebx,4
			sub	ebx,eax
			cmp	ebx,4
			jne	@f
			mov	ebx,0
			@@:
			mov	@Null1,ebx
			mov	eax,dword ptr[edi+18]
			mov	ebx,3
			mul	ebx
			and	eax,3h
			mov	ebx,4
			sub	ebx,eax
			cmp	ebx,4
			jne	@f
			mov	ebx,0
			@@:
			mov	@Null2,ebx
			mov	eax,dword ptr[esi+18]
			mov	ebx,3
			mul	ebx
			add	eax,@Null1
			mov	@SourWidth,eax
			mov	eax,DesWidth
			mul	ebx
			add	eax,@Null2
			mov	ebx,DesHeigth
			mul	ebx
			add	eax,dword ptr[edi+10]
			mov	dword ptr[edi+2],eax
			add	esi,dword ptr[esi+10]
			mov	SourAddr,esi
			add	edi,dword ptr[edi+10]
			mov	ecx,0
			Hlp:
			push	ecx
			mov	@LS,ecx
			finit
			fild	@LS
			fld	@propy
			fmul
			fist	@LS
			mov	eax,@LS
			mov	ebx,@SourWidth
			mul	ebx
			mov	esi,SourAddr
			add	esi,eax
			mov	ecx,0
			mov	ebx,3
			@@:
			mov	@LS,ecx
			finit
			fild	@LS
			fld	@propx
			fmul
			fist	@LS
			mov	eax,@LS
			mul	ebx
			add	eax,esi
			mov	eax,dword ptr[eax]
			mov	dword ptr[edi],eax
			add	edi,3
			inc	ecx
			cmp	ecx,DesWidth
			jne	@b
			add	edi,@Null2
			pop	ecx
			inc	ecx
			cmp	ecx,DesHeigth
			jne	Hlp
		popad
			ret

_prop endp
		
_initTable	proc;此模块用来对程序中要重复计算的数据写入表中,运行时直接查找却可,降低CPU占用率
		local	@arc:qword
		local	@ls
		local	@ls1
		local	@ls2
		local	@R
		;-----------------------------------------------------------------
		;↓提取水平扫描线下方(256线变为163线),163=(256/π)*2
		;-----------------------------------------------------------------
		mov	@ls,163
		mov	ebx,163
		lea	edi,Table1
		@@:
		invoke	_arccos,ebx,163,addr @arc
		finit
		fld	@arc
		fimul	@ls
		fist	@ls1
		mov	eax,@ls1
		mov	ecx,512*3
		mul	ecx
		mov	dword ptr[edi],eax
		add	edi,4
		dec	ebx
		jnz	@b
		;------------------------------------------------------------------
		;↓提取水平扫描线上方(256线变为163线)
		;------------------------------------------------------------------
		@@:
		invoke	_arcsin,ebx,163,addr @arc
		finit
		fld	@arc
		fimul	@ls
		fist	@ls1
		mov	eax,@ls1
		mov	ecx,512*3
		mul	ecx
		add	eax,512*256*3
		mov	dword ptr[edi],eax
		add	edi,4
		inc	ebx
		cmp	ebx,163
		jne	@b
		;------------------------------------------------------------------
		;↓提取垂直线左163线
		;------------------------------------------------------------------
		lea	edi,Table2
		mov	ebx,163
		@@:
		invoke	_arccos,ebx,163,addr @arc
		finit
		fld	@arc
		fimul	@ls
		fist	@ls1
		mov	eax,@ls1
		mov	ecx,3
		mul	ecx
		mov	dword ptr[edi],eax
		add	edi,4
		dec	ebx
		jnz	@b
		;-----------------------------------------------------------
		;↓提取垂直线右163线
		;-----------------------------------------------------------
		@@:
		invoke	_arcsin,ebx,163,addr @arc
		finit
		fld	@arc
		fimul	@ls
		fist	@ls1
		mov	eax,@ls1
		mov	ecx,3
		mul	ecx
		add	eax,256*3
		mov	dword ptr[edi],eax
		add	edi,4
		inc	ebx
		cmp	ebx,163
		jne	@b
		;-----------------------------------------------------------
		;↓设置下163线每条水平线的宽度(此宽度为实际的1/2)
		;-----------------------------------------------------------
		lea	edi,Rtable
		mov	ecx,163
		@@:
		mov	eax,ecx
		mul	ecx
		mov	ebx,163*163
		sub	ebx,eax
		mov	@R,ebx
		finit
		fild	@R
		fsqrt
		fist	@R
		mov	eax,@R
		mov	dword ptr[edi],eax
		add	edi,4
		dec	ecx
		jnz	@b
		;-----------------------------------------------------------
		;↓设置上163线每条水平线的宽度(此宽度为实际的1/2)
		;-----------------------------------------------------------
		@@:
		mov	eax,ecx
		mul	ecx
		mov	ebx,163*163
		sub	ebx,eax
		mov	@R,ebx
		finit
		fild	@R
		fsqrt
		fist	@R
		mov	eax,@R
		mov	dword ptr[edi],eax
		add	edi,4
		inc	ecx
		cmp	ecx,163
		jne	@b
		;-----------------------------------------------------------
		;↓提取左垂直线163线转每条球体水平线的宽度
		;-----------------------------------------------------------
		lea	esi,Rtable
		lea	edi,Table3
		mov	ecx,163
		@@:
		push	ecx
		cmp	dword ptr[esi],0
		jz	lop
		finit
		fild	@ls
		fidiv	dword ptr[esi]
		fst	@R
		mov	eax,dword ptr[esi]
		shl	eax,1
		mov	@ls2,eax
		mov	ecx,0
		lop1:
		mov	@ls1,ecx
		finit
		fld	@R
		fimul	@ls1
		fist	@ls1
		mov	eax,@ls1
		mov	ebx,3
		mul	ebx
		mov	dword ptr[edi],eax
		add	edi,4
		inc	ecx
		cmp	ecx,@ls2
		jne	lop1
		lop:
		add	esi,4
		pop	ecx
		dec	ecx
		jnz	@b
		;-----------------------------------------------------------
		;↓提取右垂直线163线转每条球体水平线的宽度
		;-----------------------------------------------------------
		lea	esi,Rtable
		add	esi,163*4
		mov	ecx,163
		@@:
		push	ecx
		cmp	dword ptr[esi],0
		jz	lop2
		finit
		fild	@ls
		fidiv	dword ptr[esi]
		fst	@R
		mov	eax,dword ptr[esi]
		shl	eax,1
		mov	@ls2,eax
		mov	ecx,0
		lop3:
		mov	@ls1,ecx
		finit
		fld	@R
		fimul	@ls1
		fist	@ls1
		mov	eax,@ls1
		mov	ebx,3
		mul	ebx
		mov	dword ptr[edi],eax
		add	edi,4
		inc	ecx
		cmp	ecx,@ls2
		jne	lop3

⌨️ 快捷键说明

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