Trailing-Edge
-
PDP-10 Archives
-
SRI_NIC_PERM_FS_1_19910112
-
c/lib/gen/muuo.c
There are 6 other files named muuo.c in the archive. Click here to see a list.
/*
** MUUO - TOPS-10 Monitor call (UUO) support
**
** (c) Copyright Ken Harrenstien 1989
**
*/
#include <muuo.h>
#include <stdlib.h> /* abort */
#define RH 0777777
#if MU__DEFAC != 2
#error Default AC used by code doesn't match def in muuo.h!
#endif
/* MUUOXn - executes a monitor call (actually a PDP-10 instruction) of
** a particular type. The return value is 1 if the instruction skipped,
** 0 otherwise.
** MUUOX1(ins, ac) move 2,ac ? ins 2, ? -
** MUUOX2(ins, ra) - ? ins 2, ? movem 2,@ra
** MUUOX3(ins, ac, ra) move 2,ac ? ins 2, ? movem 2,@ra
*/
int
muuox1(instr, ac)
int instr, ac;
{
asm("MOVE 2,-2(17)\n"); /* Get arg val into default ac */
asm("XCT -1(17)\n"); /* Execute the monitor UUO */
asm("TDZA 1,1\n");
asm(" MOVEI 1,1\n");
}
int
muuox2(instr, ra)
int instr, *ra;
{
asm("XCT -1(17)\n"); /* Execute the monitor UUO */
asm("TDZA 1,1\n");
asm(" MOVEI 1,1\n");
asm("SKIPE 3,-2(17)\n"); /* See if addr given for returning value */
asm(" MOVEM 2,(3)\n"); /* Store return value in given addr, if any */
}
int
muuox3(instr, ac, ra)
int instr, ac, *ra;
{
asm("MOVE 2,-2(17)\n"); /* Get arg val into default ac */
asm("XCT -1(17)\n"); /* Execute the monitor UUO */
asm("TDZA 1,1\n");
asm(" MOVEI 1,1\n");
asm("SKIPE 3,-3(17)\n"); /* See if addr given for returning value */
asm(" MOVEM 2,(3)\n"); /* Store return value in given addr, if any */
}
/* _XCTSKIP(instr) - Interprets its arg as a PDP-10 instruction and
** XCTs it. Returns 0 or 1 depending on whether it skipped or not.
*/
int
_xctskip(instr)
int instr;
{
asm("XCT -1(17)\n");
asm("TDZA 1,1\n");
asm(" MOVEI 1,1\n");
}
/* MUUO(op, ac, e) - General-purpose MUUO invocation.
** Decodes the op value to determine how to interpret the next two args.
** AC E
** I/O type UUOs: val used as channel # val used as RH of MUUO
** TTCALL type: ignored, must be 0 val used as RH of MUUO
** CALLI type: val used as AC arg addr to receive AC result
** Other: illegal (CALL, INIT) or ignored (UJEN)
**
** There are a few old CALLIs which interpret their AC field as a
** channel #. These are checked for and handled properly.
*/
#define OP_CALL (040 << 30) /* These UUO opcodes are purged from UUOSYM */
#define OP_CALLI (047 << 30)
#define OP_TTCALL (051 << 30)
#define OP_MTAPE (072 << 30)
int
muuo(op, ac, e)
int op, ac, *e;
{
/* Examine opcode to determine type */
switch(op & MU__OP) {
case uuosym("OPEN"): /* Handle I/O type UUOs */
case uuosym("RENAME"):
case uuosym("IN"):
case uuosym("OUT"):
case uuosym("SETSTS"):
case uuosym("STATO"):
case uuosym("GETSTS"):
case uuosym("STATZ"):
case uuosym("INBUF"):
case uuosym("OUTBUF"):
case uuosym("INPUT"):
case uuosym("OUTPUT"):
case uuosym("CLOSE"):
case uuosym("RELEAS"):
case OP_MTAPE:
case uuosym("UGETF"):
case uuosym("USETI"):
case uuosym("USETO"):
case uuosym("LOOKUP"):
case uuosym("ENTER"):
if (ac < 0 || ac > 017 /* Check channel number val */
|| ((int)e & ~MU__E)) /* Check address value */
abort();
return _xctskip((op&MU__OP) | ((int)ac<<23) | (int)e);
case OP_CALLI: /* Standard call form */
switch (op & RH) {
case uuosym("WAIT")&RH:
case uuosym("UTPCLR")&RH:
case uuosym("SEEK")&RH:
if (ac < 0 || ac > 017) /* Check channel number val */
abort();
return _xctskip((op&(MU__OP|RH)) | (ac<<23));
}
return (e /* Wants return value of AC? */
? muuox3((op&~MU__AC) | (MU__DEFAC<<23), ac, e) /* yes */
: muuox1((op&~MU__AC) | (MU__DEFAC<<23), ac) ); /* no */
case OP_TTCALL: /* Extended operator */
if (ac != 0 || ((int)e & ~MU__E)) /* Check AC & address value */
abort();
return _xctskip((op & (MU__OP|MU__AC)) | (int)e);
case uuosym("UJEN"): /* Just do it, no arg, val, or addr */
_xctskip(uuosym("UJEN"));
break;
case OP_CALL: /* Obsolete */
case uuosym("INIT"): /* Cannot support in-line */
default:
abort(); /* Unknown opcode */
}
}