;39 CMD.MAC.3 10-Jun-81 23:40:41, Edit by Bill S. and JD ;39 fix dprompt for extended addressing, change jrstf to jrst in repars ; UPD ID= 324, SNARK:<4.1.UTILITIES>CMD.MAC.4, 12-Mar-80 14:06:39 by OSMAN ;tco 4.1.1094 - display bad command if not from a terminal ; UPD ID= 245, SNARK:<4.1.UTILITIES>CMD.MAC.3, 5-Feb-80 10:39:19 by OSMAN ;IN DPROMP, DO CALLRET INSTEAD OF CALL AND RET ;<4.1.UTILITIES>CMD.MAC.2, 12-Nov-79 10:15:39, EDIT BY OSMAN ;TCO 4.1.1014 - Make REPARS external ;<4.UTILITIES>CMD.MAC.7, 3-Apr-79 13:53:15, EDIT BY OSMAN ;Make CMDERR global ;<4.UTILITIES>CMD.MAC.5, 2-Apr-79 14:59:11, EDIT BY OSMAN ;GIVE STACK OVERFLOW ERROR IF TOO MUCH USER STACK TO SAVE DURING PROMPT SETUP ;<4.UTILITIES>CMD.MAC.4, 10-Mar-79 13:43:33, EDIT BY KONEN ;UPDATE COPYRIGHT FOR RELEASE 4 ;<4.UTILITIES>CMD.MAC.3, 14-Feb-79 10:44:19, EDIT BY OSMAN ;ADD CJFNLN ;<4.UTILITIES>CMD.MAC.2, 7-Jan-79 08:05:13, EDIT BY R.ACE ;Make CONFRM and NOISE preserve caller's T1-T4 ;<4.UTILITIES>CMD.MAC.1, 27-Jul-78 10:08:39, EDIT BY OSMAN ;SET UP .CMIOJ IN CMDINI INSTEAD OF DPROMP ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED ; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ;COPYRIGHT (C) 1976,1977,1978,1979 BY DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. IFNDEF REL, ;DEFAULT IS UNIVERSAL IFE REL,< UNIVERSAL CMD EXTERNAL RFIELD,CMDINI,CFIELD,CMDERR,CMDER1,DPROMPT,RFLDE,NOIRTN,CFMRTN,REPARS > IFN REL,< TITLE CMD > SEARCH MONSYM,MACSYM SALL ;AC DEFINITIONS A=1 ;A-D ARE TEMPORARY B=2 C=3 D=4 P1=10 ;P1-P4 ARE SUPPOSEDLY PRESERVED THROUGH SUBROUTINE CALLS P2=11 P3=12 P4=13 CX=16 ;USED BY SUPPORT CODE P=17 ;STACK POINTER SUBTTL MACRO DEFINITIONS ;MACRO TO PROMPT FOR COMMAND DEFINE PROMPT (MESSAGE) < HRROI A,[ASCIZ MESSAGE] CALL DPROMPT > ;MACRO TO PRINT GUIDEWORDS DEFINE NOISE (SHT) < HRROI CX,[ASCIZ\SHT\] CALL NOIRTN > ;MACRO TO REQUIRE CONFIRMATION DEFINE CONFRM < CALL CFMRTN > ;MACRO TO MAKE TABLE ENTRY DEFINE T (WORD,ADDRES) < IFB ,< [ASCIZ /WORD/],,.'WORD> IFNB ,< [ASCIZ /WORD/],,ADDRES> > ;MACRO TO GENERATE COMND JSYS STORAGE DEFINE CMDSTG < CMDBLN==:<^D80*6>/5+1 ;ROOM FOR SIX LINE COMMAND CMDBUF::BLOCK CMDBLN CMDACS::BLOCK 20 ;SAVED AC'S FROM BEGINNING OF COMMAND LINE ATMBLN==:CMDBLN ATMBUF::BLOCK ATMBLN ;HOLDS LAST PARSED FIELD SBK:: BLOCK 20 ;COMND JSYS STATE BLOCK CJFNLN==:20 CJFNBK::BLOCK CJFNLN ;GTJFN BLOCK FOR COMND JSYS REPARA::0 ;REPARSE ADDRESS FOR COMND CMDFRM::0 ;MARKS BOTTOM OF STACK CMDPLN==:200 ;AMOUNT OF STACK WE CAN SAVE CMDPDL::BLOCK CMDPLN ;ROOM TO SAVE PDL > SUBTTL SUPPORT ROUTINES FOR CMD IFN REL,< ;SYMBOLS WHICH USER PROGRAM MUST DEFINE. HE MAY CONVENIENTLY DO ;SO, HOWEVER, WITH CMDSTG MACRO DEFINED ABOVE. EXTERNAL CMDBUF,CMDBLN ;USER'S COMMAND BUFFER AND LENGTH EXTERNAL CMDACS ;BLOCK TO STORE AC'S WHEN COMMAND STARTS EXTERNAL CMDPDL,CMDPLN ;PLACE TO SAVE STACK WHEN COMMAND STARTS EXTERNAL SBK ;STATE BLOCK EXTERNAL CJFNBK,CJFNLN ;JFN BLOCK EXTERNAL ATMBUF,ATMBLN ;ATOM BUFFER AND LENGTH EXTERNAL REPARA ;HOLDS REPARSE ADDRESS EXTERNAL CMDFRM ;HOLDS BOTTOM OF STACK ;GET HERE ON COMND JSYS ERROR. LET USER TRY AGAIN. MESLN==30 CMDERR:: STKVAR <> HRROI A,ERMES ;POINT TO MESSAGE AREA MOVE B,[.FHSLF,,-1] ;OURSELF, MOST RECENT ERROR MOVSI C,-MESLN*5 ;MAXIMUM STRING WE'VE ROOM FOR ERSTR ;GET ERROR STRING JFCL JFCL ;UNEXPECTED ERRORS HRROI A,ERMES ;POINT AT STRING ESOUT ;PRINT IT IN STANDARD MANNER HLRZ A,.CMIOJ+SBK ;SEE WHERE COMMAND CAME FROM DVCHR ;GET DEVICE TYPE LOAD A,DV%TYP,B ;SEE IF INPUT FROM A TERMINAL CAIE A,.DVTTY ;IS IT? JRST [ LDB A,[350700,,.CMBFP+SBK] ;SEE IF ANY STRING TO TYPE JUMPE A,.+1 ;IF NOT, NO DASH TMSG < - > MOVE A,.CMBFP+SBK ;NO, SO DISPLAY ROTTEN COMMAND PSOUT JRST .+1] ;... ;COME HERE TO LET USER FIX HIS ERROR (BY TYPING ^H) OR ISSUE ANOTHER ;COMMAND ;PRINT ERROR MESSAGE BEFORE TRANSFERRING HERE ;... CMDER1::SOS REPARA ;MODIFY REPARSE ADDRESS SO REPROMPT HAPPENS JRST REPARS ;PLACE TO TRANSFER IF USER EDITS PREVIOUSLY PARSED FIELDS REPARS:: MOVE P,CMDACS+P ;FIRST RESTORE P SO WE KNOW HOW MUCH STACK TO RESTORE HRLI A,CMDPDL ;RESTORE STACK FROM SAVED STACK HRR A,CMDFRM ;COPY TO BOTTOM OF STACK BLT A,(P) ;RESTORE THE STACK MOVSI 16,CMDACS ;MAKE BLT POINTER BLT 16,16 ;RESTORE REST OF AC'S JRST @REPARA ;TRANSFER BACK TO JUST AFTER .CMINI CALL ;39 jrstf doesn't work in non-zero sections ;ROUTINE TO PROMPT FOR NEW COMMAND OR NEW PROMPT LINE OF COMMAND. ;CALL THIS ROUTINE WITH POINTER TO PROMPT IN A, OR 0 IF NO PROMPT. DPROMP::CAIN A,0 ;ANY PROMPT? HRROI A,[0] ;NO, POINT TO A NULL STRING MOVEM A,SBK+.CMRTY ;SAVE POINTER TO PROMPT POP P,REPARA ;REMEMBER REPARSE ADDRESS DMOVEM 0,CMDACS+0 ;SAVE AC'S MOVE 1,[2,,CMDACS+2] BLT 1,CMDACS+17 HRL A,CMDFRM ;SAVE FROM BOTTOM OF STACK HRRI A,CMDPDL ;MOVE DATA TO COMND PDL AREA HRRZ B,P ;SEE WHERE TOP OF STACK IS NOW SUB B,CMDFRM ;CALCULATE NUMBER OF WORDS MOVE C,[IOWD CMDPLN,CMDPDL] ;GET STACK POINTER TO BEGINNING OF SAVED STACK ADJSP C,(B) ;GENERATE ERROR IF TOO MUCH STACK TO SAVE hrli b,0 ; 39 fix for extended addressing - stay in sec BLT A,CMDPDL(B) ;SAVE THE STACK PUSH P,REPARA ;MAKE STACK LIKE IT WAS MOVEI A,[FLDDB. .CMINI] ;TYPE PROMPT CALLRET RFIELD ;TYPE PROMPT AND RETURN TO CALLER ;READ A FIELD ROUTINE. GIVE IT ADDRESS OF FUNCTION BLOCK IN A. ;JRSTS TO CMDERR IF ERROR. A, B, AND C WILL HAVE ;RESULT OF COMND JSYS IN THEM. RFIELD::CALL RFLDE ;READ FIELD, SKIP IF SUCCESS JRST CMDERR ;FAILED, GO PROCESS ERROR RET ;SUCCESS ;ROUTINE TO READ A FIELD AND SKIP IFF SUCCESSFUL. A, B, AND C WILL HAVE ;RESULT OF COMND JSYS IN THEM UPON RETURN. RFLDE:: MOVE B,A ;PUT FUNCTION BLOCK POINTER IN B MOVEI A,SBK ;POINTER TO STATE BLOCK IN A COMND ;READ FIELD OF COMND ERJMP R ;ERROR IN COMND JSYS TXNE A,CM%NOP ;DID COMMAND PARSE CORRECTLY? RET ;NO, SINGLE RETURN RETSKP ;YES, SKIP RETURN ;READ A FIELD AND REQUIRE CARRIAGE RETURN AFTER IT FOR CONFIRMATION CFIELD::CALL RFIELD ;READ THE FIELD CONFRM ;GET CONFIRMATION RET ;RETURN TO CALLER ;COMND JSYS INITIALIZATION ROUTINE. CALL ONLY ONCE AT BEGINNING OF ;PROGRAM. ;ALWAYS CALL THIS ROUTINE AT A LESS-THAN-OR-EQUALLY NESTED LOCATION ;WITHIN THE PROGRAM IN COMPARISON WITH ANY SUBSEQUENT CALL TO THE COMND ;JSYS EXECUTION ROUTINES CMDINI::MOVEI A,REPARS ;REPARSE ADDRESS MOVEM A,SBK+.CMFLG HRLI A,100 ;SOURCE OF COMMAND HRRI A,101 ;REGULAR PRIMARY OUTPUT MOVEM A,SBK+.CMIOJ HRROI A,CMDBUF ;POINTER TO COMMAND BUFFER MOVEM A,SBK+.CMBFP MOVEM A,SBK+.CMPTR ;POINTER TO NEXT FIELD MOVEI A,CMDBLN*5 ;ROOM FOR TYPIN MOVEM A,SBK+.CMCNT SETZM SBK+.CMINC ;NO UNPARSED CHARACTERS YET HRROI A,ATMBUF ;POINTER TO ATOM BUFFER MOVEM A,SBK+.CMABP MOVEI A,ATMBLN*5 MOVEM A,SBK+.CMABC ;ROOM IN ATOM BUFFER MOVEI A,CJFNBK ;POINTER TO JFN BLOCK MOVEM A,SBK+.CMGJB MOVEM P,CMDFRM ;REMEMBER BEGINNING OF STACK RET ;ROUTINE TO GET CONFIRMATION CFMRTN::PUSH P,A ;PRESERVE CALLER'S AC'S PUSH P,B PUSH P,C MOVEI A,[FLDDB. .CMCFM] CALL RFIELD ;PARSE CONFIRMATION XPARX: POP P,C POP P,B POP P,A RET ;ROUTINE TO PARSE GUIDE WORD TEXT ;CX/ STRING POINTER TO TEXT NOIRTN::PUSH P,A ;SAVE AC'S PUSH P,B PUSH P,C PUSH P,[FLD(.CMNOI,CM%FNC)] ;.CMFNP WORD OF FDB PUSH P,CX ;.CMDAT WORD OF FDB MOVEI A,-1(P) ;GET ADDR OF FDB IN STACK CALL RFIELD ADJSP P,-2 ;DELETE FDB FROM STACK JRST XPARX ;RESTORE A,B,C AND RETURN > ;END OF IFN REL END