ASMB,R,Q,C
*     NAME:   PARSE 
*     SOURCE: 92071-18209 
*     RELOC:  92071-1X209 
*     PGMR:   HLC,DJN 
* 
* 
*  **************************************************************** 
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980.  ALL RIGHTS      * 
*  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,       * 
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT * 
*  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.        * 
*  **************************************************************** 
* 
* 
      NAM PARSE,6  92071-1X209  REV.2041  800409
      ENT PARSE 
* 
      EXT .ENTP,.ZPRV 
* 
* 
A     EQU 0 
B     EQU 1 
CMBUF NOP 
BFLEN NOP 
BUFR  NOP 
PARSE NOP 
      JSB .ZPRV     SHARABLE
      DEF EXIT
      JSB .ENTP     FETCH PARAMETER ADDRESSES 
      DEF CMBUF 
      LDA BUFR
      STA BUFR1 
      LDA CMBUF     COMMAND BUFFER ADDRESS
      LDB BFLEN,I 
      JSB PARS      PARSE IT
BUFR1 NOP           PARSE BUFFER
EXIT  JMP PARSE,I 
      DEF PARSE 
* 
*     PARS IS A LOCAL VERSION OF THE SYSTEM ROUTINE PARS CONTAINED
*     IN THE MODULE SYCOM.
*     CALLING SEQUENCE: 
*     LDA BUFFER ADDRESS
*     LDB CHARACTER COUNT 
*     JSB PARS
*     DEF PRAM BUFFER 
*     -RETURN-
* 
*     THE PRAM BUFFER IS 33 WORDS LONG AND CONTAINS UP TO 8 
*     PRAMETER DESCRIPTERS FOLLOWED BY THE PRAMETER COUNT.
* 
*     EACH PARAMETER DESCRIPTER CONSISTS OF FOUR WORDS: 
* 
*     WORD          MEANING 
*     1             FLAG WORD 0=NULL PRAMETER 
*                             1=NUMERIC PRAMETER
*                             2=ASCII PRAMETER
*     2             0 IF NULL,VALUE IF NUMERIC,ASCII(1,2) IF ASCII
*     3             0 IF NOT ASCII ELSE ASCII(3,4)
*     4             0 IF NOT ASCII ELSE ASCII(5,6)
* 
*                                   TEMP USAGE IN PARSE SECTION:
* 
*                                   BUFAD = CHARACTER ADDRESS 
*                                   TYPE  = PARAMETER FLAG ADDRESS
*                                   FETCH = BUFFER FETCH ADD. 
*                                   STORE = BUFFER STORE ADD. 
*                                   BUFEN = LAST INPUT CHAR.+1 ADD. 
*                                   BASE  = RADIX (8 OR 10) 
*                                   TBUF  = DEF CHARS (6 LOCATIONS) 
*                                   TBUFS = DEF CHARS+7 
*                                   STOP  = DEF CHARS+6 
*                                   CHARS = 6 UNPACKED CHARACTERS 
*                                   PRCNT = PARAM COUNT ADDRESS 
* 
PARS  NOP 
      CLE,ELA       MAKE CHARACTER ADDRESS
      STA BUFAD     SET BUFFER CHAR ADD.
      ADA B         COMPUTE END ADDRESS.
      STA BUFEN     AND SET IT. 
      LDB =D-32     CLEAR PARAMETER AREA
      STB TYPE
      LDB PARS,I
      CLA 
CLEAR STA B,I 
      INB 
      ISZ TYPE
      JMP CLEAR 
* 
      STA B,I       CLEAR THE PRAM COUNT
      STB PRCNT     SET ADDRESS OF PRAM COUNT 
PARLP LDA TBUF
      STA FETCH 
      STA STORE 
* 
UNPAK JSB GET       GET THE NEXT CHARACTER
      CPA =B40     CHECK IF BLANK CHARACTER 
      JMP UNPAK    YES, SO SKIP CHARACTER 
      CPA =B72
      JMP SKIP      COLON, SKIP TO NEXT COMMA 
      LDB STORE     CHECK IF 6 CHARACTERS IN PRAM 
      CPB TBUFS     IF SO 
      JMP UNPAK     SKIP STORE
      STA STORE,I   STORE THE CHARACTER 
      STA LASTC     SAVE THE LAST CHARACTER 
      ISZ STORE     STEP FOR NEXT CHAR. 
* 
      JMP UNPAK     GO TO PROCESS NEXT CHARACTER
* 
*                                   ATTEMPT NUMERIC CONVERSION OF PRAM. 
* 
NUMBR LDA PRCNT,I   FIRST SET UP POINTERS 
      RAL,RAL       TAKE 4 TIMES THE PRAM NUMBER
      ADA PARS,I    PLUS THE OP CODE ADDRESS-1
      STA TYPE      SET FLAG ADDRESS
      CLE,INA       ONE MORE AND WE HAVE
      STA VALOC     THE PRAMETER VALUE LOCATION 
      LDA STORE     IF NO CHARACTERS
      CPA TBUF      INPUT 
      JMP BUMP      GO TRY NEXT ONE 
* 
*                                   NOW TRY FOR A NUMBER
* 
      ISZ TYPE,I    SET FLAG TO 1 FOR NUMBER
      LDB FETCH,I   GET FIRST CHAR
      CPB DASH       MINUS SIGN?
      ISZ FETCH      YES, INCRE TO NEXT CHAR
      CPA FETCH     (A) STILL = STORE 
      JMP ASCII     IF "-" WAS ONLY CHAR, THEN ASCII
* 
      LDB =D10      SET UP CONVERSION BASE
      LDA LASTC 
      CPA "B"       IF B SUFFIX 
      LDB =D8        SET FOR BASE 8 
      STB BASE      SET BASE
DIGIT MPY VALOC,I   BUMP THE CURRENT VALUE
VALOC EQU *-1 
      LDB FETCH,I   GET THE NEXT CHAR.
      ADB =D-58     IF GREATER THAN "9" 
      SEZ           THEN NOT A NUMBER 
      JMP ASCII 
      ADB =D10      IF LESS THAN "0"
      SEZ,RSS       THEN
      JMP ASCII     NOT A NUMBER
      CLE 
      ADA B         ACCUMULATE THE
      STA VALOC,I   NUMBER
      ISZ FETCH     STEP THE BUFFER ADDRESS 
      LDA BASE      GET THE BASE
      LDB FETCH     AND THE NEXT CHAR. LOC. TO B
      CPB STORE     IF END THEN 
      JMP NEGCH     GO TO NEXT PRAM 
* 
      INB           IF BASE 8 CONVERSION
      CPB STORE     AND LAST
      CPA =D10      CHAR. THEN DONE SO SKIP 
      JMP DIGIT     ELSE GO GET THE NEXT ONE
* 
      SPC 1 
NEGCH LDB VALOC,I   GET VALUE 
      LDA TBUF,I    IF NEG NUMBER,
      CPA DASH
      CMB,INB        NEGATE VALUE 
      STB VALOC,I   STORE VALUE 
* 
BUMP  ISZ PRCNT,I   COUNT THE PRAMETER
      LDA PRCNT,I   IF
      LDB BUFEN      EOL OR 
      CPB BUFAD       8 PRAMS LINE
      JMP RETN          THEN
      CPA =D8 
      JMP RETN           GO PROCESS 
      JMP PARLP     ELSE GO GET NEXT CHARACTER
      SPC 1 
ASCII ISZ TYPE,I    SET NOT NUMBER FLAG 
      LDA =A        FILL THE PRAM WITH BLANKS 
      LDB VALOC     PRAM ADDRESS TO B 
      INB           DON'T WORRY ABOUT FIRST WORD
      STA B,I       SET SECOND WORD 
      CLE,INB       STEP TO THIRD WORD
      STA B,I       SET THIRD WORD TO DOUBLE BLANK. 
      LDB TBUF      GET THE CHAR BUFFER POINTER 
ASCLP CPB STORE     END OF INPUT? 
      JMP BUMP      YES GO PROCESS NEXT PRAM
      CPB STOP      SIXTH CHAR YET? 
      JMP BUMP       YES, END PARAM 
      LDA B,I       GET THE CHARACTER 
      SEZ,RSS       IF UPPER CHARACTER
      ALF,SLA,ALF   ROTATE AND SKIP 
      XOR VALOC,I   LOWER ADD THE UPPER CHAR. 
      XOR =B40      ADD/DELETE THE LOWER BLANK
      STA VALOC,I   STORE THE PACKED WORD 
      SEZ           SKIP IF UPPER 
      ISZ VALOC     ELSE STEP STORE ADDRESS.
      CME,INB       TOGGLE FLAG AND BUMP FETCH ADDRESS
      JMP ASCLP     GO GET OTHER CHAR.
      SPC 2 
RETN  ISZ PARS      STEP RETURN ADDRESS 
      JMP PARS,I    RETURN
* 
SKIP  JSB GET       GET NEXT CHARACTER
      JMP SKIP      LOOP UNTIL COMMA OR END OF BUFFER 
* 
GET   NOP           GET NEXT CHARACTER
      LDB BUFAD 
      CPB BUFEN 
      JMP NUMBR     END OF BUFFER, GO PROCESS PARAMETER 
      ISZ BUFAD 
      CLE,ERB       WORD ADDRESS
      LDA B,I 
      SEZ,RSS 
      ALF,ALF       HIGH BYTE 
      AND =B377 
      CPA =B54
      JMP NUMBR     COMMA, GO PROCESS 
      JMP GET,I 
      SPC 2 
"B"   OCT 102       ASCII "B" 
DASH  OCT 55        ASCII "-" 
TYPE  NOP 
FETCH NOP 
STORE NOP 
BUFAD NOP 
BUFEN NOP 
PRCNT NOP 
TBUF  DEF CHARS 
STOP  DEF CHARS+6 
TBUFS DEF CHARS+7 
CHARS BSS 6 
LASTC NOP 
BASE  NOP 
      END 
                                                                                                                                                                                                                        