AUSAM/source/mac/mac/mac22.c
#include "mac.h"
#include "mac.x"
/*
* Define constant handlers.
*/
pedc1()
{
pedc(0);
return;
}
pedc2()
{
pedc(1);
return;
}
pedc3()
{
pedc(2);
return;
}
pedc4()
{
pedc(3);
return;
}
pedc(n)
register int n;
{
/*
* Evaluate the expression (argument)
* and stack it as arg 'a' for the
* code formatter format().
*/
p = intercode.i_opr;
oprstac[1] = expr();
relstac[1] = reloc;
format(&head.dctype[n], ERR); /* format value in core */
/* incr pc */
locn[lcntr].l_value =+ head.dctype[n].f_len;
return;
}
/*
* Special dc.
*/
pedcs()
{
register char *form;
register char *f;
register int len;
/*
* Special dc format descr.
*/
form = &head.dctype[4];
len = head.dctype[4].f_len;
f = intercode.i_opr;
if (*f == '"') {
f++;
length = 0;
while (*f != '"') {
oprstac[1] = *f++;
relstac[1] = ABS;
format(form, ERR);
length =+ len;
}
locn[lcntr].l_value =+ length;
return;
}
p = intercode.i_opr;
oprstac[1] = expr();
relstac[1] = reloc;
format(form, ERR);
locn[lcntr].l_value =+ len;
length = len;
return;
}
/*
* Null routine - just return.
*/
penull()
{
return;
}
/*
* Align location counter to an even multiple
* of the argument expression.
*/
pealign()
{
register int v;
register int l;
p = intercode.i_opr;
v = expr();
if (v < 1)
return;
l = locn[lcntr].l_value;
v = (l + v) % v;
if (!v) /* no align needed */
return;
/*
* Increment pc and code assembly pointer
*/
locn[lcntr].l_value =+ v;
locn[lcntr].l_next =+ v;
locn[lcntr].l_rel_n =+ v;
return;
}
/*
* Set location counter origin.
*/
peorg()
{
register int offset;
register int v;
p = intercode.i_opr;
v = expr();
/*
* Restore curr. value and
* code assembly pointer.
*/
offset = v - locn[lcntr].l_start;
locn[lcntr].l_next = locn[lcntr].l_rel_f + offset;
locn[lcntr].l_value = v;
locn[lcntr].l_rel_n = locn[lcntr].l_reloc + offset;
return;
}
/*
* Set segment indicator.
* (already checked for validity)
*/
peseg()
{
p = intercode.i_opr;
lcntr = expr();
return;
}
/*
* Define (n) basic addr. units of storage.
*/
peds()
{
register int v;
p = intercode.i_opr;
v = expr();
locn[lcntr].l_value =+ v;
locn[lcntr].l_next =+ v;
*locn[lcntr].l_rel_n = RSTOR | (v & 0xff);
locn[lcntr].l_rel_n =+ v;
return;
}
/*
* end: Set eof flag
*/
peend()
{
eof = TRUE;
return;
}
/*
* Set title info.
*/
petitle()
{
register char *r;
register char *s;
register int i;
r = intercode.i_opr;
if (*r != '"') {
synerr("title not a string");
return;
}
/*
* Copy string into title buffer
*/
r++;
s = ctitle;
while (*r != '"')
*s++ = *r++;
*s = '\0';
return;
}