[sdiy] help...no make8() function in Arduino...converting PIC to AVR
Veronica Merryfield
veronica at merryfield.ca
Wed Apr 11 19:21:49 CEST 2012
The pre-processor uses textual substitution to expand macros
#define _mul (al, val) ((int)(((al)*(val))>>8)
used...
tmp2 = _mul (acc2, tmpamt);
becomes...
tmp2 = ((int)(((acc2)*(tmpamt))>>8);
before the compiler proper does it's thing.
On 2012-04-11, at 10:13 AM, dan snazelle wrote:
> more specifically
>
> in a macro
>
>
> #define _mul (int)( a1*val>>8)
>
>
> then when i go in and i do
>
>
> tmp2 = _mul (acc2, tmpamt);
>
> how does the define know that acc2=a1 and tmpampt=val??
>
> thanks
>
>
> On Apr 11, 2012, at 12:57 PM, Olivier Gillet wrote:
>
>> There's a cost associated to calling "proper" functions - parameters
>> being pushed to the stack or moved to the right register, then a jump,
>> the body of the function, a return, and moving the result from the
>> output register to whatever register the result should be in. You
>> don't want such small things to be functions - and that's probably why
>> they were defined as macros in the first place! So you either have to
>> define those as macro ; or as inline functions, using something like
>> __attribute__((always_inline)) in the declaration. gcc might be smart
>> enough to inline them without being forced to do so with the
>> __attribute__, but it's not a very good thing to make such
>> assumptions.
>>
>> Olivier
>>
>> On Wed, Apr 11, 2012 at 6:47 PM, dan snazelle <subjectivity at hotmail.com> wrote:
>>> ok so if
>>>
>>>
>>> make8 = (((var >> (offset*8)) & 0xff)
>>> _mul value = (int)( a1*val1>>8);
>>>
>>>
>>>
>>> then since i dont quite understand the parentheses in define I could make 2 functions
>>>
>>>
>>>
>>> byte make8(int var, byte offset)
>>> {
>>> byte result=(((var >> (offset*8)) & 0xff);
>>> return result;}
>>>
>>>
>>>
>>> and for the other function (_mul)
>>>
>>>
>>> int _mul (byte a1, byte val) {
>>>
>>> int result=(int)( a1*val1>>8);
>>> return result;
>>> }
>>>
>>>
>>>
>>> do those look right?
>>>
>>>
>>> thanks
>>>
>>>
>>>
>>>
>>>
>>> On Apr 11, 2012, at 12:00 PM, Martin Klang wrote:
>>>
>>>>
>>>> what do they do on the pic?
>>>>
>>>> make8 I found in the PIC C Compiler Reference:
>>>> i8 = MAKE8(var, offset)
>>>> Same as: i8 = (((var >> (offset*8)) & 0xff)
>>>>
>>>> so that
>>>>> tmpbyte1 = make8(tmp1, 1);
>>>>
>>>> would be
>>>> tmpbyte1 = (tmp1 >> 8) & 0xff;
>>>>
>>>> and _mul() multiplies, right?
>>>>
>>>> Looks like the code is specifically optimised for the pic instructions set -
>>>> tmp1 is 16 bit, right? acc1 and val1 8-bit unsigned integers?
>>>>
>>>> Presumably you can replace the two lines with
>>>> uint8_t value = (uint8_t)( acc1*val1>>8);
>>>> depending on data types, but would have to see some more code to know.
>>>>
>>>>
>>>> hth,
>>>>
>>>> /m
>>>>
>>>> On 11 Apr 2012, at 16:25, dan snazelle wrote:
>>>>
>>>>> can someone help me ?
>>>>>
>>>>> i am trying to convert some PIC code to AVR
>>>>>
>>>>> it is going fine except for 2 things
>>>>>
>>>>> there is no make8() function and there is no _mul()
>>>>>
>>>>>
>>>>> so code lines like this:
>>>>>
>>>>>
>>>>> tmp1 = _mul (acc1, val1);
>>>>>
>>>>> tmpbyte1 = make8(tmp1, 1);
>>>>>
>>>>>
>>>>> do not work
>>>>>
>>>>>
>>>>>
>>>>> i have been looking for the make8 function online so i can just write that function into my code but no luck
>>>>>
>>>>>
>>>>> thanks for any help!
>>>>
>>>>
>>>
>>> _______________________________________________
>>> Synth-diy mailing list
>>> Synth-diy at dropmix.xs4all.nl
>>> http://dropmix.xs4all.nl/mailman/listinfo/synth-diy
>>
>
> _______________________________________________
> Synth-diy mailing list
> Synth-diy at dropmix.xs4all.nl
> http://dropmix.xs4all.nl/mailman/listinfo/synth-diy
>
More information about the Synth-diy
mailing list