📄 eagle.asm
字号:
;; 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 + -