1.4.4. Complex macro example

Example 1.8 shows how three lines are added to a macro. It uses a combination of fixed and variable parameters and also uses multiple iterations of the instruction in a single line.

This macro sends the following instructions and data to the data register at runtime:

A NOP instruction with the breakpoint bit set is fixed in the server macro.

To define the macro

The code in Example 1.8 shows you how to define the multiple-line macro.

Example 1.8. Defining a multiple line macro

#define MACRO3      3                       /* macro number 3 */
#define NOP         (unsigned32)0xE1A00000  /* A no-op for ARM7TDMI */
#define SC_DATBUS   (unsigned8)  33
int        ValPtr;
unsigned8  Values[MACRO_ARGUMENT_AREA_SIZE];
void define_send14_macro(void)
{
    /* Parameters 2 to 8 are fixed, parameter 1 sent at run-time. */
    InitParams;                   /* Reset ValPtr */
    NREnterParamU8(0);            /* Place TDIbits2 in Values array */
    NREnterParamU8(1);            /* Place TDIrev in Values array */
    NREnterParamU8(SC_DATABUS);   /* Place len in Values array */
    NREnterParamU8(0);            /* Place WRoffset in Values array */
    NREnterParamU32(0xFFFFFFFF);  /* Place WRmask1 in Values array */
    NREnterParamU8(0xFF);         /* Place WRmask2 in Values array */
    NREnterParamU8(1);            /* Place nclks in Values array */
    /* ‘line’ 1 can now be added - but it is entered 19 times */
    TAPCheck(TAPOp_DefineMacro(connectId, MACRO3, "ARMTAP_AccessDR_W:2345678",
                               19, Values, ValPtr));
    /* send a NOP with the breakpoint bit (32) set.*/
    /* All 8 parameters are fixed.*/
    InitParams;                   /* Reset ValPtr */
    NREnterParamU32(NOP);         /* Place TDIbits1 in Values array */
    NREnterParamU8(1);            /* Place TDIbits2 in Values array */
    NREnterParamU8(1);            /* Place TDIrev in Values array */
    NREnterParamU8(SC_DATABUS);   /* Place len in Values array */
    NREnterParamU8(0);            /* Place WRoffset in Values array */
    NREnterParamU32(0xFFFFFFFF);  /* Place WRmask1 in Values array */
    NREnterParamU8(0xFF);         /* Place WRmask2 in Values array */
    NREnterParamU8(1);            /* Place nclks in Values array */
    /* ‘line’ 2 can now be added */
    TAPCheck(TAPOp_DefineMacro(connectId, MACRO3, "ARMTAP_AccessDR_W:12345678",
                               1, Values, ValPtr));
    /* Send 1 data word out.*/
    /*Parameters 2 to 8 are fixed, parameter 1 sent at run-time */
    InitParams;                   /* Reset ValPtr */
    NREnterParamU8(0);            /* Place TDIbits2 in Values array */
    NREnterParamU8(1);            /* Place TDIrev in Values array */
    NREnterParamU8(SC_DATABUS);   /* Place len in Values array */
    NREnterParamU8(0);            /* Place WRoffset in Values array */
    NREnterParamU32(0xFFFFFFFF);  /* Place WRmask1 in Values array */
    NREnterParamU8(0xFF);         /* Place WRmask2 in Values array */
    NREnterParamU8(1);            /* Place nclks in Values array */
    /* ‘line’ 3 can now be added */
    TAPCheck(TAPOp_DefineMacro(connectId, MACRO3, "ARMTAP_AccessDR_W:2345678",
                               1, Values, ValPtr));
    /* check that macro has been entered OK */
    TAPCheck(TAPOp_DisplayMacro(connectId, MACRO3));
}

To run the macro

You can now run the macro defined in Example 1.8 using the code shown in Example 1.9. The macro uses variable parameters and so the TAPOp_RunMacro call requires data in the Values array. You must format the data into the Values array using one of the macro enter functions, for example NREnterParamU32, NREnterParamU16, and NREnterParamU8.

Example 1.9. Running the multiple line macro

#define LDMIA  (unsigned32)  0xE89E3FFF
#define STMIA  (unsigned32)  0xE8AE3FFF
#define NOP    (unsigned32)  0xE1A00000
TAPOp_Error run_send14_macro(unsigned32 *data, int *lnerr, int *lperr)
{
    int j,                /* loop counter */
        lnerr, lperr,     /* Variables for error position detecting*/
        resultvalues,     /* In this example, no data is returned, but*/
        resultsize;       /* variables must be defined */
    InitParams;           /* reset ValPtr */
    /* Send parameters for ‘line’ 1, 19 unsigned32 words required */
    NREnterParamU32(LDMIA);              /* 1 */
    NREnterParamU32(NOP);                /* 2 */
    NREnterParamU32(NOP);                /* 3 */
    for (j=0; j<14; j++) {
        NREnterParamU32(data[j]);        /* 4 to 17 */
    }
    NREnterParamU32(NOP);                /* 18 */
    NREnterParamU32(NOP);                /* 19 */
    /* ‘line’ 2 is now ‘skipped’ as it requires no further parameters */
    /* Send parameter for ‘line’ 3, 1 unsigned32 word required */
    NREnterParamU32(STMIA);
    resultsize = 0;
    TAPCheck(TAPOp_RunMacro(connectId, MACRO3, Values, ValPtr, lnerr, lperr,
                            &resultvalues, &resultsize, 1, 1));
    return t_err;
}
Copyright © 1998-2002 ARM Limited. All rights reserved.ARM DUI 0154B
Non-Confidential