.
.         FIND COMMAND PROCESS
.
.
.         (C)  Copyright 1972-1978  John Walker
.
.         This software is in the public domain
.
          AXR$
          DEFUNCT$
          FANG
.
          PURE      CODE
.
FIND*     LX        X9,CDBPC,X8         LOAD PARAMETER CHAIN
          LA        A1,ELFDT,X9         GET FDT FOR THE ELEMENT
          LA        A0,FDTYPE,A1        LOAD TYPE OF FDT
          JNTAPE    A0,FFIND            PROCESS FILE FIND IF MASS STORAGE
          LMJ       A2,IOGET            BUILD AN I/O FCT
          LX,U      X10,,A0             SAVE FCT ADDRESS
          BGET      29                  ALLOCATE AN I/O BUFFER
          LXI,U     A0,29               FORM ACCESS WORD
          SA        A0,IOACW,X10        PUT ACCESS WORD IN PACKET
          LX,U      X7,,A0              SAVE BUFFER ADDRESS
          LA        A10,IOBLKN,X10      GET CURRENT TAPE POSITION
          LA        A9,A10              INITIALISE DYNAMIC TAPE POSITION COUNTER
          LA,U      A0,R$               LOAD READ FUNCTION
          SA        A0,IOFUNC,X10       PUT FUNCTION IN PACKET
.
.         READ IN A BLOCK AND EXAMINE IT
.
FINDL     IOW$      IOPKT,X10           READ IN A BLOCK
          AA,U      A9,1                INDICATE TAPE MOVED FORWARD
          TZ        IOSTATUS,X10        CHECK STATUS OF OPERATION
          J         FINDE               ABNORMAL.  TEST FOR EOF
          LA        A0,IOXFER,X10       LOAD WORDS TRANSFERRED
          TE,U      A0,28               IS IT LABEL BLOCK LENGTH ?
          J         FINDM               NO.  IGNORE DATA BLOCK
          DL        A0,,X7              LOAD SENTINEL FIELD
          DTE       A0,('**EF**@@@@@@') ELEMENT LABEL ?
          J         FINDM               NO.  IGNORE OTHER STUFF
          LX,U      X5,,X9              LOAD ELEMENT CLASS DESCRIPTION
          LX,U      X6,2,X7             LOAD SEARCH ITEM ADDRESS
          LMJ       X11,SELECT          APPLY ELEMENT SELECTION CRITERIA
          J         FINDM               NOT SELECTED.  TRUCK ON
.
.         ELEMENT HAS BEEN FOUND.  BACKSPACE OVER LABEL
.
          LA,U      A0,MB$              LOAD BACKSPACE FUNCTION
          SA        A0,IOFUNC,X10       SET FUNCTION IN PACKET
          IOW$      IOPKT,X10           BACK UP OVER BLOCK
          TZ        IOSTATUS,X10        NORMAL STATUS ?
          J         FINDR               NO.  ERROR THE COMMAND
FINDX     LA,H2     A0,IOACW,X10        GET I/O BUFFER ADDRESS
          BRELP     A0                  RELEASE THE I/O BUFFER
          BRELP     X10                 RELEASE THE I/O FCT
          COMPLETE  .                   END OF THIS COMMAND
.
.
FINDM     TE        A9,A10              ARE WE BACK AT START LOCATION ?
          J         FINDL               NO.  KEEP ON LOOKING
FINDNO    R$DIT     .                   ENTER EDITING MODE
          E$MSG     NOFEM               EDIT NO FIND MESSAGE
          LA        A0,ELFDT,X9         GET FCT ADDRESS
          LMJ       X11,FIST            APPEND FILE AND STATEMENT
          ZAP       .                   ERROR THE COMMAND
          J         FINDX               TERMINATE THE COMMAND
.
.         EOF HANDLER
.
FINDE     LA        A1,IOSTATUS,X10     LOAD I/O STATUS
          TE,U      A1,1                END OF FILE MARK ?
          J         FINDR               NO.  REAL TAPE ERROR
          LMJ       X11,EOT             CHECK FOR END OF VOLUME
          J         FEOF                IT WAS ONLY AN END OF FILE MARK
          DSL       A9,72               SET STOP SCAN POINT AT BLOCK ZERO OF NEW
.                                       REEL.  CANNOT SCAN BACK TO OLD REEL.
          J         FINDL               CONTINUE FIND ON NEW REEL
FINDR     LMJ       X11,IOSEDT          EDIT I/O ERROR STATUS
          ZAP       .                   ERROR THE COMMAND
          J         FINDX               COMPLETE
.
.
FEOF      LA        A0,CDOPTS,X8        LOAD COMMAND OPTIONS
          TEP       A0,(OPTION('E'))    IS THE 'E' OPTION ON ?
          J         FINDNO              YES.  SINGLE PASS FILE SEARCH MODE
          LA,U      A0,MB$              LOAD MOVE BACKWARD FUNCTION
          SA        A0,IOFUNC,X10       PUT FUNCTION IN PACKET
          LR,U      R1,1                LOAD UP LOOP COUNTER
.
EOFBL     IOW$      IOPKT,X10           BACKSPACE A BLOCK
          LA        A1,IOSTATUS,X10     LOAD UP STATUS
          JZ        A1,EOFBC            IGNORE DATA BLOCK
          TNE,U     A1,2                LOAD POINT ?
          J         EOFET               END OF TAPE.  RESTART FIND
          TE,U      A1,1                EOF MARK ?
          J         FINDR               NO.  I/O ERROR
          JGD       R1,EOFBC            LOOK UNTIL SECOND MARK
          LA,U      A0,R$               GET READ FUNCTION
          SA        A0,IOFUNC,X10       SET PACKET BACK TO READ
          IOW$      IOPKT,X10           READ IN EOF MARK
          LA        A1,IOSTATUS,X10     LOAD COMPLETION CODE
          TE,U      A1,1                EOF MARK ?
          J         FINDR               NO.  UNEXPECTED STATUS
          J         FINDL               LOOP TO READ MORE BLOCKS
.
EOFBC     ANA,U     A9,1                BACK UP CURRENT TAPE POSITION
          J         EOFBL               TRY AGAIN
.
.         END OF TAPE
.
EOFET     .
          ON        DEBUG
          TZ        A9                  AT START OF TAPE ?
          IERR      .                   GUESS NOT !
          OFF       DEBUG
          LA,U      A0,R$               GET READ FUNCTION
          SA        A0,IOFUNC,X10       SET PACKET FUNCTION
          J         FINDL               READ MORE BLOCKS
.
.         ELEMENT FILE FIND COMMAND PROCESSING
.
FFIND     LMJ       X6,GELT1            READ IN FILE TABLE INDEX, ELEMENT TABLE
          J         FBSR                BSP ERROR
          LA,U      A10                 CLEAR SEQUENCE NUMBER
.
.         SEARCH ELEMENT TABLE FOR ELEMENT
.
FFSR      AA,U      A10,1               INCREMENT SEQUENCE NUMBER
          LA        A1,A10              LOAD SEQUENCE NUMBER
          LA        A0,A14              LOAD FCT ADDRESS
          etnl      .                   look up next element
          J         FFSE                ERROR.  MUST BE END OF TABLE
          TP        EIFLG,A0            IS ELEMENT DELETED ?
          J         FFSR                YES.  IGNORE IT
          LX,U      X6,,A0              GET ELEMENT ITEM ADDRESS
          LX,U      X5,,X9              LOAD ELEMENT CLASS DESCRIPTION
          LMJ       X11,SELECT          APPLY SELECTION RULES
          J         FFSR                SEARCH ON IF NOT SELECTED
          LA        A0,EITXTA,X6        LOAD TEXT START ADDRESS
          LA        A1,ELFDT,X9         LOAD FDT ADDRESS
          SA        A0,FDMSAD,A1        SET FILE ADDRESS TO TEXT START
FFSO      LMJ       A1,EBUFRL           RELEASE BUFFERS FROM BSP
          COMPLETE  .                   END OF THIS COMMAND
.
.         NO FIND AT END OF ELEMENT TABLE
.
FFSE      TE,U      A0,014              END OF TABLE STATUS ?
          J         FBSR                NO.  REAL BSP ERROR
          R$DIT     .                   SET UP EDITOR
          LA,U      A0,NOFEM            LOAD MESSAGE ADDRESS
          TNE,U     A10,1               NO ELEMENTS IN FILE ?
          LA,U      A0,FEMTM            RIGHT.  LOAD FILE EMPTY MESSAGE
          E$MSG     .                   COPY THE MESSAGE
          LA        A0,ELFDT,X9         LOAD THE FDT ADDRESS
          LMJ       X11,FIST            IDENTIFY FILE AND STATEMENT
          ZAP       .                   ERROR THE COMMAND
          J         FFSO                EXIT THE COMMAND
.
.         BSP ERROR HANDLER
.
fbsr      la        a2,a14              load BSP FCT address
          LMJ       X11,BSPERP          EDIT BSP ERROR MESSAGE
          ZAP       .                   ERROR THE COMMAND
          J         FFSO                EXIT THE COMMAND
.
          PURE      DATA
.
NOFEM     'ELEMENT NOT FOUND IN !'
FEMTM     'NO ELEMENTS IN !'
.
          END