139 lines
2.4 KiB
C
139 lines
2.4 KiB
C
/* asmcref.c -- microsoft 80x86 assembler
|
|
**
|
|
** microsoft (r) macro assembler
|
|
** copyright (c) microsoft corp 1986. all rights reserved
|
|
**
|
|
** randy nevin
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include "asm86.h"
|
|
#include "asmfcn.h"
|
|
|
|
static SYMBOL FARSYM *crefsym;
|
|
|
|
/*** crefout - output a cref reference/define
|
|
*
|
|
* crefout();
|
|
*
|
|
* Entry (creftype) = cross reference type
|
|
* *crefsym = symbol to cross reference
|
|
* (crefing) = cross-reference type
|
|
* Exit cross reference information written to cref file
|
|
* Returns none
|
|
* Calls printf
|
|
*/
|
|
|
|
|
|
VOID PASCAL
|
|
crefout (
|
|
){
|
|
USHORT L_iProc;
|
|
char szline[LINEMAX];
|
|
|
|
if (crefing && pass2 && xcreflag > 0) {
|
|
|
|
L_iProc = (crefsym->symkind == EQU)? crefsym->symu.equ.iProc:
|
|
((crefsym->symkind == CLABEL)? crefsym->symu.clabel.iProc: 0);
|
|
|
|
if (creftype != CREFEND) {
|
|
STRNFCPY( szline, crefsym->nampnt->id );
|
|
if (creftype == DEF)
|
|
fprintf( crf.fil, "\x2%c%c%c%c%c%c%s",
|
|
*((UCHAR FAR *)&crefsym->symtype),
|
|
*((UCHAR FAR *)&crefsym->symtype + 1),
|
|
crefsym->attr, (UCHAR) crefsym->symkind,
|
|
L_iProc, *((char *)&L_iProc+1),
|
|
szline );
|
|
else
|
|
fprintf(crf.fil, "%c%c%c%c%s", (UCHAR) crefnum[creftype],
|
|
(fSecondArg)? opcref & 0xf: opcref >> 4,
|
|
L_iProc, *((char *)&L_iProc+1), szline );
|
|
|
|
creftype = CREFEND;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
/*** crefline - emit end-of-line to cross-reference file
|
|
*
|
|
* crefline ();
|
|
*
|
|
* Entry errorlineno = current line in source
|
|
* crefcount = current line in listing file
|
|
* Exit
|
|
* Returns
|
|
* Calls
|
|
*/
|
|
|
|
|
|
VOID PASCAL
|
|
crefline (
|
|
){
|
|
register SHORT i;
|
|
|
|
if (pass2 && fCrefline && (crefing == CREF_SINGLE)) {
|
|
/* Output cref info */
|
|
if (creftype != CREFEND)
|
|
/* Force out last symbol */
|
|
crefout ();
|
|
/** Show this was line * */
|
|
|
|
i = (crefopt || !lsting)? pFCBCur->line: crefcount;
|
|
fprintf (crf.fil, "\4%c%c", (char)i, (char)(i>>8));
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
/*** crefnew - set up new cross reference item
|
|
*
|
|
* crefnew(crefkind);
|
|
*
|
|
* Entry crefkind = cross reference type (REF/DEF)
|
|
* *symptr = symbol to cross reference
|
|
* Exit
|
|
* Returns
|
|
* Calls
|
|
*/
|
|
|
|
|
|
VOID PASCAL
|
|
crefnew (
|
|
UCHAR crefkind
|
|
){
|
|
if (xcreflag > 0 && !(symptr->attr & M_NOCREF)) {
|
|
|
|
creftype = crefkind;
|
|
crefsym = symptr;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
/*** crefdef - output a reference definition
|
|
*
|
|
* crefdef();
|
|
*
|
|
* Entry *symptr = symbol to output definition for
|
|
* Exit none
|
|
* Returns none
|
|
* Calls crefnew, crefout
|
|
*/
|
|
|
|
|
|
VOID PASCAL
|
|
crefdef (
|
|
){
|
|
if (crefing && !(symptr->attr & M_NOCREF)) {
|
|
crefnew( DEF );
|
|
crefout();
|
|
}
|
|
}
|