1
0
mirror of https://github.com/PDP-10/stacken.git synced 2026-03-02 09:37:06 +00:00
Files
Lars Brinkhoff 6e18f5ebef Extract files from tape images.
Some tapes could not be extracted.
2021-01-29 10:47:33 +01:00

3266 lines
93 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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: