*DECK WLD 
          IDENT  WLD,INIT 
          CIPPU 
          MEMSEL 8
          CODE   DISPLAY
          BASE   D
*CALL,VERS
          COMMENT MAINTENANCE LANGUAGE DRIVER FOR MALET "VERS"
          SST 
*CALL,CPYCOM
          TITLE  16-BIT MAINTENANCE LANGUAGE DRIVER FOR MALET.
          TITLE  WLD PROGRAM DESCRIPTION
**        MAINTENANCE LANGUAGE DRIVER FOR 16-BIT CHANNEL INTERFACE. 
* 
*         D. J. JOHNSON    82/11/01 
*         ADAPTED FROM MLD, THE 12-BIT MAINTENANCE LANGUAGE DRIVER. 
* 
*         J. M. OJA        90/09/04 
*         MODIFIED TO HANDLE 8K PPS AND TRUE 16 BIT INSTRUCTIONS. 
* 
*         THE WLD PPU IS A SLAVE TO *MALET*, THE CDC CONCURRENT MAIN- 
*         TENANCE EXECUTIVE.
* 
*                             PPU STRUCTURE 
*              0 ---------------------------------------------- 
*                I    SCRATCH CELLS                           I 
*             17 I--------------------------------------------I 
*             20 I    PREDEFINED CELLS USED BY WLD            I 
*             54 I--------------------------------------------I 
*             55 I    SYSTEM CELLS                            I 
*             56 I--------------------------------------------I 
*             57 I    PRODUCT OVERLAY CELLS                   I 
*             67 I--------------------------------------------I 
*             70 I                                            I 
*                I    SYSTEM PPU RESIDENT ROUTINES            I 
*                I                                            I 
*           1077 I--------------------------------------------I 
*           1100 I                       I                    I 
*                I    INSTRUCTION STACK  I INITIALIZATION     I 
*                I                       I  OVERLAY           I 
*           2277 I--------------------------------------------I 
*           2300 I                                            I 
*                I    BASIC DRIVER                            I 
*                I                                            I 
*           4477 I--------------------------------------------I 
*           4500 I                                            I 
*                I    PRODUCT OVERLAY                         I 
*                I                                            I 
*           6477 I--------------------------------------------I 
*           6500 I                       I                    I 
*                I    INPUT BUFFER       I                    I 
*                I                       I                    I 
*           7177 I-----------------------I       PRODUCT      I 
*           7200 I                       I                    I 
*                I    OUTPUT BUFFER      I       OVERLAY      I 
*                I                       I                    I 
*           7677 I-----------------------I    INITIALIZATION  I 
*           7700 I                       I                    I 
*                I    STATUS BUFFER      I                    I 
*                I                       I                    I 
*           7777 ---------------------------------------------- 
* 
          TITLE  WLD CALLING SEQUENCE 
**        CALLING SEQUENCE- 
* 
*                AUTO-RECALL WILL BE USED BY THE CPU TO CALL WLD WITH A 
*                DUMMY FET. 
* 
*                       ----------------------------
*                       I                          I
*                RA+1   I XXXX XXY0 0000 0000 ZZZZ I
*                       ----------------------------
* 
*                       XXXXXX = WLD IN DISPLAY CODE. 
*                       Y = AUTO RECALL BIT.
*                       ZZZZ = DUMMY FET ADDRESS. 
* 
*                       ----------------------------
*                       I                          I
*                ZZZZ   I 0000 0000 AAAA 0000 BBBB I
*                       ----------------------------
* 
*                       AAAA = FWA  OF  THE COMMUNICATIONS BLOCK IN CM
*                              (POINTS TO SECURE).
*                       BBBB = 0002 (BIT 0 IS THE COMPLETE BIT).
* 
*                THE PPU WILL READ THE DUMMY FET WORD (ZZZZ) AND VERIFY 
*                THAT BYTE BBBB IS EQUAL TO 0002.   IF  NOT,  AN  ABORT 
*                SEQUENCE,  DESCRIBED  LATER,  IS ENTERED. THE PPU WILL 
*                SAVE AAAA AND WILL READ THE  FIRST  CM  WORD  AT  THAT 
*                ADDRESS (SECURE).
* 
*                       ----------------------------
*                       I                          I
*                SECURE I NNNN NNNN NNNN NNNN NNNN I
*                       ----------------------------
* 
*                       NN-NN = THE SECURITY WORD IN DISPLAY CODE.
* 
*                IF THE FORMAT OF THE SECURITY WORD IS NOT CORRECT, THE 
*                PPU ENTERS THE ABORT SEQUENCE. 
* 
*                THE  PPU  THEN  READS  THE  INPUT REGISTER IN THE COM- 
*                MUNICATIONS BLOCK AND VERIFIES THAT  BYTE  0  CONTAINS 
*                EITHER A START OR RESUME COMMAND (DESCRIBED LATER). IF 
*                NOT, THE ABORT SEQUENCE IS ENTERED.
* 
          TITLE  WLD COMMUNICATIONS 
**        COMMUNICATIONS- 
*                                                      NUMBER 
*                     *COMMUNICATION BLOCK*              OF 
*                                                       WORDS 
* 
*                -----------------------------------------------
*                I                                       I     I
*                I    SECURITY WORD                      I   1 I
*                I---------------------------------------------I
*                I                                       I     I
*                I    INPUT REGISTER                     I   1 I
*                I---------------------------------------------I
*                I                                       I     I
*                I    OUTPUT REGISTER                    I   1 I
*                I---------------------------------------------I
*                I                                       I     I
*                I    MESSAGE BUFFER                     I   5 I
*                I---------------------------------------------I
*                I                                       I     I
*                I    PPU DISPLAY BUFFER                 I 164 I
*                I---------------------------------------------I
*                I                                       I     I
*                I    PPU PLOT BUFFER                    I  40 I
*                I---------------------------------------------I
*                I                                       I     I
*                I    PPU CHECKPOINT BUFFER              I 975 I
*                I---------------------------------------------I
*                I                                       I     I
*                I    SCRATCH FILE WORKING BUFFER        I  70 I
*                I---------------------------------------------I
*                I                                       I     I
*                I    MODULE BUFFER                      I1453 I
*                I---------------------------------------------I
*                I                                       I     I
*                I    PRODUCT OVERLAY ERROR MESSAGE BFR. I 120 I
*                I---------------------------------------------I
*                I                                       I     I
*                I    STANDBY PPU COMMUNICATIONS         I   2 I
*                I---------------------------------------------I
*                I                                       I     I
*                I    DIAGNOSTIC SWITCHES                I   1 I
*                -----------------------------------------------
*                I                                       I     I
*                I    FLAG FOR TERMINAL INTERRUPT        I   1 I
*                -----------------------------------------------
*                I                                       I     I
*                I    8K PP CHECKPOINT BUFFER            I2368 I
*                -----------------------------------------------
*                I                                       I     I
*                I    IPI DATA BUFFER                    I2056 I
*                -----------------------------------------------
* 
          TITLE  WLD COMMUNICATION BLOCK BUFFER LENGTH EQUATES
* 
*         COMMUNICATION BLOCK BUFFER LENGTH EQUATES 
* 
  
 L.SEC    EQU    1
 L.IR     EQU    1
 L.OR     EQU    1
 L.MB     EQU    5
 L.DB     EQU    164
 L.PB     EQU    40 
 L.CB     EQU    975
 L.SFB    EQU    70 
 L.MOD    EQU    1453 
 L.POMB   EQU    120
 L.SBPIR  EQU    1
 L.SBPOR  EQU    1
 L.DS     EQU    1
 L.FTINT  EQU    1
 L.CB8K   EQU    2368 
 L.IPIBU  EQU    2056 
  
* 
*         COMMUNICATION BLOCK RELATIVE ADDRESS EQUATES
* 
  
 RA.SEC   EQU    0
 RA.IR    EQU    RA.SEC+L.SEC 
 RA.OR    EQU    RA.IR+L.IR 
 RA.MB    EQU    RA.OR+L.OR 
 RA.DB    EQU    RA.MB+L.MB 
 RA.PB    EQU    RA.DB+L.DB 
 RA.CB    EQU    RA.PB+L.PB 
 RA.SFB   EQU    RA.CB+L.CB 
 RA.MOD   EQU    RA.SFB+L.SFB 
 RA.POMB  EQU    RA.MOD+L.MOD 
 RA.SBPIR EQU    RA.POMB+L.POMB 
 RA.SBPOR EQU    RA.SBPIR+L.SBPIR 
 RA.DS    EQU    RA.SBPOR+L.SBPOR 
 RA.CB8K  EQU    RA.DS+L.DS+L.FTINT 
 RA.IPIBU EQU    RA.CB8K+L.CB8K 
  
          TITLE  WLD/MALET VERSION NUMBER EQUATE
* 
*         MALET VERSION NUMBER EQUATE 
* 
 VERS     EQU    2           VERSION NUMBER 
          SPACE  2
**        THE  VERS  EQUATE  ABOVE CHANGES THE VERSION NUMBER FOR ALL 
*         THE PRODUCT  OVERLAYS FOR WLD. THIS  MAKES THE  CHANGING OF 
*         THE VERSION NUMBER MUCH SIMPLER.  THE VERSION NUMBER SHOULD 
*         BE CHANGED WHENEVER A COMPILER/PRODUCT OVERLAY CHANGE COULD 
*         CAUSE A SYSTEM CRASH  OR  FALSE ERRORS IF THE BINARY IS NOT 
*         REASSEMBLED AT THE SAME TIME A NEW MALET AND PRODUCT  OVER- 
*         LAYS ARE INSTALLED. CHANGES MUST ALSO GO INTO DECK MALET ON 
*         CML AT THE TAG NAME VERSION AND DECK SBP ON REL2B AND  PL5A 
*         AT THE TAG NAME VERSION.
* 
* 
*                            -NOTE- 
* 
*         THE FOLLOWING  STATEMENT  SHOULD BE UPDATED EACH TIME THE 
*         VERSION NUMBER IS CHANGED TO REFLECT THE CML LEVEL AT THE 
*         TIME OF CHANGE. 
* 
*         VERSION NUMBER 2 IS EQUAL TO CML LEVEL 142. 
* 
* 
* 
********************************************************************* 
* 
*         DEFINES-
* 
*         THE DEFINES FOR ALL THE PRODUCT OVERLAYS  ARE PERMANENTLY 
*         INSTALLED ON THE  OLDPL.  THE  DEFINES CAN BE OBTAINED BY 
*         USING THE FOLLOWING UPDATE COMMAND AND PRINTING LFN.
* 
*         UPDATE,Q,O=LFN. 
* 
*         TO DELETE OR MODIFY THE DEFINES OBTAIN THE UPDATE OUTPUT. 
*         DELETE THE LINE  NUMBER  INDICATED  AND INSERT THE PROPER 
*         DEFINES  FOR  THE  PRODUCT  OVERLAYS  DESIRED.
* 
********************************************************************* 
* 
          TITLE  WLD ENTRY DESCRIPTION
**        ENTRY- WLD  IS CALLED BY THE CPU PROGRAM DURING A MAINTENANCE 
*                ACTION.   WLD  EXAMINES  THE  INPUT  REGISTER  IN  THE 
*                COMMUNICATION BLOCK. 
* 
*                THE INPUT REGISTER WILL CONTAIN THE FOLLOWING
* 
*                 ----------------------------
*                 I                          I
*                 I FFFF LLLL PPPP AAAA SSSS I
*                 ----------------------------
* 
*                WHERE F = 0001  FOR A START WLD REQUEST. 
*                          0002  FOR A RESUME WLD REQUEST.
* 
*                LLLL  =  0000   IF THE MODULE   BINARY  HAS  NOT  BEEN 
*                                 CHANGED SINCE THE LAST TIME  THE  PPU 
*                                 DRIVER WAS UP.
*                         0001   IF A SECONDARY MODULE HAS BEEN LOADED
*                         0002   IF A PRIMARY MODULE HAS BEEN LOADED
* 
*                PPPP  =  LINE NUMBER IF RETURNING TO A MODULE THAT 
*                         EXECUTED A *CALL* COMMAND 
* 
*                AAAA  =  STACK ADDRESS IF RETURNING TO A MODULE THAT 
*                         EXECUTED A *CALL* COMMAND.  ZERO OTHERWISE. 
* 
*                SSSS  =  SWITCHES FROM THE CPU.
* 
* 
 SEF      EQU    1           STOP-ON-ERROR FLAG 
 RMF      EQU    2           REPEAT-MODULE FLAG 
 RCF      EQU    4           REPEAT-CONDITION FLAG
 SL       EQU    10B         SCOPING LOOP FLAG
 DF       EQU    20B         DROP FLAG
 CF       EQU    40B         CHECKPOINT FLAG
 PLF      EQU    100B        PRINT LOG ACTIVE FLAG
 DFF      EQU    200B        DAYFILE LOG ACTIVE FLAG
 KLF      EQU    400B        SYSTEM K/L DISPLAY ACTIVE FLAG 
 SBF      EQU    1000B       STANDBY PPU OPTION ACTIVE FLAG 
 RTF      EQU    2000B       REPEAT TEST FLAG 
 TM       EQU    4000B       TERMINAL MODE FLAG 
  
          TITLE  WLD MESSAGE BUFFER FORMAT
**        MESSAGE BUFFER FORMAT ON *START* AND *RESUME* REQUESTS
* 
*                6        4          3  3       2     1 1  1
*                0        8          6  2       4     8 6  2          0 
*                ------------------------------------------------------ 
*              0 I   DC   I SH  CEVALI  CONNECT I I/O I   OVL NAME    I 
*                I        IFLAG   AL I   CODE   ICHAN I               I 
*                I--------+----------+--+-------+-----+-+-------------I 
*             +1 I        I             I               I             I 
*                I UNDEF  I     P0      I      P1       I     P2      I 
*                I--------+-------------+---------------+-------------I 
*             +2 I        I             I               I             I 
*                I UNDEF  I     P3      I      P4       I     P5      I 
*                I--------+-------------+---------------+-------------I 
*             +3 I        I             I               I             I 
*                I UNDEF  I     P6      I      P7       I     P8      I 
*                I--------+-------------+-------+-------+--+----------I 
*             +4 I        I             I       I          I          I 
*                I UNDEF  I     P9      I  PORT I    SN    I   SN+1   I 
*                ------------------------------------------------------ 
* 
  
**        MODULE HEADER FORMAT ON *START* AND *RESUME* REQUESTS 
* 
*                6         4         3          2          1
*                0         8         6          4          2          0 
*                -----------------------------------------------------I 
*                I                              I          I  DEVICE  I 
*            0   I    MODULE  NAME              I RESERVED I   TYPE   I 
*                I------------------------------+----------+----------I 
*                I         I         I          I          I          I 
*           +1   I  DC 0   I   DC 1  I  DC 2    I  DC 3    I  DC 4    I 
*                I---------+---------+----------+----------+----------I 
*                I         I         I          I          I          I 
*           +2   I  DC 5   I   DC 6  I  DC 7    I  DC 8    I  DC 9    I 
*                I---------+---------+----------+----------+----------I 
*                IL        I         I          I          I          I 
*                IO        I  FORMAT I SOURCE   I SOURCE   I MODULE   I 
*           +3   IC VERSIONI  BLOCK  I BLOCK    I BLOCK    I LENGTH   I 
*                IK        I  LENGTH I LENGTH   I FWA      I          I 
*                I---------+---------+----------+----------+----------I 
*                I  CODE   I  CODE   I DATA     I DATA     I OBFWA    I 
*           +4   I  BLOCK  I  BLOCK  I BLOCK    I BLOCK    I FOR      I 
*                I  LENGTH I  FWA    I LENGTH   I FWA      I DATA     I 
*                I---------+---------+----------+--------+1+----------I 
*                I  ENTRY  I ENTRY   I          I        I6I          I 
*           +5   I  LINE   I PPU     I RESERVED I  RSVD  IBI RESERVED I 
*                I  NUMBER I ADDRESS I          I        III          I 
*                I----------------------------------------T-----------I 
*           +6   I                                                    I 
*                I                     RESERVED                       I 
*                ------------------------------------------------------ 
* 
          TITLE  WLD PPU DISPLAY BUFFER ENTRY FORMAT
**        PPU DISPLAY BUFFER ENTRY FORMAT 
* 
*                6        4             3              1
*                0        8             2              6              0 
*                ------------------------------------------------------ 
*              0 I        I   MESSAGE   I   MESSAGE    I ITEM   LINE  I 
*                I UNDEF  I   NUMBER    I    INDEX     I COUNT NUMBER I 
*                I--------+-------------+--------------+--------------I 
*             +1 I        I    DATA     I     DATA     I     DATA     I 
*                I UNDEF  I   ITEM 0    I    ITEM 1    I    ITEM 2    I 
*                I--------+-------------+--------------+--------------I 
*             +2 I        I    DATA     I     DATA     I     DATA     I 
*                I UNDEF  I   ITEM 3    I    ITEM 4    I    ITEM 5    I 
*                I--------+-------------+--------------+--------------I 
*             +3 I        I    DATA     I     DATA     I   MESSAGE    I 
*                I UNDEF  I   ITEM 6    I    ITEM 7    I    NUMBER    I 
*                ------------------------------------------------------ 
* 
          TITLE  WLD START REQUEST
**        START REQUEST-
* 
*                THE PPU INITIALIZATION OVERLAY WILL LOAD THE PARAMETER 
*                REGISTERS FROM THE MESSAGE BUFFER AND SET DIRECT CELLS 
*                ALSO, THE INSTRUCTION STACK WILL  BE  LOADED,
*                AND  THE  PARTICULAR PRODUCT OVERLAY THAT IS REQUESTED 
*                WILL BE LOADED.  ALL INSTRUCTION  MODIFICATION 
*                IS PERFORMED, AND THE OUTPUT BUFFER IS PRESET WITH ITS 
*                DATA BUFFER IF REQUIRED. 
* 
*                THE PPU DRIVER WILL THEN SAVE THE  SWITCHES  FROM  THE 
*                INPUT  REGISTER,  AND  ZERO OUT BYTE 0 TO TELL THE CPU 
*                EXEC THAT THE START REQUEST WAS ACCEPTED.  IT SETS THE 
*                BBBB  BYTE  TO 0003 (SETS BIT 0) IN THE DUMMY FET, AND 
*                REQUESTS THE CPU FROM THE OPERATING SYSTEM IF  REQUIR- 
*                ED.
* 
*                EXECUTION  THEN  BEGINS  FROM THE ADDRESS IN THE STACK 
*                SPECIFIED BY THE P REGISTER IN THE DIRECT CELLS. 
* 
* 
*         RESUME REQUEST- 
* 
*                THE RESUME REQUEST INITIALIZES AND LOADS IN A  SIMILAR 
*                FASHION  TO THE START REQUEST.  HOWEVER, THE OPERATING 
*                REGISTERS (DIRECT CELLS), DRIVER, AND PRODUCT  OVERLAY 
*                ARE LOADED FROM THE CHECKPOINT AREAS IN THE COMMUNICA- 
*                TION TABLE.
* 
*CALL,ASSYTAG 
          TITLE  WLD DRIVER DEFINITIONS 
**        SYSTEM EQUATES. 
  
          IFEQ   NOS,1
 D.Z0     EQU    0           SCRATCH CELLS
 D.Z1     EQU    1
 D.Z2     EQU    2
 D.Z3     EQU    3
 D.Z4     EQU    4
 D.Z5     EQU    5
 D.Z6     EQU    6
 D.Z7     EQU    7
 D.T0     EQU    10B
 D.T1     EQU    11B
 D.T2     EQU    12B
 D.T3     EQU    13B
 D.T4     EQU    14B
 D.T5     EQU    15B
 D.T6     EQU    16B
 D.T7     EQU    17B
  
 D.PPIRB  EQU    IR          PP INPUT READ BUFFER 
 D.RA     EQU    RA          CONTROL POINT REFERENCE ADDRESS/100B 
 D.FL     EQU    FL          CONTROL POINT FIELD LENGTH/100B
 D.PPONE  EQU    ON          CONSTANT 1 
 D.CPAD   EQU    CP          CONTROL POINT ADDRESS
 D.PPIR   EQU    IA          PP INPUT REGISTER ADDRESS
 D.PPOR   EQU    OA          PP OUTPUT REGISTER ADDRESS 
 D.PPMSG  EQU    MA          PP MESSAGE BUFFER ADDRESS
  
 P.ZERO   EQU    ZERL        CENTRAL MEMORY ZERO WORD ADDRESS 
  
 C.PPFWA  EQU    PPFW        PP MODULE LOAD FIRST WORD ADDRESS
 D.SCTS   EQU    2           SET DIS FLAG FUNCTION
 D.CCTS   EQU    3           CLEAR DIS FLAG FUNCTION
 M.DPP    EQU    DPPM        DROP PP FUNCTION 
 M.ABORT  EQU    ABTM        ABORT CONTROL POINT FUNCTION 
 L.CPNUM  EQU    37B         CONTROL POINT NUMBER MASK
  
*         PP RESIDENT DEFINITIONS 
  
          XTEXT  COMPMAC
 R.IDLE   EQU    PPR         IDLE PP ENTRY POINT
 R.DFM    EQU    DFM         SEND DAYFILE MESSAGE ENTRY POINT 
 R.OVL    EQU    EXR         LOAD OVERLAY ENTRY POINT 
 R.MTR    EQU    FTN         SEND MONITOR FUNCTION ENTRY POINT
          ENDIF 
          SPACE  4
          IFEQ   NOSBE,1
 D.PPMSG  EQU    PPMES1      PP MESSAGE BUFFER ADDRESS
          ENDIF 
  
          TITLE  OPERATING REGISTERS
*         OPERATING REGISTERS.
  
 B0       EQU    20B         MALET ARITHMETIC REGISTERS 
 B1       EQU    21B
 B2       EQU    22B
 B3       EQU    23B
 B4       EQU    24B
 B5       EQU    25B
 B6       EQU    26B
 B7       EQU    27B
 WC       EQU    30B
 BA       EQU    31B
 B8       EQU    32B
 B9       EQU    33B
 B10      EQU    34B
 B11      EQU    35B
 B12      EQU    36B
 B13      EQU    37B
 B14      EQU    40B
 B15      EQU    41B
 XREG     EQU    42B         SCRATCH REGISTER (USED BY COMPILER CODE) 
 YREG     EQU    43B         SCRATCH REGISTER (USED BY COMPILER CODE) 
 WT       EQU    44B         WORDS TRANSMITTED (LAST I/O FUNCTION)
 LF       EQU    45B         LAST FUNCTION ISSUED 
 P        EQU    46B         PROGRAM ADDRESS
 EC       EQU    47B         ERROR CODE 
 EA       EQU    50B         ERROR MESSAGE ADDRESS
 EM       EQU    51B         ERROR MESSAGE INDEX
 DC       EQU    52B         DEVICE CODE
 AL       EQU    53B         ACCESS LEVEL 
 RT       EQU    54B         REAL TIME CLOCK COUNTER
*   D.RA  EQU    55B
*   D.FL  EQU    56B
 ES       EQU    57B         EXECUTIVE SWITCHES 
  
          TITLE  FUNCTIONS AND SUBFUNCTIONS 
*         PPU FUNCTION CODES TO EXECUTIVE 
  
 F.ABT    EQU    1           ABORT MODULE EXECUTION 
 F.BLANK  EQU    2           BLANK DISPLAY
 F.DROP   EQU    3           DROP PP
 F.END    EQU    4           STOP MODULE EXECUTION
 F.ERR    EQU    5           SEND ERROR MESSAGE 
 F.HALT   EQU    6           HALT MODULE EXECUTION
 F.LOAD   EQU    7           LOAD A MODULE
 F.PIC    EQU    10B         SEND PICTURE OF DISPLAY TO OUTPUT
 F.SYS    EQU    11B         SEND SYSTEM SUBFUNCTION
 F.TERM   EQU    12B         TERMINATE MODULE EXECUTION 
 F.MSG    EQU    13B         SEND MESSAGE TO DAYFILE/OUTPUT 
 F.ROLL   EQU    14B         ROLLOUT CONTROL POINT
  
*         SYSTEM SUBFUNCTIONS 
  
 F.READ   EQU    2           READ SCRATCH FILE BUFFER 
 F.REW    EQU    3           REWIND SCRATCH FILE BUFFER 
 F.WRITE  EQU    4           WRITE SCRATCH FILE BUFFER
  
*         CPU EXECUTIVE FUNCTION CODES TO PPU 
  
 F.START  EQU    1           START MODULE EXECUTION 
 F.RESUME EQU    2           RESUME MODULE EXECUTION
  
*         RANDOM NUMBER GENERATOR SEED VALUES 
  
 RANDOM1  EQU    107325B
 RANDOM2  EQU    053643B
          EJECT 
  
*         MALET MACRO DEFINITION COMMON DECKS 
  
*CALL COMPCHN 
*CALL COMPMSG 
*CALL COMPOVR 
          TITLE  WLD INITIALIZATION ROUTINES
          EJECT 
* 
          ORG    C.PPFWA
 STACK    EQU    1100B
 LSTACK   EQU    1200B
  
**     STEP 01 - SET CONTROL POINT ADDRESS AND D.PPONE. 
* 
 INIT     LDD    D.PPIR      READ SYSTEM IR 
          CRD    D.PPIRB
          LDD    D.PPIRB+1   ISOLATE CONTROL POINT NUMBER 
          LPN    L.CPNUM
          SHN    7           FORM CONTROL POINT ADDRESS 
          STD    D.CPAD 
          LDN    1
          STD    D.PPONE
  
**      STEP 02 - ABORT IF WLD WAS ASSEMBLED TO EXECUTE ON A LEVEL 4 OR 
*         LEVEL 5 OPERATING SYSTEM, OTHERWISE, SET D.RA AND D.FL AND
*         PROCEED IF NO ERROR FLAGS ARE SET.
* 
          IFEQ   NOS+NOS4+NOS5+NOSBE+NOSBE4+NOSBE5,2
          LDC    CALLERR     CALL ERROR MESSAGE 
          LJM    ABORT
          ENDIF 
  
          RJM    RACM        REQUEST ACCESS TO CENTRAL MEMORY 
          LDD    D.T0+1      TEST ERROR FLAGS 
          ZJN    INIT3       IF ERROR FLAGS NOT SET 
          LJM    DROPIDL     DROP PPU, ERROR FLAGS SET
  
**     STEP 03 - READ THE DUMMY FET POINTED TO BY BYTE 4 OF THE INPUT 
*                REGISTER AND ABORT IF THE MALET EXECUTIVE DID NOT MAKE 
*                THE WLD CALL (BYTE 4 NOT EQUAL TO 0002). 
* 
 INIT3    RJM    CUA
          LDD    D.T0 
          ZJN    INIT3A      IF USER ACCESS OK
          LDC    IUERR
          UJN    INIT3B      ABORT WITH MESSAGE ILLEGAL USER ACCESS 
  
 INIT3A   LDD    D.PPIRB+4
          STM    FET         SAVE DUMMY FET ADDRESS 
          RJM    ITFL        FIND OUT IF IN RANGE 
          CRD    D.T0        READ THE FET 
          LDD    D.T0+4      CHECK FOR BYTE 4 = 0002
          SBN    2
          ZJN    INIT4       IF MALET EXECUTIVE CALL
          LDC    PCERR       INITIALIZATION ERROR EXIT
 INIT3B   LJM    ABORT
  
**     STEP 04 - USE BYTE 2 OF THE FET TO  GENERATE  ALL  COMMUNICATION 
*                ADDRESSES  BETWEEN THE DRIVER AND THE EXECUTIVE. ABORT 
*                IF ANY ADDRESS IS NOT IN FL OR IF THE SECURITY WORD
*                AND VERSION NUMBER FROM THE EXECUTIVE DO NOT MATCH THE 
*                PPU DRIVER.
* 
 INIT4    LDC    CBADRS      COMMUNICATION BLOCK POINTER TABLE ADDRESS
          STD    D.Z1 
          LDI    D.Z1 
 INIT4A   STDL   D.Z2 
          LDD    D.T0+2      COMMUNICATION BLOCK RELATIVE ADDRESS 
          RAIL   D.Z2        COMMUNICATION BLOCK POINTER
          AOD    D.Z1 
          LDIL   D.Z1 
          NJN    INIT4A      IF MORE POINTERS TO ADJUST 
  
          LDC    RA.SEC 
 P.SECURE EQU    *-1
          RJM    ITFL        VERIFY AND FORM REAL MEMORY ADDRESS
          CRD    D.T0 
          LDN    D.T0        NOW TEST FOR A SECURITY WORD MATCH 
          STD    D.T5 
 INIT4B   LDM    SECURE-D.T0,D.T5 
          LMI    D.T5        COMPARE WORDS
          ZJN    INIT4C      IF GOOD COMPARE
          LDC    SERR        IF SECURITY ERROR
          LJM    ABORT
  
 INIT4C   AOD    D.T5 
          SBN    D.T0+5 
          NJN    INIT4B      IF NOT FINISHED
  
**     STEP 05 - ADJUST DELAY ROUTINES TO ACCOMODATE PP CYCLE TIMES.
*                SAVE THE DEVICE CODE, SHARE FLAG, ACCESS LEVEL,
*                CONNECT CODE, I/O CHANNEL, AND OVERLAY NAME FROM WORD
*                0 OF THE MESSAGE BUFFER.  IF THE DEVICE CODE IS ZERO,
*                NO DEVICE OR CHANNEL HAS BEEN ASSIGNED,  SO THE
*                INITIALIZATION PROCESS IS ABORTED. 
* 
 INIT5    IANN   14B
          STD    D.T0 
          IANN   14B
          SBD    D.T0 
          MJN    INIT5       IF REAL TIME CLOCK WRAPPED AROUND
          SBN    2
          PJN    INIT5A      IF 2X SPEED
          SOM    SPEED       RESET PP SPEED FLAG 2=2X, 1=4X 
          SOM    DLY1        MODIFY TIME DELAY ROUTINE
          SOM    DLY5        MODIFY TIME DELAY ROUTINE
  
 INIT5A   LDM    P.MB        POINTER TO MESSAGE BUFFER
          RJM    ITFL        VERIFY AND FORM REAL MEMORY ADDRESS
          CRD    D.T0 
          LDD    D.T0 
          NJN    INIT5B      IF DEVICE/CHANNEL ASSIGNED 
          LDC    INERR       INITIALIZATION ERROR MESSAGE ADDRESS 
          LJM    ABORT
  
 INIT5B   STD    DC          SET DEVICE CODE
          LDD    D.T1 
          SHN    -6 
          LPN    3
          STM    SHARE       SAVE SHARE FLAG
          NJN    INIT5C      IF NOT SHARE 
          LDC    1401B       CODE FOR LDN 1 
          STM    RCH5        MODIFY REQUEST CHANNEL TO RELEASE CHANNEL
 INIT5C   LDD    D.T1 
          LPN    77B
          STD    AL          SAVE THE CEVAL ACCESS LEVEL
          LDD    D.T2 
          STM    CCODE       SAVE THE CONNECT CODE
          LDD    D.T3 
          SHN    -6 
          STM    CHAN        SAVE I/O CHANNEL 
          STD    D.Z1 
  
**     STEP 06 - GENERATE INSTRUCTIONS FOR THE  RCHAN  SUBROUTINE  THAT 
*                DETERMINES  IF  OUR  ASSIGNED I/O CHANNEL IS NEEDED BY 
*                THE SYSTEM.
* 
          IFEQ   NOSBE,1
          LDN    P.CHRQ 
          STM    RCH2        SET ADDRESS TO READ
          LDN    D.Z4-D.Z1
          RAM    RCH3        SET BYTE TO LOAD 
          LDD    D.Z1 
          SBN    14B
          MJN    INIT6       IF CHANNEL 0 - 13B 
          AOM    RCH3        SET NEW BYTE TO LOAD 
 INIT6    LDD    D.Z1        GET CHANNEL
          LPN    17B         MAKE IT IN RANGE OF 0 TO 13B 
          RAM    RCH4        SET SHIFT FOR OUR CHANNEL REQUEST FLAG 
          ENDIF 
  
          IFEQ   NOS,1
          LDC    CHTP        GET ADDRESS OF CHANNEL TABLE 
          CRD    D.T0 
          LDD    D.T2 
          LPN    77B         MASK LDC INSTRUCTION INCREMENT 
          RAM    RCH1 
          LDD    D.T3 
          STM    RCH2        STORE ADDRESS TO READ
 INIT6    LDD    D.Z1        GET CHANNEL
          SBN    5
          MJN    INIT6A      IF WORD FOUND
          STD    D.Z1 
          AOM    RCH2        BUMP ADDRESS TO READ 
          UJN    INIT6
  
 INIT6A   ADN    5
          STD    D.Z1 
 INIT6B   SOD    D.Z1 
          MJN    INIT7       IF BYTE FOUND
          AOM    RCH3        BUMP BYTE TO LOAD
          UJN    INIT6B 
          ENDIF 
  
**     STEP 08 - READ THE EXECUTIVE INPUT REGISTER AND SAVE BYTE 4 AS 
*                THE EXECUTIVE SWITCHES.  SAVE BYTE 2 AS THE LOAD  FLAG 
*                THAT INDICATES A NEW MODULE HAS BEEN LOADED.  IF BYTE
*                0 INDICATES A START REQUEST READ THE PARAMETER WORDS.
*                IF BYTE 0 IS NOT A *START* OR *RESUME* REQUEST, ABORT. 
* 
 INIT7    LDM    P.IR        POINTER TO INPUT REGISTER
          RJM    ITFL        VERIFY AND FORM REAL MEMORY ADDRESS
          CRD    D.T0 
          LDD    D.T4 
          STD    ES          SAVE EXECUTIVE SWITCHES FOR MODULES
          LDD    D.T1 
          STM    LOAD        SAVE MODULE BINARY CHANGED FLAG
          LDD    D.T0 
          SBN    F.START     TEST FOR START OR RESUME FUNCTION
          NJN    INIT8       IF NOT START FUNCTION
          LDN    4
          STM    LOAD        SET PRIMARY MODULE LOADED FLAG 
          STD    D.Z2        SET WORD COUNT FOR READ
          LDC    P0 
          STD    D.Z1        SET PP FWA FOR READ OF PARAMETER WORDS 
          LDM    P.MB        POINTER TO MESSAGE BUFFER
          ADN    1           FORM CM ADDRESS OF PARAMETER WORDS 
          RJM    RPD         LOAD PARAMETER REGISTERS P0-P9 
          LJM    INIT10      GO LOAD PRODUCT OVERLAY
  
 INIT8    SBN    F.RESUME-F.START 
          ZJN    INIT9       IF RESUME REQUEST
          LDC    IRERR
          LJM    ABORT       ABORT IF ILLEGAL REQUEST FROM EXECUTIVE
          SPACE  2
*                            *** NOTE *** 
* 
*         CODE PRIOR TO THIS POINT CAN BE ASSEMBLED INTO THE PRODUCT
*         OVERLAY AREA FOR EXECUTION IF CHANGES TO THE INITIALIZATION 
*         PORTION OF WLD OVERFLOW THE INSTRUCTION STACK AREA. 
          SPACE  2
**     STEP 09 - IF A RESUME REQUEST, READ THE CHECKPOINTED DRIVER AND
*                PRODUCT OVERLAY FROM CENTRAL MEMORY, SET THE RESUME
*                FLAG, AND GO TO STEP 11 TO CONTINUE PROCESSING.
* 
 INIT9    RJM    RACM        PAUSE AND REQUEST ACCESS TO CM 
          LDN    B0-2        FWA OF OPERATING REGISTERS + (D.T6 + D.T7) 
          STD    D.Z1 
          LDN    16B         NUMBER OF CM WORDS TO TRANSFER 
          STD    D.Z2 
          LDM    P.CB8K      ADDRESS OF CM CHECKPOINT BUFFER
          RJM    RPD         READ OPERATING REGISTERS FROM CKP BUFFER 
          RJM    RACM        REQUEST ACCESS TO CENTRAL MEMORY 
          LDC    DRIVER      FWA OF DRIVER + PRODUCT OVERLAY
          STD    D.Z1 
          LDC    LPPU/3      NUMBER OF CM WORDS TO TRANSFER 
          STD    D.Z2 
          LDM    P.CB8K      ADDRESS OF CM CHECKPOINT BUFFER
          ADN    16B         SKIP OVER OPERATING REG AREA 
          RJM    RPD         READ DRIVER + PROD OVERLAY FROM CKP BUFFER 
  
          RJM    RACM        REQUEST ACCESS TO CENTRAL MEMORY 
          LDM    P.IR        POINTER TO INPUT REGISTER
          RJM    ITFL        VERIFY AND FORM REAL MEMORY ADDRESS
          CRD    D.T1        RE-READ IR 
          LDD    D.T4 
          ZJN    INIT9A      IF NOT RETURNING TO A CALL ENTRY POINT 
          LDN    0
          STM    RESUME      FAKE A START REQUEST FROM HERE ON OUT
          LDM    P.PDS       POINTER TO SUBROUTINE TABLE
          RJM    ITFL        VERIFY AND FORM REAL MEMORY ADDRESS
          CRM    PDS,D.PPONE  READ PUSH-DOWN STACK
          LJM    INIT13B     GO STORE JUMP ADDRESSES
  
 INIT9A   LDN    77B
          STM    RESUME      SET RESUME FLAG FOR USE IN RESTART PROCESS 
  
**     STEP 10 - IF THE PRODUCT OVERLAY THAT IS CURRENTLY LOADED IS NOT 
*                THE OVERLAY INDICATED AS BEING REQUIRED  TO  RUN  THIS 
*                MODULE, LOAD AND INITIALIZE THE REQUIRED OVERLAY.  SET 
*                VALUES FOR THE INPUT BUFFER FWA, OUTPUT BUFFER FWA,
*                AND CM WORD COUNT FOR THE LENGTH OF THESE BUFFERS. 
* 
 INIT10   LDM    P.MOD       POINTER TO MODULE BUFFER 
          RJM    ITFL        VERIFY AND FORM REAL MEMORY ADDRESS
          CRD    D.T0 
          LDM    TYPE 
          SBD    D.T4 
          NJN    INIT10A     IF NEW OVERLAY NEEDED
          LJM    INIT11 
  
 INIT10A  LDD    D.T4 
          STM    TYPE 
          LDM    P.MB        POINTER TO MESSAGE BUFFER
          RJM    ITFL        VERIFY AND FORM REAL MEMORY ADDRESS
          CRD    D.T0 
          ADN    4
          CRM    SN,D.PPONE  READ SERIAL NUMBER FOR DISK
          LDD    D.T3 
          LPN    77B
          SHN    12 
          ADD    D.T4        FORM OVERLAY NAME
  
          IFEQ   NOSBE,1
          SHN    12 
          STD    D.T6 
          SHN    -6 
          SCN    77B
          STD    D.T7 
          LDC    POVLA-5     ADDRESS OF PRODUCT OVERLAY 
          ENDIF 
  
          RJM    R.OVL       LOAD OVERLAY 
  
          IFEQ   NOSBE,1,1
          RJM    POVL        INITIALIZE PRODUCT OVERLAY 
  
          STM    INIT14B     SET/CLEAR ERROR FLAG 
          ZJN    INIT10B     IF NO OVERLAY INITIALIZATION ERRORS
          RJM    R.DFM       ISSUE REQUESTED DAYFILE MESSAGE
          LDN    F.TERM 
          STD    D.T0 
          LDM    P.OR        POINTER TO OUTPUT REGISTER 
          RJM    ITFL        VERIFY AND FORM REAL MEMORY ADDRESS
          CWD    D.T0        SEND TERM FUNCTION TO THE EXECUTIVE
          LJM    INIT14      RECALL CPU AND DROP PPU
  
 INIT10B  LDML   OBFWA
          STML   SYS1        SET OB FWA FOR SYS COMMANDS
          LDML   IBFWA
          STML   SYS9        SET IB FWA FOR SYS COMMANDS
  
**     STEP 11 - IF  A  NEW OVERLAY HAS BEEN LOADED OR IF A NEW PRIMARY 
*                MODULE HAS BEEN LOADED, ZERO REGISTERS B0 - B15, WT, 
*                LF, P, EC, EA, EM, AND ZERO DATA BUFFERS (OB,IB) IF A
*                SECONDARY MODULE HAS  BEEN  LOADED,  GO  TO  STEP  12. 
*                OTHERWISE, GO TO STEP 14.
* 
 INIT11   LDM    P.MOD       POINTER TO MODULE BUFFER 
          RJM    ITFL        VERIFY AND FORM REAL MEMORY ADDRESS
          CRD    D.Z1        READ MODULE NAME 
          ADN    4
          CRD    D.T0        READ DATA HEADER WORD
          LDC    ** 
 LOAD     EQU    *-1         NEW BINARY MODULE LOADED FLAG FROM EXEC
          NJN    INIT11A     IF NEW MODULE HAS BEEN LOADED
          LJM    INIT14      IF A NEW MODULE HAS NOT BEEN LOADED
  
 INIT11A  LDM    LOAD 
          SBN    1
          ZJN    INIT12      IF A SECONDARY MODULE HAS BEEN LOADED
          LDD    D.Z3 
          LPN    77B
          NJN    INIT12      IF NOT A PRIMARY MODULE
          LDN    P.ZERO 
          CRD    B0          CLEAR B0 THRU B4 
          CRD    B5          CLEARS B5,B6,B7,WC,BA
          CRD    B8          CLEARS B8,B9,B10,B11,B12 
          CRD    B13         CLEARS B13,B14,B15,XREG,YREG 
          CRD    LF          CLEARS,LF,P,EC,EA,EM 
          LDML   IBFWA
          STDL   D.Z1        SET BUFFERS FWA
          ADML   IBWL        LENGTH OF IB 
          ADML   OBWL        LENGTH OF OB 
          STDL   D.Z2        SET BUFFERS LWA
 INIT11B  LDN    0
          STIL   D.Z1 
          AODL   D.Z1 
          SBDL   D.Z2 
          NJN    INIT11B     IF ALL WORDS NOT CLEARED 
  
**     STEP 12 - LOAD COMPILED DATA FROM THE MODULE BUFFER AS SPECIFIED 
*                BY WORD 4 OF THE MODULE BUFFER.
* 
 INIT12   LDD    D.T2        CHECK WORD COUNT OF DATA 
          ZJN    INIT13      IF NO DATA TO LOAD 
          STD    D.Z2        SET WORD COUNT FOR PACKED READ 
          SHN    1
          ADD    D.T2        MULTIPLY BY 3 TO GET BYTE COUNT
          STD    D.T5        SAVE BYTE COUNT
          LDD    D.T4        OUTPUT BUFFER RELATIVE READ ADDRESS
          ADML   OBFWA
          STDL   D.Z1        SET PP ADDRESS FOR PACKED READ 
          LDM    OBWL        OUTPUT BUFFER WORD LENGTH
          SBD    D.T4        TRANSFER FWA 
          SBD    D.T5        BYTES TO BE TRANSFERRED
          PJN    INIT12A     IF ADDRESS IS IN RANGE 
          LJM    INIT13C     ABORT IF BUFFER INDEX ERROR
  
 INIT12A  LDD    D.T3 
          ADM    P.MOD       FORM CM FWA FOR DATA TRANSFER
          RJM    RPD         READ COMPILED 16-BIT DATA TO OUTPUT BUFFER 
  
**     STEP 13 - ABORT IF THE VERSION NUMBER OF THE MODULE  IN  WORD  3 
*                BYTE 0  DOES  NOT  AGREE  WITH  THE VERSION OF THE PPU 
*                DRIVER AND PRODUCT OVERLAY.  SET THE STARTING LINE AND 
*                STACK ADDRESS  FROM  WORD  5  OF THE MODULE BUFFER AND 
*                ABORT IF THEY ARE OUT OF LEGAL RANGE.
* 
 INIT13   LDM    P.MOD       POINTER TO MODULE BUFFER 
          ADN    3           SET POINTER TO COMPILER VERSION WORD 
          RJM    ITFL        VERIFY AND FORM REAL MEMORY ADDRESS
          CRD    D.Z6        READ VERSION NUMBER OF MODULE COMPILER 
          ADN    2
          CRD    D.T3        READ LINE/ADDRESS DATA 
          LDD    D.Z6 
          LPC    3777B       MASK OFF LOCK BIT
          STD    D.Z6 
          SBM    VERSION
          NJN    INIT13A     IF NOT MODULE/DRIVER VERSION MATCH 
          LDD    D.Z6 
          SBM    VER
          ZJN    INIT13B     IF MODULE/PRODUCT OVERLAY VERSION MATCH
 INIT13A  LDC    SERR 
          LJM    ABORT       IF NO MATCH
  
 INIT13B  LDD    D.T3 
          STD    P           SET LINE NUMBER
          ADC    -120 
          PJN    INIT13C     IF NOT WITHIN RANGE
          LDD    D.T4        GET STARTING ADDRESS WITHIN THE STACK
          STM    FADDR       SAVE FIRST ADDRESS IN STACK
          ADC    -STACK 
          MJN    INIT13C     IF BELOW MINIMUM ADDRESS 
          ADC    -LSTACK
          MJN    INIT14      IF NOT ABOVE MAXIMUM ADDRESS 
 INIT13C  LDC    MPERR
          LJM    ABORT       ABORT IF PARAMETER ERROR IN MODULE BUFFER
  
**     STEP 14 - SET COMPLETE BIT AND RECALL THE CPU EXECUTIVE. GO LOAD 
*                THE INSTRUCTION STACK OVER THIS CODE.
* 
 INIT14   LDM    FET
          RJM    ITFL        VERIFY AND FORM REAL MEMORY ADDRESS
          CRD    D.T0        READ DUMMY FET 
          LDN    3
          STD    D.T4 
          LDM    FET
          RJM    ITFL        VERIFY AND FORM REAL MEMORY ADDRESS
          CWD    D.T0        SEND COMPLETE BIT TO EXECUTIVE 
  
          IFEQ   NOS,1
          RJM    RACM        REQUEST ACCESS TO CENTRAL MEMORY 
          LDD    D.T2 
          SHN    17 
          MJN    INIT14A     IF ROLLOUT SET DO NOT RECALL CPU 
          LDD    D.T0 
          SHN    -9 
          SBN    6
          NJN    INIT14A     IF CONTROL POINT NOT IN I STATUS 
          LDN    RCPM 
          RJM    R.MTR       RECALL CPU 
          ENDIF 
  
 INIT14A  LDC    **          *** P.O. INITIALIZATION ERROR FLAG 
 INIT14B  EQU    *-1
          ZJN    INIT14C     IF NO INITIALIZATION ERRORS
          LJM    DROPIDL     DROP PPU 
  
 INIT14C  LDC    RA.MOD 
 P.MOD    EQU    *-1         POINTER TO MODULE BUFFER STORED HERE 
          ADN    4
          RJM    ITFL        VERIFY AND FORM REAL MEMORY ADDRESS
          CRD    D.Z2 
          LDC    STACK       INSTRUCTION STACK FWA
          STD    D.Z1 
          LDD    D.Z2+1 
          ADM    P.MOD       POINTER TO MODULE BUFFER 
          LJM    REQ2B       GO LOAD INSTRUCTION STACK OVER THIS CODE 
  
          TITLE  ABORT THE CONTROL POINT AND IDLE THE PP
**         ABORT - ABORT THE CONTROL POINT AND IDLE THE PP
* 
*                ISSUE ERROR MESSAGE TO THE DAYFILE, ABORT THE
*                CONTROL POINT AND IDLE THE PP. 
* 
*         ENTRY- (A) = ADDRESS OF ERROR MESSAGE 
* 
*         EXIT - CONTROL TRANSFERRED TO R.IDLE IN PP RESIDENT 
* 
*         USES - NONE 
* 
*         CALLS- R.DFM
* 
 ABORT    RJM    R.DFM       REPORT DAYFILE MESSAGE TO USER 
          LJM    ABRTIDL     ABORT THE CONTROL POINT AND IDLE THE PP
  
          TITLE  ITFL VERIFY AND FORM REAL MEMORY ADDRESS 
**        ITFL - VERIFY AND FORM REAL MEMORY ADDRESS
* 
*                TEST ADDRESS IN THE A REGSITER FOR BEING WITHIN
*                FIELD LENGTH.
* 
*         ENTRY- (A) = RELATIVE ADDRESS IN CENTRAL MEMORY 
* 
*         EXIT - (A) = (A) + (D.RA) * 100B, IF IN RANGE 
*                ABORT IF ADDRESS NOT IN RANGE
* 
*         USES - D.Z0 
* 
*         CALLS- NONE 
* 
 ITFL1    LDD    D.RA 
          SHN    6
          ADD    D.Z0        FORM REAL MEMORY ADDRESS 
  
 ITFLX    LJM    ** 
 ITFL     EQU    *-1
  
          STD    D.Z0 
          SHN    -6 
          SBD    D.FL 
          MJN    ITFL1       IF IN RANGE OF FL
          LDC    FLERR       ERROR MESSAGE TO POST
          LJM    ABORT
  
 SECURE   DATA   8HMALET     SECURITY TEST MATCHES SECURE AND VERSION 
 VERSION  CON    VERS        VERSION NUMBER 
 SN       BSSZ   5           BUFFER FOR DISK PACK SERIAL NUMBER 
 FET      DATA   0
  
 FLERR    DIS    ,*WLD FL ERR*
 PCERR    DIS    ,*WLD PARAM CALL ERR*
 SERR     DIS    ,*WLD VERS ERR*
 IRERR    DIS    ,*WLD ILLEG CPU REQ* 
 MPERR    DIS    ,*WLD MOD HEAD ERR*
 IUERR    DIS    ,*WLD ILLEG USER ACC*
 INERR    DIS    ,*WLD IOU INIT ERR*
  
          IFEQ   NOS+NOS4+NOS5+NOSBE+NOSBE4+NOSBE5,2
 CALLERR  DIS    ,*WLD CALL ERROR*
          ENDIF 
  
          TITLE  TABLE OF CM COMM BLOCK POINTERS
**        TABLE OF CENTRAL MEMORY COMMUNICATION BLOCK POINTER 
*         ADDRESSES.  EACH POINTER IS ASSEMBLED WITH THE
*         RELATIVE ADDRESS OF A BUFFER WITHIN THE COMMUNICATION 
*         BLOCK AND MUST HAVE THE RELATIVE ADDRESS OF THE 
*         COMMUNICATION BLOCK ADDED TO IT TO FORM A VALID 
*         CENTRAL MEMORY ADDRESS. 
  
 CBADRS   CON    P.SECURE    POINTER TO SECURITY WORD 
          CON    P.IR        POINTER TO INPUT REGISTER
          CON    P.OR        POINTER TO OUTPUT REGISTER 
          CON    P.MB        POINTER TO MESSAGE BUFFER
          CON    P.DB        POINTER TO DISPLAY BUFFER
*         CON    P.PB        POINTER TO PLOT BUFFER 
*         CON    P.CB        POINTER TO CHECKPOINT BUFFER 
          CON    P.PDS       POINTER TO PUSH DOWN STACK SAVE AREA 
*         CON    P.SFB       POINTER TO SCRATCH FILE BUFFER 
          CON    P.MOD       POINTER TO MODULE BUFFER 
          CON    P.POMB      POINTER TO PROD. OVERLAY ERROR MSG BUFFER
          CON    P.SBPOR     POINTER TO STANDBY PP OUTPUT REGISTER
          CON    P.DS        POINTER TO DIAGNOSTIC SWITCHES 
          CON    P.CB8K      POINTER TO 8K CHECKPOINT BUFFER
          CON    P.IPIBU     POINTER TO IPI DATA BUFFER 
          DATA   0
  
  
          IFEQ   NOS,1,6
          BASE   O
 SSJ$     EQU    1
 DIAG$    EQU    1
          XTEXT  COMSSSJ
          XTEXT  COMPCUA
          BASE   *
  
          IFEQ   NOSBE+NOSBE6,1,1 
 OPL1B    XTEXT  COMPCUA
*IF DEF,NOSBE6,1
*CALL COMPCUA 
  
  
          ERRPL  *-STACK-LSTACK        TEST FOR OVERFLOW INTO DRIVER
          TITLE  WLD COMMAND PROCESSOR ROUTINES 
*         BASIC DRIVER FIXED ENTRY POINTS.
  
          BSS    STACK+LSTACK-* 
 DRIVER   EQU    *
 LDRIVER  EQU    4500B-*
 LPPU     EQU    20000B-DRIVER
  
 XAND     LJM    ** 
          LPDL   D.T0        FORM LOGICAL PRODUCT 
          UJN    XAND 
 XBLANK   LJM    ** 
          LJM    BLANK       BLANK FILL PPU DISPLAY AREA SUBROUTINE 
 XCBF     LJM    ** 
          LJM    CBF         COMPARE BUFFERS FORWARD
 XCOPY    LJM    ** 
          LJM    COPY        COPY BUFFER TO BUFFER SUBROUTINE 
 XDELAY   LJM    ** 
          LJM    DELAY       DELAY SUBROUTINE 
 XDUP     LJM    ** 
          LJM    DUP         DUPLICATE DATA TO BUFFER SUBROUTINE
 XEND     LJM    END         END SUBROUTINE 
 XENDSUB  LJM    ** 
          LJM    ENDSUB      ENDSUB SUBROUTINE
 XERROR   LJM    ** 
          LJM    ERROR       ERROR SUBROUTINE 
 XEXIT    LJM    ** 
          LJM    EXIT        EXIT/CALL SUBROUTINE 
 XGOSUB   LJM    ** 
          LJM    GOSUB       GOSUB SUBROUTINE 
 XHALT    LJM    ** 
          LJM    HALT        HALT/PAUSE SUBROUTINE
 XLOG     LJM    ** 
          LJM    LOG         LOG ENTRIES INTO ERROR FILE
 XLS      LJM    ** 
          LJM    LS          LEFT SHIFT SUBROUTINE
 XMSG     LJM    ** 
          LJM    MSG         MESSAGE TO PPU DISPLAY AREA SUBROUTINE 
 XOR      LJM    ** 
          LJM    OR          LOGICAL SUM SUBROUTINE 
 XPICTUR  LJM    ** 
          LJM    PICTURE     PICTURE TAKING SUBROUTINE
 XPLOT    LJM    ** 
          LJM    PLOT        PLOT SUBROUTINE
 XRANDOM  LJM    ** 
          LJM    RANDOM      RANDOM DATA GENERATION SUBROUTINE
 XRETURN  LJM    RETURN      EXIT A SUBROUTINE
 XRNI     LJM    RNI         READ NEXT INSTRUCTION SUBROUTINE 
 XRS      LJM    ** 
          LJM    RS          RIGHT SHIFT SUBROUTINE 
 XSYS     LJM    ** 
          LJM    SYS         SCRATCH FILE OPERATIONS SUBROUTINE 
 XTESTBI  LJM    ** 
          LJM    TESTBI      TEST BUFFER INDEX
  
          TITLE  PERFORM AND OPERATION
**        AND - PERFORM .AND. OPERATION.
* 
*         PERFORM .AND. OPERATION.
* 
*         ENTRY- (D.T0) = OPERAND 1.
*                (A)    = OPERAND 2.
* 
*         EXIT - (A)    = LOGICAL PRODUCT OF OP1 AND OP2. 
* 
*         USES - NONE.
* 
*         CALLS- NONE.
* 
* AND     LPDL   D.T0        *** ACTUAL CODE IN JUMP TABLE ***
*         LJM    XAND        EXIT TO STACK
  
          TITLE  REQUEST CPU TO BLANK PB/DB 
**        BLANK - REQUEST CPU TO BLANK PB/DB. 
* 
*         REQUEST EXECUTIVE TO ZERO FILL THE PLOT BUFFER, 
*         DISPLAY BUFFER, OR BOTH.
* 
*         ENTRY- (A) = BLANK OPTION CODE
* 
*         EXIT - PPU DISPLAY/PLOT BUFFER IN CENTRAL MEMORY IS ZERO
*                FILLED 
* 
*         USES - REQP+4.
* 
*         CALLS- REQ
* 
 BLANK    STM    REQP+4      SAVE BLANK OPTION IN REQUEST BUFFER
          LDN    F.BLANK
          RJM    REQ         REQUEST CPU EXEC TO BLANK
          LJM    XBLANK      EXIT TO STACK
  
          TITLE  COMPARE BUFFERS
**        CBF - COMPARE BUFFERS.
* 
*         EXECUTE THE FOLLOWING COMMAND WHICH COMPARES TWO BUFFER AREAS 
*         TO EACH OTHER.
* 
*         COMPARE W TO X FOR Y, ABT Z 
* 
*         ENTRY- (D.T0) = W.
*                (D.T1) = X.
*                (D.T2) = Y.
*                (A)    = Z.
* 
*         EXIT - TO P+1 IF NO COMPARE ERROR.
*                TO Z ON THE FIRST NON-COMPARE (Y) SET TO WD IN ERROR.
* 
*         USES - D.T0, D.T1, D.T2, D.T3, D.T6, D.T7.
* 
*         CALLS- RNI. 
* 
 CBF      STD    D.T6        SAVE ABT ADDRESS 
          SHN    -11
          STD    D.T7 
          LDI    D.T2 
          ZJN    CBF2        IF NO WORDS TO COMPARE 
          STD    D.T3        STORE NUMBER OF WORDS TO COMPARE 
 CBF1     LDIL   D.T0 
          LMIL   D.T1 
          NJN    CBF3        IF NO COMPARE
          AODL   D.T0 
          AODL   D.T1 
          SOD    D.T3 
          NJN    CBF1        IF ALL WORDS NOT DONE
 CBF2     LJM    XCBF 
  
 CBF3     LDI    D.T2 
          SBD    D.T3 
          STI    D.T2        STORE POINT OF FAILURE IN REGISTER Y 
          LDD    D.T7 
          LJM    RNI1        JUMP TO Z VIA RNI
  
          TITLE  COPY ONE BUFFER AREA TO ANOTHER
**        COPY - COPY ONE BUFFER AREA TO ANOTHER. 
* 
*         COPY  ONE  BUFFER  AREA TO ANOTHER BY EXECUTING THE FOLLOWING 
*         COMMAND.
* 
*         COPY X TO Y FOR Z 
* 
*         ENTRY- (D.T2) = SOURCE BUFFER FIRST WORD ADDRESS. 
*                (D.T0) = DESTINATION BUFFER FIRST WORD ADDRESS.
*                (A)    = NUMBER OF WORDS TO COPY.
* 
*         EXIT - SPECIFIED NUMBER OF WORDS COPIED FROM SOURCE 
*                BUFFER TO DESTINATION BUFFER.
* 
*         USES - D.T0, D.T1, D.T2.
* 
*         CALLS- TESTBR.
* 
 COPY     STD    D.T1        SAVE NUMBER OF WORDS 
          ZJN    CPY2        IF NO WORDS TO COPY
          RJM    TESTBR      VERIFY BUFFER REFERENCES ARE IN RANGE
 CPY1     LDIL   D.T2 
          STIL   D.T0        MOVE ONE WORD
          AODL   D.T2        BUMP SOURCE POINTER
          AODL   D.T0        BUMP DESTINATION POINTER 
          SOD    D.T1        DECREMENT WORDS TO DO
          NJN    CPY1        IF NOT DONE
 CPY2     LJM    XCOPY       EXIT TO STACK
  
          TITLE  PROCESS DELAY COMMAND
**        DELAY - PROCESS DELAY COMMAND.
* 
*         DELAY EXECUTION BY THE NUMBER OF MILLISECONDS OR MICROSECONDS 
*         SPECIFIED BY THE FOLLOWING COMMAND. 
* 
*         DELAY X USEC       DELAY X MSEC 
* 
*         ENTRY- (A) = USEC OR MSEC DELAY FLAG IN BIT 17, 
*                      AND DELAY COUNT IN BITS 0 - 11 
*                      ( MSEC DELAY IF BIT 2**17 IS ZERO )
* 
*         EXIT - DELAY HAS BEEN EXECUTED
* 
*                ABORT IF DELAY CAUSES FREQUENCY OF SYSTEM
*                COMMUNICATION WHILE A CHANNEL IS ASSIGNED TO 
*                EXCEED 2 SECONDS.
* 
*         USES - RT, D.Z1, D.T5 
* 
*         CALLS- DCHAN, ABT 
* 
 DELAY    PJN    DLY3        IF MILLISECOND DELAY REQUEST 
          LPC    177777B     MASK MICROSECOND DELAY 
          SHN    1
 DLY1     SBN    2           *** SBN 2 IF 2X SPEED PPU ***
*         SBN    1           *** SBN 1 IF 4X SPEED PPU ***
          PJN    DLY1        IF DELAY COUNT NOT EXPIRED 
 DLY2     LJM    XDELAY      EXIT TO STACK
  
 DLY3     ZJN    DLY2        IF NO TIME TO DELAY
          STDL   D.T5 
 DLY4     LDC    1988 
 DLY5     SBN    2           *** SBN 2 IF 2X SPEED PPU ***
*         SBN    1           *** SBN 1 IF 4X SPEED PPU ***
          NJN    DLY5 
          AOD    RT 
          ADC    -7777B 
          PJN    DLY8        IF 4 SECONDS PASSED
 DLY6     EQU    *
  
          IFEQ   NOS,1
          LDD    RT 
          LPC    377B 
          NJN    DLY7        IF 256 MSEC HAS NOT PASSED 
          PAUSE  ST          PAUSE WITHOUT STATUS 
*         LDN    PRLM 
*         STD    D.Z1        SET PAUSE FUNCTION 
*         LDD    D.PPOR 
*         CWD    D.Z1        WRITE PAUSE FUNCTION TO OUTPUT REGISTER
          ENDIF 
  
 DLY7     SODL   D.T5        DECREMENT DELAY TIME 
          NJN    DLY4        IF DELAY TIME IS NOT UP
          UJN    DLY2 
  
 DLY8     LDM    CHFLG
          NJN    DLY9        IF CHANNEL IS ASSIGNED - ERROR 
          RJM    DCHAN       COMMUNICATE WITH THE SYSTEM
          UJN    DLY6 
  
 DLY9     LDC    BD.TLER     2 SECOND DELAY SINCE SYSTEM COMM ERROR 
 DLY10    LJM    ABT
  
          TITLE  DUPLICATE PATTERNS COMMAND PROCESSOR 
**        DUP - DUPLICATE PATTERNS COMMAND PROCESSOR. 
* 
*         DUPLICATE V BITS OF WORDS W/X TO Y FOR Z TIMES. 
* 
*         ENTRY- (D.T0) = BUFFER ADDRESS                  -Y- 
*                (D.T2) = BYTE WIDTH (8 OR 16)            -V- 
*                (D.T3) = FIRST DATA WORD                 -W- 
*                (D.T4) = SECOND DATA WORD                -X- 
*                (A)    = NUMBER OF WORDS TO STORE        -Z- 
* 
*         EXIT - TO ABT IF BUFFER INDEX OR WC ERROR OR IF ILLEGAL 
*                BYTE SIZE SPECIFIED (V). 
* 
*         USES - D.T0 - D.T4
* 
*         CALLS- TESTBR 
* 
* 
 DUP      STD    D.T1        SAVE WORDS TO DO 
          ZJN    DUP5        IF NO WORDS TO DO
          RJM    TESTBR      VERIFY BUFFER ADDRESS AND WORD COUNT 
          LDD    D.T2        V BITS 
          SBN    8
          ZJN    DUP8        IF 8-BIT STORES
          SBN    8
          ZJN    DUP1        IF 16-BIT STORES 
          LDC    BD.BIER
          UJN    DLY10        ABORT, ILLEGAL BIT SIZE 
  
*         STORE DATA INTO SELECTED BUFFER 
  
 DUP1     LDN    D.T3 
          STD    D.T2        SET POINTER TO DATA
 DUP3     LDIL   D.T2        GET A DATA WORD
          STIL   D.T0        STORE IT INTO BUFFER 
          AODL   D.T0        BUMP BUFFER INDEX
          SOD    D.T1        DECREMENT WORDS TO DO
          ZJN    DUP5        IF ALL WORDS STORED
          AODL   D.T2        BUMP POINTER TO DATA 
          SBN    D.T5 
          NJN    DUP3        IF ALL 4 WORDS NOT USED YET
          UJN    DUP1        RESET POINTER TO THE TOP 
  
 DUP5     LJM    XDUP        EXIT TO STACK
  
*         8-BIT STORES SELECTED.  BUILD 2 WORDS 
  
 DUP8     LDD    D.T3        FIRST 8-BIT OPERAND
          LPC    377B        MASK OFF LOWER 8 BITS
          SHN    8
          STDL   D.T3        STORE IN FIRST DATA WORD UPPER 
          LDD    D.T4        SECOND 8-BIT OPERAND 
          LPC    377B 
          RADL   D.T3        FORM COMPLETE DATA WORD
          STDL   D.T4        DUPLICATE IN SECOND DATA WORD
          UJN    DUP1        STORE PATTERN IN DESTINATION BUFFER
  
          TITLE  PROCESS END COMMAND
**        END - PROCESS END COMMAND.
* 
*         STOP EXECUTION  AND  SEND  THE  EXECUTIVE  AN  END  FUNCTION. 
* 
*         ENTRY- NONE.
* 
*         EXIT - (A) = MALET EXECUTIVE END FUNCTION.
* 
*         USES - NONE.
* 
*         CALLS- REQ
* 
 END      LDN    F.END
          RJM    REQ
  
*         CONTROL IS NOT RETURNED FROM REQ AFTER AN END COMMAND 
  
          TITLE  PROCESS ENDSUB COMMAND 
**        ENDSUB - PROCESS ENDSUB COMMAND.
* 
*         TERMINATE SUBROUTINE MODE BY CLEARING  THE  PUSH-DOWN  STACK. 
* 
*         ENTRY- (A) = 0 IF NO JUMP ADDRESS - OTHERWISE,
* 
*                       BITS 17-11 NEW LINE NUMBER. 
*                       BITS 10-0  ABSOLUTE STACK ADDRESS FOR RNI.
* 
*         EXIT - TO RNI IF JUMP ADDRESS NON-ZERO, ELSE, TO THE STACK
* 
*         USES - D.T6, D.T7, PDS, PDS+2.
* 
*         CALLS- NONE 
* 
 ENDSUB   STD    D.T6 
          SHN    -11
          STD    D.T7 
          LDN    0
          STM    PDS         ZERO FILL THE PUSH DOWN STACK
          STM    PDS+2
          LDD    D.T6 
          ZJN    ENS1        IF NO JUMP ADDRESS SUPPLIED
          LDD    D.T7 
          LJM    RNI1        EXIT TO STACK VIA RNI
  
 ENS1     LJM    XENDSUB     EXIT TO STACK
  
          TITLE  PROCESS ERROR CONDITION
**        ERROR - PROCESS ERROR CONDITION.
* 
*         SET  ERROR  MESSAGE,  CODE, AND LINE ADDRESS INTO THE EM, EC, 
*         AND EA REGISTERS. 
* 
*         ENTRY- (A) =  BITS 17-12 - ERROR MESSAGE NUMBER.
*                       BITS 11-0  - ERROR CODE.
* 
*         EXIT - ERROR CODE STORED INTO EC REGISTER.
*                ERROR MESSAGE INDEX STORED INTO EM REGISTER. 
*                CURRENT LINE NUMBER STORED INTO THE EA REGISTER. 
* 
*         USES - EA, EC, EM.
* 
*         CALLS- NONE.
* 
 ERROR    STD    EC          STORE ERROR CODE 
          SHN    -12
          STD    EM          STORE ERROR MESSAGE
          LDD    P
          STD    EA          STORE CURRENT LINE NUMBER
          LJM    XERROR      EXIT 
  
          TITLE  PROCESS EXIT COMMAND 
**        EXIT - PROCESS EXIT COMMAND.
* 
*         EXIT THIS MODULE TO THE MODULE SPECIFIED BY THE (A).  IF  (A) 
*         IS  ZERO,  REQUEST  THE CPU TO LOAD THE NEXT SELECTED MODULE. 
*         IF (A) IS NOT ZERO, REQUEST THE CPU  TO  LOAD  THIS  SPECIFIC 
*         MODULE. 
* 
*         ENTRY- (A)   = MODULE NUMBER TO LOAD IN DISPLAY CODE. 
*                (D.T0) = 0, IF NOT A CALL COMMAND
* 
*         EXIT - START EXECUTION OF THE NEXT MODULE IF ONE IS LOADED. 
*                IF ONE IS NOT LOADED, THE PPU DRIVER IS NOT RECALLED.
* 
*         USES - REQP-REQP+4. 
* 
*         CALLS- REQ, RACM, TFL 
* 
 EXIT     STM    REQP+4      SAVE MODULE NUMBER REQUESTED 
          SHN    -12
          STM    REQP+3      SAVE UPPER DIGIT OF MODULE NUMBER
          LDD    D.T0 
          ZJN    EXI0        IF NOT A CALL COMMAND
          RJM    RACM        REQUEST ACCESS TO CM 
          LDC    RA.CB+L.CB-1 
 P.PDS    EQU    *-1         *** POINTER TO PDS SAVE AREA STORED HERE 
          RJM    TFL         FORM AND VERIFY REAL MEMORY ADDRESS
          CWM    PDS,D.PPONE  SAVE SUBROUTINE ENTRY POINTS
          LDD    P
          STM    REQP+1      SAVE RENTRY LINE NUMBER
          LDM    XEXIT+1     SAVE REENTRY STACK ADDRESS 
 EXI0     STM    REQP+2 
          LDN    F.LOAD 
          RJM    REQ         REQUEST CPU ASSISTANCE 
  
*         WHEN CONTROL IS RETURNED FROM REQ, ALL CONDITIONS ARE READY 
*         TO ENTER THE STACK AT THE ENTRY POINT DEFINED BY
*         FADDR.
  
 EXI1     LJM    ** 
 FADDR    EQU    *-1         *** ABSOLUTE ADDRESS IN STACK STORED HERE
  
          TITLE  PROCESS GOSUB COMMAND
**        GOSUB - PROCESS GOSUB COMMAND.
* 
*         ENTER A SUBROUTINE WITHIN A MODULE. 
* 
*         ENTRY- (A) = 18 BITS, 17-11 = 7 BIT P ADDRESS 
*                               10-0 = 11 BIT LINE NUMBER 
* 
*         EXIT - ABORT IF PUSH DOWN STACK IS FILLED.
*                TO RNI IF NOT FULL, ADDRESS SAVED IN STACK.
* 
*         USES - D.T6, D.T7, PDS-PDS+3. 
* 
*         CALLS- RNI. 
* 
 GOSUB    STD    D.T6        SAVE A REGISTER
          SHN    -11
          STD    D.T7        FORM LDC INSTRUCTION 
          LDM    PDS         CHECK FIRST ENTRY FULL 
          NJN    GOS2        IF FULL, USE NEXT ENTRY
 GOS1     LDD    P
          STM    PDS+1       SAVE LINE NUMBER 
          LDM    XGOSUB+1    GET ADDRESS OF RETURN
          STM    PDS         SAVE IT
          LDD    D.T7 
          LJM    RNI1        EXIT TO ROUTINE VIA RNI
  
 GOS2     LDM    PDS+2       CHECK FOR FULL STACK 
          NJN    GOS3        IF FULL, ABORT 
          LDM    PDS
          STM    PDS+2       PUSH THE STACK DOWN
          LDM    PDS+1
          STM    PDS+3
          UJN    GOS1 
  
 GOS3     LDC    BD.SEER     SUBROUTINE ENTRY/EXIT ERROR
          LJM    ABT
  
 PDS      BSSZ   4           SUBROUTINE CALL PUSH DOWN STACK
  
* 
*         2 WORDS PER ENTRY 
* 
*           --------------------------- 
*         0 I ABSOLUTE RETURN ADDRESS I 
*           I-------------------------I 
*         1 I P - CURRENT LINE NUMBER I 
*           --------------------------- 
  
          TITLE  PROCESS HALT AND PAUSE COMMANDS
**        HALT/PAUSE  - PROCESS HALT AND PAUSE COMMANDS.
* 
*         IF HALT COMMAND AND STOP-ON-ERROR NOT SELECTED, THEN RNI AT 
*         P+1, ELSE, ISSUE HALT REQUEST TO EXECUTIVE. 
* 
*         ENTRY- (A) = HALT/PAUSE FLAG  (PAUSE IF NON-ZERO).
* 
*         EXIT - HALT FUNCTION SENT TO EXECUTIVE IF RNI CONDITION NOT 
*                MET. 
* 
*         USES - REQP+4.
* 
*         CALLS- REQ. 
* 
 HALT     STM    REQP+4      SAVE HALT/PAUSE FLAG 
          NJN    HAL         IF PAUSE REQUEST 
          LDD    ES          EXECUTIVE SWITCHES 
          LPN    SEF
          ZJN    HAL1        IF STOP-ON-ERROR IS CLEAR
 HAL      LDN    F.HALT 
          RJM    REQ         SEND HALT REQUEST TO EXECUTIVE 
 HAL1     LJM    XHALT       EXIT TO STACK
  
          TITLE  LOG OB INTO ERROR FILE 
**        LOG - LOG OB INTO ERROR FILE. 
* 
*         WRITE THE CONTENTS OF THE OUTPUT BUFFER  TO  THE  ENGINEERING 
*         FILE. 
* 
*         ENTRY- (A) = FIRST WORD ADDRESS OF ENGINEERING FILE DATA. 
* 
*         EXIT - DATA FROM FWA TO THE FIRST ZERO BYTE WRITTEN TO THE
*                ENGINEERING FILE.
* 
*         USES - NONE.
* 
*         CALLS- R.DFM. 
* 
          IFEQ   NOS,1,1
 LOG      ADC    60000B      ADD MESSAGE CONTROL WORD 
  
          IFEQ   NOSBE,1,1
 LOG      ADC    200000B     ADD MESSAGE CONTROL WORD 
  
          RJM    R.DFM       LOG MESSAGE INTO ERROR FILE
          LJM    XLOG        EXIT TO STACK
  
          TITLE  PROCESS THE LEFT SHIFT OPERAND 
**        LS - PROCESS THE LEFT SHIFT OPERAND.
* 
*         SHIFT THE OPERAND IN D.T0 LEFT (A) PLACES.
* 
*         ENTRY- (D.T0) = OPERAND TO SHIFT. 
*                (A)    = LEFT SHIFT COUNT. 
*                         VALUES GREATER THAN 37B GENERATE ERRONEOUS
*                         RESULTS.
* 
*         EXIT - (A)    = OPERAND LEFT SHIFTED ENDAROUND AS A 16-BIT
*                       VALUE.
* 
*         USES - D.T0, D.T1.
* 
*         CALLS- NONE.
* 
 LS       LPN    37B
          STD    D.T1        SAVE SHIFT COUNT 
          ZJN    LS2         IF SHIFT COUNT ZERO
 LS1      LDDL   D.T0        GET VALUE TO BE SHIFTED
          SHN    1
          STDL   D.T0        SAVE SHIFTED VALUE 
          SHN    -16         POSITION BIT 2**16 TO 2**0 
          RADL   D.T0        MOVE BIT 2**16 TO 2**0 
          SOD    D.T1        DECREMENT SHIFT COUNT
          NJN    LS1         IF NOT DONE LOOP 
 LS2      LDDL   D.T0        GET FINAL SHIFTED VALUE INTO A REGISTER
          LJM    XLS         EXIT TO STACK
  
          TITLE  PROCESS THE MESSAGE COMMAND
**        MSG - PROCESS THE MESSAGE COMMAND.
* 
*         ADD SPECIFIED MESSAGE TO THE PPU DISPLAY BUFFER.
* 
*         ENTRY- (A)    = MESSAGE DESTINATION CODE
*                IF, 0-50B, 
*                THEN, ROUTE THE MESSAGE TO INDICATED DISPLAY LINE
*                IF, 51B-57B, 
*                THEN, BITS 2, 1, AND 0 ENABLE ROUTING OF MESSAGE TO
*                      DISPLAY LINE 50, AND/OR THE PRINT FILE AND/OR
*                      THE DAYFILE, RESPECTIVELY. 
*                ELSE, ROUTE THE MESSAGE TO DISPLAY LINE 50 
*                (D.Z3) = NUMBER OF VALID DATA ITEMS
*                (D.Z2) = MESSAGE INDEX 
*                IF,   (D.Z1) = 0,
*                THEN, (D.Z6) = ADDRESS OF DATA ITEM BUFFER 
*                ELSE, (D.T0)-(D.T7) = THE DATA ITEMS 
* 
*         EXIT - MESSAGE WRITTEN TO SPECIFIED DESTINATION BUFFERS.
* 
*         USES - D.Z1 - D.T7. 
* 
*         CALLS- RACM, REQ. 
* 
 MSG      STD    D.Z7        SAVE Z - LINE NUMBER 
          SBN    60B
          MJN    MSG1        IF IN LEGAL RANGE
          LDN    50B
          STD    D.Z7        SET IT TO MAXIMUM
  
 MSG1     LDDL   B0 
          STDL   YREG        SAVE CONTENTS OF B0 REGISTER 
          LDN    4
          STD    XREG        NUMBER OF CM WORDS TO SAVE 
          LDD    D.PPMSG
          CWML   D.Z1,XREG   COPY LOW CORE TO NON-RELOCATABLE CM AREA 
          RJM    RACM        REQUEST ACCESS TO CM 
          LDD    D.PPMSG
          CRML   D.Z1,XREG   LOAD LOW CORE FROM SAVE AREA 
  
          LDD    D.Z3        NUMBER OF DATA ITEMS 
          SHN    8
          RAD    D.Z7 
          LDD    D.Z2 
          SHN    -6 
          ZJN    MSG2        IF MESSAGE INDEX IS .LT.100B - FROM USER 
  
*         THE MESSAGE INDEX IS FROM THE DRIVERS. FORMAT WORD 2 OF THE 
*         MESSAGE AS FOLLOWS..
* 
*         (MSG INDEX)  ( EC )  (  EA )
  
          LDD    D.Z2 
          STD    D.T0        SET FIRST DATA ITEM TO MESSAGE INDEX 
          LDD    EC 
          STD    D.T1        SET SECOND DATA ITEM TO (EC) 
          LDD    EA 
          STD    D.T2        SET THIRD DATA ITEM TO (EA)
          UJN    MSG4        GO INSERT SEQUENCE TAGS AND WRITE IT 
  
 MSG2     LDD    D.Z1        X DEFINED FLAG 
          ZJN    MSG4        IF NOT DEFINED 
          LDN    D.T0 
          STD    D.Z1        SET STORAGE ADDRESS
 MSG3     LDIL   D.Z6        GET DATA WORD
          STIL   D.Z1 
          AODL   D.Z6        BUMP POINTER TO SOURCE 
          AODL   D.Z1        BUMP POINTER TO DESTINATION
          SBN    B0 
          NJN    MSG3        IF 8 ITEMS NOT DONE
 MSG4     AOM    MSGA        BUMP MESSAGE NUMBER
          SHN    -12
          RAM    MSGA        INSURE IT IS NEVER ZERO
          STD    D.Z5        PUT IT IN FIRST MESSAGE WORD 
          STD    B0          PUT IT IN LAST MESSAGE WORD
          LDD    D.Z2 
          STD    D.Z6        SET MESSAGE INDEX IN MESSAGE WORDS 
* 
*         THE MESSAGE HAS BEEN FORMED AND IS READY TO BE WRITTEN
*         TO THE DISPLAY BUFFER. THE FORMAT IS .. 
*                (D.Z5) = MESSAGE NUMBER
*                (D.Z6) = MESSAGE INDEX 
*                (D.Z7) = 8/DATA ITEM COUNT, 8/LINE NUMBER
*                (D.T0)-(D.T7) = DATA ITEMS 
*                (B0) = MESSAGE NUMBER
* 
          LDN    D.Z5 
          STD    D.Z1        PP FWA FOR CM WRITE
          LDN    4
          STD    D.Z2        SET CM WORD COUNT
          LDD    D.Z7 
          LPN    77B         MASK LINE NUMBER 
          SBN    51B
          MJN    MSG5        IF IN LEGAL RANGE OF THE MSG BUFFER
          LCN    1           FORCE LINE NUMBER TO 50
 MSG5     ADN    51B         FORM LINE NUMBER 
          SHN    2           LINE NUMBER TIMES 4
 MSG6     ADC    RA.DB       ADD POINTER TO DISPLAY BUFFER
 P.DB     EQU    *-1         POINTER TO DISPLAY BUFFER IS STORED HERE 
          RJM    WPD
          LDDL   YREG 
          STDL   B0          RESTORE REGISTER B0
          LDD    D.Z7 
          LPN    77B         MASK LINE NUMBER 
          SBN    50B
          MJN    MSG7        IF NOT SPECIAL CASE
          LPN    3
          ZJN    MSG7        IF NOT PRINT OR DAYFILE REQUEST
          LDN    F.MSG
          RJM    REQ         REQUEST CPU TO PRINT OR ISSUE DAYFILE
  
 MSG7     EQU    *
  
          IFEQ   NOSBE,1,1
          RJM    R.TAFL      TERMINATE ACCESS TO CENTRAL MEMORY 
  
          LJM    XMSG        RETURN TO STACK
  
 MSGA     DATA   0           MESSAGE NUMBER 
  
          TITLE  PROCESS OR OPERAND 
**        OR - PROCESS OR OPERAND.
* 
*         PERFORM A LOGICAL SUM OF TWO OPERANDS.
* 
*         ENTRY- (D.T0) = OPERAND 1.
*                (A)    = OPERAND 2.
* 
*         EXIT - (A)    = LOGICAL SUM OF OPERAND 1 AND OPERAND 2. 
* 
*         USES - D.T0, D.T1.
* 
*         CALLS- NONE 
* 
 OR       STDL   D.T1 
          LMDL   D.T0 
          LPDL   D.T1 
          LMDL   D.T0 
          LJM    XOR         EXIT TO STACK
  
          TITLE  PROCESS PICTURE COMMAND
**        PICTURE - PROCESS PICTURE COMMAND.
* 
*         TAKE A SNAPSHOT OF THE PPU DISPLAY/PLOT BUFFER AND SEND IT TO 
*         THE OUTPUT FILE. BLANK THE  DISPLAY  AFTER  THE  SNAPSHOT  IF 
*         REQUESTED.
* 
*         ENTRY- (A) = BLANK OPTION AFTER THE SNAPSHOT. 
* 
*         EXIT - SNAPSHOT TAKEN AND DISPLAY(S) BLANKED AS REQUESTED.
* 
*         USES - REQP+4 
* 
*         CALLS- REQ. 
* 
 PICTURE  STM    REQP+4      STORE BLANK FLAGS
          LDN    F.PIC
          RJM    REQ         REQUEST SNAPSHOT FROM CPU
          LJM    XPICTUR     EXIT TO STACK
  
          TITLE  PROCESS PLOT COMMAND 
**        PLOT - PROCESS PLOT COMMAND.
* 
*         THIS COMMAND NOT SUPPORTED FOR 16 BIT.
* 
 PLOT     LJM    XPLOT       EXIT TO STACK
  
          TITLE  PROCESS RANDOM COMMAND 
**        RANDOM - PROCESS RANDOM COMMAND.
* 
*         EXECUTE THE FOLLOWING COMMAND FORMATS TO GENERATE RANDOM DATA 
*         IN THE INPUT/OUTPUT BUFFERS.
* 
*         RANDOM TO X FOR Y 
*         RANDOM TO X FOR Y, START Z
* 
*         ENTRY- (D.T0) = ADDRESS OF BUFFER                      -X-
*                (D.T1) = NUMBER OF WORDS TO GENERATE            -Y-
*                (A)    = RANDOM STARTER SEED AND STARTER FLAG   -Z-
*                       IF BIT 17 IS SET, NO RANDOM STARTER WAS 
*                       SUPPLIED, SO USE REAL-TIME CLOCK. 
* 
*                       IF BIT 17 IS NOT SET, THE LOWER 12 BITS OF
*                       A IS THE RANDOM STARTER.
* 
*         EXIT - MODULE ABORTED IF BUFFER SIZE IS EXCEEDED. 
*                OTHERWISE, Y WORDS ARE GENERATED AND STORED INTO 
*                SEQUENTIAL WORDS OF THE BUFFER ADDRESS SPECIFIED BY X. 
* 
*         USES - D.T0 - D.T3. 
* 
*         CALLS- TESTBR.
* 
 RANDOM   PJN    RAN1        IF USER SUPPLIED RANDOM STARTER
          IANN   14B+40B     USE REAL TIME CLOCK AS RANDOM STARTER
          STD    D.T2 
          SHN    10 
          ADD    D.T2        FORM 16-BIT RANDOM VALUE 
 RAN1     STDL   D.T2        SAVE RANDOM STARTER SEED 
          LDD    D.T1        WC 
          ZJN    RAN4        IF NO WORDS TO STORE 
          RJM    TESTBR      VERIFY BUFFER REFERENCES ARE IN RANGE
          LDDL   D.T2        FIRST WORD IS ALWAYS THE STARTER 
          STIL   D.T0        STORE DATA INTO BUFFER 
          LDC    RANDOM1
          STDL   D.T3        SEED FOR RANDOM INCREMENTER
          SODL   D.T0 
          RADL   D.T1        SET BUFFER LWA 
          UJN    RAN3 
  
 RAN2     LDC    RANDOM2
          RADL   D.T3        UPDATE RANDOM INCREMENTER
          SHN    -16
          RAIL   D.T0        ADD CARRY BIT TO LAST WORD STORED
          ADDL   D.T3 
          STML   1,D.T0      STORE NEXT RANDOM NUMBER 
  
 RAN3     AODL   D.T0        INCREMENT BUFFER INDEX 
          SBDL   D.T1 
          NJN    RAN2        IF MORE DATA TO GENERATE 
 RAN4     LJM    XRANDOM     EXIT 
  
          TITLE  PROCESS RETURN COMMAND 
**        RETURN - PROCESS RETURN COMMAND.
* 
*         EXIT A SUBROUTINE WITHIN A MODULE WITH THE RETURN STATEMENT.
* 
*         ENTRY- NONE.
* 
*         EXIT - ABORT MODULE IF THERE IS NOT AN ACTIVE SUBROUTINE
*                JUMP TO THE STACK AT P+1 OF THE LAST EXECUTED GOSUB
*                IF THERE IS AN ACTIVE SUBROUTINE.  PUSH THE STACK OF 
*                SUBROUTINE ADDRESSES UP FOR NEXT GOSUB/RETURN. 
* 
*         USES - P, PDS-PDS+3.
* 
*         CALLS- GOSUB. 
* 
 RETURN   LDM    PDS         LOOK FOR AN ENTRY AT THE TOP OF THE PDS
          ZJN    RET1        ABORT IF EMPTY 
          STM    RET2 
          LDM    PDS+1
          STD    P           RESET LINE NUMBER IN P 
          LDM    PDS+2
          STM    PDS         PUSH THE STACK UP
          LDM    PDS+3
          STM    PDS+1
          LDN    0
          STM    PDS+2
          LJM    **          EXIT DIRECTLY TO THE STACK - NOT VIA RNI 
 RET2     EQU    *-1
  
 RET1     LJM    GOS3        SUBROUTINE ENTRY/EXIT ERROR EXIT 
  
          TITLE  ADVANCE PROGRAM ADDRESS
**        RNI - ADVANCE PROGRAM ADDRESS.
* 
*         READ NEXT INSTRUCTION IN THE STACK.  PRIOR TO EXITING TO  THE 
*         STACK,  BUMP  THE TIME SINCE THE LAST SYSTEMS COMMUNICATIONS. 
*         ABORT IF 2 SECONDS PASS WHILE THE I/O  CHANNEL  IS  ASSIGNED. 
*         IF  2  SECONDS  PASS WHILE THE CHANNEL IS NOT ASSIGNED, FORCE 
*         COMMUNICATIONS. 
* 
*         ENTRY- RNI HAS TWO ENTRY POINTS TO SAVE TIME IN THE EXECUTION 
*                SPEED OF A JUMP. THE ENTRY AT *RNI* HAS THE FOLLOWING
*                INPUT PARAMETERS.
* 
*                (RT)   = MILLISECONDS SINCE LAST SYSTEM COMMUNICATION
*                (A)    = LINE NUMBER AND STACK ADDRESS OF NEXT COMMAND 
* 
*                     BITS 17-11 = LINE NUMBER. 
*                     BITS 10-0  = ABSOLUTE STACK ADDRESS.
* 
*                THE SECOND ENTRY POINT AT *RNI1* HAS THE FOLLOWING 
*                PARAMETERS.
* 
*                (D.T6) = STACK ADDRESS.
*                (A)    = LINE NUMBER.
*                (RT)   = MILLISECONDS SINCE LAST SYSTEM COMMUNICATION
* 
*         EXIT - MODULE IS ABORTED IF MORE THAN 2 SECONDS 
*                HAVE ELAPSED SINCE LAST DROP OF THE I/O CHANNEL. 
*                OTHERWISE, JUMP TO THE STACK AFTER UPDATING THE CLOCK
* 
*         USES - D.T6, D.Z1, RT, P. 
* 
*         CALLS- DCHAN. 
* 
 RNI      STD    D.T6        SAVE STACK ADDRESS 
          SHN    -11
 RNI1     STD    P           SET LINE NUMBER IN P 
          SHN    11 
          ADD    D.T6        GET RID OF BIT 12 IN STACK ADDRESS SAVED 
          STM    RNI4        SAVE EXIT ADDRESS
          IANN   14B
          SHN    -10
          LMD    RT 
          LPN    1
          RAD    RT 
          ADC    -7777B 
          MJN    RNI2        IF NOT 4 SECONDS SINCE LAST SYS COMM 
          LDM    CHFLG
          NJN    RNI5        IF CHANNEL IS ASSIGNED - ERROR 
          RJM    DCHAN       PAUSE, TEST ERROR/DROP/CHECKPOINT FLAGS
 RNI2     EQU    *
  
          IFEQ   NOS,1
          LDD    RT 
          LPC    377B 
          NJN    RNI3        IF 256 MSEC HAS NOT PASSED 
          PAUSE  ST          PAUSE WITHOUT STATUS 
*         LDN    PRLM 
*         STD    D.Z1 
*         LDD    D.PPOR 
*         CWD    D.Z1        SEND PAUSE FUNCTION TO MONITOR 
          AOD    RT          BUMP COUNT TO PREVENT CONSTANT PAUSES
          ENDIF 
  
 RNI3     LJM    ** 
 RNI4     EQU    *-1         JUMP TO THE STACK
  
 RNI5     LDC    BD.TLER     4 SECONDS SINCE LAST COMM ERROR EXIT 
          LJM    ABT
  
          TITLE  PROCESS RIGHT SHIFT OPERAND
**        RS - PROCESS RIGHT SHIFT OPERAND. 
* 
*         RIGHT SHIFT THE OPERAND IN D.T0 (A) PLACES RIGHT WITH NO SIGN 
*         EXTENSION 
* 
*         ENTRY- (D.T0) = VALUE TO SHIFT. 
*                (A)    = SHIFT COUNT.
*                       VALUES GREATER THAN 37B GENERATE ERRONEOUS
*                       RESULTS.
* 
*         EXIT - (A)    = SHIFTED RESULT. 
* 
*         USES - NONE.
* 
*         CALLS- NONE 
* 
 RS       LPN    37B         MASK SHIFT COUNT 
          LMC    1077B       FORM RIGHT SHIFT INSTRUCTION 
          STM    RS1         STORE IT FOR EXECUTION 
          LDDL   D.T0        GET OPERAND TO SHIFT 
 RS1      SHN    0           SHIFT INSTRUCTION STORED HERE
          LJM    XRS         EXIT TO STACK
  
          TITLE  PROCESS SYS COMMANDS 
**        SYS - PROCESS SYS COMMANDS. 
* 
*         EXECUTE  THE  *SYS* COMMANDS THAT REFERENCE THE SCRATCH FILE. 
*         THESE COMMANDS PERFORM THE FOLLOWING FUNCTIONS ON THE SCRATCH 
*         FILE. 
* 
*         SYSRD DMA  - READ   - 12
*         SYSREW DMA - REWIND - 13
*         SYSWR DMA  - WRITE  - 14
* 
*         ENTRY- (A)    = SUBFUNCTION CODE TO ISSUE TO CPU FOR HELP.
*                (D.T0) = REGISTER TO STORE STATUS ON SYSRD.
* 
*         EXIT - FUNCTION COMPLETED.
* 
*         USES - D.Z1, D.T0, WT.
* 
*         CALLS- RACM, REQ, R.TAFL, TFL.
* 
 SYS      STM    REQP+1 
          SBN    13B
          MJN    SYSRD       IF SYSREAD DMA 
          ZJN    SYSREW      IF SYSREWIND DMA 
  
 SYSWR    RJM    RACM        REQUEST ACCESS TO CM 
          LDM    OBWL 
          RJM    SYSDIV      WORD COUNT = MIN(OBWL/4,L.IPIB)
          LDML   P.IPIBU
          RJM    TFL         FORM AND VERIFY REAL MEMORY ADDRESS
          CWML   **,D.Z1
 SYS1     EQU    *-1         ADDRESS OF OUTPUT BUFFER STORE HERE
          UJN    SYS3        IF ALL DONE
  
 SYSREW   EQU    *
 SYS3     LDN    F.SYS
          RJM    REQ
 SYS5     LJM    XSYS        EXIT TO STACK
  
 SYSRD    LDM    IBWL 
          RJM    SYSDIV      WORD COUNT = MIN(IBWL/4,L.IPIB)
          LDN    F.SYS
          RJM    REQ
          LDM    SYSDA       GET WORD COUNT 
          STD    D.Z1        WORD COUNT FOR READ
          LDML   P.IPIBU     POINTER TO UPDATED IPI DATA BUFFER 
          RJM    TFL         FORM AND VERIFY REAL MEMORY ADDRESS
          CRML   **,D.Z1
 SYS9     EQU    *-1         ADDRESS OF INPUT BUFFER STORED HERE
          UJN    SYS5        IF ALL DONE
  
          IFEQ   NOSBE,1,1
          RJM    R.TAFL      TERMINATE ACCESS TO CM 
  
 P.IPIBU  CONL   RA.IPIBU    POINTER TO IPI DATA BUFFER STORED HERE 
  
          TITLE  TEST BUFFER INDEX
**        TESTBI - TEST BUFFER INDEX. 
* 
*         TEST BUFFER INDEX TO BE IN RANGE  OF  THE  INPUT  AND  OUTPUT 
*         BUFFERS.
* 
*         ENTRY- (A) = BUFFER INDEX VALUE.
* 
*         EXIT - TO THE STACK IF VALUE IS IN RANGE.  ABORT IF NOT.
* 
*         USES - NONE.
* 
*         CALLS- NONE 
* 
 TESTBI   SBML   IBFWA
          MJN    TST1        ERROR IF BELOW INPUT BUFFER
          SBML   IBWL 
          SBML   OBWL 
          PJN    TST1        ERROR IF ABOVE OUTPUT BUFFER 
          LJM    XTESTBI     EXIT TO STACK
  
 TST1     LJM    TBP1        BUFFER REFERENCE ERROR 
  
          TITLE  CHECKPOINT PPU DRIVER
**        CKP - CHECKPOINT PPU DRIVER.
* 
*         CHECKPOINT  THE  PPU  DRIVER,  PRODUCT  OVERLAY AND OPERATING 
*         REGISTERS TO CENTRAL MEMORY.
* 
*         ENTRY- NONE.
* 
*         EXIT - CM BUFFER CKB CONTAINS BINARY OF WLD + OVERLAY + 
*                OPERATING REGISTERS. 
* 
*         USES - D.Z1, D.Z2.
* 
*         CALLS- WPD. 
* 
 CKPX     LJM    ** 
 CKP      EQU    *-1
  
          LDN    B0-2        FWA OF OPERATING REGISTERS + (D.T6 + D.T7) 
          STD    D.Z1 
          LDN    16B
          STD    D.Z2        NUMBER OF CM WORDS TO TRANSFER 
          LDC    RA.CB8K     ADDRESS OF 8K CM CHECKPOINT BUFFER 
 P.CB8K   EQU    *-1
          RJM    WPD         WRITE OPERATING REGISTERS TO CKP BUFFER
  
          LDC    DRIVER      FWA OF DRIVER + PRODUCT OVERLAY
          STD    D.Z1 
          LDC    LPPU/3      NUMBER OF CM WORDS TO TRANSFER 
          STD    D.Z2 
          LDM    P.CB8K      ADDRESS OF CM CHECKPOINT BUFFER
          ADN    16B         SKIP OVER OPERATING REG AREA 
          RJM    WPD         WRITE DRIVER + PROD OVERLAY TO CKP BUFFER
          UJN    CKPX        EXIT 
  
* P.CB     CONL   RA.CB       ADDRESS OF 4K CM CHECKPOINT BUFFER
  
          TITLE  DROP I/O CHANNEL TO OPERATING SYSTEM 
**        DCHAN - DROP I/O CHANNEL TO THE OPERATING SYSTEM. 
* 
*         DROP  I/O  CHANNEL TO THE OPERATING SYSTEM IF IT IS ASSIGNED. 
*         THE CHANNEL IS DROPPED UNLESS DFLAG  IS  SET  ZERO  PRIOR  TO 
*         ENTRY.   IF  DFLAG  IS ZERO, THIS ROUTINE BECOMES A PAUSE AND 
*         TEST FOR ERROR, DROP, AND CHECKPOINT FLAGS. 
* 
*         ENTRY- IF DFLAG IS SET TO 4 PRIOR TO ENTRY, AN AUTOMATIC
*                CHECKPOINT AND DROP PPU IS PERFORMED.
* 
*         EXIT - CHANNEL IS DROPPED IF ASSIGNED, AND CONTROL
*                RETURNED TO THE CALLING ROUTINE. 
*                PP DROPPED IF DROP OR CHECKPOINT FLAG SET. 
* 
*         USES - D.T0, D.T4, ADRF, RT, CHFLG, DS, ES. 
* 
*         CALLS- DELAY, R.TAFL, R.DCH, TFL, RSW, CK, RACM.
* 
 DCHANX   LJM    ** 
 DCHAN    EQU    *-1
  
          IFEQ   NOSBE,1,2
          LDN    0
          STM    ADRF        CLEAR ERROR CODE RETAINER
  
          LDN    1
          STD    RT          SET TIME SINCE LAST SYS COMMUNICATIONS 
          RJM    RACM        REQUEST ACCESS TO CM 
          LDD    D.T0+1 
          NJN    DCH1A       IF ERROR FLAGS 
  
          IFEQ   NOS,1
          LDD    D.T2        READ ROLLOUT INFO
          SHN    17 
          PJN    DCH2        NO ROLLOUT FLAG
          LDM    CHFLG
          ZJN    DCH1        IF CHANNEL FLAG NOT SET DO NOT DROP
          LDM    CHAN 
          DCHAN 
          LDN    0
          STM    CHFLG       CLEAR CHANNEL FLAG 
 DCH1     LDN    F.ROLL 
          LJM    DCH6B       CHECKPOINT PP
          ENDIF 
  
          IFEQ   NOSBE,1,1
          UJN    DCH2        CONTINUE 
  
 DCH1A    BSSZ   0
  
          IFEQ   NOSBE,1,1
          STM    ADRF        STORE ERROR CODE 
  
          LDN    2
          STM    DFLAG       SET FLAG TO INDICATE END REQUEST 
          UJN    DCH5 
  
 DCH2     RJM    RSW         READ EXECUTIVE AND DIAGNOSTIC SWITCHES 
          LDD    ES          LOAD EXECUTIVE SWITCHES
          LPN    DF+CF
          ZJN    DCH3        IF DROP OR CHECKPOINT FLAGS ARE NOT SET
          LDN    4
          STM    DFLAG       SET FLAG TO INDICATE DROP REQUEST
 DCH3     LDC    1
 DFLAG    EQU    *-1         *** DROP CHANNEL FLAG STORED HERE
          NJN    DCH5        IF REASON TO DROP CHANNEL EXISTS 
 DCH4     LDN    1
          STM    DFLAG       SET FLAG TO FORCE DROP UPON NEXT ENTRY 
  
          IFEQ   NOSBE,1,1
          RJM    R.TAFL      TERMINATE ACCESS TO CM 
  
          LJM    DCHANX      EXIT TO CALLER 
  
 DCH5     LDM    CHFLG
          ZJN    DCH6        IF CHANNEL IS NOT ASSIGNED 
          LDM    CHAN 
  
          IFEQ   NOS,1,1
          DCHAN 
  
          IFEQ   NOSBE,1,1
          RJM    R.DCH
  
          LDC    1           MSEC DELAY COUNT 
*         LDC    100D        *** MODIFIED TO 100D MSEC IF RMS 
 DLYDCH   EQU    *-1
          RJM    XDELAY+1    PROCESS DELAY
          RJM    RACM        PAUSE FOR STORAGE RELOCATION 
          LDN    0
          STD    D.T4 
          STM    CHFLG
          LDM    P.SBPOR     POINTER TO STANDBY PP OUTPUT REGISTER
          RJM    TFL         FORM AND VERIFY REAL MEMORY ADDRESS
          CWD    D.T0        CLEAR FLAG BIT FOR CHANNEL TO SBP
  
 DCH6     BSSZ   0
  
          IFEQ   NOSBE,1,4
          LDM    ADRF 
          LPN    77B
          SBN    F.ERTI 
          ZJN    DCH6AA      IF TERMINAL INTERRUPT
  
          LDM    DFLAG
          SHN    17-1 
          MJN    DCH7        IF END FLAG SET
          SHN    17 
          MJN    DCH6A       DROP REQUEST 
          LJM    DCH4        IF NO DROP REQUEST 
  
*         CHECKPOINT THE PPU TO CM
  
          IFEQ   NOSBE,1,2
 DCH6AA   LDN    F.ROLL 
          UJN    DCH6B
  
 DCH6A    LDN    F.DROP 
 DCH6B    STD    D.T0 
          LDN    1
          STM    DFLAG       SET DROP FLAG
          LDC    DCHANX 
          STM    REQ         SAVE STARTING ADDRESS FOR RESUME 
          RJM    CKP         CHECKPOINT THE PP
          LDN    0
          STD    D.T4        CLEAR TIME DELAY BYTE
          LDM    P.OR        POINTER TO OUTPUT REGISTER 
          RJM    TFL         FORM AND VERIFY REAL MEMORY ADDRESS
          CWD    D.T0        WRITE END OR DROP REQUEST TO EXEC
 DCH7     UJN    DROPIDL     DROP PPU 
  
          IFEQ   NOSBE,1,1
 ADRF     DATA   0           ERROR CODE FOR NOSBE 
  
          TITLE  DROP THE PP OR ABORT THE CONTROL POINT 
**        DROP/ABORT - DROP THE PP OR ABORT THE CONTROL POINT AND 
*                      IDLE THE PP.  IF NOS CLEAR THE DIS FLAG FIRST. 
* 
*         ENTRY- LJM TO DROPIDL IF THE PP IS TO BE DROPPED AND IDLED
*                LJM TO ABRTIDL IF THE CONTROL POINT IS TO BE ABORTED 
*                AND THE PP IDLED 
* 
*         EXIT - CONTROL IS PASSED TO R.IDLE IN PP RESIDENT 
* 
*         USES - D.Z1 
* 
*         CALLS- R.MTR
  
 DROPIDL  LDC    17777B 
          STDL   D.Z0 
 DCLRPPU  LDIL   D.Z0        FLUSH THE PP 
          STIL   D.Z0 
          SODL   D.Z0 
          NJN    DCLRPPU     IF NOT DONE
          LDN    M.DPP       PP DROP FUNCTION 
          UJN    IDLE 
  
 ABRTIDL  LDC    777B 
          STD    D.Z1 
 ACLRPPU  LDI    D.Z1 
          STI    D.Z1        FLUSH THE PPU
          SOD    D.Z1 
          NJN    ACLRPPU     IF NOT DONE
          LDN    M.ABORT     CONTROL POINT ABORT FUNCTION 
 IDLE     RJM    R.MTR
          LJM    R.IDLE      IDLE PPU 
  
          TITLE  PROCESS ERROR ABORT FUNCTION 
**        ERR/ABT - PROCESS ERROR/ABORT FUNCTION. 
* 
*         STORE SUPPLIED DATA INTO EC/EM/EA REGISTERS 
*         RELEASE DEVICE AND I/O CHANNEL, AND SEND ABT OR ERR 
*         FUNCTION TO EXECUTIVE.
* 
*         ENTRY- (A) = ERROR CODE/MESSAGE INDEX 
*                (P) = CURRENT LINE NUMBER
* 
*         EXIT - EC, EM, EA REGISTERS SET AND EXECUTIVE FUNCTION SENT.
* 
*         USES - EA, EM, EC, REQP-REQP+3. 
* 
*         CALLS- REQ
* 
 ERR      LDN    F.ERR
          UJN    ABT2 
  
 ABT      SHN    12 
          ADC    100B 
          STD    EM          SET ERROR CODE 
          SBD    EM 
          ADN    40B
          SHN    6
          STD    EC          SET ERROR CODE 
          LDD    P
          STD    EA          SET ERROR ADDRESS
  
 ABT1     LDN    F.ABT
 ABT2     STM    ABT4        SAVE FUNCTION CODE 
          LDD    EM 
          STM    REQP+1      STORE REQUEST PARAMETERS 
          LDD    EC 
          STM    REQP+2 
          LDD    EA 
          STM    REQP+3 
          LDC    ** 
 ABT4     EQU    *-1         FUNCTION CODE STORED HERE
          RJM    REQ         SEND ERR OR ABT REQUEST TO EXECUTIVE 
          LJM    EXI1        IF RESUME ISSUED, RESTART MODULE 
  
          TITLE  REQUEST ACCESS TO CENTRAL MEMORY 
**        RACM - REQUEST ACCESS TO CM.
* 
*         REQUEST  ACCESS  TO CENTRAL MEMORY. FOR NOSBE, CALL R.RAFL TO 
*         GET ACCESS TO CM.  FOR NOS, WAIT FOR THE OUTPUT  REGISTER  TO 
*         CLEAR, THEN CALL R.RAFL.
* 
*         ENTRY- NONE.
* 
*         EXIT - D.RA AND D.FL SET.  FOR NOSBE, THE FL ACCESS FLAG IS 
*                SET. 
* 
*         USES - D.RA, D.FL, D.Z1-D.Z5. 
* 
*         CALLS- R.RAFL.
* 
 RACMX    LJM    ** 
 RACM     EQU    *-1
  
          IFEQ   NOS,1
 RAC1     LDD    D.PPOR 
          CRD    D.Z1 
          LDD    D.Z1 
          NJN    RAC1        WAIT FOR LAST PAUSE FUNCTION TO CLEAR
          PAUSE 
          ENDIF 
  
          IFEQ   NOSBE,1,1
          RJM    R.RAFL 
          UJN    RACMX       EXIT 
  
          TITLE  REQUEST I/O CHANNEL FROM THE OS
**        RCHAN - REQUEST I/O CHANNEL FROM THE OPERATING SYSTEM.
* 
*         REQUEST  I/O  CHANNEL  FROM THE OPERATING SYSTEM IF IT IS NOT 
*         ALREADY ASSIGNED. CHFLG IS SET TO INDICATE THAT  THE  CHANNEL 
*         IS ASSIGNED.
* 
*         IF  THE CHANNEL IS ALREADY ASSIGNED, A TEST IS MADE TO SEE IF 
*         THERE IS AN OUTSTANDING REQUEST FOR OUR CHANNEL. IF SO, IT IS 
*         DROPPED,  A  50 MSEC DELAY OCCURS, AND IT IS REQUESTED AGAIN. 
* 
*         IF RCHAN IS CALLED WHILE THE CHANNEL IS ASSIGNED, THE CHANNEL 
*         AND  I/O  DEVICE  MUST  BE  IN  A  STATE TO BE DROPPED TO THE 
*         SYSTEM. 
* 
*         ENTRY- NONE 
* 
*         EXIT - CH IS ASSIGNED AND THE CALLING ROUTINE IS ENTERED. 
*                ABORT IF REQUESTED CHANNEL IS DOWN 
* 
*         USES - D.Z1-D.Z5, D.T1, D.T4, DFLAG 
* 
*         CALLS- DCHAN, R.RCH, RACM, TFL, R.TAFL. 
* 
 RCHANX   LJM    ** 
 RCHAN    EQU    *-1
  
          LDM    CHFLG
          NJN    RCH1        IF CHANNEL IS ASSIGNED 
          RJM    DCHAN       PAUSE AND CHECK ERROR/DROP FLAGS 
          UJN    RCH6        GET CHANNEL AND EXIT 
  
 RCH1     LDC    ** 
 RCH2     EQU    *-1         ADDRESS OF CH REQUEST WORD STORED HERE 
          CRD    D.Z1 
 RCH3     LDD    D.Z1        WORD TO LOAD IS STORED HERE
 RCH4     SHN    7           SHIFT COUNT IS STORED HERE TO PUT BIT IN 0 
 RCH5     LPN    1           *** IF SHARE SET TO 0
*         LDN    1           *** IF SHARE SET TO NON ZERO 
          STM    DFLAG       SET DFLAG IF ACTIVE REQUEST, CLEAR IF NONE 
          RJM    DCHAN       DROP CHANNEL IF IT IS BEING REQUESTED
          LDC    ** 
 CHFLG    EQU    *-1         HAVE CHANNEL FLAG
          NJN    RCHANX      IF CHANNEL IS STILL ASSIGNED, EXIT 
 RCH6     LDC    ** 
 CHAN     EQU    *-1         I/O CHANNEL OF THE DEVICE ASSIGNED 
  
          IFEQ   NOS,1
          STD    D.T1 
 RCH6A    MONITOR CCHM       CHECK CHANNEL
          LDD    D.T1 
          LPN    40B
          ZJN    RCH6B       IF CHANNEL DOWN
          LDC    CHERR       ERROR MESSAGE TO POST
          LJM    ABRTIDL     DROP THE PPU 
  
 RCH6B    LDD    D.T2 
          NJN    RCH6C       CHANNEL ASSIGNED TO WLD
          RJM    DCHAN       PAUSE FOR RELOCATION 
          UJN    RCH6        TEST AGAIN FOR CHANNEL ASSIGNED
          ENDIF 
  
          IFEQ   NOSBE,1,1
          RJM    R.RCH
  
 RCH6C    LDD    ES 
          LPC    SBF
          ZJN    RCH7        IF STANDBY PP OPTION OFF 
          RJM    RACM 
          LDM    CHAN 
          ADN    40B
          STD    D.T4        STORE CHANNEL INTO BYTE 4
          LDC    RA.SBPOR 
 P.SBPOR  EQU    *-1
          RJM    TFL         FORM AND VERIFY REAL MEMORY ADDRESS
          CWD    D.T0        SET HAVE CHANNEL FLAG FOR SBP
  
          IFEQ   NOSBE,1,1
          RJM    R.TAFL      TERMINATE CM FIELD ACCESS
  
 RCH7     AOM    CHFLG       SET HAVE CHANNEL FLAG
          LJM    RCHANX 
  
          IFEQ   NOS,1
 CHERR    DIS    ,*WLD CH IN USE* 
          ENDIF 
  
          TITLE  REQUEST CPU ASSISTANCE 
**        REQ - REQUEST CPU ASSISTANCE. 
* 
*         COMMUNICATE  REQUEST  TO  CPU EXECUTIVE AND WAIT FOR IT TO BE 
*         HONORED. FOR ALL REQUESTS EXCEPT *SYS*  WHILE  CHAINING,  THE 
*         PPU IS CHECKPOINTED, THE REQUEST WRITTEN TO THE EXEC, AND THE 
*         PPU IS DROPPED. 
* 
*         ENTRY- (A) = FUNCTION CODE
*                (REQP+1) - (REQP+4) = FUNCTION PARAMETERS
* 
*         EXIT - TO CALLING ROUTINE IF THE FUNCTION IS  ACCEPTED.  THE
*                CONTENTS  OF  REQP+1  THRU  REQP+4  CONTAIN EXECUTIVE
*                RESPONSES TO THE REQUESTED FUNCTION (IF ANY) 
* 
*                TO LOADED MODULE VIA EXI1 AFTER COMPLETION OF
*                INITIALIZATION IF EXECUTIVE START FUNCTION RECEIVED. 
* 
*         USES - REQP-REQP+4, ES, RT
* 
*         CALLS- CKP, RACM, RELEASE, R.TAFL, TFL, RPD, RSW. 
* 
 XREQ     LJM    ** 
 REQ      EQU    *-1
  
          STM    REQP        SAVE FUNCTION CODE 
          SBN    F.SYS
          NJN    REQ1        IF NOT *SYS* REQUEST 
          LDC    ** 
 CHAIN    EQU    *-1         CHAINING IN PROGRESS FLAG
          ZJN    REQ1        IF CHAINING NOT IN PROGRESS
          LDC    4000B
          RAM    REQP        NOTIFY EXECUTIVE PP IS NOT DROPPED 
          UJN    REQ3 
  
 REQ1     LDM    CHFLG
          ZJN    REQ2        IF CHANNEL NOT ASSIGNED
          LCN    0           SET ABORT ADDRESS TO INDICATE BD REQUEST 
          RJM    RELEASE     RELEASE I/O DEVICE AND I/O CHANNEL 
 REQ2     RJM    RACM        REQUEST ACCESS TO CM AND PAUSE 
          LDC    REQ4 
          STM    DCHAN       SAVE CHECKPOINT ADDRESS
          RJM    CKP         CHECKPOINT THE PPU 
 REQ3     RJM    RACM        REQUEST ACCESS TO CM AND PAUSE 
          LDC    RA.OR
 P.OR     EQU    *-1         POINTER TO CPU OUTPUT REGISTER STORED HERE 
          RJM    TFL         FORM AND VERIFY REAL MEMORY ADDRESS
          CWM    REQP,D.PPONE    WRITE REQUEST TO OUTPUT REGISTER 
          LDM    REQP 
          SHN    21B-13B
          MJN    REQ4        IF PP NOT BEING DROPPED
 REQ2A    LJM    DROPIDL     DROP THE PPU 
  
*         CONTROL IS TRANSFERRED HERE AT THE TERMINATION OF THE WLD 
*         INITIALIZATION PROCESS.  THE REQUESTED MODULE WILL NOW BE 
*         LOADED INTO THE INSTRUCTION STACK AND THE CONTENTS OF THE 
*         RESUME FLAG WILL DETERMINE WHETHER THE LOADED MODULE IS TO
*         BEGIN AT ITS FIRST EXECUTABLE STATEMENT OR RESUMED AT SOME
*         SPECIFIED RE-ENTRY POINT.  THE HANDOFF CONDITIONS ARE.. 
*                (A)    = CM ADDRESS OF MODULE TO BE LOADED 
*                (D.Z1) = PP ADDRESS TO WHICH MODULE WILL BE LOADED 
*                (D.Z2) = MODULE LENGTH IN CM WORDS 
  
 REQ2B    RJM    RPD         READ INSTRUCTION STACK 
  
          IFEQ   NOSBE,1,1
          RJM    R.TAFL      TERMINATE ACCESS TO CM 
  
          LDC    00 
 RESUME   EQU    *-1         *** LDC 0000 IF START REQUEST PROCESSING** 
*         LDC    77          *** LDC 0077 IF RESUME REQUEST IN PROGRESS 
          NJN    REQ2C       IF RESUME REQUEST
          LJM    EXI1        START EXECUTION USING A FAKE EXIT
  
 REQ2C    LJM    DCHANX      RESUME 
  
 REQ4     RJM    RACM        REQUEST ACCESS TO CM AND PAUSE 
          LDD    D.T0+1 
          ZJN    REQ7        IF NO ERROR FLAGS SET
 REQ5     LCN    0           SET ABORT ADDRESS TO INDICATE BD REQUEST 
          RJM    RELEASE     ENTER RELEASE ROUTINE
          UJN    REQ2A       DROP PPU (SHOULD NOT RETURN FROM DCHAN)
  
 REQ7     LDM    P.OR        POINTER TO OUTPUT REGISTER 
          RJM    TFL         FORM AND VERIFY REAL MEMORY ADDRESS
          CRM    REQP,D.PPONE  READ CPU RESPONSE TO REQUEST 
          LDM    REQP 
          NJN    REQ4        IF NOT HONORED BY THE EXEC YET 
          RJM    RSW         READ DIAGNOSTIC AND EXECUTIVE SWITCHES 
          LDD    ES          LOAD EXECUTIVE SWITCHES
          LPN    DF+CF       DROP FLAG OR CHECKPOINT FLAG 
          ZJN    REQ8        IF NO DROP FLAG OR CHECKPOINT FLAG 
          LPN    CF 
          ZJN    REQ5        IF DROP FLAG NOT SET 
  
          LDM    CHFLG
          NJN    REQ8        CHANNEL ASSIGNED DO NOT SET TIME LIMIT 
  
          LDC    7777B
          STD    RT          FORCE 4 SECOND TIMEOUT FOR RNI ROUTINE 
 REQ8     EQU    *
  
          IFEQ   NOSBE,1,1
          RJM    R.TAFL      TERMINATE ACCESS TO CM 
  
          LJM    XREQ        IF ACCEPTED
  
          TITLE  READ PACKED DATA 
**        RPD - READ PACKED DATA
* 
*         READS 16-BIT PP DATA, 3 WORDS PER CM WORD (LOWER
*         48 BITS), FROM CENTRAL MEMORY TO PP MEMORY. 
*         ALL TRANSFERS ARE IN MULTIPLES OF 3 PP WORDS. 
* 
*         ENTRY- (A)    = ADDRESS OF CENTRAL MEMORY BUFFER
*                (D.Z1) = ADDRESS OF PP BUFFER
*                (D.Z2) = NUMBER OF CM WORDS TO TRANSFER
* 
*         EXIT - DATA TRANSFERRED TO PP MEMORY BUFFER 
* 
*         USES - D.Z1 - D.T1
* 
*         CALLS- TBP
* 
 RPDX     LJM    ** 
 RPD      EQU    *-1         ENTRY/EXIT 
  
          RJM    TBP         TEST AND RESET BUFFER POINTERS 
          ZJN    RPDX        IF ZERO LENGTH TRANSFER SPECIFIED
          LDM    RPD
          STD    D.T1        SAVE RETURN ADDRESS
 RPD1     LDD    D.Z3        LOAD CENTRAL MEMORY ADDRESS
          SHN    12 
          ADD    D.Z4 
          CRDL   D.Z5        READ ONE CENTRAL MEMORY WORD 
          SBN    1           FORM NEXT CENTRAL MEMORY ADDRESS TO READ 
          STD    D.Z4 
          SHN    -12
          STD    D.Z3 
          LDDL   D.T0        FOURTH 16-BIT PARCEL OF CM WORD
          STIL   D.Z1 
          SODL   D.Z1 
          LDDL   D.Z7        THIRD 16-BIT PARCEL OF CM WORD 
          STIL   D.Z1 
          SODL   D.Z1 
          LDDL   D.Z6        SECOND 16-BIT PARCEL OF CM WORD
          STIL   D.Z1 
          SODL   D.Z1 
          SODL   D.Z2        DECREMENT CM WORD COUNT
          NJN    RPD1        IF MORE WORDS TO TRANSFER
          LJM    0,D.T1      TRANSFER COMPLETE
  
          TITLE  READ EXECUTIVE AND DIAGNOSTIC SWITCHES 
**        RSW - READ EXECUTIVE AND DIAGNOSTIC SWITCHES
* 
*         READS THE CURRENT VALUES OF THE EXECUTIVE AND DIAGNOSTIC
*         IN THE COMMUNICATIONS BLOCK AND SETS THEM IN THE EXECUTIVE
*         AND DIAGNOSTIC SWITCH REGISTERS 
* 
*         ENTRY- CENTRAL MEMORY ACCESS HAS BEEN ESTABLISHED 
* 
*         EXIT - (ES) = CURRENT EXECUTIVE SWITCH VALUES 
*                (DS) = CURRENT DIAGNOSTIC SWITCH VALUES
* 
*         USES - D.Z1 - D.Z5, ES, DS
* 
*         CALLS- TFL
* 
 RSWX     LJM    ** 
 RSW      EQU    *-1
  
          LDC    RA.DS
 P.DS     EQU    *-1         POINTER TO DS REGISTERS
          RJM    TFL         FORM AND VERIFY REAL MEMORY ADDRESS
          CRD    D.Z1 
          LDD    D.Z5 
          STM    DS          SET DIAGNOSTIC SWITCHES REGISTER 
          LDC    RA.IR
 P.IR     EQU    *-1         POINTER TO INPUT REGISTER IS STORED HERE 
          RJM    TFL         FORM AND VERIFY REAL MEMORY ADDRESS
          CRD    D.Z1 
          LDD    D.Z5 
          STD    ES          SET EXECUTIVE SWITCHES REGISTER
          UJN    RSWX        RETURN 
  
          TITLE  DETERMINE SCRATCH BUFFER WORD COUNT
**        SYSDIV - DETERMINE SCRATCH BUFFER WORD COUNT
* 
*         DETERMINE THE NUMBER OF CM WORDS OF THE SCRATCH FILE
*         BUFFER WHICH WILL BE REQUIRED TO TRANSFER THE SPECIFIED 
*         NUMBER OF PP WORDS
* 
*         ENTRY- (A) = PP WORD COUNT
* 
*         EXIT - (A) = SYSDA = REQP+2 = THE LENGTH OF THE SCRATCH 
*                FILE BUFFER OR THE NUMBER OF CM WORDS REQUIRED TO
*                CONTAIN THE SPECIFIED NUMBER OF PP WORDS, WHICHEVER
*                IS LESS. 
* 
*         USES - D.Z1, REQP+2, SYSDA. 
* 
*         CALLS- NONE 
* 
 SYSDIVX  LJM    ** 
 SYSDIV   EQU    *-1
  
          STD    D.Z1 
          ZJN    SYSD3       IF WORD COUNT EQUALS ZERO
          SBN    1
          STM    SYSDA       SAVE BUFFER LENGTH - 1 
          LDN    1
          STD    D.Z1 
 SYSD1    LCN    4           DIVIDE BY 4
          RAM    SYSDA
          MJN    SYSD2
          AOD    D.Z1 
          ADC    0-L.IPIBU
          MJN    SYSD1       IF MAXIMUM NOT REACHED 
 SYSD2    LDD    D.Z1        SAVE WORD COUNT
 SYSD3    STM    SYSDA
          STM    REQP+2      SET WORD COUNT IN EXEC CALL
          UJN    SYSDIVX
  
 SYSDA    BSS    1           DIVIDE SUBROUTINE RESULT STORAGE CELL
  
          TITLE  TEST AND RESET BUFFER POINTERS 
**        TBP - TEST AND RESET BUFFER POINTERS
* 
*         TESTS THE POINTERS ASSOCIATED WITH A DATA TRANSFER
*         BETWEEN PP MEMORY AND CM MEMORY TO VERIFY THE CM
*         FIELD LENGTH IS NOT EXCEEDED AND PP WRAP AROUND WILL
*         NOT OCCUR.  THE POINTERS ARE THEN RESET TO PERMIT A 
*         TOP DOWN TRANSFER OF DATA BETWEEN THE BUFFERS.
* 
*         ENTRY- (A) = FWA OF CM BUFFER 
*                (D.Z1) = FWA OF PP BUFFER
*                (D.Z2) = NUMBER OF CM WORDS TO BE TRANSFERRED
* 
*         EXIT - IF (A) = 0, ZERO LENGTH TRANSFER SPECIFIED 
*                ELSE,
*                (A) = (D.Z1) = PP BUFFER LWA 
*                (D.Z2) = NUMBER OF CM WORDS TO BE TRANSFERRED
*                (D.Z3/D.Z4) = CM ADDRESS FOR FIRST TOP DOWN TRANSFER 
* 
*                EXITS TO ABORT IF PP ADDRESS WRAP AROUND OCCURS
* 
*         USES - D.Z1 - D.Z4
* 
*         CALLS- TFL
* 
 TBPX     LJM    ** 
 TBP      EQU    *-1         ENTRY/EXIT 
  
          ADD    D.Z2 
          SBN    1           FORM CM BUFFER LWA 
          RJM    TFL         FORM AND VERIFY REAL MEMORY ADDRESS
          STD    D.Z4        STORE ABSOLUTE ADDRESS OF BUFFER LWA 
          SHN    -12
          STD    D.Z3 
          LDD    D.Z2 
          ZJN    TBPX        IF ZERO LENGTH TRANSFER
          SHN    1
          ADD    D.Z2        LENGTH OF TRANSFER IN PP WORDS 
          SBN    1
          RADL   D.Z1        FORM PP LWA
          SHN    -13
          NJN    TBP1        IF PP MEMORY SIZE EXCEEDED 
          LDDL   D.Z1        PP BUFFER LWA
          UJN    TBPX 
  
 TBP1     LDC    BD.BIER     BUFFER LENGTH ERROR
          LJM    ABT
  
          TITLE  TEST BUFFER REFERENCE
**        TESTBR - TEST BUFFER REFERENCE. 
* 
*         VERIFY BUFFER REFERENCES ARE IN RANGE OF THE INPUT AND OUTPUT 
*         BUFFERS.
* 
*         ENTRY- (D.T0) = BUFFER FWA. 
*                (D.T1) = NUMBER OF WORDS THAT WILL BE REFERENCED.
* 
*         EXIT - EXIT IF VALUES ARE IN RANGE. 
* 
*         USES - NONE.
* 
*         CALLS- TESTBI 
* 
 TESTBRX  LJM    **          ENTRY/EXIT 
 TESTBR   EQU    *-1
  
          LDDL   D.T0 
          RJM    XTESTBI+1   TEST FWA OF DATA REFERENCE 
          LDDL   D.T0 
          ADD    D.T1 
          SBN    1
          RJM    XTESTBI+1   TEST LWA OF DATA REFERENCE 
          UJN    TESTBRX
  
          TITLE  TEST ADDRESS IN FL 
**        TFL - TEST ADDRESS IN FL. 
* 
*         TEST ADDRESS (A) FOR BEING WITHIN FIELD LENGTH. 
* 
*         ENTRY- (A) = RELATIVE ADDRESS.
* 
*         EXIT - (A) = RELATIVE ADDRESS + D.RA IF IN RANGE
*                JUMP TO ABT IF OUT OF RANGE. 
* 
*         USES - D.Z0.
* 
*         CALLS- NONE 
* 
 TFL1     LDD    D.RA 
          SHN    6
          ADDL   D.Z0 
  
 TFLX     LJM    **          ENTRY/EXIT 
 TFL      EQU    *-1
  
          STDL   D.Z0        SAVE ADDRESS 
          SHN    -6 
          SBD    D.FL 
          MJN    TFL1        IF IN RANGE
          LDN    BD.FLER     ABORT MODULE DUE TO FIELD LENGTH ERROR 
          LJM    ABT         ABORT
  
          TITLE  WRITE PACKED DATA
**        WPD - WRITE PACKED DATA 
* 
*         WRITES 16-BIT PP DATA, 3 WORDS PER CM WORD (LOWER 
*         48 BITS), FROM PP MEMORY TO CENTRAL MEMORY. 
*         THE HIGH ORDER BITS OF EACH CM WORD ARE ZERO. 
* 
*         ENTRY- (A) = ADDRESS OF CENTRAL MEMORY BUFFER 
*                (D.Z1) = ADDRESS OF PP DATA
*                (D.Z2) = NUMBER OF CM WORDS TO TRANSFER
* 
*         EXIT - DATA TRANSFERRED TO CENTRAL MEMORY BUFFER
* 
*         USES - D.Z3, D.Z4 
* 
*         CALLS- TBP
* 
 WPDX     LJM    ** 
 WPD      EQU    *-1
  
          RJM    TBP         TEST AND RESET BUFFER POINTERS 
          ZJN    WPDX        IF ZERO LENGTH TRANSFER SPECIFIED
          STML   WPD3        SET PP LWA FOR DATA TRANSFER 
 WPD2     LCN    3
          RAML   WPD3        SET FWA FOR NEXT 64-BIT CM TRANSFER
          LDD    D.PPMSG     USE PP MESSAGE BUFFER AS CM SCRATCH
          CWML   **,D.PPONE  WRITE 4 16-BIT BYTES 
 WPD3     EQU    *-1
          SBN    1           RESTORE PP MESSAGE BUFFER ADDRESS
          CRM    WPDBUFF,D.PPONE  READ BACK 5 12-BIT BYTES
          LDN    0
          STM    WPDBUFF     CLEAR UNDEFINED DATA BYTE
          LDD    D.Z3 
          SHN    12 
          ADD    D.Z4        FORM CM ADDRESS
          CWM    WPDBUFF,D.PPONE  WRITE ONE WORD
          SBN    2
          STD    D.Z4        SET NEXT CM ADDRESS
          SHN    -12
          STD    D.Z3 
          SOD    D.Z2 
          NJN    WPD2        IF MORE WORDS TO WRITE 
          UJN    WPDX        IF DATA TRANSFER COMPLETE
  
 WPDBUFF  BSSZ   5           PP TO CM WRITE BUFFER
  
          TITLE  WLD PRODUCT OVERLAY INTERFACE DEFINITIONS
 CCODE    BSSZ   1           DEVICE CONNECT CODE
 P.POMB   CON    RA.POMB     POINTER TO PRODUCT OVERLAY MESSAGES BUFFER 
 P.MB     CON    RA.MB       POINTER TO MESSAGE BUFFER STORED HERE
 TYPE     DATA   7777B       DEVICE TYPE ASSIGNED (SET TO ILLEGAL TYPE) 
 SPEED    DATA   2           SPEED OF PPU 2=2X,1=4X 
 SHARE    DATA   2           2=DO NOT SHARE MAINFRAMES 0=SHARE MAIN.
 REQP     BSSZ   5           5 WORDS USED FOR CPU REQUESTS BY REQ 
  
          ERRPL  *-DS-1      IF CODE OVERFLOWS INTO REGISTER AREA 
  
*         EQUATES FOR THE BASIC DRIVER INTO THE PRODUCT OVERLAYS. 
  
 DS       EQU    4460B       DIAGNOSTIC SWITCHES
 P0       EQU    4461B       PARAMETER REGISTER P0
 P1       EQU    4462B       PARAMETER REGISTER P1
 P2       EQU    4463B       PARAMETER REGISTER P2
 P3       EQU    4464B       PARAMETER REGISTER P3
 P4       EQU    4465B       PARAMETER REGISTER P4
 P5       EQU    4466B       PARAMETER REGISTER P5
 P6       EQU    4467B       PARAMETER REGISTER P6
 P7       EQU    4470B       PARAMETER REGISTER P7
 P8       EQU    4471B       PARAMETER REGISTER P8
 P9       EQU    4472B       PARAMETER REGISTER P9
  
 POVLA    EQU    DRIVER+LDRIVER 
 POVL     EQU    POVLA+1     ENTRY POINT OF PRODUCT OVERLAY 
 IBFWA    EQU    POVL+3      ADDRESS OF IB FWA
 OBFWA    EQU    IBFWA+1     ADDRESS OF OB FWA
 SBFWA    EQU    OBFWA+1     ADDRESS OF SB FWA
 IBWL     EQU    SBFWA+1     LENGTH OF IB 
 OBWL     EQU    IBWL+1      LENGTH OF OB 
 SBWL     EQU    OBWL+1      LENGTH OF SB 
 VER      EQU    SBWL+1      ADDRESS OF PRODUCT OVERLAY VERSION NUMBER
 RELEASE  EQU    VER+2       ENTRY POINT FOR THE P.O. RELEASE ROUTINE 
 RESERVE  EQU    RELEASE+4   ENTRY POINT FOR THE P.O. RESERVE ROUTINE 
  
*         EQUATES FOR BASIC DRIVER ERROR MESSAGES IN PRODUCT OVERLAY. 
  
 BD.FLER  EQU    1           ORD.0, EC 1 - ADDRESS OUT OF FIELD LENGTH
 BD.TLER  EQU    102B        ORD.1, EC 2 - 2 SECOND TIME LIMIT ERROR
 BD.SEER  EQU    203B        ORD.2, EC 3 - SUBROUTINE ENTRY/EXIT ERROR
 BD.BIER  EQU    304B        ORD.3, EC 4 - BUFFER REF. OR WC ERROR
 BD.RES   EQU    405B        RESERVED FOR BASIC DRIVER
 BD.RES1  EQU    506B        RESERVED FOR BASIC DRIVER
 BD.RES2  EQU    607B        RESERVED FOR BASIC DRIVER
  
*         EQUATES FOR THE PRODUCT OVERLAYS INTO THE BASIC DRIVER. 
  
 BD.AL    EQU    AL          MODULE ACCESS LEVEL
 BD.AL21  EQU    21B         ACCESS LEVEL FOR NO CHAN CLEANUP 
 BD.ABT   EQU    ABT1        ABORT MODULE ENTRY POINT 
 BD.CHAIN EQU    CHAIN       CHAINING IN PROGRESS FLAG
 BD.CHAN  EQU    CHAN        ASSIGNED CHANNEL 
 BD.CHFG  EQU    CHFLG       CHANNEL RESERVED FLAG
 BD.DCH   EQU    DCHAN       DROP CHANNEL 
 BD.DLYCH EQU    DLYDCH      DISCONNECT CHANNEL MSEC DELAY COUNT
 BD.DREQ  EQU    F.DROP      EXECUTIVE DROP REQUEST 
 BD.ERR   EQU    ERR         ISSUE ERROR MESSAGE ENTRY POINT
 BD.EQ    EQU    CCODE       DEVICE CONNECT CODE
 BD.IPIBU EQU    P.IPIBU     ADDRESS OF IPI DATA BUFFER 
 BD.MSGA  EQU    P.POMB      ADDRESS OF P.O. MESSAGE BUFFER 
 BD.MSGML EQU    3           MAXIMUM LENGTH OF P.O. MSGS IN CM WORDS
 BD.MSGMN EQU    L.POMB/BD.MSGML MAXIMUM NUMBER OF P.O. MSGS ALLOWED
 BD.PORT  EQU    SN+2        POINTER TO IPI CHANNEL PORT
 BD.RCH   EQU    RCHAN       RESERVE CHANNEL
 BD.RCH5  EQU    RCH5        SHARE MAINFRAME INSTRUCTION MODIFICATION 
 BD.REQ   EQU    REQ         EXECUTIVE REQUEST PROCESSOR ENTRY POINT
 BD.REQP  EQU    REQP        EXECUTIVE REQUEST PROCESSOR PARAMETERS 
 BD.RNI   EQU    RNI         ADVANCE PROGRAM ADDRESS
 BD.SHARE EQU    SHARE       SHARED DEVICE FLAG 
 BD.SN    EQU    SN+3        POINTER TO DISK PACK SERIAL NUMBER 
 BD.SPEED EQU    SPEED       FLAG WORD CONTAINING PPU SPEED 1=4X 2=2X 
 BD.TEST  EQU    TESTBR      VERIFY BUFFER REFERENCE IN RANGE OF IB/OB
 BD.TFL   EQU    ITFL        INITIALIZATION TEST FIELD LENGTH 
 BD.TYPE  EQU    TYPE        DEVICE TYPE FOR LOW LEVEL I/O
 BD.USER  EQU    DRIVER      LWA+1 OF USER STACK
 BD.VERS  EQU    VERS        DRIVER VERSION NUMBER
 BD.XSYS  EQU    XSYS+1      DRIVER VERSION NUMBER
  
          BSSZ   POVLA-*     FORCE ADDRESS TABLE BEYOND REGISTER AREA 
  
          SPACE  2
**        THE FOLLOWING TABLES CONTAIN THE ADDRESSES OF INSTRUCTIONS
*         WHICH REQUIRE MODIFICATION BEFORE THEY ARE EXECUTED.
          SPACE  2
          TITLE  WLD PRODUCT OVERLAYS 
*IF,DEF,CM3DM,2 
          LIST   X
*CALL,IFSD
*IF,DEF,DASDM,2 
          LIST   X
*CALL,DDAS
          END 
