home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Datafile PD-CD 5
/
DATAFILE_PDCD5.iso
/
utilities
/
m
/
motorola
/
!AsRef
/
Sources
/
c
/
symtab
< prev
next >
Wrap
Text File
|
1993-07-18
|
19KB
|
497 lines
#include <string.h>
#include <stdio.h>
#include "mselect.h" /*external selection of microprocessor symbol table*/
#include "proto.h"
#include "as.h"
#include "structs.h"
#ifdef HC11
#include "table11.h"
#else
#include "table5.h"
#endif
#include "extvars.h"
/*
* pseudo --- pseudo op processing
*/
#define RMB 0 /* Reserve Memory Bytes */
#define FCB 1 /* Form Constant Bytes */
#define FDB 2 /* Form Double Bytes (words) */
#define FCC 3 /* Form Constant Characters */
#define ORG 4 /* Origin */
#define EQU 5 /* Equate */
#define ZMB 6 /* Zero memory bytes */
#define FILL 7 /* block fill constant bytes */
#define OPT 8 /* assembler option */
#define NULL_OP 9 /* null pseudo op */
#define PAGE 10 /* new page */
#define INCLUDE 11 /* include <file> or "file" ver TER_2.0 */
#define END 12 /* include <file> terminator ver TER_2.0 */
#define IFD 13 /* if define <symbol> ver TER_2.0 */
#define IFND 14 /* if not define <symbol> ver TER_2.0 */
#define ELSE 15 /* else (for IF statements) ver TER_2.0 */
#define ENDIF 16 /* endif (for IF statements) ver TER_2.0 */
#define BSS 17 /* block storage segment (RAM) ver TER_2.09 */
#define CODE 18 /* code segment ver TER_2.09 25 Jul 89 */
#define DATA 19 /* data segment ver TER_2.09 25 Jul 89 */
#define AUTO 20 /* data segment ver TER_2.09 25 Jul 89 */
struct oper pseudo[] = {
"=", PSEUDO, EQU, 0, /* ver TER_2.09 25 Jul 89 */
"auto", PSEUDO, AUTO, 0,/* ver TER_2.09 25 Jul 89 */
"bss", PSEUDO, BSS, 0, /* ver TER_2.09 25 Jul 89 */
"bsz", PSEUDO, ZMB, 0,
"code", PSEUDO, CODE, 0,/* ver TER_2.09 25 Jul 89 */
"data", PSEUDO, DATA, 0,/* ver TER_2.09 25 Jul 89 */
"else", PSEUDO, ELSE, 0,/* ver TER_2.0 6/17/89 */
"end", PSEUDO, END, 0, /* ver TER_2.0 6/17/89 */
"endif", PSEUDO, ENDIF, 0, /* ver TER_2.0 6/17/89 */
"equ", PSEUDO, EQU, 0,
"fcb", PSEUDO, FCB, 0,
"fcc", PSEUDO, FCC, 0,
"fdb", PSEUDO, FDB, 0,
"fill", PSEUDO, FILL, 0,
"ifd", PSEUDO, IFD, 0, /* ver TER_2.0 6/17/89 */
"ifnd", PSEUDO, IFND, 0,/* ver TER_2.0 6/17/89 */
"include", PSEUDO, INCLUDE, 0, /* ver TER_2.0 6/17/89 */
"nam", PSEUDO, NULL_OP, 0,
"name", PSEUDO, NULL_OP, 0,
"opt", PSEUDO, OPT, 0,
"org", PSEUDO, ORG, 0,
"pag", PSEUDO, PAGE, 0,
"page", PSEUDO, PAGE, 0,
"ram", PSEUDO, BSS, 0, /* ver TER_2.09 25 Jul 89 */
"rmb", PSEUDO, RMB, 0,
"spc", PSEUDO, NULL_OP, 0,
"ttl", PSEUDO, NULL_OP, 0,
"zmb", PSEUDO, ZMB, 0
};
/*
* do_pseudo --- do pseudo op processing
*/
void
do_pseudo(int op)
/* int op; which op */
{
char fccdelim;
int fill;
int c; /* test variable ver TER_2.0 6/18/89 */
char *savept; /* savept is pointer to string save */
FILE *FdTemp; /* ver TER_2.0 6/17/89 */
/*
* void pouterror(), NewPage(), IfMachine();
*//* rel TER_2.0 6/18/89 */
/* void PC_Exchange(); *//* ver TER_2.09 25 Jul 89 */
if (op != EQU && *Label)
install(Label, Pc);
P_force++;
#ifdef DEBUG3
printf("%s, line no. ", Argv[Cfn]); /* current file name */
printf("%d: ", Line_num); /* current line number */
printf(" Pseudo Op=%u\n", op);
#endif
switch (op) {
case RMB: /* reserve memory bytes */
if (eval()) {
Pc += Result;
f_record(); /* flush out bytes */
} else
error("Undefined Operand during Pass One");
break;
case ZMB: /* zero memory bytes */
if (eval())
while (Result--)
emit(0);
else
error("Undefined Operand during Pass One");
break;
case FILL: /* fill memory with constant */
eval();
fill = Result;
if (*Optr++ != ',')
error("Bad fill");
else {
Optr = skip_white(Optr);
eval();
while (Result--)
emit(fill);
}
break;
case FCB: /* form constant byte(s) */
do {
Optr = skip_white(Optr);
eval();
if (Result > 0xFF) {
if (!Force_byte)
warn("Value truncated");
Result = lobyte(Result);
}
emit(Result);
} while (*Optr++ == ',');
break;
case FDB: /* form double byte(s) */
do {
Optr = skip_white(Optr);
eval();
eword(Result);
} while (*Optr++ == ',');
break;
case FCC: /* form constant characters */
if (*Operand == EOS)
break;
/* Optr++;*/
fccdelim = *Optr++;
if ((fccdelim != SQUOT) && (fccdelim != DQUOT))
{error("Missing Delimiter - \' or \" expected");
break;}
/* putchar ( fccdelim );*/
while (*Optr != EOS && *Optr != fccdelim)
emit(*Optr++);
if (*Optr == fccdelim)
{Optr++;}
else
{error("Missing Delimiter");}
break;
case ORG: /* origin */
if (eval()) {
Old_pc = Pc = Result;
f_record(); /* flush out any bytes */
} else
error("Undefined Operand during Pass One");
break;
case EQU: /* equate */
if (*Label == EOS) {
error("EQU requires label");
break;
}
if (eval()) {
install(Label, Result);
Old_pc = Result; /* override normal */
} else
error("Undefined Operand during Pass One");
break;
case OPT: /* assembler option */
P_force = 0;
if (head(Operand, "l"))
Lflag = 1;
else if (head(Operand, "nol"))
Lflag = 0;
else if (head(Operand, "c")) {
Cflag = 1;
Ctotal = 0;
} else if (head(Operand, "noc"))
Cflag = 0;
else if (head(Operand, "contc")) {
Cflag = 1;
} else if (head(Operand, "s"))
Sflag = 1;
else if (head(Operand, "cre"))
CREflag = 1;
else if (head(Operand, "p50")) /* turn on page flag */
Pflag50 = 1; /* ver (TER) 2.02 19 Jun 89 */
else if (head(Operand, "crlf")) /* add <CR> <LF> to */
CRflag = 1; /* S record ver TER_2.08 */
else if (head(Operand, "nnf")) /* no extra line no. *