.TITLE HEY--TAKEN FROM CCL .IDENT /01.01/ ; EDIT # 0005 15 Apr 1981 10:23:02 DB0:[344,60]HEY.MAC;10 ; PREVIOUS EDIT 15 Apr 1981 10:19:48 DB0:[344,60]HEY.MAC;7 ; BY RAY VAN TASSLE 15 Apr 1981 ; TO MAKE A HEY PROGRAM WHICH IS INDEPENDENT FROM CCL ; HEY taskname Connect to task and notify .MCALL FDOP$A,FSRSZ$,DIR$,EXST$S,GTSK$S,GLUN$ .MCALL QIOW$C,SPWN$S,STSE$S,CLEF$S,QIOW$S,EXIT$S .ENABLE LC SPA = 040 EFN1 = 1 EF1 = 1 EFN2 = 2 EF2=2 BELL = 7 ; Chimes .MCALL STSE$S,QIOW$,SPWN$S,MRKT$S,DIR$,SPWN$ .MCALL CNCT$ CNNECT: CNCT$ ,EF1,,EXTBLK QIOW: QIOW$ IO.WVB,LUN2,EF2,,,,<0,0,40> QIO: QIOW$ IO.WVB,LUN2,EF2,,ISB,, CR=15 LF=12 ESC=33 MCRL: .WORD 0 ; Length of mcr line KEYL: .WORD 0 MCR: .BLKB 80. ; MCR buffer as input START:: MOV $TKTCB,R1 ; MAKE ME NON-PRIV BIC #T3.PRV,T.ST3(R1) MOV (PC)+,R1 .BYTE 127.,41. ; Setting up for DIR$ GMCR MOV R1,KEYL ; DIR$ #KEYL ; GET COMMAND LINE MOV @#$DSW,MCRL ; GET LENGTH OF COMMAND LINE MOV #MCR+4,R5 CALL HEY EXIT$S .PAGE .SBTTL HEY ; ; HEY ; BUFFER: .BLKW 40. EXTBLK: .WORD -1 ISB: .WORD 0,0 ; I/O Status block CODES: .WORD E2 .WORD E3 .WORD E4 .WORD FUNNY ; Because exit status is 0,1,2,or 4 .WORD E5 ERRS: .WORD FUNNY ; 0 - Internal consistency error .WORD CMLINE ; 2 - Command line I/O error .WORD SYNTAX ; 4 - Syntax error .WORD TSKCLI ; 6 - Task a CLI .WORD NSTASK ; 8 - No such active task BADSPN: .ASCII /CCL -- Bad SPAWN to ...MCR,/ .ASCIZ / Save printout and get help / .BYTE 15 MESS1: .ASCIZ /HEY -- Task / MESS2: .ASCIZ / exited with status - / ERMES: .ASCIZ /HEY -- / E2: .ASCIZ /warning/ E3: .ASCIZ /success/ E4: .ASCIZ /error/ E5: .ASCIZ /severe error/ NSTASK: .ASCIZ /Task not active "/ TSKCLI: .ASCIZ /Bad task-a CLI "/ SYNTAX: .ASCIZ /Invalid syntax "/ CMLINE: .ASCIZ /Bad command line "/ FUNNY: .ASCIZ /FUNNY -- Internal consistency error "/ .EVEN HEY: CALL TSKWAIT BCC EXOK EXST$S #EX$SEV ; ERROR, EXIT WITH SEVERE CODE EXIT$S EXOK: MOV #BUFFER,R0 ; Get output buffer address MOVB #BELL,(R0)+ ; Put in a BELL MOV #MESS1,R1 ; Get address of 1st part of MESSAGE CALL MOVE ; Put it in output buffer MOV CNNECT+C.NCTN,R1 ; Get 1st part of taskname CALL $C5TA ; Convert taskname to RAD50 MOV CNNECT+C.NCTN+2,R1 ; Get 2nd part of taskname CALL $C5TA ; Convert second part of taskname MOV #MESS2,R1 ; Get address of 2nd part of message CALL MOVE ; Move it into output buffer MOV EXTBLK,R1 ; Get exit status CMP #5,R1 ; Known return code BHI 60$ ; If HI, YES CLR R2 ; Suppress leading zeroes CALL $CBOMG ; Convert to octal BR 70$ ; 60$: ; ASL R1 ; Get word index MOV CODES(R1),R1 ; Get address of exit code message CALL MOVE ; Move it into buffer 70$: SUB #BUFFER,R0 ; Get length of message MOV R0,QIO+Q.IOPL+2 ; Move length of buffer into QIO DIR$ #QIO ; Print message EXST$S #EX$SUC ; Exit successfully EXIT$S ; R5 POINTS TO TASK-NAME STRING. LEADING SPACES IGNORED TSKWAIT: ; WAIT FOR TASK TO EXIT, RETURN WITH CARRY SET/CLEAR MOV #CNNECT+C.NCTN,R3 ; Get address to put taskname CLR (R3) CLR 2(R3) MOV R5,R0 ; Copy buffer pointer CLR R5 ; Zero error indicator 10$: CMPB (R0),#SPA ; Space? BNE 20$ ; If NE, NO TSTB (R0)+ ; Yes, skip over it BR 10$ 20$: ; Ref label CALL $CAT5 ; Convert ASCII takname to RAD50 BCS 30$ ; If CS less than 3 characters in taskname MOV R1,(R3)+ ; 1st part of taskname in connect DPB CALL $CAT5 ; Convert more taskname into RAD50 BCS 40$ ; If CS terminating character in R2 30$: ; MOVB (R0),R2 ; Get terminating character 40$: ; MOV R1,(R3) ; Taskname in connect DPB CMPB R2,#ESC ; Escape? BEQ 43$ ; If EQ YES, OK CMPB R2,#CR ; Carriage return? BNE ERROR2 ; If NE invalid terminator ; USE THE MCR ROUTINE THAT FINDS A TASK NAME FOR THE ...XXX ; NAMES, SO THAT HEY WILL WORK JUST LIKE "ABO" DOES, AND ; WILL TRACK DOWN THE TASK NAME OKAY. 43$: MOV #CNNECT+C.NCTN,R3 ; POINT TO THE NAME CALL $GTTSK BCS ERROR4 ; CAN'T FIND IT ; MAKE SURE WE GOT THE RIGHT TASK IF ONLY 3 CHARS SPECIFIED TST 2(R3) BNE 45$ ; >3 CHARS GIVEN, TAKE WHAT WE GOT ; IF ONLY 3 CHARS GIVEN, AND THE TASK IT FOUND STARTS WITH "..." CMP T.NAM(R0),#^R... ; IT MUST BE FOR MY TERMINAL BNE 45$ MOV $TKTCB,R1 CMP T.UCB(R0),T.UCB(R1) BNE ERROR4 ; TASK IS ON ANOTHER TERMINAL 45$: MOV T.NAM(R0),(R3) ;; GET THE REAL NAME FROM THE TCB MOV T.NAM+2(R0),2(R3) TST (R3) BEQ ERROR4 ; NO TASK DIR$ #CNNECT ; Connect to the specified task CMP $DSW,#IS.SUC ; Successful connection? BEQ 50$ ; If EQ, YES CMP $DSW,#IE.INS ; Was specified task A CLI? BEQ ERROR3 ; If EQ YES CMP $DSW,#IE.ACT ; Was task inactive? BEQ ERROR4 ; If EQ, YES BR ERROR0 ; No funny error 50$: ; STSE$S #EF1 ; Wait for connected task to EXIT CLC RETURN ; RETURN SUCCESS .PAGE .SBTTL HEY error processing ERROR4: INC R5 ; Task not active ERROR3: INC R5 ; Task a CLI ERROR2: INC R5 ; Invalid syntax ERROR1: INC R5 ; No command line ERROR0: ; Funny internal error ASL R5 ; Get word index MOV #ERMES,R1 ; Get 1st part of error message ;ALI MOV #BUFFER,R0 ; Move to output buffer CALL MOVE ; Move into output buffer MOV ERRS(R5),R1 ; Get address of error message CALL MOVE ; Move message into output buffer MOV CNNECT+C.NCTN,R1 ; Get 1st part of taskname CALL $C5TA ; Convert taskname to RAD50 MOV CNNECT+C.NCTN+2,R1 ; Get 2nd part of taskname CALL $C5TA ; Convert second part of taskname MOVB #'",(R0)+ SUB #BUFFER,R0 ; Get length of message MOV R0,QIO+Q.IOPL+2 ; Put it in DPB DIR$ #QIO ; Print the error message RET: SEC RETURN ; RETURN WITH ERROR STATUS .PAGE .SBTTL Subroutines ;+ ; *** MOVE - Move an ASCIZ string ; ; INPUTS: ; R0 - ADDRESS OF OUTPUT BUFFER ; R1 - ADDRESS OF ASCIZ STRING ; ; OUTPUTS: ; R0 - UPDATED ;- MOVE: ; MOVB (R1)+,(R0)+ ; Move next character TSTB (R1) ; End? BNE MOVE ; If NE NO RETURN ; Return to caller ; ; Error message typer, error text ends in null ; TYPERR: MOV #040,VFC ; MESSAGES GET STANDARD CONTROL TYPEIT: MOV R1,-(SP) MOV R0,R1 1$: TSTB (R1)+ BNE 1$ DEC R1 SUB R0,R1 QIOW$S #IO.WLB!TF.WAL,#2,#1,,,, MOV (SP)+,R1 CLR VFC RETURN VFC: .WORD 0 ; .END START