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

📄 eagle.asm

📁 十七种模拟器源代码 非常有用的作课程设计不可缺少的
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;; Eagle.asm;; Eagle version 0.41 for NASM;; Written by Dirk Stevens;; compile with : nasm -f coff eagle.asm for use with DJGPP; Using optimization with DJGPP and coff objects could result in; erronous behaviour!;; History : ; Date		Version		Comments;; 30-Sep-1998     0.41			- Minor modification in 16bit MMX code;; 20-Jun-1998	0.40			-Added 16bit color support for MMX;						-Incorporated Larry Bank's suggestions;; 29-March-1998   0.31			-eagle_bmp for use in plain bmps;; 28-March-1998	0.30			-Handle buffer internally;						-Added optimised MMX copying (fast!);						-Everything is done in one routine;; 15-March-1998	0.20			-First NASM version;						-Added parameter for Eagle_Lines;						-Added support for MMX;						-Optimised further for non-MMX;;------------------------------------------------------------	  BITS 32	  GLOBAL _eagle	  GLOBAL _eagle_mmx16	  GLOBAL _eagle_bmp	  SECTION .text;eagle       (  unsigned long *lb,;               unsigned long *lb2,;               int width,;		    int destination_segment,;		    screen_address1,;		    screen_address2 )_eagle:	pushad	; test for mmx	mov eax,1	cpuid	test edx, 0x00800000	jnz near _eagle_mmx	push ebp	mov ebp, esp	add ebp, 32      mov esi,[ebp+8]	mov ebx,[ebp+12]	mov ecx,[ebp+16]	mov edi, _eagle_buffer	mov eax, _eagle_buffer+2048	and edi, 0xFFFFFFE0	and eax, 0xFFFFFFE0 	mov ebp, ebx	shr ecx,2	xor dx,dx.L0		push ecx	xchg eax,ecx	mov eax, [esi]	add esi,4	mov ebx,[ebp]	add ebp,4	push ebp	cmp eax,ebx	jne near .L999	rol eax, 8	cmp eax,ebx	jne .L998	jmp .L997.L998	ror eax,8	jmp .L999.L997	ror eax,8	cmp dl, dh	jne near .L999	cmp dl, al	jne near .L999	mov [edi],eax	mov [ecx],ebx	mov [edi+4],eax	mov [ecx+4],ebx	add edi,8	add ecx,8	pop eax	mov ebp,eax	pop eax	xchg eax,ecx	dec ecx	cmp ecx, 0	je near .L333	push ecx	xchg eax,ecx	mov eax, [esi]	add esi,4	cmp ebx, eax	jne .L888	mov ebx,[ebp]	add ebp,4	cmp ebx, eax	jne .L889	mov [edi],eax	mov [ecx],ebx	mov [edi+4],eax	pop eax	mov [ecx+4],ebx	add edi,8	add ecx,8	xchg eax,ecx	dec ecx	jnz near .L0	jmp .L333.L888	mov ebx,[ebp]	add ebp, 4.L889	push ebp.L999	cmp dh, bl	jne .L6001.L1001	cmp bl, al	jne .L3001.L2001	mov [edi],al	mov [ecx],dh	mov [edi+1],al	mov [ecx+1],bl	jmp .L11.L3001	cmp dh, dl	jne .L5001.L4001	mov [edi], dx	mov [ecx], dx	jmp .L11.L5001	mov [edi],dl	mov [ecx],dh	mov [edi+1],al	mov [ecx+1],bl	jmp .L11.L6001	cmp dl, al	jne .L12001.L7001	cmp dl, dh	jne .L9001.L8001	mov [edi], dx	mov [ecx], dx	jmp .L11.L9001	cmp al,bl	jne .L11001.L10001	mov [edi],dl	mov [ecx],bl	mov [edi+1],al	mov [ecx+1],bl	jmp .L11.L11001.L12001	mov [edi],dl	mov [ecx],dh	mov [edi+1],al	mov [ecx+1],bl.L11	cmp bl, bh	jne .L6002.L1002	cmp bh, ah	jne .L3002.L2002	mov [edi+2],bx	mov [ecx+2],bx	jmp .L12.L3002	cmp bl, al	jne .L5002.L4002	mov [edi+2],bx	mov [ecx+2],bx	jmp .L12.L5002	mov [edi+2],ax	mov [ecx+2],bx	jmp .L12.L6002	cmp al, ah	jne .L12002.L7002	cmp al, bl	jne .L9002.L8002	mov [ecx+2],ax	mov [edi+2],ax	jmp .L12.L9002	cmp ah,bh	jne .L11002.L10002	mov [ecx+2],ax	mov [edi+2],ax	jmp .L12.L11002.L12002	mov [edi+2], ax	mov [ecx+2], bx	.L12	ror ebx, 8	ror eax, 8	cmp bl, bh	jne .L6003.L1003	cmp bh, ah	jne .L3003.L2003	mov [edi+4],bx	mov [ecx+4],bx	jmp .L13.L3003	cmp bl, al	jne .L5003.L4003	mov [edi+4],bx	mov [ecx+4],bx	jmp .L13.L5003	mov [edi+4], ax	mov [ecx+4], bx	jmp .L13.L6003	cmp al, ah	jne .L12003.L7003	cmp al, bl	jne .L9003.L8003	mov [ecx+4], ax	mov [edi+4], ax	jmp .L13.L9003	cmp ah,bh	jne .L11003.L10003	mov [ecx+4], ax	mov [edi+4], ax	jmp .L13.L11003.L12003	mov [edi+4],ax	mov [ecx+4],bx.L13	ror ebx, 8	ror eax, 8	cmp bl, bh	jne .L6004.L1004	cmp bh, ah	jne .L3004.L2004	mov [edi+6], bx	mov [ecx+6], bx	jmp .L14.L3004	cmp bl, al	jne .L5004.L4004	mov [edi+6], bx	mov [ecx+6], bx	jmp .L14.L5004	mov [edi+6], ax	mov [ecx+6], bx	jmp .L14.L6004	cmp al, ah	jne .L12004.L7004	cmp al, bl	jne .L9004.L8004	mov [ecx+6], ax	mov [edi+6], ax	jmp .L14.L9004	cmp ah,bh	jne .L11004.L10004	mov [ecx+6], ax	mov [edi+6], ax	jmp .L14.L11004.L12004	mov [edi+6], ax	mov [ecx+6], bx.L14	add edi, 8	mov dl, ah	add ecx, 8	mov dh, bh	pop eax;	mov eax, ebp	Was this an unnoticed error ?	mov ebp, eax	pop eax	xchg eax,ecx	dec ecx	jnz near .L0.L333	mov esi, _eagle_buffer	mov ebx, _eagle_buffer+2048	and esi, 0xFFFFFFE0	and ebx, 0xFFFFFFE0	mov ecx,[esp+16+32]	mov edx,[esp+20+32]	mov ax, es	push ax	mov es, dx	mov edi,[esp+26+32]	mov eax,[esp+30+32]	cld	push ecx	rep	movsd	pop ecx	mov edi, eax	mov esi, ebx		rep	movsd	pop ax	mov es, ax	pop eax	mov ebp, eax	popad	ret_eagle_mmx:	push ebp      mov esi,[esp+8+32]	mov ebx,[esp+12+32]	mov ecx,[esp+16+32]	mov edi, _eagle_buffer	mov eax, _eagle_buffer+2048	and edi, 0xFFFFFFE0	and eax, 0xFFFFFFE0	mov ebp, ebx	shr ecx, 3              ; divide by eight because mmx registers are 8 bytes	xor dx,dx.L0	push ecx	xchg eax,ecx	movq mm0,[esi]	movq mm1,[ebp]	add esi,8	add ebp,8	movd eax, mm0	movd ebx, mm1	cmp dh, bl	jne .L6001.L1001	cmp bl, al	jne .L3001.L2001	mov [edi],al	mov [ecx],dh	mov [edi+1],al	mov [ecx+1],bl	jmp .L11.L3001	cmp dh, dl	jne .L5001.L4001	mov [edi],dx	mov [ecx],dx	jmp .L11.L5001	mov [edi],dl	mov [ecx],dh	mov [edi+1],al	mov [ecx+1],bl	jmp .L11.L6001	cmp dl, al	jne .L12001.L7001	cmp dl, dh	jne .L9001.L8001	mov [edi],dx	mov [ecx],dx	jmp .L11.L9001	cmp al,bl	jne .L11001.L10001	mov [edi],dl	mov [ecx],bl	mov [edi+1],al	mov [ecx+1],bl	jmp .L11.L11001.L12001	mov [edi],dl	mov [ecx],dh	mov [edi+1],al	mov [ecx+1],bl.L11	movq mm4, mm1	movq mm2, mm0      pcmpeqd mm7, mm7		; set mm7 to FFFFFFFFFFFFFFFF	pcmpeqb mm4, mm0		; byte compare equal mm0 with mm1 and store in mm4	psllq mm2, 8		; shift mm0 left one byte and store in mm2	movq mm3, mm0	movq mm5, mm4		; store byte compare mm0 with mm1 in mm5	pcmpeqb mm2, mm0		; byte compare mm0 with mm2 and store in mm2	psrlq mm3, 8		; shift mm0 right one byte and store in mm3	pand mm2, mm5      movq mm6, mm1		; and mm5 with mm1	movq mm5, mm2		; not mm2 and store in mm5      pxor mm5, mm7      psllq mm6, 8	pand mm2, mm0		; and mm0 with mm2      pand mm5, mm6	por mm2, mm5    		; mm2 now contains right-bottom of quad	pcmpeqb mm3, mm0		; byte compare mm3 with mm0 and store in mm3	movq mm5, mm4		; byte compare of mm0 with mm1 store in mm5	pand mm3, mm4	movq mm5, mm3		; not mm3 store in mm5	movq mm6, mm1      pxor mm5, mm7	pand mm3, mm0      psrlq mm6, 8	pand mm5, mm6      psrlq mm2, 8	por mm3, mm5    ; now write the 16 bytes of the bottom line      movq mm4, mm2	movq mm6, mm2      punpcklbw mm4, mm3	punpckhbw mm6, mm3	movq [ecx+2],mm4	movq [ecx+10],mm6; start with top line	movq mm2, mm1	movq mm3, mm1	movq mm4, mm0      pcmpeqd mm7, mm7		; set mm7 to FFFFFFFFFFFFFFFF	pcmpeqb mm4, mm1		; byte compare equal mm0 with mm1 and store in mm4	psllq mm2, 8		; shift mm0 left one byte and store in mm2	psrlq mm3, 8		; shift mm0 right one byte and store in mm3	movq mm5, mm4		; store byte compare mm0 with mm1 in mm5	pcmpeqb mm2, mm1		; byte compare mm0 with mm2 and store in mm2	pand mm2, mm5	movq mm5, mm2		; not mm2 and store in mm5      pxor mm5, mm7	pand mm2, mm1		; and mm0 with mm2      movq mm6, mm0		; and mm5 with mm1      psllq mm6, 8      pand mm5, mm6	por mm2, mm5    		; mm2 now contains right-bottom of quad	movq mm5, mm4		; byte compare of mm0 with mm1 store in mm5	pcmpeqb mm3, mm1		; byte compare mm3 with mm0 and store in mm3	pand mm3, mm5	movq mm5, mm3		; not mm3 store in mm5      pxor mm5, mm7	pand mm3, mm1	movq mm6, mm0      psrlq mm6, 8	pand mm5, mm6	por mm3, mm5    ; now write the 16 bytes of the top line      psrlq mm2, 8      movq mm4, mm2      movq mm6, mm2      punpcklbw mm4, mm3      punpckhbw mm6, mm3	movq [edi+2],mm4      psrlq mm0, 56	movq [edi+10],mm6      psrlq mm1, 56      add ecx, 16      add edi, 16	movd edx, mm0	movd ebx, mm1	mov  dh, bl	pop eax	xchg eax,ecx	dec ecx	jnz near .L0.L333	mov esi, _eagle_buffer	mov ebx, _eagle_buffer+2048	and esi, 0xFFFFFFE0	and ebx, 0xFFFFFFE0	mov ecx,[esp+16+32]	mov edx,[esp+20+32]	mov ax, es	push ax	mov es, dx	mov edi,[esp+26+32]	mov eax,[esp+30+32]	shr ecx, 5	push ecx.first_loop:	movq mm0, [ esi ]	movq mm1, [ esi + 8 ]	movq mm2, [ esi + 16]	movq mm3, [ esi + 24]	movq mm4, [ esi + 32]	movq mm5, [ esi + 40]	movq mm6, [ esi + 48]	movq mm7, [ esi + 56]	movq [es:edi], mm0	movq [es:edi + 8], mm1	movq [es:edi + 16], mm2	movq [es:edi + 24], mm3	movq [es:edi + 32], mm4	movq [es:edi + 40], mm5	movq [es:edi + 48], mm6	movq [es:edi + 56], mm7	add edi, 64	add esi, 64	dec ecx	jnz .first_loop	pop ecx	mov edi, eax	mov esi, ebx.second_loop:	movq mm0, [ esi ]	movq mm1, [ esi + 8 ]	movq mm2, [ esi + 16]	movq mm3, [ esi + 24]	movq mm4, [ esi + 32]	movq mm5, [ esi + 40]	movq mm6, [ esi + 48]	movq mm7, [ esi + 56]	movq [es:edi], mm0	movq [es:edi + 8], mm1	movq [es:edi + 16], mm2	movq [es:edi + 24], mm3	movq [es:edi + 32], mm4	movq [es:edi + 40], mm5	movq [es:edi + 48], mm6	movq [es:edi + 56], mm7	add edi, 64	add esi, 64	dec ecx	jnz .second_loop	pop ax	mov es, ax	pop eax	mov ebp, eax	emms	popad	ret;; Eagle for 16bit color; Supported for MMX *only*;_eagle_mmx16:	pushad	push ebp      mov esi,[esp+8+32]	mov ebx,[esp+12+32]	mov ecx,[esp+16+32]	mov edi, _eagle_buffer	mov eax, _eagle_buffer+4096	and edi, 0xFFFFFFE0	and eax, 0xFFFFFFE0	mov ebp, ebx	shr ecx, 3              ; divide by 8 because mmx registers / 16 bit color	xor dx,dx

⌨️ 快捷键说明

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