=== expression w/ multiply and divide operations === #define TXTBASE ((unsigned int *)0x0400) #define TXTWIDTH 32 #define TXTLINES 16 #define TXTSIZE ((unsigned int)TXTWIDTH*TXTLINES) #define TXTEND (TXTBASE+TXTSIZE) static unsigned char *_getpos(unsigned char x, unsigned char y) { unsigned char *pos; pos = TXTBASE + ((y / 2) * TXTWIDTH) + (x / 2); if (pos > TXTEND) return NULL; return pos; } --- non-optimized --- ?0_getpos LEAS -2,S LDB 5,S CLRA TFR D,X LDB #2 CLRA JSR ?div TFR D,X LDB #32 CLRA JSR ?mul ADDD #1024 PSHS A,B LDB 9,S CLRA TFR D,X LDB #2 CLRA JSR ?div ADDD ,S++ STD 0,S LDD 0,S TFR D,X LDD #1536 JSR ?ugt LBEQ ?8 LDD #0 JMP ?9 ?8 EQU * LDD 0,S ?9 EQU * LEAS 2,S RTS --- optimized --- ?0_getpos LEAS -2,S LDB 5,S CLRA TFR D,X LDD #(2)&255 JSR ?div TFR D,X LDD #(32)&255 JSR ?mul ADDD #1024 PSHS A,B LDB 9,S CLRA TFR D,X LDD #(2)&255 JSR ?div ADDD ,S++ STD ,S CMPD #1536 LBLS ?8 CLRA CLRB JMP ?9 ?8 EQU * LDD ,S ?9 EQU * PULS X,PC === expression w/ logical operations === #define TXTBASE ((unsigned int *)0x0400) #define TXTWIDTH 32 #define TXTLINES 16 #define TXTSIZE ((unsigned int)TXTWIDTH*TXTLINES) #define TXTEND (TXTBASE+TXTSIZE) static unsigned char *_getpos(unsigned char x, unsigned char y) { unsigned char *pos; /* * Hand-optimized expression, equivalent to this: * * pos = TXTBASE + ((y / 2) * TXTWIDTH) + (x / 2); * */ pos = TXTBASE + ((y & 0xfe) << 4) + (x >> 1); if (pos > TXTEND) return NULL; return pos; } --- non-optimized --- ?0_getpos LEAS -2,S LDB 5,S ANDB #254 CLRA TFR D,X LDB #4 CLRA JSR ?shl ADDD #1024 PSHS A,B LDB 9,S CLRA TFR D,X LDB #1 CLRA JSR ?shr ADDD ,S++ STD 0,S LDD 0,S TFR D,X LDD #1536 JSR ?ugt LBEQ ?8 LDD #0 JMP ?9 ?8 EQU * LDD 0,S ?9 EQU * LEAS 2,S RTS --- optimized --- ?0_getpos LEAS -2,S LDB 5,S ANDB #254 CLRA TFR D,X LDD #(4)&255 JSR ?shl ADDD #1024 PSHS A,B LDB 9,S CLRA TFR D,X LDD #(1)&255 JSR ?shr ADDD ,S++ STD ,S CMPD #1536 LBLS ?8 CLRA CLRB JMP ?9 ?8 EQU * LDD ,S ?9 EQU * PULS X,PC