Trailing-Edge
-
PDP-10 Archives
-
BB-FP64A-SB_1986
-
10,7/rmtcon/rmtcom.mac
There are 3 other files named rmtcom.mac in the archive. Click here to see a list.
SUBTTL RMTCOM Test Routines Module
SEARCH RMTCOT ;Load RMTCON defs
TTITLE (RMTCOM,\DECVER,\VEDIT,Test Routines)
;COPYRIGHT 1985
;LARGE SYSTEMS DIAGNOSTICS GROUP
;DIGITAL EQUIPMENT CORPORATION
;MARLBORO, MASS. 01752
;
; Author: Gary Papazian
;Update Author: Gregory A. Scott
SEARCH MONSYM,MACSYM,UUOSYM,GLXMAC ;Load universals
PROLOG (RMTCOP) ;Set GLXLIB symbols and macros
NOSYM ;No symbol table dump
SALL ;Suppress macro exps
.DIREC FLBLST ;First line binary listing only plesae
;External routines found in RMTCOP
EXTERN PCRLF,SOUT%%,BOUT%%,TAKCHR,TOPLVL
;External data found in RMTCOP
EXTERN MONTYP,TAKIFN
;Routines found in RMTCOM
INTERN RRID,$REMOT,RRCT,CTSAVE,SALLAD
INTERN CTRSTR,RCADR
;Data found in RMTCOM
INTERN TRCFLG,SPRFLG,DBGFLG,RRIFLG,TTEXIT,PRTNBR,LEVTAB,CHNTAB
INTERN TARADH,TARADL,NODADH,NODADL,PWORDH,PWORDL
SUBTTL Remote Terminal Operation
;* $REMOTE subroutine - Entered from "CONNECT" in RMTCOP.
$REMOTE:$CALL RESCON ;Go reserve (conect) node
$RET ;Cannot reserve, exit
MOVE S1,TTEXIT ;Load exit character
ADDI S1,"A"-1 ;Convert to ASCII
$TEXT (,<To disconnect & return to command mode, type a single control-^7/S1/>)
SKIPE DBGFLG ;Debug mode?
$PMSG <(debug mode)> ;yes
SETZM IBUFCT ;Init terminal input buffer char ctr
SETZM OBUFCT ;Init terminal output buffer char ctr
SETZM TTIBUF ;Clear buffers (helps debug)
MOVE S1,[TTIBUF,,TTIBUF+1] ;Source,,Dest
BLT S1,TTTEND ;Zap input and output buffers
SETZM BRKFLG ;BREAK flag
SETZM CHRFLG ;Character received flag
SETZM MNOFLG ;Msg number flag used in RCSND & RCPOL
SETZM CMDPND ;Command pending flag
$CALL SPR1 ;Diagnostic started spear entry
$CALL CTSET ;Set terminal modes for remote ops
$CALL ION ;Turn on interrupt system
$CALL INITIM ;Initialize reservation timer
MOVE T3,[POINT 8,TTIBUF] ;Init input buffer pointer
; Wait for interrupt driven system to send characters and poll remote.
SKIPE MONTYP ;Skip if a blue system
JRST REMO20 ;Its a orange system
SKIPE TAKIFN ;Are we in a take file?
$CALL TTINTR ;Yes, fake a TTY interrupt
REMO10: SETZ S1, ;Clear the AC
HIBER S1, ;Sleep forever
JFCL ;Punt error
JRST REMO10 ;Somehow we work up for no good reason
REMO20: SKIPE TAKIFN ;Are we in a take file?
$CALL TTINTR ;Yes, fake a TTY interrupt
WAIT% ;Snooze until time to exit
;Here if we got the EXIT character, reset stuff & go back to command mode
LOOPX: $CALL RELCON ;Release console
NOP ; Unsucessful release
$CALL CTRSTR ;Restore terminal parameters
$CALL IOFF ;Turn off interrupt system
$CALL SPR2 ;Diagnostic ended spear entry
$CALL PCRLF ;Output CRLF, return to Parser
JRST TOPLVL ;Reset all (avoids ?eof from COMND)
SUBTTL Terminal Input Interrupt Handler
;Input chars from the TTY send them.
;TOPS-20 character available interrupt comes here.
TTYINP: $CALL TTIN0 ;Gather input characters
$CALL TTSN0 ;Send the character
DEBRK% ;Dismiss interrupt
;Here to gather input for tty into TTIBUF for TOPS-20.
TTIN0: $SAVE <S1,S2> ;Save some ac's
$CALL TAKCHR ;Get a character from take file
JUMPT TTIN8 ;Jump if we got one
TTIN7: MOVEI S1,.PRIIN ;TTY source designation
SIBE% ;TTY input buffer empty?
JRST TTIN2 ; no, get character
JRST TTINX ;yes, dismiss interrupt
TTIN2: MOVE S1,TTYJFN ;Load terminal JFN
BIN% ;Byte INput
ERCAL [$TEXT (,<? Error reading from terminal: ^E/[-1]/>)
$RET] ;Badness happened
MOVE S1,S2 ;Copy character back to S1
TTIN8: CAME S1,TTEXIT ;Match exit character ?
JRST TTIN1 ; no, continue
MOVSI S2,(1B5) ;Load user mode bit
IORM S2,@LEVTAB+TTYLEV-1 ;Break out of the WAIT JSYS
JRST TTINX ;Exit the routine
TTIN1: CAIE S1,"B"-100 ;Control-B ?
JRST TTIN6 ;Nope
SETOM BRKFLG ;Yes, set flag for use in RCSND
SETOM CHRFLG ;Need a character transmitted please
JRST TTINX ;Exit the routine
TTIN6: $CALL TTSTOR ;Store that character please
SKIPN TAKIFN ;Are we in a take file?
JRST TTIN7 ;No, see if tty buffer empty
TTINX: $RET ;Return
;Here on a ^C
;(12)CCCINT: $CALL CCCIN0 ;Load the character
;(12) $CALL TTSN0 ;Send it
;(12) DEBRK% ;Dismiss interrupt
;TOPS-10 character available interrupt comes here.
TTYI10: $CALL TTYIN0 ;Gather input
$CALL TTSN0 ;Send the character(s)
DEBRK. ;Dismiss interrupt
;Here to gather input for tty into TTIBUF for TOPS-10.
TTYIN0: $SAVE <S1,S2> ;Save ACs
TTYIN1: $CALL TAKCHR ;Get a character from take file
JUMPT TTYIN3 ;Jump if a character seen
INCHRS S1 ;INput CHaRacter and Skip
$RET ;Return, nothing there
CAIN S1,.CHLFD ;Is it a linefeed?
JRST TTYIN1 ;Yep eat it
TTYIN3: CAME S1,TTEXIT ;Is it the exit character?
JRST TTYIN4 ;Nope
MOVE S1,[1B5+LOOPX] ;Load user mode bit and PC to go to
MOVEM S1,PIVECT+TTOFFS+.PSVOP ;Save PC to return to
$RET ;Return and dismiss
TTYIN4: CAIE S1,"B"-100 ;Control-b?
JRST TTYIN5 ;nope
SETOM BRKFLG ;Send a break
SETOM CHRFLG ;We got a character
$RET ;Return now please
TTYIN5: $CALL TTSTOR ;Store that character
SKIPN TAKIFN ;Take file?
JRST TTYIN1 ;No, loop for all tty input there
$RET ;Return
;Here for control-C interrupts
CCCI10: $CALL CCCIN0 ;Put the character in buffer
$CALL TTSN0 ;Send it
DEBRK. ;Return from interrupt
CCCIN0: $SAVE <S1> ;Save the AC
MOVEI S1,"C"-100 ;Load control-C
PJRST TTSTOR ;Store it in the buffer and return
;Routine to put the character in S1 into the input buffer.
TTSTOR: MOVE S2,IBUFCT ;Get terminal input pointers
CAMLE S2,CBUFSZ ;Pointer beyond buff size?
$STOP (IBP,<% Input buffer pointer beyond buffer length>)
IDPB S1,T3 ;Deposit byte in TTIBUF
AOS IBUFCT ;bump pointer
SETOM CHRFLG ;Character is available
$RET ;Return
;Here to fake a TTY interrupt - used to "prime the pump" and for take files.
TTINTR: SKIPN MONTYP ;Skip if tops-orange
JRST TTINT1 ;No, its tops-blue
MOVEI S1,.FHSLF ;Load self fork handle
MOVX S2,1B<TTYCHN> ;Load channel for gathering tty input
IIC% ;Initiate interrupt on that channel
$RET ;Return
TTINT1: HRROI S1,0 ;Load the code for my job <-1,,0>
PIJBI. S1, ;Start the ball rolling please
CAIA ;Error, check it out please
$RET ;Return
CAIE S1,PSJOP% ;Job has one pending?
$TEXT (,<? Can't interrupt self, error code ^O/S1/>)
$RET ;Return
;Here to send characters out to the terminal, called from terminal input
;routine and timed poll routine.
TTSN0: SKIPN CHRFLG ;Have a char?
$RET ;No, return now
TTSN1: SETZM CHRFLG ;Clear character acquired flag
SKIPE CMDPND ;Command pending now?
$RET ; Yes, wait awhile
AOS MNOFLG ;Complement msg number
SETOM CMDPND ;Set command pending
; *** MUST TRANSACT ***
$CALL RCS0 ;Send the characters out
SKIPN DBGFLG ;Debug?
$RET ;Nope, return now
SKIPN MONTYP ;Skip if TOPS-orange
JRST RCP0 ;TOPS-blue: fake interrupt handler
MOVEI S1,.FHSLF ;Invoke RCPOLL: Current process handle
MOVX S2,1B<POLCHN> ; and this channel
IIC% ;Initiate interrupt
$RET ;Return
;Here to send or resend a message. TTIBUF contains the input characters.
RCS0: $SAVE <S1,S2> ;Save ACs to use
SKIPN DBGFLG ;Debug?
JRST RCS4 ; no
MOVE T3,[POINT 8,TTIBUF] ;Yes, fake it!
MOVE T4,[POINT 8,TTOBUF]
MOVE S2,IBUFCT
MOVEM S2,OBUFCT ;For later use by RCPOLL
SKIPN IBUFCT ;Any input?
JRST RCSX ; no, dismiss interrupt
RCS2: ILDB S2,T3 ;Yes, put TTIBUF char in s2
IDPB S2,T4 ;then to TTOBUF
SOSE IBUFCT ;any chars left?
JRST RCS2 ; yes, do again
MOVE T3,[POINT 8,TTIBUF] ;No, init input buffer pointer
JRST RCSX ; & dismiss interrupt
RCS4: MOVE S2,[POINT 8,TTIBUF]
MOVE S1,IBUFCT
PUSHD <S2,S1> ;Buffer ptr & Byte Count for RCSND
$CALL RCSND ;Do Send Console Command jsys
JRST RCSX ; Error! Message already output
POPD SREQN ;Save req # (not used)
SETZM IBUFCT ;re-init byte counter
MOVE T3,[POINT 8,TTIBUF] ; & init input buffer pointer
RCSX: $RET ;Return
SUBTTL RCPOL Interrupt Handler
; Do RCPOL, put response into output buffer (TTOBUF) & display it.
RCPOLL: $CALL RCP0 ;Do the work
DEBRK% ;Dismiss interrupt
POLI10: $CALL RCP0 ;Do the work
DEBRK. ;Dismiss interrupt
RCP0: $SAVE <T1,S2,S1> ;Save some ac's
SKIPN DBGFLG ;Debug?
JRST RCP7 ; no
SETZM CMDPND ;Yes, clear flag
JRST RCP5 ; & skip RCPOLL
RCP7: SKIPN CMDPND ;Command pending?
JRST RCPX ; No, unrecognized request...exit
MOVE S2,[POINT 8,TTOBUF] ;Yes
MOVE S1,RBUFSZ ;Response buffer size
PUSHD <S2,S1> ;Buff ptr & useable buff len for RCPOL
$CALL RCPOL ;Do Console Response Poll jsys
JRST RCPX ; jsys error return
MOVE S2,RCPOLB+.LMCID ;Get flags
MOVE S1,MNOFLG ;Get Msg # flag
TRNN S1,1B35 ;Skip if should test for LM%MNO = 1
JRST RCP1 ; else test for LM%MNO = 0
TLNN S2,(LM%MNO)
JRST RCP6 ;Invoke RCSND again (must transact)
JRST RCP3
RCP1: TLNE S2,(LM%MNO)
JRST RCP6 ;Invoke RCSND again (must transact)
RCP3: SETZM CMDPND ;Clear command pending
TLNE S2,(LM%CDL)
$PMSGC (<RCPOL Status: Command Data Lost>)
TLNE S2,(LM%RDO)
$PMSGC (<RCPOL Status: Response Data Lost>)
TLNE S2,(LM%RDL)
$PMSGC (<RCPOL Status: Receive Data Lost>)
TLNE S2,^-<(LM%RDL!LM%CDL!LM%RDO!LM%MNO)>
$PMSGC (<RCPOL Status: Unknown status bits returned>)
HLRZ S2,RCPOLB+.LMRBL ;Get returned message length
MOVEM S2,OBUFCT ; & put in output buff char count
CAMLE S2,RBUFSZ ;Pointer beyond buffer size?
$PMSGC (<% Warning: RCPOLL returned message length was greater than available
response buffer size - program may be corrupted>)
JRST RCP5
; *** MUST TRANSACT ***
RCP6: $CALL RCS0 ;Repeat the send
JRST RCPX ;and exit
; Display TTOBUF
RCP5: MOVE T4,[POINT 8,TTOBUF] ;Init output buffer pointer
RCP4: SOSGE OBUFCT ;Decr & see if any chars to display?
JRST RCPX ; no, exit
ILDB S1,T4 ;Yes, put char in s1
JUMPE S1,RCP4 ;Ignore nulls
$CALL BOUT%% ;Output byte to terminal/log file
JRST RCP4 ;Loop
RCPX: SKIPE TAKIFN ;In a take file?
$CALL TTINTR ;yes, fake a tty interript
$RET ;Nope, return now please
SUBTTL Save/Restore Terminal Parameters
;Save original controlling terminal parameters
;Called from beginning of RMTCOP
CTSAVE: SKIPN MONTYP ;Skip if TOPS-20
JRST CTSAV1 ;Store TOPS-10 terminal chars
MOVEI S1,.PRIIN ;get specified terminal
RFMOD% ;get its JFN mode word
ERJMP .+1 ;Never fails
MOVEM S2,CTMOD ; & save it for restore below
RFCOC% ;Get Control Character Output Control
ERJMP .+1 ;Never fails
DMOVEM S2,CTCOC ;Save CCOC for later
MOVEI S1,.FHSLF ;Process handle
RTIW% ;Read terminal interrupt word
MOVEM S2,TTIWD ; and save it
$RET
CTSAV1: SETOM TTIWD ;Indicat this line number
GETLCH TTIWD ;Get the line characteristics
MOVE S1,[3,,S2] ;Point to arglist
MOVEI S2,.TOLCP ;Read local copy mode bit (no echo)
HRRZ T1,TTIWD ;Load UDX
TRMOP. S1, ;Or CALLI AC,116
$PMSGC (<? Can't turn off echo>)
MOVEM T2,CTMOD ;Save it to zero
$RET ;Return
;Restore original controlling terminal parameters
;Called from "QUIT" in RMTCOP
CTRSTR: SKIPN MONTYP ;Skip if TOPS-20
JRST CTRST1 ;TOPS-10
;Here to restore orange terminal parameters.
MOVEI S1,.PRIIN ;get specified terminal
MOVE S2,CTMOD ;get saved JFN mode word
SFMOD% ; restore orig program related modes
STPAR% ; restore orig device related modes
DMOVE S2,CTCOC ;get saved control char output
SFCOC% ; restore orig back
MOVEI S1,.FHSLF ;Process handle
MOVE S2,TTIWD ;Get orig terminal interr word
STIW% ; & restore orig terminal int word
SKIPE S1,TTYJFN ;Load TTY JFN
CLOSF% ;Close it
ERJMP .+1 ;Punt errors
SETZM TTYJFN ;No longer a JFN there
$RET ;Return
;Here to restore blue terminal paramaters.
CTRST1: MOVE S1,[3,,S2] ;Point to arglist
MOVEI S2,.TOSET+.TOLCP ;Local copy mode bit (no echo)
HRRZ T1,TTIWD ;Load UDX
MOVE T2,CTMOD ;Set it to zero
TRMOP. S1, ;Or CALLI AC,116
$PMSGC (<? Can't turn off echo>)
$RET ;Return
;CTSET - routine to set controling terminal up for remote console
;operation. Reset by calling CTRSTR.
CTSET: SKIPN MONTYP ;Skip if TOPS-orange
JRST CTSET1 ;TOPS-blue
;Here to set orange terminal paramters.
MOVEI S1,.PRIIN ;Specified termimal
MOVE S2,CTMOD ;Load current mode bits
TRZ S2,TT%ECO!TT%DAM ;Change to: echos off, no translation
SFMOD% ;Set program related modes
STPAR% ;Set device related modes
MOVEI S1,.FHSLF ;Process handle
MOVX S2,1B<.TICTI> ;All type in
STIW% ;Set modified terminal interr word
MOVX S1,GJ%SHT ;Short form GTJFN
HRROI S2,[ASCIZ/TTY:/] ;Device fo terminals
GTJFN% ;Get a JFN please
ERJMP CTSET2 ;Punt if error
MOVX S2,FLD(.GSIMG,OF%MOD)!OF%RD!OF%WR!FLD(7,OF%BSZ)
OPENF% ;Open terminal in image mode 7 bit
ERJMP CTSET2 ;Punt of error
HRRZM S1,TTYJFN ;Save the JFN
$RET ;Return
CTSET2: $FATAL (<Can't open terminal: ^E/[-1]/>)
;Here to set blue terminal parameters.
CTSET1: MOVE S1,[3,,S2] ;Point to arglist
MOVEI S2,.TOSET+.TOLCP ;Local copy mode bit (no echo)
HRRZ T1,TTIWD ;Load UDX
MOVEI T2,1 ;Set it to one
TRMOP. S1, ;Or CALLI AC,116
$PMSGC (<? Can't turn off echo>)
;(12) MOVE S1,TTIWD ;Get the saved line chars
;(12) TXO S1,GL.LCP ;Set local copy bit
;(12) SETLCH S1 ;Set them
;(11) OPEN TTY,[EXP UU.PHS!IO.SUP!IO.BKA,<SIXBIT/TTY/>,0] ;Open terminal
;(11) $PMSGC (<? Could not open TTY:>)
$RET ;Return
SUBTTL Timer Routines
;Timer Interrupt Handler
ETIME: $CALL TTSN1 ;Force a send
$CALL INITIM ;Init reservation timer
DEBRK% ;Dismiss interrupt
TIMI10: $CALL TTSN1 ;Force a send
$CALL INITIM ;Restart timer
DEBRK. ;Dismiss interrupt
;Initialize reservation timer
INITIM: $SAVE <T1,S2,S1> ;Save some ac's
SKIPN MONTYP ;Skip if TOPS-orange
JRST INITI1 ;TOPS-blue
MOVX S1,<.FHSLF,,.TIMEL> ;Process handle,,do elapsed time
MOVEI S2,RESTIM ;Reservation timer
MOVEI T1,TIMCHN ;Interrupt on this channel
TIMER% ;Invoke timer jsys
$TEXT (,<? Error setting timer: ^E/S1/>) ;Give message
$RET
INITI1: MOVX S1,PS.TMS+RESTIM ;Load the time to sleep
PITMR. S1, ;Cause a timed event in so many MS
$TEXT (,<? Can't set PITMR interrupt, error code ^O/S1/>)
$RET ;Return now please
SUBTTL Interrupt System
;* ION is the routine used to enable the interrupt system for operation.
ION: SKIPN MONTYP ;Skip if tops-orange
JRST ION10 ;tops-blue
;TOPS-20 interrupt initialization
MOVEI S1,.FHSLF ;Current process handle
MOVE S2,[LEVTAB,,CHNTAB] ;interrupt tables
SIR% ;Set chan & priority level table addr
EIR% ;Enable interrupt system
MOVE S1,[.TICTI,,TTYCHN] ;Indicate we want all terminal ints
ATI% ;Attach terminal interrupts
;(12) MOVX S1,<.TICCC,,CCCCHN> ;Load code for control C interrpt
;(12) ATI% ;Attach Terminal Interrupt
MOVEI S1,.FHSLF ;Current process handle
MOVX S2,ONCHNS ;Channels in use
AIC% ;Activate specified channels only
$RET ;Return
;TOPS-10 interrupt initialization.
ION10: MOVEI S1,PIVECT ;Point to PI vector
PIINI. S1, ;Get it to the monitor
$TEXT (,<? Can't use PI system - error code ^O/S1/>)
MOVE S1,[PS.FAC![EXP .PCLLM,<LLOFFS,,0>,0]]
PISYS. S1, ;Enable the channel
$TEXT (,<? Can't activate interrupts for LLMOP - error code ^O/S1/>)
MOVE S1,[PS.FAC![EXP .PCTMR,<TIOFFS,,0>,0]]
PISYS. S1, ;Enable the channel
$TEXT (,<? Can't activate interrupts for PITMR - error code ^O/S1/>)
MOVE S1,[PS.FAC![EXP .PCJBI,<TTOFFS,,0>,0]]
PISYS. S1, ;Enable the channel
$TEXT (,<? Can't activate interrupts for PIJBI - error code ^O/S1/>)
MOVE S1,[PS.FAC![EXP .PCSTP,<CCOFFS,,0>,0]] ;Control-C interrupts
PISYS. S1, ;or CALLI AC,136
$TEXT (,<? Can't activate control-C interrupts - error code ^O/S1/>)
MOVE S1,[PS.FAC![EXP <SIXBIT/TTY/>,<TTOFFS,,PS.RID!PS.RIA>,0]] ;TTY
PISYS. S1, ;or CALLI AC,136
$TEXT (,<? Can't activate TTY interrupts - error code ^O/S1/>)
MOVX S1,PS.FON ;Turn on interrupt system
PISYS. S1, ;or CALLI AC,136
$TEXT (,<? Can't turn on PI - error code ^O/S1/>)
$RET ;Return
;* IOFF is the routine to call to turn off the interrupt system and reset it.
IOFF: SKIPN MONTYP ;Orange?
JRST IOFF10 ;Blue.
;Turn off the interrupt system for TOPS-20.
MOVX S1,.TICTI ;Terminal interrupt code to clear
DTI% ;De-assign all type-in
MOVEI S1,.FHSLF ;Load fork handle for this fork
MOVX S2,ONCHNS ;Load channels that we were using
DIC% ;Deactivate Interrupt Channels
DIR% ;Disable Interrupt System
CIS% ;Clear Interrupt System
$RET ;Return
;Turn off interrupt for TOPS-10
IOFF10: MOVX S1,PS.FOF ;Turn off the interrupt facility
PISYS. S1, ;or CALLI AC,136
$TEXT (,<? Can't turn off interrupt system - error code ^O/S1/>)
MOVE S1,[PS.FRC![EXP .PCLLM,<LLOFFS,,0>,0]] ;Turn off LLMOP ints
PISYS. S1, ;or CALLI AC,136
$TEXT (,<? Can't remove LLMOP interrupts - error code ^O/S1/>)
MOVE S1,[PS.FRC![EXP .PCTMR,<TIOFFS,,0>,0]]
PISYS. S1, ;Enable the channel
$TEXT (,<? Can't remove interrupts for PITMR - error code ^O/S1/>)
MOVE S1,[PS.FRC![EXP .PCJBI,<TTOFFS,,0>,0]]
PISYS. S1, ;Enable the channel
$TEXT (,<? Can't remove interrupts for PIJBI - error code ^O/S1/>)
MOVE S1,[PS.FRC![EXP .PCSTP,<CCOFFS,,0>,0]] ;Control-C interrupts
PISYS. S1, ;or CALLI AC,136
$TEXT (,<? Can't remove control-C interrupts - error code ^O/S1/>)
MOVE S1,[PS.FRC![EXP <SIXBIT/TTY/>,<TTOFFS,,0>,0]] ;Turn off TTY int
PISYS. S1, ;or CALLI AC,136
$TEXT (,<? Can't remove TTY interrupts - error code ^D/S1/>)
$RET ;Return
SUBTTL Interrupt Channel and Level Tables
;TOPS-20 interrupt system tables
CHNCNT==0 ;Start at channel 0
ONCHNS==0 ;With no channels enabled
DEFINE ASSCHN(LEVEL,SYMLEV,ROUTINE,CODE),<
SYMLEV==LEVEL
$SET (CHNCNT,,<SYMLEV,,ROUTINE>) ;Set the channel
CODE==CHNCNT ;Set channel number
ONCHNS==ONCHNS!1B<CHNCNT> ;Count channel to be activated
CHNCNT==CHNCNT+1 ;Count channel in use
>;end of DEFNE ASSCHN
CHNTAB: $BUILD (^D36) ;Build a 36 word table
;(12) ASSCHN 3,CCCLEV,CCCINT,CCCCHN ;Control-C trap
ASSCHN 3,RCPLEV,RCPOLL,POLCHN ;Get character from Pluto
ASSCHN 3,TTYLEV,TTYINP,TTYCHN ;Get terminal input
ASSCHN 3,TIMLEV,ETIME,TIMCHN ;Insure we don't lose console
;thru inactivity
$EOB ;End of CHNTAB build
LEVTAB: EXP PCLEV1,PCLEV2,PCLEV3 ;Pointer for each level's PC save addr
PCLEV1: BLOCK 1 ;Address to resume after level 1 int
PCLEV2: BLOCK 1 ;Address to resume after level 2 int
PCLEV3: BLOCK 1 ;Address to resume after level 3 int
;TOPS-10 interrupt system tables
PIVECT: LLOFFS==.-PIVECT ;Offset for LLMOP interrupts in table
EXP POLI10 ;.PSVNP Poll interrupt routine
EXP 0 ;.PSVOP Old PC
XWD 0,.PCLLM ;.PSVFL LLMOP interrrupts
EXP 0 ;.PSVIS interrupt status
TTOFFS==.-PIVECT ;Offset for TTY input available
EXP TTYI10 ;.PSVNP TTY interrupt routine
EXP 0 ;.PSVOP Old PC
XWD 0,PS.RID!PS.RIA ;.PSVFL input interrupts
EXP 0 ;.PSVIS interrupt status
TIOFFS==.-PIVECT ;Offset for PITMR interrupts
EXP TIMI10 ;.PSVNP Timer interrupt routine
EXP 0 ;.PSVOP Old PC
XWD 0,.PCTMR ;.PSVFL timer interupts
EXP 0 ;.PSVIS interrupt status
CCOFFS==.-PIVECT ;Offset for control C trap
EXP CCCI10 ;.PSVNP New PC
EXP 0 ;.PSVOP Old PC
XWD 0,.PCSTP ;.PSVFL ^C interrupts
EXP 0 ;.PSVIS interrupt status
SUBTTL RCRID Subroutine
;* RCRID subroutine
;
; Send a Request Identity LLMOP to the dest address node on the Ethernet.
;
; Return +1 if a jsys error occurs.
; Return +2 if successful...the data stack will contain the Request Number
; for later .RCRPY/.RCABT/.RCSTS calls.
RCRID: $SAVE <S2,S1> ;Save some acs
;Fill .RCRID arg block
MOVE S1,PRTNBR ;Selected port number
MOVEM S1,RCRIDB+.LMCID
DMOVE S1,NODADH ;Put hi/lo dest addr in
DMOVEM S1,RCRIDB+.LMDST ; jsys arg block
SKIPN TRCFLG ;Tracing enabled ?
JRST RCRID1 ; No
;Print the node address
$PMSG (<Requesting ID of node address: >)
PUSHD <NODADH> ;Push hex digits 1-8
PUSHD <NODADL> ;Push hex digits 9-12
$CALL PRHEX ;Print the hex node address
$CALL PCRLF ;Print CRLF
RCRID1: MOVEI S1,.RCRID ;Get function code
MOVEI S2,RCRIDB ;Set up pointer to .Rcrid jsys block
$CALL $LLMOP ;Do "LLMOP"
JRST RCRID4 ;Error return
AOS (P) ;Bump return address for success return
SKIPE TRCFLG ;Tracing enabled ?
$TEXT (,< Request # ^D/RCRIDB+.LMREQ/>)
RCRID2: HRRZ S1,RCRIDB+.LMREQ
PUSHD <S1> ;Push Req # on data stack
RCRID3: $RET
;Jsys failure comes here
RCRID4: $TEXT (,<? .RCRID failure: ^T/@ERRPNT/>)
$RET ;Error return
;.RCRID argument block
RCRIDB: 0 ;Channel id (port number)
0 ;Dest addr (hi = byte 0,1,2,3,z)
0 ;Dest addr (lo = byte 4,5,z,z,z)
0 ;Int chan #,,Request number ret by jsys
;Int chan #...0 = no interrupt
;Req # for .RCRPY/.RCABT/.RCSTS
SUBTTL RCRCT Subroutine
;* RCRCT subroutine
;
; Send a Read Counters LLMOP to the dest address node on the Ethernet.
;
; Return +1 if a jsys error occurs.
; Return +2 if successful...the data stack will contain the Request Number
; for later .RCRPY/.RCABT/.RCSTS calls.
RCRCT: $SAVE <S2,S1> ;Save some acs
;Fill .RCRCT jsys arg block
MOVE S1,PRTNBR ;Selected port number
MOVEM S1,RCRCTB+.LMCID ; save it
DMOVE S1,NODADH ;Put hi/lo dest addr in
DMOVEM S1,RCRCTB+.LMDST ; jsys arg block
;Print the node address
SKIPN TRCFLG ;Tracing enabled ?
JRST RCRCT1 ; No
$PMSG (<Reading Counters of node address: >)
PUSHD <NODADH> ;Push hex digits 1-8
PUSHD <NODADL> ;Push hex digits 9-12
$CALL PRHEX ;Print the hex node address
$CALL PCRLF ;Output CRLF
RCRCT1: MOVEI S1,.RCRCT ;Get function code
MOVEI S2,RCRCTB ;Set up pointer to .rcrct jsys block
$CALL $LLMOP ;Do "LLMOP"
JRST RCRCT4 ;Error return
AOS (P) ;Bump return address for success return
SKIPE TRCFLG ;Tracing enabled ?
$TEXT (,< Request # ^D/RCRCTB+.LMREQ/>) ;Output request number
RCRCT2: HRRZ S1,RCRCTB+.LMREQ
PUSHD <S1> ;Push Req # on data stack
RCRCT3: $RET
;Failure comes here
RCRCT4: $TEXT (,<? .RCRCT failure: ^T/@ERRPNT/>)
$RET
;.RCRCT argument block
RCRCTB: 0 ;Channel id (port number)
0 ;Dest addr (hi = byte 0,1,2,3,z)
0 ;Dest addr (lo = byte 4,5,z,z,z)
0 ;Int chan #,,Request number ret by jsys
;Int chan #...0 = no interrupt
;Req # for .RCRPY/.RCABT/.RCSTS
SUBTTL RCRBT Subroutine
;* RCRBT subroutine
;
; Send a Remote Boot LLMOP to the dest address node on the Ethernet
; to load Console Carrier ucode into PLUTO
;
; Return +1 if a jsys error occurs.
; Return +2 if successful
RCRBT: $SAVE <S2,S1> ;Save some acs
;Fill .RCRBT jsys arg block
MOVE S1,PRTNBR ;Selected port number
MOVEM S1,RCRBTB+.LMCID
DMOVE S1,TARADH ;Put hi/lo dest addr in
DMOVEM S1,RCRBTB+.LMDST ; jsys arg block
DMOVE S1,PWORDH ;Put password in
DMOVEM S1,RCRBTB+.LMPWD ; jsys arg block
MOVEI S1,1B35 ;Put control info - boot comm proc
MOVEM S1,RCRBTB+.LMCIF ; in jsys arg block
SETZM RCRBTB+.LMDID ;Device ID
MOVE S1,[POINT 8,RBTSID] ;Put pointer to Software ID
MOVEM S1,RCRBTB+.LMSID ; in jsys arg block
;Print the node address
SKIPN TRCFLG ;Trace enabled ?
JRST RCRBT1 ; No
$PMSG (<Boot issued to target node address: >)
PUSHD <TARADH> ;Push hex digits 1-8
PUSHD <TARADL> ;Push hex digits 9-12
$CALL PRHEX ;Print the hex node address
$CALL PCRLF ;Print CRLF
RCRBT1: MOVEI S1,.RCRBT ;Get function code
MOVEI S2,RCRBTB ;Set up pointer to .RCRBT jsys block
$CALL $LLMOP ;Do "LLMOP"
JRST RCRBT4 ;Error return
AOS (P) ;Bump return address for success return
RCRBT3: $RET
;Jsys failure comes here
RCRBT4: $TEXT (,<? .RCRBT failure: ^T/@ERRPNT/>)
$RET ;Error return
;.RCRBT argument block
RCRBTB: 0 ;Channel id (port number)
0 ;Dest addr (hi = byte 0,1,2,3,z)
0 ;Dest addr (lo = byte 4,5,z,z,z)
0 ;PLUTO password (hi bytes 7,6,5,4,z)
0 ;PLUTO password (lo bytes 3,2,1,0,z)
0 ;Control information
0 ;Pointer to Device-id
0 ;Pointer to Software-id
RBTDID: 0 ;8 bit byte string for Device ID
RBTSID: 377B7 ; " " " " Software ID
SUBTTL RCRPY Subroutine
;* RCRPY subroutine
;
; Do REMOTE CONSOLE REPLY to a REQUEST-ID or READ COUNTERS LLMOP.
;
; 1. Push the Request Number on the data stack (from .RCRID/.RCRCT).
; 2. Call this routine via "GO RCRPY".
; 3. Return +1 If a jsys error occured.
; Return +2 If successful.
; 4. If successful, RCRPYB+.LMRBL will contain the Remote Console Buffer
; Message Length returned by the jsys.
RCRPY: $SAVE <S2,S1> ;Save some acs
;Fill .RCRPY jsys arg block
MOVE S1,PRTNBR ;Selected port number
MOVEM S1,RCRPYB+.LMCID
POPD <RCRPYB+.LMREQ> ;Req # from .RCRID/.RCRCT
MOVE S1,RBUFSZ ;Get response buffer size
MOVEM S1,RCRPYB+.LMRBL ; Put in .Rcrpy jsys block
MOVE S1,[POINT 8,TTOBUF] ;Get console output buffer ptr
MOVEM S1,RCRPYB+.LMRBP ; Put in .Rcrpy jsys block
SKIPE TRCFLG ;Tracing enabled ?
$TEXT (,<Read console reply for request # ^D/RCRPYB+.LMREQ/>)
RCRPY1: MOVEI S1,.RCRPY ;Get function code
MOVEI S2,RCRPYB ;Set up pointer to .Rcrpy jsys block
$CALL $LLMOP ;Do "LLMOP"
JRST RCRPY4 ;Jsys error return
AOS (P) ;Bump return address for success return
SKIPE TRCFLG ;Tracing enabled ?
$TEXT (,< Returned message length = ^D/RCRPYB+.LMRBL,LHMASK/>)
RCRPY3: $RET
;Failure comes here
RCRPY4: $TEXT (,<? .RCRPY failure: ^T/@ERRPNT/>)
$RET ;Error return
;.RCRPY jsys argument block
RCRPYB: 0 ;Channel-id (port number)
0 ;Source addr ret from BCAST/MCAST
0 ; " "
0 ;Request # from .RCRID/.RCRCT jsys ret.
0 ;Ret msg len,,Response Buffer Length
0 ;Response Buffer Pointer
SUBTTL RCRSV Subroutine
;* RCRSV subroutine
;
; Send a RESERVE REMOTE CONSOLE LLMOP to the dest address node on the Ethernet
;
; Return +1 if a jsys error occurs.
; Return +2 if successful.
RCRSV: $SAVE <S2,S1> ;Save some acs
;Fill .RCRSV arg block
MOVE S1,PRTNBR ;Selected port number
MOVEM S1,RCRSVB+.LMCID
DMOVE S1,TARADH ;Put hi/lo dest addr in
DMOVEM S1,RCRSVB+.LMDST ; jsys arg block
DMOVE S1,PWORDH ;Get password, hi/lo bytes
DMOVEM S1,RCRSVB+.LMPWD
;Print the node address
SKIPN TRCFLG ;Tracing enabled ?
JRST RCRSV1 ; No
$PMSG (<Reserving Remote Console of target node address: >)
PUSHD <TARADH> ;Push hex digits 1-8
PUSHD <TARADL> ;Push hex digits 9-12
$CALL PRHEX ;Print the hex node address
$CALL PCRLF ;Print CRLF
RCRSV1: MOVEI S1,.RCRSV ;Get function code
MOVEI S2,RCRSVB ;Set up pointer to .Rcrsv jsys block
$CALL $LLMOP ;Do "LLMOP"
JRST RCRSV4 ;Error return
AOS (P) ;Bump return address for success return
SKIPE TRCFLG ;Tracing enabled ?
$TEXT (,< Port ID # ^D/RCRSVB+.LMCID/>) ;Get port id number
RCRSV3: $RET
;Jsys failure comes here
RCRSV4: $TEXT (,<? .RCRSV failure: ^T/@ERRPNT/>)
$RET ;Error return
;.RCRSV jsys argument block
RCRSVB: 0 ;Channel id (Port #)
0 ;Dest addr (hi = byte 0,1,2,3,z)
0 ;Dest addr (lo = byte 4,5,z,z,z)
0 ;PLUTO password (hi = bytes 7,6,5,4,z)
0 ;PLUTO password (lo = bytes 3,2,1,0,z)
SUBTTL RCREL Subroutine
;* RCREL subroutine
;
; Send a RELEASE REMOTE CONSOLE LLMOP to the dest address node on the Ethernet
;
; Return +1 if a jsys error occurs.
; Return +2 if successful
RCREL: $SAVE <S2,S1> ;Save some acs
;Fill .RCREL jsys arg block
MOVE S1,PRTNBR ;Selected port number
MOVEM S1,RCRELB+.LMCID
DMOVE S1,TARADH ;Put hi/lo dest addr in
DMOVEM S1,RCRELB+.LMDST ; jsys arg block
;Print the node address
SKIPN TRCFLG ;Tracing enabled ?
JRST RCREL1 ; No
$PMSG (<Releasing Remote Console of target node address: >)
PUSHD <TARADH> ;Push hex digits 1-8
PUSHD <TARADL> ;Push hex digits 9-12
$CALL PRHEX ;Print the hex node address
$CALL PCRLF
RCREL1: MOVEI S1,.RCREL ;Get function code
MOVEI S2,RCRELB ;Set up pointer to .Rcrel jsys block
$CALL $LLMOP ;Do "LLMOP"
JRST RCREL4 ;Error return
AOS (P) ;Bump return address for success return
SKIPE TRCFLG ;Tracing enabled ?
$TEXT (,< Port ID # ^D/RCRELB+.LMCID/>) ;Get port id number
RCREL3: $RET
;Failure comes here
RCREL4: $TEXT (,<? .RCREL failure: ^T/@ERRPNT/>)
$RET ;Error return
;.RCREL argument block
RCRELB: 0 ;Channel-id (Port #)
0 ;Dest addr (hi = byte 0,1,2,3,z)
0 ;Dest addr (lo = byte 4,5,z,z,z)
SUBTTL RCSND Subroutine
;* RCSND subroutine - SEND CONSOLE COMMAND
;
; This function sends ASCII console command data to the remote console
; & polls for response data. With no command data, this function may be
; used to poll for more response data without sending a command.
;
; 1. Put the Response Buffer Ptr & Response Buffer Length on the data stack.
; 2. Call this routine via "GO RCSND".
; 3. Return +1 if an error occurs.
; Return +2 if successful...The data stack will contain the Request Number
; for later .RCPOL/.RCABT/.RCSTS calls.
RCSND: $SAVE <S2,S1> ;Save some acs
;Fill .RCSND jsys arg block
MOVE S2,PRTNBR ;Get selected port number
SKIPE BRKFLG ;Command break flag set?
TXO S2,LM%CBF ; Yes, set B1 for arg block
SETZM BRKFLG ;Clear flag for next time
MOVE S1,MNOFLG ;Get message number flag
TRNE S1,1B35 ;Skip if low order bit zero
TXO S2,LM%MNO ;Nope, set matching bit
MOVEM S2,RCSNDB+.LMCID ;Put in arg block
DMOVE S1,TARADH ;Put hi/lo dest addr in
DMOVEM S1,RCSNDB+.LMDST ; jsys arg block
SKIPN MONTYP ;Skip if orange
SKIPA S1,[LM%AIC!FLD(LLOFFS,LM%ICH)] ;Blue int chan for polling
MOVX S1,LM%AIC!FLD(POLCHN,LM%ICH) ;Orange int chan for polling
MOVEM S1,RCSNDB+.LMREQ ;Set to interrupt on proper channel
POPD <RCSNDB+.LMRBL,RCSNDB+.LMRBP> ;Get length and byte pointer
;Print the target node address
SKIPN TRCFLG ;Tracing enabled ?
JRST RCSND1 ; No
$TEXT (,<Sending ^D/RCSNDB+.LMRBL/ bytes "^A>)
MOVE S2,RCSNDB+.LMRBL ;Load length
MOVE T1,RCSNDB+.LMRBP ;Load byte pointer
RCSND0: ILDB S1,T1 ;Load a byte
$TEXT (,<^O/S1/,^A>) ;Output in octal
SOJG S2,RCSND0 ;Loop for all
$PMSG (<" to: >) ;Another label
PUSHD <TARADH> ;Push hex digits 1-8
PUSHD <TARADL> ;Push hex digits 9-12
$CALL PRHEX ;Print the hex node address
$CALL PCRLF ;Print CRLF
RCSND1: MOVEI S1,.RCSND ;Get function code
MOVEI S2,RCSNDB ;Set up pointer to .Rcsnd jsys block
$CALL $LLMOP ;Do "LLMOP"
JRST RCSND4 ;Error return
AOS (P) ;Bump return address for success return
SKIPE TRCFLG ;Tracing enabled ?
$TEXT (,< Request # ^D/RCSNDB+.LMREQ,RHMASK/>) ;Print request #
RCSND2: HRRZ S1,RCSNDB+.LMREQ ;Load req #
PUSHD <S1> ;Push Req # on data stack
RCSND3: $RET
;Jsys failure comes here
RCSND4: $TEXT (,<? .RCSND failure: ^T/@ERRPNT/>)
$RET ;Error return
;.RCSND argument block
RCSNDB: 0 ;Cmd break flag,,Chan-id (port #)
0 ;Dest addr (hi = byte 0,1,2,3,z)
0 ;Dest addr (lo = byte 4,5,z,z,z)
0 ;Int chan #,,Req # ret by jsys
;Int chan #... 0 = no interrupt
;req # for .RCPOL/.RCABT/.RCSTS calls
0 ;Response Buffer Length
0 ;Response Buffer Pointer
SUBTTL RCPOL Subroutine
;* RCPOL subroutine - CONSOLE RESPONSE POLL
;
; This function polls for completion of the SEND CONSOLE COMMAND fuction.
;
; 1. Put the Response Buffer Ptr & Response Buffer Length on the data stack.
; 2. Call this routine via "GO RCPOL".
; 3. Return +1 if a jsys error occurs.
; Return +2 if successful.
; 4. Upon successful ret, RCPOLB+.LMRBL will contain the Remote Console Buffer
; Message Length returned by the jsys.
RCPOL: $SAVE <S2,S1> ;Save some acs
;Fill .RCPOL arg block
MOVE S1,PRTNBR ;Selected port number
MOVEM S1,RCPOLB+.LMCID
HRRZ S1,RCSNDB+.LMREQ ;Req # from .RCSND
HRRZM S1,RCPOLB+.LMREQ ; to .RCPOL jsys block
POPD <RCPOLB+.LMRBL,RCPOLB+.LMRBP>
;Print the target node address
SKIPN TRCFLG ;Tracing enabled ?
JRST RCPOL1 ; No
$PMSG (<Polling address: >) ;Label the following
PUSHD <TARADH> ;Push hex digits 1-8
PUSHD <TARADL> ;Push hex digits 9-12
$CALL PRHEX ;Print the hex node address
$CALL PCRLF ;Output CRLF
RCPOL1: MOVEI S1,.RCPOL ;Get function code
MOVEI S2,RCPOLB ;Set up pointer to .Rcpol jsys block
$CALL $LLMOP ;Do "LLMOP"
JRST RCPOL4 ;Error return
AOS (P) ;Bump return address for success return
SKIPE TRCFLG ;Tracing enabled ?
$TEXT (,< Request # ^D/RCPOLB+.LMREQ/, Returned message length = ^D/RCPOLB+.LMRBL,LHMASK/>)
RCPOL3: $RET
;Failure comes here
RCPOL4: $TEXT (,<? .RCPOL failure: ^T/@ERRPNT/>)
$RET ;Error return
;.RCPOL argument block
RCPOLB: 0 ;Ret Data Lost Flags,,Chan-id (port #)
0 ;not used
0 ;not used
0 ;Request # from .RCSND jsys ret.
0 ;Ret msg len,,Response Buffer Length
0 ;Response Buffer Pointer
SUBTTL RCABT Subroutine
;* RCABT subroutine - ABORT OUTSTANDING REMOTE CONSOLE REQUEST.
;
; 1. Push the Request Number on the data stack (from .RCRID/.RCRCT/.RCSND)
; 2. Call this routine via "GO RCABT"
; 3. Return +1 If an error occured.
; Return +2 If successful.
RCABT: $SAVE <S2,S1> ;Save some ac's
;Fill .RCABT arg block
MOVE S1,PRTNBR ;Selected port number
MOVEM S1,RCABTB+.LMCID
POPD <RCABTB+.LMREQ> ;Put Req # in arg block
MOVEI S1,.RCABT ;Get function code
MOVEI S2,RCABTB ;Set up pointer to .RCABT block
$CALL $LLMOP ;Do "LLMOP"
JRST RCABT4 ;Error return
AOS (P) ;Bump return address for success return
SKIPE TRCFLG ;Tracing enabled ?
$TEXT (,<Aborted request # ^D/RCABTB+.LMREQ/>) ;Get request number
RCABT3: $RET
;Failure comes here
RCABT4: $TEXT (,<? .RCABT failure: ^T/@ERRPNT/>)
$RET ;Error return
;.RCABT argument block
RCABTB: 0 ;Channel-id
0 ;Not used
0 ;Not used
0 ;Req # from .RCRID/.RCRCT/.RCSND
SUBTTL RCSTS Subroutine
;* RCSTS - OBTAIN REMOTE CONSOLE REQUEST STATUS
;
; 1. Put request number on the data stack from .RCRID/.RCRCT/.RCSND
; 2. Call this routine via "GO RCSTS".
; 3. Return +1 If an error occured.
; Return +2 If successful
; 4. Upon successful return, RCSTSB+.LMSTF will contain
; the status from the previous request.
RCSTS: $SAVE <S2,S1> ;Save some ac's
;Fill .RCSTS arg block
MOVE S1,PRTNBR ;Selected port number
MOVEM S1,RCSTSB+.LMCID
POPD RCSTSB+.LMREQ ;Request number to .RCSTS block
SKIPE TRCFLG ;Tracing enabled ?
$TEXT (,<Checking request # ^D/RCSTSB+.LMREQ/>) ;Get request number
RCSTS1: MOVEI S1,.RCSTS ;Get function code
MOVEI S2,RCSTSB ;Set up pointer to .RCSTS block
$CALL $LLMOP ;Do "LLMOP"
JRST RCSTS4 ;Error return
AOS (P) ;Bump return address for success return
MOVEI S2,[ASCIZ/unknown status type/] ;Load default string
MOVE S1,RCSTSB+.LMSTF ;Get again
CAIN S1,.LMPND ;Pending?
MOVEI S2,[ASCIZ/pending/] ;Yep
CAIN S1,.LMSUC ;Success?
MOVEI S2,[ASCIZ/success/] ;Yep
CAIN S1,.LMABT ;Aborted?
MOVEI S2,[ASCIZ/aborted/] ;Yep
CAIN S1,.LMTXF ;Transmit failed?
MOVEI S2,[ASCIZ/transmit failed/] ;Yep
CAIN S1,.LMCCE ;Channel communication error?
MOVEI S2,[ASCIZ/channel communication error/]
SKIPE TRCFLG ;Tracing enabled ?
$TEXT (,< Status = ^D/RCSTSB+.LMSTF/ = ^T/(S2)/>)
RCSTS3: $RET
RCSTS4: $TEXT (,<? .RCSTS failure: ^T/@ERRPNT/>) ;Barf
$RET ;Error return
;.RCSTS argument block
RCSTSB: 0 ;Channel-id
0 ;Status flags upon return
0 ;Channel status upon return
0 ;Req # from .RCRID/.RCRCT/.RCSND
SUBTTL RCADR Subroutine
;* RCADR subroutine - READ LOCAL ADDRESS
;
; 1. Call this routine via "GO RCADR"
; 2. Return +1 If an error occured.
; Return +2 If successful.
; 3. Return is immediate.
; Hardware & physical address will appear in the argument block upon
; successful return & the physical address stored in LOCADH/L.
RCADR: $SAVE <S2,S1> ;Save some ac's
MOVE S1,PRTNBR ;Selected port number
MOVEM S1,RCADRB+.LMCID
MOVEI S1,.RCADR ;Get function code
MOVEI S2,RCADRB ;Set up pointer to .rcadr arg block
$CALL $LLMOP ;Do "LLMOP"
JRST RCADR4 ;Error return
AOS (P) ;Bump return address for success return
DMOVE S1,RCADRB+.LMPYA ;Put returned physical addr in LOCADH/L
DMOVEM S1,LOCADH
SKIPN TRCFLG ;Trace enabled ?
JRST RCADR3 ;Yep
$PMSG (<Local Physical Address = >)
PUSHD <LOCADH,LOCADL> ;Save physical address
$CALL PRHEX ;Print hex digits
$CALL PCRLF ;Output CRLF
$PMSG (<Local Hardware Address = >)
PUSHD <RCADRB+.LMHWA,RCADRB+.LMHWA+1>
$CALL PRHEX ;Print the address
$CALL PCRLF ;Output CRLF
RCADR3: $RET
;Failure comes here
RCADR4: $TEXT (,<? .RCADR failure: ^T/@ERRPNT/>)
$RET ;Error return
;.RCADR argument block
RCADRB: 0 ;Channel-id
44321,,263600 ;Ret local hardware addr
465360,,0 ; (set for debugging)
44321,,263600 ;Ret local physical addr
465360,,0 ; Set for debug
SUBTTL LLMOP Subroutine
;* $LLMOP Subroutine - This subroutine does the actual LLMOP% JSYS.
;
; Enter with S1 = function code
; S2 = address of arg block
; If DEBUG is enabled, simulate the LLMOP.
; Return +1 if jsys error, ERRPNT points to ASCIZ error message
; Return +2 if successful
$LLMOP: SKIPE DBGFLG ;Do real or fake ?
JRST $LLM5 ; Simulate "LLMOP" for debug
SKIPN MONTYP ;Skip if TOPS-20
JRST $LLM10 ;TOPS-blue
;TOPS-20 LLMOP execution.
LLMOP% ;Do "LLMOP" jsys
ERJMP .+2 ;Failed
JRST $LLM2 ;Passed
HRROI S1,ERRBUF ;Point to error buffer
HRLOI S2,.FHSLF ;Get the last error of this fork
MOVSI T1,-<<ERRLEN*5>-1> ;Load max number of bytes
ERSTR% ;Get the last error string
JRST $LLM21 ;Undefined error number
JFCL ;Bad string size - use what we got
$RET ;Return owie
$LLM21: MOVEI S1,.FHSLF ;Load this fork's handle
GETER% ;Get the last error number
$TEXT (<-1,,ERRBUF>,<Undefined error number ^O/S2,RHMASK/^0>)
$RET ;Return owie
;TOPS-10 LLMOP execution
$LLM10: LLMOP. S1, ;Or CALLI AC,220
CAIA ;Error, save error code
JRST $LLM2 ;Worked, return OK
;TOPS-10 didn't like it, load ASCIZ error message pointer into LASERR.
MOVSI S2,-LLM1TN ;Load number of error codes
$LLM11: HLRE T1,$LLM1T(S2) ;Load an error code
CAIE S1,(T1) ;Match?
AOBJN S1,$LLM11 ;Nope, loop
HRRZ S1,$LLM1T(S2) ;Load ASCIZ text
MOVEM S1,ERRPNT ;Save error code
$RET ;Return owie
$LLM1T: XWD 1,[ASCIZ/Insufficient privileges/]
XWD 2,[ASCIZ/Illegal function/]
XWD 3,[ASCIZ/Illegal channel number/]
XWD 4,[ASCIZ/LLMOP is off/]
XWD 0,[ASCIZ/Unknown error code/]
LLM1TN==.-$LLM1T-1
;DEBUG mode LLMOP simulation.
$LLM5: CAIE S1,.RCSTS ;Doing "OBTAIN STATUS" ?
JRST $LLM4 ; no
MOVEI S2,.LMSUC ;Yes, set success bit
MOVEM S2,RCSTSB+.LMSTF ; Make successful
JRST $LLM2 ; Exit
$LLM4: CAIE S1,.RCRID ;Doing "REQUEST-ID" ?
JRST $LLM1 ; no
AOS RCRIDB+.LMREQ ;Yes, fake by increment request number
JRST $LLM2 ; Exit
$LLM1: CAIE S1,.RCRPY ;Doing "READ REMOTE CONSOLE REPLY" ?
JRST $LLM2 ; no
MOVEI S2,^D100 ;Yes, get ret message length in bytes
HRLM S2,RCRPYB+.LMRBL ;Put in .Rcrpy jsys block
$LLM2: AOS (P) ;Skip return if ok
$LLM3: $RET
SUBTTL RDSTIM Subroutine
;* RDSTIM subroutine
;
; Read the current time since last time system was restarted.
; Save that value and calculate and save a value of time 5 seconds later.
RDSTIM: $SAVE <S1,S2> ;Save some acs
$CALL GETTIM ;Get system uptime in millisecs
MOVEM S1,TIMST ;Save it
ADDI S1,^D5000 ;Add 5 seconds to the current time
SKIPE TRCFLG ;Tracing enabled ?
ADDI S1,^D<1000*60> ; Yes, 60 seconds more for typeouts
MOVEM S1,TIMEND ;Save it
$RET
;* OTIME subroutine
;
; This subroutine reads the current time and compares that value with
; TIMEND that was calculated in the RDSTIM subroutine.
; This is used to determine if 5 seconds has elapsed since calling
; the RDSTIM subroutine.
;
; Return +1 if time exceeded
; Return +2 if time not exceeded.
OTIME: $SAVE <S1> ;Save some ac
$CALL GETTIM ;Get system uptime in milliseconds
CAMG S1,TIMEND ;Has current time exceeded timend ?
CPOPJ1: AOS (P) ; No, bump for skip return
CPOPJ: $RET
;* GETTIM subroutine is called to get the system uptime in milliseconds
GETTIM: SKIPN MONTYP ;TOPS-20?
JRST GETTI1 ;No
TIME% ;Get uptime in S1
$RET ;Return
GETTI1: $SAVE <S2> ;Save S2
SKIPN CYCL60 ;Computed 60HZ flag yet?
$CALL GETTI2 ;No, get it now
MOVE S1,[136,,11] ;System uptime in jiffies %CNSUP
GETTAB S1, ;or CALLI S1,41
SETZ S1, ;not likely it will fail
IMULI S1,^D1000 ;convert to milli-jiffies
IDIV S1,CYCL60 ;Convert to milli-seconds
$RET ;Return
GETTI2: MOVE S1,[17,,11] ;Load %CNSTS system flags
GETTAB S1, ;or CALLI S1,41
SETZ S1, ;should not execute this, assume 60
TLNE S1,(1B6) ;Is ST%CYC set for 50Hz?
SKIPA S1,[^D50] ;Yes, this must be Europe mon ami
MOVEI S1,^D60 ;No, this is anywhere else
MOVEM S1,CYCL60 ;Set divisor
$RET ; and return
SUBTTL PRHEX - Print 12 Digit Hex Number Subroutine
;* PRHEX prints a 12 digit hex node address.
;
; 1. Put the Hi address (hex digits 1 - 8)
; followed by the Lo address (hex digits 9 - 12) on the data stack.
; 2. Call this subroutine by "GO PRHEX".
; 3. A hyphen will be printed between every 2 hex digits.
PRHEX: $SAVE <S1,S2,T1,T2,T3> ;Save acs
POPD <T2,T1> ;Get lo,hi hex addr
MOVEI T3,^D12 ;Initialize 12 digits to type
ROT T1,-^D4 ;Right justify Hi address
SETZ S2, ;Char counter for hyphens
PRHEXA: ROTC T1,^D4 ;Put digit to be printed at far left
LDB S1,[POINT 4,T1,3] ;Copy hex digit to s1
ADDI S1,"0" ;Make an ascii character
CAILE S1,"9" ;Less than a "9" ?
ADDI S1,"A"-"9"-1 ; No, add 7 more to get A-F
$CALL BOUT%% ;Print character
AOJ S2, ;Bump char ctr
CAIE S2,2 ;2nd char?
JRST PRHEXB ; No
CAIN T3,1 ;Last char?
JRST PRHEXB ; Yes
MOVEI S1,"-" ;Yes, print hyphen
$CALL BOUT%% ;Print it
SETZ S2, ;Reset ctr
PRHEXB: SOJG T3,PRHEXA ;Do next digit
$RET
SUBTTL UHEX - ASCIZ a 12 Digit Hex Number Subroutine
;* UHEX subroutine Asciz a 12 digit hex node address to the data stack.
;
;Call: PUSHD <highaddr,lowaddr>
; $CALL UHEX
; POPD <A1,A2,A3,A4>
UHEX: $SAVE <S1,S2,T1,T2,T3,T4,P1,P2,P3,P4> ;Save acs
POPD <T2,T1> ;Get hex word from data stack
MOVE T4,[Point 7,P1] ;Point to buffer
MOVEI T3,^D12 ;Initialize 12 digits to type
ROT T1,-4 ;Right justify hi addr
SETZ S2,P4 ;Clear hyphen counter, last ASCIZ wd
UHEX1: ROTC T1,^D4 ;Put digit to be printed at far left
LDB S1,[POINT 4,T1,3] ;Copy hex digit to s1
ADDI S1,"0" ;Make an ascii character
CAILE S1,"9" ;Less than a "9" ?
ADDI S1,"A"-"9"-1 ; No, add 7 more to get A-F
IDPB S1,T4 ;Store digit
AOJ S2, ;Bump char ctr
CAIE S2,2 ;2nd char?
JRST UHEX2 ; No
CAIN T3,1 ;Last char?
JRST UHEX2 ; Yes
MOVEI S1,"-" ;Yes, load hyphen
IDPB S1,T4 ;Store it
SETZ S2, ;Reset ctr
UHEX2: SOJG T3,UHEX1 ;Do next digit
PUSHD <P4,P3,P2,P1> ;Store data on stack
$RET ;Return
SUBTTL RESCON - Reserve Console Subroutine
;* RESCON - Reserve Console Subroutine
;
; 1. Do Read Local address jsys & put the physical address in LOCADH/L.
; 2. Do a REQ-ID & put the SYS-ID into TTOBUF.
; 3. If FUNCTION indicates no "console carrier", boot via "NICE" protocol
; & re-enter again.
; 4. If FUNCTION indicates "console carrier" & "not reserved", do
; a RESERVE CONSOLE jsys & re-enter again.
; 5. If FUNCTION indicates "console carrier" & "reserved", read the
; CONSOLE USER & check that it's our "local-address".
; 6. Check that the HARDWARE ADDRESS returned in SYS-ID is the desired
; "target" node address.
; 7. Check that the CONSOLE COMMAND SIZE & CONSOLE RESPONSE SIZE returned
; in SYS-ID is consistent with buffer sizes allotted in the program.
;
; Return+1 if unsuccessful
; Return+2 if successful
RESCON: $SAVE <P2,P1,T4,T3,T2,T1,S2,S1> ;Save some ac's
SETZM RBTCTR ;Clear remote boot counter
$CALL RCADR ;Read local hardware & physical addr
JRST RESX ; & put physical addr in LOCADH/L
SETZM PASCT ;For debug
RES1: SKIPN DBGFLG ;Debug?
JRST RES1D ;No
;Here if debug mode, fake the data.
SKIPE PASCT ;1'st pass?
JRST RES9 ; no
MOVEI S1,177 ;Yes, clear "RESERVED" in FUNCTION
MOVEM S1,REQT1
MOVEI T1,5 ;Clear "CONSOLE USER" in SYS-ID
SETZM REQT2(T1)
SOJGE T1,.-1
JRST RES4
RES9: MOVEI S1,377 ;Set "RESERVED" in FUNCTION
MOVEM S1,REQT1
MOVEI T1,6 ;Set "CONSOLE USER" in SYS-ID to
SETZ T2, ; 123456789ABC
MOVE T3,[POINT 8,SLOCH]
MOVE T4,[POINT 36,REQT2]
RES9A: ILDB T2,T3 ;Get SLOCH/L
IDPB T2,T4 ; & put it in REQT2
SOJG T1,RES9A ; repeat 6 times
RES4: MOVEI S1,RTEND-REQTAB ;Get table byte count
HRLM S1,RCRPYB+.LMRBL ; & fake the ret msg len
;Here if not debug mode, do a REQ-ID and put the SYS-ID into TTOBUF
RES1D: $CALL RRID
; Reset pointer to look for FUNCTION (info type 2)
; If no "console carrier", boot via RCRBT & re-enter again.
; If "console carrier" & "not reserved", do RESERVE CONSOLE & re-enter again.
MOVE S2,[POINT 8,TTOBUF] ;Set buffer ptr
HLRZ P1,RCRPYB+.LMRBL ;Get SYS-ID byte count
RES1A: JUMPE P1,RES10 ;Exit if byte count = 0
ILDB S1,S2 ;Put 1'st INFO TYPE lo byte in S1
ILDB T1,S2 ;Put 2'nd INFO TYPE hi byte in T1
DPB T1,[POINT 8,S1,35-8] ; Construct the info type word
SUBI P1,2 ;Decrement byte count
CAIE S1,0 ;Info type = 0? (padding)
JRST RES1B ; No, see if FUNCTION
IBP S2 ;Yes, jump over msg length
SOJN P1,RES1A ;Try next info type if byte count not 0
RES10: $PMSG (<? Cannot find FUNCTION in SYSID, exiting>)
JRST RESX
RES1B: CAIN S1,2 ;Is it FUNCTION?
JRST RES1C ; yes
; no, go to next info type
ILDB T1,S2 ;Get data length
SOJ P1, ;Decr byte count
RES11: IBP S2 ;Skip over data
SOJ P1, ;Decr byte count
SOJG T1,RES11 ;Done?
JRST RES1A ;Yes, try over
RES1C: ILDB S1,S2 ;Go get the length
CAIN S1,2 ;Is it 2 ?
JRST RES2 ; Yes
$TEXT (,<? Function info length in error, should be 2, was ^D/S1/>)
JRST RESX
RES2: ILDB S1,S2 ;Get the data for lo byte
TRNN S1,1B30 ;Console Carrier set?
JRST RES8 ; No,I have to issue RCRBT
TRNE S1,1B28 ;Console Reservation set?
JRST RES2A ; Yes, see by who
$CALL RCRSV ;No, do Reserve Console Jsys
JRST RESX ; Jsys error return...exit
AOS PASCT ;For debug
JRST RES1 ;See if we got it
;Reset pointer to look for CONSOLE USER (info type 3)
; & check to see if it is our "local address".
RES2A: MOVE S2,[POINT 8,TTOBUF] ;Set buffer ptr
HLRZ P1,RCRPYB+.LMRBL ;Get SYS-ID byte count
RES2B: JUMPE P1,RES12 ;Exit if byte count = 0
ILDB S1,S2 ;Put 1'st INFO TYPE lo byte in S1
ILDB T1,S2 ;Put 2'nd INFO TYPE hi byte in T1
DPB T1,[POINT 8,S1,35-8] ; Construct the info type word
SUBI P1,2 ;Decrement byte count
CAIE S1,0 ;Info type = 0? (padding)
JRST RES2C ; No, see if CONSOLE USER
IBP S2 ;Yes, jump over msg length
SOJN P1,RES2B ;Try next info type if byte count not 0
RES12: $TEXT (,<? Cannot find CONSOLE USER in SYS-ID, exiting>)
JRST RESX
RES2C: CAIN S1,3 ;Is it CONSOLE USER?
JRST RES2D ; yes
; no, go to next info type
ILDB T1,S2 ;Get data length
SOJ P1, ;Decr byte count
RES13: IBP S2 ;Skip over data
SOJ P1, ;Decr byte count
SOJG T1,RES13 ;Done?
JRST RES2B ;Yes, try over
RES2D: ILDB S1,S2 ;Go get the length
CAIN S1,6 ;Is it 6 ?
JRST RES3 ; Yes, see if it's me
$TEXT (,<? Console User info length in error, should be 6, was ^D/S1/>)
JRST RESX ; and exit
RES3: MOVEM S2,P2 ;Save pointer for error printout
MOVEI T1,6 ;Compare 6 bytes to see if it's us
MOVE T4,[POINT 8,LOCADH] ;Set byte pointer
RES5: ILDB T3,S2 ;Get console user address byte 0-5
ILDB S1,T4 ;Get local node address byte 0-5
CAME T3,S1 ;Same?
JRST RES7 ; No, console not avail... exit
SOJG T1,RES5 ; Yes, loop
SKIPE TRCFLG ;Trace on?
$TEXT (,<Console Reservation Successful>) ; Yes
SETOM NODSEL ;Set node selected flag
AOS (P) ;Do ret+2
;Reset pointer to look for CONSOLE COMMAND SIZE (info type 5)
MOVE S2,[POINT 8,TTOBUF] ;Set buffer ptr
HLRZ P1,RCRPYB+.LMRBL ;Get SYS-ID byte count
RES20B: JUMPE P1,RES16 ;Exit if byte count = 0
ILDB S1,S2 ;Put 1'st INFO TYPE lo byte in S1
ILDB T1,S2 ;Put 2'nd INFO TYPE hi byte in T1
DPB T1,[POINT 8,S1,35-8] ; Construct the info type word
SUBI P1,2 ;Decrement byte count
CAIE S1,0 ;Info type = 0? (padding)
JRST RES20C ;No, see if CONSOLE CMD SIZE
IBP S2 ;Yes, jump over msg length
SOJN P1,RES20B ;Try next info type if byte count not 0
RES16: $TEXT (,<? Cannot find CONSOLE COMMAND SIZE in SYS-ID, exiting>)
JRST RESX
RES20C: CAIN S1,5 ;Is it CONSOLE COMMAND SIZE?
JRST RES20D ; yes
; no, go to next info type
ILDB S1,S2 ;Get data length
SOJ P1, ;Decr byte count
RES17: IBP S2 ;Skip over data
SOJ P1, ;Decr byte count
SOJG S1,RES17 ;Done?
JRST RES20B ;Yes, try over
RES20D: ILDB S1,S2 ;Go get the length
CAIN S1,2 ;Is it 2 ?
JRST RES20E ; Yes, get size
$TEXT (,<? Console Command Size info length in error, should be 2, was ^D/S1/>)
JRST RESX ; and exit
;Modify CBUFSZ so that it is always less than Console Command Size
;Check to see that CBUFSZ is less than the max allotted buffer size BUFSIZ.
RES20E: ILDB S1,S2 ;Get lo byte of console command size
ILDB T1,S2 ;Get hi byte
DPB T1,[POINT 8,S1,35-8] ;Construct console command size in S1
SOJ S1, ;Decrement by 1
MOVEM S1,CBUFSZ ;Modify size
CAIG S1,BUFSIZ ;CBUFSZ .GT. BUFSIZ ?
JRST RES20A ; No, continue
$TEXT (,<% Warning: CBUFSZ (^D/CBUFSZ/) greater than BUFSIZ (^D/[BUFSIZ]/)>)
;Reset pointer to look for CONSOLE RESPONSE SIZE (info type 6)
RES20A: MOVE S2,[POINT 8,TTOBUF] ;Set buffer ptr
HLRZ P1,RCRPYB+.LMRBL ;Get SYS-ID byte count
RES30B: JUMPE P1,RES18 ;Exit if byte count = 0
ILDB S1,S2 ;Put 1'st INFO TYPE lo byte in S1
ILDB T1,S2 ;Put 2'nd INFO TYPE hi byte in T1
DPB T1,[POINT 8,S1,35-8] ; Construct the info type word
SUBI P1,2 ;Decrement byte count
CAIE S1,0 ;Info type = 0? (padding)
JRST RES30C ;No, see if CONSOLE RESP SIZE
IBP S2 ;Yes, jump over msg length
SOJN P1,RES30B ;Try next info type if byte count not 0
RES18: $PMSGC (<? Cannot find CONSOLE RESPONSE SIZE in SYS-ID, exiting>)
JRST RESX
RES30C: CAIN S1,6 ;Is it CONSOLE RESPONSE SIZE?
JRST RES30D ; yes
; no, go to next info type
ILDB S1,S2 ;Get data length
SOJ P1, ;Decr byte count
RES19: IBP S2 ;Skip over data
SOJ P1, ;Decr byte count
SOJG S1,RES19 ;Done?
JRST RES30B ;Yes, try over
RES30D: ILDB S1,S2 ;Go get the length
CAIN S1,2 ;Is it 2 ?
JRST RES30E ; Yes, get size
$TEXT (,<? Console Response Size info length in error, should be 2, was ^D/S1/>)
JRST RESX ; and exit
;Modify RBUFSZ so that it is always greater than Console Response Size
;Check to see that RBUFSZ is less than the max allotted buffer size BUFSIZ.
RES30E: ILDB S1,S2 ;Get lo byte of CONSOLE RESPONSE SIZE
ILDB T1,S2 ;Get hi byte
DPB T1,[POINT 8,S1,35-8] ; Construct CONSOLE COMMAND SIZE in S1
AOJ S1, ;Make larger by 1
MOVEM S1,RBUFSZ ; & modify size
CAILE S1,BUFSIZ ;RBUFSZ .LE. BUFSIZ ?
$TEXT (,<% Warning: RBUFSZ (^D/RBUFSZ/) greater than BUFSIZ (^D/[BUFSIZ]/)>)
JRST RESX ;Exit
;Here if console in use by someone else, tell who it is.
RES7: $PMSG (<? Console not available for reservation
Current console user is >)
MOVE S2,P2 ;Restore pointer
MOVEI S1,6 ; loop for 6 bytes
MOVE T3,[POINT 8,T1] ;Set up pointer
RES7A: ILDB T4,S2 ;get byte
IDPB T4,T3 ;set up pointer
SOJG S1,RES7A ;done?
PUSHD <T1,T2> ;Yep, put the hex address on data stack
$CALL PRHEX ; and print it
;Output local address and exit
$PMSG (<
Local address is >) ;Give the local address
PUSHD <LOCADH,LOCADL> ; also so we can see if the
$CALL PRHEX ; conole user is on this system
$CALL PCRLF ;Output CR, LF.
JRST RESX ;Exit
RES8: SKIPE RBTCTR ;First time through here?
JRST RES8A ;Do remote boot only once
SKIPE TRCFLG ;Skip if no trace
$PMSGC (<% Console Carrier not set, trying RCRBT remote boot>)
$CALL RCRBT ;Do remote boot
JRST RESX ; error return
RES8A: SKIPE TRCFLG ;Skip if no trace
$PMSGC (<Waiting 5 seconds...>) ;Tell me about it
MOVEI S1,^D5000 ;Wait 5 sec
SKIPE MONTYP ;Skip if not TOPS-20
DISMS% ;Dismiss for 5 seconds
SKIPN MONTYP ;Skip if not TOPS-10
HIBER S1, ;Hibernate for 5 seconds
JFCL ;Ignore error return
AOS S1,RBTCTR ;Bump loop counter
CAIE S1,^D12 ;60 sec up?
JRST RES1 ; no, try all over again
$PMSGC (<? RCRBT cannot set Console Carrier after 60 seconds
? Console Reservation unsuccessful, exiting
Has password been set by SET-PASSWORD command?>)
RESX: $RET
SUBTTL RELCON - Release Console Subroutine
;* RELCON - Release Console Subroutine
;
; 1. Do a REQ-ID & read the SYS-ID "function" & "console user".
; 2. If FUNCTION indicates "not reserved", do a Return+2 exit.
; 3. If FUNCTION indicates "reserved", read the CONSOLE USER & check if
; it's reserved by us.
; 4. If it's reserved by us, do a RELEASE CONSOLE Jsys & re-enter again.
; 5. If it's reserved by another user, exit.
; 6. Return+1 if unsuccessful
; Return+2 if successful
RELCON: $SAVE <P1,T4,T3,T2,T1,S2,S1> ;Save some ac's
REL1: $CALL RRID ;Do Req-ID & put Sys-ID to TTOBUF
;Reset pointer to look for FUNCTION (info type 2)
MOVE S2,[POINT 8,TTOBUF] ;Look for FUNCTION
HLRZ P1,RCRPYB+.LMRBL ;Get SYS-ID byte count
REL1A: JUMPE P1,REL10 ;Exit if byte count = 0
ILDB S1,S2 ;Put 1'st INFO TYPE lo byte in S1
ILDB T1,S2 ;Put 2'nd INFO TYPE hi byte in T1
DPB T1,[POINT 8,S1,35-8] ; Construct the info type word
SUBI P1,2 ;Decrement byte count
CAIE S1,0 ;Info type = 0? (padding)
JRST REL1B ;No, see if FUNCTION
IBP S2 ;Yes, jump over msg length
SOJN P1,REL1A ;Try next info type if byte count not 0
REL10: $PMSGC (<? Cannot find FUNCTION in SYS-ID, exiting>)
JRST RELX
REL1B: CAIN S1,2 ;Is it FUNCTION?
JRST REL1C ; yes
; no, go to next info type
ILDB S1,S2 ;Get data length
SOJ P1, ;Decr byte count
REL11: IBP S2 ;Skip over data
SOJ P1, ;Decr byte count
SOJG S1,REL11 ;Done?
JRST REL1A ;Yes, try over
REL1C: ILDB S1,S2 ;Go get the length
CAIN S1,2 ;Is it 2 ?
JRST REL2 ; Yes
$TEXT (,<? Function info length in error, it should be 2, it was ^D/S1/>)
JRST REL9
REL2: ILDB S1,S2 ;Get the data for lo byte
TRNE S1,1B28 ;Console Reservation set?
JRST REL2A ; Yes, see by who
SETZM TARADH ;clear target addr
SETZM TARADL
SKIPE TRCFLG ;Trace on?
$PMSGC (<Console Release Successful>) ;Yes
SETZM NODSEL ;Clear node selected flag
AOS (P) ;Do ret+2
JRST RELX ;Exit
;Reset pointer to look for CONSOLE USER (info type 3)
REL2A: MOVE S2,[POINT 8,TTOBUF] ;Look for CONSOLE USER
HLRZ P1,RCRPYB+.LMRBL ;Get SYS-ID byte count
REL2B: JUMPE P1,REL12 ;Exit if byte count = 0
ILDB S1,S2 ;Put 1'st INFO TYPE lo byte in S1
ILDB T1,S2 ;Put 2'nd INFO TYPE hi byte in T1
DPB T1,[POINT 8,S1,35-8] ; Construct the info type word
SUBI P1,2 ;Decrement byte count
CAIE S1,0 ;Info type = 0? (padding)
JRST REL2C ;No, see if CONSOLE USER
IBP S2 ;Yes, jump over msg length
SOJN P1,RES2B ;Try next info type if byte count not 0
REL12: $PMSGC (<? Cannot find CONSOLE USER in SYS-ID, exiting>)
JRST REL9
REL2C: CAIN S1,3 ;Is it CONSOLE USER?
JRST REL2D ; yes
; no, go to next info type
ILDB S1,S2 ;Get data length
SOJ P1, ;Decr byte count
REL13: IBP S2 ;Skip over data
SOJ P1, ;Decr byte count
SOJG S1,REL13 ;Done?
JRST REL2B ;Yes, try over
REL2D: ILDB S1,S2 ;Go get the length
CAIN S1,6 ;Is it 6 ?
JRST REL3 ; Yes, see if it's me
$TEXT (,<? Console User info length in error, it should be 6, it was ^D/S1/>)
JRST REL9 ; and exit
REL3: MOVEI T1,6 ;Compare 6 bytes to see if it's us
MOVE T4,[POINT 8,LOCADH] ;Set byte pointer
REL5: ILDB T2,S2 ;Get console user byte 0-5
ILDB S1,T4 ;Get node address byte 0-5
CAME T2,S1 ;Same?
JRST REL4 ; No, exit
SOJG T1,REL5 ; Yes, loop
$CALL RCREL ;Do RELEASE CONSOLE jsys
JRST REL9 ; Error return
SKIPN DBGFLG ;Debug?
JRST REL1 ; No
MOVEI S1,177 ;Clear "RESERVED" in FUNCTION
MOVEM S1,REQT1
MOVEI T1,5 ;Clear "CONSOLE USER" in SYS-ID
SETZM REQT2(T1)
SOJGE T1,.-1
JRST REL1 ;See if released
REL4: $PMSGC (<? Console already reserved by another user>)
JRST RELX
REL9: $PMSGC (<? Cannot Release Remote Console>)
RELX: $RET
SUBTTL Show All Node Addresses On Network Subroutine
;* SALLAD subroutine Called from SALLNO (Show all Nodes) in RMTCOP
;
; 1. Set NODADH/L for BROADCAST: FF-FF-FF-FF-FF-FF (SKIP OVER THIS FOR NOW)
; 2. Send Request-ID to receive all broadcast replys (SYS-ID's)
; 3. Display all Source Address's from the READ REPLY argument block.
; 4. Test the "More Reply Flag" in word 0 of the arg block.
; & if set, do another READ REPLY & loop.
; 5. Repeat all the above for MULTICAST ADDRESSES: AB-00-00-02-00-00
SALLAD: SETZM PASCT ;Clear flag for which pass we are on
JRST SAD5 ;**TEMP:Dont do BCAST for now
DMOVE S1,BCASTH ;Set up broadcast addresses
DMOVEM S1,NODADH ; for the request ID
;Do Request-Id jsys
SAD1: $PMSG (<Physical addresses of nodes responding to >)
PUSHD <NODADH,NODADL> ;Load the addresses
$CALL PRHEX ;Print in hex
$CALL PCRLF ;Output CRLF
$CALL RCRID ;Do REQ-ID
$RET ;Owie return
POPD SREQN ;Save request #
$CALL RDSTIM ; & read current time
;Do Read Status jsys
SAD2: PUSHD SREQN ;Push saved request number
$CALL RCSTS ;Do READ STATUS
$RET ;Owie, return
$CALL RDFLGS ;Read status flags
JRST SAD5 ; Ret+1 Error or timeout return
JRST SAD2 ; Ret+2 Still pending, read again
NOP ; Ret+3 Successful
;Do Read Remote Console Reply for SYS-ID
SETZ S2, ;For debug
SAD3: PUSHD SREQN ;Get Req #
$CALL RCRPY ;Do READ REPLY (SYS-ID)
$RET ;Return
SKIPN DBGFLG ;Debug?
JRST SAD4 ; no
DMOVE T1,TABL(S2) ;Yes, get fake addresses
DMOVEM T1,RCRPYB+.LMSRC ; & stick it in arg block
ADDI S2,2 ;Bump table index
MOVE S1,RCRPYB+.LMCID
TLO S1,(LM%MRF) ;Set "More Reply Flag"
CAIN S2,6
TLZ S1,(LM%MRF) ;Unless all 3 node addresses displayed
MOVEM S1,RCRPYB+.LMCID ; & stick it in arg block
SAD4: $PMSG (< >) ;Output two spaces
PUSHD <RCRPYB+.LMSRC,RCRPYB+.LMSRC+1> ;Get returned source address
$CALL PRHEX ;Print the address
$CALL PCRLF ;Print a CRLF
MOVE S1,RCRPYB+.LMCID ;Get flag
TLNE S1,(LM%MRF) ;More Reply Flag set?
JRST SAD3 ; Yes, do again
SAD5: SKIPE PASCT ;No, done MCAST yet?
$RET ;Yep return
DMOVE S1,MCASTH ;Load multicase addresses
DMOVEM S1,NODADH ;Store as address to use
AOS PASCT
JRST SAD1 ;Do again for MCAST
TABL: 123456,,123460 ;debug BCAST/MCAST Address 1
654324,,0
123123,,456460 ;Address 2
234234,,0
654654,,765760 ;Address 3
213244,,0
SUBTTL Request ID Decoding and Reporting Of Message Subroutines
;* RRID subroutine Called from REQU (Req-ID command) in RMTCOP.
;
; Sends a REQ-ID message to the selected node and reports SYS-ID returned.
; The hi/lo address are in P2/11 resp. from GO HEX & are saved in
; NODADH/NODADL resp.
;
; The byte format for the request id message returned:
;
; B1,B2,B3,B4,B5,B6 = destination address
; B7,B8,B9,B10,B11,B12 = source address (physical)
; B13 = protocol type 07 = code
; B14 = 0 = reserved
; B15,B16 = receipt number (3rd and 4th bytes of received
; Request id message)
;
; The information that the the request id mechanism returns is:
;
; B18 + 1st byte = information type
; 2nd byte = information length, value = x
; x bytes = specified bytes of information value
;
; Where:
;
; Info Info Info
; Type length description
;
; 1 3 MAINTENANCE: version ver:3 eco:0 user eco:0
; 2 2 FUNCTIONS: bit 0=loop, bit1=dump, bit2=primary loader, bit3=
; Multi-block loader, bit4=boot, bit5=console carrier, bit6=
; Data link counters, bit7=console carrier reservation
; 3 6 CONSOLE USER: system address of the system that has the console
; Reserved.
; 4 2 RESERVATION TIMER: the maximum value, in seconds, of the timer
; Used to clear unused console reservations.
; 5 2 CONSOLE COMMAND SIZE: the maximum size of the console command
; Buffer.
; 6 2 CONSOLE RESONSE SIZE: the maximum size of the console response
; Buffer.
; 7 6 HARDWARE ADDRESS, contents of physical address rom on nia link
; Module.
; 8 10 SYSTEM TIME: the segmented system time.
; 100 1 COMMUNICATION DEVICE:
; 0 = Dp, dp11-da 1 = una, deuna
; 2 = Du, du11-da 3 = cna
; 4 = dl, dl11-c/e/wa 5 = qna
; 6 = Dq, dq11-da 7 = ci, computer interconnect interf.
; 8 = da, da11-b or -al 9 = pcl, pcl11-b
; 10= Dup, dup11-da 12= dmc, dmc11-da/ar,-ma/al or -fa/ar
; 14= Dn, dn11-ba 16= dlv, dlv11-e
; 18= Dmp, 20= dte20, dte20
; 22= Dv, dv11-aa/ba 24= dz, dz11-a or -b
; 28= Kdp, kmc11/dup11-da 30= kdz, kmc11/dz11-a
; 32= Kl, kl8-j 34= dmv, dmv11
; 36= Dpv, dpv11 38= dmf, dmf-32
; 40= Dmr, dmr11-aa 42= kmy, kms11-px
; 44= Kmx, kms11-bd/be
; 101-199 I-16 COMMUNICATION DEVICE RELATED:
; 200 C-17 SOFTWARE ID:
; 0 = No software id
; + = The length of the id field
; -1= Standard operating system
; -2= Maintenance system
; 201-299 I-16 SOFTWARE ID RELATED: a specific sofware id. Present only if
; Form +ive. Interpretation is specific to the receiving system.
; 300 1 SYSTEM PROCESSOR: 1= pdp-11, 2= pluto
; 301-399 I-16 SYSTEM PROCESSOR RELATED: information specific to the
; Particular system processor.
; 400 1 DATA LINK TYPE: 1= ETHERNET, 2= DDCMP, 3=LAPB
; 401 2 DATA LINK BUFFER SIZE: default = 262
; 402-499 I-16 DATA LINK RELATED: information specific to the
; Particular data link.
;
; All unknown types are reported as such and no further processing is done.
RRID: $SAVE <P3,P2,P1,T2,T1,S2,S1> ;Save some acs
DMOVEM P2,NODADH ;Save hi/lo hex address
;Do Request-Id jsys
$CALL RCRID ;Do REQ-ID
$RET ; Jsys error return
POPD SREQN ;Save request #
$CALL RDSTIM ; & read current time
;Do Read Status jsys
RRIH: PUSHD SREQN ;Push saved request number
$CALL RCSTS ;Do READ STATUS
$RET ; Jsys error return
$CALL RDFLGS ;Read status flags
$RET ; Ret+1 Error or timeout return
JRST RRIH ; Ret+2 Still pending, read again
; Ret+3 Successful
;Do Read Remote Console Reply for SYS-ID
PUSHD SREQN ;Get Req #
$CALL RCRPY ;Do READ REPLY (SYS-ID)
$RET ;No, exit
SKIPN TRCFLG ;Trace enabled?
SKIPE RRIFLG ;IDENTIFY command?
CAIA ;Yep
JRST RRIH2 ; No
$PMSG (<Request ID for node address: >)
PUSHD <NODADH,NODADL> ;Put address on data stack
$CALL PRHEX ;Print in HEX
$CALL PCRLF ;Print CRLF
MOVE P2,[POINT 8,TTOBUF] ;Set output buffer pointer to 1'st
HLRZ P1,RCRPYB+.LMRBL ;Function byte & get SYS-ID byte count
RRIH2: SKIPN DBGFLG ;Debug ?
JRST RRIDA ; No
DMOVE S1,SLOCH ;Make LOCAL ADDR = 123456789ABC
DMOVEM S1,LOCADH
MOVEI T1,6 ;Make sys-id HRDWR ADDR = NODADH/L
MOVE T3,[POINT 8,NODADH]
MOVE T4,[POINT 36,REQT3]
RRIH3: ILDB T2,T3 ;Get NODADH/L
IDPB T2,T4 ; put it in REQT3
SOJG T1,RRIH3 ; repeat 6 times
MOVE T4,[POINT 8,TTOBUF] ;Yes
MOVEI T1,0 ;Start loop counter
RRIH1: MOVE S1,REQTAB(T1) ;Load fake data
IDPB S1,T4 ; and deposit it for debug in TTOBUF
CAIE T1,4+RTEND-REQTAB ;Done?
AOJA T1,RRIH1 ;No, loop if not end of data
MOVEI P1,RTEND-REQTAB ;Fake the byte count
;Dispatch to a particular information type routine.
RRIDA: SKIPN TRCFLG ;Trace enabled?
SKIPE RRIFLG ;IDENTIFY command?
TRNA ;Yep
$RET ;No, exit
JUMPE P1,CPOPJ ;Exit if byte count = 0
ILDB S1,P2 ;Put 1'st INFO TYPE byte in S1
ILDB T1,P2 ;Put 2'nd INFO TYPE byte in T1
DPB T1,[POINT 8,S1,35-8] ; Construct the info type word
SUBI P1,2 ;Decrement byte count
CAIE S1,0 ;INFO TYPE = 0 ? (padding)
JRST RRA1 ; No, see what it is
IBP P2 ;Yes, skip over zero data length
SOJ P1, ;Decrement byte count
JRST RRIDA ;& try again
RRA1: CAIN S1,^D1 ;Is it maintenance ?
JRST RI1 ; Yes
CAIN S1,^D2 ;Is it functions ?
JRST RI2 ; Yes
CAIN S1,^D3 ;Is it console user ?
JRST RI3 ; Yes
CAIN S1,^D4 ;Is it reservation timer ?
JRST RI4 ; Yes
CAIN S1,^D5 ;Is it console command size ?
JRST RI5 ; Yes
CAIN S1,^D6 ;Is it console response size ?
JRST RI6 ; Yes
CAIN S1,^D7 ;Is it hardware address ?
JRST RI7 ; Yes
CAIN S1,^D8 ;Is it system time ?
JRST RI8 ; Yes
CAIN S1,^D100 ;Is it communication device ?
JRST RI100 ; Yes
CAIGE S1,^D101 ;Is it communication device related ?
JRST RRA2 ; No
CAIG S1,^D199
JRST RI101 ; Yes
RRA2: CAIN S1,^D200 ;Is it software id ?
JRST RI200 ; Yes
CAIGE S1,^D201 ;Is it software id related ?
JRST RRA3 ; No
CAIG S1,^D299
JRST RI201 ; Yes
RRA3: CAIN S1,^D300 ;Is it system processor ?
JRST RI300 ; Yes
CAIGE S1,^D301 ;Is it system processor related ?
JRST RRA4 ; No
CAIG S1,^D399
JRST RI301 ; Yes
RRA4: CAIN S1,^D400 ;Is it data link type ?
JRST RI400 ; Yes
CAIN S1,^D401 ;Is it data link buffer size ?
JRST RI401 ; Yes
CAIGE S1,^D402 ;Is it data link type related ?
JRST RRA5 ; No
CAIG S1,^D499
JRST RI402 ; Yes
;If the code got here, it must be unknown information type!
RRA5: $TEXT (,<? Unknown system type code: ^D/S1/>)
JRST RI997 ;Error exit
;* The following is jrst to when either the length field of type is
;* Incorrect or a data field is not what was expected. This is
;* Considered an error, and further reporting of system id information
;* Would be futile.
;*
;* Any additions or changes to the system id message in future hardware
;* May cause this to occur.
RI997: $PMSGC (< No further reporting will be done for this node!>)
$RET
;* RIDECO - Small subroutine to assist in printing the request ID data.
;
;Call with S1/ address of ASCIZ information type
; S2/ number of bytes in this type to subtract from P1
;Nonskip return: error
;Skip return: OK
RIDECO: ILDB T2,P2 ;Get the length byte
CAIN S2,(T2) ;Match?
JRST RIDEC1 ;Yep
$TEXT (,<? Request ID length error for "^T/(S1)/"
length should be ^D/S2/, it was ^D/T2/>)
$RET ;Non skip return
RIDEC1: $TEXT (,<^T/(S1)/: ^A>) ;Output string colon space
JRST CPOPJ1 ;Skip return
;* RIDECU -Small subroutine to assist in printing the request ID data.
;
;Call with S1/ information type number
; S2/ address of ASCIZ information type text
; length 1-16. bytes
;Nonskip return: error
;Skip return: OK
RIDECU: ILDB T2,P2 ;Get the length byte
SOJ P1, ;Count that byte
CAIG T2,^D16 ;Too long?
JUMPG T2,RIDEC2 ;Is it positive? Yep
$TEXT (,<? Request ID length error for "^T/(S2)/ ^D/S1/"
length should be 1-16, it was ^D/T2/>)
$RET ;Non skip return
RIDEC2: $TEXT (,<^T/(S2)/ ^D/S1/:
^A>) ;Output string colon cr lf tab
RIDEC4: ILDB S1,P2 ;Go get data
SOJ P1, ;Decrement byte count
$TEXT (,<^O/S1/ ^A>) ;Print the data
SOJG T2,RIDEC4 ;Print until no more data
$CALL PCRLF ;Output CRLF
JRST CPOPJ1 ;Skip return
;* Type 1, length 4= maintenance
; Value = ver:, eco:, user eco:
RI1: MOVEI S1,[ASCIZ/Maintenance/] ;Load type
MOVEI S2,3 ;Is it 3 ?
$CALL RIDECO ;Check it out
JRST RI997 ; and exit
RI1A: ILDB T1,P2 ;Get the version
ILDB T2,P2 ;Get ECO level
ILDB T3,P2 ;Get the user ECO
$TEXT (,<Ver: ^D/T1/, ECO: ^D/T2/, User ECO: ^D/T3/>)
SUBI P1,4 ;Decrement byte count
JRST RRIDA
;* Type 2, length 2 = functions
; Bit 0=loop, bit1=dump, bit2=primary loader, bit3= multi-block loader,
; Bit4=boot, bit5=console carrier, bit6= data link counters,
; Bit7=console carrier reservation
RI2: MOVEI S1,[ASCIZ/Functions supported/] ;Load type
MOVEI S2,2 ;Load length
$CALL RIDECO ;Check it
JRST RI997 ;Error exit
$PMSG (<
>) ;CRLF Tab
ILDB S2,P2 ;Get the data for lo byte
TRNE S2,1B35 ;Loop ?
$PMSG (<Loop, >) ;Yep
TRNE S2,1B34 ;Dump
$PMSG (<Dump, >) ; Yes
TRNE S2,1B33 ;Primary loader ?
$PMSG (<Primary Loader, >) ; Yes
TRNE S2,1B32 ;Multi-block loader ?
$PMSG (<Multi-Block Loader, >) ; Yes
TRNE S2,1B31 ;Boot ?
$PMSG (<Boot, >) ;Yes
TRNE S2,1B30 ;Console carrier ?
$PMSG (<Console Carrier, >) ;yes
TRNE S2,1B29 ;Data link counters ?
$PMSG (<Data Link Counters, >) ;Yes
TRNE S2,1B28 ;Console carrier reservation ?
$PMSG (<Console Carrier Reservation, >) ;Yep
ILDB S2,P2 ;Get the data for hi byte
$CALL PCRLF ;Output CRLF please
SKIPE S2 ;Skip if nothing there
$TEXT (,<
Upper byte data: ^O/S1/>)
SUBI P1,3 ;Decrement byte count
JRST RRIDA ;Go do next info type
;* Type 3, length 6 = console user:
; System address of the system that has the console reserved.
RI3: MOVEI S1,[ASCIZ/Console user/] ;Load type
MOVEI S2,6 ;Load length
$CALL RIDECO ;Check it
JRST RI997 ; and exit
RI3A: MOVEI T1,6 ;Get a 6
MOVE S1,[POINT 8,T3] ;Set up byte pointer
RI3B: ILDB T2,P2 ;Get the data for a byte
IDPB T2,S1 ;Load up
SOJG T1,RI3B ;Repeat for 6 bytes
TRZ T3,17 ;Clear unused bits 32-35
TRZ T4,17
CAIN T3,0 ;Zero first word?
CAIE T4,0 ;Zero second word?
JRST RI3C ; No, print node number
$PMSGC (<None>) ;None
JRST RI3D
RI3C: PUSHD <T3,T4> ;Push address on data stack
$CALL PRHEX ;Output hex
$CALL PCRLF ;Output crlf
RI3D: SUBI P1,7 ;Decrement byte count
JRST RRIDA ;Go do next info type
;* Type 4, length 2 = reservation timer:
; The maximum value, in seconds, of the timer used to clear unused
; Console reservations.
RI4: MOVEI S1,[ASCIZ/Reservation timer/] ;Load type
MOVEI S2,2 ;Load length
$CALL RIDECO ;Check it
JRST RI997 ; and exit
RI4A: ILDB T1,P2 ;Get the data for lo byte
ILDB T2,P2 ;Get the data for hi byte
DPB T2,[POINT 8,T1,35-8] ;Justify hi byte
$TEXT (,<^D/T1/. seconds>) ;Print it
SUBI P1,3 ;Decrement byte count
JRST RRIDA ;Go do next info type
;* Type 5, length 2 = console command size:
; The maximum size of the console command buffer.
RI5: MOVEI S1,[ASCIZ/Console command size/] ;Load type of data
MOVEI S2,2 ;Load length expected
$CALL RIDECO ;Check it out
JRST RI997 ; and exit
RI5A: ILDB T1,P2 ;Get the data for lo byte
ILDB T2,P2 ;Get the data for hi byte
DPB T2,[POINT 8,T1,35-8] ;Justify hi byte
$TEXT (,<^D/T1/. bytes>) ;Print it
SUBI P1,3 ;Decrement byte count
JRST RRIDA ;Go do next info type
;* Type 6, length 2 = console response size:
; The maximum size of the console response buffer.
RI6: MOVEI S1,[ASCIZ/Console response size/] ;Load type of data
MOVEI S2,2 ;Load length expected
$CALL RIDECO ;Check it out
JRST RI997 ; and exit
RI6A: ILDB T1,P2 ;Get the data for lo byte
ILDB T2,P2 ;Get the data for hi byte
DPB T2,[POINT 8,T1,35-8] ;Justify hi byte
$TEXT (,<^D/T1/. bytes>) ;Print it
SUBI P1,3 ;Decrement byte count
JRST RRIDA ;Go do next info type
;* Type 7, length 6 = hardware address:
; Contents of physical address rom on nia link module.
RI7: MOVEI S1,[ASCIZ/Hardware address/] ;Load type of data
MOVEI S2,6 ;Load length expected
$CALL RIDECO ;Check it out
JRST RI997 ; and exit
RI7A: MOVEI T1,6 ;Get a 6
MOVE S1,[POINT 8,T3] ;Set up byte pointer
RI7B: ILDB T2,P2 ;Get the data for a byte
IDPB T2,S1 ;Load T3/T4
SOJG T1,RI7B ;Repeat for 6 bytes
PUSHD <T3,T4>
$CALL PRHEX
$CALL PCRLF ;CRLF
SUBI P1,7 ;Decrement byte count
JRST RRIDA ;Go do next info type
;* Type 8, length 10 = system time:
; Segmented binary system time
RI8: MOVEI S1,[ASCIZ/System time/] ;Load type of data
MOVEI S2,^D10 ;Load length expected
$CALL RIDECO ;Check it out
JRST RI997 ; and exit
RI8A: ILDB T1,P2 ;Get century (19)
ILDB T2,P2 ;Get year (84)
ILDB T3,P2 ;Get month (2)
CAILE T3,^D12 ;Within range of 12 months?
MOVEI T3,0 ;Nope
MOVE T3,MONTAB(T3) ;Load month
ILDB T4,P2 ;Get day (7)
$TEXT (,<^D/T4/-^T/T3/-^D/T1/^D/T2/ ^A>)
ILDB T1,P2 ;Get hour (5)
ILDB T2,P2 ;Get min (30)
ILDB T3,P2 ;Get sec (20)
$TEXT (,<^D/T1/:^D/T2/:^D/T3/>)
IBP P2 ;Skip over rest
IBP P2
IBP P2
SUBI P1,13 ;Decrement byte count
JRST RRIDA ;Go do next info type
MONTAB: ASCIZ /?/
ASCIZ /Jan/
ASCIZ /Feb/
ASCIZ /Mar/
ASCIZ /Apr/
ASCIZ /May/
ASCIZ /Jun/
ASCIZ /Jul/
ASCIZ /Aug/
ASCIZ /Sep/
ASCIZ /Oct/
ASCIZ /Nov/
ASCIZ /Dec/
;* Type 100, length 1 = communication device:
; Where data is:
; 0 = Dp, dp11-da 1 = una, una
; 2 = Du, du11-da 3 = cna
; 4 = dl, dl11-c or -e 5 = qna
; 6 = Dq, dq11-da 7 = ci
; 8 = da, da11-b or -al 9 = pcl, pcl11-b
; 10= Dup, dup11-da 12= dmc, dmc11-da/ar,-ma/al or -fa/ar
; 14= Dn, dn11-ba 16= dlv, dlv11-e
; 18= Dmp, 20= dte20, dte20
; 22= Dv, dv11-aa/ba 24= dz, dz11-a or -b
; 28= Kdp, kmc11/dup11-da 30= kdz, kmc11/dz11-a
; 32= Kl, kl8-j 34= dmv, dmv11
; 36= Dpv, dpv11 38= dmf,
; 40= Dmr, 42= kmy, kms11-px
; 44= Kmx, kmx11-bd/be
RI100: MOVEI S1,[ASCIZ/Communication device/] ;Load type of data
MOVEI S2,1 ;Load length expected
$CALL RIDECO ;Check it out
JRST RI997 ; and exit
RI100A: ILDB S1,P2 ;Get the data
MOVSI T1,-COMMDL ;Load AOB pointer
RI100C: HLRZ T2,COMMDV(T1) ;Load the device type
CAME T2,S1 ;Match?
AOBJN T1,RI100C ;No, loop
HRRZ T2,COMMDV(T1) ;Point to ASCIZ
$TEXT (,<^D/S1/. ^T/(T2)/>) ;Output message and crlf
SUBI P1,2 ;Decrement byte count
JRST RRIDA ;Go do next info type
;Table of device numbers and associated ASCIZ types
COMMDV:
; XWD ^D0,[ASCIZ/DP/]
XWD ^D1,[ASCIZ/DEUNA/] ;PDP-11, VAX, Pluto, etc.
; XWD ^D2,[ASCIZ/DU/]
XWD ^D3,[ASCIZ/DECNA/] ;PRO-3xx
; XWD ^D4,[ASCIZ/DL/]
XWD ^D5,[ASCIZ/DEQNA/] ;Q-bus (Micro-11, MicroVAX)
; XWD ^D6,[ASCIZ/DQ/]
; XWD ^D7,[ASCIZ/CI/]
; XWD ^D8,[ASCIZ/DA/]
; XWD ^D9,[ASCIZ/PCL/]
; XWD ^D10,[ASCIZ/DUP/]
; XWD ^D12,[ASCIZ/DMC/]
; XWD ^D14,[ASCIZ/DN/]
XWD ^D15,[ASCIZ/NIA20/] ;NIA20
; XWD ^D16,[ASCIZ/DLV/]
XWD ^D17,[ASCIZ/DECserver-100/] ;Poseidon
; XWD ^D18,[ASCIZ/DMP/]
; XWD ^D20,[ASCIZ/DTE20/]
; XWD ^D22,[ASCIZ/DV/]
; XWD ^D24,[ASCIZ/DZ/]
; XWD ^D28,[ASCIZ/KDP/]
; XWD ^D30,[ASCIZ/KDZ/]
; XWD ^D32,[ASCIZ/KL/]
; XWD ^D34,[ASCIZ/DMV/]
; XWD ^D36,[ASCIZ/DPV/]
; XWD ^D38,[ASCIZ/DMF/]
; XWD ^D40,[ASCIZ/DMR/]
; XWD ^D42,[ASCIZ/KMY/]
; XWD ^D44,[ASCIZ/KMX/]
XWD ^D-1,[ASCIZ/(unknown)/]
COMMDL==.-COMMDV-1
;* Type 101-199, length 1-16 = communication device related
RI101: MOVEI S2,[ASCIZ/Communictions device related value/] ;Load type
$CALL RIDECU ;Check it out
JRST RI997 ; and exit
JRST RRIDA ;Go do next info type
;* Type 200, length C-17 = software id:
; 0 = No software id +ive= the length of the info field
; -1= Standard operating system -2= maintenance system
RI200: MOVEI P2, ;Load length expected
$CALL RIDECO ;Check it out
CAIE S1,0 ;Is it 0 ?
JRST RI200A ; No
$PMSGC (<Software ID: None>) ; Yes
JRST RRIDA ;That's all
RI200A: CAIE S1,377 ;Is it 377 (-1) ?
JRST RI200B ; No
$PMSGC (<Software ID: Standard operating system>) ; Yes
JRST RRIDA ;That's all
RI200B: CAIE S1,376 ;Is it 376 (-2) ?
JRST RI200C ; No
$PMSGC (<Software ID: Maintenance system>) ; Yes
JRST RRIDA ;That's all
RI200C: CAIG S1,^D17 ;.GT. 17 ?
JUMPG S1,RI200E ;Jump if positive
$TEXT (,<? Request ID length error for "Software ID"
length should be 1-17., it was ^D/S1/>)
JRST RI997 ; and exit
RI200E: $PMSG (<Software ID:
>)
RI200F: ILDB S1,P2 ;Go get data
SOJ P1, ;Decrement byte count
$TEXT (,<^O/S1/ ^A>) ;Print the byte
SOJG S1,RI200F ;Print until no more data
$CALL PCRLF ;Output crlf
JRST RRIDA ;Go do next info type
;* Type 201-299, length I-16 = software id related:
; A specific software id. Present only if +ive.
; Interpretation is specific to the receiving system.
RI201: MOVEI S2,[ASCIZ/Software ID related value/] ;Load label
$CALL RIDECU ;Decode and output the info
JRST RI997 ; and exit
JRST RRIDA ;Go do next info type
;* Type 300, length 1 = system processor:
; 1= Pdp-11, 2= pluto
RI300: MOVEI S1,[ASCIZ/System Processor/] ;Load type of data
MOVEI S2,1 ;Load length expected
$CALL RIDECO ;Check it out
JRST RI997 ; and exit
RI300A: ILDB S1,P2 ;Get the data
MOVEI T1,[ASCIZ/ (unknown)/] ;Point to default data
CAIN S1,^D1 ;Pdp-11 ?
MOVEI T1,[ASCIZ/ PDP-11/] ; Yes
CAIN S1,^D2 ;Pluto ?
MOVEI T1,[ASCIZ/ Pluto/] ;yes
$TEXT (,<^D/S1/.^T/(T1)/>) ;Print the result
SUBI P1,2 ;Decrement byte count
JRST RRIDA ;Go do next info type
;* Type 301-399, length I-16, = system processor related:
; Information specific to the particular system processor.
RI301: MOVEI S2,[ASCIZ/System Processor related value/] ;Load label
$CALL RIDECU ;Output that please
JRST RI997 ; and exit
JRST RRIDA ;Go do next info type
;* Type 400, length 1 = data link type:
; 1= Ethernet, 2= ddcmp, 3=lapb
RI400: MOVEI S1,[ASCIZ/Data Link type/] ;Load type of data
MOVEI S2,1 ;Load length expected
$CALL RIDECO ;Check it out
JRST RI997 ; and exit
RI400A: ILDB S1,P2 ;Get the data
SETZ T1, ;Load zero
CAIN S1,^D1 ;Ethernet ?
MOVEI T1,[ASCIZ/Ethernet/] ; Yes
CAIN S1,^D2 ;Ddcmp ?
MOVEI T1,[ASCIZ/DDCMP/] ; Yes
CAIN S1,^D3 ;Lapb ?
MOVEI T1,[ASCIZ/LAPB/] ; yes
$TEXT (,<^D/S1/. ^T/@T1/>)
SUBI P1,2 ;Decrement byte count
JRST RRIDA ;Go do next info type
;* Type 401, length 2 = data link buffer size
; default = 262
RI401: MOVEI S1,[ASCIZ/Data link buffer size/] ;Load type of data
MOVEI S2,2 ;Load length expected
$CALL RIDECO ;Check it out
JRST RI997 ; and exit
RI401A: ILDB T1,P2 ;Get the data for lo byte
ILDB S1,P2 ;Get the data for hi byte
DPB S1,[POINT 8,T1,35-8] ;Justify hi byte
$TEXT (,<^D/T1/. bytes>) ;Print it
SUBI P1,3 ;Decrement byte count
JRST RRIDA ;Go do next info type
;* Type 402-499, length I-16 = data link related:
; Information specific to the particular data link.
RI402: MOVEI S2,[ASCIZ/Data link related value/]
$CALL RIDECU ;Print out the values
JRST RI997 ; and exit
JRST RRIDA ;Go do next info type
SUBTTL Debug Table for Printing SYS-ID Info
;Fake SYS-ID information
;
; This tests the previous printout routine if DEBUG is enabled.
; For debug: LOCAL ADDRESS = 123456789ABC
; CONSOLE USER = 123456789ABC (hex)
; HARDWARE ADDRESS = NODADH/L
;
;Format
; Info type - 2 bytes
; Info length - 1 byte, value = x
; Info values - x bytes (lo byte to hi bytes)
REQTAB: 1 ;Info type = Maintenance version
0 ;Info type
3 ;Info length = 3 bytes
4 ;Info value, version
5 ;Info value, eco
6 ;Info value, user eco
2 ;Functions
0
2
REQT1: 177 ;177 = not reserved, 377 = reserved
123
3 ;Console user
0
6
REQT2: 0 ;For debug, LOCADH/L is set to 123456789ABC in RRID.
0 ; CONSOLE USER will be set to 123456789ABC in RESCON
0 ; & cleared in RELCON.
0
0
0
4 ;Reservation timer
0
2
10 ;lo byte, default to 10 sec
0 ;hi byte
5 ;Console command size
0
2
111 ;lo
0 ;hi
6 ;Console response size
0
2
333 ;lo
0 ;hi
7 ;Hardware address
0
6
REQT3: 0 ; make same as NODADH/L in RRID
0
0
0
0
0
^D8 ;System time
0
^D10
^D19
^D84
2
7
5
^D30
^D20
0
0
0
^D100 ;Communication device
0
1
^D12
^D142 ;Communication device related
0
^D10
1
2
3
4
5
6
7
10
11
12
^D200 ;Software id
0
-2&377
^D211 ;Software related
0
4
111
222
333
123
54 ;^D300 ;system processor
1
1
2
217 ;^D399 ;system processor related
1
3
1
2
3
220 ;^D400 ;data link
1
1
3
221 ;^D401 ;data link buffer size
1
2
321
456
302 ;^D450 ;data link related
1
2
321
321
RTEND: 0
0
0
0 ;EOF
SUBTTL Read Counters Reporting
;* RRCT Subroutine
;
;This routine will read the counters which are in the following format:
;
; byte counter
; length value
; ------ -------
; 2 Seconds since last zeroed
; 4 Bytes received
; 4 Bytes sent
; 4 Frames received
; 4 Frames sent
; 4 Multicast bytes received
; 4 Multicast frames received
; 4 Frames sent, initially deferred
; 4 Frames sent, single collision
; 4 Frames sent, multiple collision
; 2 Send failure
; 2 Send failure reason bitmap
;
; Bit Reason
; --- ------
; 0 Excessive collisions
; 1 Carrier check failed
; 2 Short circuit
; 3 Open circuit
; 4 Frame too long
; 5 Remote failure to defer
;
; 2 Receive failure
; 2 Receive failure reason bitmap
;
; Bit Reason
; --- ------
; 0 Block check error
; 1 Framing error
; 2 Frame too long
;
; 2 Unrecognized frame destination
; 2 Data overrun
; 2 System buffer unavailable
; 2 User buffer unavailable
;
RRCT: $SAVE <P3,P2,T2,T1,S2,S1> ;Save some acs
MOVEM P2,NODADH ;Save hi hex address (from GO HEX)
MOVEM P3,NODADL ;Save lo hex address
;Do Read Counters jsys
$CALL RCRCT ;Do Read Counters
JRST RRCTX ; Jsys error return
POPD SREQN ;Save request #
$CALL RDSTIM ; & read current time
;Do Read Status jsys
RRCT1: PUSHD SREQN ;Push saved request number
$CALL RCSTS ;Do READ STATUS
JRST RRCTX ; Jsys error return
$CALL RDFLGS ;Read status flags
JRST RRCTX ; Ret+1 Error or timeout return
JRST RRCT1 ; Ret+2 Still pending, read again
; Ret+3 Successful
;Do Read Remote Console Reply for READ COUNTERS
PUSHD SREQN ;Get Req #
$CALL RCRPY ;Do READ REPLY (counters)
JRST RRCTX ; Jsys error return
$PMSG (<Read Counters for node address: >)
PUSHD <NODADH,NODADL> ;Load two
$CALL PRHEX ; print hex
$CALL PCRLF ; and a CRLF
MOVE S2,[POINT 8,TTOBUF] ;Set output buffer pointer
SKIPN DBGFLG ;Debug ?
JRST RRCT3 ; No
MOVE T4,[POINT 8,TTOBUF] ;Yes, set output buffer byte pointer
SETZ T1,
RRCT2: MOVE S1,CTRTAB(T1) ;Load fake data
IDPB S1,T4 ; deposit in TTOBUF
CAIE T1,CTRSIZ ;Done?
AOJA T1,RRCT2 ;No, loop
;Printout all counters
RRCT3: SETZ T1, ;Read 2 bytes
$PMSG (<Seconds since last zeroed: >)
$CALL PNTNUM ;Get bytes & print
$PMSG (<Bytes received: >)
SETO T1, ;Read 4 bytes
$CALL PNTNUM ;Get bytes & print
$PMSG (<Bytes sent: >)
$CALL PNTNUM
$PMSG (<Frames received: >)
$CALL PNTNUM
$PMSG (<Frames sent: >)
$CALL PNTNUM
$PMSG (<Multicast bytes received: >)
$CALL PNTNUM
$PMSG (<Multicast frames received: >)
$CALL PNTNUM
$PMSG (<Frames sent, initially deferred: >)
$CALL PNTNUM
$PMSG (<Frames sent, single collision: >)
$CALL PNTNUM
$PMSG (<Frames sent, multiple collision: >)
$CALL PNTNUM
$PMSG (<Send failure: >)
SETZ T1, ;Read 2 bytes
$CALL PNTNUM
$PMSGC (<Send failure reason bitmap:>)
ILDB T2,S2 ;Get the data for lo byte
ILDB S1,S2 ;Get the data for hi byte
DPB S1,[POINT 8,T2,35-8] ;Justify it to t2
TRNE T2,1B35 ;Exessive collisions ?
$PMSGC (< Excessive collisions>) ; Yes
TRNE T2,1B34 ;Carrier check failed ?
$PMSGC (< Carrier check failed>) ; Yes
TRNE T2,1B33 ;Short circuit ?
$PMSGC (< Short circuit>) ; Yes
TRNE T2,1B32 ;Open circuit ?
$PMSGC (< Open circuit>) ; Yes
TRNE T2,1B31 ;Frame too long ?
$PMSGC (< Frame too long>) ; Yes
TRNE T2,1B30 ;Remote failure to defer ?
$PMSGC (< Remote failure to defer>) ;Yes
$PMSG (<Receive failure: >)
$CALL PNTNUM
$PMSGC (<Receive failure reason bitmap:>)
SETZ T1,
ILDB T1,S2 ;Get the data for lo byte
ILDB S1,S2 ;Get the data for hi byte
DPB S1,[POINT 8,T1,35-8] ;Justify it to t1
TRNE T1,1B35 ;Block check error ?
$PMSGC (< Block check error>) ; Yes
TRNE T1,1B34 ;Framing error ?
$PMSGC (< Framing error>) ; Yes
TRNE T1,1B33 ;Frame too short ?
$PMSGC (< Frame too short>) ; Yes
$PMSG (<Unrecognized frame destination: >)
$CALL PNTNUM
$PMSG (<Data overrun: >)
$CALL PNTNUM
$PMSG (<System buffer unavailable: >)
$CALL PNTNUM
$PMSG (<User buffer unavailable: >)
$CALL PNTNUM
RRCTX: $RET
SUBTTL Read Counter Bytes and Print
;* PNTNUM - Read counter bytes and print
; Enter with S2 pointing to the correct byte in TTOBUF
; T1 = 0 to take 2 bytes from TTOBUF
; T1 = -1 to take 4 bytes from TTOBUF
;
; Assemble the bytes in T2 and print it.
PNTNUM: SETZ T2,
ILDB T2,S2 ;Get the data for lo byte
ILDB S1,S2 ;Get the data for 2'nd byte
DPB S1,[POINT 8,T2,35-8] ;Justify it to t2
JUMPE T1,PN1 ;Jump if only need 2 bytes
ILDB S1,S2 ;Get the data for 3'rd byte
DPB S1,[POINT 8,T2,35-16] ;Justify it to t2
ILDB S1,S2 ;Get the data for 4'th byte
DPB S1,[POINT 8,T2,35-24] ;Justify it to t2
PN1: $TEXT (,<^D/T2/>) ;Output it and return
$RET
SUBTTL Debug Table for Printing Read Counters Information
; Dummy READ COUNTERS information
;
; This is a test of the previous printout routine to be used if the
; debug EXIT is enabled.
; Bytes are in the order of low to high
CTRTAB: 10 ;Seconds since last zeroed (lo byte)
0 ; (hi byte)
12 ;Bytes received
0
0
0
14 ;Bytes sent
0
0
0
16 ;Frames received
0
0
0
20 ;Frames sent
0
0
0
22 ;Multicast bytes received
0
0
0
24 ;Multicast frames received
0
0
0
26 ;Frames sent, initially deferred
0
0
0
30 ;Frames sent, single collision
0
0
0
32 ;Frames sent, multiple collision
0
0
0
34 ;Send failure
0
377 ;Send failure reason bitmap
0
36 ;Receive failure
0
377 ;Receive failure reason bitmap
0
40 ;Unrecognized frame destination
0
42 ;Data overrun
0
44 ;System buffer unavailable
0
46 ;User buffer unavailable
0
CTRSIZ==.-CTRTAB
SUBTTL Status Flag Reporting
;* RDFLGS Subroutine - Come here after doing "GO RCSTS" to report status flags
;
;* Return +1 if error or timeout
;* Return +2 if status pending & time not up.
;* Return +3 if successful
RDFLGS: HRRZ S2,RCSTSB+.LMSTF ;Get status from check status jsys
CAIE S2,.LMPND ;Request pending ?
JRST RDFL1 ; No, check the other flags
;The request is pending. See if 5 seconds have elapsed since the
; Operation was started. If it has, report it. If not read the status again.
$CALL OTIME ;See if 5 seconds have elapsed
SKIPA ;Error - time has elapsed
JRST RDFL2 ; Ret+2, to read status again
$PMSGC (<? Status message not returned within 5 seconds>)
JRST RDFL5
RDFL1: CAIN S2,.LMSUC ;Successful ?
JRST RDFL3 ; Yes, ret+3
CAIN S2,.LMABT ;Aborted ?
$PMSGC (<? Request ID message was aborted>)
CAIN S2,.LMTXF ;Transmit failed ?
$PMSGC (<? Transmit failure occured>)
CAIN S2,.LMCCE ;Channel communication error ?
$PMSGC (<? Channel communication error occured>)
CAILE S2,.LMCCE ;Unknown status type ?
$TEXT (,<? Unknown status code returned from remote console check status
Returned code = ^O/S2/>)
;Do abort outstanding command
RDFL5: $PMSG (< The target node address is >)
PUSHD <TARADH> ;Push hex digits 1-8
PUSHD <TARADL> ;Push hex digits 9-12
$CALL PRHEX ;Print the hex node address
$CALL PCRLF
DMOVE S1,TARADH ;Load the target address
CAMN S1,NODADH ;Does it match
CAME S2,NODADL ; the node address of the
CAIA ;Nope
JRST RDFL6 ;Yep
$PMSG (< The node address for REQID and READ COUNTERS is >)
PUSHD <NODADH> ;Push hex digits 1-8
PUSHD <NODADL> ;Push hex digits 9-12
$CALL PRHEX ;Print the hex node address
$CALL PCRLF ;Output CRLF and return
RDFL6: PUSHD SREQN ;Get Req#
$CALL RCABT ;Do ABORT
JRST RDFLX ; Jsys error return
$PMSG (<? Aborting after unsuccessful read status>)
JRST RDFLX
RDFL3: AOS (P) ;Do return +3
RDFL2: AOS (P) ;Do return +2
RDFLX: $RET ;Do return +1
SUBTTL Spear Reporting Subroutines
;* SPR1 - Send initial spear report 'diagnostic started'
; This subroutine makes a "DIAGNOSTIC STARTED" spear report. It determines if
; it should be made by looking at "SPRFLG". "SPRFLG" is is a flag word that
; is toggled by the commands ENABLE/DISABLE SPEAR-REPORTING. Spear reporting
; is never enabled on TOPS-10 because there is no facility to do it.
SPR1: $SAVE <S2,S1> ;Save some ac's
SKIPN SPRFLG ;Spear reporting enabled ?
$RET ;Bypass spear report
; Build entry
$CALL I%NOW ;Get time and day
MOVEM S1,SPR1TI ;Save it
PUSHD <NODADH,NODADL> ;Load the address
$CALL UHEX ;Convert to ASCIZ
POPD <T1,T2,T3,T4> ;Get back into the ACs
$TEXT (<-1,,SPR1MS>,<RMTCON version ^V/.JBVER/ user ^U/[-1]/ connecting to ^T/T1/^0>)
; Make the entry
MOVEI S1,SPR1BL ;Get address of argument block
MOVEI S2,SPR1LN ;Get length
SKIPN DBGFLG ;Skip if debugging
SYERR% ;Write to syserr file
$RET ;Return
; Spear entry
SPR1BL: 250000,,0 ;Header: Event type 250
0 ;Zero
0 ;Zero
0 ;Zero
2B23+2 ;Time of occurence block
SPR1TI: 0 ;Time
14B23+SPR1LN-6 ;Comment code, block length
2 ;String offset
SPR1MS: BLOCK ^D90/5 ;Should be plenty
SPR1LN==.-SPR1BL ;Length
;* SPR2 - makes successful completion spear report.
SPR2: $SAVE <S1,S2,T1,T2> ;Save some ac's
SKIPN SPRFLG ;Spear reporting enabled ?
$RET ;It isn't. Exit this subroutine
$CALL I%NOW ;Get time and day
MOVEM S1,SPR2TI ;Save it
PUSHD <NODADH,NODADL> ;Load the address
$CALL UHEX ;Convert to ASCIZ
POPD <T1,T2,T3,T4> ;Get back into the ACs
$TEXT (<-1,,SPR2MS>,<RMTCON version ^V/.JBVER/ user ^U/[-1]/ disconnect from ^T/T1/^0>)
MOVEI S2,SPR2LN ;Load length
MOVEI S1,SPR2BL ;Get address of argument block
SKIPN DBGFLG ;Debugging?
SYERR% ;Write to syserr file
$RET
; Spear entry block
SPR2BL: 250000,,0 ;Event type
0 ;Zero
0 ;Zero
0 ;Zero
2B23+2 ;Time of occurence block type 2
SPR2TI: 0 ;Time
14B23+SPR2LN-6 ;Type 11 code, block length
2 ;String offset
SPR2MS: BLOCK ^D90/5 ;Should be big enough
SPR2LN==.-SPR2BL ;Length of block
SUBTTL Remote Terminal Storage
CTMOD: 0 ;Controlling terminal parameters
CTCOC: BLOCK 2 ;Controlling terminal CCOC bits
TTMOD: 0 ;Terminal parameters
TTIWD: 0 ;Terminal interrupt word
BRKFLG: 0 ;Break flag. enabled = -1
CHRFLG: 0 ;Received character flag
MNOFLG: 0 ;Message Number flag
;Alternate between 0 & 1 in RCSND
;Should receive same sense in RCPOL
TTYJFN: BLOCK 1 ;Terminal JFN opened
IBUFCT: 0 ;Terminal input buffer char counter
OBUFCT: 0 ;Terminal output buffer char counter
TTIBUF: BLOCK BUFSIZ ;Terminal input buffer (command buffer)
TTOBUF: BLOCK BUFSIZ ;Terminal output buffer (response buff)
TTTEND==.-1 ;Table length end
CBUFSZ: ^D400 ;Default values...will be modified
RBUFSZ: ^D1000 ; in RESCON
SUBTTL General Storage
;* General Program Storage
CYCL60: Z ;^D50 or ^D60, local line frequency
ERRPNT: EXP ERRBUF ;Pointer to ASCIZ error message
ERRBUF: BLOCK <ERRLEN==DEC 135/5> ;ASCIZ error message stored here
PRTNBR: 0 ;Storage for selected port number
TARADH: 0 ;Hi address for TARGET NODE
TARADL: 0 ;Lo
LOCADH: 0 ;Hi address for LOCAL NODE
LOCADL: 0 ;Lo
NODADH: 0 ;Hi hex NODE address for REQ-ID cmd
NODADL: 0 ;Lo & READ-COUNTERS command
SLOCH: 44321,,263600 ;For debug, set LOCADH = 1-8,z hex
SLOCL: 465360,,0 ; LOCADL = 9-C,z hex in RRID
PWORDH: 0 ;Hi hex password verification code
PWORDL: 0 ;Lo
TIMST: 0 ;Start time of an event
TIMEND: 0 ;End time, contents of TIMST +5 seconds
RRIFLG: 0 ;Doing IDENTIFY command = -1
TRCFLG: 0 ;Trace enabled flag = -1
LOGFLG: 0 ;Logging enabled = -1
SPRFLG: 0 ;Spear enabled = -1
DBGFLG: 0 ;Debug enabled flag = -1
TTEXIT: "D"-100 ;TTY "exit" character
;Default to "Control-D" to Disconnect
SREQN: 0 ;Save Request number
PASCT: 0 ;Pass count
RBTCTR: 0 ;Remote boot counter
NODSEL: 0 ;Node selected flag
CMDPND: 0 ;Command pending flag
BCASTH: 777777,,777760 ;BCAST address used in DALLAD (byte 0,1,2,3,z)
BCASTL: 777774,,0 ;FF-FF-FF-FF-FF-FF (byte 4,5,z,z,z)
MCASTH: 526000,,40 ;MCAST address used in DALLAD (byte 0,1,2,3,z)
MCASTL: 0 ;AB-00-00-02-00-00 (byte 4,5,z,z,z)
PATCH: BLOCK ^D200 ;My DDT patch area
;Literals
LIT..M: XLIST ;LIT
LIT
LIST
END
;;;Local Modes:
;;;Mode: Macro
;;;Comment Column: 40
;;;End: