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

📄 q cir earth.asm

📁 用汇编语言实现的3d动画
💻 ASM
📖 第 1 页 / 共 2 页
字号:
		lop2:
		sub	esi,4
		pop	ecx
		dec	ecx
		jnz	@b
		
		ret
_initTable	endp

_SetBmp		proc	uses ebx esi edi @hDc
		local	@lpTable3
		sub	esp,4
		ppp:
			;---------------------------------------------------------
			;对1024*512的位图提取512*512
			;---------------------------------------------------------
			mov	edi,lpMem1
			mov	esi,lpMem
			mov	ecx,8
			rep	movsd
			mov	edi,lpMem1
			mov	esi,lpMem
			mov	dword ptr[edi+18],512
			mov	dword ptr[edi+22],512
			sub	lpOffset,3;lpOffset为提取1024*512起始线(0~1023)
			cmp	lpOffset,1023*3;乘3后为起始象素
			jb	@f
			mov	lpOffset,1023*3
			@@:
			add	edi,36h
			add	esi,36h
			mov	ecx,512
			@@:
			mov	edx,lpOffset
			mov	ebx,512
			lp:
			mov	eax,esi
			cmp	edx,1023*3
			jb	lpa
			mov	edx,0
			lpa:
			add	eax,edx
			mov	eax,dword ptr[eax]
			mov	dword ptr[edi],eax
			add	edx,3
			add	edi,3
			dec	ebx
			jnz	lp
			add	esi,1024*3
			dec	ecx
			jnz	@b
			;---------------------------------------------------------
			;对水平和垂直线进行缩放(透视处理512*512转326*326)
			;---------------------------------------------------------
			mov	edi,lpMem2
			mov	esi,lpMem1
			mov	ecx,8
			rep	movsd
			mov	edi,lpMem2
			mov	esi,lpMem1
			mov	dword ptr[edi+18],326
			mov	dword ptr[edi+22],326
			add	edi,dword ptr[edi+10]
			add	esi,dword ptr[esi+10]
			lea	edx,Table1
			
			
			mov	dword ptr[esp],ebp
			mov	ebp,326
			lp1:
			mov	esi,lpMem1
			add	esi,36h
			add	esi,dword ptr[edx]
			add	edx,4
			lea	ebx,Table2
			mov	ecx,326
			@@:
			mov	eax,esi
			add	eax,dword ptr[ebx]
			mov	eax,dword ptr[eax]
			mov	dword ptr[edi],eax
			add	ebx,4
			add	edi,3
			dec	ecx
			jnz	@b
			add	edi,2
			dec	ebp
			jnz	lp1
			mov	ebp,dword ptr[esp]
			;------------------------------------------------------------------
			;对透视处理后的326*326转为一个圆形(从透视角度为一球形)
			;------------------------------------------------------------------
			mov	edi,lpMem1
			mov	esi,lpMem2
			mov	dword ptr[edi+18],326
			mov	dword ptr[edi+22],326
			add	edi,dword ptr[edi+10]
			mov	eax,-1;把位图涂为白色
			and	edi,0fffffffch
			mov	ecx,326*327*3/4
			rep	stosd
			mov	edi,lpMem1
			add	edi,dword ptr[edi+10]
			add	esi,dword ptr[esi+10]
			lea	ebx,Rtable
			lea	eax,Table3
			mov	@lpTable3,eax
			mov	ecx,163
			lp3:
			mov	dword ptr[esp],ecx
			mov	ecx,dword ptr[ebx]
			add	ebx,4
			mov	dword ptr[esp-4],ebx
			mov	eax,163
			sub	eax,ecx
			mov	ebx,3
			mul	ebx
			add	eax,edi
			shl	ecx,1
			or	ecx,ecx
			jz	@f
			mov	ebx,@lpTable3
			lp2:
			mov	edx,esi
			add	edx,dword ptr[ebx]
			mov	edx,dword ptr[edx]
			mov	dword ptr[eax],edx
			add	ebx,4
			add	eax,3
			dec	ecx
			jnz	lp2
			mov	dword ptr[eax],0ffffffffh
			mov	@lpTable3,ebx
			@@:
			add	edi,326*3+2;加2是因为位图326宽度的水平线与下一条水平线的距离
			add	esi,326*3+2;(距离=4-(宽度*3)%4;如果距离为4则距离变为0)
			mov	ebx,dword ptr[esp-4]
			mov	ecx,dword ptr[esp]
			dec	ecx
			jnz	lp3
			
			mov	ecx,163
			lp4:
			mov	dword ptr[esp],ecx
			mov	ecx,dword ptr[ebx]
			add	ebx,4
			mov	dword ptr[esp-4],ebx
			mov	eax,163
			sub	eax,ecx
			mov	ebx,3
			mul	ebx
			add	eax,edi
			shl	ecx,1
			or	ecx,ecx
			jz	@f
			mov	ebx,@lpTable3
			lp5:
			mov	edx,esi
			add	edx,dword ptr[ebx]
			mov	edx,dword ptr[edx]
			mov	dword ptr[eax],edx
			add	ebx,4
			add	eax,3
			dec	ecx
			jnz	lp5
			mov	dword ptr[eax],0ffffffffh;把右边的彩边去掉,如果没有这句会发现右边有一彩色镶边
			mov	@lpTable3,ebx
			@@:
			add	edi,326*3+2
			add	esi,326*3+2
			mov	ebx,dword ptr[esp-4]
			mov	ecx,dword ptr[esp]
			dec	ecx
			jnz	lp4
			
			;------------------------------------------------------
			;输出转换后的图形
			;------------------------------------------------------
			mov	edi,lpMem1
			mov	ebx,lpMem1
			mov	edx,lpMem1
			add	ebx,dword ptr[edi+10]
			add	edx,14
			
			mov	esi,0
			sub	esp,48
			mov	dword ptr[esp+44],esi;DIB_RGB_COLORS
			mov	dword ptr[esp+40],edx
			mov	dword ptr[esp+36],ebx
			mov	edx,dword ptr[edi+22]
			mov	dword ptr[esp+32],edx
			mov	dword ptr[esp+28],esi
			mov	dword ptr[esp+24],esi
			mov	dword ptr[esp+20],esi
			mov	dword ptr[esp+16],edx
			mov	edx,dword ptr[edi+18]
			mov	dword ptr[esp+12],edx
			mov	dword ptr[esp+8],10
			mov	dword ptr[esp+4],10
			mov	edx,@hDc
			mov	dword ptr[esp],edx
			call	SetDIBitsToDevice
			;invoke	SetDIBitsToDevice,@hDc,10,10,dword ptr[edi+18],dword ptr[edi+22],0,0,0,\
			;	dword ptr[edi+22],ebx,edx,DIB_RGB_COLORS
		inc	frame
		cmp	thjh,0
		jz	ppp
		mov	thjh,2
		add	esp,4
		ret
_SetBmp		endp

_ProcWinMain	proc	uses ebx edi esi hWnd,uMsg,wParam,lParam
		local	@stPs:PAINTSTRUCT
		local	@stRect:RECT
		local	@hDc

		mov	eax,uMsg
		.if	eax ==	WM_MOUSEMOVE
			cmp	moveJh,0
			jz	@@@
			mov	eax,lParam
			shld	ebx,eax,16
			and	eax,0ffffh
			sub	eax,mouX
			sub	ebx,mouY
			add	winRect.left,eax
			add	winRect.top,ebx
			test	winRect.left,80000000h
			jz	@f
			mov	winRect.left,0
			@@:
			test	winRect.top,80000000h
			jz	@f
			mov	winRect.top,0
			@@:
			cmp	winRect.left,20
			ja	@f
			mov	winRect.left,0
			@@:
			cmp	winRect.top,20
			ja	@f
			mov	winRect.top,0
			@@:
			;--
			mov	eax,Xscreen
			cmp	winRect.left,eax
			jb	@f
			mov	winRect.left,eax
			@@:
			sub	eax,20
			cmp	winRect.left,eax
			jb	@f
			add	eax,20
			mov	winRect.left,eax
			@@:
			mov	eax,Yscreen
			cmp	winRect.top,eax
			jb	@f
			mov	winRect.top,eax
			@@:
			sub	eax,20
			cmp	winRect.top,eax
			jb	@f
			add	eax,20
			mov	winRect.top,eax
			@@:
			invoke	MoveWindow,hWnd,winRect.left,winRect.top,358,376,1
			@@@:
		.elseif	eax ==	WM_TIMER
			mov	eax,frame
			lea	edi,buff
			add	edi,10
			mov	ecx,10
			@@:
			xor	edx,edx
			div	ecx
			add	dl,30h
			dec	edi
			mov	byte ptr[edi],dl
			or	eax,eax
			jnz	@b
			mov	frame,0
			invoke	SetWindowText,hWnd,edi
		.elseif	eax ==	WM_LBUTTONDOWN
			mov	eax,lParam
			shld	ebx,eax,16
			and	eax,0ffffh
			mov	mouX,eax
			mov	mouY,ebx
			invoke	GetWindowRect,hWnd,addr winRect
			mov	moveJh,1
		.elseif	eax ==	WM_LBUTTONUP
			mov	moveJh,0
		.elseif	eax ==	WM_NCMOUSEMOVE
			mov	moveJh,0
		.elseif	eax ==	WM_RBUTTONUP
			invoke	SendMessage,hWnd,WM_CLOSE,0,0
		.elseif	eax ==	WM_CLOSE
			invoke	KillTimer,hWnd,1
			mov	thjh,1
			invoke	SetWindowText,hWnd,addr over
			@@:
			cmp	thjh,2
			je	@f
			invoke	Sleep,1000
			jmp	@b
			@@:
			invoke	GlobalFree,lpMem
			invoke	GlobalFree,lpMem1
			invoke	GlobalFree,lpMem2
			invoke	DestroyWindow,hWinMain
			invoke	PostQuitMessage,NULL
		.elseif	eax ==	WM_CREATE
			invoke	CreateFile,addr BitMapAddr,GENERIC_READ,0,0,OPEN_EXISTING,0,0
			cmp	eax,-1
			jne	@f
			invoke	MessageBox,0,addr OpenError,0,0
			invoke	ExitProcess,0
			@@:
			mov	hFile,eax
			invoke	GetFileSize,hFile,0
			push	eax
			invoke	GlobalAlloc,GMEM_ZEROINIT,eax
			mov	lpFile,eax
			pop	ebx
			invoke	ReadFile,hFile,lpFile,ebx,addr lpMem1,0
			invoke	GlobalAlloc,0,1024*513*3
			mov	lpMem,eax
			invoke	_prop,lpMem,lpFile,1024,512;将打开的位图强制转为1024*512便于处理
			invoke	_initTable		;初始化数据
			invoke	GlobalFree,lpFile
			invoke	CloseHandle,hFile
			invoke	GlobalAlloc,0,512*513*3
			mov	lpMem1,eax
			invoke	GlobalAlloc,0,326*327*3
			mov	lpMem2,eax
			invoke	SendMessage,hWnd,400h,0,0
			mov	dword ptr[buff+10],732fa1d6h;'帧/s'
			mov	byte ptr[buff+14],0
			invoke	SendMessage,hWnd,WM_TIMER,wParam,lParam
			invoke	SetTimer,hWnd,1,1000,0
			invoke	GetSystemMetrics,SM_CXSCREEN;获取屏幕水平分辨率
			sub	eax,358
			mov	Xscreen,eax
			invoke	GetSystemMetrics,SM_CYSCREEN;获取屏幕垂直分辨率
			sub	eax,376
			mov	Yscreen,eax
		.elseif	eax ==	WM_KEYDOWN
			cmp	wParam,1bh
			jne	@f
			invoke	SendMessage,hWnd,WM_CLOSE,wParam,lParam
			@@:
		.elseif	eax ==	400h
			invoke	GetDC,hWnd
			mov	hdc,eax
			invoke	CreateThread,0,0,offset _SetBmp,eax,1,0
		.else
			invoke	DefWindowProc,hWnd,uMsg,wParam,lParam
			ret
		.endif
		
		xor	eax,eax
		ret

_ProcWinMain	endp

_WinMain	proc
		local	@stWndClass:WNDCLASSEX
		local	@stMsg:MSG

		invoke	GetModuleHandle,NULL
		mov	hInstance,eax
		invoke	RtlZeroMemory,addr @stWndClass,sizeof @stWndClass
		
		invoke	LoadCursor,0,IDC_ARROW
		mov	@stWndClass.hCursor,eax
		push	hInstance
		pop	@stWndClass.hInstance
		mov	@stWndClass.cbSize,sizeof WNDCLASSEX
		mov	@stWndClass.style,CS_HREDRAW or CS_VREDRAW
		mov	@stWndClass.lpfnWndProc,offset _ProcWinMain
		mov	@stWndClass.hbrBackground,COLOR_WINDOW + 1
		mov	@stWndClass.lpszClassName,offset szClassName
		invoke	RegisterClassEx,addr @stWndClass
		
		invoke	CreateWindowEx,WS_EX_CLIENTEDGE,offset szClassName,0,\
			WS_SYSMENU or WS_MINIMIZEBOX,\
			0,0,358,376,\
			NULL,NULL,hInstance,NULL
		mov	hWinMain,eax
		invoke	ShowWindow,hWinMain,SW_SHOWNORMAL
		invoke	UpdateWindow,hWinMain
		
		.while	TRUE
			invoke	GetMessage,addr @stMsg,NULL,0,0
			.break	.if eax	== 0
			invoke	TranslateMessage,addr @stMsg
			invoke	DispatchMessage,addr @stMsg
		.endw
		ret

_WinMain	endp

start:
		call	_WinMain
		invoke	ExitProcess,NULL
		end	start

⌨️ 快捷键说明

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