Trailing-Edge
-
PDP-10 Archives
-
BB-F493Z-DD_1986
-
10,7/cists.mac
There are 8 other files named cists.mac in the archive. Click here to see a list.
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