*DECK CHASE 
USETEXT COMCBEG 
USETEXT COMADEF 
USETEXT COMACBX 
USETEXT COMAFET 
    PROC CHASE; 
# TITLE CHASE - PROCESS ONE BUFFER I/O.  #
  
      BEGIN  # CHASE #
  
# 
**    CHASE - PROCESS ONE BUFFER I/O. 
* 
*     CHASE PROCESSES ONE BUFFER I/O BY CHASING THE POINTERS IN ONE 
*     FET WITH THE POINTERS IN ANOTHER FET. 
* 
*     PROC CHASE
* 
*     ENTRY      <FTTENT> = FWA FTT ENTRY.
*                <XFRHOLD> = FWA TRANSFER STATUS TABLE. 
* 
*     EXIT       SEE PROCESS. 
* 
* 
* 
* 
*     PROCESS    CALCULATE BITS BEING MOVED.
*                UPDATE FET POINTERS. 
*                SAVE PREVIOUS CW POINTER 
*                IF EOI ON INPUT
*                THEN 
*                  SET INPUT I/O DONE STATE.
*                  IF US CONTROL WORD MODE
*                    AND PREVIOUS CW POINTER IS NON-ZERO: 
*                    IF LAST PRU WAS FULL:  
*                      SET EOI INPUT EXTENT 
*                  SET PREVIOUS CW POINTER = 0. 
*                IF EOI INPUT EXTENT
*                THEN 
*                  IF US CONTROL WORD MODE
*                  THEN 
*                    INSERT ZERO-LENGTH PRU.
*                  SET NULL INPUT EXTENT. 
*                RETURN.
* 
****  PROC CHASE - XREF LIST BEGIN. 
# 
  
      XREF
        BEGIN 
        FUNC DATAWDS I;              # DATA WORDS IN INPUT BUFFER # 
        FUNC FREEWDS I;              # DATA WORDS AVAILABLE # 
        FUNC MODIN   I;            # MODULUS OF INPUT BUFFER POINTER #
        FUNC MODOUT  I;              # MODULO OUTPUT BUFFER POINTER # 
        END 
  
# 
****  PROC CHASE - XREF LIST END. 
# 
  
  
      ITEM CURRENTWDS U;             # CURRENT INPUT WORDS #
      ITEM WDSOUT     I;             # WORDS JUST OUTPUT #
      ITEM INPUTEOI   B;             # INPUT EOI FLAG # 
  
CONTROL EJECT;
  
  
      INPUTEOI = GFETCOMPL AND (GFETEC EQ EOI); 
      WDSOUT = OTDATAWDS - (OTBUFSIZE - FREEWDS - 1); 
  
      IF WDSOUT NE 0
      THEN
        BEGIN 
        OTTOTBITS = OTTOTBITS + 60*WDSOUT;
        OTDATAWDS = OTDATAWDS - WDSOUT; 
        INTOTBITS = OTTOTBITS;
        GFETOUT = MODIN(WDSOUT);
        END 
  
      CURRENTWDS = DATAWDS; 
  
      IF CURRENTWDS NE OTDATAWDS
      THEN
        BEGIN 
        PREVCWPTR = PFETIN; 
        PFETIN = MODOUT(CURRENTWDS-OTDATAWDS);
        OTDATAWDS = CURRENTWDS; 
        END 
  
      IF INPUTEOI 
      THEN
        BEGIN 
        INIOSTATE = IODONE; 
        IF PREVCWPTR NE 0 
          AND FTTUSCWS
        THEN
          BEGIN 
          PFETIN == PREVCWPTR;
          P<CW> = PFETIN; 
          ASLONGAS PFETIN NE PREVCWPTR
          DO
            BEGIN 
            P<CW> = PFETIN; 
          CONTROL IFEQ OS$NOS;
            PFETIN = MODOUT(((CWBYTC+4)/5)+2);
          CONTROL ENDIF;
          CONTROL IFEQ OS$NOSBE;
            PFETIN = MODOUT(65);
          CONTROL ENDIF;
            IF CWBYTC EQ CWPRU*5
              AND PFETIN NE PREVCWPTR 
            THEN
              BEGIN 
              P<CW> = PFETIN; 
              IF CWBYTC EQ 0
              THEN
                BEGIN 
                P<LVLCW> = MODOUT(1); 
                LVLCWLVL = 0; 
                END 
  
              END 
  
            END 
  
          IF CWBYTC EQ CWPRU*5
          THEN
            BEGIN 
            INDATSTATE = DSEOI; 
            END 
  
          END 
  
        PREVCWPTR = 0;
        END 
  
      IF INDATSTATE EQ DSEOI
      THEN
        BEGIN 
        IF FTTUSCWS 
        THEN
          BEGIN 
          P<CW> = PFETIN; 
          CWWORD = OTFULLCW;
          CWBYTC = 0; 
          P<LVLCW> = MODOUT(1); 
          LVLCWLVL = 0; 
        CONTROL IFEQ OS$NOS;
          PFETIN = MODOUT(2); 
        CONTROL ENDIF;
  
        CONTROL IFEQ OS$NOSBE;
          PFETIN = MODOUT(65);
        CONTROL ENDIF;
  
          END 
  
        ELSE
          BEGIN 
          OTLEVEL = 0;
          OTIOSTATE = IOREQWRTR;
          END 
  
        INDATSTATE = DSNULL;
        END 
  
      RETURN; 
  
      END  # CHASE #
  
    TERM
