          EJECT
*         CTEXT  CTP$DFT_NON_930_RESIDENT_II
*         IF HCM$ IS DEFINED ALL CPUS WILL BE HALTED BEFORE A MEMORY WRITE IS
*         PERFORMED.
 TIM      SPACE  4,10
**        TIM - MAINTAIN MILLISECOND TIME AND EXECUTE TIMED ROUTINES.
*
*         *TIM* USES THE CHANNEL 14 CLOCK TO ALLOW THE EXECUTION OF
*         CERTAIN ROUTINES ON A TIMED BASIS.  THE ROUTINES TO BE
*         ACTIVATED PERIODICALLY ARE IN *ACTB*.  TO ENSURE ACCURACY,
*         *TIM* SHOULD BE CALLED AT LEAST EVERY TWO MILLISECONDS.
*         *TIMA* SHOULD BE INITIALIZED BEFORE THE FIRST CALL TO *TIM*.
*
*         EXIT   (TIMA) IS WITHIN ONE MILLISECOND OF CHANNEL 14 VALUE.
*
*         USES   T1, T7.
*
*         CALLS  SEE *ACTB*.
*
*         NOTE   CHANGES TO THIS ROUTINE SHOULD BE MADE IN *SCI* ALSO.


 TIM      SUBR               ENTRY/EXIT
 TIM1     IAN    14          READ MICROSECOND COUNTER
 TIMC     SBM    TIMA
          PJN    TIM2        IF NO OVERFLOW
 TIMD     ADC    10000       COMPENSATE FOR CLOCK OVERFLOW
 TIM2     ADC    -1000D
          MJN    TIMX        IF LESS THAN ONE MILLISECOND ELAPSED
          LDC    1000D       ADVANCE BASE TIME BY ONE MILLISECOND
 TIME     RAM    TIMA
          AOM    TIMB        ADVANCE SCAN COUNTER
          LMN    5
          NJN    TIM1        IF SCAN PERIOD NOT UP
          STM    TIMB        RESET SCAN COUNTER
          LDC    ACTB        PRESET ACTION ENTRY
          STD    T7
          STM    TIMF
 TIM3     AOM    2,T7        ADVANCE ENTRY COUNTER
          SBM    1,T7
          MJN    TIM4        IF DELAY NOT COMPLETE
          LDN    0
          STM    2,T7        RESET COUNTER
          LDI    T7          CALL SPECIFIED ROUTINE
          STD    T1
          RJM    0,T1
 TIM4     LDN    3           ADVANCE TABLE INDEX
          RAM    TIMF
          STD    T7
          LMC    ACTBL
          NJN    TIM3        IF MORE ENTRIES TO CHECK
          LJM    TIM1        RETURN

 TIMF     BSS    1           FWA OF ENTRY BEING PROCESSED
 CMP      SPACE  4,10
**        CMP - CHECK MEMORY PORT.
*
*         ENTRY  (RDATA) = MEMORY *EC* REGISTER.
*                (HBUF) = PROCESSOR INFORMATION.
*
*         EXIT   (A) = 0, IF CPU MEMORY PORT ENABLED.
*                    > 0, IF CPU MEMORY PORT DISABLED.


 CMP      SUBR               ENTRY/EXIT
          LDC    SHNI+4+3    GENERATE SHIFT INSTRUCTION
          SBM    HBUF+CPRPORT
          STM    CMPB
          LDN    1
 CMPB     SHN    4+**
          STM    CMPC
          LDM    RDATA,PO
          LPC    **          EXTRACT CPU PORT DISABLE BIT
 CMPC     EQU    *-1
          UJN    CMPX        RETURN
 DBC      SPACE  4,10                                                                                                              *
**        DBC - DISABLE BOUNDS CHECKING.
*
*         ENTRY  MEMORY BOUNDS ENABLED ON CERTAIN PORTS.
*
*         EXIT   MEMORY BOUNDS CHECKING DISABLED ON ALL PORTS.
*                (MBPS) = SAVED PORT SELECT VALUE.
*
*         MACROS LOCKMR, READMR, WRITMR.


 DBC      SUBR               ENTRY/EXIT
          IF     DEF,HCM$
          RJM    HAC         HALT ALL CPUS
          ENDIF
          LOCKMR SET
          READMR RDATA,CMCC,MBRG
          LDM    RDATA
          STM    MBPS        SAVE PORT SELECT
          LDN    0
          STM    RDATA       DISABLE ALL PORTS
          WRITMR RDATA,CMCC,MBRG
 DBC0     LOCKMR CLEAR
          IF     DEF,HCM$
          LDN    0
          RJM    SAC         START ALL CPUS
          ENDIF
          LJM    DBCX        RETURN
 EBC      SPACE  4,10
**        EBC - ENABLE BOUNDS CHECKING
*
*         ENTRY  MEMORY BOUNDS DISABLED.
*                (MBPS) = SAVED PORT SELECT.
*
*         EXIT   MEMORY BOUNDS RESTORED TO PREVIOUS VALUE.
*
*         MACROS LOCKMR, READMR, WRITMR.


 EBC      SUBR               ENTRY/EXIT
          IF     DEF,HCM$
          RJM    HAC         HALT ALL CPUS
          ENDIF
          LOCKMR SET
          READMR RDATA,CMCC,MBRG
          LDM    MBPS
          STM    RDATA       RESTORE PORT SELECT
          WRITMR RDATA,CMCC,MBRG
 EBC0     LOCKMR CLEAR
          IF     DEF,HCM$
          LDN    0
          RJM    SAC         START ALL CPUS
          ENDIF
          LJM    EBCX        RETURN

*         END    CTP$DFT_NON_930_RESIDENT_II
