* 02/04/76 --14:00
* MODULE NAME: CMDINT
* NUMBER: 26
* PURPOSE: INTERPRET TEXT COMMANDS
*
*
         SYSTEM   TEXTDEF
         SYSTEM   ITEMDEF
         INVCMDTBL
         INVCMDSTA
*
         DEF      S26CMD
         REF      S32DSCR,S29STD
*
*
         DEF      26P,26D
*
26P      EQU      %
         DATA     X'26'             MODULE NUMBER
         DATA     X'020476'         DATE
         DATA     X'1200'           TIME
*
*
         TITLE    '** CMDINT(26) **'
*
S26CMD   EQU      %                 ENTRY POINT
         SAVRTN
*
*        INITIALIZE COMMAND STATUS TABLE
*
         LI,X1    SZCMDINIT         SIZE OF COMMAND STATUS TABLE
         LI,D1    0
INITLP   EQU      %
         PUT,D1   #CMDINIT,X1
         BDR,X1   INITLP
*
*        FIND FIRST CHARACTER IN COMMAND DEFINITION (FCL LIST)
*
         GET,X1   #CMDST            GET BYTE ADDR OF FIRST CHAR
         GET,X3   #NCHCMD           GET NUMBER OF CHARS
         AW,X3    X1                CALCULATE BYTE ADDR OF LAST CHAR
         AI,X3    -1
         STW,X3   LSTCHAR           SAVE ADDR OF LAST CHAR
         LI,D1    1                 INITIALIZE LCMD FLAG
         SW,BUF2  X1                TEST FOR START IN COL. 1
         AI,BUF2  1
         BNEZ     STLFLG               NO, SET LCMD FLAG
         LI,D1    0                    YES, RESET LCMD FLAG
STLFLG   EQU      %
         STW,D1   LCMDFLG           STORE LCMD FLAG
*
*
         PAGE
*
*
         LI,X2    0                 SET INDEX TO FIRST ENTRY
         STW,X2   NUMFLAG           INITIALIZE NUMBER FLAG
FCLP     EQU      %
         JEZ,D1      (#FCHAR,X2),CMDERR    TEST ENTRIES FOR ZERO
         CI,D1    '0'               TEST FOR DIGIT
         BGE      TSTNUM                 YES, TEST NUMBER
         CB,D1    0,X1                  NO, TEST CHARACTER
         BE       FCFND             FIRST CHARACTER FOUND
         CLM,D1   LCLIMS            TEST FOR ALPHA 1ST CHAR
         BCS,9    INCFCLP              NO, INCR F-C LOOP
         AI,D1    X'40'                YES, CONVERT TO U.C.
         CB,D1    0,X1              TEST CHARACTER
         BE       FCFND                FOUND
*
INCFCLP  EQU      %
         AI,X2    1                 SET INDEX FOR NEXT ENTRY
         B        FCLP              GET NEXT 1ST CHAR
*
         PAGE
*
*
TSTNUM   EQU      %
         CB,D1    0,X1              COMPARE NUMBER TO COMMAND
         BLE      NUMFND               CMD 1ST CHAR = NUMBER
         LI,D2    '.'               NOW TEST FOR DECIMAL POINT
         CB,D2    0,X1
         BNE      INCFCLP           NOT POINT, INCR 1ST CHAR LOOP
*
NUMFND   EQU      %
         MTW,1    NUMFLAG           SET NUMBER FLAG
         B        FCFND             NOW GET COMMAND FLAGS
*
*
         BOUND    8
LCLIMS   DATA     LC('A'),LC('Z')   L.C. ALPHA LIMITS
*
*
         PAGE
*
*        FIRST CHARACTER FOUND, NOW FIND COMMAND
*
FCFND    EQU      %
         GET,D1   #CMDPTR,X2        GET POINTER TO FIRST COMMAND DEF
*
CMDLP    EQU      %
         AI,D1    CMDTBL            CALCULATE WORD ADDRESS
         GET,D2   *#PFLG            GET I/O FLAG FOR COMMAND DEF.
         GET,AC1  #IOFLG            GET  I/O FLAG FOR COMMAND
         CW,D2    AC1               COMPARE I/O FLAGS
         BNE      GETNXT                NOT EQUAL, GET NEXT COMMAND DEF
         MTW,0    NUMFLAG           TEST FOR NUMBER FLAG
         BNEZ     CMDFND               SET, COMMAND FOUND
         LW,X2    D1                    EQUAL, MOVE DEF ADDR TO X2
         SLS,X2   2                 CALCULATE BYTE ADDR OF COMMAND DEF
         AI,X2    9                 INCR TO 1ST CHAR
         GET,AC1    *#NCCMD         GET # CHARS IN COMMAND DEF
         BAL,SRTN S26UCLC           GO TEST FOR CHAR STRING
         CI,AC1   0                 TEST FOR FOUND
         BE       CMDFND               YES, COMMAND FOUND
*
GETNXT   EQU      %
         JNEZ,D1     *#NXTCMD,CMDLP   GET POINTER TO NEXT COMMAND DEF
         PAGE
*
*        COMMAND ERROR, PRINT 'ILLEGAL ACTION MESSAGE'
*
*
CMDERR   EQU      %
         LI,AC1   10                'ILLEGAL ACTION' MSG
PRNTMSG  EQU      %
         BAL,SRTN S29STD            PRINT ERROR MESSAGE
         LI,D1    0
         PUT,D1   #APADDR           ZERO ACTION PROG
         LI,SR3   1                 SET ERROR INDICATION
         RETURN
*
OPTNERR  EQU      %
         LI,AC1   32                'COMMAND OPTION ERROR' MESSAGE
         B        PRNTMSG           PRINT ERROR MESSAGE
*
LCMDERR  EQU      %
         LI,AC1   31                'CMD MUST START IN COL 1' MESSAGE
         B        PRNTMSG           GO PRINT ERROR MESSAGE
*
*
         PAGE
*
*
*        COMMAND FOUND, INTERPRET PARAMETERS
*
CMDFND   EQU      %
*
         MTW,0    LCMDFLG           TEST LCMD FLAG
         BEZ      GETEFLG              NOT SET, GET EMBEDDED FLAG
         JEZ,D2   *#LFLG,LCMDERR    TEST CMD TABLE FOR LCMD FLAG
GETEFLG  EQU      %
         GET,D2     *#EFLG          GET COMMAND DEF EMBEDDED FLAG
         PUT,D2   #EMBFLG           STORE IN CMDSTA
         GET,D2     *#ACTN          GET COMMAND DEF ACTION PROGRAM
         PUT,D2   #APADDR           STORE IN CMDSTA
*
*
         PAGE
*
*        INTERPRET COMMAND PARAMETERS
*
         JEZ,D2     *#PARAMS,LSTPARAM   GET PARAMETER DEFINITION POINTER
*                                     GO TO END IF ZERO
*
         AI,D2    CMDTBL            CALCULATE WORD ADDR OF PARAM DEFS
         SLS,D2   2                 CALCULATE BYTE ADDR
CHKPARAM EQU      %
         LI,AC1   0
         STW,AC1  LSTFLG            INITIALIZE LAST PARAMETER FLAG
         STW,AC1  FNDFLG            INITIALIZE OPTION FOUND FLAG
         LW,X3    D2                ADDR POINTER FOR PARAM DEFS
         LB,AC1   0,X3              GET FIRST BYTE OF PARAM DEF
         CI,AC1   X'80'             TEST FOR LAST PARAM
         BL       NTLST                 NOT LAST PARAM
         MTW,1    LSTFLG                LAST PARAM, SET LAST FLAG
         AND,AC1  =X'7F'            EXTRACT # OF CHARS IN PARAM DEF
NTLST    EQU      %
         AW,AC1   X3                CALCULATE ADDR FOR NEXT PARAM
         STW,AC1  ENDPARAM          SAVE ADDR
         AI,X3    1                 INCREMENT POINTER
         LB,AC2   0,X3              GET PARAMETER TYPE (R,NR,M,S1-S9)
         STW,AC2  PTYPE             SAVE TYPE
         CI,AC2   X'11'             TEST FOR SPECIAL OPTION DEFINITION
         BGE      PARAMFND              YES, GET NEXT PARAM
*
         PAGE
*
*        TEST FOR PARAMETER OPTIONS
*
*
GETOPTN  EQU      %
         AI,X3    1                 INCREMENT OPTION POINTER
         CW,X3    ENDPARAM          PAST END OF PARAM DEF?
         BGE      NXTPARAM              YES, GET NEXT PARAM
         LB,AC1   0,X3                  NO, GET OPTION
         CI,AC1   X'40'             TEST FOR CHARACTER
         BGE      CHKCHAR               YES, CHECK CHARACTER OPTION
         CI,AC1   X'11'                 NO, TEST FOR SPECIAL OPTION
         BGE      CHKSPEC               SPECIAL OPTION
         STW,X3   SAVPTR            SAVE OPTION POINTER
         BAL,SRTN S32DSCR           DESCRIPTOR OPTION
         LW,X3    SAVPTR            RESTORE OPTION POINTER
         CI,AC2   0                 TEST DESCRIPTOR FOUND
         BNEZ     SETFLG                YES, SET FLAG
NXTOPTN  EQU      %
         AI,X3    1                 INCREMENT OPTION POINTER
         B        GETOPTN           GET NEXT OPTION
*
         PAGE
*
*        GET NEXT PARAMETER DEFINITION
*
*
NXTPARAM EQU      %
         MTW,0    FNDFLG            TEST FOR OPTION FOUND
         BGZ      PARAMFND              FOUND, GO SET FLAG
         LW,AC1   PTYPE                 NOT FOUND, CHECK PARAM TYPE
         CI,AC1   1                 TEST FOR REQUIRED PARAM
         BE       OPTNERR               YES, COMMAND ERROR
         CI,AC1   3                 TEST FOR REQUIRED FOR MORE OPTIONS
         BE       LSTPARAM              YES, END OF COMMAND
*
PARAMFND EQU      %
         LW,D2    ENDPARAM          GET ADDR OF NEXT PARAM
         MTW,0    LSTFLG            TEST LAST PARAM FLAG
         BEZ      CHKPARAM              NOT SET, CHECK NEXT PARAMETER
*
LSTPARAM EQU      %
         CW,X1    LSTCHAR           TEST FOR PROPER # OF CHARACTERS
         BNE      OPTNERR               NO, COMMAND ERROR
*
         LI,SR3   0                 SET ERROR INDICATION TO ZERO
         RETURN
*
         PAGE
*
*        CHECK FOR CHARACTER AND SPECIAL OPTIONS
*
*
CHKCHAR  EQU      %
         LI,AC1   1                 ONE CHAR TO TEST
         LW,X2    X3                ADDR OF CHAR TO TEST
         BAL,SRTN S26UCLC           GO TEST FOR CHAR
         CI,AC1   0                 TEST FOR FOUND
         BNE      NXTOPTN              NO, GET NEXT OPTION
         B        SETFLG               YES, SET FLAGS
*
*
CHKSPEC  EQU      %
         LW,X2    ENDPARAM          GET ADDR OF NEXT PARAM
NXTSP    EQU      %
         LI,AC2   0                 INITIALIZE LAST PARAM FLAG
         LB,D1    0,X2              GET FIRST BYTE OF PARAM
         CI,D1    X'80'             TEST FOR LAST PARAM
         BL       TSTSPTYP              NOT LAST
         AI,AC2   1                     LAST, SET LAST FLAG
         AND,D1   =X'7F'            EXTRACT # OF CHARS IN PARAM
*
TSTSPTYP EQU      %
         AI,X2    1                 INCREMENT PARAM DEF POINTER
         CB,AC1   0,X2              COMPARE SPECIAL OPTION TYPES
         BE       SPCHK                 EQUAL, CHECK FOR SPECIAL OPTION
*
         CI,AC2   0                     NOT EQUAL, TEST FOR LAST PARAM
         BG       OPTNERR           LAST PARAM, ERROR
         AW,X2    D1                SET POINTER TO NEXT PARAMETER
         AI,X2    -1                SET POINTER TO START OF PARAM
         B        NXTSP             GET NEXT PARAMETER
*
*
         PAGE
*
*
SPCHK    EQU      %
         AI,X2    1                 INCREMENT OPTION POINTER
         AI,D1    -2
         LW,AC1   D1                GET NUMBER OF CHARS TO TEST
         BAL,SRTN S26UCLC           GO TEST
         CI,AC1   0                 TEST FOR FOUND
         BNE      NXTOPTN              NO, GET NEXT OPTION
*
*
*        OPTION FOUND, SET OPTION FLAGS IN CMDSTA
*
*
SETFLG   EQU      %
         MTW,1    FNDFLG            SET PARAMETER FOUND FLAG
         AI,X3    1                 INCREMENT OPTION POINTER
         LB,D1    0,X3              GET FLAG
         BEZ      PARAMFND              ZERO, TEST COMMAND END
         LW,X2    D1                GET FLAG NUMBER
         LI,D1    1
         PUT,D1   #FLAGS,X2         SET OPTION FLAG IN CMDSTA
         B        PARAMFND
*
*
         PAGE
*
* S26UCLC -- CHAR STRING COMPARE (UPPER AND LOWER CASE)
*
* ENTRY PARAMETERS: X1 = ADDR OF FIRST CHAR TO TEST
*                   X2 = ADDR OF FIRST DEFINITION CHAR (ALWAYS L.C.)
*                   AC1= NUMBER OF CHARS TO TEST
*
* EXIT PARAMETERS:  AC1= 0 IF STRINGS COMPARE
*                      = + IF NO COMPARE
*                   X1 = NEXT INPUT CHAR IF AC1=0 (SKIP BLANKS)
*                      = RESET IF NO COMPARE
*
S26UCLC  EQU      %
*
         STW,X1   SAVPTR            SAVE STARTING ADDR
         LI,AC3   #BLANK            TEST FOR LEADING BLANKS
TSTLBLP  EQU      %
         CB,AC3   0,X1              TEST FOR BLANK
         BNE      TSTCHAR              NO, TEST FOR COMPARE
         AI,X1    1                    YES, INCR POINTER
         B        TSTLBLP           TEST NEXT CHAR
*
TSTCHAR  EQU      %
         LB,AC3   0,X2              GET NEXT DEFINITION CHAR
         CB,AC3   0,X1              COMPARE TO NEXT INPUT CHAR
         BE       NXTCHAR              =, GET NEXT CHAR
*
         CLM,AC3  LCLIMS            TEST FOR L.C. ALPHA
         BCS,9    CMDNTFND             NO, STRING NOT FOUND
         AI,AC3   X'40'             CONVERT TO U.C.
         CB,AC3   0,X1              COMPARE AGAIN
         BNE      CMDNTFND             NO, STRING NOT FOUND
*
*
         PAGE
*
*
NXTCHAR  EQU      %
         AI,X1    1                 INCR INPUT POINTER
         AI,X2    1                 INCR DEFINITION POINTER
         BDR,AC1  TSTCHAR           GET NEXT CHAR IF MORE
         B        RTNUCLC           NO MORE, RETURN
*
CMDNTFND EQU      %
         LW,X1    SAVPTR            RESTORE INPUT POINTER
*
RTNUCLC  EQU      %
         B        *SRTN             RETURN
*
*
         PAGE
*
*        LOCAL DATA FOR CMDINT
*
26D      CSECT    0                 START OF LOCALS
*
NCHAR    RES      1                 NUMBER OF CHARACTERS INTERPRETED
LSTCHAR  RES      1                 BYTE ADDR OF LAST CHARACTER
LSTFLG   RES      1                 LAST PARAMETER FLAG
FNDFLG   RES      1                 OPTION FOUND FLAG
PTYPE    RES      1                 PARAMETER TYPE
ENDPARAM RES      1                 NEXT PARAMETER ADDR
SAVPTR   RES      1                 SAVE POINTER FOR NEXT OPTION
LCMDFLG  RES      1                 LCMD FLAG
NUMFLAG  RES      1                 NUMBER COMMAND FLAG
*
         USECT    #PLOC
         END
