View previous topic :: View next topic |
Author |
Message |
unitrant
Joined: 18 Jul 2005 Posts: 9 Location: Hertfordshire. UK
|
Using assembler in C source |
Posted: Fri Aug 11, 2006 3:17 am |
|
|
Can anyone suggest how I can alter the following assembler snippet so CCS compiler will like it, please?
Code: |
incf sRxTx_Pntr,F // step the pointer
incf sRxTx_Count,F // step num chrs rcvd
movf sRxTx_Pntr,W // is pointer too far?
sublw LOW sRx_BuffLimit // check against limit address
btfsc STATUS,0 // skip if greater (no ETX)
|
sRx_BuffLimit is defined as the address of the last byte in the sRxTx_Buffer which is Bank 2. The compiler doesn't like the use of LOW to get the lower byte of the address, which is all that is required here. So far my attempts to use C expressions to coerce it have failed.
I would like to avoid rewriting the code as it would, I think, get longert and this is a time critical interrupt handler. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Aug 11, 2006 11:47 am |
|
|
Write a test program and look at the .LST file. What is it doing ?
It's only an 8-bit machine. What byte is it likely to be using ?
The answer in in the .LST file. |
|
|
unitrant
Joined: 18 Jul 2005 Posts: 9 Location: Hertfordshire. UK
|
|
Posted: Fri Aug 11, 2006 12:18 pm |
|
|
Thank you for your suggestion. The problem is that the compiler does not like any of my attempts to derive what is effectively an offset (8bit) from the base address of sRxTx_Buffer. Hence the code will not compile and no .lst file ensues.
I realise that the compiler has poor support for assembler code, not unreasonably, but I wanted to save converting this section of a reasonably sized assembler project until later. Probably easier to do it now after all. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Aug 11, 2006 12:27 pm |
|
|
Look at the .LST file shown below for this test program:
Code: | #include <16F877.H>
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock=4000000)
#byte STATUS = 0x03
//======================================
void main()
{
int8 sRxTx_Pntr;
int8 sRxTx_Count;
int16 sRx_BuffLimit;
#asm
incf sRxTx_Pntr,F // step the pointer
incf sRxTx_Count,F // step num chrs rcvd
movf sRxTx_Pntr,W // is pointer too far?
sublw sRx_BuffLimit // check against limit address
btfsc STATUS,0 // skip if greater (no ETX)
#endasm
while(1);
} |
Code: | 0000 00304 ... int8 sRxTx_Pntr;
0000 00305 ... int8 sRxTx_Count;
0000 00306 ... int16 sRx_BuffLimit;
0000 00307 ...
0000 00308 ... #asm
0000 00309 ... incf sRxTx_Pntr,F
000C 1283 00310 BCF 03.5
000D 0AA1 00311 INCF 21,F
0000 00312 ... incf sRxTx_Count,F
000E 0AA2 00313 INCF 22,F
0000 00314 ... movf sRxTx_Pntr,W
000F 0821 00315 MOVF 21,W
0000 00316 ... sublw sRx_BuffLimit
0010 3C23 00317 SUBLW 23
0000 00318 ... btfsc STATUS,0
0011 1803 00319 BTFSC 03.0
0000 00320 ... #endasm
Symbols
main.sRxTx_Pntr 00000021
main.sRxTx_Count 00000022
main.sRx_BuffLimit 00000023 |
|
|
|
Neutone
Joined: 08 Sep 2003 Posts: 839 Location: Houston
|
Re: Using assembler in C source |
Posted: Fri Aug 11, 2006 12:49 pm |
|
|
unitrant wrote: |
Code: |
incf sRxTx_Pntr,F // step the pointer
|
|
It's 8-bit. You cant increment a 16-bit pointer in a single instruction.
unitrant wrote: |
Code: |
sublw LOW sRx_BuffLimit // check against limit address
|
|
You don't have to specify the low byte because the instruction only operates on a single byte. |
|
|
|