Something like this?
z=a+b<<4+c<<8+d<<12
Ioannis
First thing is to isolate each 4LSB of each variable. Easy way, using boolean AND (&)"Z" holds
A= 0-3,
B= 4-7,
C=8-11,and
D=12-15.
Now, you need to shift some bits of your Bytes variables. This is done using left shift (<<). Check your manual about that. Knowing that, we could modify the above likeCode:A = A & $0F B = B & $0F C = C & $0F D = D & $0F
Now you need to combine A & B, and C & D, then the whole thing together. Boolean OR do the trickCode:A = A & $0F B = B << 4 C = C & $0F D = D << 4
Then you need to send A and C where they're suppose to go in ZCode:A = (A & $0F) | (B <<4) ' a hold A & B C = (C & $0F) | (D <<4) ' C hold C & D
A is now LSB of Z(0-7), C is now MSB of Z(8-15).Code:Z.LowByte = A Z.HighByte = C
This could be shorten like
If you're REALLY SURE you NEVER EVER mess with bits <7:4> of your variables, then yes, this could reduce toCode:Z.LowByte = (A & $0F) | (B <<4) Z.HighByte = (C & $0F) | (D <<4)
ORCode:Z.HighByte = (D<<4) | C Z.LowByte = (B<<4) | A
I see other ways, but this should be more than enough to startCode:Z = (D<<12) | (C<<8) | (B<<4) | A![]()
Steve
It's not a bug, it's a random feature.
There's no problem, only learning opportunities.
One step further..
or.. yet anotherCode:Z VAR WORD A VAR Z.LOWBYTE B VAR BYTE C VAR Z.HIGHBYTE D VAR BYTE ' ' Some other code where you set A, B, C & D BYTE variables ' Z.HIGHBYTE = Z.HIGHBYTE | (D<<4) Z.LOWBYTE = Z.LOWBYTE | (B<<4) ' Now you have everything in Z... easy huh?
EnjoyCode:Z = Z | (B<<4) | (D<<12)![]()
Last edited by mister_e; - 11th November 2008 at 23:10.
Steve
It's not a bug, it's a random feature.
There's no problem, only learning opportunities.
I've tried Ioannis suggestion and it seems to work fine, I'll will try the others to. I do not plan to ever use bits 7-4 so I will give these a try. I am just playing around trying to see what does and does not work. I learned something new and appreciate all the help.
Again, Many Thanks
Steve's solutions cover the case that high nibble could hold some bits at 1 and masks to zero. Mine is based on the assumption that high nibbles will always be 0.
It would also be interesting to know which way is less memory hungry.
Ioannis
this one
ought to be the the less memory hungry.Code:Z VAR WORD A VAR Z.LOWBYTE B VAR BYTE C VAR Z.HIGHBYTE D VAR BYTE ' ' Some other code where you set A, B, C & D BYTE variables ' Z.HIGHBYTE = Z.HIGHBYTE | (D<<4) Z.LOWBYTE = Z.LOWBYTE | (B<<4)
while changing the last two line by
should use more code space.Code:Z = Z | (B<<4) | (D<<12)
In the above A & C are Aliases, so shouldn't need any extra RAM.
this
ought to use load of RAM and time to execute... BUT this said, I'm rusty and my memory/capacity fade since few months...Code:z=a+b<<4+c<<8+d<<12
Last edited by mister_e; - 11th November 2008 at 23:37.
Steve
It's not a bug, it's a random feature.
There's no problem, only learning opportunities.
Here's one that won't get used.
But since the questions of how big and how fast came up, you won't find anything smaller or faster. (unless Bruce shows up)
Code:GroupVars VAR BYTE[6] A VAR GroupVars(0) B VAR GroupVars(1) C VAR GroupVars(2) D VAR GroupVars(3) ZW VAR WORD EXT : @ZW = _GroupVars + 4 ASM CHK?RP _GroupVars swapf _D, W ; swap nibbles in D iorwf _C, W ; or with C movwf ZW + 1 ; move to Highbyte of word swapf _B, W ; swap nibbles in B iorwf _A, W ; or with A movwf ZW ; move to LowByte of word ENDASM
DT
Bookmarks