Files
Arquivotheca.SunOS-4.1.4/usr.etc/fpa/microassembler/sym.c
seta75D ff309bfe1c Init
2021-10-11 18:37:13 -03:00

356 lines
8.1 KiB
C

/* @(#)sym.c 1.1 94/10/31 SMI */
/*
* Micro-assembler symbol-table management
* sym.c 1.0 2 JUN. 85
*/
#include "micro.h"
SYMBOL syms[NSYM], *cursym = syms;
char strings[NSTRING], *curstring = strings;
RESERVED *rhash[NHASH];
SYMBOL *shash[NHASH];
RESERVED words[] = {
/* Pseudo-ops */
{ "org", Pseudo, 1, },
{ "sccsid", Pseudo, 2, },
{ "routine", Pseudo, 3, },
/* Microcode address source */
{ "map", Branch1, 000, 0, },
{ "call", Branch1, 020, 2, },
{ "next", Branch1, 040, 0, },
{ "rtn", Branch1, 060, 0, },
/* Jump contional code */
{ "jmp", Branch2, 001, 1, },
{ "jgt", Branch2, 002, 1, },
{ "jge", Branch2, 003, 1, },
{ "jlt", Branch2, 004, 1, },
{ "jle", Branch2, 005, 1, },
{ "jeq", Branch2, 006, 1, },
{ "jne", Branch2, 007, 1, },
{ "jloop0", Branch2, 010, 1, },
{ "jloop", Branch2, 011, 1, },
{ "jwerr", Branch2, 012, 1, },
{ "jnowerr", Branch2, 013, 1, },
{ "jclr", Branch2, 014, 1, },
/* State */
{ "idl1", State, 0, },
{ "idl2", State, 6, },
{ "hng", State, 5, },
/* Latch */
{ "cstat", Latch, 2, 1, },
{ "unimpl", Latch, 4, 2, },
{ "restore", Latch, 1, 2, },
{ "cdata", Latch, 1, 3, },
/* Weitek Load control */
{ "lnop", Loadctrl, 0, 1, },
{ "lf", Loadctrl, 1, 0, },
{ "lbs", Loadctrl, 2, 1, },
{ "lbsf", Loadctrl, 3, 0, },
{ "lbl", Loadctrl, 4, 1, },
{ "lblf", Loadctrl, 5, 0, },
{ "lbm", Loadctrl, 6, 1, },
{ "lbmf", Loadctrl, 7, 0, },
{ "las", Loadctrl, 10, 1,},
{ "lasf", Loadctrl, 11, 0,},
{ "lal", Loadctrl, 12, 1,},
{ "lalf", Loadctrl, 13, 0,},
{ "lam", Loadctrl, 14, 1,},
{ "lamf", Loadctrl, 15, 0,},
{ "lmap", Loadctrl, 16, 2,},
/* Weitek multiply function */
{ "fmap", Function, 0200, 2,},
{ "smul", Function, 0, 0,},
{ "dmul", Function, 1, 0,},
{ "smwa", Function, 2, 0,},
{ "dmwa", Function, 3, 0,},
{ "smwb", Function, 4, 0,},
{ "dmwb", Function, 5, 0,},
{ "smwab", Function, 6, 0,},
{ "dmwab", Function, 7, 0,},
{ "smma", Function, 8, 0,},
{ "dmma", Function, 9, 0,},
{ "smwama", Function, 10, 0,},
{ "dmwama", Function, 11, 0,},
{ "smwbma", Function, 12, 0,},
{ "dmwbma", Function, 13, 0,},
{ "smwabma", Function, 14, 0,},
{ "dmwabma", Function, 15, 0,},
{ "smmb", Function, 16, 0,},
{ "dmmb", Function, 17, 0,},
{ "smwamb", Function, 18, 0,},
{ "dmwamb", Function, 19, 0,},
{ "smwbmb", Function, 20, 0,},
{ "dmwbmb", Function, 21, 0,},
{ "smwabmb", Function, 22, 0,},
{ "dmwabmb", Function, 23, 0,},
{ "smmab", Function, 24, 0,},
{ "dmmab", Function, 25, 0,},
{ "smwamab", Function, 26, 0,},
{ "dmwamab", Function, 27, 0,},
{ "smwbmab", Function, 28, 0,},
{ "dmwbmab", Function, 29, 0,},
{ "smwabmab", Function, 30, 0,},
{ "dmwabmab", Function, 31, 0,},
{ "smn", Function, 32, 0,},
{ "dmn", Function, 33, 0,},
{ "smwan", Function, 34, 0,},
{ "dmwan", Function, 35, 0,},
{ "smwbn", Function, 36, 0,},
{ "dmwbn", Function, 37, 0,},
{ "smwabn", Function, 38, 0,},
{ "dmwabn", Function, 39, 0,},
{ "smman", Function, 40, 0,},
{ "dmman", Function, 41, 0,},
{ "smwaman", Function, 42, 0,},
{ "dmwaman", Function, 43, 0,},
{ "smwbman", Function, 44, 0,},
{ "dmwbman", Function, 45, 0,},
{ "smwabman", Function, 46, 0,},
{ "dmwabman", Function, 47, 0,},
{ "smmbn", Function, 48, 0,},
{ "dmmbn", Function, 49, 0,},
{ "smwambn", Function, 50, 0,},
{ "dmwambn", Function, 51, 0,},
{ "smwbmbn", Function, 52, 0,},
{ "dmwbmbn", Function, 53, 0,},
{ "smwabmbn", Function, 54, 0,},
{ "dmwabmbn", Function, 55, 0,},
{ "smmabn", Function, 56, 0,},
{ "dmmabn", Function, 57, 0,},
{ "smwamabn", Function, 58, 0,},
{ "dmwamabn", Function, 59, 0,},
{ "smwbmabn", Function, 60, 0,},
{ "dmwbmabn", Function, 61, 0,},
{ "smwabmabn", Function, 62, 0,},
{ "dmwabmabn", Function, 63, 0,},
/* Weitek alu function */
{ "ssub", Function, 0, 1,},
{ "dsub", Function, 1, 1,},
{ "sdiff", Function, 2, 1,},
{ "ddiff", Function, 3, 1,},
{ "ssubm", Function, 4, 1,},
{ "dsubm", Function, 5, 1,},
{ "sdiv", Function, 6, 1,},
{ "ddiv", Function, 7, 1,},
{ "sneg", Function, 8, 1,},
{ "dneg", Function, 9, 1,},
{ "sdiva", Function, 14, 1,},
{ "ddiva", Function, 15, 1,},
{ "sadd", Function, 16, 1,},
{ "dadd", Function, 17, 1,},
{ "ssum", Function, 18, 1,},
{ "dsum", Function, 19, 1,},
{ "saddm", Function, 20, 1,},
{ "daddm", Function, 21, 1,},
{ "sdivb", Function, 22, 1,},
{ "ddivb", Function, 23, 1,},
{ "sident", Function, 24, 1,},
{ "dident", Function, 25, 1,},
{ "sabs", Function, 28, 1,},
{ "dabs", Function, 29, 1,},
{ "sdivab", Function, 30, 1,},
{ "ddivab", Function, 31, 1,},
{ "scmp", Function, 32, 1,},
{ "dcmp", Function, 33, 1,},
{ "scmpm", Function, 36, 1,},
{ "dcmpm", Function, 37, 1,},
{ "scmp0", Function, 40, 1,},
{ "dcmp0", Function, 41, 1,},
{ "sexct", Function, 48, 1,},
{ "dexct", Function, 49, 1,},
{ "swdnrm", Function, 50, 1,},
{ "dwdnrm", Function, 51, 1,},
{ "sinxct", Function, 52, 1,},
{ "dinxct", Function, 53, 1,},
{ "scvtint", Function, 56, 1,},
{ "dcvtint", Function, 57, 1,},
{ "sfloat", Function, 58, 1,},
{ "dfloat", Function, 59, 1,},
{ "dcvts", Function, 60, 1,},
{ "scvtd", Function, 61, 1,},
/* Mode */
{ "lmode3.0", Mode, 8, 0x0, },
{ "lmode7.4", Mode, 8, 0x10, },
{ "lmodeb.8", Mode, 8, 0x20, },
{ "lmodef.c", Mode, 8, 0x30, },
{ "lmodeusr", Mode, 8, 0x40, },
/* CSL- control */
{ "csl", Csl, 0, },
{ "cslc", Csl, 1, },
{ "csla", Csl, 2, },
{ "cslac", Csl, 3, },
{ "cslm", Csl, 4, },
{ "cslmc", Csl, 5, },
{ "cslma", Csl, 6, },
{ "cslmac", Csl, 7, },
/* CSUX- control */
{ "csux", Csux, 0, },
{ "csuxc", Csux, 1, },
{ "csuxa", Csux, 2, },
{ "csuxac", Csux, 3, },
{ "csuxm", Csux, 4, },
{ "csuxmc", Csux, 5, },
{ "csuxma", Csux, 6, },
{ "csuxmac", Csux, 7, },
/* U+ control */
{ "ulsw", U, 0, },
{ "umsw", U, 1, },
{ "usp", U, 1, },
/* WOE- control */
{ "woec", Woe, 1, },
{ "woea", Woe, 2, },
{ "woem", Woe, 4, },
/* Data muxing */
{ "opdmsw", Datactrl, 044, 1, },
{ "opdsp", Datactrl, 044, 1, },
{ "opdlsw", Datactrl, 042, 1, },
{ "reg", Datactrl, 050, 0, },
{ "dtor", Datactrl, 021, 0, },
/* Recovery register control */
{ "recoe", Recoe, 2, },
{ "recclk", Reclk, 1, },
/* Ram WE- */
{ "ramwe", Ramwe, 1, },
/* Ram CS- */
{ "rcsmsw", Ramcs, 2, 1, },
{ "rcssp", Ramcs, 2, 1, },
{ "rcslsw", Ramcs, 1, 2, },
/* Pointers */
{ "ptr1", Pointer, 1, 0, },
{ "ptr2", Pointer, 2, 0, },
{ "ptr3", Pointer, 3, 0, },
{ "ptr4", Pointer, 4, 0, },
{ "ptr5", Pointer, 5, 0, },
{ "ldptr", Pointer, 0, 1, },
{ "imm2", Pointer, 6, 1, },
{ "imm3", Pointer, 7, 1, },
{ "lpreg", Pointer, 6, 2, },
{ "mreg", Pointer, 7, 2, },
{ (char *)0, Tnull, 0, 0, }
};
extern SYMBOL syms[];
init_symtab()
{ int i;
for (i = 0; i < NSYM; i++) {
syms[i].defined = False;
}
}
int
hashval( s )
char *s;
{
register int val = 0;
while (*s) {
val = (val<<1) + *s++;
}
val %= NHASH;
if (val < 0) val += NHASH;
return val;
}
void
resw_hash()
{
RESERVED *rp, **pp;
rp = words;
while (rp->name) {
pp = rhash + hashval(rp->name);
rp->next_hash = *pp;
*pp = rp;
rp++;
}
}
RESERVED *
resw_lookup( s )
char *s;
{
register RESERVED *rp;
rp = rhash[hashval(s)];
while (rp && strcmp(s,rp->name))
rp = rp->next_hash;
return rp;
}
SYMBOL *
lookup( s )
char *s;
{
register SYMBOL *sp;
sp = shash[hashval(s)];
while ( sp && strcmp( s, sp->name ))
sp = sp->next_hash;
return sp;
}
SYMBOL *
enter( s )
char *s;
{
register SYMBOL *sp;
SYMBOL **pp;
register char *cp;
int leng;
leng = strlen(s);
cp = curstring;
if ( curstring+leng > &strings[NSTRING-2])
fatal( "out of string space");
while( *cp++ = *s++)
;
if (cursym >= &syms[NSYM])
fatal( "out of symbol space");
sp = cursym++;
pp = shash + hashval(sp->name = curstring);
curstring = cp;
sp->next_hash = *pp;
*pp = sp;
sp->node = 0;
sp->addr = 0;
return sp;
}
SYMBOL *
firstsym()
{
return (cursym == syms)? (SYMBOL *)0 : syms;
}
SYMBOL *
nextsym( sp )
SYMBOL *sp;
{
sp++;
return (sp==cursym)? (SYMBOL *)0 : sp;
}