mirror of
https://github.com/PDP-10/stacken.git
synced 2026-03-02 09:37:06 +00:00
3266 lines
93 KiB
Plaintext
3266 lines
93 KiB
Plaintext
|
||
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:
|