#ifndef __FASTMEM_HPP #define __FASTMEM_HPP #ifdef __cplusplus extern "C" { #endif #ifndef _BIG_INLINE void __far memset8(void __far *p, unsigned char value, unsigned bytes); #pragma aux memset8 \ parm [es di] [ax] [cx] \ modify exact [di ax cx dx] void __far memset16(void __far *p, unsigned value, unsigned words); #pragma aux memset16 \ parm [es di] [ax] [cx] \ modify exact [di ax cx dx] void __far memset32(void __far *p, unsigned long value, unsigned dwords); #pragma aux memset32 \ parm [es di] [dx ax] [cx] \ modify exact [di ax cx dx] void __far memcpy8(void __far *d, const void __far *s, unsigned bytes); #pragma aux memcpy8 \ parm [es di] [dx si] [cx] \ modify exact [di si cx dx] #else /*_BIG_INLINE*/ void memset8(void __far *p, unsigned char value, unsigned bytes); #pragma aux memset8 = \ " .386p "\ " jcxz thatsIt "\ " "\ " mov ah,al "\ " mov dx,ax "\ " shl eax,16 "\ " mov ax,dx "\ " "\ " cld "\ " test di,1 "\ " jz aligned16 "\ " stosb "\ " dec cx "\ " jz thatsIt "\ " "\ "aligned16: test di,2 "\ " jz aligned32 "\ " stosb "\ " dec cx "\ " jz thatsIt "\ " stosb "\ " dec cx "\ " "\ "aligned32: mov dx,cx "\ " shr cx,2 "\ " rep stosd "\ " mov cx,dx "\ " and cx,3 "\ " rep stosb "\ "thatsIt: "\ parm [es di] [ax] [cx] \ modify exact [di ax cx dx] void memset16(void __far *p, unsigned value, unsigned words); #pragma aux memset16 = \ ".386p "\ " jcxz thatsIt "\ " "\ " cld "\ " "\ " mov bx,ax "\ " shl eax,16 "\ " mov ax,bx "\ " "\ " mov dx,di "\ " "\ " test di,1 "\ " jz aligned16 "\ " stosb "\ " ror eax,8 "\ " dec cx "\ " jz lastByte "\ " "\ "aligned16: test di,2 "\ " jz aligned32 "\ " stosw "\ " dec cx "\ " "\ "aligned32: shr cx,1 "\ " rep stosd "\ " jnc lastByte "\ " stosw "\ " "\ "lastByte: test dx,1 "\ " jz thatsIt "\ " stosb "\ " "\ "thatsIt: "\ parm [es di] [ax] [cx] \ modify exact [di ax cx dx] void memset32(void __far *p, unsigned long value, unsigned dwords); #pragma aux memset32 = \ ".386p "\ " jcxz thatsIt "\ " "\ " cld "\ " "\ " xchg dx,ax "\ " shl eax,16 "\ " mov ax,dx "\ " "\ " mov dx,di "\ " "\ " test di,1 "\ " jz aligned16 "\ " stosb "\ " ror eax,8 "\ " dec cx "\ " jz doRest "\ " test di,2 "\ " jz mainCopy "\ " stosw "\ " ror eax,16 "\ " jmp mainCopy "\ " "\ "aligned16: test di,2 "\ " jz mainCopy "\ " stosw "\ " ror eax,16 "\ " dec cx "\ " jz doRest "\ " "\ "mainCopy: rep stosd "\ " "\ "doRest: test dx,2 "\ " jz lastByte "\ " stosw "\ " ror eax,16 "\ "lastByte: test dx,1 "\ " jz thatsIt "\ " stosb "\ " "\ "thatsIt: "\ parm [es di] [dx ax] [cx] \ modify exact [di dx ax cx] void memcpy8(void __far *d, const void __far *s, unsigned bytes); #pragma aux memcpy8 = \ " push ds "\ " mov ds,dx "\ " jcxz thatsIt "\ " "\ " cld "\ " "\ " test si,1 "\ " jnz si_word_unaligned"\ " test di,1 "\ " jz sidi_word_aligned "\ " jmp maincopy "\ "si_word_unaligned: "\ " test di,1 "\ " jz maincopy "\ " "\ "sidi_word_unaligned: "\ " movsb "\ " dec cx "\ " jz thatsIt "\ " "\ "sidi_word_aligned: "\ " test di,2 "\ " jz maincopy "\ " test si,2 "\ " jz maincopy "\ " movsw "\ " sub cx,2 "\ " jz thatsIt "\ " "\ "maincopy: "\ " mov dx,cx "\ " shr cx,2 "\ " rep movsd "\ " mov cx,dx "\ " and cx,3 "\ " rep movsb "\ " "\ "thatsIt: "\ " pop ds "\ parm [es di] [dx si] [cx] \ modify exact [di si cx dx] #endif #ifdef __cplusplus }; #endif #endif /*__FASTMEM_HPP*/