ASMB,R,L,C
      HED "OPGET" FMGR UTILITY READ ROUTINE 1-77 (DLB)
      NAM OPGET,3,99 PRE-REL 770113 (DLB) 
      EXT REIO,EXEC,NAMR,INAMR
      EXT PRTN,.DFER,ITMLU
      SPC 1 
A     EQU 0 
B     EQU 1 
      SPC 1 
* 
*-------------------------------------------------------- 
* 
*     RELOC.       09570-16658
*     SOURCE       09570-18658
* 
*     DOUGLAS L. BASKINS    13 OCT 76 REV. AC 
* 
*     (C) COPYRIGHT HEWLETT-PACKARD COMPANY,1976. 
*     ALL RIGHTS RESERVED.THE INFORMATION CONTAINED ON
*     THIS MEDIUM MAY BE USED WITH ONLY ONE COMPUTER
*     AT A TIME.IT SHALL NOT OTHERWISE BE RECORDED, 
*     TRANSMITTED,OR STORED IN A RETRIEVAL SYSTEM.
*     COPYING OR OTHER REPRODUCTION WITHOUT PRIOR WRITTEN 
*     CONSENT OF HEWLETT-PACKARD COMPANY IS PROHIBITED, 
*     EXCEPT THAT ONE COPY MAY BE MADE AND RETAINED FOR ARCHIVE 
*     PURPOSES ONLY.
* 
*-------------------------------------------------------
* 
*  TYPICAL CALLING SEQUENCES: 
* 
*  :RU,OPGET,1ST PARM,2ND PARM,3RD PARM,4TH PARM  ETC.
* 
*   WHERE:
* 
*  1ST PARM = LOGICAL UNIT OF TERMINAL  (NULL DEFAULT >> 0G)
*  2ND PARM = FIRST PART OF OPTIONAL OUTPUT MESSAGE 
*  3ND-16TH PARM = CONTINUATION OF OPTIONAL OUTPUT MESSAGE -OR- 
*             IF  ,:XX,  WHERE XX IS ASCII, THEN THIS BEGINS A
*             RETURN STRING THAT WILL BE EXECUTED BY THE FMGR PROGRAM.
*             IF ANY PARAMETER BEGINS WITH A 2 CHARACTOR KEY FIELD
*             1V 2V THRU 9V, THEN OPGET WILL REPLACE THIS WITH THE
*             PARAMETERS INPUT BY THE OPERATOR IN ACCENDING "?V" ORDER. 
*             IF ANY CHARACTORS FOLLOW THE KEY FIELD, THEN THIS WILL
*             BE OUTPUT AS PART OF THE PROMPT MESSAGE WITH COMMA
*             DELIMETERS.  IF A "?V" PARAMETER IS SPECIFIED WITH A MESSAGE
*             STRING MORE THAN ONCE, ONLY THE 1ST MESSAGE STRING IS OUTPUT. 
*             IF A "?V" FIELD WITH A MESSAGE IS IN THE "NAME" PART OF A 
*             "NAMR" FIELD, THEN THE WHOLE "NAMR" FIELD IS OUTPUT AS PART 
*             OF THE MESSAGE.  IF THE "?V" FIELD IS IN THE SUBPARAMETER 
*             PART OF THE "NAMR" PARAMETER, THEN JUST THE MESSAGE IS OUTPUT.
* 
*  NONSENSE EXAMPLES:  RUN STRING       OUTPUT MESSAGE
* 
*         ,1VTHIS IS A MESSAGE::-2,     ,THIS IS A MESSAGE::-2, 
*         ,2VTHIS:3V:ABCDEF,            ,THIS:3V:ABCDEF,
*         ,FILE:2VSECURITY:1VCRN,       ,CRN,SECURITY,
*         ,1VABC,1VTHIS IS ILLEGAL,     ,ABC, 
* 
* 
*  REAL LIVE EXAMPLES:    (LOOK AT THEM CLOSELY)
* 
* 1)                 (SIMPLE) 
*  :RU,OPGET,0G,DO YOU WANT A LISTING? _, 
*  :IF,1P,EQ,22853,2
*  :IF,1P,EQ,20047,1
*  :IF,1,EQ,1,-4
*  <QUESTION IS REPEATED UNTIL A "YE" OR "NO" IS ANSWERED.> 
* 
* 2)                 (INTERESTING)
*  :RU,OPGET,0G,INPUT UP TO 4 PARAMETERS,:RU,XXX,1V,6,4V,2V,3V
*  INPUT UP TO 4 PARAMETERS 
*  ABCDEF:RT:-2,,D
*    ":RU,XXX,ABCDEF:RT:-2,6,,,D"   WILL BE EXECUTED
* 
* 3)                    (WILD!) 
*  :SE,1VLIST,-12 
*  :RU,OPGET,,,:RU,COMPL,,2VSOURCE:RT:2G,1G,-,3VC.S?,4V,5V,6V,7V
*  LIST,SOURCE:RT:-12,C.S?
*  6,&DOUG:DB,ASMB
*  :RU,COMPL,,&DOUG:DB:-12,6,-,ASMB 
*  <THE PREVIOUS STATEMENT WILL BE ECHOED AND EXECUTED> 
* 
*                      NOTES: 
* 
*    A NULL PARAMETER BEFORE THE  ,:RU  WILL FORCE ECHO OF COMMAND STRING.
*            (OTHER  ^ THAN THE 3RD)
*    SUBPARAMETERS MAY BE OVERWRITTEN IF AN "?V" IS IN PARAMETER FIELD. 
*    "?V" MAY BE A 1V 2V 3V 4V 5V 6V 7V 8V 9V >> IMPLYING UP TO 9 INPUTS. 
*    ONLY THE 1ST SUB-MESSAGE PER ?V PARAMETER IS WRITTEN OUT AS PROMPT.
      SPC 1 
DFWR1 DEF WRKBF     ADDRESS OF WORK BUFFER
DFENW DEF WRKBF+130 ADDRESS OF END+1 OF WORK BUFFER 
WRKBF BSS 260       MPY BY 2 FOR LINKED LISTS 
DFADB DEF ADSBF     PARAMETER CHAR COUNT PARAM BUFFER 
ADSBF BSS 14        CHARACTOR NUMBER OF START OF ALL INPUT STRING 
DFHLL DEF LINKL     BUFFER FOR HEAD OF "?V" LISTS 
LINKL BSS 9 
PRMBF BSS 15        SCRATCH PARSE BUFFER
INBUF BSS 40        RUN STRING INPUT BUFFER 
OTBUF BSS 40        MESSAGE OUTPUT BUFFER 
QUSTM ASC 1,?_      QUESTION MARK WITHOUT CR/LF 
O1    OCT 1 
O2    OCT 2 
O3    OCT 3 
O4    OCT 4 
O6    OCT 6 
D10   DEC 10
O14   OCT 14
D13   DEC 13
D14   DEC 14
O17   OCT 17
D22   DEC 22
O40   OCT 40
COMMA OCT 54
COLON OCT 72
ASC0V ASC 1,0V
ASC9V ASC 1,9V
D80   DEC 80
D130  DEC 130 
OM2   OCT -2
OM3   OCT -3
OM4   OCT -4
OM6   OCT -6
OM7   OCT -7
DM9   DEC -9
DM80  DEC -80 
DM130 DEC -130
FROMA NOP 
TOADD NOP 
TEMP1 NOP 
TEMP2 NOP 
TEMP3 NOP 
TEMP5 NOP 
TEMP6 NOP 
      SPC 1 
OTLEN NOP           LENGTH OF OUTPUT MESSAGE (CHARS)
INLEN NOP           INPUT BUFFER LENGTHS (STRING & OPERATORS) 
LU    NOP           TERMINAL LU 
PLU   NOP           TERMINAL LU WITH PRINT BIT
NCOTL NOP           SAME EXCEPT EXCLUSIVE OF TRAILING COMMAS & SPACES 
PMCNT NOP           NUMBER OF COMMAS IN FMGR PASSED COMMAND 
ECHFL ABS 1         RETURNED FMGR COMMAND STRING ECHO FLAG
STRCR ABS 1         1ST CHARACTOR NUMBER IN NEXT PARAMETER
PTADD NOP           ADDRESS OF CURRENT PARAMETER TYPE WORD IN WORK BUFFER 
O377  OCT 377 
O400  OCT 400 
      SPC 1 
START NOP           ENTRY FROM EXEC 
      JSB ITMLU     GET THE LOGICAL UNIT OF TERMINAL
      DEF *+1 
      STA LU
      IOR O400
      STA PLU       SAVE LU WITH PRINT BIT
      SPC 1 
      JSB EXEC      SWAP ONLY ME
      DEF *+3 
      DEF D22 
      DEF O2
      CCA           CALCULATE A CHARACTOR ADDRESS INDEX 
      ADA DFINB     INTO THE INPUT BUFFER 
      ADA DFINB 
      STA DFINM     FOR LATER USE 
      LDA DOTBF GET MESSAGE BUFFER ADDRESS
      RAL           MPY BY 2
      STA OTCRD     SAVE FOR PUTCR ROUTINE
      CLA           NOW INITIALIZE SOME GLOBAL POINTER AND COUNTERS 
      STA OTLEN     SET THE LENGTH OF OUTPUT BUFFER MESSAGE 
      STA NCOTL     OUTPUT LEN WITHOUT TRAILING COMMA'S AND SPACES
      STA PMCNT     SET THE NUMBER OF FMGR PARAMETERS 
      CLA,INA 
      STA ECHFL     SET PREVIOUS PARAMETER NOT NULL FLAG
      STA STRCR     SET THE NEXT CHARACTOR NUMBER OF INPUT BUFFER 
      SPC 1 
      JSB EXEC      GET THE PASSED STRING BUFFER
      DEF *+5 
      DEF D14 
      DEF O1        READ
DFINB DEF INBUF 
      DEF DM80      80 CHARS MAX
      STB INLEN     SAVE # CHARS IN INPUT STRING
      SZB,RSS       CHECK IF ONE PASSED?
      JMP CONTE     NO, DO THE NULL OUTPUT WITH "?" 
      LDA OM3       SPACE PAST FIRST 3 PARMS
      STA TEMP1 
      LDB DFPRM     GET ADDRESS OF A SCRTCH 10 WORD BUFFER
AGIN1 JSB PARSE     PARSE THE NEXT PARAMETER
      JMP CONTE     OUT OF DATA, NULL >> DO "?" THING 
      ISZ TEMP1     DONE ?
      JMP AGIN1     NO, SKIP NEXT PARAMETER 
      SPC 1 
*  NOW PARSE TO FIND A PARAMETER THAT IS THE BEGINNING OF A 
*  COMMAND/RETURN STRING BUFFER.  (,:XX >> WHERE XX IS ASCII) 
*  IF THE PREVIOUS PARAMETER TO THE ",:XX" WAS NULL, THEN THE ECHO
*  (NULL) FLAG IS SET.  ANYTHING NOT NULL BEFORE THE BEGINNING OF 
*  THE RETURN STRING BUFFER IS PUT INTO THE MESSAGE BUFFER (AFTER 
*  THE 3RD PASSED PARAMETER.) 
      SPC 1 
AGIN2 LDA STRCR     GET THE STARTING CHARACTOR NUMBER 
      STA TEMP1     SAVE
      STA DFADB,I   SAVE ENDING CHARACTOR NUMBER+1
      LDB DFWR1     GET ADDRESS OF WORK BUFFER
      JSB PARSE     PARSE IT
      JMP CONTX     NONE, LEFT, MOVE BYTES TO OUTPUT BUFFER 
      LDA ECHFL     GET PREVIOUS PARAMETER TYPE CODE
      CLE,SZA       LEAVE E=1 IF PREVIOUS PARAMETER WAS # 0 
      CCE 
      LDA WRKBF+3   GET THE TYPE WORD FROM PARSE OUTPUT BUFFER
      STA ECHFL     SET OR CLEAR LEADING NULL BUFFER FLAG 
      SZA,RSS       NULL PARAMETER? 
      JMP AGIN2     YES, SKIP IT
      AND O17       MASK TO LEAST 4 BITS
      CPA O14       POSSIBLE FMGR COMMAND?
      JMP CONTD     YES, MOVE BYTES TO OUTPUT BUFFER
AGIN3 LDA STRCR     NO, MOVE UP THE END CHARACTOR FOR LATER MOVE
      STA DFADB,I   SET 1ST CHARACTOR # OF COMMAND BUFFER 
      LDB DFWR1     GET ADDRESS OF WORK BUFFER
      JSB PARSE     GO PARSE NEXT PARAMETER 
      JMP CONTX     NONE LEFT, MOVE BYTES TO OUTPUT BUFFER
      LDA ECHFL     GET LEADING NULL FLAG 
      CLE,SZA       AND PUT IN E-REG
      CCE 
      LDA WRKBF+3 
      STA ECHFL     UPDATE LEADING NULL FLAG
      AND O17       CHECK IF A POSSIBLE FMGR COMMAND ?
      CPA O14       BEGINNING OF FMGR COMMAND BUFFER
CONTD CLA,RSS       YES, E-REG = LEADING NULL FLAG
      JMP AGIN3     NO, MORE MESSAGE BUFFER 
      ELA           MAKE UP THE ECHO FLAG 
      STA ECHFL     SET OR CLEAR ECHO RETURN STRING FLAG
      ISZ PMCNT     SET THE NUMBER OF FMGR PARMS PASSED WORD
      SPC 1 
*  NOW MOVE MESSAGE STRING TO OUTPUT BUFFER 
      SPC 1 
CONTX LDB TEMP1     GET STARTING CHARACTOR NUMBER 
      ADB DFINM     CALCULATE START CHARACTOR ADDRESS 
      LDA DFADB,I   GET LAST+1 OR 2 CHARACTOR NUMBER
      ADA DFINM     CALCULATE CHARACTOR ADDRESS 
      STA TEMP1     SAVE AS TERMINATOR ADDRESS
AGIN4 CPB TEMP1     CHECK IF DONE?
      JMP CONTU     YES, CHECK IF TRAILING COMMA NEEDED?
      JSB GETCR     GET THE NEXT CHARACTOR
      JSB PUTCR     AND PUT IN MESSAGE BUFFER 
      JMP AGIN4     NO, GET NEXT CHARACTOR
      SPC 1 
CONTU LDA PMCNT     CHECK IF FMGR COMMAND IN STRING?
      SZA,RSS 
      JMP CONTE     NO, SKIP THAT WORK
      LDA DFADB     GET ADDRESS OF CHARACTOR BUFFER (14 WORD) 
      STA TEMP1     SAVE
      LDB DFWR1     GET ADDRESS OF PARSED WORKING BUFFER
AGIN5 LDA STRCR     GET START CHARACTOR NUMBER OF 
      ISZ TEMP1     BUMP TO NEXT PARAMETER IN WORK BUFFER 
      STA TEMP1,I   PRAMETER BUFFER & SAVE
      ADB D10       BUMP TO NEXT PARAMETER IN WORK BUFFER 
      CPB DFENW     CHECK IF END OF WORK BUFFER?
      JMP CONT3     YES,
      JSB PARSE     PARSE THE NEXT PARAMETER
      JMP CONT3     NO MORE CONTINUE
      ISZ PMCNT     PARAMETER PASSED, COUNT IT
      JMP AGIN5     NO, PARSE NEXT PARAMETER
      SPC 1 
*  NOW MAKE 9 PASSES OF WORK BUFFER TO FIND ALL "1V" THUR "9V"
*  PARAMETER VALUE DEFINITION OF PARAMETER REQUIRED FROM INPUT
*  STRING.  MAKE 9 LINKED LISTS FOR 1V THRU 9V IVLST BUFFER 
      SPC 1 
LISTP NOP           CURRENT LIST TAIL ADDRESS 
NEXTP NOP           ADDRESS OF NEXT PARSE BUFFER IN WORK BUFFER 
PRM?V NOP           CURRENT ASCII "?V" PARAMETER
PRMNM NOP           CURRENT PASSED PARAMETER NUMBER 
PTYPE NOP           CURRENT PARAMETER TYPE WORD 
CONT3 LDA DFHLL     GET ADDRESS OF HEAD OF 1V LIST
      STA TEMP3     SAVE AS ADDRESS OF HEAD POINTER 
      LDA ASC0V     INITIALIZE THE "?V" PARAMETER TO 1V 
      STA PRM?V     PRESET THE ?V PARAMETER WORD
      SPC 1 
*  BUMP THE ?V PARAMETER AND RE-SCAN THE WORK BUFFER
      SPC 1 
AGIN6 CLA           CLEAR MOVED MESSAGE FLAG
      STA MESFL     TELL MVMES TO AGAIN MOVE MESSAGES 
      LDA TEMP3     GET LIST HEAD ADDRESS 
      STA LISTP     SAVE FOR LIST CONSTRUCTION TAIL ADDRESS 
      ISZ TEMP3     BUMP TO NEW LIST HEAD ADDRESS 
      LDA PRM?V     BUMP THE "?V" PARAMETER 
      CPA ASC9V     CHECK IF DONE?
      JMP CONTE     YES, GO OUTPUT MESSAGE TO OPERATOR
      ADA O400      I.E. 1V TO 2V 
      STA PRM?V     SAVE CURRENT 1V THRU 9V IN ASCII
      LDB DFWR1     GET THE WORK BUFFER ADDRESS 
      CLA           INITIALIZE PARAMETER NUMBER COUNTER 
AGIN7 CPA PMCNT     CHECK IF DONE?
      JMP AGIN6     YES, DO NEXT "?V" PARAMETER 
      STA PRMNM     SAVE PARAMETER NUMBER (0-12)
      LDA B,I       GET 1ST 2 CHARS OF MAIN PARAMETER 
      ADB D10       BUMP TO ADDRESS OF NEXT MAIN PARAMETER
      STB NEXTP     SAVE THE ADDRESS AS A TERMINATOR
      ADB OM7       BACK UP TO PTYPE  & SET E-REG 
      STB PTADD     SAVE ADDRESS OF PTYPE 
      CPA PRM?V     DOES THE "?V" TYPE MATCH? 
      CLE           YES, SET FLAG TO MARK ?V MATCH
      LDA B,I       CHECK IF ASCII PARAMETER
      RAR 
      SEZ,RSS       MATCH?
      SSA,SLA,RSS   ASCII PARAMETER?
      JMP CONTN     NO, SKIP CLEAR OF 3 WORDS 
      ADB OM3       SET B=1ST WORD
      CLA 
      STA B,I       ZERO 1ST WORD 
      INB 
      STA B,I       ZERO 2ND WORD 
      INB 
      STA B,I       ZERO 3RD WORD 
      CLE,INB       POINT TO TYPE WORD & FLAG AS MATCH
      LDA B,I       GET PARAMETER TYPE WORD 
      RAR           POSITION
      JMP CONTN     CONTINUE
      SPC 1 
AGIN8 LDA B,I       GET NEXT PARAMETER
      CPA PRM?V     CHECK IF "?V" PARAMETER 
      CLE           YES, CHECK IF IT IS ASCII 
      LDA PTYPE     GET NEXT TYPE BITS
      RAR,RAR       POSITION
CONTN STA PTYPE     SAVE TYPE CODE WORD 
      SEZ,RSS       E=1 IF NO MATCH WITH "?V" 
      SSA,SLA,RSS   CHECK IF ASCII PARAMETER? 
      JMP NVPRM     NO, CONTINUE
      ARS,ALR       STRIP OF TYPE BITS
      STA PTYPE     AND PUT BACK
      CLA           AND CLEAR THE PARAMETER 
      STA B,I 
      LDA PRMNM     GET PARAMETER NUMBER
      STB TEMP6     SAVE POINTER INTO WORK BUFFER 
      CMB,INB       CALCULATE THE COLON NUMBER 0 - 6
      ADB NEXTP     CALCULATE COLON NUMBER 0 TO -6
      ADB OM7       AND CALL THE MESSAGE ROUTINE
      JSB MVMES     PUT OPTIONAL MESSAGE IN OUTPUT BUFFER 
      LDB TEMP6     GET THE WORK BUFFER POINTER 
      ADB D130      BUMP INTO THE LIST BUFFER 
      STB LISTP,I   ADD TO LINKED LIST
      STB LISTP     AND SAVE NEW LAST ELEMENT ADDRESS 
      LDB TEMP6     RESTORE THE WORK BUFFER ADDRESS 
NVPRM CCE,INB       BUMP TO NEXT PARAMETER IN WORK
      CPB NEXTP     CHECK IF PARAMETER NUMBER NEEDS CHECKING? 
      RSS           YES 
      JMP AGIN8     NO, TRY NEXT SUBPARMETER
      LDA PTYPE     GET THE PTYPE 
      RAR,RAR 
      RAR           RESTORE TO ORIGIONAL POSITION 
      STA PTADD,I   AND PUT BACK INTO TABLE 
      LDA PRMNM     GET THE PARAMETER NUMBER
      INA 
      JMP AGIN7     YES, SEE IF MORE PARAMETERS 
      SPC 1 
* 
*  NOW OUTPUT THE MESSAGE TO OPERATOR 
* 
CONTE LDA NCOTL     GET THE LENGTH OF THE MESSAGE BUFFER
      CMA,INA,SZA   CHECK IF ANY CHARACTORS?
      JMP CONTT     YES 
      LDA QUSTM     GET THE QUESTION MARK 
      STA OTBUF     PUT IN 1ST CHARS OF MESSAGE BUFFER
      LDA OM2 
CONTT STA NCOTL     SAVE FOR EXEC CALL
      JSB REIO
      DEF *+5 
      DEF O2
      DEF LU
DOTBF DEF OTBUF 
      DEF NCOTL     -NUMBER OF CHARS TO OUTPUT (NON-TRAILING COMMAS)
CONTF JSB REIO      NOW GO READ REPLY 
      DEF *+5 
      DEF O1
      DEF PLU       WITH ECHO 
      DEF INBUF 
      DEF DM80      OF 80 CHARS 
      STB INLEN     SAVE NUMB CHARS INPUT 
      JSB EXEC      IGNORE TIME-OUTS
      DEF *+5 
      DEF D13 
      DEF LU
      DEF TEMP5 
      DEF TEMP4 
      LDA TEMP4 
      ALF 
      SSA 
      JMP CONTF 
      CLA,INA       SET THE START CHARACTOR FOR PARSE ROUTINE 
      STA STRCR 
      LDA PMCNT     CHECK IF A FMGR COMMAND PASSED? 
      SZA,RSS 
      JMP CONTG     NO, PASS BACK INPUT PARAMETERS IN 10G 
      SPC 1 
*  NOW PARSE A MAX OF 9 INPUT PARAMETERS
      SPC 1 
      LDA DM9       YES, CONVERT ANY ?V PARAMETERS IN INPUT STRING
      STA TEMP1 
      LDA DFHLL     GET ADDRESS TO LIST HEAD BUFFER 
      STA TEMP2     SAVE
AGIN9 LDA TEMP2,I   SKIP ANY NULL (UN-ASKED FOR) ?V PARAMETERS
      SZA,RSS 
      JMP CONTQ     LEFT JUSTIFY ALL ASKED FOR ?V'S 
      LDB DFPRM 
      JSB PARSE 
      NOP           IGNORE NOT PASSED ERROR 
      LDA TEMP2     GET CURRENT LIST HEAD 
      STA TEMP3     SAVE IN CURRENT LIST ELEMENT POINTER
      SPC 1 
*  SEARCH ALL ENTRYS FOR CURRENT "?V" LIST
      SPC 1 
AGN10 LDA TEMP3,I   GET NEXT PARAMETER ON LIST
      SZA,RSS       ANY ENTRYS FOR THIS PARAMETER?
      JMP CONTQ     NO, GO TO NEXT ONE
      STA TEMP3     SAVE FOR NEXT PASS
      ADA DM130     YES, CALCULATE ADDRESS OF PARAMETER 
      STA TEMP4     SAVE
      LDB DFWR1     GET BASE ADDRESS OF WORK BUFFER 
      CMB,INB 
      ADA B         GET OFFSET INTO WORK BUFFER 
      CLB 
      DIV D10       PRODUCE A MOD 
      ADB OM3 
      STB TEMP6     B-REG = 0 THRU 6
      MPY D10 
      ADA DFWR1     CALCULATE 1ST WORD ADDRESS OF PARAMETER 
      ADA O3
      STA PTADD     SAVE PARAMETER TYPE ADDRESS 
      LDB TEMP6     GET PARAMETER NUMBER 0 - 6
      CMB,INB,SZB,RSS CHECK IF MAIN OR SUBPARMETERS?
      JMP CONTR     MAIN PARAMETER >> SPECIAL CONSIDERATION 
      LDA PRMBF+3   GET PARAMETER TYPE WORD 
      AND O3        MASK TO JUST TYPE BITS
      RAL,RAL       POSITION THE TYPES BITS 
      INB,SZB       MORE POSITIONING NEEDED?
      JMP *-2       YES 
      IOR PTADD,I   MIRGE IN WITH PASSED PARAMETER
      STA PTADD,I   AND STORE BACK
      LDA PRMBF+0   GET THE VALUE OF PARAMETER
      STA TEMP4,I   AND PUT IN WORK BUFFER
      JMP AGN10     CONTINUE TO NEXT ELEMENT ON LIST
      SPC 1 
*  NOW MOVE 3 WORDS OF MAIN PARAMETER AND A CONDITIONAL MOVE
*  OF THE SUB-PARAMETERS, >> ONLY IF THEY WERE INPUT. 
      SPC 1 
CONTR LDA TEMP4 
      ADA OM3 
      STA TEMP4 
      JSB .DFER     MOVE 3 WORDS OF PARAMETER TO WORK BUFFER
TEMP4 DEF * 
DFPRM DEF PRMBF     FROM THE SCRATCH BUFFER 
      LDA OM6       SET UP COUNTER FOR MOVE OF SUB-PARAMS 
      STA TEMP6 
      LDB PTADD     GET THE PTYPE ADDRESS WORD FOR DEST BUFFER
      STB TOADD     SAVE AS THE TO ADDRESS
      LDA DFPRM     GET ADDRESS OF SCRATCH BUFFER 
      ADA O3        POINT TO TYPE WORD
      STA FROMA     SET UP FROM POINTER 
      LDA A,I       GET THE FROM TYPE BITS
      LDB B,I       GET THE TO TYPE BITS
      RAR,RAR       FORCE THE MAIN'S TYPE PARAMETER BITS
      RBR,RBR       IGNORE DEST PTYPE BITS
AGN11 ISZ TOADD     BUMP THE DEST BUFFER ADDRESS
      ISZ FROMA     BUMP THE FROM BUFFER ADDRESS
      SLA           CHECK IF PARAMETER IS NULL? 
      JMP CONTC     NO
      RRR 2         YES, MOVE IN OLD BITS 
      JMP CONTB     CONTINUE
CONTC RAR,RAR       NO, MOVE IN NEW BITS
      RBR,RBR       THROW AWAY TYPE BITS OF DEST BUFFER 
      STA TEMP5     SAVE A-REG TEMP 
      LDA FROMA,I   MOVE THE SUBPARAMETER TO DEST BUFFER
      STA TOADD,I   BECAUSE OPERATOR INPUT IT 
      LDA TEMP5     RESTORE A-REG 
CONTB ISZ TEMP6     DONE? 
      JMP AGN11     NO, TRY NEXT PARAMETER
      RAR,RAR       POSITION TYPE WORD
      STA PTADD,I   AND STORE IN DEST BUFFER TYPE WORD
      JMP AGN10     CONTINUE TO NEXT ELEMENT ON LIST
      SPC 1 
CONTQ ISZ TEMP2     BUMP TO NEXT LIST HEAD
      ISZ TEMP1     CHECK IF ALL 9 "?V" PARAMETERS CHECKED? 
      JMP AGIN9     CONTINUE UNTIL UP TO 9 ARE DONE 
      SPC 1 
*  NOW DO AN INVERSE PARSE OF THE WORK BUFFER TO PASS IT BACK TO FMGR 
      SPC 1 
      LDA PMCNT     GET NUMBER OF PASSED PARAMETERS 
      CMA,INA,SZA,RSS SET UP NUMBER TIMES TO CALL INAMR 
      HLT 0         TEMP DIAGINOSTIC
      STA TEMP1     SAVE AS LOOP COUNTER
      CLA 
      STA TEMP2     SAVE STARTING CHARACTOR NUMBER
      LDB DFWR1     GET THE WORK BUFFER 
AGN12 STB INAMB     SET THE INPUT BUFFER ADDRESS TO IPARSE
      LDA TEMP2     SUPPRESS TRAILING COMMAS
      INA 
      STA TEMP3     EQUALS CHARACTOR COUNT + 1
      JSB INAMR     DO INVERSE PARSE OF WORK BUFFER 
      DEF *+5 
INAMB DEF * 
      DEF OTBUF     USE THE MESSAGE BUFFER
      DEF D80       MAX OF 80 CHARS LONG
      DEF TEMP2     STARTING CHARACTOR
      LDA TEMP2     CHECK IF INCREASED BY ONLY ONE
      CPA TEMP3 
      RSS           YES, DO NOT UPDATE TLOG 
      STA TEMP4     UPDATE STRING LENGTH
      LDB INAMB     BUMP THE INPUT BUFFER BY 10 WORDS 
      ADB D10 
      ISZ TEMP1     DONE? 
      JMP AGN12     NO, TRY NEXT BUFFER 
      LDA TEMP4     DECREMENT BUFFER LENGTH BY ONE CHARACTOR
      CMA,INA,SZA   AND MAKE NEGATIVE 
      INA           MINUS ONE 
      STA TEMP2 
      JSB EXEC      AND PASS BACK THE STRING TO FMGR
      DEF *+5 
      DEF D14 
      DEF O2
      DEF OTBUF 
      DEF TEMP2 
      LDA ECHFL     CHECK IF THE ECHO FLAG IS SET?
      SZA 
      JMP CONTH     NO, SKIP ECHO 
      JSB REIO      AND ECHO THE MESSAGE ON THE LOG TERMINAL
      DEF *+5 
      DEF O2
      DEF PLU 
      DEF OTBUF 
      DEF TEMP2 
      JMP CONTH 
      SPC 1 
* FMGR COMMAND NOT REQUESTED, RETURN IN 10G 
      SPC 1 
CONTG LDB DFPRM     GET ADDRESS OF SCRATCH BUFFER 
      JSB PARSE     GO PARSE THE 1ST INPUT PARAMETER
      NOP           IGNORE NULL RESPONSE
      LDA PRMBF+3   GET THE TYPE OF PARAMETER TYPED 
      AND O3
      CPA O3        LOOK LIKE A NAMR? 
      JMP RNAMR     YES, RETURN NAME:SC:CRN IN 10G
      LDA OM4       NO, GO PARSE 4 MORE PARAMETERS
      STA TEMP1     TO BE RETURNED IN 1P - 5P 
AGN13 INB           BUMP TO NEXT "?P" PARAMETER 
      JSB PARSE 
      NOP 
      ISZ TEMP1 
      JMP AGN13 
      JMP CONTJ     NOW RETURN THEM TO FMGR 
      SPC 1 
*  MOVE 5TH & 6TH WORDS TO 4TH & 5TH POSITION 
      SPC 1 
RNAMR DLD PRMBF+4 
      DST PRMBF+3   MOVE DOWN LAST TWO WORDS
CONTJ JSB PRTN
      DEF *+2 
      DEF PRMBF 
CONTH JSB EXEC      TERMINATE 
      DEF *+2 
      DEF O6
      SPC 1 
*  NOW START WITH THE "?V" PARAMETER LISTS AND MIRGE IN THE INPUT 
*  PARAMETERS RETURN BY THE OPERATOR
      SPC 1 
*  PARSE WILL CALL NAMR TO PARSE THE NEXT PARAMETER IN INBUF
*  B-REG = ADDRESS OF DESTINATION PARSED BUFFER 
*  B-REG RETURNED AS PASSED 
*  RETURN P+1 IF NO DATA IN INPUT BUFFER TO PARSE, ELSE P+2 RETURN
      SPC 1 
PARSE NOP           B-REG = ADDRESS OF 10 WORD OUTPUT BUFFER
      STB DESBF     SET THE ADDRESS 
      JSB NAMR
      DEF *+5 
DESBF DEF * 
      DEF INBUF 
      DEF INLEN 
      DEF STRCR     STARTING CHARACTOR NUMBER TO PARSE AT 
      SSA,RSS 
      ISZ PARSE     P+2 RETURN IF DATA TO PARSE 
      LDB DESBF     RESTORE THE B-REG 
      JMP PARSE,I 
      SPC 1 
*  GETCR WILL GET A CHARACTOR RIGHT JUSTIFIED OF THE CHARACTOR ADDRESS
*  IN THE B-REG & RETURN WITH B = B+1 
      SPC 1 
GETCR NOP           B-REG = CHARACTOR ADDRESS OF CHAR TO GET
      CLE,ERB       CHANGE TO WORD ADDRESS
      LDA B,I       GET WORD
      SEZ,RSS       CHECK IF HI OR LO 
      ALF,ALF       HI, RIGHT JUSTIFY 
      AND O377      MASK OFF OTHER BYTE 
      ELB           RESTORE B-REG 
      INB           AND BUMP
      JMP GETCR,I   AND RETURN A-REG = CHARACTOR
      SPC 1 
*  PUTCR WILL ADD A CHARACTOR TO THE MESSAGE BUFFER & COUNT ITS LENTH 
      SPC 1 
OTCRD NOP 
PUTCR NOP           ENTRY A=CHARACTOR 
      STB PUTC1     SAVE B-REG
      ISZ OTLEN     COUNT LENGTH OF OUTPUT BUFFER 
      LDB OTLEN     UPDATE THE NON TRAILING COMMA 
      CPA COMMA     OUTPUT LENGTH 
      RSS 
      CPA O40       ALSO DELETE TRAILING SPACES 
      RSS 
      STB NCOTL     SET THE NON COMMA LENGTH
      LDB OTCRD     GET OUTPUT CHARACTOR ADDRESS WORD 
      ISZ OTCRD     AND BUMP FOR NEXT TIME
      CLE,ERB       CHANGE TO WORD ADDRESS
      SEZ,CCE,RSS   CHECK IF HI OR LO CHARACTOR 
      ALF,SLA,ALF   HI, POSITION & SKIP MIRGE OF OLD CHARACTOR
      XOR B,I       MIRGE IN OLD HI CHARACTOR 
      XOR O40       PUT IN OR TAKE OUT LO SPACE CHARACTOR 
      STA B,I       AND PUT IN BUFFER 
      LDB PUTC1     RESTORE B-REG 
      JMP PUTCR,I   RETURN P+1
      SPC 1 
PUTC1 NOP           B-REG SAVE STORAGE
      SPC 1 
*  MOVE MESSAGE STRING FROM INPUT TO OUTPUT MESSAGE BUFFER
*         LDA <PARSED PARAMETER NUMBER> 1 - 13
*         LDB <START COLON NUMBER>    0 - 6 
*         JSB MVMES           MOVE THE MESSAGE
* 
*  IGNORE IF MVFLG IS SET & SET IT BEFORE EXIT
*  IF A=0 MOVE WHOLE MESSAGE (EXCEPT "?V") FROM COMMA+1 TO COMMA
*         UNLESS NULL MESSAGE 
*  IF A#0 COUNT COLONS & TERMINATE ON NEXT COMMA OR COLON (LEAVE
*         COMMA IN MESSAGE BUFFER 
      SPC 1 
MESFL NOP           PREVIOUS OUTPUT MESSAGE FLAG
OTHTM NOP 
COLCT NOP           IGNORE LEADING COLON COUNTER
MAXCR NOP           CHARACTOR ADDRESS PAST PARAMETER
DFINM NOP           CHARACTOR ADDRESS OF INPUT BUFFER - 1 
MVMES NOP 
      STB COLCT     SAVE COLON COUNTER FOR LATER
      LDB MESFL     CHECK IF ALREADY OUTPUTED?
      SZB 
      JMP MVMES,I   YES, IGNORE REQUEST 
      ADA DFADB     ARRAY 
      DLD A,I       GET 1ST CHRAD OF CURRENT & NEXT PARAMETER 
      ADA DFINM     FORM CHARACTOR INDEX INTO INPUT BUFFER
      ADB DFINM     FORM CHARACTOR INDEX INTO INPUT BUFFER
      STB MAXCR     SAVE LAST+1 ADDRESS AS TERMINATOR 
      STA B         SAVE 1ST CHARACTOR ADDRESS IN B 
      ADB O2        AND BUMP PAST THE "1V"
      LDA COLCT     GET THE COLON COUNTER 
      SZA,RSS       CHECK IF = 0? 
      JMP MVCT2     YES, SKIP COLON COUNTING
MVCT1 CPB MAXCR     CHECK IF MORE DATA IN INPUT BUFFER
      JMP MVDON     NO, EXIT MESSAGE BUFFER UNTOUCHED 
      JSB GETCR     GET NEXT CHARACTOR
      CPA COMMA     IF COMMA, THEN DONE 
      JMP MVDON     YES, GET OUT WITH NO CHANGE TO INPUT BUFFER 
      CPA COLON     IF COLON, BUMP COUNTER
      ISZ COLCT     DONE COUNTING?
      JMP MVCT1     NO
      ADB O2        YES, BUMP PAST THE ?V 
MVCT2 STA OTHTM     SET A COLON OR NULL ALSO AS A TERMINATOR
MVCT3 CPB MAXCR     EXCEEDED THE PARAMETER? 
      JMP MVDON     DONE
      JSB GETCR     YES, START MOVING IT
                                                  