This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Can't link assemler code with c-code

I'm not that much into assemler, so I try to reuse existing asm-code as i2c-driver. I've found original Philips code for that. I try now to link it with c-code but get always linker warnings.



Any help appreciated!



NAME . . . . . . . . . USAGE    MODULE NAMES
--------------------------------------------

?C_START . . . . . . . CODE;    ** L51 GENERATED **  ?C_STARTUP
?C_STARTUP . . . . . . CODE;    ?C_STARTUP  ASMS
?IIC_TEST_DEVICE . . . CODE;    IIC_DRIVER
?IIC_TEST_DEVICE?BYTE. DATA;    IIC_DRIVER
?INIT_IIC?BYTE . . . . DATA;    IIC_DRIVER
?_IIC_WRITE_SUB?BYTE . ILLEGAL  ** UNRESOLVED **  ASMS
IIC_ERROR. . . . . . . BIT;     IIC_DRIVER
MAIN . . . . . . . . . CODE;    ASMS
_IIC_WRITE_SUB . . . . ILLEGAL  ** UNRESOLVED **  ASMS
_INIT_IIC. . . . . . . CODE;    IIC_DRIVER  ASMS

*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
    SYMBOL:  _IIC_WRITE_SUB
    MODULE:  asms.obj (ASMS)

*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
    SYMBOL:  ?_IIC_WRITE_SUB?BYTE
    MODULE:  asms.obj (ASMS)

*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
    SYMBOL:  ?_IIC_WRITE_SUB?BYTE
    MODULE:  asms.obj (ASMS)
    ADDRESS: 0277H

*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
    SYMBOL:  _IIC_WRITE_SUB
    MODULE:  asms.obj (ASMS)
    ADDRESS: 027FH 


Here my c-code:

#include <REG552.H>
#include "iic.h"

#define myIICaddr 0x55		// my own i2c slave address


/*------------------------------------------------
MAIN C Function
------------------------------------------------*/
void main (void)
{
	unsigned char reg = 0;

	// Init routines
    Init_IIC(myIICaddr);

	// set control-register: stop counting, enable alarm
	reg = 0xC4;
	if(IIC_Write_Sub(RTC_ADDRESS, 1,  , 0x00) != I2C_OK)
	{
		// error
	}

	while (1)
	{
		;
	}
}


and the beginning of the asm-code:

$LIST
$REGISTERBANK (0,1)
$NOSYMBOLS
$PAGEWIDTH (130)
NAME    IIC_DRIVER


;
;       Includes: EQREG652.ASM
;
$NOLIST
$INCLUDE (EQREG652.ASM)
$LIST
;
; Public labels defined in this Module:
; *************************************
        public  ?IIC_Test_Device
        public  ?IIC_Test_Device?BYTE
        public  _Init_IIC
        public  ?Init_IIC?BYTE
;
$EJECT
;
...snipp...

?BI?IICBit      Segment Bit
                Rseg    ?BI?IICBit
;
                public  IIC_Error
IIC_Error:      dbit    1               ; IIC Error Bit
;
?BA?IICBitAdr       Segment Data BitAddressable
                Rseg    ?BA?IICBitAdr
;
IICCntrl:       ds      1               ; Bit Addressable IIC Control Register
;
?DT?IICPar          Segment Data
                Rseg    ?DT?IICPar

?IIC_Test_Device?BYTE:
?IIC_Write?BYTE:
?Init_IIC?BYTE:
;
SlaveAddress:   ds      1               ; Slave Address Include R/W
DataCount1:     ds      1               ; Block 1 Count
DataIndex1:     ds      1               ; Block 1 Transfer Buffer Address
SubAddress:     ds      1               ; Sub Address ( If Any )
DataCount2:     ds      1               ; Block 2 Count
DataIndex2:     ds      1               ; Block 2 Transfer Buffer Address
;
$EJECT
;
$EJECT
IICCode         Segment Code InBlock
                Rseg    IICCode
;

...snipp...

*****************************************************************
;       * Init_IIC:                                                     *
;       *    PROCEDURE ( OwnSlaveAddress ) ;                            *
;       *    DECLARE OwnSlaveAddress BYTE ;                             *
;       *                                                               *
;       *    Initialises the IIC SIO1 data, sets the Own Slave Address  *
;       *                                                               *
;       *    NOTE: This procedure must be called                        *
;       *          after power on before use of any other IIC procedure *
;       *****************************************************************
_Init_IIC:       mov     s1adr,SlaveAddress              ; Setup Own Slave Address
                mov     s1con,#NSTA_NSTO_AA             ; Assert Acknowledge on Slave Address
                mov     IICCntrl,#0                     ; Initialise Control / Status Register
                setb    es1                             ; Enable SIO1 Interrupt

Parents
  • I seriously doubt our OP is capable of manipulating those ASM sources such that they compile and link correctly with C51.

    He may succeed declaring them alien though, since the routines in question are supposed to behave like PL/M51 routines, even though they're coded in assembly. So telling C51 that they're PL/M51 code should allow to link them.

Reply
  • I seriously doubt our OP is capable of manipulating those ASM sources such that they compile and link correctly with C51.

    He may succeed declaring them alien though, since the routines in question are supposed to behave like PL/M51 routines, even though they're coded in assembly. So telling C51 that they're PL/M51 code should allow to link them.

Children
  • The Philips 552 micro utilizes the same interface. Here is a clip from the header file for the function calls:

    //  +----------------------------------------------------------------------+
    //  |                                                                      |
    //  |         I2C552M.h - I2C Master Processing Functions Definitions      |
    //  |                                                                      |
    //  +----------------------------------------------------------------------+
    
    //
    //  NOTE: All references to "SlaveAddress" below expect an eight bit address
    //  with the low order bit 0.  To get this use the macro SetSlaveAddr(Addr)
    //  as the first argument of the call.  The macro simply doubles the 7-bit
    //  address.
    //
    //  Before doing any I2C functions, a call MUST be made to I2C_Initialize.
    //
    //  All functions return with C=0 if the message was handled without errors.
    //  In addition, the bit variable I2C_Error contains the same status value.
    
    
    /*----------------------------------------------------------------------------*/
    //
    //      *****************************************************************
    //      *                                                               *
    //      *  Explanation of Symbols Used in Message Format Comments       *
    //      *                                                               *
    //      *       Slv             - SlaveAddress                          *
    //      *       SlvW            - SlaveAddress + Write                  *
    //      *       SlvR            - Slave Address + Read                  *
    //      *       Sub             - SubAddress                            *
    //      *       D1[0..L-1]      - Array of Data Bytes ( DataIndex1 )    *
    //      *       L               - Length of Array D1 ( DataCount1 )     *
    //      *       D2[0..M-1]      - Array of Data Bytes ( DataIndex2 )    *
    //      *       M               - Length of Array D2 ( DataCount2 )     *
    //      *       S               - Start Condition                       *
    //      *       P               - Stop Condition                        *
    //      *       A               - Acknowledge                           *
    //      *       N               - Negative Acknowlege                   *
    //      *                                                               *
    //      *****************************************************************
    
    
    #define SetSlaveAddr(Addr) (Addr+Addr)
    
    typedef unsigned char uchar;
    typedef uchar idata * I2CBuf;
    
    /*--  Function Prototypes  ---------------------------------------------------*/
    
    extern alien void I2C_Initialize (uchar  OwnSlaveAddress);
    
    /*----------------------------------------------------------------------------*/
    
    extern alien bit I2C_Write (
        uchar  SlaveAddress,
        uchar  Count,
        I2CBuf SourcePtr
    );
        // IIC Format:
        //
        //     S SlvW A D1[0] A D1[1] A ..... A D1[L-1] A P
    
    /*----------------------------------------------------------------------------*/
    
    extern alien bit I2C_Write_Sub (
        uchar  SlaveAddress,
        uchar  Count,
        I2CBuf SourcePtr,
        uchar  SubAddr
    );
        // IIC Format:
        //
        //     S SlvW A Sub A D1[0] A D1[1] A ..... A D1[L-1] A P
    
    

  • now I'm completly lost. To what code belongs this header file?

    Well, see. I've a 80c552 module with different i2c components attached to it. I desperatly try to find a genric driver to read and write to this bus (bytes or block of bytes). I've looked at several places and the best I found was this PL/M thing. This functions covers exaxtly my need.
    If someone can point me to a driver that works with my c-code I'll more than happy!!

  • now I'm completly lost. To what code belongs this header file?

    Well, see. I've a 80c552 module with different i2c components attached to it. I desperatly try to find a genric driver to read and write to this bus (bytes or block of bytes). I've looked at several places and the best I found was this PL/M thing. This functions covers exactly my need.
    If someone can point me to a driver that works with my c-code I'll more than happy!!

  • " To what code belongs this header file?"

    Read the 1st line of Bob's post - he tells you what it is & where it comes from!

    Bob's code illustrates Hans-Bernhard's suggestion to use the C51 'alien' keyword.

    The 'alien' keyword allows C51 to call PL/M functions.

    The assembler code you are referring to is written to interface to PL/M - as it says in the Application Note.