.TITLE SHT - Show Terminal Characteristics .IDENT /3.1/ .ENABL LC ;+ ; ; Free software BY ; Project Software & Development, Inc. ; ; This software is furnished for free and may be used and copied as ; desired. This software or any other copies thereof may be provided or ; otherwise made available to any other person. No title to and ; ownership of the software is hereby transferred or allowed. ; ; The information in this software is subject to change without notice ; and should not be construed as a commitment by PROJECT SOFTWARE ; AND DEVELOPMENT, INC. ; ; PROJECT SOFTWARE assumes no responsibility for the use or reliability ; of this software on any equipment whatsoever. ; ; Project Software & Development, Inc. ; 14 Story St. ; Cambridge, Ma. 02138 ; 617-661-1444 ; ; ; Title: SHT.MAC ; Author: Robin Miller & Gary Larsen ; Date: February 11, 1981 ; ; Description: ; ; This task is used to show the terminal characteristics. ; ; Format: ; SHT ttn:,ttn1, ... ; ; Modification History: ; ; January 11, 1985 by Robin Miller. ; o Do multiple QIO's when getting the terminal characeristics. ; A large buffer length fails on a Decnet terminal (HTn:). ; ; January 3, 1985 by Robin Miller. ; ; o Modify to show only terminal characteristics. Removed code for ; SHOW DEFAULT command and for prompting the user for parameters. ; ; o Modify the "SHOW TERMINAL" format to match new format used by ; Version 3.x of VAX/VMS. ; ;- .ENABL AMA .NLIST BEX .MCALL ALUN$, ALUN$S, CMKT$S, DIR$, EXIT$S, EXST$S, GLUN$, GMCR$ .MCALL GTSK$, MRKT$S, QIO$, QIOW$, QIOW$S, TTSYM$, WTLO$, WTLO$S .MCALL GIN$, ACNDF$ ACNDF$ ; Define account block definitions. TTSYM$ ; Define terminal definitions. ; ; Define offsets into characteristics buffer: ; O.TTP == 1 ; TERMINAL TYPE (/TERM) O.WID == 3 ; PAGE WIDTH (/BUF) O.LPP == 5 ; PAGE LENGTH (/LINES) O.ACR == 7 ; WRAP-AROUND MODE (/WRAP) O.BIN == 9. ; BINARY INPUT MODE (/RPA) O.CTS == 11. ; SUSPEND OUTPUT TO TERMINAL O.ESQ == 13. ; INPUT ESCAPE SEQUENCE (/ESCSEQ) O.FDX == 15. ; FULL-DUPLEX MODE (/FDX) O.HFF == 17. ; HARDWARE FORMFEED (/FORMFEED) O.HFL == 19. ; HORIZONTAL FILL CHAR. (/HFILL) O.HHT == 21. ; HORIZONTAL TAB CAP. (/HHT) O.HLD == 23. ; HOLD SCREEN MODE (/HOLD) O.ISL == 25. ; SUBLINE ON INTERFACE O.NEC == 27. ; ECHO SUPPRESSED (/ECHO) O.PRI == 29. ; TERMINAL PRIVILEGED (/PRIV) O.RAT == 31. ; TYPEAHEAD BUFFER (/TYPEAHEAD) O.SCP == 33. ; TERMINAL IS A SCOPE (/CRT) O.SLV == 35. ; TERMINAL IS A SLAVE (/SLAVE) O.SMR == 37. ; UPPER-CASE CONVERSION (/LOWER) O.TBF == 39. ; TYPE-AHEAD BUFFER COUNT O.VFL == 41. ; VERTICAL FILL CHAR. (/VFILL) O.8BC == 43. ; PASS 8 BITS ON INPUT (/EBC) O.ABD == 45. ; Auto-baud detection. (/ABAUD) O.ANI == 47. ; ANSI CRT terminal. O.AVO == 49. ; VT100-family terminal. O.BLK == 51. ; Capable of block transfers. O.DEC == 53. ; Digital CRT terminal. O.EDT == 55. ; Performs editing functions. O.NBR == 57. ; Broadcast disabled. (/NOBRO) O.RGS == 59. ; Supports REGIS instructions. O.TBS == 61. ; Type-ahead buffer size. O.TBM == 63 ; Type-ahead buffer mode. ; O.PAR ; Generate and check parity. ; Not working ... ; O.EPA ; Parity type: 0=odd, 1=even O.DLU == 65. ; DIAL-UP LINE (/REMOTE) O.ASP == 67. ; Dialup answer speed. (/REMOTE) O.RSP == 69. ; RECEIVER SPEED (/SPEED) O.XSP == 71. ; TRANSMITTER SPEED (/SPEED) ; ; Table of terminal types. ; TTYPE:: .ASCIZ /Unknown/ TBLSIZ = .-TTYPE .ASCIZ / ASR33/ .ASCIZ / KSR33/ .ASCIZ / ASR35/ .ASCIZ / LA30S/ .ASCIZ / LA30P/ .ASCIZ / LA36/ .ASCIZ / VT05/ .ASCIZ / VT50/ .ASCIZ / VT52/ .ASCIZ / VT55/ .ASCIZ / VT61/ .ASCIZ / LA180S/ .ASCIZ / VT100/ .ASCIZ / LA120/ .ASCIZ / / .ASCIZ / LA12/ .ASCIZ / LA100/ .ASCIZ / LA34/ .ASCIZ / LA38/ .ASCIZ / VT101/ .ASCIZ / VT102/ .ASCIZ / VT105/ .ASCIZ / VT125/ .ASCIZ / VT131/ .ASCIZ / VT132/ .ASCIZ / LA50/ .ASCIZ / LQP01/ .ASCIZ / LQP02/ .EVEN ; ; Table for terminal speeds. ; SPDTBL::.ASCIZ / 0/ SPDSIZ = .-SPDTBL .ASCIZ / 50/ .ASCIZ / 75/ .ASCIZ / 100/ .ASCIZ / 110/ .ASCIZ / 134/ .ASCIZ / 150/ .ASCIZ / 200/ .ASCIZ / 300/ .ASCIZ / 600/ .ASCIZ / 1200/ .ASCIZ / 1800/ .ASCIZ / 2000/ .ASCIZ / 2400/ .ASCIZ / 3600/ .ASCIZ / 4800/ .ASCIZ / 7200/ .ASCIZ / 9600/ .ASCIZ / EXTA/ .ASCIZ / EXTB/ .ASCIZ /19200/ .EVEN ; ; Help / Error messages. ; HELP: .ASCIZ /Usage: SHT terminal, . . . terminal_n or * for all./ ILLDEV: .ASCIZ /SHT -- The device specified is not a terminal./ ALRALL: .ASCIZ /SHT -- Device already allocated to another user./ .EVEN GLUNSH: GLUN$ SHLUN,LUNBUF ; GET LUN FOR SHOW DEVICE GTSK: GTSK$ GBUF ; GET TASK PARAMETERS GBUF:: .BLKW 16. ; BUFFER FOR TASK PARAMETERS LUNBUF:: .BLKW 6 ; BUFFER FOR GLUN$ OUTBUF:: .BLKW 1024. ; OUTPUT BUFFER ALUN:: ALUN$ SHLUN,TI,0 ; DEFAULT SHOW LUN TO TI0: GMCR:: GMCR$ ; GET COMMAND LINE DPB G.TNAM = 10 ; The terminal name. G.TNUM = 12 ; The terminal number. GINUAB: GIN$ GI.UAB,UABBUF,B.ULEN/2,, UABBUF::.BLKB B.ULEN ; Store accounting block here. UABFLG::.BYTE 0 ; Have accounting block flag. .EVEN FLDMAX::.WORD 0 ; The maximum field size. FLDSIZ::.WORD 0 ; The current field size. TTYCNT: .WORD 0 ; Number of terminals shown. ATTTI: QIOW$ IO.ATT,TOLUN,TOEFN,,TOSB,, ATTSH: QIO$ IO.ATT,SHLUN,SHEFN,,SHSB,, GETTI:: QIOW$ SF.GMC,TOLUN,TOEFN,,TOSB,, GETCH0: QIOW$ SF.GMC,SHLUN,SHEFN,,SHSB,, GETCH1: QIOW$ SF.GMC,SHLUN,SHEFN,,SHSB,, GETCH2: QIOW$ SF.GMC,SHLUN,SHEFN,,SHSB,, GETSPD: QIOW$ SF.GMC,SHLUN,SHEFN,,SHSB,, GETREM: QIOW$ SF.GMC,SHLUN,SHEFN,,SHSB,, WATE:: WTLO$ 0,110 TOSB:: .BLKW 2 ; TI0: OUTPUT STATUS BLOCK SHSB:: .BLKW 2 ; SHOW DEVICE STATUS BLOCK WILD:: .BYTE 0 ; WILDCARD INDICATOR UNIT:: .BYTE 0 ; UNIT # FOR WILDCARDS CTRLO:: .WORD TC.CTS ; GET CONTROL/O STATUS STOP == CTRLO + 1 ; LOCATION TO CHECK ATTFLG::.BYTE 0 ; FLAG FOR ATTACH STATUS OFFFLG::.BYTE 0 SLFFLG::.BYTE 0 .EVEN ; ; Table of pointers to parameter in command line. ; PRMTBL::.REPT 25. ; ROOM FOR 25. PARAMETERS .WORD 0 .ENDR ; ; Low byte has characteristic-name, high byte will contain status ; after SF.GMC is issued. ; BUFFER:: BUFF0:: .WORD TC.TTP ; TERMINAL TYPE (/TERM) .WORD TC.WID ; PAGE WIDTH (/BUF) .WORD TC.LPP ; PAGE LENGTH (/LINES) .WORD TC.ACR ; WRAP-AROUND MODE (/WRAP) .WORD TC.BIN ; BINARY INPUT MODE (/RPA) .WORD TC.CTS ; SUSPEND OUTPUT TO TERMINAL .WORD TC.ESQ ; INPUT ESCAPE SEQUENCE (/ESCSEQ) .WORD TC.FDX ; FULL-DUPLEX MODE (/FDX) .WORD TC.HFF ; HARDWARE FORMFEED (/FORMFEED) .WORD TC.HFL ; HORIZONTAL FILL CHAR. (/HFILL) .WORD TC.HHT ; HORIZONTAL TAB CAP. (/HHT) .WORD TC.HLD ; HOLD SCREEN MODE (/HOLD) .WORD TC.ISL ; SUBLINE ON INTERFACE .WORD TC.NEC ; ECHO SUPPRESSED (/ECHO) .WORD TC.PRI ; TERMINAL PRIVILEGED (/PRIV) BUFL0 = .-BUFF0 BUFF1:: .WORD TC.RAT ; TYPEAHEAD BUFFER (/TYPEAHEAD) .WORD TC.SCP ; TERMINAL IS A SCOPE (/CRT) .WORD TC.SLV ; TERMINAL IS A SLAVE (/SLAVE) .WORD TC.SMR ; UPPER-CASE CONVERSION (/LOWER) .WORD TC.TBF ; TYPE-AHEAD BUFFER COUNT .WORD TC.VFL ; VERTICAL FILL CHAR. (/VFILL) .WORD TC.8BC ; PASS 8 BITS ON INPUT (/EBC) .WORD TC.ABD ; Auto-baud detection. (/ABAUD) .WORD TC.ANI ; ANSI CRT terminal. .WORD TC.AVO ; VT100-family terminal. .WORD TC.BLK ; Capable of block transfers. .WORD TC.DEC ; Digital CRT terminal. .WORD TC.EDT ; Performs editing functions. .WORD TC.NBR ; Broadcast disabled. (/NOBRO) .WORD TC.RGS ; Supports REGIS instructions. BUFL1 = .-BUFF1 BUFF2: .WORD TC.TBS ; Type-ahead buffer size. .WORD TC.TBM ; Type-ahead buffer mode. ; .WORD TC.PAR ; Generate and check parity. ; .WORD TC.EPA ; Parity type: 0=odd, 1=even BUFL2 = .-BUFFER ; ; The remote and speed characters are separate from the other terminal ; characteristics because the terminal driver returns an error code if ; the terminal driver does not have that support gened into it (11M). ; REMBUF::.WORD TC.DLU ; DIAL-UP LINE (/REMOTE) .WORD TC.ASP ; Dialup answer speed. (/REMOTE) REMLEN = .-REMBUF SPDBUF::.WORD TC.RSP ; RECEIVER SPEED (/SPEED) .WORD TC.XSP ; TRANSMITTER SPEED (/SPEED) SPDLEN = .-SPDBUF .SBTTL SHT - Show Terminal Main Line. ;+ ; ; SHOW - Main line code. ; ;- SHT:: ALUN$S #TILUN,#"TI,#0 ; Assign a LUN to our terminal. CALL CHKDIR ; Check/report directive errors. BCS ERROR ; If CS, we had an error. DIR$ #ATTTI ; Try to attach our terminal. CALL CHKDIR ; Check/report directive errors. BCS ERROR ; If CS, we had an error. DIR$ #GMCR ; GET MCR COMMAND LINE BCC 10$ ; IF CC, GOT A COMMAND LINE CMP $DSW,#IE.AST ; STARTED BY RUN COMMAND ? BNE ERROR ; IF NE, NO 10$: MOV #GMCR+G.MCRB,R0 ; Set the input buffer address. CALL PARSE ; PARSE THE COMMAND LINE MOV #PRMTBL,R4 ; POINT TO PARAMETER TABLE MOV (R4),R0 ; POINT TO FIRST PARAMETER BEQ 30$ ; IF EQ, THERE IS NONE CMPB (R0),#'? ; USER WANT SOME HELP ? BNE 30$ ; IF NE, NO MOV #HELP,R0 ; POINT TO HELP MESSAGE CALL WRITE ; AND WRITE IT JMP EXISUC ; And exit with success ... 30$: BR TERM ; Must be a terminal device name. ; Elegant error reporting ... ERROR:: JMP EXIERR ; Exit with error status. .SBTTL TERM - Report Terminal Characteristics. ;+ ; ; TERM - Report Terminal Characteristics. ; ; This subroutine will report the terminal characteristics in a format ; similar to the VMS operating system. Characteristics supported on ; VMS but not on RSX-11M/M+ are: ; ; Hostsync, Readsync, Modem, Local_echo (?), Brdcstmbx, ; DMA, Altypeahd, Hangup, Set_speed (?) ; ; The format is: ; ; Terminal: TT13: [log,uic] Device_Type: VT100 Owner: R. MILLER ; ; Input: 9600 LFfill: 0 Width: 80 Parity: None ; Output: 9600 CRfill: 0 Page: 24 State: Resume ; ; Interface Subline: 2 Typeahead Mode: Task Typeahead Size: 86 ; ; Terminal Characteristics: ; Interactive Echo Type_ahead (n) No Escape ; Non-privileged TTsync Lowercase Tab ; Wrap Scope Remote (speed) No Holdscreen ; No Eightbit Broadcast No Formfeed Half-duplex ; No Passall No Autobaud ANSI_CRT No Regis ; No Block_mode DEC_CRT Advanced_video No Edit_mode ; ; Inputs: ; (R4) = Pointer to next parameter (if any). ; ;- .ENABL LSB TERM:: CALL ASSLUN ; ASSIGN SHOW DEVICE LUN DIR$ #GETCH0 ; Get first part of characteristics. CALL CHKDIR ; Check/report directive errors. BCS ERROR ; If CS, we had an error. DIR$ #GETCH1 ; Get second part of characteristics. CALL CHKDIR ; Check/report directive errors. BCS ERROR ; If CS, we had an error. DIR$ #GETCH2 ; Get third part of characteristics. CALL CHKDIR ; Check/report directive errors. BCS ERROR ; If CS, we had an error. DIR$ #GETSPD ; GET TERMINAL SPEED DIR$ #GETREM ; GET REMOTE STATUS MOV #OUTBUF,R0 ; GET OUTPUT BUFFER ADDRESS $IF ; If NE, processing more terminals. CRLF $END INC TTYCNT ; Count terminals processed. MOV LUNBUF+G.LUNA,R1 ; Get the terminal name. MOV LUNBUF+G.LUNU,R2 ; Get the terminal number. CALL GETUAB ; Get the user account block. $IF <,CC,> ; If CC, we have the information. INCB UABFLG ; Show success. $ELSE CLRB UABFLG ; Else, show failure. $END ; ; Format: ; ; Terminal: TT13: [log,uic] Device_Type: VT100 Owner: R. MILLER ; MVS ,27. MOVB LUNBUF+G.LUNA,(R0)+ ; Copy the MOVB LUNBUF+G.LUNA+1,(R0)+ ; device name. ADD #2,FLDSIZ ; Adjust the field size. MOV LUNBUF+G.LUNU,R1 ; Get the terminal number. CALL CVTOCT ; Convert it to octal ASCII. MVS <: > $IF ; If NE, we have acounting block. MOV UABBUF+B.UUIC,R3 ; Copy the binary login UIC. CALL CVTUIC ; Convert it to an ASCII string. $END PAD MVS ,24. MOV #BUFFER,R5 ; GET CHARACTERISTIC BUFFER MOVB O.TTP(R5),R1 ; GET TERMINAL TYPE MUL #TBLSIZ,R1 ; FIND OFFSET INTO TABLE ADD #TTYPE,R1 ; ADD OFFSET TO LOCATION CALL STRSPC ; STRIP LEADING SPACES CALL MOVE ; MOVE WIDTH TO OUTPUT BUFFER PAD MVS $IF ; If NE, we have acounting block. CALL FMTNAM ; Format the owner name. $ELSE CALL TRYATT ; Try to attach the terminal port. $IF <,CC,> ; If CC, terminal was attached. MVS $ELSE ; Else, someone has it attached. MVS $END $END CRLF CRLF ; ; Format: ; Input: 9600 LFfill: 0 Width: 80 Parity: None ; MVP MVS ,19. MOVB O.RSP(R5),R1 ; Get the receiver speed. CALL MSPEED ; Copy the ASCII speed string. PAD MVS ,16. $IF ; If EQ, no vertical fill. MVS <0> $ELSE MVS <4> $END PAD MVS MOVB O.WID(R5),R1 ; Get the terminal width. BIC #^C377,R1 ; Clear possible sign extend. CALL CVTDEC ; Convert it to decimal ASCII. PAD MVS CRLF ; ; Format: ; Output: 9600 CRfill: 0 Page: 24 State: Resume ; MVP MVS ,19. MOVB O.XSP(R5),R1 ; Get the transmit speed. CALL MSPEED ; Copy the ASCII speed string. PAD MVS ,16. MOVB O.HFL(R5),R1 ; Get the horizontal fill. CALL CVTDEC ; Convert it to decimal ASCII. PAD MVS MOVB O.LPP(R5),R1 ; Get the lines per page. BIC #^C377,R1 ; Clear possible sign extend. CALL CVTDEC ; Convert it to decimal ASCII. PAD MVS $IF ; If EQ, in a resume state. MVS $ELSE $IF ; If ON, in a CTRL/S state. MVS $END $IF ; If ON, in a CTRL/O state. $IF ; CTRL/S state also ? MVS <,> ; Yes, seperate with a comma. $END MVS $END $END CRLF CRLF ; ; Format: ; Interface Subline: 2 Typeahead Mode: Task Typeahead Size: 86 ; MVP MVS ,24. MOVB O.ISL(R5),R1 ; Copy the interface subline #. CALL CVTDEC ; Convert it to decimal ASCII. PAD MVS $IF ; If EQ, using task typeahead. MVS $ELSE MVS $END PAD MVS MOVB O.TBS(R5),R1 ; Copy the typehead buffer size. BIC #^C377,R1 ; Clear possible sign extend. CALL CVTDEC ; Convert it to decimal ASCII. CRLF CRLF ; ; Format: ; ; Terminal Characteristics: ; Interactive Echo Type_ahead (n) No Escape ; MVS CRLF MVP 19. $IF ; If NE, terminal is offline. MVS $ELSE $IF ; If NE, terminal is slaved. MVS $ELSE ; Else, presume interactive. MVS $END $END PAD $IF ; If NE, echo is disabled. MVN $END MVS PAD $IF ; If EQ, typeahead is disabled. MVN $END MVS MOVB O.TBF(R5),R2 ; Copy the typeahead count. BIC #^C377,R2 ; Clear possible sign extend. $IF <,NE,,> ; If NE, show typeahead count. MVS < (> MOV R2,R1 ; Copy the typeahead count. CALL CVTDEC ; Convert it to decimal ASCII. MVS <)> $END PAD $IF ; If EQ, escape seq. disabled. MVN $END MVS CRLF ; ; Format: ; Non-privileged TTsync Lowercase Tab ; MVP $IF ; If NE, privileged terminal. MVS $ELSE MVS $END PAD MVS PAD $IF ; If NE, lowercase input enabled. MVS $ELSE MVS $END PAD $IF ; If EQ, no hardware tabs. MVN $END MVS CRLF ; ; Format: ; Wrap Scope Remote (speed) No Holdscreen ; MVP $IF ; If EQ, wraparound is disabled. MVN $END MVS PAD $IF ; If EQ, hardcopy terminal. MVS $ELSE MVS $END PAD $IF ; If NE, terminal is local. MVS $ELSE MVS MOVB O.ASP(R5),R1 ; Get remote line answer speed. CALL MSPEED ; Copy the ASCII speed string. MVS <)> $END PAD $IF ; If EQ, no holdscreen. MVN $END MVS CRLF ; ; Format: ; No Eightbit Broadcast No Formfeed Half-duplex ; MVP $IF ; If EQ, eightbit is disabled. MVN $END MVS PAD $IF ; If NE, broadcast is disabled. MVN $END MVS PAD $IF ; If EQ, formfeeds disabled. MVN $END MVS PAD $IF ; If EQ, set to half duplex. MVS $ELSE MVS $END CRLF ; ; Format: ; No Passall No Autobaud ANSI_CRT No Regis ; MVP $IF ; If EQ, read passall disabled. MVN $END MVS PAD $IF ; If EQ, autobaud detection disabled. MVN $END MVS PAD $IF ; If EQ, not an ANSI terminal. MVN $END MVS PAD $IF ; If EQ, no REGIS instructions. MVN $END MVS CRLF ; ; Format: ; No Block_mode DEC_CRT Advanced_video No Edit_mode ; MVP $IF ; If EQ, no block transfers. MVN $END MVS PAD $IF ; If EQ, not a Digital CRT. MVN $END MVS PAD $IF ; If EQ, no advanced video. MVN $END MVS PAD $IF ; If EQ, no editing functions. MVN $END MVS ;*** CRLF ; ; VMS puts out a message stating a terminal is already allocated ; to another user. I don't like this so I've removed the message. ; ; TSTB SLFFLG ; WAS IT OUR TERMINAL ALLOCATED ; BNE 300$ ; IF NE,YES ; TSTB ATTFLG ; WAS TERMINAL ALLOCATED ; BNE 300$ ; IF NE,YES AND DON'T PRINT MESSAGE ; TSTB OFFFLG ; WAS TERMINAL OFFLINE ; BNE 300$ ; IF NE,YES AND DON'T PRINT MESSAGE ; MOV #ALRALL,R1 ; MOVE IN MESSAGE ADDRESS ; CALL MOVE ; AND MOVE IT ; CALL NEWLIN ; TERMINATE WITH NEWLINE ; CLRB (R0) ; ENSURE WE HAVE A TERMINATOR MOV #OUTBUF,R0 ; GET OUTPUT BUFFER ADDRESS CALL WRITE ; AND WRITE IT OUT TSTB WILD ; WILDCARD IN PROGRESS ? BNE 310$ ; IF NE, YES (CONTINUE) TST (R4) ; ANOTHER PARAMETER ? BEQ 320$ ; IF EQ, NO 310$: JMP TERM ; ELSE GET NEXT TERMINAL 320$: JMP EXISUC ; ELSE, EXIT WITH SUCCESS .DSABL LSB .SBTTL ASSLUN - Assign Show Device LUN ;+ ; ; ASSLUN - This subroutine assigns the LUN to the show device. ; If there are no parameters, the LUN is assigned to TI0: ; ; Inputs: ; R4 = Pointer to next parameter (if any). ; ; Outputs: ; Preserves R0 - R2. ; ; Exits on fatal errors. ; ;- ASSLUN::JSR R2,$SAVVR ; SAVE R0 - R2 TSTB WILD ; WILDCARD IN PROGRESS ? BEQ 10$ ; IF EQ, NO INCB UNIT ; POINT TO NEXT UNIT # BR 30$ ; AND CONTINUE... 10$: MOV (R4)+,R0 ; GET PARAMETER (IF ANY) BEQ 50$ ; IF EQ, NO (USE DEFAULT) CMPB (R0),#'* ; WILDCARD SPECIFIED ? BNE 40$ ; IF NE, NO MOV #"TT,ALUN+A.LUNA ; SET TO START AT 20$: CLRB UNIT ; DEVICE TT0: INCB WILD ; SET WILDCARD INDICATOR 30$: MOVB UNIT,ALUN+A.LUNU ; STORE NEXT UNIT # BR 50$ ; AND CONTINUE... 40$: MOV #ALUN+A.LUNA,R1 ; ADDRESS TO STORE NAME MOVB (R0)+,(R1)+ ; ONE BYTE AT A TIME MOVB (R0)+,(R1)+ ; INCASE OF ODD BOUNDRY CMPB (R0),#'* ; WILDCARD FOR UNIT # ? BEQ 20$ ; IF EQ, YES CLR R1 ; CONVERTED NUMBER CALL $COTB ; GET OCTAL UNIT # MOV R1,ALUN+A.LUNU ; AND STORE IT 50$: DIR$ #ALUN ; ASSIGN THE LUN BCC 80$ ; IF CC, LUN ASSIGNED CMP $DSW,#IE.IDU ; INVALID DEVICE AND/OR UNIT ? BNE 70$ ; If NE, no (something else). TSTB WILD ; Wildcard processing ? BEQ 70$ ; IF EQ, NO (report the error). JMP EXISUC ; Yes, exit with success. 70$: MOV $DSW,R0 ; No, some other error code. CALL WRTERR ; Write the error message text. BR 90$ ; And use common exit ... 80$: DIR$ #GLUNSH ; GET LUN INFORMATION CALL CHKDIR ; Check/report directive errors. BCS 90$ ; If CS, we had an error. BIT #FD.TTY,LUNBUF+G.LUCW ; IS THIS A TERMINAL ? BNE 100$ ; IF NE, YES MOV #ILLDEV,R0 ; NOPE, "Illegal ..." CALL WRITE ; TELL THE USER 90$: JMP EXIERR ; AND EXIT WITH ERROR 100$: RETURN .SBTTL FMTNAM - Format The Terminal Owner Name ;+ ; ; FMTNAM - Format the terminal owner name. ; ; Inputs: ; R0 = The output buffer address. ; ; Outputs: ; R0 = The updated buffer address. ; ;- FMTNAM::JSR R5,.SAVR1 ; Save R1 - R5. MOV #UABBUF+B.NAM,R1 ; Set address of last name. CMPB 14.(R1),#SPACE ; Is there a first initial ? BEQ 10$ ; If EQ, no (skip initial). MOVB 14.(R1),(R0)+ ; Copy the first initial. MOVB #'.,(R0)+ ; Terminate it with a period. MOVB #SPACE,(R0)+ ; Now add a space. 10$: MOV #14.,R2 ; Set size of the last name. 20$: CMPB (R1),#SPACE ; End of name (space) ? BEQ 100$ ; If EQ, yes MOVB (R1)+,(R0)+ ; No, copy this character. SOB R2,20$ ; And loop until done. 100$: CLRB (R0) ; Terminate the buffer. RETURN .SBTTL GETUAB - Get User Account Block ;+ ; ; GETUAB - Get the user's accounting block. ; ; Inputs: ; R1 = The terminal name. ; R2 = The terminal number. ; ; Outputs: ; C bit clear/set = success/failure. ; ;- GETUAB::CALL $SAVAL ; Save all registers. MOV R1,GINUAB+G.TNAM ; Save the terminal name. MOV R2,GINUAB+G.TNUM ; Save the terminal number. DIR$ #GINUAB ; Get the user account block. ; ; The error is not checked since a terminal not logged in ; returns a "invalid device and/or unit number" error. ; ; CALL CHKDIR ; Check/report directive errors. RETURN .SBTTL MSPEED - Move the ASCII speed string. ;+ ; ; MSPEED - Move the ASCII speed string. ; ; Inputs: ; R0 = The output buffer address. ; R1 = The binary (internal) speed. ; ; Outputs: ; R0 = The updated output buffer. ; R1 is destroyed. ; ;- .ENABL LSB MSPEED: TST R1 ; Is there a speed value ? BNE 10$ ; If NE, presume yes. MVS BR 100$ ; Use common return ... 10$: DEC R1 ; BIAS BY -1 MUL #SPDSIZ,R1 ; SET INDEX INTO TABLE ADD #SPDTBL,R1 ; POINT TO STRING TO MOVE CALL STRSPC ; STRIP LEADING SPACES CALL MOVE ; AND DO IT 100$: RETURN .DSABL LSB .SBTTL TRYATT - Try To Attach Terminal Port. ;+ ; ; TRYATT - Try to attach the terminal port. ; ; This routine is used to determine if the terminal port is attached ; by another task when there is no accounting block. ; ; Inputs: ; None. ; ; Outputs: ; C clear/set = attached/not attached. ; ;- TRYATT::CLRB ATTFLG ; Initialize the attach flag. CLRB OFFFLG ; Initialize the offline flag. CLRB SLFFLG ; CLEAR FLAG FOR SELF TERMINAL CHECK MRKT$S #WTEFN,#10.,#1 ; WAIT FOR 10 TICKS DIR$ #ATTSH ; ATTACH TO SHOW DEVICE DIR$ #WATE ; WAIT UNTIL ONE FLAG IS SET CMPB SHSB,#IS.SUC ; CHECK I/O STATUS BNE 10$ ; IF NE WE FAILED INCB ATTFLG ; ELSE SUCCESS CMKT$S #WTEFN ; NO NEED TO WAIT LONGER ; DON'T FORGET TO DETACH THE TERMINAL QIOW$S #IO.DET,#SHLUN,#SHEFN,,#SHSB,, BR 40$ ; LET'S GET OUT 10$: CMPB SHSB,#IE.DAA ; ARE WE ALREADY ATTACHED BNE 20$ ; IF NE ,NO INCB ATTFLG ; WE COULD NOT ATTACH INCB SLFFLG ; IT WAS OUR TERMINAL ; KILL THE ATTACH 20$: CMPB SHSB,#IE.OFL ; IS IT OFFLINE BNE 30$ ; IF NE ,NO INCB OFFFLG 30$: QIOW$S #IO.KIL,#SHLUN,#SHEFN,,#SHSB,, 40$: $IF ; If NE, terminal attached. CLC ; Show terminal was attached. $ELSE SEC ; Show terminal not available. $END RETURN .SBTTL COMMON EXIT ROUTINES ; ; Common exit routines: ; EXISUC::MOV #EX$SUC,R0 ; SET SUCCESS STATUS BR EXST ; AND EXIT WITH STATUS EXIWAR::MOV #EX$WAR,R0 ; SET WARNING STATUS BR EXST ; AND EXIT WITH STATUS EXIERR::MOV #EX$ERR,R0 ; SET ERROR STATUS BR EXST ; AND EXIT WITH STATUS EXISEV::MOV #EX$SEV,R0 ; SET SEVERE STATUS EXST:: EXST$S R0 ; EXIT WITH STATUS EXIT$S ; IN CASE EXST$S FAILS .END SHT