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 * * * 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 * * * 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 1 - 13 * LDB 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