MicroVAX CPU Chip Microcode Documentation
                           DC 333 (21-20887-01)


                        Rev 1.00 (February, 1985)



                  C O M P A N Y  C O N F I D E N T I A L



Copyright (C) 1985 by Digital Equipment Corporation

The information in this document is subject to change without  notice  and
should  not be construed as a commitment by Digital Equipment Corporation.
Digital Equipment Corporation assumes no  responsibility  for  any  errors
that may occur in this document.

This specification does not describe  any  program  or  product  which  is
currently  available from Digital Equipment Corporation.  Nor does Digital
Equipment Corporation  commit  to  implement  this  specification  in  any
product  or  program.   Digital  Equipment Corporation makes no commitment
that this document accurately describes any product it might ever make.

MicroVAX CPU Chip Microcode Documentation (Company Confidential)          Page 2
TABLE OF CONTENTS                                                1 February 1985


                                   CONTENTS

        1       NOTES ON THE MICROVAX MICROCODE  . . . . . . . . . . 4
        1.1       Code Module Organization . . . . . . . . . . . . . 4
        1.2       Assembly And Allocation  . . . . . . . . . . . . . 5
        1.3       Size Budget  . . . . . . . . . . . . . . . . . . . 6
        1.4       Microtraps . . . . . . . . . . . . . . . . . . . . 7
        1.5       Interrupt And Exception Entry Points . . . . . . . 7
        1.6       Micromachine Resource Allocation . . . . . . . . . 9
        1.7       Hardware/Microcode Tradeoffs . . . . . . . . . .  10
        1.7.1     Processor Status Longword  . . . . . . . . . . .  10
        1.7.2     Hardware Interrupts  . . . . . . . . . . . . . .  10
        1.7.3     Software Interrupts  . . . . . . . . . . . . . .  11
        1.7.4     Asynchronous System Traps (AST's)  . . . . . . .  11
        1.8       Microcode Decisions  . . . . . . . . . . . . . .  12
        2       MICROVAX INSTRUCTION AND SPECIFIER DECODING  . . .  14
        2.1       Overview . . . . . . . . . . . . . . . . . . . .  14
        2.2       Initial Instruction Decode (IID) . . . . . . . .  16
        2.2.1     IID Exception Dispatch . . . . . . . . . . . . .  16
        2.2.2     IID Opcode Dispatch  . . . . . . . . . . . . . .  17
        2.2.3     IID Specifier Dispatch . . . . . . . . . . . . .  17
        2.3       Next Specifier Decode (NSD)  . . . . . . . . . .  18
        2.3.1     EXECUTION_STARTED Flip-Flop  . . . . . . . . . .  18
        2.3.2     Fork Code And Specifier Counter  . . . . . . . .  19
        2.3.3     Opcode Dependent Dispatch  . . . . . . . . . . .  19
        2.3.4     NSD Specifier Dispatch . . . . . . . . . . . . .  20
        3       MICROVAX IPLA  . . . . . . . . . . . . . . . . . .  21
        4       MICROVAX MACHINE CHECK SPECIFICATION . . . . . . .  24
        4.1       Types Of Errors  . . . . . . . . . . . . . . . .  24
        4.1.1     Impossible Situations In The Microcode . . . . .  24
        4.1.2     Impossible Situations In Memory Management . . .  24
        4.1.3     Unused IPL Request . . . . . . . . . . . . . . .  25
        4.1.4     Unused FPU Error . . . . . . . . . . . . . . . .  25
        4.1.5     Bus (Memory) Errors  . . . . . . . . . . . . . .  25
        4.1.6     Multiple Errors  . . . . . . . . . . . . . . . .  26
        4.2       Machine Check Processing . . . . . . . . . . . .  26
        4.2.1     Microcode Actions  . . . . . . . . . . . . . . .  26
        4.2.2     Operating System Actions . . . . . . . . . . . .  27
        4.3       Restart Processing . . . . . . . . . . . . . . .  27
        5       MICROVAX CONSOLE SUPPORT . . . . . . . . . . . . .  29
        5.1       Entry Protocol . . . . . . . . . . . . . . . . .  29
        5.2       Console Processing . . . . . . . . . . . . . . .  30
        5.3       Console Exit . . . . . . . . . . . . . . . . . .  30

MicroVAX CPU Chip Microcode Documentation (Company Confidential)          Page 3
REVISION HISTORY                                                 1 February 1985


                             REVISION HISTORY
                             ----------------

Rev     Date            Purpose
---     ----            -------
1.00    Feb, 1985       Initial release.

MicroVAX CPU Chip Microcode Documentation (Company Confidential)          Page 4
INTRODUCTION                                                     1 February 1985


The purpose of this document is to provide information about the  MicroVAX
microcode  implementation.   It  includes  information about the microcode
itself, as well as details  on  implementation  specific  topics  such  as
machine checks and the console interface.



1  NOTES ON THE MICROVAX MICROCODE

This section provides some general documentation and notes on the MicroVAX
microcode.



1.1  Code Module Organization

The MicroVAX microcode consists of the following code modules:

Definition Modules
------------------

        DEFIN.MIC       -       micromachine definitions
        MACRO.MIC       -       microcode macroes
        ALIGN.MIC       -       alignment lists for hardware dispatches
        IPLA.MIC        -       IPLA definitions

Central Routine Modules
-----------------------

        POWERUP.MIC     -       power up
        MEMMGT.MIC      -       memory management
        INTEXC.MIC      -       interrupts and exceptions
        SPEC.MIC        -       specifier flows

Instruction Routine Modules
---------------------------

        INTLOGADR.MIC   -       integer, logical, and address instructions
        MULDIV.MIC      -       multiply and divide instructions
        VFIELD.MIC      -       variable length bit field instructions
        CTRL.MIC        -       control instructions
        CALRET.MIC      -       procedure call instructions
        MISC.MIC        -       miscellaneous instructions
        QUEUE.MIC       -       queue instructions
        CSTRING.MIC     -       character string instructions
        OPSYS.MIC       -       operating system support instructions
        FPOINT.MIC      -       floating point instructions
        EMULAT.MIC      -       emulation support

Microcode Support Modules
-------------------------

        LIST.MIC        -       micro2 list statement
        NOLIST.MIC      -       micro2 nolist statement

MicroVAX CPU Chip Microcode Documentation (Company Confidential)          Page 5
NOTES ON THE MICROVAX MICROCODE                                  1 February 1985


        NOTIMPB0.MIC    -       dummy labels for assembly BASE0
        HACK4IPLA.MIC   -       dummy origins for assembly IPLA
        TEST.MIC        -       test and debugging microcode



1.2  Assembly And Allocation

The MicroVAX microcode is assembled with  version  1M(01)  of  the  MICRO2
assembler, as follows:

$ MICRO2 :==[microcode.tools]MICRO2                                     ; define command for assembler

$ MICRO2 DEFIN+MACRO+ALIGN+NOTIMPB0+IPLA+TEST/LIST=BASE0/ULD=BASE0      ; global alignments, IPLA

$ MICRO2 nolist+DEFIN+MACRO+list+POWERUP+FMEMMGT+SPEC+INTEXC+-
        INTLOGADR+VFIELD+CTRL+MULDIV+CALRET+MISC+QUEUE+OPSYS+-
        CSTRING+FPOINT+EMULAT/LIST=BASE1/ULD=BASE1                      ; main assembly

The assembled modules are then linked with the special V-11/uVAX allocator
and converted into .MEM files for DECSIM and other CAD programs (note that
[microcode.tools] should  be  changed  to  point  to  the  MicroVAX  tools
directory being used):

$ ASSIGN [microcode.tools]ALLOC1.PAT ALLOC1$PAT                         ; define logicals
$ ASSIGN [microcode.tools]ALLOC3.PAT ALLOC3$PAT                         ; and commands
$ AL1 :==[microcode.tools]ALLOC1                                        ; for allocator
$ AL2 :==[microcode.tools]ALLOC2
$ AL3 :==[microcode.tools]ALLOC3
$ AL4 :==[microcode.tools]ALLOC4
$ ULDTOTEXT :==[microcode.tools]ULDTOTEXT

$ AL1 BASE0 /DEBUG=N                                                    ; allocate BASE0
$ AL2 BASE0
$ AL3 BASE0
$ AL4 BASE0
$ ULDTOTEXT BASE0.U40
$ DELETE BASE0.CON;*
$ DELETE BASE0.BDR;*
$ DELETE BASE0.ADR;*
$ DELETE BASE0.EXT;*

$ AL1 BASE1 /DEBUG=N                                                    ; allocate BASE1
$ AL2 BASE1 /LINK=BASE0
$ AL3 BASE1 /LINK=BASE0
$ AL4 BASE1
$ ULDTOTEXT BASE1.U40
$ DELETE BASE1.CON;*
$ DELETE BASE1.BDR;*
$ DELETE BASE1.ADR;*
$ DELETE BASE1.EXT;*

Finally, the IPLA is again assembled and converted to a special format:

MicroVAX CPU Chip Microcode Documentation (Company Confidential)          Page 6
NOTES ON THE MICROVAX MICROCODE                                  1 February 1985



$ MICRO2 NOLIST+DEFIN+MACRO+LIST+HACK4IPLA+IPLA/LIS=IPLA/ULD=IPLA       ; assemble IPLA
$ RUN [microcode.tools]IPLATEXT                                         ; convert IPLA
IPLA



1.3  Size Budget

The MicroVAX microcode size budget is as follows:

        module                  original budget         uVAX pass 3
        ------                  ---------------         -----------

        POWERUP.MIC             50                       24
        MEMMGT.MIC              100                      67
        SPEC.MIC                200                     160
        INTEXC.MIC              200                     133
        INTLOGADR.MIC           128                     104
        VFIELD.MIC              100                      79
        CTRL.MIC                98                      106
        MULDIV.MIC              110                     140
        CALRET.MIC              120                      83
        MISC.MIC                73                       51
        QUEUE.MIC               201                      98
        OPSYS.MIC               350                     246
        CSTRING.MIC             100                      93
        FPOINT.MIC              200                     135
        EMULAT.MIC              0                        58
                                ----                    ----
                                2030                    1577

MicroVAX CPU Chip Microcode Documentation (Company Confidential)          Page 7
NOTES ON THE MICROVAX MICROCODE                                  1 February 1985


1.4  Microtraps

The following table lists all microtraps in the microcode.

        Entry Point             Module          Location        Comments
        -----------             ------          --------        -------
        MM.CPB..                FMEMMGT.MIC      40             cross page
        MM.TBM..                FMEMMGT.MIC      42             TB miss
        MM.ACV.TNV..            FMEMMGT.MIC      44             ACV/TNV
        MM.M0..                 FMEMMGT.MIC      46             m = 0
        IE.BUSERR.READ.VIRT..   INTEXC.MIC       48             read virtual bus error
        IE.BUSERR.READ.PHYS..   INTEXC.MIC       4A             read physical bus error
        IE.BUSERR.WRITE.VIRT..  INTEXC.MIC       4C             write virtual bus error
        IE.BUSERR.WRITE.PHYS..  INTEXC.MIC       4E             write physical bus error
        IE.INTOV..              INTEXC.MIC       50             integer overflow
        IE.ILLOP..              INTEXC.MIC       58             illegal opcode
        IE.BUSERR.INT.VEC..     INTEXC.MIC       5A             interrupt vector bus error
        FP.ERR..                FPOINT.MIC       5C             floating point error



1.5  Interrupt And Exception Entry Points

The following table lists all entry points into module  INTEXC  from  both
hardware dispatches and from other microcode modules.

Hardware dispatches:

        Entry Point             From            Comments
        -----------             ----            --------
        IE.ILLOP..              microtrap       illegal opcode
        IE.INTOV..              microtrap       integer overflow
        IE.BUSERR.READ.VIRT..   microtrap       read virtual bus error
        IE.BUSERR.WRITE.VIRT..  microtrap       write virtual bus error
        IE.BUSERR.READ.PHYS..   microtrap       read physical bus error
        IE.BUSERR.WRITE.PHYS..  microtrap       write physical bus error
        IE.BUSERR.INT.VEC..     microtrap       interrupt vector bus error

        IID.VAX.TRACE.TRAP..    IID             trace trap
        IID.VAX.INTERRUPT..     IID             interrupt
        IID.VAX.ARITH.TRAP..    IID             arith trap, T[AST.TRAP] = trap type

        BPT..                   IID             BPT instruction
        XFC..                   IID             XFC instruction
        XFD..                   IID             0FD prefix, execute IID again
        FPD..                   IID             FPD set in PSL

Microcode dispatches:

        Entry Point             From            Comments
        -----------             ----            --------
        RSRV.ADDR.FLT..         SPEC.MIC        reserved addressing fault
        FP.ARITH.FLT..          FPOINT.MIC      fp arith fault, T[AST.TRAP] = fault type
        RSRV.INST.FLT..         FPOINT.MIC      reserved instruction fault

MicroVAX CPU Chip Microcode Documentation (Company Confidential)          Page 8
NOTES ON THE MICROVAX MICROCODE                                  1 February 1985


        PRIV.INST.FLT..         various         privileged instruction fault (same as reserved)
        RSRV.OPER.FLT..         various         reserved operand fault
        HARDWARE.FLT..          various         machine check fault, T[MCHK] = fault code
        IE.ACV..                MEMMGT.MIC      ACV fault, T[MMGT] = fault type
        IE.TNV..                MEMMGT.MIC      TNV fault, T[MMGT] = fault type
        IE.INTERRUPT..          CSTRING.MIC     hardware interrupt in mid instruction
                                                  (treat as fault)
        IE.SWRE.INT..           OPSYS.MIC       software interrupt,
                                                  T[SISR]<19:16> = highest pri swre int
        IE.CHM.EXCEPT..         OPSYS.MIC       CHM exception,
                                                  W1 = opcode mode * 4
                                                  W2 = minu(W1, psl<cur_mode> * 4)
                                                  W3 = sext(operand)
                                                  W4 = sp_W2

MicroVAX CPU Chip Microcode Documentation (Company Confidential)          Page 9
NOTES ON THE MICROVAX MICROCODE                                  1 February 1985


1.6  Micromachine Resource Allocation

The resources available to  the  microcode  include  the  general  purpose
registers  (G's),  temporary  registers  (T's),  working  registers (W's),
processor registers (P's), state flags  (STATE<7:0>),  and  various  flags
(restart, trap disable, etc).  These resources are allocated as follows:

        Resource                Allocated To                            Mnemonic
        --------                ------------                            --------

        G[0]..G[15]             VAX architectural registers

        T[0]                    P0 Base Register                        P0BR
                                (bits<1:0> must be zero)
        T[1]                    P1 Base Register                        P1BR
                                (stored in compensated form, that is, minus 00800000(hex),
                                 bits<1:0> must be zero)
        T[2]                    System Base Register                    SBR
                                (stored in compensated form, that is, minus 01000000(hex),
                                 bits<1:0> must be zero)
        T[3]                    Software Interrupt Summary Register     SISR
                                (bits<19:16> = max request-1, bits <15:1> = requests,
                                 bits<31:20,0> must be zero)
        T[4]                    RESERVED FOR SPECIFIER FLOWS            SPEC
                                AND INTERRUPTS AND EXCEPTIONS
        T[5]                    Process Control Block Base              PCBB
                                (bits <1:0> must be zero)
        T[6]                    System Control Block Base               SCBB
                                (bits <1:0> must be zero)
        T[7]                    Processor Status Longword               PSL
                                (bits<31:28,21,15:8,4:0> must be zero)
        T[8]                    ASTLVL (bits<26:24>)                    AST.TRAP
                                current trap number (bits<7:0>)
        T[9]                    Interrupt Stack Pointer                 IS
        T[A]                    RESERVED FOR MEMORY MANAGEMENT          MMGT
        T[B]                    general purpose                         TEMP

        W[0]..W[4]              general purpose
        W[5]                    RESERVED FOR MEMORY MANAGEMENT
        W[6]                    general purpose
        W[7]                    general purpose (SC register)

        STATE<2:0>              general purpose, cleared at IID
        STATE<3>                used to indicate INTERRUPTIBLE INSTRUCTION, cleared at IID
        STATE<4>                RESERVED FOR INTERRUPTS AND EXCEPTIONS
        STATE<5>                RESERVED FOR MEMORY MANAGEMENT
        STATE<7:6>              RESERVED FOR INTERRUPTS AND EXCEPTIONS

Note that resources marked as RESERVED can be used  by  the  microcode  as
local  variables.  Specifically, T[SPEC] can be used freely once specifier
decoding is  complete;  W[5]  and  T[MMGT]  can  be  used  between  memory
references.

MicroVAX CPU Chip Microcode Documentation (Company Confidential)         Page 10
NOTES ON THE MICROVAX MICROCODE                                  1 February 1985


1.7  Hardware/Microcode Tradeoffs

Hardware and microcode share responsibility for certain key  functions  in
MicroVAX, notably the PSL and interrupts.



1.7.1  Processor Status Longword -

The processor status longword (PSL) is kept in two  parts.   The  hardware
invariant  part  of  the PSL is maintained by the microcode in a temporary
register.  The microcode initializes this part of the PSL during  restart,
and modifies it during the course of an REI, BICPSW, BICPSW, CALLx, or RET
instruction, or during an interrupt, exception, or  fault  sequence.   The
microcode  must  assure  that  bits  <31:26,21,15:8,4:0>  of the temporary
register are zero at all times, and must also assure that the hardware  is
kept informed of any changes to the invariant part of the PSL.

The variable part of the PSL is maintained by hardware.  This includes the
trace  pending  flag (TP, bit<30>), the trace enable flag (T, bit<4>), and
the condition codes (NZVC, bits<3:0>).  The variable part of the  PSL  may
be  read  as  processor register C (PR[C]) and written as MXPR destination
PSL.HWRE (MXPR[PSL.HWRE]).  Writing processor register C only updates  the
condition codes (NZVC).

Some example microcode sequences:

        ;-------------------------------; read PSL into temporary register:
        W[0]<--T[PSL]                   ; get invariant part of PSL

        ;-------------------------------;
        W[0]<--W[0].OR.P[PSL.CC..TP]    ; or in hardware part of PSL
                :
                :
        ;-------------------------------; write modified PSL to hardware:
        MXPR[PSL.HWRE]<--W[0]           ; update TP, T, NZVC in hardware
                :
                :
        ;-------------------------------; modify just PSL condition codes:
        P[PSL.CC..TP]<--P[PSL.CC..TP].ANDNOT.K[1]       ; clear PSL<C>



1.7.2  Hardware Interrupts -

Hardware interrupts come from the following sources:  the halt pin,  which
is  nonmaskable;  the  power  fail  pin,  which  interrupts  at IPL31; the
interval timer pin, which interrupts  at  IPL16,  or  the  four  interrupt
request pins, which interrupt at IPL's 17-14.  These pins are strobed once
per  microcycle  by  the  hardware  interrupt  controller.   The  hardware
interrupt  controller  compares the priority of any asserted interrupts to
the prevailing interrupt priority level (IPL).  If  any  of  the  asserted
interrupts has a higher priority than the IPL, the interrupt logic asserts
the signal Interrupt Pending to the I Box.  A  different  version  of  the

MicroVAX CPU Chip Microcode Documentation (Company Confidential)         Page 11
NOTES ON THE MICROVAX MICROCODE                                  1 February 1985


signal,  not  including  halt, is available as FPD Interrupt Pending.  The
interrupt controller receives the IPL  over  the  internal  DAL  when  the
hardware PSL is updated via an MXPR instruction.  It can return the number
of the highest priority outstanding interrupt via an MXPR to the interrupt
identification (INTID) register.



1.7.3  Software Interrupts -

Software interrupts  are  entirely  implemented  by  the  microcode.   The
microcode  maintains  the  Software Interrupt Summary Register (SISR) in a
temporary register in the data path.  When macrocode requests  a  software
interrupt  by writing a value into the Software Interrupt Request Register
(SIRR), the microcode updates it copy of SISR and calculates whether  this
will  result in an interrupt.  If so, the microcode directly dispatches to
the interrupt routine.   If  not,  the  microcode  continues  with  normal
execution.

The software interrupt system is also examined during an  REI  instruction
or  other event which changes the interrupt priority level.  If the IPL is
changed to a value lower than the highest priority software interrupt, and
if  no  hardware  interrupts  are  pending,  the  microcode will enter the
software interrupt sequence.  Because the microcode can only test for  FPD
interrupts,  and  not  all  interrupts, this implies that a halt interrupt
request will NOT be honored  if  a  software  interrupt  sequence  can  be
started.



1.7.4  Asynchronous System Traps (AST's) -

AST's are  entirely  implemented  through  the  microcode.   When  an  REI
instruction,  or  other event which changes the IPL, occurs, the microcode
checks to see whether the new IPL is below  AST  level.   If  it  is,  the
microcode  checks  the  AST  register for a pending AST, and generates any
required software interrupts.

MicroVAX CPU Chip Microcode Documentation (Company Confidential)         Page 12
NOTES ON THE MICROVAX MICROCODE                                  1 February 1985


1.8  Microcode Decisions

The VAX  SRM  permits  some  scope  for  machine-dependent  implementation
decisions,  particularly  in  interrupts,  exceptions,  and the privileged
instructions.  Here are  some  of  the  implementation  decisions  in  the
MicroVAX  chip  which  may  affect diagnostic or improperly written system
software.

     1.  General -- The chip has no temporaries for the per process  stack
         pointers.   These  are always kept in the PCB.  The chip does not
         implement PME.

     2.  Memory Management -- The chip will  machine  check  if  a  memory
         management  microtrap occurs and the resolved process PTE address
         is not in system space.

     3.  Specifiers -- The chip treats modes 4F, 5F, 6F,  7F  as  reserved
         address  modes.  The chip will NOT fault on a modify reference to
         an  immediate  operand  (there  will  undoubtedly  be  an  access
         violation later).

     4.  Exceptions -- If psl<fpd> is set at initial  instruction  decode,
         and  the  opcode  is  not  one for which psl<fpd> is specifically
         allowed, the chip takes a reserved opcode fault.

     5.  Exceptions -- An ACV or TNV during a kernel stack  not  valid  or
         machine  check  abort  causes  a processor restart (like a halt).
         Likewise, a machine check during a  kernel  stack  not  valid  or
         machine check abort causes a processor restart.

     6.  Exceptions -- Kernel stack not  valid  abort  and  machine  check
         abort  follow  the same flows as regular exceptions, that is, the
         chip does not automatically process these aborts on the interrupt
         stack.

     7.  Exceptions -- Vector<1:0> # 0 during a CHMx is ignored, as in the
         11/780.

     8.  Exceptions -- Vector<1:0> = 2 or 3 causes a processor restart.

     9.  Exceptions -- The machine check protocol is documented in a later
         section.

    10.  Interrupts -- The chip uses only bits<9:2> of the incoming vector
         as  the  offset  into  the  SCB.  Bit<0> is interpreted as a flag
         which, if set, signifies special Qbus processing (force IPL =  17
         hex).

    11.  Queues -- Certain types of misformed  interlocked  queues,  which
         the   SRM   regards  as  UNPREDICTABLE,  are  processed  normally
         (notably, a queue with a zero foreward  pointer  and  a  non-zero
         backward pointer is treated as empty).

MicroVAX CPU Chip Microcode Documentation (Company Confidential)         Page 13
NOTES ON THE MICROVAX MICROCODE                                  1 February 1985


    12.  Queues -- A machine check abort in the middle of  an  interlocked
         queue instruction will not unlock the queue header.

    13.  Privileged -- LDPCTX does no reserved operand checking.

    14.  Privileged -- The chip  does  not  implement  numerous  processor
         registers.   These  unimplemented  registers read as zero and are
         ignored on write.

    15.  Privileged -- MTPR does no reserved operand checking, except  for
         the  register  number and the value of ASTLVL, if accessed.  MTPR
         automatically forces values written to PCBB,  SCBB,  P0BR,  P1BR,
         and SBR to be longword aligned.


MicroVAX CPU Chip Microcode Documentation (Company Confidential)         Page 14
MICROVAX INSTRUCTION AND SPECIFIER DECODING                      1 February 1985


2  MICROVAX INSTRUCTION AND SPECIFIER DECODING

This section desribes MicroVAX initial instruction decode (IID)  and  next
specifier decode (NSD).



2.1  Overview

The  MicroVAX  microengine  is  "hardwired"   for   instruction   specific
sequencing  at  two  points:   initial  instruction  decode (IID) and next
specifier decode (NSD).  Initial instruction decode occurs during the last
microcycle  of  the  previous  macroinstruction  and  performs  an initial
instruction fork based on the opcode and the first specifier (if there  is
one).   Next  specifier decode occurs at the end of the first (and second)
specifiers and performs the  secondary  and  tertiary  instruction  forks.
This is shown graphically below:

MicroVAX CPU Chip Microcode Documentation (Company Confidential)         Page 15
MICROVAX INSTRUCTION AND SPECIFIER DECODING                      1 February 1985


                                                               IID
                                                                |
                                +---------------+---------------+
                                |               |               |
                               IID             IID             IID
                            exceptions:     opcodes:        specifiers:
                            interrupts,     branches,       all other
                            traps, etc      no spec,        instructions
                                            XFC, XFD            |
                                                                |
        +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
        |       |       |       |       |       |       |       |       |       |       |       |       |       |       |
      short   index  IB dry  IB halt   reg    reg    autodec autoinc  immed  autoinc  absol   by/wd   long    by/wd   long
      lit       |       |       |       |     defer     |       |       |    defer      |     displ   displ   displ   displ
        |       |       |       |       |       |       |       |       |       |       |       |       |     defer   defer
        |       |       |       |       |       |       |       |       |       |       |       |       |       |       |
        +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
                                                                |
                                                               NSD (second specifier)
                                                                |
                                +---------------+---------------+
                                |               |               |
                               NSD             NSD             NSD
                            execute:        optimize:       specifiers:
                            fork = re       fork = fre &    fork = fre &
                                |           spec = 5X       spec ~ 5X or
                                |               |           fork = fse
                            dispatch        dispatch            |
                                                                |
        +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
        |       |       |       |       |       |       |       |       |       |       |       |       |       |       |
      short   index  IB dry  IB halt   reg    reg    autodec autoinc  immed  autoinc  absol   by/wd   long    by/wd   long
      lit       |       |       |       |     defer     |       |       |    defer      |     displ   displ   displ   displ
        |       |       |       |       |       |       |       |       |       |       |       |       |     defer   defer
        |       |       |       |       |       |       |       |       |       |       |       |       |       |       |
        +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
                                                                |
                                                               NSD (third specifier)
                                                                |
                                                            dispatch

MicroVAX CPU Chip Microcode Documentation (Company Confidential)         Page 16
MICROVAX INSTRUCTION AND SPECIFIER DECODING                      1 February 1985


2.2  Initial Instruction Decode (IID)

Initial instruction decode (IID) is a special branch field condition which
marks  the  last  microinstruction  of  the current macroinstruction.  IID
invokes special microaddress generation logic in the I Box which generates
the  next  address  based  on  conditions  in  the  micromachine  and  the
instruction buffer:

     1.  If an exception or interrupt is pending, the next microaddress is
         generated according to the IID EXCEPTION dispatch table.

     2.  If there is no exception  or  interrupt  pending,  and  the  next
         macroinstruction  does  not  require specifier decoding, the next
         microaddress is generated according to the  IID  OPCODE  dispatch
         table.

     3.  If there is no exception  or  interrupt  pending,  and  the  next
         macroinstruction   does  require  specifier  decoding,  the  next
         microaddress is generated according to the IID SPECIFIER dispatch
         table.




2.2.1  IID Exception Dispatch -

If there is an exception or interrupt pending, the  next  microaddress  is
generated in accordance with the following table:

 VAX    | INTER |PSL<TP>| Pre-  | IB    ||  microaddress
 TRAP   | PEND  |       | fetch | dry   ||     (hex)
 REQ    |       |       | halted|       ||
--------+-------+-------+-------+-------++------------------
  1     |  x    |  x    |  x    |  x    ||  114         VAX trap
  0     |  1    |  x    |  x    |  x    ||  10E         interrupt
  0     |  0    |  1    |  x    |  x    ||  10C         trace trap
  0     |  0    |  0    |  1    |  1    ||  106         prefetch halted
  0     |  0    |  0    |  0    |  1    ||  104         prefetch stalled
  0     |  0    |  0    |  0    |  0    ||  see IID Opcode Dispatch

MicroVAX CPU Chip Microcode Documentation (Company Confidential)         Page 17
MICROVAX INSTRUCTION AND SPECIFIER DECODING                      1 February 1985


2.2.2  IID Opcode Dispatch -

If there is no exception or interrupt pending, the  next  microaddress  is
generated in accordance with the following table:

 PSL    | Opcode| IB[PC] <7:0>  ||  microaddress
 <FPD>  | reg   |               ||     (hex)
        | <8:0> |               ||
        | =0FD  |               ||
--------+-------+---------------++--------------------------
  0     |  no   |  0000 0xxx    ||  130...13E           zero specifiers HALT...SVPCTX
  0     |  no   |  00x1 0000    ||  124                 BSBB, BSBW
  0     |  no   |  00x1 0001    ||  120                 BRB, BRW
  0     |  no   |  0001 001x    ||  120                 BNEQ, BEQL
  0     |  no   |  0001 010x    ||  120                 BGTR, BLEQ
  0     |  no   |  0001 1xxx    ||  120                 BGEQ...BCS
  0     |  no   |  1111 1100    ||  128                 XFC
  x     |  no   |  1111 1101    ||  12A                 XFD
  1     |  x    |  xxxx xxxx    ||  12C                 FPD set
  0     |  no   |  xxxx xxxx    ||  see IID Specifier Dispatch          all OTHER one byte opcodes
  0     |  yes  |  xxxx xxxx    ||  see IID Specifier Dispatch          all TWO byte opcodes

Since the only two FPD opcodes are MOVC3 and MOVC5, the microcode does NOT
redispatch  on FPD but instead inspects the opcode with a case branch, and
transfers control directly to the appropriate unpack routine.



2.2.3  IID Specifier Dispatch -

If there is no exception or interrupt pending, and  the  opcode  does  not
specify  direct dispatch, the next microaddress is generated in accordance
with the following table:

 Specifier      | uaddr | uaddr ||
                | (hex) | (hex) ||
                |R=0...E|  R=F  ||
----------------+-------+-------++-----------------------------------
0x,1x,2x,3x     |  140  |  140  ||  S^#
4x              |  142  |  14E  ||  [R]         [PC] illegal
dry, not halted |  144  |  144  ||
dry, halted     |  146  |  146  ||
5x              |  14A  |  14E  ||  R           PC illegal
6x              |  14C  |  14E  ||  (R)         (PC) illegal
7x              |  150  |  14E  ||  -(R)        -(PC) illegal
8x              |  152  |  148  ||  (R)+        I^#
9x              |  154  |  156  ||  @(R)+       @#
Ax, Cx          |  158  |  158  ||  d(R)        d(PC)
Ex              |  15A  |  15A  ||  d(R)        d(PC)
Bx, Dx          |  15C  |  15C  ||  @d(R)       @d(PC)
Fx              |  15E  |  15E  ||  @d(R)       @d(R)

MicroVAX CPU Chip Microcode Documentation (Company Confidential)         Page 18
MICROVAX INSTRUCTION AND SPECIFIER DECODING                      1 February 1985


2.3  Next Specifier Decode (NSD)

Next specifier decode (NSD) is a  special  branch  field  condition  which
marks  the  last microinstruction of first specifier decode or other first
part processing.  NSD invokes special microaddress generation logic in the
I  Box  which  generates  the  next address based on the EXECUTION_STARTED
flip-flop, the fork code from the IPLA, the  specifier  counter,  and  the
instruction buffer.

 EXEC_  | Fork code/ type       | Spec  |IB dry | Reg   |          Microaddress          |  Address
 START  |                       | Num   |or halt| Mode  |10  9  8  7  6  5  4  3  2  1  0|  Range
--------+-----------------------+-------+-------+-------+--+--+--+--+--+--+--+--+--+--+--+----------------
  1     |  x                    |  x    |  x    |  x    |   execute usubroutine return   |  any
--------+-----------------------+-------+-------+-------+--+--+--+--+--+--+--+--+--+--+--+----------------
  0     |  0  / FSE second spec |  1    |  x    |  x    |   see NSD Specifier Dispatch   |  180 - 19E
--------+-----------------------+-------+-------+-------+--+--+--+--+--+--+--+--+--+--+--+----------------
  0     |  0  / FSE execute     |  2    |  x    |  x    | 0  1|   execution address   | 0|  200 - 3FE (note)
--------+-----------------------+-------+-------+-------+--+--+--+--+--+--+--+--+--+--+--+----------------
  0     |  1  / FRE second spec |  1    |  y    |  x    |   see NSD Specifier Dispatch   |  180 - 19E
--------+-----------------------+-------+-------+-------+--+--+--+--+--+--+--+--+--+--+--+----------------
  0     |  1  / FRE second spec |  1    |  n    |  n    |   see NSD Specifier Dispatch   |  180 - 19E
--------+-----------------------+-------+-------+-------+--+--+--+--+--+--+--+--+--+--+--+----------------
  0     |  1  / FRE opt execute |  1    |  n    |  y    | 1  0|   execution address   | 0|  400 - 5FE (note)
--------+-----------------------+-------+-------+-------+--+--+--+--+--+--+--+--+--+--+--+----------------
  0     |  1  / FRE execute     |  2    |  x    |  x    | 0  1|   execution address   | 0|  200 - 3FE (note)
--------+-----------------------+-------+-------+-------+--+--+--+--+--+--+--+--+--+--+--+----------------
  0     |  2  / FE execute      |  x    |  x    |  x    | 0  1|   execution address   | 0|  200 - 3FE (note)
--------+-----------------------+-------+-------+-------+--+--+--+--+--+--+--+--+--+--+--+----------------

Note:  The two byte opcodes (for  g_floating)  are  overmapped  into  this
space  by  OR'ing the high order opcode bit into next address bit <5> (ie,
g_floating  instructions  that  are  not  mapped  onto  their   f_floating
counterparts  will  dispatch  to  the  equivalent  d_floating dispatches).
microinstruction bus.



2.3.1  EXECUTION_STARTED Flip-Flop -

The EXECUTION_STARTED flip-flop is cleared at IID.  It is set by the I Box
when   an   NSD   opcode   dependant  dispatch  is  executed.   Once  set,
EXECUTION_STARTED causes all subsequent instances of NSD to be interpreted
as  microsubroutine  return.   This permits consolidation of two copies of
the specifier flows.

MicroVAX CPU Chip Microcode Documentation (Company Confidential)         Page 19
MICROVAX INSTRUCTION AND SPECIFIER DECODING                      1 February 1985


2.3.2  Fork Code And Specifier Counter -

If EXECUTION_STARTED is clear, the fork code from the IPLA, the  specifier
counter  in the I Box, and the state of the instruction buffer interact to
determine the interpretation of NSD.

     1.  Fork code FE.  NSD causes  an  opcode  dependant  dispatch  to  a
         microaddress in the range 200 - 3FE.  EXECUTION_STARTED is set.

     2.  Fork code FRE.

          -  Specifier 1, IB dry:  NSD specifier dispatch.
          -  Specifier 1, IB ok, specifier  is  not  register  mode:   NSD
             specifier dispatch.
          -  Specifier 1, IB  ok,  specifier  is  register  mode:   opcode
             dependent  dispatch to a microaddress in the range 400 - 5FE.
             EXECUTION_STARTED is set.
          -  Specifier 2:  opcode dependent dispatch to a microaddress  in
             the range 200 - 3FE.  EXECUTION_STARTED is set.


     3.  Fork code FSE.

          -  Specifier 1:  NSD specifier dispatch.
          -  Specifier 2:  opcode dependent dispatch to a microaddress  in
             the range 200 - 3FE.  EXECUTION_STARTED is set.





2.3.3  Opcode Dependent Dispatch -

The opcode dependent dispatch mentioned above is derived from the nine-bit
opcode  and  the  three-bit  execution dispatch control in the IPLA.  This
three-bit field expands to an  eight-bit  mask,  in  accordance  with  the
following table:

execution       |    mask       ||
dispatch code   |               ||
----------------+---------------++--------------------------------------
  0             |   1111 1001   ||  used to consolidate BBSx, BBCx
  1             |   1001 1111   ||  used to force ADD{B,W,L}x to ADDBx, etc
  2             |   1101 1001   ||  used to force ADDfn, SUBfn, MULfn, DIVfn to ADDFn
  3             |   0001 0000   ||  used to force MOVx, MOVAx, MOVZxy to 10(hex)
  4             |   0001 0101   ||  used to force PUSHAx, PUSHL to 15(hex), CLRx to 14(hex)
  5             |   1111 1111   ||  used for unmodified dispatch
  6             |   1111 1100   ||  used to force CVTfx to CVTFB, CVTxf to CVTBf
  7             |   1111 1110   ||  used to consolidate even-odd pairs

Opcode bit <8> is OR'd into bit <5>, the result is AND'd  with  the  mask,
and  the  final  result  becomes  bits  <8:1> of the next microinstruction
address.  Thus opcode dispatches are always to EVEN locations in 512  word
ranges.

MicroVAX CPU Chip Microcode Documentation (Company Confidential)         Page 20
MICROVAX INSTRUCTION AND SPECIFIER DECODING                      1 February 1985


2.3.4  NSD Specifier Dispatch -

If the fork code calls for a second specifier, the  next  microaddress  is
generated in accordance with the following table:

 Specifier      | uaddr | uaddr ||
                | (hex) | (hex) ||
                |R=0...E|  R=F  ||
----------------+-------+-------++-----------------------------------
0x,1x,2x,3x     |  180  |  180  ||  S^#
4x              |  182  |  18E  ||  [R]         [PC] illegal
dry, not halted |  184  |  184  ||
dry, halted     |  186  |  186  ||
5x              |  18A  |  18E  ||  R           PC illegal
6x              |  18C  |  18E  ||  (R)         (PC) illegal
7x              |  190  |  18E  ||  -(R)        -(PC) illegal
8x              |  192  |  188  ||  (R)+        I^#
9x              |  194  |  196  ||  @(R)+       @#
Ax, Cx          |  198  |  198  ||  d(R)        d(PC)
Ex              |  19A  |  19A  ||  d(R)        d(PC)
Bx, Dx          |  19C  |  19C  ||  @d(R)       @d(PC)
Fx              |  19E  |  19E  ||  @d(R)       @d(R)

MicroVAX CPU Chip Microcode Documentation (Company Confidential)         Page 21
MICROVAX IPLA                                                    1 February 1985


3  MICROVAX IPLA

The IPLA contains 19 bits for each MicroVAX opcode.  The IPLA  is  defined
through the following Micro2 macro:

 IPLA[prm.1][prm.2][prm.3][prm.4][prm.5][prm.6][prm.7][prm.8][prm.9][prm.10]

Each parameter goes inside a set of square brackets.

The EXACT order of the parameters is:

        [prm.1]         OPCODE                          mnemonic
        [prm.2]         DATA LENGTH SPECS 1 & 2         mnemonic
        [prm.3]         ACCESS CODE SPECS 1 & 2         mnemonic
        [prm.4]         FORK CODE                       mnemonic
        [prm.5]         EXECUTE DISPATCH CTRL           mnemonic
        [prm.6]         V BIT TRAP                      mnemonic
        [prm.7]         PSL CC MAP CODE                 mnemonic
        [prm.8]         FBOX INSTRUCTION                mnemonic
        [prm.9]         FPD ILLEGAL OPCODE              numeric
        [prm.10]        BRANCH CTRL TEST CONDITION      mnemonic

In detail:

     1.  Prm.  1 -- Opcode:  The instruction mnemonic goes here.

     2.  Prm.2 -- Data length for specifiers 1 and 2:   The  data  lengths
         for  specifiers  1  and 2 go here.  The parameter consists of two
         data length mnemonics (for compatability with earlier versions of
         the  hardware,  the  value  definitions automatically add a third
         value equal to the second).  Micro2 generates a 6-bit field  from
         this.  The data length mnemonics are:

                b    =  00:     BYTE
                w    =  01:     WORD
                l,f  =  10:     LONG, F_Floating
                q,d,g = 11:     QUAD, D_Floating, G_floating

         An example of this encoding:  bl (specifiers  1  is  byte,  2  is
         long) is encoded as 00 10 10.

     3.  Prm.3 -- Access code for specifiers 1 and 2:   The  access  types
         for  specifiers  1  and 2 go here.  The parameter consists of two
         access code mnemonics (the value definitions automatically add  a
         third value equal to the second).  Micro2 generates a 6-bit field
         from this.  The access code mnemonics are:

                r   =   00:     READ
                m   =   01:     MODIFY
                a   =   10:     ADDRESS 
                v   =   11:     FIELD

         An example of this encoding:  rv (specifiers 1 is read, specifier
         2 is field) is encoded as 00 11 11.

MicroVAX CPU Chip Microcode Documentation (Company Confidential)         Page 22
MICROVAX IPLA                                                    1 February 1985


     4.  Prm.4  --  Fork  code:   The  fork  code,  which   controls   the
         interpretation  of  NSD,  goes here.  The parameter consists of a
         single fork control mnemonic.  Micro2 assembles this into  a  two
         bit field.  The fork code mnemonics are:

                fse =   00:     first, second, execute
                fre =   01:     first, optimize, execute
                fe  =   10:     first, execute
                ill =   11:     opcode is ILLEGAL

     5.  Prm.5 -- Execution  dispatch  control:   The  execution  dispatch
         control,  a  3-bit  index  into  a mask table, goes here.  Micro2
         automatically generates the proper index code  by  comparing  the
         desired dispatch address against the base instruction mnemonic.

     6.  Prm.6 -- V bit trap:  A 1/0 value, which enables or disables  the
         optimized  trap on integer overflow, goes here.  Micro2 generates
         a 1-bit value  for  this  field.   Mnemonics  for  the  optimized
         overflow trap are:

                VINT =  0:      automatic integer overflow trap if V bit
                                and IV bit set
                X    =  1:      no automatic trap

     7.  Prm.7 -- PSL  CC  map  code:   The  PSL  condition  code  mapping
         function  goes  here.   Micro2  generates  a 3-bit value for this
         field.  The mnemonics for the condition code map are:

                IIII =  0:      PSL.NZVC = imm ALU.NZVC
                IIIJ =  1:      PSL.NZV = imm ALU.NZV, PSL.C = ~imm ALU.C
                IIIP =  2:      PSL.NZV = imm ALU.NZV, PSL.C unchanged
                JIZJ =  3:      PSL.NZVC = compare encoding of imm ALU.NZVC
                AAAA =  4:      PSL.NZVC = ALU.NZVC
                AAAB =  5:      PSL.NZV = ALU.NZV, PSL.C = ~ALU.C
                AAAP =  6:      PSL.NZV = ALU.NZV, PSL.C unchanged
                ;    =  7:      unused

     8.  Prm.8  --  Fbox  instruction:   A  1/0  value,  which   indicates
         floating/non-floating   instruction   respectively,   goes  here.
         Micro2 generates a 1-bit value for this field.  Mnemonics for the
         floating instruction field are:

                EBOX = 0:       instruction is not floating point
                FBOX = 1:       instruction is floating point

     9.  Prm.9 -- FPD illegal opcode:  A 0/1 value, which  indicates  that
         this   instruction  is  legal/illegal  if  FPD  is  set.   Micro2
         generates a 1-bit value for this field.  There are no mnemonics.

    10.  Prm.10 -- Branch control test condition:  The test condition  for
         the  branch  control  PLA goes here.  The various test conditions
         mnemonics are:

                X      =  0:    NEVER TRUE

MicroVAX CPU Chip Microcode Documentation (Company Confidential)         Page 23
MICROVAX IPLA                                                    1 February 1985


         ;      A*NxV  =  1:    ALU NOT.(NxorV) 
         ;      A*Z    =  2:    ALU NOT.Z
         ;      A*ZNxV =  3:    ALU NOT.(Zor(NxorV))
         ;      A*ZN   =  4:    ALU NOT.(ZorN) 
         ;      ANxV   =  5:    ALU N.XOR.V
         ;      AZ     =  6:    ALU Z
         ;      AZNxV  =  7:    ALU Zor(NxorV) 
                P*C    =  8:    PSL NOT.C
                P*CZ   =  9:    PSL NOT.(C.OR.Z)
                P*N    =  A:    PSL NOT.N
                P*NZ   =  B:    PSL NOT.(N.OR.Z)
                P*V    =  C:    PSL NOT.V
                P*Z    =  D:    PSL NOT.Z
                PC     =  E:    PSL C
                PCZ    =  F:    PSL C.OR.Z
                PN     = 10:    PSL N
                PNZ    = 11:    PSL N.OR.Z
                PV     = 12:    PSL V
                PZ     = 13:    PSL Z

         Note that this information is not used by MicroVAX.

As an example, here is the IPLA macro for the ADDW2 instruction:

        IPLA[ADDW2][ww ][rm ][fre][ADDB2][VINT][IIII][EBOX][1][X   ]

MicroVAX CPU Chip Microcode Documentation (Company Confidential)         Page 24
MICROVAX MACHINE CHECK SPECIFICATION                             1 February 1985


4  MICROVAX MACHINE CHECK SPECIFICATION

The section describes how MicroVAX handles serious microcode and  hardware
error conditions including memory subsystem errors.  These conditions are:

      -  Impossible situations in the microcode
      -  Impossible situations in memory management
      -  Unused IPL requests
      -  Unused FPU errors
      -  Bus (memory) errors
      -  Multiple errors




4.1  Types Of Errors

4.1.1  Impossible Situations In The Microcode -

Due to size constraints, erroneous branches in the microcode will  usually
result in the execution of random microinstructions.  However, a few cases
are trapped out.  If the microcode  detects  an  impossible  situation,  a
machine check occurs.

        param           meaning
        -----           -------
        1               First Specifier Decode reached memory read
                        processing even though the access type is .ax OR

                        First Specifier Decode reached floating short
                        literal processing for an instruction with an
                        opcode in the range 00 to 1F or 80 to 9F

        2               Second Specifier Decode reached memory read
                        processing even though the access type is .ax



4.1.2  Impossible Situations In Memory Management -

MicroVAX does some  checking  for  impossible  conditions  in  the  memory
management  microflows.  If an impossible situation is detected, a machine
check occurs.

        param           meaning
        -----           -------
        5               The Memory Management Status Register returned
                        an undefined value (TB miss flows)

        6               The Memory Management Status Register returned
                        an undefined value (M = 0 flows)

        7               The calculated virtual address for a Process PTE
                        is in P0 space

MicroVAX CPU Chip Microcode Documentation (Company Confidential)         Page 25
MICROVAX MACHINE CHECK SPECIFICATION                             1 February 1985



        8               The calculated virtual address for a Process PTE
                        is in P1 space



4.1.3  Unused IPL Request -

MicroVAX uses only a few  of  the  32  interrupt  priority  levels  (IPLs)
defined  in the VAX architecture.  If the interrupt controller requests an
interrupt at an unused IPL, a machine check occurs.

        param           meaning
        -----           -------
        9               The interrupt controller returned an interrupting
                        IPL of 19 or 1D




4.1.4  Unused FPU Error -

The FPU returns three bits of status if an error occurs.  Only six of  the
possible eight error conditions are defined.  If the FPU returns an unused
error code, a machine check occurs.

        param           meaning
        -----           -------
        3               The FPU returned unused status code 0

        4               The FPU returned status code 7 and the chip
                        failed to take an FPU error microtrap



4.1.5  Bus (Memory) Errors -

If external logic asserts ERR L in response to any memory cycle other than
an instruction prefetch or interrupt acknowledge, a machine check occurs.

        param           meaning
        -----           -------
        80              read bus error, address parameter is virtual

        81              read bus error, address parameter is physical

        82              write bus error, address parameter is virtual

        83              write bus error, address parameter is physical


MicroVAX CPU Chip Microcode Documentation (Company Confidential)         Page 26
MICROVAX MACHINE CHECK SPECIFICATION                             1 February 1985


4.1.6  Multiple Errors -

If MicroVAX encounters nested serious errors (e.g., kernel stack not valid
inside  a machine check), or other conditions which cannot be processed by
macrocode (e.g., HALT instruction in kernel mode),  the  microcode  places
the  current PC in IPR[SAVEPC], the current PSL, MAPEN, and a restart code
in IPR[SAVEPSL], the current interrupt stack in IPR[SAVEISP], and executes
a restart process.



4.2  Machine Check Processing

4.2.1  Microcode Actions -

The microcode process for machine check is the same for all cases.   If  a
serious   error  (machine  check  exception  or  kernel  stack  not  valid
exception) is in progress, the restart process is invoked.  Otherwise, the
current  instruction  is  packed up (MOVC3, MOVC5, POLYf) or unwound.  The
microcode sets the  serious  error  flag  and  performs  normal  exception
processing  through  SCB vector 4.  The following parameters are pushed on
the stack:

        +-------------------------------------------------------+
        |               byte count (0000000C hex)               |  :SP
        +-------------------------------------------------------+
        |               machine check code                      |
        +-------------------------------------------------------+
        |               most recent virtual address             |
        +-------------------------------------------------------+
        |               internal state information              |
        +-------------------------------------------------------+
        |                       PC                              |
        +-------------------------------------------------------+
        |                       PSL                             |
        +-------------------------------------------------------+

The parameters are:

        machine check code (hex):       1       =       impossible microcode state (FSD)
                                        2       =       impossible microcode state (SSD)
                                        3       =       undefined FPU error code 0
                                        4       =       undefined FPU error code 7
                                        5       =       undefined memory management status (TB miss)
                                        6       =       undefined memory management status (M = 0)
                                        7       =       process PTE in P0 space
                                        8       =       process PTE in P1 space
                                        9       =       undefined interrupt ID code
                                        80      =       read bus error, address parameter is virtual
                                        81      =       read bus error, address parameter is physical
                                        82      =       write bus error, address parameter is virtual
                                        83      =       write bus error, address parameter is physical

        most recent virtual address:    <31:0>  =       current contents of VAP register

MicroVAX CPU Chip Microcode Documentation (Company Confidential)         Page 27
MICROVAX MACHINE CHECK SPECIFICATION                             1 February 1985



        internal state information:     <28:24> =       current contents of ATDL register
                                        <23:20> =       current contents of STATE<3:0>
                                        <19:16> =       current contents of ALU cond codes
                                        <14>    =       current contents of VAX CANT RESTART bit
                                        <7:0>   =       delta PC at time of exception

        PC:                             <31:0>  =       PC of start of current instruction

        PSL:                            <31:0>  =       current contents of PSL

When exception processing is complete, the serious error flag is  cleared,
and the next instruction is decoded.



4.2.2  Operating System Actions -

Most machine checks are non-recoverable.   The  only  case  for  which  an
instruction  restart is even theoretically possible is a read bus error of
a virtual address which results from a transient error (eg,  parity).   In
this  case,  the  VAX  CANT  RESTART  and  FIRST PART DONE (FPD) bits tell
whether the instruction is restartable.  VAX CANT RESTART is  set  if  the
instruction has modified any of the visible registers (GPR's, PSL, etc) or
written data to memory.  FPD is set  if  the  CPU  is  in  the  middle  of
executing  an  interruptible instruction.  If VAX CANT RESTART is set, and
FPD is clear, then instruction recovery should not be attempted.   If  VAX
CANT  RESTART  is  clear,  or FPD is set, then instruction recovery can be
attempted.



4.3  Restart Processing

If the hardware or kernel software environment becomes severely corrupted,
the chip may be unable to continue normal processing.  In these instances,
the chip executes a restart process and passes control  to  recovery  code
beginning  at  physical  address 20040000 (hex).  IPR[SAVEPC] contains the
previous PC, IPR[SAVEPSL] contains the previous PSL with MAPEN in  bit<15>
and  a  restart  code  in  bits  <14:8>, IPR[SAVISP] contains the previous
Interrupt Stack.  The restart codes are as follows:

          code          condition
          ----          ---------
            2           HALT L asserted
            3           initial power on
            4           interrupt stack not valid during exception
            5           machine check during machine check or kernel stack
                        not valid exception
            6           HALT instruction executed in kernel mode
            7           SCB vector bits<1:0> = 11
            8           SCB vector bits<1:0> = 10
            A           CHMx executed while on interrupt stack
           10           ACV or TNV during machine check exception

MicroVAX CPU Chip Microcode Documentation (Company Confidential)         Page 28
MICROVAX MACHINE CHECK SPECIFICATION                             1 February 1985


           11           ACV or TNV during kernel stack not valid exception

The restart process sets the state of the chip as follows:

        IPR[SAVISP]     =       saved interrupt stack pointer
        IPR[SAVPC]      =       saved PC
        IPR[SAVEPSL]    =       saved PSL<31:16,7:0> in <31:16,7:0>
                                saved MAPEN<0>       in <15>
                                saved restart code   in <14:8>
        SP              =       stack pointer at time of restart
                                (not stack pointer specified by PSL<26:24>)
        PSL             =       041F0000 (hex)
        PC              =       20040000 (hex)
        MAPEN           =       0
        SISR            =       0       (powerup only)
        ASTLVL          =       4       (powerup only)
        ICCS            =       0       (powerup only)
        all else        =       undefined

MicroVAX CPU Chip Microcode Documentation (Company Confidential)         Page 29
MICROVAX CONSOLE SUPPORT                                         1 February 1985


5  MICROVAX CONSOLE SUPPORT

The restart process  described  in  the  previous  section  allows  system
designers  to  implement a transparent console in macrocode.  This section
details some of the fine points of implementing a macrocode console.



5.1  Entry Protocol

Following the restart process, the console is entered with state saved  in
internal  registers.   THIS  STATE  IS  VALID FOR A LIMITED TIME ONLY.  IN
PARTICULAR,  MEMORY  MANAGEMENT  MUST  BE  LEFT  DISABLED,  AND   EMULATED
INSTRUCTIONS CANNOT BE USED before the saved values are moved to permanent
memory.  Thus a typical console entrance code might look like this:

;       ipr console.pc  =       saved pc
;       ipr console.psl =       saved psl + saved mapen + error code
;       ipr console.isp =       "real" isp
;       sp              =       stack pointer at time of error
;       pc              =       20040000
;       psl             =       041F0000
;       mapen           =       0
;       astlvl          =       ??? (4 at powerup)
;       sisr            =       ??? (0 at powerup)
;       iccs            =       ??? (0 at powerup)

CONSOLE::
        mfpr    #console.pc,ram_saved.pc        ; save saved pc
        mfpr    #console.psl,ram_saved.psl      ; save saved psl
        mfpr    #console.isp,ram_saved.isp      ; save saved isp
        movl    sp,ram_saved.sp                 ; save current stk ptr
                                                ; (to complete stack swap if necc)
        movl    #ram_stack,sp                   ; set up console stack ptr
         :
         :

The saving of the "real" console interrupt stack pointer, as well  as  the
SP  register,  conceals one of the many trickeries of this procedure.  The
console runs on the interrupt stack.  If the halted code was running on  a
non-interrupt  stack,  the microcode should execute a stack swap, that is,
store SP in KSP, ESP, SSP,  or  USP,  and  load  SP  from  ISP.   However,
MICROVAX  KEEPS  THE  NON-INTERRUPT  STACK POINTERS IN THE PCB.  The stack
swap requires both a valid PCB and a successful memory  access.   This  is
unacceptable,  given  that  the  console is often entered with a corrupted
software environment.  Thus, in the console  entrance  protocol,  MICROVAX
DOES  NOT EXECUTE A STACK SWAP.  The SP register contains the stack at the
time the halt  or  error  occurred,  and  IPR   console.isp  contains  the
interrupt  stack  pointer, which may or may not equal the SP register.  If
the saved PSL has the interrupt stack bit CLEAR,  then  the  console  must
complete  the  stack  swap  by  storing  the  saved  value  of SP into the
appropriate location in the current PCB, if one exists.  If the saved  PSL
has the interrupt stack bit SET, then no special action is required.

MicroVAX CPU Chip Microcode Documentation (Company Confidential)         Page 30
MICROVAX CONSOLE SUPPORT                                         1 February 1985


In addition to completing the  stack  swap,  the  console  must  save  the
general  registers, the SCBB, and the PCBB, and establish an SCBB and PCBB
for its own operation.



5.2  Console Processing

The console executes in kernel mode, on the interrupt stack,  with  memory
management  disabled.   Thus  it  has  access  to  all  machine resources.
However, because the console has in effect replaced the  normally  running
program, it must access certain machine resources from saved status rather
than current status:

      -  General registers
      -  PSL
      -  Certain IPRs (notably KSP, ESP, SSP, USP, which are  in  the  OLD
         PCBB; ISP; PCBB and SCBB; IPL, which is in the OLD PSL)




5.3  Console Exit

The exit from the console depends on two things.  First,  the  environment
to which the console is exiting must have a validly mapped interrupt stack
with at least two spare longwords at the bottom.  Second,  the  REI  which
restores  the  PC  and  PSL  must  be  part  of the same physical longword
containing the instruction (or part of the instruction) that  sets  MAPEN.
The  exit  protocol is then to push the saved PC and PSL onto the (mapped)
bottom of the SAVED interrupt stack, decrement the SAVED  interrupt  stack
pointer, enable mapping, if appropriate, and exit via an REI:

;       ram_saved.pc    =       saved pc
;       ram_saved.psl   =       saved psl + saved mapen + error code
;       ram_saved.isp   =       saved interrupt sp
;       ram_isp.ptr     =       translated pointer to saved int stack
;       R0 - R13, SCBB  =       restored to initial values

CONSOLE.EXIT::
        subl2   #4,ram_isp.ptr                  ; prepare to push onto saved stack
        movl    ram_saved.psl,@ram_isp.ptr      ; push psl onto stack
        incl    ram_isp.ptr                     ; pointer at byte 1 of psl on stack
        clrb    @ram_isp.ptr                    ; clear psl<15:8>
        subl2   #5,ram_isp.ptr                  ; prepare to push onto saved stack
        movl    ram_saved.pc,@ram_isp.ptr       ; push pc onto stack
        movl    ram_saved.isp,sp                ; restore saved sp
        subl2   #8.,sp                          ; two longwords have been pushed
        bbc     #7,ram_saved.psl+1,console.rei  ; if mapping not enabled, skip enabling
        mtpr    #1,#mapen                       ; turn on mapping (if it was on)
CONSOLE.REI::
        rei                                     ; restore psl and pc, return to user

For this exit sequence to work, the interrupt stack at the time of console

MicroVAX CPU Chip Microcode Documentation (Company Confidential)         Page 31
MICROVAX CONSOLE SUPPORT                                         1 February 1985


entry  must  be  validly  mapped  and  must have two spare longwords.  The
console will have to verify this fact by simulating the memory  management
process,  thereby  proving that the interrupt stack is resident and points
to valid physical memory.  If the interrupt stack is NOT valid,  the  exit
sequence must be aborted.

Also for the exit sequence to work, the REI following  the  MTPR  MUST  be
executed  DESPITE  the  fact that memory mapping has been totally changed.
This can be arranged IF the REI is prefetched as  part  of  the  preceding
instruction.  The MTPR to MAPEN flushes the translation buffer BUT NOT THE
INSTRUCTION PIPELINE.  Thus, if the REI was in the instruction buffer,  it
will  be  executed, irrespective of where the new mapped PC points.  Since
mapping is now on, REI will  pop  the  new  PC  and  PSL  off  the  mapped
interrupt  stack.  That is why the console must push the PC and PSL at the
translated addresses corresponding to  the  top  of  the  saved  interrupt
stack.

Prior to the REI, the interrupt stack pointer and MAPEN register have been
restored  to  their  initial  values.  The REI restores the PSL and PC and
switches stacks according to the saved PSL (which is why the console  MUST
finish  the  console  swap which the microcode was unable to do at console
entry).