Aucbvax.3187
fa.unix-wizards
utzoo!decvax!ucbvax!unix-wizards
Thu Sep 17 13:42:36 1981
PDP-11 Compatability Mode on VAXen
>From allegra!jdd@Berkeley Thu Sep 17 12:43:20 1981
In reply to my message of 15 Sep 1981 13:32:48-PDT on bugs in the PDP-11
compatability mode package on the VAX, I received a request for the specific
changes.  Well, since I'm not on the Arpanet, I can't send to individuals,
only to mailing lists, so, everybody, here are some changes.  I apologize
for their length.

To (partially) fix the problem of stack frames being created prematurely
when signals are caught while in compatability mode, one should change files
unixtraps.c and dosig.c .  In unixtraps.c, add the line:

       int interrupt;

in the external declarations at the top.  Add the line:

       interrupt = 0

as the first executable statement of routine dotrap().  Add the line:

       if (interrupt) dosig(interrupt, pc);

as the last executable statement in routine dotrap().

In dosig.c, add the line:

       extern int interrupt;

in the external declarations at the top.  Change the first call to
dosig(signum, pc) in routine sigcatch() to the line:

       interrupt = signum;

These changes help the problem, but they do not solve it.  First, they do
not handle multiple signals caught while in native mode; only one is
remembered.  Secondly, there are numerous timing problems which could mess
things up, but this is much hairier to solve, mostly since signals are so
hard to use (although easier under Berkeley Unix).

As for the floating-point package, it's at the end of this note.  It is not
a complete package in that it does not simulate all of the hardware
features, but it seems to be close enough for C programs and the run-time
library.

Cheers,
John DeTreville

------------------------------dofloat.c-------------------------------

/* Partial PDP-11 floating-point simulator.  Always in double mode,
  chop mode.  All arithmetic done in double-precision. Storing longs
  into or taking longs from general registers doesn't work.
  Overflow is never detected.  Other things are wrong too. */

#include <STDIO.H>
#include "defs.h"

#define TRUE 1
#define FALSE 0

#define ABSD    0170600
#define ADDD    0172000
#define CFCC    0170000
#define CLRD    0170400
#define CMPD    0173400
#define DIVD    0174400
#define LDCFD   0177400
#define LDCLD   0177000
#define LDD     0172400
#define LDEXP   0176400
#define MODD    0171400
#define MULD    0171000
#define NEGD    0170700
#define SETD    0170011
#define SETI    0170002
#define SETL    0170012
#define STCDL   0175400
#define STCDF   0176000
#define STD     0174000
#define STEXP   0175000
#define SUBD    0173000
#define TSTD    0170500

static struct {
       unsigned fc :1;
       unsigned fv :1;
       unsigned fz :1;
       unsigned fn :1;
       unsigned fmm :1;
       unsigned ft :1;
       unsigned fl :1;
       unsigned fd :1;
} fps = FALSE;

#define FZ fps.fz
#define FN fps.fn
#define FL fps.fl
#define FD fps.fd

#define LMODE FL
#define IMODE (!LMODE)

static double fregs[6];

dofloat(instr)
unsigned int instr;
{
       int mode, reg, ac;
       unsigned short * x, * resolve();
#define DOUBLE (*((double *)x))
#define FLOAT (*(float *)x)
#define LONG (*(long *)x)
#define SHORT (*(short *)x)
#define GETDOUBLE (x = resolve(mode, reg, 8, TRUE))
#define GETFLOAT (x = resolve(mode, reg, 4, TRUE))
#define GETLONG (x = resolve(mode, reg, 4, FALSE))
#define GETSHORT (x = resolve(mode, reg, 2, FALSE))
#define FREG fregs[ac]
       double temp;
       union {
               double d;
               short s;
       } bits;

       switch (instr & 0170000) {
       case 0170000:
               break;
       default:
               fprintf(stderr, "Unrecognized instr in dofloat %0o\n", instr);
               return (-1);
       }

       switch (instr & 07000) {
       case 0:
               switch (instr & 0700) {
               case 0:
                       switch (instr) {
                       case CFCC:
                               psl &= ~017;
                               if (FN) {
                                       psl |= 010;
                               }
                               if (FZ) {
                                       psl |= 04;
                               }
                               return (0);
                       case SETD:
                               FD = TRUE;
                               return (0);
                       case SETI:
                               FL = FALSE;
                               return (0);
                       case SETL:
                               FL = TRUE;
                               return (0);
                       default:
                               fprintf(stderr, "Unrecognized instr in dofloat %0o\n", instr);
                               return (-1);
                       }
               default:
                       break;
               }

               mode = (instr & 070) >> 3;
               reg = instr & 07;

               switch (instr & 0177700) {
               case ABSD:
                       GETDOUBLE;
                       if (DOUBLE > 6;
       mode = (instr & 070) >> 3;
       reg = instr & 07;

       switch (instr & 0177400) {
       case ADDD:
               GETDOUBLE;
               FREG += DOUBLE;
               FZ = (FREG == 0.0);
               FN = (FREG > 7) - 0200;
               FZ = (SHORT == 0);
               FN = (SHORT
<HR>
This Usenet Oldnews Archive
article may be copied and distributed freely, provided:
<P>
1. There is no money collected for the text(s) of the articles.
<BR>
2. The following notice remains appended to each copy:
<P>
<EM>The Usenet Oldnews Archive: Compilation Copyright&copy 1981, 1996
<BR> Bruce Jones, Henry Spencer, David Wiseman.</EM>
<P>
<HR>
Goto <A HREF="81.09.17_ucbvax.3188_fa.unix-wizards.html">NEXT</A> article in FA.unix-wizards Newsgroup
<BR>Return to <A HREF="FA.unix-wizards-index.html">FA.unix-wizards index</A>
<BR>Return to the
       <A HREF="../index.html">Usenet Oldnews Archive index</A>
</HTML>

-----------------------------------------------------------------
gopher://quux.org/ conversion by John Goerzen <[email protected]>
of http://communication.ucsd.edu/A-News/


This Usenet Oldnews Archive
article may be copied and distributed freely, provided:

1. There is no money collected for the text(s) of the articles.

2. The following notice remains appended to each copy:

The Usenet Oldnews Archive: Compilation Copyright (C) 1981, 1996
Bruce Jones, Henry Spencer, David Wiseman.