mirror of
https://github.com/PDP-10/stacken.git
synced 2026-03-02 01:30:40 +00:00
477 lines
13 KiB
Plaintext
477 lines
13 KiB
Plaintext
TITLE CISTS - Print Status of CI Network
|
||
SUBTTL Joseph A. Dziedzic /JAD 11-Apr-85
|
||
|
||
|
||
SEARCH GLXMAC,MSCPAR
|
||
SALL
|
||
PROLOG (CISTS)
|
||
|
||
|
||
CISVER==1 ;MAJOR VERSION
|
||
CISMIN==0 ;MINOR VERSION
|
||
CISEDT==1 ;EDIT NUMBER
|
||
CISWHO==0 ;WHO LAST EDITTED
|
||
|
||
LOC 137
|
||
.JBVER::!VRSN. CIS
|
||
RELOC
|
||
SUBTTL Parameters
|
||
|
||
|
||
ND FTPOLL,0 ;NON-ZERO TO ENABLE DEVICE POLLING
|
||
|
||
|
||
MAXNDS==20 ;MAXIMUM NUMBER OF NODES ON CI NETWORK
|
||
|
||
.SSMAX==100 ;SIZE OF SCS. UUO ARGUMENT BLOCK
|
||
|
||
BYTE1==BYTE(8)-1,0,0,0
|
||
BYTE2==BYTE(8)0,-1,0,0
|
||
BYTE3==BYTE(8)0,0,-1,0
|
||
BYTE4==BYTE(8)0,0,0,-1
|
||
SUBTTL Data segment
|
||
|
||
|
||
IB: $BUILD IB.SZ ;BUILD IB
|
||
$SET (IB.PRG,,%%.MOD) ;PROGRAM NAME
|
||
IFN FTPOLL,<
|
||
$SET (IB.INT,,VECTOR) ;ADDRESS OF INTERRUPT VECTOR BLOCK
|
||
>; END IFN FTPOLL
|
||
$EOB
|
||
|
||
IFN FTPOLL,<
|
||
OURDNM: ASCII .T-10$CISTS .
|
||
YURDNM: ASCII .MSCP$DISK .
|
||
>; END IFN FTPOLL
|
||
|
||
$DATA PDLIST,100 ;PUSH DOWN LIST
|
||
|
||
$DATA CPUPTR ;AOBJN POINTER TO DO CPU'S
|
||
$DATA CPUSTS,6 ;STATUS OF CPU - .LE. ZERO IF OK
|
||
$DATA CPULNN,6 ;LOCAL NODE NUMBER
|
||
|
||
$DATA SCSBLK,.SSMAX ;FOR DOING SCS. UUO
|
||
|
||
$DATA PTHSTS,MAXNDS ;PATH STATUS FOR EACH NODE AND EACH CPU
|
||
|
||
IFN FTPOLL,<
|
||
$DATA MSCSRV,MAXNDS ;NON-ZERO IF NODE HAS MSCP SERVER
|
||
$DATA MSGBUF ;ADDRESS OF MESSAGE BUFFER
|
||
$DATA MSGSIZ ;SIZE OF MESSAGE BUFFER
|
||
$DATA VECTOR,4 ;INTERRUPT VECTOR BLOCK
|
||
$DATA OURCID ;OUR CONNECT ID
|
||
>; END IFN FTPOLL
|
||
SUBTTL Initialization
|
||
|
||
|
||
START: JFCL ;IN CASE CCL ENTRY
|
||
RESET ;RESET ALL I/O
|
||
|
||
MOVE P,[IOWD 100,PDLIST] ;SET UP STACK
|
||
MOVX S1,IB.SZ ;LENGTH OF IB
|
||
MOVEI S2,IB ;ADDRESS OF IB
|
||
$CALL I%INIT ;GET THE GALAXY LIBRARY
|
||
|
||
IFN FTPOLL,<
|
||
$CALL ZERSCS ;ZERO THE SCS. UUO BLOCK
|
||
MOVE S1,[.SQLDG+1,,.SSRBS] ;GET BUFFER SIZES
|
||
MOVEM S1,SCSBLK+.SQFNC ;STORE IT
|
||
XMOVEI S1,SCSBLK ;ADDRESS OF BLOCK
|
||
SCS. S1, ;ASK THE MONITOR
|
||
JRST SCSERR ;ERROR
|
||
MOVE S1,SCSBLK+.SQLMG ;GET MAXIMUM LENGTH OF MESSAGE BUFFER
|
||
ADDI S1,10 ;(.MHUDA)
|
||
MOVEM S1,MSGSIZ ;STORE SIZE
|
||
$CALL M%GMEM ;GET A BUFFER
|
||
MOVEM S2,MSGBUF ;STORE FOR LATER
|
||
>; END IFN FTPOLL
|
||
|
||
MOVX T1,%CNCPU ;NUMBER OF CPU'S IN SYSTEM
|
||
GETTAB T1, ;ASK
|
||
$STOP (CDS,Can't determine number of CPUs in system)
|
||
MOVNS T1 ;MAKE AN AOBJN POINTER
|
||
HRLZS T1 ;...
|
||
MOVEM T1,CPUPTR ;SAVE FOR LATER
|
||
$CALL ZERSCS ;ZERO SCS. UUO BLOCK
|
||
MOVE S1,[.SQLNN+1,,.SSGLN] ;FUNCTION
|
||
MOVEM S1,SCSBLK+.SQFNC ;STORE IT
|
||
MOVE T1,CPUPTR ;AOBJN POINTER TO CPU DATA
|
||
|
||
GETCST: HRRZ T2,T1 ;GET CPU NUMBER
|
||
LSH T2,1 ;TIMES TWO
|
||
ADDX T2,%CCOKP ;GETTAB FOR CPU OK WORD
|
||
GETTAB T2, ;ASK MONITOR
|
||
MOVEI T2,1 ;MONITOR WON'T SAY, ASSUME IT'S DEAD
|
||
MOVEM T2,CPUSTS(T1) ;SAVE IT
|
||
JUMPG T2,GETCS2 ;JUMP IF CPU IS DOWN
|
||
STORE T1,SCSBLK+.SQFNC,SS.CPU ;STORE CPU NUMBER
|
||
XMOVEI S1,SCSBLK ;POINT AT ARGUMENT BLOCK
|
||
SCS. S1, ;DO THE UUO
|
||
SKIPA ;ERROR, CHECK IT OUT
|
||
JRST GETCS1 ;PROCEED
|
||
CAXE S1,SSNPC% ;NO CI PORT ON THIS CPU?
|
||
JRST SCSERR ;NO, REAL ERROR
|
||
MOVEI S1,1 ;GET A POSITIVE NUMBER
|
||
MOVEM S1,CPUSTS(T1) ;TO MAKE CPU CHECKS FAIL
|
||
JRST GETCS2 ;SKIP THIS CPU
|
||
GETCS1: MOVE T2,SCSBLK+.SQLNN ;GET LOCAL NODE NUMBER
|
||
MOVEM T2,CPULNN(T1) ;SAVE THAT
|
||
GETCS2: AOBJN T1,GETCST ;LOOP FOR ALL
|
||
SUBTTL Print Path Status
|
||
|
||
|
||
;Get path status for each CPU for each node
|
||
|
||
MOVX S1,MAXNDS ;LENGTH OF BLOCK
|
||
MOVEI S2,PTHSTS ;POINT AT BLOCK
|
||
$CALL .ZCHNK ;ZERO IT
|
||
|
||
$CALL ZERSCS ;ZERO SCS. UUO BLOCK
|
||
|
||
MOVE S1,[.SQRPS+1,,.SSRPS] ;FUNCTION
|
||
MOVEM S1,SCSBLK+.SQFNC ;STORE IT
|
||
MOVE P1,CPUPTR ;GET AOBJN POINTER FOR CPU STUFF
|
||
|
||
GETPTS: SKIPLE CPUSTS(P1) ;THIS CPU LOOK OK?
|
||
JRST GETPT2 ;NO
|
||
STORE P1,SCSBLK+.SQFNC,SS.CPU ;STORE CPU NUMBER
|
||
MOVSI P2,-MAXNDS ;MAXIMUM NUMBER OF NODES
|
||
GETPT1: HRRZM P2,SCSBLK+.SQRPN ;STORE NODE NUMBER
|
||
XMOVEI S1,SCSBLK ;POINT AT BLOCK
|
||
SCS. S1, ;ASK
|
||
JRST SCSERR ;ERROR
|
||
MOVE T1,SCSBLK+.SQRPS ;GET PATH STATUS
|
||
LSH T1,(P1) ;SHIFT BY CPU NUMBER
|
||
IORM T1,PTHSTS(P2) ;STORE ON A PER-NODE BASIS
|
||
AOBJN P2,GETPT1 ;LOOP FOR ALL NODES
|
||
GETPT2: AOBJN P1,GETPTS ;LOOP FOR ALL CPUS
|
||
;Print status
|
||
|
||
$TEXT ,<Open Paths:
|
||
|
||
CI Node 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
|
||
>
|
||
MOVE P1,CPUPTR ;GET CPU POINTER
|
||
TYPPTS: SKIPLE CPUSTS(P1) ;CPU LOOK OK?
|
||
JRST TYPPT3 ;NO
|
||
$TEXT ,<CPU^D5L /P1,RHMASK/^A> ;CPU NUMBER
|
||
MOVSI P2,-MAXNDS ;GET NODE POINTER
|
||
TYPPT1: HRRZ T1,P2 ;GET NODE NUMBER
|
||
CAMN T1,CPULNN(P1) ;SELF?
|
||
JRST [MOVE T2,["-",,"-"] ;YES, GET TEXT
|
||
JRST TYPPT2] ;PRINT THAT INSTEAD OF STATUS
|
||
MOVE T1,PTHSTS(P2) ;GET PATH STATUS
|
||
MOVNI T2,(P1) ;GET -VE CPU NUMBER
|
||
LSH T1,(T2) ;RIGHT-JUSTIFY BITS FOR THIS NODE
|
||
SETZ T2, ;ZERO T2
|
||
TLZE T1,1 ;BIT SET?
|
||
TLOA T2,"A" ;YES
|
||
TLO T2," " ;NO
|
||
TRZE T1,1 ;BIT SET?
|
||
TROA T2,"B" ;YES
|
||
TRO T2," " ;NO
|
||
TYPPT2: $TEXT ,< ^7/T2,LHMASK/^7/T2,RHMASK/^A> ;PRINT STATUS
|
||
AOBJN P2,TYPPT1 ;LOOP FOR NEXT NODE
|
||
$TEXT ,<> ;CRLF
|
||
TYPPT3: AOBJN P1,TYPPTS ;LOOP FOR NEXT CPU
|
||
SUBTTL Print Node Configuration Data
|
||
|
||
|
||
$TEXT ,<
|
||
|
||
Configuration Data:>
|
||
|
||
IFN FTPOLL,<
|
||
MOVX S1,MAXNDS ;MAXIMUM NUMBER OF NODES
|
||
MOVEI S2,MSCSRV ;ADDRESS OF BLOCK
|
||
$CALL .ZCHNK ;ZERO IT
|
||
>; END IFN FTPOLL
|
||
|
||
$CALL ZERSCS ;ZERO SCS. UUO BLOCK
|
||
|
||
MOVE S1,[.SQLPN+1,,.SSRCD] ;FUNCTION
|
||
MOVEM S1,SCSBLK+.SQFNC ;STORE IT
|
||
MOVSI P2,-MAXNDS ;LOOP FOR ALL NODES
|
||
|
||
TYPCNF: SKIPN T1,PTHSTS(P2) ;ANY OPEN PATHS TO THIS NODE?
|
||
JRST TYPCN1 ;NO
|
||
HLRZ T2,T1 ;GET PATH A STATUS TO RH OF T2
|
||
IOR T1,T2 ;COMBINED STATUS IN RH OF T1
|
||
TLZ T1,-1 ;CLEAR LH JUNK NOW
|
||
JFFO T1,.+1 ;COMPUTE CPU NUMBER TO USE
|
||
MOVEI P1,^D35 ;...
|
||
SUB P1,T2 ;...
|
||
STORE P1,SCSBLK+.SQFNC,SS.CPU ;STORE CPU NUMBER
|
||
HRRZM P2,SCSBLK+.SQOND ;STORE NODE NUMBER
|
||
XMOVEI S1,SCSBLK ;POINT AT BLOCK
|
||
SCS. S1, ;ASK
|
||
JRST SCSERR ;ERROR
|
||
$TEXT ,<
|
||
Node ^D/SCSBLK+.SQOND/:>
|
||
LOAD T1,SCSBLK+.SQVCS,LHMASK ;GET VC STATE
|
||
$TEXT ,<Virtual circuit state: ^T/@VCSTAT(T1)/>
|
||
MOVE T1,SCSBLK+.SQDST ;SOFTWARE TYPE
|
||
$TEXT ,<Software type: ^I/EBITT1/>
|
||
MOVE T1,SCSBLK+.SQDSV ;SOFTWARE VERSION
|
||
$TEXT ,<Software version: ^I/EBITT1/>
|
||
MOVE T1,SCSBLK+.SQDHT ;HARDWARE TYPE
|
||
$TEXT ,<Hardware type: ^I/EBITT1/>
|
||
MOVE T1,SCSBLK+.SQNNM ;NODE NAME
|
||
$TEXT ,<Node name: ^I/EBITT1/^A>
|
||
MOVE T1,SCSBLK+.SQNNM+1 ;SECOND WORD
|
||
$TEXT ,<^I/EBITT1/>
|
||
LDB T1,[POINT 8,SCSBLK+.SQPCW,31] ;GET HARDWARE TYPE
|
||
IFN FTPOLL,<
|
||
CAIN T1,4 ;HSC?
|
||
SETOM MSCSRV(P2) ;YES, REMEMBER MSCP SERVERS (ONLY HSC FOR NOW)
|
||
>; END IFN FTPOLL
|
||
MOVEI T2,[ASCIZ /unknown/] ;ASSUME WORST CASE
|
||
CAIN T1,4 ;HSC?
|
||
MOVEI T2,[ASCIZ /HSC-50/]
|
||
CAIN T1,6 ;KL-10?
|
||
MOVEI T2,[ASCIZ /KL-10/]
|
||
$TEXT ,<Port type: ^T/@T2/>
|
||
TYPCN1: AOBJN P2,TYPCNF ;LOOP FOR NEXT NODE
|
||
SUBTTL Print Device Configuration
|
||
|
||
|
||
IFN FTPOLL,< ;FEATURE WANTED?
|
||
DEVPAT: JRST DONE ;FOR NOW
|
||
XMOVEI S1,SCSINT ;ADDRESS OF INTERRUPT HANDLER
|
||
MOVEM S1,VECTOR+.PSVNP
|
||
SETZM VECTOR+.PSVFL ;NO FLAGS
|
||
SETZM VECTOR+.PSVIS ;NO STATUS
|
||
MOVE S1,[PS.FAC+[EXP .PCSCS,0,0]] ;ADD SCS EVENT INTERRUPT
|
||
PISYS. S1, ;DO IT
|
||
$STOP (CAC,Can't add interrupt condition)
|
||
$CALL I%ION ;TURN ON THE INTERRUPT SYSTEM
|
||
MOVSI P2,-MAXNDS ;LOOP FOR ALL NODES
|
||
|
||
TYPDEV: SKIPE T1,PTHSTS(P2) ;ANY OPEN PATHS TO THIS NODE?
|
||
SKIPN MSCSRV(P2) ;YES, DOES IT HAVE AN MSCP SERVER?
|
||
JRST TYPDVN ;NO
|
||
HLRZ T2,T1 ;GET PATH A STATUS TO RH OF T2
|
||
IOR T1,T2 ;COMBINED STATUS IN RH OF T1
|
||
TLZ T1,-1 ;CLEAR LH JUNK NOW
|
||
JFFO T1,.+1 ;COMPUTE CPU NUMBER TO USE
|
||
MOVEI P1,^D35 ;...
|
||
SUB P1,T2 ;...
|
||
|
||
$CALL ZERSCS ;ZERO SCS. UUO BLOCK
|
||
|
||
MOVE T1,[.SQRCI+1,,.SSCON] ;FUNCTION
|
||
MOVEM T1,SCSBLK+.SQFNC ;STORE IT
|
||
MOVE T1,[POINT 7,OURDNM] ;POINTER TO OUR PROCESS NAME
|
||
MOVEM T1,SCSBLK+.SQSPN ;STORE IT
|
||
MOVE T1,[POINT 7,YURDNM] ;POINTER TO HIS PROCESS NAME
|
||
MOVEM T1,SCSBLK+.SQDPN ;STORE IT
|
||
SETZM SCSBLK+.SQAMC ;WE'LL QUEUE MESSAGE BUFFERS AS WE NEED THEM
|
||
SETZM SCSBLK+.SQADC ;NO NEED FOR DATAGRAMS HERE
|
||
STORE P1,SCSBLK+.SQFNC,SS.CPU ;STORE CPU NUMBER
|
||
STORE P2,SCSBLK+.SQSYS,LHMASK ;STORE NODE NUMBER
|
||
XMOVEI S1,SCSBLK ;POINT AT BLOCK
|
||
SCS. S1, ;ASK
|
||
JRST SCSERR ;ERROR
|
||
MOVE T1,SCSBLK+.SQRCI ;GET OUR CID
|
||
MOVEM T1,OURCID ;SAVE IT FOR LATER
|
||
|
||
$CALL SCSWAT ;WAIT FOR SOMETHING TO HAPPEN
|
||
$CALL ZERSCS ;ZERO SCS. UUO BLOCK
|
||
MOVE S1,[.SSMAX,,.SSEVT] ;FUNCTION
|
||
MOVEM S1,SCSBLK+.SQFNC ;STORE IT
|
||
MOVE S1,OURCID ;OUR CONNECT ID
|
||
MOVEM S1,SCSBLK+.SQCID ;STORE IT
|
||
XMOVEI S1,SCSBLK ;POINT AT BLOCK
|
||
SCS. S1, ;ASK
|
||
JRST SCSERR ;SHOULD HAVE A RESPONSE BY NOW
|
||
MOVE S1,SCSBLK+.SQEVT ;GET TYPE OF EVENT
|
||
CAIN S1,.SECRR ;REJECTED?
|
||
JRST TYPDV1 ;YES
|
||
CAIN S1,.SECRA ;ACCEPTED?
|
||
JRST TYPDV2 ;YES
|
||
$STOP (UET,Unknown event type ^O/S1/)
|
||
|
||
TYPDV1: $TEXT ,<%Connection request rejected - code ^O/SCSBLK+.SQDTA/>
|
||
JRST TYPDVN ;TRY NEXT
|
||
|
||
TYPDV2: MOVE P1,MSGBUF ;COPY ADDRESS HERE FOR A BIT
|
||
MOVX T1,CF.576 ;ONLY USEFUL BIT
|
||
PUSHJ P,REVFUL ;REVERSE BITS
|
||
MOVEM T1,P.CNTF(P1) ;STORE IN PACKET
|
||
SETZ T1, ;NO UNIT NUMBER
|
||
MOVX T2,OP.SCC ;OPCODE
|
||
MOVX T3,P%CDPR ;LENGTH
|
||
$CALL SNDRCV ;SEND THE MESSAGE, WAIT FOR RESPONSE
|
||
|
||
MOVE T1,P.CNTF(P1) ;GET FLAGS
|
||
PUSHJ P,REVFUL ;MAKE THEM MEANINGFUL
|
||
TXNE T1,CF.576 ;576-BYTE MODE?
|
||
SKIPA T1,[ASCII .576.]
|
||
MOVE T1,[ASCII .512.]
|
||
$TEXT ,< Controller: ^5/T1/-byte sector mode>
|
||
SETZ P4, ;START WITH UNIT ZERO
|
||
|
||
TYPDV3: HRRZ T1,P4 ;GET CURRENT UNIT NUMBER
|
||
MOVE T2,[MD.NXU+OP.GUS] ;ASK FOR STATUS OF NEXT UNIT
|
||
MOVX T3,P%OPCD ;LENGTH
|
||
$CALL SNDRCV ;SEND THE MESSAGE, WAIT FOR RESPONSE
|
||
|
||
MOVE T1,P.UNIT(P1) ;GET UNIT NUMBER
|
||
PUSHJ P,REVFUL ;REVERSE BYTES
|
||
LSH T1,-4 ;RIGHT-JUSTIFY IT
|
||
ANDI T1,177777 ;KEEP JUST UNIT NUMBER
|
||
HRR P4,T1 ;SAVE A COPY HERE
|
||
JUMPN P4,TYPDV4 ;GO IF NOT UNIT ZERO
|
||
LDB T1,[POINT PKSEST,P.STS(P1),PKPEST] ;GET STATUS
|
||
CAIN T3,ST%OFL ;OFFLINE?
|
||
JRST TYPDV5 ;NO DRIVES ON THIS HSC
|
||
TXOE P4,1B0 ;FIRST TIME WE'VE SEEN A ZERO?
|
||
JRST TYPDV5 ;NO, THIS ZERO MEANT NO MORE UNITS
|
||
TYPDV4: TXO P4,1B0 ;SHOW WE'VE PROCESSED UNIT ZERO
|
||
$TEXT ,< Unit: ^D/P4,RHMASK/>
|
||
JRST TYPDV3 ;TRY NEXT UNIT
|
||
|
||
TYPDV5: $CALL ZERSCS ;ZERO SCS. UUO BLOCK
|
||
MOVE S1,[.SQDIS+1,,.SSDIS] ;FUNCTION
|
||
MOVEM S1,SCSBLK+.SQFNC ;STORE IT
|
||
MOVE S1,OURCID ;GET CONNECT ID
|
||
MOVEM S1,SCSBLK+.SQCID ;STORE IT
|
||
XMOVEI S1,SCSBLK ;POINT AT BLOCK
|
||
SCS. S1, ;DISCONNECT
|
||
JRST SCSERR ;ERROR
|
||
|
||
TYPDVN: AOBJN P2,TYPDEV ;LOOP FOR NEXT NODE
|
||
>; END IFN FTPOLL
|
||
SUBTTL All Done
|
||
|
||
|
||
DONE: $CALL I%EXIT ;EXIT
|
||
SUBTTL Miscellaney
|
||
|
||
|
||
IFN FTPOLL,<
|
||
SNDRCV: PUSHJ P,.SAVE2 ;SAVE P1-P2
|
||
MOVE P1,MSGBUF ;ADDRESS OF MESSAGE BUFFER
|
||
MOVE P2,T2 ;OPCODE FOR LATER CHECKS
|
||
MOVE S1,MSGSIZ ;SIZE OF PACKET
|
||
MOVE S2,MSGBUF ;ADDRESS
|
||
$CALL .ZCHNK ;ZERO IT
|
||
|
||
$CALL ZERSCS ;ZERO SCS. UUO BLOCK
|
||
MOVE S1,[.SQFLG+1,,.SSSMG] ;FUNCTION
|
||
MOVEM S1,SCSBLK+.SQFNC ;STORE IT
|
||
MOVE S1,OURCID ;CONNECT ID
|
||
MOVEM S1,SCSBLK+.SQCID ;STORE
|
||
|
||
LSH T1,4 ;POSITION UNIT NUMBER
|
||
PUSHJ P,REVFUL ;REVERSE
|
||
MOVEM T1,P.UNIT(P1) ;STORE
|
||
MOVE T1,T2 ;GET OPCODE/MODIFIERS
|
||
PUSHJ P,REVFUL ;REVERSE
|
||
MOVEM T1,P.OPCD(P1) ;STORE
|
||
MOVEM T3,SCSBLK+.SQLPT ;LENGTH OF PACKET
|
||
MOVEM P1,SCSBLK+.SQAPT ;ADDRESS OF IT
|
||
XMOVEI S1,SCSBLK ;POINT AT BLOCK
|
||
SCS. S1, ;SEND IT
|
||
JRST SCSERR ;ERROR
|
||
|
||
$CALL SCSWAT ;WAIT FOR SOMETHING TO HAPPEN
|
||
|
||
$CALL ZERSCS ;ZERO SCS. UUO BLOCK
|
||
MOVE S1,[.SQAFB+1,,.SSQRM] ;FUNCTION
|
||
MOVEM S1,SCSBLK+.SQFNC ;STORE IT
|
||
MOVE S1,MSGBUF ;ADDRESS OF BUFFER
|
||
MOVEM S1,SCSBLK+.SQAFB ;STORE IT
|
||
XMOVEI S1,SCSBLK ;POINT AT BLOCK
|
||
SCS. S1, ;QUEUE IT
|
||
JRST SCSERR ;ERROR
|
||
|
||
$CALL ZERSCS ;ZERO SCS. UUO BLOCK
|
||
MOVE S1,[.SQLRP+1,,.SSRMG] ;FUNCTION
|
||
MOVEM S1,SCSBLK+.SQFNC ;STORE IT
|
||
MOVE S1,OURCID ;OUR CONNECT ID
|
||
MOVEM S1,SCSBLK+.SQCID ;STORE IT
|
||
XMOVEI S1,SCSBLK ;POINT AT BLOCK
|
||
SCS. S1, ;RECEIVE IT
|
||
JRST SCSERR ;ERROR
|
||
CAME P1,SCSBLK+.SQARB ;THIS SHOULD CERTAINLY MATCH!
|
||
$STOP (RWB,Received message in wrong buffer)
|
||
MOVE T1,P.OPCD(P1) ;GET OPCODE
|
||
PUSHJ P,REVFUL ;REVERSE IT
|
||
CAME T1,P2 ;SAME AS WE CALLED WITH?
|
||
$STOP (RWM,Received wrong message - expected opcode ^O/P2/, received opcode ^O/T1/)
|
||
$RETT ;SUCCESS
|
||
>; END IFN FTPOLL
|
||
|
||
REVFUL: $CALL .SAVE3 ;SAVE P1-P3
|
||
LDB P1,PBYTE1 ;PICK UP THE BYTES
|
||
LDB P2,PBYTE2 ;...
|
||
LDB P3,PBYTE3 ;...
|
||
LSH T1,^D24 ;POSITION LEFT OVER BYTE
|
||
DPB P3,PBYTE2 ;PUT THEM IN BACKWARDS
|
||
DPB P2,PBYTE3 ;...
|
||
DPB P1,PBYTE4 ;...
|
||
POPJ P, ;RETURN
|
||
|
||
;BYTE POINTERS USED BY REVFUL
|
||
|
||
PBYTE1: POINT 8,T1,7
|
||
PBYTE3: POINT 8,T1,23
|
||
PBYTE2: POINT 8,T1,15
|
||
PBYTE4: POINT 8,T1,31
|
||
|
||
|
||
ZERSCS: MOVX S1,.SSMAX ;LENGTH OF BLOCK
|
||
MOVEI S2,SCSBLK ;ADDRESS OF IT
|
||
$CALL .ZCHNK ;ZERO IT
|
||
$RETT ;RETURN
|
||
|
||
SCSWAT: MOVEI S1,^D5 ;WAIT FOR ABOUT 5 SECONDS
|
||
$CALL I%SLP ;...
|
||
$RETT ;HOPE WE WERE INTERRUPTED
|
||
|
||
IFN FTPOLL,<
|
||
SCSQMB: $CALL ZERSCS ;ZERO SCS. BLOCK
|
||
MOVE S1,[.SQAFB+1,,.SSQRM] ;FUNCTION
|
||
MOVEM S1,SCSBLK+.SQFNC ;STORE IT
|
||
MOVE S1,MSGBUF ;ADDRESS OF MESSAGE BUFFER
|
||
SETZM (S1) ;ONLY ONE BUFFER
|
||
MOVEM S1,SCSBLK+.SQAFB ;STORE ADDRESS
|
||
XMOVEI S1,SCSBLK ;POINT AT BLOCK
|
||
SCS. S1, ;DO IT
|
||
JRST SCSERR ;ERROR
|
||
$RETT ;RETURN
|
||
>; END IFN FTPOLL
|
||
|
||
SCSINT: $BGINT 1 ;BEGIN LEVEL 1 INTERRUPT
|
||
$DEBRK ;JUST GET US OUT OF HIBERNATION
|
||
|
||
EBITT1: ITEXT (<^7/T1,BYTE1/^7/T1,BYTE2/^7/T1,BYTE3/^7/T1,BYTE4/>)
|
||
|
||
VCSTAT: [ASCIZ .closed.]
|
||
[ASCIZ .START sent.]
|
||
[ASCIZ .START received.]
|
||
[ASCIZ .open.]
|
||
|
||
SCSERR: HRRZ S2,S1 ;COPY ERROR CODE
|
||
CAIL S2,SCSETL ;KNOWN ERROR?
|
||
MOVEI S2,SCSETL ;NO, USE GENERIC CASE
|
||
$STOP (SCS,<SCS. UUO error (^O/S1/) ^T/@SCSETX(S2)/>)
|
||
|
||
SCSETX: [ASCIZ .not privileged.]
|
||
[ASCIZ .illegal function code.]
|
||
[ASCIZ .bad argument list length.]
|
||
[ASCIZ .address check reading arguments.]
|
||
[ASCIZ .address check storing data.]
|
||
[ASCIZ .CPU number out of range.]
|
||
[ASCIZ .no CI port on specified CPU.]
|
||
[ASCIZ .CPU's CI node number unknown.]
|
||
[ASCIZ .invalid CI node number.]
|
||
[ASCIZ .no free core.]
|
||
SCSETL==.-SCSETX
|
||
[ASCIZ .unknown error code.]
|
||
SUBTTL The End
|
||
|
||
|
||
END START
|