          CTEXT  SCI MDD RESIDENT CODE
          OVERLAY  (MDD RESIDENT OVERLAY),OVLM
 MDDSI    SPACE  4,10
**        MDD ROUTINE LIST.


 MDDSI    ROUTINE

          LOC    0
 S.LCW    CON    MDDINI      INITIALIZE CONSOLE FOR *MDD* MODE AND PRINT HEADER
 S.WFK    CON    MDD
 S.NIO    CON    MDD
 S.PIO    CON    MDD
          LOC    *O
          QUAL   *
 MDD      SPACE  4,10
**        MDD - MAINTENANCE DISPLAY DRIVER IDLE LOOP.
*
*         ENTRY  (RFLG) = REPEAT FLAG.
*                (RDLY) = REMAINING TIME UNTIL REPEAT.
*                (CMDB) = COMMAND ADDRESS.
*                (CPOP) = NUMBER OF CHARACTERS OUTPUT SO FAR.
*
*         EXITS  TO *SMPX* IF LAST OUTPUT NOT COMPLETE OR NOTHING TO DO.
*                TO *CMD* IF A CARRIAGE RETURN HAS BEEN PROCESSED.
*                TO LAST ROUTINE IF REPEAT IS SET AND HAVE TIMED OUT.
*
*         USES   BA, BP.
*
*         CALLS  CMC, PRI.


 MDDINI   CALL   PHD         SET UP SCREEN AND ISSUE COPYRIGHT NOTICE

 MDD      LDML   CPOP        GET NUMBER OF CHARACTERS OUTPUT SO FAR
          RAD    BA          SET FOR PREVIOUS CHARACTERS ECHOED BY MDD
          LDM    MDMT+CHRC.
          ZJN    MDD2        IF LAST OUTPUT ALL SENT
 MDD1     LJM    SMPX        ELSE WAIT FOR OUTPUT COMPLETION

 MDD2     LDML   CPOP        GET NUMBER OF CHARACTERS OUTPUT SO FAR
          RAD    BP          UPDATE BP ACCORDINGLY
          SHN    -14         CHECK FOR COMPLETED LINE
          ZJN    MDD3        IF A CARRIAGE RETURN HAS NOT BEEN PROCESSED
          LJM    CMD         PROCESS THE NEW COMMAND

 MDD3     RJM    PRI         ELSE CHECK FOR INPUT
          LDM    CPOP        TEST FOR NEW INPUT
          NJN    MDD1        IF WAITING FOR COMMAND TO COMPLETE
          LDM    RFLG        TEST FOR REPEAT DISPLAY
          ZJN    MDD1        IF REPEAT NOT SET
          LDM    CMDB        TEST FOR A COMMAND TO DO
          ZJN    MDD1        IF NOTHING TO DO
          SOML   RDLY
          NJN    MDD1        IF NOT TIME YET
          LDML   MDDR        RESET DELAY
          STML   RDLY
          LDN    0#19        HOME CURSOR
          STIAO  BP
          LJM    CMD3        REPEAT CALL TO ROUTINE
 MDER     SPACE  4,10
**        MDER - PROCESS MR ERROR IN *MDD* MODE.
*
*         ENTRY  FATAL OR NON-FATAL MR ERROR OCCURRED IN *MDD* MODE.
*                CHANNEL 17 STATUS (ACTIVE, CHANNEL FLAG) UNKNOWN.
*
*         EXIT   MESSAGE ISSUED.
*                CHANNEL 17 INACTIVE AND FLAG CLEAR.


 MDER     FCJM   MDER1,MR    IF CHANNEL FLAG CLEAR, NO CLEANUP REQUIRED

*         THIS ASSUMES THAT IF THE CHANNEL FLAG IS SET, *SCI* MUST BE
*         THE LOGICAL OWNER OF THE CHANNEL.  THERE IS A VERY SMALL
*         TIMING WINDOW IN WHICH *SCI* COULD HAVE CLEARED THE FLAG,
*         BRANCHED TO *MDER*, AND IN THE MEANTIME ANOTHER PP ACQUIRED
*         THE CHANNEL FLAG.  WITHOUT MAKING CHANGES TO COMMON DECK
*         *DSI$MAINTENANCE_REGISTER_ACCESS* TO GUARANTEE THAT CHANNEL 17
*         IS ALWAYS IN A KNOWN STATE, THIS WINDOW IS INEVITABLE.  SUCH
*         CHANGES WOULD BE UNWISE, SINCE IN THE CASE OF A MR ERROR IT
*         IS DESIRABLE TO PRESERVE CONDITIONS AS MUCH AS POSSIBLE.

          DCN    MR+40       CLEAN UP CHANNEL STATUS
          CCF    *,MR        RELEASE CHANNEL FLAG
 MDER1    PRINT  MDERA+CRLF  *MR ERROR*
          LJM    MDD         RESUME *MDD* MODE

 MDERA    ASCII  (MR ERROR)
          EJECT
 ASN      SPACE  4,10
**        ASN - ASSEMBLE NAME.
*
*         ENTRY  (BP) = NEXT CHARACTER IN LINE.
*
*         EXIT   (BP) = POSITIONED AFTER NAME.
*
*         CALLS  GAC, SKP.


 ASN      SUBR               ENTRY/EXIT
          RJM    SKP         SKIP DELIMITERS
          ZJN    ASNX        RETURN IF EOLN
          RJM    GAC         GET ALPHABETIC CHARACTER
          MJN    ASNX        IF NOT ALPHABETIC
          SHN    6
          STM    ASNA        STORE IN BUFFER
          RJM    GAC         GET ALPHABETIC CHARACTER
          MJN    ASNX        IF NOT ALPHABETIC
          RAM    ASNA
 ASN1     RJM    GAC         THROW AWAY REST OF NAME
          MJN    ASNX
          UJN    ASN1        IF NOT DONE

 ASNA     BSS    1
 CFI      SPACE  4,10
**        CFI - CHECK FOR INCREMENT.
*
*         ENTRY  (BP) = FIRST CHARACTER.
*                (VAL3 - VAL3+2) = 0.
*
*         EXIT   (A) = 0, IF INCREMENT COMMAND OR EMPTY LINE.
*                (VAL3 - VAL3+2) = INCREMENT VALUE.
*
*         USES   T0.
*
*         CALLS  DNV, SKP.


 CFI      SUBR               ENTRY/EXIT
          RJM    SKP         SKIP LEADING BLANKS
          ZJN    CFIX        IF ENTIRE LINE IS BLANK
          LDI    BP          CHECK NEXT CHARACTER
          SBN    1R+
          STD    T0
          ZJN    CFI1        IF PLUS
          SBN    1R--1R+
          NJN    CFIX        IF NOT MINUS
 CFI1     AOD    BP          ADVANCE CHARACTER COUNT
          LDM    VAL4        PREVIOUS DECODE TYPE
          LPN    7
          SHN    14
          LMN    2
          RJM    DNV         DECODE UP TO 24 BITS
          ZJN    CFI1.5      IF NO VALUE SPECIFIED
          LDM    VAL4
          LPN    40
          ZJN    CFI2        IF WORD ADDRESS
          LDM    ABUF-1      CHANGE BYTE COUNT TO WORD COUNT
          SHN    21-2
          STM    ABUF-1
          SHN    2-21
          SHN    14
          LMM    ABUF
          SHN    -3
          STM    ABUF
          UJN    CFI2

 CFI1.5   LDM    VAL2        USE DISPLAY COUNT
          STM    ABUF
 CFI2     LDD    T0          INCREMENT/DECREMENT FLAG
          ZJN    CFI3        IF INCREMENT
          LCN    0
          STM    VAL3
          LMM    ABUF-1      COMPLEMENT UPPER PART
          STD    T1
          LDC    7777
          LMM    ABUF
          ADN    1           FORM TWOS COMPLEMENT
          STM    ABUF
          SHN    -14
          ADD    T1
          STM    ABUF-1
 CFI3     LDM    ABUF        SET INCREMENT VALUE
          STM    VAL3+2
          LDM    ABUF-1
          STM    VAL3+1
          LDN    0
          LJM    CFIX        RETURN
 CLB      SPACE  4,10
**        CLB - CLEAR BUFFER.
*
*         EXIT   (ABUF) = 0.
*                (MRBF - MRBF+6) = 0.
*                (NBUF - NBUF+7) = 0.
*
*         USES   T2.


 CLB      SUBR               ENTRY/EXIT
          LDN    10          CLEAR *NBUF* AND *ABUF*
          ERRNZ  ABUF-NBUF-10  CHANGE CODE IF BUFFERS CHANGE
          STD    T2
 CLB10    LDN    0
          STM    NBUF,T2     CLEAR BUFFER ENTRY
          SOD    T2
          PJN    CLB10       IF MORE BUFFER TO CLEAR
          LDN    6           CLEAR *MRBF - MRBF+6*
          STD    T2
 CLB20    LDN    0
          STM    MRBF,T2     CLEAR BUFFER ENTRY
          SOD    T2
          PJN    CLB20       IF MORE BUFFER TO CLEAR
          UJN    CLBX        RETURN
 CLC      SPACE  4,15
**        CLC - CLASSIFY CHARACTER.
*
*         ENTRY  (BP) = ADDRESS OF NEXT CHARACTER IN LINE.
*
*         EXIT   (A) = CHARACTER TYPE:
*                      0 = END OF LINE.
*                      1 = CONTROL.
*                      2 = EQUALS SIGN.
*                      3 = NUMERIC.
*                      4 = ALPHABETIC.
*                (W6) = UPPERCASE CHARACTER, IF ALPHABETIC.
*                     = BINARY VALUE, IF NUMERIC.
*
*         USES   T1, W6.


 CLC4     AOD    T1          ALPHABETIC
 CLC3     AOD    T1          NUMERIC
 CLC2     AOD    T1          SEPARATOR
 CLC1     AOD    T1          CONTROL CHARACTOR

 CLC      SUBR               ENTRY/EXIT
          LDN    0
          STD    T1          ASSUME (CR)
          LDI    BP          GET THE NEXT CHARACTER
          ZJN    CLCX        IF END OF LINE
          SBN    1R0
          STD    W6          SAVE NUMERIC VALUE
          MJN    CLC1        IF CONTROL CHARACTER
          SBN    10D
          MJN    CLC3        IF NUMBER
          SBN    1R=-1R9-1
          ZJN    CLC2        IF *=*
          SBN    1RA-1R=
          MJN    CLC2        IF SEPARATOR
          LDI    BP          RETRIEVE CHARACTER
          STD    W6
          UJN    CLC4        IT IS ALPHABETIC

 CRSY     EQU    0           END OF LINE SYMBOL
 CCSY     EQU    1           CONTROL CHARACTER SYMBOL
 EQSY     EQU    2           SEPARATER SYMBOL
 NBSY     EQU    3           NUMBER SYMBOL
 ALSY     EQU    4           ALPHABETIC SYMBOL
 CMD      SPACE  4,10
**        CMD - PROCESS COMMAND.
*
*         ENTRY  (BP) = ADDRESS OF NEXT CHARACTER IN LINE.
*
*         EXIT   COMMAND PROCESSED.
*
*         USES   T2, VAL1 - VAL1+1, OVLP.
*
*         CALLS  ASN, CFI, PRM, SFN.
*
*         MACROS PRINT.


 CMD      ROUTINE            ENTRY

          RJM    CFI         CHECK FOR INCREMENT
          ZJP    CMD2        IF INCREMENT OR EMPTY LINE
          LOADOV MDDC        LOAD *MDD* COMMAND SYNTAX OVERLAY
          RJM    ASN         ASSEMBLE NAME

*         DETERMINE COMMAND MASK.

          LDM    S0FLG       CHECK FOR S0/S0E MAINFRAME
          SHN    1
          NJN    CMD0        IF S0/S0E, SET MASK = 2
          LDN    1           SET MASK = 1 FOR ALL OTHER MAINFRAMES
 CMD0     SHN    6           POSITION MASK
          STD    T1
          LDN    5           SET TABLE ENTRY SIZE
          STD    T2

*         SEARCH FOR COMMAND TABLE ENTRY WHICH MATCHES MNEMONIC AND IS
*         VALID ON THIS HARDWARE.

          LDC    CMDS        SET SYNTAX TABLE ADDRESS
 CMD0.1   RJM    SFN         SEARCH FOR NAME
 CMD1     ZJP    CMDE        IF END OF COMMAND TABLE (ILLEGAL COMMAND)
          LPDL   T1
          NJN    CMD1.1      IF COMMAND VALID ON THIS HARDWARE
          LDD    T2          ADVANCE TO NEXT ENTRY
          RAD    T7
          UJN    CMD0.1      CONTINUE SEARCH

 CMD1.1   LDM    1,T7        SAVE PROCESSOR OVERLAY NUMBER
          LPN    77
          STM    CMDA
          LDM    2,T7        SAVE PROCESSOR ADDRESS
          STM    CMDB
          RJM    PRM         DECODE PARAMETER LIST
 CMD2     LDM    CMDB
          ZJN    CMDE        IF NOT REPEATING COMMAND
          LDM    RFLG
          ZJN    CMD3        IF NO REFRESH
          PRINT  CMDI        CLEAR SCREEN
 CMD3     LDM    CMDB        INSERT ADDRESS AND OVERLAY NUMBER
          STM    CMDC+1
          LDM    CMDA
          ADC    LDCI
          STM    CMDC
          PSN                (REQUIRED FOR CYBER 930 PIPELINE)
 CMDC     CALL   0           PROCESS THE COMMAND

 CMDE     PRINT  CMDM+CRLF   ILLEGAL COMMAND

**        ENTRY POINT FROM *SR* COMMAND.

 CMDF     LDN    0           CLEAR REPEAT ADDRESS

 CMDR     STM    CMDB        SET REPEAT DISPLAY ADDRESS
          SHN    -14
          STM    VAL4        SET ADDRESS DECODE
          LDN    0           CLEAR INHIBIT OVERLAY LOAD FLAG
          STM    OVLP
          STM    CPOP        CLEAR CARRIAGE RETURN FLAG IF WEIRD ENTRY
          LDC    MDD
          STI    PT          RESET RTNP.
          LJM    SMPX        RETURN

 CMDI     CON    0#180C      CLEAR SCREEN (FOR 751 AND 721)
          CON    0           END OF LINE
 CMDM     ASCII  (*ILL*)
 CMDFO    EQU    OVLN        EQUATE TO CURRENT OVERLAY NUMBER
 DAT      SPACE  4,10
**        DAT - DISPLAY ASCII TEXT.
*
*         ENTRY  (NBUF - NBUF+3) = CHARACTERS.
*
*         USES   T2.
*
*         CALLS  PAC.


 DAT      SUBR               ENTRY/EXIT
          LDN    0
          STD    T2
 DAT1     LDML   NBUF,T2
          SHN    -10
          RJM    PAC         PRINT UPPER CHARACTER
          LDM    NBUF,T2
          RJM    PAC         PRINT LOWER CHARACTER
          AOD    T2
          LMN    4
          NJN    DAT1        IF MORE TO DISPLAY
          UJN    DATX        RETURN
 DFV      SPACE  4,10
**        DFV - DECODE FLAG VALUES.
*
*         ENTRY  (A) = ADDRESS OF FLAG MEANINGS.
*                (W2) = LEFT JUSTIFIED FLAGS.
*
*         USES   M2.
*
*         CALLS  WAS.
*
*         MACROS PRINT.


 DFV1     RJM    EOL         COMPLETE LINE

 DFV      SUBR               ENTRY/EXIT
          STD    M2
          LDI    M2          DISPLAY HEADER TEXT
          RJM    WAS
 DFV2     AOD    M2          INCREMENT TABLE INDEX
          LDDL   W2          CHECK NEXT BIT
          ZJN    DFV1        IF DONE THEN RETURN
          RADL   W2          RESET BIT LIST
          SHN    21-20       TEST HIGHEST BIT
          PJN    DFV2        IF BIT NOT SET
          LDI    M2          GET ADDRESS OF ASSOCIATED MESSAGE
          ZJN    DFV2        IF NO MESSAGE
          RJM    WAS         WRITE STRING
          PRINT  DFVA
          UJN    DFV2        CHECK NEXT BIT

 DFVA     ASCII  (, )
 DNV      SPACE  4,10
**        DNV - DECODE NUMERIC VALUE.
*
*         ENTRY  (A) = NUMBER LENGTH + 10000*NUMBER TYPE.
*                (BP) = NEXT CHARACTER IN LINE.
*
*         EXIT   (ABUF) = NUMBER.
*
*         USES   T2, T3, T4, T5.
*
*         CALLS  CLB, SKP, TND.


 DNV      SUBR               ENTRY/EXIT
          STD    T5          SAVE NUMBER LENGTH (MAX)
          SHN    -14
          LPN    7
          STD    T2          SET DECODE TYPE
          LDM    DNVC,T2     SET DIGIT MASK
          STM    DNVA
          LDM    DNVD,T2     SET UNPACKING ROUTINE
          STM    DNVB
          RJM    CLB         CLEAR BUFFER
          RJM    SKP         SKIP DELIMITERS
          ZJN    DNVX        IF END OF LINE
          LDD    BP
          STM    MDMT+TEMP.  SAVE CHARACTER
 DNV1     RJM    TND         TRANSLATE NUMERIC DIGIT
          MJN    DNV3        IF NOT NUMBER
          STI    BP          SAVE DIGIT RETURNED
 DNVA     SCN    7           CHECK IF OUT OF RANGE
          NJP    CMDE        IF NUMBER TOO LARGE
          AOD    BP          ADVANCE CHARACTER POSITION
          UJN    DNV1        PROCESS NEXT CHARACTER

 DNV3     LDD    BP
          SBN    1
          STD    T4
          LDC    ABUF
          STD    T3
          SBD    T5
          STD    T5
          LDN    0
          STD    T2
 DNV4     LDI    T4          GET NEXT DIGIT
          LJM    **,T2
 DNVB     EQU    *-1

 DNV5     STD    T2          SAVE BYTE POSITION
          NJN    DNV6        IF CURRENT WORD NOT COMPLETED
          SOD    T3          DECREMENT BUFFER POSITION
          SBD    T5
          MJP    CMDE        IF NUMBER TOO LARGE
 DNV6     SOD    T4
          SBM    MDMT+TEMP.
          PJN    DNV4        IF MORE DIGITS TO ASSEMBLE
          LDIL   T5
          NJP    CMDE        IF NUMBER OVERFLOW
          LDN    1
          LJM    DNVX        RETURN

*         MRNT - MAINTENANCE REGISTER NUMBER TYPE.

 DNV7     SHN    22-4
          SHN    4
          RAI    T3
          AOD    T2
          LPN    1
          UJN    DNV5        CONTINUE

*         OWNT - OCTAL WORD NUMBER TYPE.

 DNV8     SHN    22-3
          SHN    22-3
          SHN    22-3
          SHN    11
          RAI    T3
 DNV9     AOD    T2
          LPN    3
          UJN    DNV5        CONTINUE

*         HWNT - HEX WORD NUMBER TYPE.

 DNV10    SHN    22-4
          SHN    22-4
          SHN    22-4
          SHN    14
          RAIL   T3
          UJN    DNV9        CONTINUE

*         HPNT - HEX PP WORD NUMBER TYPE.

 DNV11    SHN    22-4
          SHN    22-4
          SHN    10
          RAI    T3
          AOD    T2
          SBN    3
          ZJN    DNV9        IF START NEXT WORD
          LJM    DNV6        CONTINUE


 TBLI     SET    0

 MRNT     ENTER  DNV7,SCNI+17  MAINTENANCE REGISTER NUMBER TYPE
 OWNT     ENTER  DNV8,SCNI+7   OCTAL WORD NUMBER TYPE
 HWNT     ENTER  DNV10,SCNI+17 HEX WORD NUMBER TYPE
 HPNT     ENTER  DNV11,SCNI+17 HEX PP WORD NUMBER TYPE

 DNVC     BSS    0           TABLE OF *SCN*-S
 TBLB     HERE
 DNVD     BSS    0           TABLE OF PROCESSOR ADDRESSES
 TBLA     HERE

 OCWD     EQU    OWNT
 HXWD     EQU    HPNT
 HXBT     EQU    HPNT+400000
 DTO      SPACE  4,10
**        DTO - DEADMAN TIMEOUT CHECK.
*
*         ENTRY  (A) = WORD COUNT FROM *READMR*.
*
*         THIS ROUTINE WILL PRINT A DEADMAN
*         TIMEOUT MESSAGE IF (A) IS NON ZERO.


 DTO      SUBR               ENTRY/EXIT
          ZJN    DTOX        IF COMPLETED NORMALLY
          PRINT  DTOM+CRLF
          LJM    CMDF        RETURN FROM COMMAND

 DTOM     ASCII  (DEADMAN TIMEOUT)
 EOL      SPACE  4,10
**        EOL - WRITE END OF LINE.
*
*         EXIT   TO *CKQ* TO PROCESS OUTPUT LINE.
*                TO *CMDF* IF INTERRUPT RECEIVED.
*
*         CALLS  GKC.
*
*         USES   BP.

 EOL      SUBR               ENTRY/EXIT
          LDC    EOL1        SET RETURN ADDRESS INTO RTNP.
          STI    PT
          LDN    CR          ADD CARRIAGE RETURN TO BUFFER
          STIAO  BP
          LDN    LF          ADD LINE FEED TO BUFFER
          STIAO  BP
          LJM    CKQ         COMPLETE OUTPUT AND RETURN TO IDLE LOOP

 EOL1     LDM    MDMT+CHRC.  TEST IF PREVIOUS OUTPUT DONE
          NJP    SMPX        IF OUTPUT IN PROGRESS
          RJM    GKC         CHECK FOR INTERRUPT
          ZJN    EOLX        IF NO INTERRUPT RECEIVED
          LJM    CMDF        TERMINATE CURRENT COMMAND
 GAC      SPACE  4,10
**        GAC - GET ALPHABETIC CHARACTER.
*
*         ENTRY  (BP) = ADDRESS OF THE NEXT CHARACTER.
*
*         EXIT   (A) = CHARACTER (IF ALPHABETIC).
*                (A) = -1 (IF NOT).
*                (BP) = INCREMENTED IF ALPHABETIC CHARACTER.
*
*         CALLS  CLC.


 GAC1     LCN    1           NOT ALPHABETIC CHARACTER

 GAC      SUBR               ENTRY/EXIT
          RJM    CLC         CLASSIFY NEXT CHARACTER
          SBN    ALSY
          NJN    GAC1        IF NOT ALPHABETIC CHARACTER
          AOD    BP
          LDD    W6          GET ALPHABETIC UPPER CASE CHARACTER
          SBN    40
          UJN    GACX        RETURN
 PAC      SPACE  4,10
**        PAC - PRINT ASCII CHARACTER.
*
*         ENTRY  (A) = CHARACTER.


 PAC      SUBR               ENTRY/EXIT
          LPC    0#7F
          SBN    40
          PJN    PAC1        IF PRINTABLE CHARACTER
          LDN    0
 PAC1     ADN    40
          STIAO  BP          PUT CHARACTER IN OUTPUT QUEUE
          UJN    PACX        RETURN
 PRI      SPACE  4,12
**        PRI - PROCESS INPUT STRING.
*
*         EXIT   (BA) = FWA OF STRING.
*                (BP) = LWA OF STRING.
*                (CPOP) = CARRIAGE RETURN FLAG SET IF FOUND.
*                TO *CMDE* IF *ESC* OR BAD CHARACTER TYPED.
*                TO *CKQ* IF INPUT PROCESSED.
*
*         USES   BP.
*
*         CALLS  EOL, GKC.


 PRI      SUBR               ENTRY/EXIT
          RJM    GKC         READ THE NEXT CHARACTER
          ZJN    PRIX        IF NONE THEN RETURN
          STI    BP          ECHO CHARACTER BACK
          SBN    1R
          MJN    PRI5        IF CONTROL CHARACTER
          ZJN    PRI4        IF BLANK
          SBN    1R0-1R
          MJP    PRI7        IF *!* THROUGH */*
          SBN    1R9+1-1R0
          MJN    PRI4        IF *0* THROUGH *9*
          SBN    1R=-1R9-1
          ZJN    PRI4        IF *=*
          SBN    1RA-1R=
          MJN    PRI3        IF OTHER CHARACTER LESS THAN *A*
          SBN    0#60-1RA
          ZJN    PRI3        IF GRAVE ACCENT
          LDI    BP
          LPC    137         CONVERT TO UPPER CASE
          STI    BP
          ADC    -1RZ-1
          MJN    PRI4        IF VALID LOWER CASE CHARACTER
 PRI3     LJM    CMDE        INVALID CHARACTER ENCOUNTERED

 PRI4     AOD    BP          INCREMENT CHARACTER POINTER
          AOM    CPOP        INCREMENT CHARACTERS OUTPUT
          ADC    -72D
          PJN    PRI3        IF LINE TOO LONG RESTART LINE
 PRI40    LJM    CKQ         IF LINE NOT TOO LONG

 PRI5     ADN    1R -CR
          ZJN    PRI9        IF CARRIAGE RETURN
          ADN    CR-BS
          NJN    PRI3        IF NOT BACKSPACE
          AOD    BP          OUTPUT THE BACKSPACE
          SOM    CPOP        DECREMENT CHARACTERS OUTPUT
          PJN    PRI40       IF NOT BACKSPACE BEYOND START OF LINE
          LJM    CMDF        IGNORE INPUT AND RESTART

 PRI7     ADN    1R0-1R-
          ZJN    PRI4        IF *-*
          ADN    1R--1R,
          ZJN    PRI4        IF *,*
          ADN    1R,-1R+
          ZJN    PRI4        IF *+*
          UJN    PRI3        BAD CHARACTER

 PRI9     STIAO  BP          TERMINATE LINE WITH ZERO CHARACTER
          RJM    EOL         SEND CARRIAGE RETURN AND LINE FEED
          LDC    CRLF        SET CARRIAGE RETURN FLAG IN CPOP
          STML   CPOP        LINE NOW ZERO LENGTH
          LDC    MDD
          STI    PT          RESET RTNP.
          LJM    PRIX        RETURN
 PRM      SPACE  4,10
**        PRM - DECODE PARAMETER LIST.
*
*         ENTRY  (T7) = POINTER TO COMMAND ENTRY.
*                KEYBOARD LINE IN *BUF*.
*
*         EXIT   (PC) = PARAMETER COUNT.
*
*         USES  T1 - T7, CM - CM+3, BP.
*
*         CALLS  ASN, DNV, SKP.


 PRM      SUBR               ENTRY/EXIT
          LDM    3,T7        GET PARAMETER LIST
          ZJN    PRMX        IF NO PARAMETER SYNTAX
          STD    CM          SAVE LIST ADRRESS
          STD    CM+1
          LDM    4,T7        GET PARAMETER TYPE
          STD    CM+3
          LDN    1
          STD    PC
 PRM0     LDD    PC          SET PARAMETER UNUSED FLAG
          SHN    14
          LMI    CM+1
          STIL   CM+1
          SHN    -13
          LPN    1
          ADN    2           ADVANCE TO NEXT PARAMETER
          RAD    CM+1
          AOD    PC          INCREMENT PARAMETER NUMBER
          LDI    CM+1        GET NEXT PARAMETER
          NJN    PRM0        ADVANCE THROUGH LIST
          STD    PC          CLEAR PARAMETER COUNT
          LDM    1,CM        GET PARAMETER NAME LIST
          STD    CM+1
          LJM    PRM11       ENTER LOOP

 PRM1     RJM    SKP         CLASSIFY CHARACTER
          SBN    ALSY
          ZJN    PRM3        IF ALPHABETIC
          ADN    ALSY-NBSY
          ZJN    PRM2.6      IF ERROR
 PRM2     LJM    CMDE        PROCESS ERROR

 PRM2.5   LDD    T5          RESET BUF POINTER
          STD    BP
 PRM2.6   LDD    CM          SET CURRENT PARAMETER
          STD    T6
          LDM    1,T6
          STD    T7          SET CURRENT PARAMETER POINTER
          LDI    T6
          SHN    21-13
          MJN    PRM2        IF PARAMETER MUST BE EQUIVALENCED
          UJN    PRM6        IF NUMBER

 PRM3     LDD    BP
          STD    T5
          RJM    ASN         ASSEMBLE NAME
          ZJN    PRM2.5      IF ERROR
          LDN    3
          STD    T2          SET TABLE ENTRY SIZE
          LDD    CM+1
          RJM    SFN         SEARCH FOR NAME
          ZJN    PRM2.5      IF ERROR
          STD    T6          SET NEW PARAMETER POINTER
          LDI    T6
          SHN    21-13
          PJN    PRM4        IF MULTIPLE EQUIVALENCES
          LDM    2,T6        PARAMETER ADDRESS
          STD    T1
          LDM    2,T7        PARAMETER VALUE
          STI    T1          SET PARAMETER
 PRM4     RJM    SKP         SKIP SPACES
          SBN    EQSY
          ZJN    PRM5        IF *=*
          UJN    PRM10       NO VALUE TO BE SET

 PRM5     AOD    BP          INCREMENT PAST *=*
 PRM6     LDI    T6
          LPN    17
          NJN    PRM8        IF CAN BE EQUIVALENCED
 PRM7     UJP    PRM2        PROCESS ERROR

 PRM8     STD    T1
          LDD    CM+3        GET PARAMETER TYPE
          SHN    14
          LMD    T1
          RJM    DNV         DECODE NUMBER
          LDI    T6
          LPN    17
          STD    T1          SET WORD LENGTH
          LDC    ABUF
          SBD    T1
          STD    T3
          LDM    2,T7        SET VARIABLE ADDRESS
          STD    T4
 PRM9     AOD    T3
          LDIL   T3
          STIL   T4
          AOD    T4
          SOD    T1
          NJN    PRM9        IF NOT DONE COPYING
 PRM10    LDIL   T6          CLEAR NOT REFERENCED BIT
          STI    T6
          SHN    -14
          ZJN    PRM7        IF ALREADY USED
          LMC    SHNI
          STM    PRMA
          LDN    1
 PRMA     SHN    **
          RADL   PC          SET USED BIT FOR PARAMETER
          LDI    CM
          SHN    -13
          LPN    1
          ADN    2
          RAD    CM
 PRM11    LDI    CM
          ZJN    PRM13       IF END OF PARAMETER LIST
          RJM    SKP
          ZJN    PRM13       IF END OF INPUT
          LDD    T3
          ZJN    PRM12.5     IF ONE OR NO COMMAS
          SOD    T3
 PRM12    ZJN    PRM12.5
          SOD    T3
          LDI    CM
          SHN    -13
          LPN    1
          ADN    2
          RAD    CM
          LDD    T3
          UJN    PRM12       CHECK FOR MORE COMMAS

 PRM12.5  LJM    PRM1        GO BACK FOR NEXT PARAMETER

 PRM13    LJM    PRMX        RETURN
 PRN      SPACE  4,10
**        PRN - PRINT NUMBER.
*
*         ENTRY  (A) = NUMBER OF DIGITS TO PRINT.
*                (NBUF) = CONTAINS THE NUMBER TO PRINT.
*
*         USES   T2, T3, T4, W6.
*
*         CALLS  WND.


 PRN      SUBR               ENTRY/EXIT
          STD    T4          SET NUMBER OF DIGITS TO OUTPUT
          SHN    -14
          STD    T2
          LDM    PRNB,T2     GET UNPACKING ROUTINE
          STM    PRNA        SET JUMP ADDRESS
          LDN    0           SET STARTING DIGIT FOR UNPACK
          STD    T2
          LDC    NBUF        SET BUFFER POSITION
          STD    T3
 PRN1     LDIL   T3          READ BUFFER VALUE
          LJM    PRN4,T2     UNPACK DIGITS
 PRNA     EQU    *-1

 PRN2     STD    T2          SET NEXT DIGIT POSITION
          NJN    PRN3        IF NO ADVANCE OF POINTER
          AOD    T3
 PRN3     RJM    WND         OUTPUT TO TERMINAL
          SOD    T4          DECREMENT CHARACTER COUNT
          NJN    PRN1        IF MORE DIGITS TO PRINT
          LDN    1R
          STIAO  BP          PUT BLANK IN OUTPUT QUEUE
          UJN    PRNX        RETURN

*         MAINTENANCE REGISTER DIGITS.

 PRN4     SHN    -4          GET UPPER DIGIT
          STD    W6          SAVE VALUE
          LDD    T2
          LMN    1
          UJN    PRN2        CONTINUE PRINT

*         OCTAL MEMORY DIGIT.

 PRN5     SHN    -3          GET UPPER DIGIT
          SHN    -3          GET UPPER MIDDLE DIGIT
          SHN    -3          GET LOWER MIDDLE DIGIT
          LPN    7
 PRN6     STD    W6          SAVE VALUE
          AOD    T2
          LPN    3
          UJN    PRN2        CONTINUE PRINT

*         HEX MEMORY DIGIT.

 PRN7     SHN    -4          GET UPPER DIGIT
          SHN    -4          GET UPPER MIDDLE DIGIT
          SHN    -4          GET LOWER MIDDLE DIGIT
          UJN    PRN6        SAVE VALUE AND ADVANCE POSITION

*         HEX PP DISPLAY TYPE.

 PRN8     SHN    -4
          SHN    -4
          STD    W6
          AOD    T2
          SBN    3
          ZJN    PRN10
 PRN9     LDD    T2
 PRN10    LJM    PRN2        CONTINUE PRINT

*         HEX BYTE DISPLAY TYPE.

 PRN11    SHN    -4
          SHN    -4
          SHN    -4
          STD    W6
          AOD    T2
          LPN    3
          STD    T2
          LPN    1
          ZJN    PRN9        CONTINUE PRINT
          LDN    1R
          STIAO  BP          PUT BLANK IN OUTPUT QUEUE
          UJN    PRN9        CONTINUE PRINT

 TBLI     SET    0

 MRDT     ENTER  PRN4        MAINTENANCE REGISTER DISPLAY TYPE
 OMDT     ENTER  PRN5        OCTAL MEMORY DISPLAY TYPE
 HMDT     ENTER  PRN7        HEX MEMORY DISPLAY TYPE
 HPDT     ENTER  PRN8        HEX PP DISPLAY TYPE
 HBDT     ENTER  PRN11       HEX BYTE DISPLAY TYPE

 PRNB     BSS    0           INDEXED TABLE
 TBLA     HERE
 RBP      SPACE  4,10
**        RBP - RESET BP DIRECT CELL.
*
*         EXIT   (BP) = (BA), IF CARRIAGE RETURN.
*                (CPOP) = 0.


 RBP      SUBR               ENTRY/EXIT
          LDML   CPOP
          SHN    21-14
          PJN    RBPX        IF NO CARRIAGE RETURN
          LDD    BA          ELSE RESET BP
          STD    BP
          LDN    0           RESET CPOP
          STM    CPOP
          UJN    RBPX
 SFN      SPACE  4,10
**        SFN - SEARCH FOR NAME.
*
*         ENTRY  (A) = TABLE ADDRESS.
*                (T2) = ENTRY SIZE.
*
*         EXIT   (A) = WORD 1 OF TABLE ENTRY, IF FOUND.
*                    = 0, IF NO MATCHING ENTRY IN TABLE.
*                (T7) = COMMAND TABLE ENTRY IF FOUND.
*
*         USES   T7.


 SFN      SUBR               ENTRY/EXIT
          SBD    T2          PRE-DECREMENT TABLE INDEX
          STD    T7
 SFN1     LDD    T2          ADVANCE TABLE INDEX
          RAD    T7
          LDI    T7          GET NEXT COMMAND
          ZJN    SFNX        IF END OF TABLE
          LMM    ASNA        COMPARE TO CHARACTERS FROM LINE
          NJN    SFN1        IF NOT YET MATCHING
          LDML   1,T7        RETURN WORD 1 OF TABLE ENTRY
          UJN    SFNX        RETURN
 SKP      SPACE  4,10
**        SKP - SKIP SEPARATORS.
*
*         EXIT   (A) = CHAR TYPE (0 - 4) PER *CLC*.
*                (BP) = NEXT CHARACTER POSITION.
*                (T3) = NUMBER OF COMMAS FOUND.
*
*         USES   T3, BP.
*
*         CALLS  CLC.


 SKP3     RJM    CLC         CLASSIFY CHARACTER

 SKP      SUBR               ENTRY/EXIT
          LDN    0
          STD    T3
 SKP1     LDI    BP
          ZJN    SKPX        IF END OF LINE
          SBN    1R
          NJN    SKP2        IF NOT SPACE
          AOD    BP
          UJN    SKP1        CHECK NEXT CHARACTER

 SKP2     SBN    1R,-1R
          NJN    SKP3        IF NOT COMMA
          AOD    BP
          AOD    T3
          UJN    SKP1        TEST NEXT CHARACTER
 TND      SPACE  4,10
**        TND - TRANSLATE NUMERIC DIGIT.
*
*         ENTRY  (BP) = ADDRESS OF NEXT CHARACTER IN LINE.
*
*         EXIT   (A) = VALUE OF NUMBER (IF PRESENT).
*                    = -1 (IF NOT PRESENT).
*
*         USES   W6.
*
*         CALLS  CLC.


 TND2     LCN    1           IF NOT A NUMBER

 TND      SUBR               ENTRY/EXIT
          RJM    CLC         CLASSIFY CHARACTER
          SBN    NBSY
          ZJN    TND1        IF NUMBER
          SBN    ALSY-NBSY
          NJN    TND2        IF NOT ALPHABETIC
          LCN    1RA-10D     CONVERT LETTER TO NUMBER
 TND1     RAD    W6          RESET W6 TO NUMBER
          UJN    TNDX        RETURN
 WND      SPACE  4,10
**        WND - WRITE NUMERIC DATA.
*
*         ENTRY  (W6) = DATA TO PRINT.


 WND      SUBR               ENTRY/EXIT
          RJM    RBP         RESET BP?
          LDD    W6
          LPN    17          EXTRACT HEX DIGIT
          SBN    10D
          MJN    WND1        IF DECIMAL DIGIT
          ADN    1RA-1R0-10D
 WND1     ADN    1R0+10D     FORM ASCII DIGIT
          STIAO  BP          PUT CHARACTER IN OUTPUT QUEUE
          UJN    WNDX        RETURN
 WAS      SPACE  4,10
**        WAS - WRITE CODED STRING.
*
*         ENTRY (A) = ADDRESS OF STRING TO OUTPUT.
*
*         USES   T3, T4.
*
*         CALLS  EOL, RBP.


 WAS2     LDD    T4
          ZJN    WAS4        IF NO EOLN TO BE PRINTED
 WAS3     RJM    EOL         OUTPUT A CR/LF
          UJN    WASX        RETURN

 WAS4     LDD    BP          GET LENGTH OF STRING SO FAR
          SBD    BA
          SBN    70
          PJN    WAS3        IF MORE THAN 70 CHARACTERS SO FAR

 WAS      SUBR               ENTRY/EXIT
          STD    T3          SAVE STRING ADDRESS
          SHN    -14         SAVE EOLN FLAG
          STD    T4
          RJM    RBP         RESET BP?
 WAS1     LDIL   T3          LOAD TWO CHARACTERS
          SHN    -10
          ZJN    WAS2        IF END OF LINE
          STIAO  BP          PUT CHARACTER IN OUTPUT QUEUE
          LDI    T3
          LPC    177
          ZJN    WAS2        IF END OF LINE
          STIAO  BP          PUT CHARACTER IN OUTPUT QUEUE
          AOD    T3
          UJN    WAS1        PROCESS NEXT TWO BYTES
          SPACE  4
*         THE FOLLOWING BUFFERS ARE USED FOR COMMAND PARAMETER CRACKING AS WELL
*         AS OTHER TEMPORARY USES.  BE AWARE THAT THE TWO BUFFERS MUST BE
*         CONSECUTIVE DUE TO NEGATIVE INDEXING OF *ABUF*.


 NBUF     BSS    10          ASSEMBLY BUFFER
 ABUF     BSS    10          ASSEMBLY BUFFER
          ERRNZ  NBUF+10-ABUF  NEGATIVE INDEXING OF *ABUF*
          SPACE  4
          CODE   N
 MRPC     CON    0
          CON    ELPR        PORT CODE FOR REGISTER DISPLAY
 MRPE     BSS    0           SINGLE REGISTER DISPLAY
 00       MR     ( ),(4,3,2,1,0)
          CON    7777        END OF TABLE
          CODE   *

          OVERFLOW  OVLA     CHECK FOR OVERFLOW

          ENDX
