home *** CD-ROM | disk | FTP | other *** search
Text File | 2000-10-06 | 9.6 KB | 504 lines | [TEXT/CWIE] |
- ///--------------------------------------------------------------------------------------
- // BlitPixieUtils - miscellaneous utilities for BlitPixie
- //
- // written by Anders F Björklund <afb@algonet.se>
- // © 1999 afb.
- ///--------------------------------------------------------------------------------------
-
- #ifndef __BLITPIXIE__
- #include "BlitPixieHeader.h"
- #endif
-
- #include "BlitPixieAsm.h"
-
- #ifndef GENERATINGASM // do not include for asm file generation
-
- short gBlitPixieProcessorType = kUnknownProcessor;
-
- ///--------------------------------------------------------------------------------------
- // BlitPixieVersion - get numeric version
- ///--------------------------------------------------------------------------------------
-
- unsigned long BlitPixieVersion( void )
- {
- return BLITPIXIE_VERSION_NUM;
- }
-
- ///--------------------------------------------------------------------------------------
- // BlitPixieVersionString - get string version
- ///--------------------------------------------------------------------------------------
-
- void BlitPixieVersionString( char string[BLITPIXIE_VERSION_STRINGLEN] )
- {
- char *p,*version = BLITPIXIE_VERSION_STRING;
-
- for ( p = version; *p; *string++ = *p++ )
- {}
- }
-
- #pragma mark -
-
- #pragma mark *** Macintosh :
- #ifdef macintosh
-
- #include <Gestalt.h>
-
- ///--------------------------------------------------------------------------------------
- // BlitPixieGetProcessorType
- ///--------------------------------------------------------------------------------------
-
- void BlitPixieGetProcessorType()
- {
- OSErr err;
- long response;
- short processor;
-
- err = Gestalt(gestaltSysArchitecture,&response);
- if ( err != noErr )
- return;
-
- if ( response == gestalt68k )
- {
- err = Gestalt(gestaltProcessorType,&response);
- if ( err != noErr )
- return;
-
- switch (response)
- {
- case gestalt68000: processor = k68000; break;
- case gestalt68010: processor = k68010; break;
- case gestalt68020: processor = k68020; break;
- case gestalt68030: processor = k68030; break;
- case gestalt68040: processor = k68040; break;
- default: return;
- }
- }
- else if ( response == gestaltPowerPC )
- {
- err = Gestalt(gestaltNativeCPUtype,&response);
- if ( err != noErr )
- return;
-
- switch (response)
- {
- case gestaltCPU601: processor = k601; break;
- case gestaltCPU603: processor = k603; break;
-
- #if UNIVERSAL_INTERFACES_VERSION >= 0x0300
- case gestaltCPU603e:
- case gestaltCPU603ev:
- processor = k603; break;
-
- case gestaltCPU604:
- case gestaltCPU604e:
- case gestaltCPU604ev:
- processor = k604; break;
- case gestaltCPU750:
- processor = kG3; break;
- #endif
-
- #if 0 /* TODO: add this when the selector is known */
- case gestaltCPU???:
- processor = kG4; break;
- #endif
-
- default: return;
- }
- }
-
- gBlitPixieProcessorType = processor;
- }
-
- #pragma mark *** Other :
- #else
-
- ///--------------------------------------------------------------------------------------
- // GetProcessorType
- ///--------------------------------------------------------------------------------------
-
- void BlitPixieGetProcessorType()
- {
- gBlitPixieProcessorType = kUnknownProcessor;
- }
-
- #endif //macintosh
-
- #endif //GENERATINGASM
-
- #pragma mark -
-
- #pragma mark *** PowerPC asm :
- #if USE_PPC_ASSEMBLY
-
- ASM_FUNC void BlitPixieMemCopy(
- register unsigned char *dst, // r3
- register unsigned char *src, // r4
- register int bytes) // r5
- {
- #define r_dst r3
- #define r_src r4
- #define r_bytes r5
-
- #define r_index r6
- #define r_chunks r7
-
- ASM_BEGIN
-
- rlwinm r_chunks,r_bytes,27,5,31
- rlwinm r10,r_bytes,0,31,31
- rlwinm r11,r_bytes,31,31,31
- rlwinm r_bytes,r_bytes,30,29,31
-
- cmplwi r_chunks,0
- cmplwi cr7,r10,0
- cmplwi cr6,r11,0
- cmplwi cr5,r_bytes,0
-
- subi r_src,r_src,32
- subi r_dst,r_dst,32
- li r_index,32
-
- beq @skipchunks
- mtctr r_chunks
- @chunkloop:
- lwzu r0,32(r_src)
- lwz r9,4(r_src)
- lwz r10,8(r_src)
- lwz r11,12(r_src)
- stwu r0,32(r_dst)
- stw r9,4(r_dst)
- stw r10,8(r_dst)
- stw r11,12(r_dst)
- lwz r0,16(r_src)
- lwz r9,20(r_src)
- lwz r10,24(r_src)
- lwz r11,28(r_src)
- stw r0,16(r_dst)
- stw r9,20(r_dst)
- stw r10,24(r_dst)
- stw r11,28(r_dst)
- bdnz @chunkloop
- @skipchunks:
-
- beq cr5,@skipwords
- mtctr r_bytes
- @wordloop:
- lwzx r0,r_src,r_index
- stwx r0,r_dst,r_index
- addi r_index,r_index,4
- bdnz @wordloop
- @skipwords:
-
- beq cr6,@skipshort
- lhzx r0,r_src,r_index
- sthx r0,r_dst,r_index
- addi r_index,r_index,2
- @skipshort:
-
- beq cr7,@skipbyte
- lbzx r0,r_src,r_index
- stbx r0,r_dst,r_index
- addi r_index,r_index,1
- @skipbyte:
-
- #undef r_dst
- ASM_END
- }
-
- ASM_FUNC void BlitPixieMemSet(
- register unsigned char *dst, // r3
- register unsigned long value, // r4
- register int bytes) // r5
- {
- #define r_dst r3
- #define r_value r4
- #define r_bytes r5
-
- ASM_BEGIN
-
- rlwinm r9,r_bytes,27,5,31
- rlwinm r10,r_bytes,0,31,31
- rlwinm r11,r_bytes,31,31,31
- rlwinm r_bytes,r_bytes,30,29,31
-
- cmplwi r9,0
- cmplwi cr7,r10,0
- cmplwi cr6,r11,0
- cmplwi cr5,r_bytes,0
-
- subi r_dst,r_dst,4
-
- beq @skipchunks
- mtctr r9
- @chunkloop:
- stw r_value,4(r_dst)
- stw r_value,8(r_dst)
- stw r_value,12(r_dst)
- stw r_value,16(r_dst)
- stw r_value,20(r_dst)
- stw r_value,24(r_dst)
- stw r_value,28(r_dst)
- stwu r_value,32(r_dst)
- bdnz @chunkloop
- @skipchunks:
-
- beq cr5,@skipwords
- mtctr r_bytes
- @wordloop:
- stwu r_value,4(r_dst)
- bdnz @wordloop
- @skipwords:
-
- beq cr6,@skipshort
- sth r_value,4(r_dst)
- addi r_dst,r_dst,2
- @skipshort:
-
- beq cr7,@skipbyte
- stb r_value,4(r_dst)
- addi r_dst,dst,1
- @skipbyte:
-
- ASM_END
- }
-
- #pragma mark *** 680x0 asm :
- #elif USE_68K_ASSEMBLY
-
- ASM_FUNC void BlitPixieMemCopy(
- unsigned char *dst,
- unsigned char *src,
- int bytes)
- {
- ASM_BEGIN
- MOVE.L A2,-(SP)
-
- MOVEA.L src,A0
- MOVEA.L dst,A1
- #if LONGINTS
- MOVE.L bytes,D2
- #else
- MOVE.W bytes,D2
- #endif
-
- MOVEQ #15,D0
- CLR.L D1
- MOVE.W D2,D1
- LSR.W #2,D1
- AND.W D0,D1
- ADD.W D1,D1 // * sizeof("MOVE.L (A0)+,(A1)+")
- LEA @loopend,A2
- SUBA.L D1,A2
- MOVE.W D2,D1
- LSR.W #6,D1
-
- @rowloop:
-
- // main block copy loop
- MOVE.W D1,D0
- JMP (A2)
- @loopstart:
- MOVE.L (A0)+,(A1)+
- MOVE.L (A0)+,(A1)+
- MOVE.L (A0)+,(A1)+
- MOVE.L (A0)+,(A1)+
- MOVE.L (A0)+,(A1)+
- MOVE.L (A0)+,(A1)+
- MOVE.L (A0)+,(A1)+
- MOVE.L (A0)+,(A1)+
- MOVE.L (A0)+,(A1)+
- MOVE.L (A0)+,(A1)+
- MOVE.L (A0)+,(A1)+
- MOVE.L (A0)+,(A1)+
- MOVE.L (A0)+,(A1)+
- MOVE.L (A0)+,(A1)+
- MOVE.L (A0)+,(A1)+
- MOVE.L (A0)+,(A1)+
- @loopend:
- DBRA D0,@loopstart
-
- // do left-over bytes
- MOVE.W D2,D0
- ANDI.W #2,D0
- BEQ.S @skipword
- MOVE.W (A0)+,(A1)+
- @skipword:
- MOVE.W D2,D0
- ANDI.W #1,D0
- BEQ.S @skipbyte
- MOVE.B (A0)+,(A1)+
- @skipbyte:
-
- MOVE.L (SP)+,A2
- ASM_END
- }
-
- ASM_FUNC void BlitPixieMemSet(
- unsigned char *dst,
- unsigned long value,
- int bytes)
- {
- ASM_BEGIN
-
- #if LONGINTS
- MOVE.L bytes,D2
- #else
- MOVE.W bytes,D2
- #endif
-
- MOVEQ #15,D0
- CLR.L D1
- MOVE.W D2,D1
- LSR.W #2,D1
- AND.W D0,D1
- ADD.W D1,D1 // * sizeof("MOVE.L (A0)+,(A1)+")
- LEA @loopend,A1
- SUBA.L D1,A1
- MOVE.W D2,D1
- LSR.W #6,D1
-
- MOVE.L value,D0
- MOVEA.L dst,A0
-
- // main block copy loop
- JMP (A1)
- @loopstart:
- MOVE.L D0,(A0)+
- MOVE.L D0,(A0)+
- MOVE.L D0,(A0)+
- MOVE.L D0,(A0)+
- MOVE.L D0,(A0)+
- MOVE.L D0,(A0)+
- MOVE.L D0,(A0)+
- MOVE.L D0,(A0)+
- MOVE.L D0,(A0)+
- MOVE.L D0,(A0)+
- MOVE.L D0,(A0)+
- MOVE.L D0,(A0)+
- MOVE.L D0,(A0)+
- MOVE.L D0,(A0)+
- MOVE.L D0,(A0)+
- MOVE.L D0,(A0)+
- @loopend:
- DBRA D1,@loopstart
-
- // do left-over bytes
- MOVE.W D2,D1
- ANDI.W #2,D1
- BEQ.S @skipword
- MOVE.W D0,(A0)+
- @skipword:
- ANDI.W #1,D2
- BEQ.S @skipbyte
- MOVE.B D0,(A0)+
- @skipbyte:
-
- ASM_END
- }
-
- #pragma mark *** Generic C :
- #elif USE_GENERIC_C
-
- #ifndef THINK_C
- #define CAN_DO_PTR_CAST 1 // can we cast pointers during assignment ? (is not ANSI, but useful)
- #else
- #define CAN_DO_PTR_CAST 0
- #endif
-
- void BlitPixieMemCopy( unsigned char *dst, unsigned char *src, int bytes)
- {
- int i;
-
- #if CAN_DO_PTR_CAST
-
- for ( i = 0; i < (bytes >> 2); i++ )
- *((unsigned long *) dst)++ = *((unsigned long *) src)++;
- if ( bytes & 2 )
- *((unsigned short *) dst)++ = *((unsigned short *) src)++;
- if ( bytes & 1 )
- *((unsigned char *) dst)++ = *((unsigned char *) src)++;
-
- #else
-
- {
- unsigned long *srcTemp = (unsigned long *) src,
- *dstTemp = (unsigned long *) dst;
-
- for ( i = 0; i < (bytes >> 2); i++ )
- *dstTemp++ = *srcTemp++;
-
- src = (unsigned char *) srcTemp;
- dst = (unsigned char *) dstTemp;
- }
- if ( bytes & 2 )
- {
- unsigned short *srcTemp = (unsigned short *) src,
- *dstTemp = (unsigned short *) dst;
-
- *dstTemp++ = *srcTemp++;
-
- src = (unsigned char *) srcTemp;
- dst = (unsigned char *) dstTemp;
- }
- if ( bytes & 1 )
- {
- unsigned char *srcTemp = (unsigned char *) src,
- *dstTemp = (unsigned char *) dst;
-
- *dstTemp++ = *srcTemp++;
-
- src = (unsigned char *) srcTemp;
- dst = (unsigned char *) dstTemp;
- }
-
- #endif
-
- }
-
- void BlitPixieMemSet( unsigned char *dst, unsigned long value, int bytes )
- {
- int i;
-
- #if CAN_DO_PTR_CAST
-
- for ( i = 0; i < (bytes >> 2); i++ )
- *((unsigned long *) dst)++ = value;
- if ( bytes & 2 )
- *((unsigned short *) dst)++ = value;
- if ( bytes & 1 )
- *((unsigned char *) dst)++ = value;
-
- #else
-
- {
- unsigned long *dstTemp = (unsigned long *) dst;
-
- for ( i = 0; i < (bytes >> 2); i++ )
- *dstTemp++ = value;
-
- dst = (unsigned char *) dstTemp;
- }
- if ( bytes & 2 )
- {
- unsigned short *dstTemp = (unsigned short *) dst;
-
- *dstTemp++ = value;
-
- dst = (unsigned char *) dstTemp;
- }
- if ( bytes & 1 )
- {
- unsigned char *dstTemp = (unsigned char *) dst;
-
- *dstTemp++ = value;
-
- dst = (unsigned char *) dstTemp;
- }
-
- #endif
-
- }
-
-
- #endif
-