TITLE NMLDPY Network Management Listener Display SUBTTL Robert A. Brown, August 1983 SUBTTL Converted to DPY: Philip Budne, December 1983 TOPS==20 DEFINE T20 DEFINE T10 TWOSEG 400K T20,< SEARCH MONSYM,MACSYM > T10,< SEARCH UUOSYM,MACSYM > SEARCH DPYDEF .REQUIRE DPY .DIRECT FLBLST SALL WAITIME==^D3000 ;WAIT TIME IN MS. COLWID==^D10 ;COLUMN DISPLAY WIDTH NUMCOL==5 ;NUMBER OF DISPLAY COLUMNS MAXLIN==25 ;MAXIMUM COUNTERS STORD MAXCOL==20 ;MIXIMUM COLS (DEVICES) STORED SAVSIZ==100 ;SIZE OF COUNTER SAVE AREA SAVOFF==SAVSIZ/2 ;OFFSET TO OLD VALUES HDRWID==^D80- ;DISPLAY WIDTH FOR COUNTER NAMES T0==0 T1==1 T2==2 T3==3 T4==4 P1==5 P2==6 F==11 Q3==12 C==13 L==14 B==15 P==17 OPDEF PJRST [JUMPA 11,] OPDEF CALL [PUSHJ P,] OPDEF RET [POPJ P,] T10,< TTYCHN==1 ;CHANNEL FOR TTY OPEN .PRIOU==101 ;TOPS-20 PRIMARY DEVICE DESIGNATOR ;NOUT NO%MAG==:1B0 ;OUTPUT MAGNITUDE NO%SGN==:1B1 ;OUTPUT SIGN NO%LFL==:1B2 ;LEADING FILLER NO%ZRO==:1B3 ;FILL WITH ZERO'S NO%OOV==:1B4 ;OUTPUT ON COLUMN OVERFLOW NO%AST==:1B5 ;OUTPUT ASTERISKS ON OVERFLOW NO%COL==:177B17 ;NUMBER OF COLUMNS TO USE NO%RDX==:777777 ;RADIX ;JSYS conversions for TOPS-20 to TOPS-10 OPDEF ERJMP [JUMP 16,] ;Tops-20 error jump DEFINE BOUT ;Output a byte DEFINE SOUTR ;Output a record DEFINE SINR ;Input decnet data DEFINE NOUT ;Output a number DEFINE NIN ;Input a number >;End of TOPS-10 stuff D%POC==1B20 ;1 - Counter, 0 - Parameter D%BIT==1B23 ;1 - Bit mapped SUBTTL Tables ; TABLE OF BYTE POINTERS TO SYNC LINE DEVICE NAME STRINGS FOR THE COLUMNS DEVSTR: ...==0 REPEAT MAXCOL,< POINT 7,DEVSTT+... ...==...+3 > ;REPEAT SAVTAB: ;TABLE OF ADDRESSES FOR COUNTER SAVE AREAS ...==0 REPEAT MAXCOL,< EXP SAVBUF+... ...==...+SAVSIZ > ;REPEAT SUBTTL IMPURE DATA RELOC 0 ;IMPURE DEVSTT: BLOCK ... ;STRING SPACE FOR DEVSTR... SAVBUF: BLOCK MAXCOL*SAVSIZ ;SAVE AREA ENDSAV==.-1 LINNUM: BLOCK MAXLIN ;Contains the counter number for a line STRBUF: BLOCK 10 ;STRING BUFFER ACSAV: BLOCK 20 ;'JSYS' AC SAVE AREA INC: BLOCK 1 ;INCREMENTAL MODE DONE: BLOCK 1 COLMS: BLOCK 1 ;CURRENT NUMBER OF COLMS COLAOB: BLOCK 1 ;AOBJN PTR FOR COLMS FIRST: BLOCK 1 ;OFFSET TO FIRST COLM DISPLAYED TTCOC: BLOCK 2 TTPAR: BLOCK 2 PLIST: BLOCK 30 NUM: BLOCK 1 CLEN: BLOCK 1 CTYPE: BLOCK 1 COUNT: BLOCK 1 DCNBLK: BLOCK 10 TENEXU: XWD 0,3 ;LH gets filled in at OPEN BLOCK 2 EXECU: BLOCK 2 WTIM: BLOCK 1 ;WAIT TIME TTPT: BLOCK 1 ;COMMAND STRING BYTE POINTER TTBU: BLOCK 10 ;COMMAND STRING BUFFER BUF: BLOCK 100 ;BUFFER FOR NML DATA NJFN: BLOCK 1 ;NETWORK CHAN/JFN TO EXECUTOR NML T10,< ;Argument blocks for TOPS-10 ;Enter active state EABLK: NS.WAI!<.NSFEA,,3> ;Wait bit, function code, block length BLOCK 1 CONBLK ;Connect block ;Connect block CONBLK: 10 ;Length of block TENEXU ;Pointer to node name string SRCPRC ;Source process descriptor block DESPRC ;Destination process descriptor block 0 ;User ID 0 ;Password 0 ;Account OPTDAT ;Optional data ;Optional data OPTDAT: XWD ^D12,4 BYTE (8)"0","0","3","0" BYTE (8)"0","0","0","0" BYTE (8)"0","0","0","0" 0 ;Source process block SRCPRC: 5 ;Length of block 2 ;PDB Format 0 OURPPN: 0 ;Our PPN SRCSTR ;Our string ;Source string SRCSTR: XWD 3,2 BYTE (8)"R","A","B" ;Destination process block DESPRC: 5 ;Length of block 0 ;PDB Format ^D19 ;Object 0 ;Their PPN 0 ;Send data block DSBLK: NS.WAI!NS.EOM!<.NSFDS,,4> 0 0 0 ;Receive data DRBLK: NS.WAI!<.NSFDR,,4> BLOCK 3 ;Close NSP. channel SDBLK: NS.WAI!<.NSFSD,,2> ;Wait 0 >;End of TOPS-10 stuff RELOC ;BACK TO PURE SUBTTL MAIN PROGRAM START: RESET MOVE P,[IOWD 30,PLIST] MOVE T1,[CALL DPYUUO##] ;LUUO INSTR MOVEM T1,41 ;STORE INI$ ;INITIALIZE LUUO PACKAGE CALL INIT ;DO OTHER STUFF SUBTTL Display of ACTIVE CIRCUITS DSPAC: CALL OPN DSPAC1: MOVE T1,NJFN ;Got connection, make request for data MOVE T2,[POINT 8,[BYTE (8)24,63,376,0]] MOVNI T3,4 SETZ T4, SOUTR ERJMP ERR CALL REABUF ;Read the buffer CALL DISPLAY ;Dump on screen CALL CHK ;Wait JRST DSPAC1 SUBTTL Check for new commands T20,< CHK: MOVEI T1,.PRIOU ;Primary input device SIBE ;Anything ? JRST CHK2 ;Yes CHK1: MOVE T1,WTIM DISMS RET > ;TOPS-20 T10,< CHK: SKPINC ;ANYTHING ? TRNA JRST CHK2 ;YES CHK1: MOVE T1,WTIM TLO T1,(HB.RTL) ;WAKE ON TTY LINE ACTIVITY HIBER T1, TRN RET > ;TOPS-10 CHK2: T20, PBIN ;Get character T10, INCHWL T1 CAIN T1,"M"-100 ;CARRIAGE RETURN? JRST CHK2 ; TOSS CAIN T1,"J"-100 ;LINE FEED? JRST CHK3 ; TRY TO PARSE CAIN T1,177 ;RUB-OUT JRST PBELL CAIGE T1," " ;Space or greater ? JRST PBELL CAIL T1,"A" TRZ T1,40 ;Ensure uppercase IDPB T1,TTPT ;Store the character JRST CHK ;Get more PBELL: T20,< MOVEI T1,7 PBOUT > ;TOPS-20 T10, OUTCHR [7] MOVE [POINT 7,TTBU] ;Reset byte pointer MOVEM TTPT JRST CHK1 ;Wait and return CHK3: SETZ T0, IDPB T0,TTPT ;Ensure a null MOVE T1,[POINT 7,TTBU] ;Read back the string MOVEM T1,TTPT ;Reset for next time ILDB T0,T1 ;Get first character CAIN T0,"W" ;Wait JRST .WAIT ; Yes CAIN T0,"S" ;Set JRST .SETEX ; Yes CAIN T0,"A" ;Accumulative JRST .ACC CAIN T0,"I" ;Incremental JRST .INC CAIN T0,"E" ;Exit JRST .EXIT CAIN T0,"H" ;Help JRST .HELP CAIN T0,"R" ;Refresh JRST .REF CAIN T0,"<" JRST .LSS CAIN T0,">" JRST .GTR JRST PBELL .HELP: TTY$ $TTCLR ;CLEAR SCREEN STR$ HELPM ;TYPE HELP STRING DPY$ ;DISPLAY IT T20, PBIN ;WAIT FOR A CHAR T10, INCHRW T1 CAIN T1,"M"-100 ;CR? T20, PBIN ; YES, SNARF LF T10, INCHRW T1 JRST SETEX1 HELPM: ASCIZ & Network Management Listener Display program (NMLDPY) (SHOW ACTIVE CIRCUITS) A Set accumulative mode (default) E Exit H Help I Set incremental mode R Refresh SEnode Set executor (default = self) Wn Wait n seconds between samples (default = 3 seconds) > Scroll devices to the left < Scroll devices to the right Flags: I Incremental mode > More devices to the right < More devices to the left Bugs/suggestions to: Bob Brown or Phil Budne o Type something to continue& .REF: REF$ JRST CHK .INC: SETOM INC ;Set incremental flag TRNA .ACC: SETZM INC ;Set accumulative output JRST CHK .GTR: AOSA FIRST .LSS: SOSL FIRST JRST CHK SETZM FIRST JRST PBELL .EXIT: CALL CLOSN ;Close link CALL OECH ;Turn on echo TTY$ $TTCLR ;CLEAR SCREEN T20, HALTF T10, EXIT 1, JRST START ;Adjust wait time .WAIT: MOVEI T3,^D10 ;Decimal NIN ERJMP PBELL ;Error CAIG T2,^D<60*5> ;Less than 5 minutes SKIPG T2 ;Must be positive, non-zero JRST PBELL IMULI T2,^D1000 ;Make into milli-seconds MOVEM T2,WTIM ;Set up ne time JRST CHK ;All ok ;Set EXEC .SETEX: ILDB T1 ;Get next character CAIE "E" ;SE? JRST PBELL ; Nope MOVE T2,[POINT 7,EXECU] ILDB T0,T1 IDPB T0,T2 JUMPN T0,.-2 ;Copy node name SETZM INC ;DUE TO BUG IN FIRST REFRESH! /PLB SETZM FIRST ;NO SCROLL SETEX1: CALL CLOSN CALL RES CALL OPN RET ;Read a buffer from the NML REABUF: MOVEI C,0 ;Start with line 0 REABF1: MOVE T1,NJFN ;Network JFN MOVE T2,[POINT 8,BUF] MOVNI T3,400 SINR ERJMP ERR MOVE B,[POINT 8,BUF] ;Set up buffer pointer ILDB T1,B ;Get status of buffer CAIN T1,2 ;Continuation bit set ? JRST REABUF ;Yes, read next buffer CAIE T1,1 ;All ok ? JRST [ SETOM DONE MOVEM C,COLMS RET ] IBP B ;GET IBP B ;GET IBP B ;NULL CALL GETD ;Get device name REABF2: CALL REAP ;Read the parameters (counters) JRST REABF3 CALL BLDN MOVEM T2,NUM CALL OUTVAL JRST REABF2 ;Loop REABF3: AOJA C,REABF1 ;Check if counter has a line number assigned OUTVAL: MOVEI L,0 ;Line number OUTVA0: CAIL L,MAXLIN ;IN RANGE? HALT . ; DIE AWFUL DEATH SKIPGE T2,LINNUM(L) ;End of list ? JRST OUTVA3 ; Not in current table CAME T2,CTYPE ;Match our register number ? AOJA L,OUTVA0 ; No, loop MOVE T4,L ADD T4,SAVTAB(C) ;Compute address of entry OUTVA2: MOVE T0,NUM ;GET NUMBER SKIPE INC ;INCREMENTAL? SUB T0,SAVOFF(T4) ; YES, FIND CHANGE MOVEM T0,(T4) ;STORE NEW VALUE MOVE T2,NUM ;GET NEW NUMBER MOVEM T2,SAVOFF(T4) ;SAVE AS OLD RET ;Found a counter we have not seen before OUTVA3: MOVE T0,CTYPE ;Get counter number ; ***** EXPERIMENTAL MOVSI T4,-ITEMS CAME T0,NUMTAB(T4) AOBJN T4,.-1 JUMPGE T4,CPOPJ ;IF NOT KNOWN, IGNORE ; ***** EXPERIMENTAL MOVEM T0,LINNUM(L) ;Store it MOVE T4,SAVTAB(C) ;Compute address of entry ADDI T4,(L) JRST OUTVA2 DISPLAY: STR$ [ASCIZ /Node: /] STR$ EXECU T20,< STR$ [ASCIZ/ Load: /] MOVE T1,[14,,14] ;1 MIN LOAD AVG GETAB ERJMP ERR MOVE T2,T1 CALL .PFLT >;End of TOPS-20 stuff STR$ [ASCIZ / /] CALL .PTIM ;TYPE THE TIME STR$ [ASCIZ / /] MOVE T1,WTIM ;GET WAIT TIME CAIN T1,WAITIME ;DEFAULT? JRST DISP.I ; YEP HRROI T1,STRBUF MOVE T2,WTIM IDIVI T2,^D1000 MOVEI T3,^D10 NOUT JRST DISP.I SETZ T2, IDPB T2,T1 CHI$ "W" STR$ STRBUF DISP.I: SKIPE INC CHI$ "I" SKIPE FIRST CHI$ "<" ;> MOVE T1,FIRST ;GET FIRST DISPLAYED ADDI T1,NUMCOL ;GET LAST DISPLAYED CAMGE T1,COLMS ;MORE TO SEE? < CHI$ ">" ;SAY SO CALL CRLF ;END LINE 1 CALL DODISP DPY$ ;REDISPLAY RET CRLF: STR$ [ASCIZ / /] RET DODISP: SKIPN C,COLMS ;ANY COLMS TO DISPLAY? RET ; NOPE CAMGE C,FIRST ;IN RANGE OF DISPLAYED COLMS? RET ; NOPE SUB C,FIRST ;GET COUNT OF COLMS CAILE C,NUMCOL ;LESS THAN MAX? MOVEI C,NUMCOL ; NO, LIMIT TO PER SCREEN MOVNI C,(C) ;GET -N MOVSI C,(C) ;GET -N,,0 HRR C,FIRST ;GET -N,,FIRST MOVEM C,COLAOB ;SAVE AOBJN PTR CALL HEADER SETZ L, LINLOP: MOVE C,COLAOB SKIPGE T1,LINNUM(L) ;GET COUNTER NUMBER PJRST CRLF ; DONE CALL TYPNAM ;TYPE COUNTER NAME DSPLOP: MOVE T2,SAVTAB(C) ;GET ADDRESS OF SAVE BLOCK ADDI T2,(L) ;ADD INDEX SKIPE T2,(T2) ;COUNTER VALUE IS ZERO? JRST DL.1 ; NO MOVEI T1,COLWID ;YES, PAD WITH SPACES DL.0: CHI$ " " SOJG T1,DL.0 JRST DSPBOT DL.1: CHI$ " " ;LEADING SPACE HRROI T1,STRBUF ;STORE RESULT HERE MOVX T3,,NO%COL)!^D10> ;MAGNITUDE NOUT ;* ON ERROR, N-1 COLS, DECIMAL NUMBER OUTPUT ERJMP ERR ; SIGH! SETZ T2, ;ENSURE IDPB T2,T1 ;ASCIZ STR$ STRBUF ;OUTPUT TO SCREEN IMAGE DSPBOT: AOBJN C,DSPLOP ;LOOP FOR ALL COLS CALL CRLF ;TERMINATE LINE AOJA L,LINLOP ;LOOP FOR ALL LINES HEADER: MOVEI T1,HDRWID HD.0: CHI$ " " SOJG T1,HD.0 HDRLOP: MOVE T1,DEVSTR(C) ;GET DEVICE NAME BP MOVEI T3,COLWID-1 ;WIDTH CHI$ " " HD.1: ILDB T2,T1 JUMPE T2,HD.2 CHI$ (T2) SOJG T3,HD.1 JRST HD.3 HD.2: CHI$ " " SOJG T3,HD.2 HD.3: AOBJN C,HDRLOP CALL CRLF RET ; T1/ COUNTER NUMBER TYPNAM: MOVSI T2,-ITEMS TYN.1: CAME T1,NUMTAB(T2) AOBJN T2,TYN.1 JUMPGE T2,TYN.2 MOVE T1,STRTAB(T2) JRST TYN.3 TYN.2: MOVE T2,T1 HRROI T1,STRBUF MOVX T3, NOUT ;UNKNOWN REGISTER PRINT NUMBER ERJMP ERR MOVEI T2,"." IDPB T2,T1 SETZ T2, IDPB T2,T1 MOVEI T1,STRBUF TYN.3: HRLI T1,(POINT 7,) MOVEI T2,HDRWID-1 TYN.5: ILDB T3,T1 JUMPE T3,TYN.4 CHI$ (T3) SOJG T2,TYN.5 CHI$ "!" ;RAN OUT OF SPACE RET TYN.4: CHI$ " " SOJG T2,TYN.4 CHI$ " " RET CLOSN: MOVE T1,NJFN ;Close the network connection T20,< CLOSF ERJMP .+1 >;End of TOPS-20 stuff T10,< HRRM T1,SDBLK+.NSACH ;Store channel number MOVEI T1,SDBLK NSP. T1, JRST ERR >;End of TOPS-10 stuff SETZM NJFN RET ;Turn off OR back to orginal echo T20,< OECH: TDZA T2,T2 NECH: MOVEI T2,TT%ECO ;Kill echo ANDCA T2,TTPAR ;Original settings MOVEI T1,.PRIIN ;Get JFN SFMOD ;Do it RET >;End of TOPS-20 stuff T10,< OECH: TDZA T1,T1 NECH: MOVEI T1,IO.SUP SETSTS TTYCHN,(T1) TRN RET >;End of TOPS-10 stuff ;Reset the data base RES: SETZM DONE SETOM LINNUM MOVE T1,[LINNUM,,LINNUM+1] BLT T1,LINNUM+MAXLIN-1 ;No counters as yet SETZM SAVBUF MOVE T1,[SAVBUF,,SAVBUF+1] BLT T1,ENDSAV RET ;Open the network connection OPN: SETZM DONE T20,< MOVE T1,[POINT 7,DCNBLK] ;Destination MOVE T2,[POINT 7,[ASCIZ/DCN:/]] CALL OPN1 MOVE T2,[POINT 7,EXECU] CALL OPN1 MOVE T2,[POINT 7,[ASCIZ/-19;BDATA:003000000/]] CALL OPN1 SETZ T0, IDPB T0,T1 MOVSI T1,(GJ%SHT) HRROI T2,DCNBLK GTJFN ;Open link to node ERJMP ERR HRRM T1,NJFN MOVX T2, OPENF ERJMP ERR ;Wait for DECNET connection to complete WATCON: MOVE T1,NJFN MOVEI T2,.MORLS ;READ LINK STATE MTOPR ERJMP ERR TXNE T3,MO%CON ;CONNECTED? RET ; All ok. TXNN T3, JRST OPNERR ;Still waiting ? MOVEI T1,^D500 DISMS JRST WATCON ;Wait some more OPNERR: TMSG MOVEI T1,.PRIOU MOVEI T2,(T3) MOVEI T3,^D10 NOUT TRN TMSG < > JRST ERR OPN1: ILDB T0,T2 JUMPE T0,CPOPJ IDPB T0,T1 JRST OPN1 >;End of TOPS20 stuff T10,< MOVE T1,[POINT 7,EXECU] ;Copy node name over MOVE T2,[POINT 8,TENEXU+1] ;Into TOPS-10 land MOVEI T3,0 ;None, yet OPN1: ILDB T0,T1 ;GET CHARACTER IDPB T0,T2 ;STORE CAIE T0,0 ;DONE? AOJA T3,OPN1 ; NO, LOOP HRLM T3,TENEXU ;DESTINATION NODE NAME CHAR COUNT ;Establish the link MOVEI T1,EABLK ;Point to argument block NSP. T1, ;Open link JRST ERR ;Sorry HRRZ T1,EABLK+.NSACH ;Get channel number MOVEM T1,NJFN ;Save RET ;DONE >;End of TOPS-10 stuff ERR: T20,< MOVEI T1,.PRIOU HRLOI T2,.FHSLF SETZ T3, ERSTR ERJMP .+2 ERJMP .+1 HALTF >;End of TOPS-20 stuff T10,< OUTSTR [ASCIZ/DEATH!!!!/] EXIT 1, > JRST START SUBTTL GETD - Get device name and set up a column GETD: SKIPE DONE ;Still setting up ? JRST GETD1 ; No MOVE T4,DEVSTR(C) ;Get byte pointer ILDB T3,B ;Get length of string GETD0: ILDB T0,B ;Get character IDPB T0,T4 ;Store SOJG T3,GETD0 ;Loop SETZ T0, IDPB T0,T4 ;Ensure null RET GETD1: ILDB T3,B ;Get length of string GETD2: IBP B ;Get character SOJG T3,GETD2 ;Loop RET SUBTTL REAP - Read a parameter REAP: ILDB P1,B ;Get low order byte ILDB T2,B ;Get high order byte DPB T2,[POINT 8,P1,27] ;Combine into 16 bit field TRNN P1,D%POC ;Parameter or counter? RET ; None ;We have some counter data LDB T1,[POINT 12,P1,35] ;Get type of counter MOVEM T1,CTYPE ;; TRNE P1,D%BIT ;Bit mapped field ? ;; JRST ERR ;Yes, sorry AOS (P) RET SUBTTL BLDN - Build number BLDN: LDB T1,[POINT 2,P1,22] ;Get counter size SETZ T2, ;Start with zero JUMPE T1,CPOPJ ;None ILDB T0,B ;Get byte DPB T0,[POINT 8,T2,35] ;Low order byte SOJE T1,CPOPJ ;Any more? ILDB T0,B ;Get byte DPB T0,[POINT 8,T2,27] ;2nd order bit SOJE T1,CPOPJ ;more? ILDB T0,B ;Get byte DPB T0,[POINT 8,T2,19] ;3rd order bit ILDB T0,B DPB T0,[POINT 8,T2,11] CPOPJ: RET SUBTTL Text and tables DEFINE SSS < SS 0, SS 800, SS 801, SS 802, SS 805, SS 810, SS 811, SS 812, SS 820, SS 821, SS 1000, SS 1001, SS 1002, SS 1010, SS 1011, SS 1012, SS 1013, SS 1014, SS 1015, SS 1020, SS 1021, SS 1030, SS 1031, SS 1040, SS 1041, SS 1050, SS 1051, SS 1060, SS 1061, SS 1062, SS 1063, SS 1064, SS 1065, SS 1066, SS 1100, SS 1101, SS 1240, SS 1241, SS 1242, SS -1, > ;SSS DEFINE SS(N,S) NUMTAB: XLIST SSS LIST DEFINE SS(N,S) <[ASCIZ /S/]> STRTAB: XLIST SSS LIST ITEMS==.-STRTAB-1 SUBTTL Initialization INIT: MOVEI T1,WAITIME MOVEM T1,WTIM T20,< MOVEI T1,.NDGLN ;GET LOCAL NODE STRING MOVEI T2,T3 ;ARG BLOCK HRROI T3,EXECU ;SET EXECUTOR TO OURSELF NODE ERJMP ERR MOVEI T1,.PRIOU RFMOD ;Get ORIGINAL TTY paramters MOVEM T2,TTPAR ;Store them >;End of TOPS-20 stuff T10,< DMOVE T1, [T2 ;ADDR OF ARG BLOCK DN.FLE!<.DNLNN,,3>] ;LIST KNOWN NODES/EXECUTOR,,LEN DNET. T1, TRNA ; FAILURE! SKIPN T3, T4 ; GET ANYTHING? HALT . ; DIE!! MOVE T1, [POINT 7, EXECU] ;CONVERT SIXBIT TO ASCIZ SU.LOP: SETZ T2, LSHC T2, 6 ADDI T2, " " IDPB T2, T1 JUMPN T3, SU.LOP IDPB T3, T1 GETPPN T1, ;GET OUR PPN TRN ;STUPID SKIP MOVEM T1,OURPPN ;STORE FOR PDB OPEN TTYCHN,[.IOASC!IO.SUP ;ASCII MODE, NO ECHO SIXBIT /TTY/ ;OUR TTY 0,,0] ;NO BUFFERS HALT . >;End of TOPS-10 stuff MOVE T0,[POINT 7,TTBU] MOVEM T0,TTPT CALL RES ;CLEAR TABLES CALL NECH ;TURN OFF ECHO RET T20,< ;Print floating number (used for Load avg) .PFLT: HRROI T1,STRBUF MOVX T3, FLOUT ERJMP R SETZ T2, IDPB T2,T1 STR$ STRBUF R: RET .PTIM: HRROI T1,STRBUF SETO T2, SETZ T3, ODTIM SETZ T2, IDPB T2,T1 STR$ STRBUF RET >;End of TOPS-20 stuff SUBTTL TOPS-10 routines T10,< ;Output date/time (stolen from SCAN) .PTIM: DATE T1, ;GET TODAY'S DATE IDIVI T1,^D31 ;GET DAYS MOVE T4,T1 ;SAVE REST MOVEI T1,1(T2) ;GET DAYS AS 1-31 MOVEI T2," " ;FILL WITH SPACE PUSHJ P,.TDEC2 ;TYPE IN DECIMAL IDIVI T4,^D12 ;GET MONTHS STR$ [ ASCIZ /-Jan/ ASCIZ /-Feb/ ASCIZ /-Mar/ ASCIZ /-Apr/ ASCIZ /-May/ ASCIZ /-Jun/ ASCIZ /-Jul/ ASCIZ /-Aug/ ASCIZ /-Sep/ ASCIZ /-Oct/ ASCIZ /-Nov/ ASCIZ /-Dec/ ](P1) ;GET ASCII MOVEI T1,^D64(T4) ;GET YEAR SINCE 1900 IDIVI T1,^D100 ;GET JUST YEARS IN CENTURY [257] MOVE T1,T2 CHI$ "-" CALL TDEC2Z CHI$ " " MSTIME T1, ;GET CURRENT TIME IDIV T1,[^D3600000] ;GET HOURS MOVE T4,T2 ;SAVE REST MOVEI T2," " ;FILL WITH SPACE PUSHJ P,.TDEC2 ;TYPE TWO DIGITS CHI$ ":" MOVE T1,T4 ;RESTORE REST IDIVI T1,^D60000 ;GET MINS MOVE T4,T2 ;SAVE REST PUSHJ P,TDEC2Z ;TYPE TWO DIGITS WITH 0 FILLER CHI$ ":" MOVE T1,T4 ;RESTORE THE REST IDIVI T1,^D1000 ;GET SECONDS TDEC2Z: MOVEI T2,"0" ;FILL WITH 0 ;FALL INTO .TDEC2 ;.TDEC2 -- TYPE DECIMAL AT LEAST TWO DIGITS ;CALL: SAME AS .TDECW WITH T2=FILLER CHAR (" " OR "0") .TDEC2: CAIG T1,^D9 ;SEE IF ONE DIGIT JRST DEC2.1 IDIVI T1,^D10 CHI$ "0"(T1) JRST DEC2.2 DEC2.1: EXCH T1,T2 ;GET FILLER CHI$ (T1) DEC2.2: CHI$ "0"(T2) ;CONVERT DIGIT RET ;Input a DECNET record .SINR: MOVEM T2,DRBLK+.NSAA2 ;Byte pointer to buffer MOVNM T3,DRBLK+.NSAA1 ;Max byte count MOVE T3,NJFN ;Get channel number HRRM T3,DRBLK+.NSACH MOVEI T1,DRBLK NSP. T1, JRST ERR RET ;Output a record .SOUTR: MOVNM T3,DSBLK+.NSAA1 ;Byte count MOVEM T2,DSBLK+.NSAA2 ;Byte pointer MOVE T1,NJFN ;Get output channel HRRM T1,DSBLK+.NSACH ;Store in NSP argument block MOVEI T1,DSBLK ;Point to block NSP. T1, JRST ERR RET ;Input a number .NIN: SETZ T2, ;Clear number field .NIN1: ILDB T0,T1 ;Get character CAIG T0,"9" ;Above 9 CAIGE T0,"0" ; Or less than 0 ? JRST .NIN2 ; Yes SUBI T0,"0" ;Make into a number IMULI T2,^D10 ;MAKE ROOM ADD T2,T0 ;Add in JRST .NIN1 .NIN2: CAIN T0,15 ;Carriage return RET ;Yep, done JRST ERR ;No, error ;Fake out the NOUT jsys .NOUT: CALL SAVAC ;SAVE ACS DURING "JSYS" HRRZ T4,T3 ; Get radix CAIL T4,2 CAILE T4,^D10+^D26 ; Must be 2 - 36 JRST ERR HLL T4,T3 ; Save flags in T4 too LDB F,[POINT 8,T4,17] ; Extract column width MOVEI Q3,1 ; Initilize digit counter TLNN T4,(1B0) ; Magnitude printout? CAIL T2,0 ; Or positive number? TLZA T4,(1B6) ; Yes, remember not minus sign TLO T4,(1B6+1B1) ; No, remember minus sign TLNE T4,(1B6) ; - sign to be printed? MOVMS T2 ; Yes complement number TLNE T4,(1B1) ; A sign of some sort to be printed? NOUT1: AOS Q3 ; Yes, count as digit LSHC T2,-^D35 ; Make into double LSH T3,-1 ; Length dividend DIVI T2,(T4) ; Produce a digit PUSH P,T3 ; Save on stack JUMPN T2,NOUT1 ; Repeat until all digits generated CAIN F,0 ; Zero field width specified? MOVE F,Q3 ; Yes, make it same as number of digits TLNE T4,(1B2) ; Right justify number? NOUT2: CAML Q3,F ; And filler needed? JRST NOUT3 ; No TLNE T4,(1B3) ; Yes. leading 0's? CALL SGNOUT ; Yes, output sign now MOVEI T2," " ; Get a space TLNE T4,(1B3) ; Unless 0's wanted MOVEI T2,"0" ; Then get a 0 CALL BOUTA ; Call bout so strings will work SOJA F,NOUT2 ; Decrease remaining width and loop NOUT3: CAML F,Q3 ; Sufficient room? JRST NOUT4 ; Yes JRST ERR ; MOVEI T2,NOUTX2 ; Error ; MOVEM T2,LSTERR TLNN T4,(1B4) ; Print something anyway? JRST NOUT7 ; No, go away TLNN T4,(1B5) ; Asterisks? JRST NOUT4 ; No, print the whole number MOVEI T2,"*" ; Yes, NOUT6: SOJL F,NOUT7 ; Column filled CALL BOUTA JRST NOUT6 NOUT7: TLNE T4,(1B1) ; If one position reserved for -, SOS Q3 ; One less thing on stack NOUT71: SOJL Q3,RESAC ; Return if done POP P,T2 JRST NOUT71 NOUT4: CALL SGNOUT ; Output sign before number NOUT5: SOJL Q3,NOUT8 ; Any digits left? POP P,T2 ; Yes, get one ADDI T2,"0" CAILE T2,"9" ADDI T2,"A"-"9"-1 CALL BOUTA ; Print it SOJA F,NOUT5 ; Decrease field width NOUT8: SKIPL F AOS (P) ; Skip if no error MOVEI T2," " JRST NOUT6 ; Insert trailing blanks if necessary SGNOUT: TLZN T4,(1B1) ; Sign still needed? RET ; No, return immediately MOVEI T2,"-" TLNN T4,(1B6) MOVEI T2,"+" CALL BOUTA SOS Q3 ; Decrement digit count SOS F ; Decrement remaining field width RET ;Output byte to buffer BOUTA: CAIN T1,.PRIOU ;Primary output device ? JRST [ OUTCHR T2 ;Yes, just send to terminal RET ] TLCE T1,-1 TLCN T1,-1 HRLI T1,(POINT 7,) IDPB T2,T1 ;Store character in buffer RET ;Save AC's during JSYS (T3 - 16) SAVAC: MOVEM T3,ACSAV+T3 MOVE T3,[XWD T4,ACSAV+T4] BLT T3,ACSAV+16 MOVE T3,ACSAV+T3 RET RESAC: MOVE T3,[XWD ACSAV+T4,T4] BLT T3,16 MOVE T3,ACSAV+T3 RET >;End of TOPS-10 routines JUNK: END START