; ; AUTHOR: ; R. STODOLA ; THE INSTITUTE FOR CANCER RESEARCH ; 7701 BURHOLME AVE. ; PHILADELPHIA, PA. 19111 ; ; ******************************************************* ; * * ; * THIS SOFTWARE WAS DEVELOPED WITH SUPPORT * ; * FROM THE NATIONAL INSTITUTES OF HEALTH: * ; * NIH CA06927 * ; * NIH CA22780 * ; * * ; * DIRECT INQUIRIES TO: * ; * COMPUTER CENTER * ; * THE INSTITUTE FOR CANCER RESEARCH * ; * 7701 BURHOLME AVENUE * ; * PHILADELPHIA, PENNSYLVANIA 19111 * ; * * ; * NO WARRANTY OR REPRESENTATION, EXPRESS OR * ; * IMPLIED, IS MADE WITH RESPECT TO THE * ; * CORRECTNESS, COMPLETENESS, OR USEFULNESS * ; * OF THIS SOFTWARE, NOR THAT USE OF THIS * ; * SOFTWARE MIGHT NOT INFRINGE PRIVATELY * ; * OWNED RIGHTS. * ; * * ; * NO LIABILITY IS ASSUMED WITH RESPECT TO * ; * THE USE OF, OR FOR DAMAGES RESULTING FROM * ; * THE USE OF THIS SOFTWARE * ; * * ; ******************************************************* ; * * ; * THIS SOFTWARE WAS DESIGNED FOR USE ON A * ; * PDP-11/70 OPERATING UNDER IAS V2.0 USING * ; * THE IAS PDP-11 MACRO ASSEMBLER. * ; * * ; ******************************************************* .TITLE GUNAM -- GET COMMAND LINE FOR TALK .SBTTL GUNAM -- DOCUMENTATION .IDENT /ICR001/ .MCALL GCMLB$,GCML$,ISTAT$,STATE$,TRAN$ ; ; THIS SUBROUTINE FETCHES A COMMAND LINE FOR THE TALK COMMAND. ; COMMAND LINES ARE OF THE FORM: ; PDS> TALK[/LOCK][/LIST] [USERNAME] ; CALLING SEQUENCE IS: ; CALL GUNAM(LOCK,LIST,IUSER,IER) ; LOCK RETURNED NON-ZERO IF LOCK SWITCH PRESENT. ; LIST RETURNED NON-ZERO IF LIST SWITCH PRESENT. ; IUSER BYTE ARRAY OF LENGTH 12. IF IER IS POSITIVE, ; THIS ARRAY CONTAINS THE USER NAME. ; IER ERROR CODE: ; 1 NO ERROR, USER NAME EXISTS. ; 0 NO ERROR, USER NAME DOES NOT EXIST. ; MAY ALSO INDICATE END-OF-FILEE COND. ; -1 SYNTAX ERROR. ; -2 I/O ERROR. ; ; CALL GTLIN(LINE,NCH) ; LINE ARRAY OF LENGTH 80 BYTES. ; NCH IF POSITIVE, IS NUMBER OF BYTES READ. ; IF ZERO, BLANK LINE OR EOF. ; IF NEGATIVE, I/O ERROR. ; .PAGE .SBTTL GMCL TABLES AND PARSE LOGIC ; ; COMMAND BLOCK ; GCM: GCMLB$ 3 ; ; PROMPT ; PRM: .BYTE 15,12 .ASCII /TALK> / PRME: ; PRM2: .BYTE 15,12 .ASCII /> / PRM2E: ; ; PARSE LOGIC ; ISTAT$ STATE,KEYT ;INITIALIZE PSECTS. ; STATE$ START ;INITIAL STATE FOR SWITCHES. TRAN$ $EOS,$EXIT ;LEAVE IF EOS TRAN$ '/,SWIT ;SKIP TO SWITCH IF SLASH TRAN$ $BLANK,GUSN ;GO GET USER NAME IF BLANK. TRAN$ $STRNG,$EXIT,GUN ;ELSE IS SYNTAX ERROR. STATE$ SWIT ;DEFINE SWITCHES. TRAN$ "LOCK",START,ILOC ;SET LOCK FLAG AND RETURN TO START. TRAN$ "LIST",START,ILIS ;SET LIST FLAG AND RETURN TO START. ;ELSE IS SYNTAX ERROR. STATE$ GUSN TRAN$ $EOS,$EXIT ;LEAVE IF EOS TRAN$ $STRNG,$EXIT,GUN ;MOVE USER NAME, SET IER AND FIND EOS ;ELSE IS SYNTAX ERROR. ; .SBTTL MOVE USER NAME FOR PARSE .PSECT GUN: MOV R2,-(SP) ;SAVE REGISTERS MOV R1,-(SP) MOV R0,-(SP) MOV SR5,R2 ;RECLAIM REGISTER 5. MOV #12.,R1 ;BLANK OUT USER NAME MOV 6(R2),R0 LA: MOVB #40,(R0)+ DEC R1 BNE LA MOV 6(R2),R2 ;NOW MOVE USER NAME. MOV .PSTCN,R1 ;GET LENGTH. BLE ERR ;SYNTAX ERR. CMP #12.,R1 ;IGNORE EXCESS BGE 10$ MOV #12.,R1 10$: MOV .PSTPT,R0 ;GET ADDRESS OF NAME. LB: MOVB (R0)+,(R2)+ ;MOVE USER NAME. DEC R1 BNE LB BIS #1,IER BR RETRET ERR: ADD #2,6(SP) ;BUMP RETURN TO REJECT TRANSITION. RETRET: MOV (SP)+,R0 MOV (SP)+,R1 MOV (SP)+,R2 RETURN ; ILOC: BIS #1,LOCK RETURN ILIS: BIS #1,LIST RETURN .PAGE .SBTTL GUNAM -- MAIN CODE ; LOCK: .WORD 0 LIST: .WORD 0 IER: .WORD 0 SR5: .WORD 0 ; GUNAM:: CLR LOCK ;CLEAR LOCK FLAG CLR LIST ;CLEAR LIST FLAG CLR IER ;CLEAR IER FLAG MOV R5,SR5 ;SAVE REGISTER 5 GCML$ #GCM,#PRM,#PRME-PRM ;GET COMMAND LINE. BCC INTERP ;INTERPRET IF NO ERROR. CMPB #GE.EOF,GCM+G.ERR ;EXIT IF EOF. BEQ DONE MOV #-2,IER ;SET IER TO I/O ERROR. DONE: MOV SR5,R5 ;RESTORE R5 MOV LOCK,@2(R5) ;RETURN VALUES MOV LIST,@4(R5) MOV IER,@10(R5) RETURN ; INTERP: CLR R1 ;2 CHAR SWITCHES, COUNT BLANKS MOV #KEYT,R2 ;SET UP CALL TO .TPARS MOV GCM+G.CMLD,R3 MOV GCM+G.CMLD+2,R4 MOV #STATE,R5 CALL .TPARS BCC DONE ;FINISHED IF NO ERROR. MOV #-1,IER ;SET FOR SYNTAX ERROR. BR DONE ; GTLIN:: CLR @4(R5) ;SET FOR NULL LINE OR EOF. GCML$ #GCM,#PRM2,#PRM2E-PRM2 ;GET COMMAND LINE. BCC MOVLN ;IF NO ERROR, GO MOVE LINE. CMPB #GE.EOF,GCM+G.ERR BEQ DONL ;DONE IF EOF. MOV #-2,@4(R5) ;I/O ERROR. DONL: RETURN MOVLN: MOV GCM+G.CMLD,R2 ;GET # OF CHARS. BLE DONL MOV GCM+G.CMLD+2,R1 ;GET ADDRESS OF CHARS. CMP #80.,R2 ;TRUNCATE EXCESS BGE MVL MOV #80.,R2 MVL: MOV R2,@4(R5) ;SAVE NUMBER OF CHARS. MOV 2(R5),R0 ;SAVE USER BUFFER LPM: MOVB (R1)+,(R0)+ DEC R2 BNE LPM RETURN .END