??? 09/03/09 18:06 Read: times |
#168725 - Code: Addressing bit memory indirectly Responding to: ???'s previous message |
;********************** set bit indirect pointed by acc ***************** ;Attention: bit address must be below 80h ! ;Input: ACC = bit number 00 ... 7F ;Output: nothing ;Used: R0, ACC ;Cycle: 16 setibit: call getibit ;get mask and address orl a, @r0 mov @r0, a ret clribit: call getibit cpl a anl a, @r0 mov @r0, a ret cplibit: call getibit xrl a, @r0 mov @r0, a ret tstibit: call getibit anl a, @r0 add a, #0FFh ret getibit: ;get byte address and bit mask mov r0, a anl a, #78h ;byte number rl a ; * 2 swap a ; / 16 = / 8 add a, #20h ;start data bit addressable xch a, r0 anl a, #7 ;bit number inc a movc a, @a+pc ;bit mask ret db 1, 2, 4, 8, 10h, 20h, 40h, 80h ;------------------------------------------------------------------------ And following the same in C: /************************************************************************/ /* */ /* Bit Pointer Implementation */ /* */ /* SFR bits can not be accessed ! */ /* */ /* Author: Peter Dannegger */ /* */ /************************************************************************/ #pragma cd typedef unsigned char uchar; typedef unsigned int uint; #define BIT_START 0x20 static uint getibit( uchar bitptr ) { uchar code bitmask[] = { 1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80 }; return (uint)bitmask[bitptr & 7] << 8 | // high byte = bit mask (uchar) (bitptr / 8 + BIT_START); // low byte = byte address } void setibit( uchar bitptr ) // *bitptr = 1; { uint mask_addr = getibit( bitptr ); *(uchar idata *)mask_addr |= mask_addr >> 8; } void clribit( uchar bitptr ) // *bitptr = 0; { uint mask_addr = getibit( bitptr ); *(uchar idata *)mask_addr &= ~(mask_addr >> 8); } void cplibit( uchar bitptr ) // *bitptr ^= 1; { uint mask_addr = getibit( bitptr ); *(uchar idata *)mask_addr ^= mask_addr >> 8; } void movibit( uchar bitptr, bit inbit ) // *bitptr = inbit; { inbit ? setibit( bitptr ) : clribit( bitptr ); } bit tstibit( uchar bitptr ) // return *bitptr; { uint mask_addr = getibit( bitptr ); return *(uchar idata *)mask_addr & mask_addr >> 8; } Peter |
Topic | Author | Date |
Addressing bit memory indirectly | 01/01/70 00:00 | |
Not possible. | 01/01/70 00:00 | |
so why Bit addressable memory? | 01/01/70 00:00 | |
sure you can and THINK | 01/01/70 00:00 | |
Fast and saves code and RAM space | 01/01/70 00:00 | |
No such instruction... | 01/01/70 00:00 | |
Thanks so much | 01/01/70 00:00 | |
That's _too_ limited... | 01/01/70 00:00 | |
Not vast - actually quite small. | 01/01/70 00:00 | |
bible time | 01/01/70 00:00 | |
store bit address... | 01/01/70 00:00 | |
Thanks | 01/01/70 00:00 | |
if '2051' is the Atmel, then | 01/01/70 00:00 | |
"cable" only for the "S" | 01/01/70 00:00 | |
I second the motion and add | 01/01/70 00:00 | |
I have... | 01/01/70 00:00 | |
Smoking bad for the health | 01/01/70 00:00 | |
an issue many newbies are not aware of is ... | 01/01/70 00:00 | |
NXP??? | 01/01/70 00:00 | |
Design flaw? | 01/01/70 00:00 | |
a feature | 01/01/70 00:00 | |
cheap | 01/01/70 00:00 | |
Code: Addressing bit memory indirectly![]() | 01/01/70 00:00 |