ASMB,R,L,C
*     NAME:   PCIBF 
*     SOURCE: 92067-18560 
*     RELOC:  92067-16185 
*     PGMR:   D.L.B.
* 
*  ***************************************************************
*  * (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.       *
*  ***************************************************************
* 
      HED "PCIBF" ROUTINE TO PUT BUFFER IN FMGR'S BUFFER LIST 7-78 (DLB)
      NAM PCIBF,8 92067-16185 REV.2026 800428 
      ENT PCIBF 
      EXT .ENTR 
      EXT TPSK.,NXTK.,EDSK.,CRSK. 
      SPC 1 
A     EQU 0 
B     EQU 1 
TOPSK EQU TPSK.     ADDRESS OF TOP OF BUFFER LIST BUFFER
NXTSK EQU NXTK.     NEXT AVAILABLE WORD IN BUFFER LIST BUFFER 
ENDSK EQU EDSK.     END + 0 WORD OF BUFFER LIST BUFFER
CURSK EQU CRSK.     CURRENT DISPLAY POINTER 
      SPC 1 
*  PURPOSE:  TO PUT CALLERS BUFFER (FMGR COMMAND) INTO THE
*            FMGR BUFFER LIST.
*  CALLED:
*           JSB PCIBF 
*           DEF *+3 
*           DEF BUFFER
*           DEF BUFFERLENGTH
*  WHERE: 
*     BUFFER = ADDRESS OF THE BUFFER TO PUT.
*     BUFFERLENGTH = LENGTH OF BUFFER IN WORDS. 
*  NOTES: 
*        BUFFER WILL HAVE LITTLE USE UNLESS IT IS A LEGAL FMGR
*        COMMAND WITHOUT THE LEADING ":". 
      SPC 1 
PCIBA NOP           TEMP FROM BUFFER ADDRESS POINTER
PCIBB NOP           TEMP NEG. FROM BUFFER LENGTH (WORDS)
      SPC 1 
PCIBC NOP           BUFFER ADDRESS
PCIBD NOP           BUFFER LENGTH IN WORDS
PCIBF NOP           ENTRY TO PUT A BUFFER INTO BUFFER LIST
      JSB .ENTR     GET BUFFER ADDRESS AND LENGTH 
      DEF PCIBC     TOP OF ADDRESS STACK
      SPC 1 
*  1ST SEARCH WHOLE LIST FOR MATCHING BUFFER & DELETE IF MATCH. 
      SPC 1 
      LDB TOPSK     GET THE 1ST BUFFER ADDRESS
      STB CURSK     AND SAVE CURRENT BUFFER POINTER 
NEXT0 LDA PCIBC     GET CALLERS BUFFER ADDRESS
      STA PCIBA     AND SAVE AS POINTER FOR SEARCH
      LDA CURSK,I   GET 1ST BUFFER LENGTH 
      AND O377      MASK TO JUST FORWARD LENGTH POINTER 
      CPA PCIBD,I   CHECK IF MATCHES CALLERS LENGTH?
      CMA,INA,SZA,RSS YES, NEGATE & CHECK FOR NON-ZERO. 
      JMP NEXT2     NO MATCH LENGTH, TRY NEXT BUFFER IN LIST. 
      STA PCIBB     SAVE NEGATED LENGTH OF BUFFER 
      LDB CURSK     GET ADDRESS-1 OF BUFFER IN LIST 
NEXT1 INB           BUMP TO DIRECT ADDRESS
      LDA B,I       GET THE CONTENTS OF BUFFER
      CPA PCIBA,I   CHECK IF MATCHES CALLERS? 
      RSS           YES, CONTINUE 
      JMP NEXT2     NO, TRY NEXT BUFFER IN LIST 
      ISZ PCIBA     BUMP TO NEXT WORD IN CALLERS BUFFER 
      ISZ PCIBB     CHECK IF ALL WORDS CHECKED? 
      JMP NEXT1     NO, KEEP ON TRUCKING
      SPC 1 
*  MATCHING BUFFER, DELETE BUFFER IN THE BUFFER LIST
      SPC 1 
      LDA CURSK     GET ADDRESS OF BUFFER TO DELETE 
      JSB DELIN     AND TAKE IT OUT OF THE BUFFER LIST
      JMP NEXT0     AND GO TRY NEXT BUFFER IN THE BUFFER LIST 
      SPC 1 
*  BUFFER DOES NOT MATCH, ADVANCE THE CURRENT BUFFER LIST POINTER & CONT. 
      SPC 1 
NEXT2 JSB ADVSK     MOVE "CURSK" POINTER TO NEXT BUFFER 
      JMP PCIBY     REACHED END, NOW DO THE MOVE
      JMP NEXT0     GO TRY NEXT BUFFER IN THE BUFFER LIST 
      SPC 1 
*  NOW CHECK IF ENOUGH ROOM FOR BUFFER TO BE PUT INTO BUFFER LIST 
      SPC 1 
PCIBZ LDA TOPSK     DELETE OLDEST ENTRY OFF BUFFER LIST 
      JSB DELIN     POP BUFFER LIST FOR MORE ROOM 
PCIBY LDA PCIBD,I   GET THE BUFFER LENGTH 
      AND O77       CHECK LENGTH IS KOSHER
      CPA PCIBD,I   (1-63 WORDS)
      SZA,RSS       AVOID PUTTING ZERO LENGTH 
      JMP PCIBF,I   RECORDS IN STACK
      ADA NXTSK     CHECK IF OVERFLOWS THE BUFFER LIST BUFFER 
      CMA           NEGATE - 1
      ADA ENDSK     AND CHECK IF OVERFLOWS BUFFER LIST
      SSA           IF OVERFLOW, POP OLDEST ENTRY & TRY AGAIN 
      JMP PCIBZ     OVERFLOW, GO MAKE MORE ROOM 
      SPC 1 
*  NOW PUT CALLERS BUFFER INTO THE BUFFER LIST
      SPC 1 
      LDA NXTSK,I   GET THE LENGTH WORD OF THE "TO" BUFFER
      IOR PCIBD,I   MERGE IN THE LENGTH OF CALLERS BUFFER 
      STA NXTSK,I   AND PUT BACK
      AND O377      GET THE BUFFER LENGTH 
      CMA,INA       NEGATE
      STA PCIBB     SAVE AS COUNTER FOR MOVE
      LDA NXTSK     SET UP THE CURRENT STACK POINTER
      STA CURSK     WHEN ADDING NEW BUFFER
      ISZ NXTSK     BUMP TO WHERE TO PUT BUFFER 
NEXT3 LDA PCIBC,I   GET NEXT WORD OF "FROM" BUFFER
      STA NXTSK,I   AND MOVE INTO BUFFER LIST 
      ISZ PCIBC     BUMP FROM ADDRESS WORD
      ISZ NXTSK     BUMP TO ADDRESS WORD
      ISZ PCIBB     AND BUMP COUNTER
      JMP NEXT3     GO TRY NEXT WORD
      LDA PCIBD,I   GET BUFFER LENGTH 
      ALF,ALF       POSITION
      STA NXTSK,I   AND SET THE END WORD IN BUFFER LIST 
      JMP PCIBF,I   AND EXIT TO CALLER
      SPC 1 
*   IF THE FOLLOWING THREE LINES WERE ADDED TO BUFFER LIST
*   IT WOULD LOOK LIKE THIS:
*   (1) MESSAGE 
*   (2) TWO 
*   (3) THREE 
* 
*        BIT !15!14!13!12!11!10! 9! 8! 7! 6! 5! 4! 3! 2! 1! 0!
* TOPSK      !        (0)            !         (4)           !
*            !         M             !          E            !
*            !         S             !          S            !
*            !         A             !          G            !
*            !         E             !      (SPACE)          !
*            !        (4)            !         (2)           !
*            !         T             !          W            !
*            !         O             !      (SPACE)          !
* CURSK **   !        (2)            !         (3)           !
*            !         T             !          H            !
*            !         R             !          E            !
*            !         E             !      (SPACE)          !
* NXTSK **   !        (3)            !        (0)            !
*            !   THIS IS BEYOND THE END OF THE BUFFER        !
*            !     LIST AND WILL CONTAIN GARBAGE DATA        !
* ENDSK      !  THIS IS LAST WORD IN BUFFER LIST BUFFER      !
* 
*   **  THESE WORDS ARE DYNAMIC POINTERS INTO LIST BUFFER 
      SPC 1 
*  TAKE BUFFER POINTED TO BY A-REG OUT OF BUFFER LIST 
      SPC 1 
DELIA NOP           "FROM" POINTER
DELIB NOP           "TO" POINTER
DELIN NOP           ENTRY TO DELETE A BUFFER FROM BUFFER LIST 
      STA DELIB     SAVE POINTER TO BUFFER TO DELETE
      CPA NXTSK     CHECK IF AT END?
      JMP DELIN,I   YES, IGNORE DELETE REQUEST
      LDA DELIB,I   GET THE OFFSET VALUE
      AND O377      MASK TO OFFSET BITS 
      STA B         SAVE IN B-REG THE DELETE BUFFER LENGTH
      BLF,BLF       POSITION TO HIGH BITS 
      ADB A         B-REG = DELETE BUFFER LENGTH IN HI & LO-BITS
      ADA DELIB     BUMP TO LENGTH WORD OF NEXT BUFFER-1
      INA           BUMP TO LENGTH WORD OF NEXT BUFFER
      STA DELIA     SAVE "FROM" ADDRESS FOR MOVE
      LDA DELIA,I   GET LENGTH WORD AT END-CURR/BEG-NEXT BUFFER 
      XOR DELIB,I   WITH BEG-CURR/END OF PREVIOUS BUFFER LENGTH 
      XOR B         TAKE OUT DELETE BUFFER LENGTHS
      LDB NXTSK     GET END ADDRESS OF LAST BUFFER LENGTH WORD
DELI1 STA DELIB,I   AND PUT HIGHER IN BUFFER LIST 
      CPB DELIA     CHECK IF FINISHED PACKING MOVE? 
      JMP DELI2     YES, EXIT 
      ISZ DELIA     BUMP "FROM" BUFFER ADDRESS
      ISZ DELIB     BUMP "TO" BUFFER ADDRESS
      LDA DELIA,I   GET NEXT WORD TO MOVE UP
      JMP DELI1     CONTINUE TO NEXT WORD 
      SPC 1 
DELI2 LDA DELIB     MOVE THE NXTSK POINTER
      STA NXTSK     TO ITS NEW VALUE
      JMP DELIN,I   AND EXIT P+1
      SPC 1 
*  ADVANCE CURRENT DISPLAY POINTER
*  CALLED:       JSB ADVSK
*                <RETURN IF UNSUCCESSFUL> 
*                <RETURN IF SUCCESSFUL> 
      SPC 1 
SAVA  NOP           A-REG SAVE FOR BOTTOM SUBROUTINES 
ADVSK NOP           GET CURRENT DISPLAY BUFFER
      STA SAVA      SAVE A-REG FOR RETURN 
      LDA CURSK,I   GET THE LENGTH
      AND O377      MASK TO LENGTH
      SZA           CHECK IF AT END?
      INA           BUMP ONE FOR GOOD MEASURE 
      ADA CURSK     SET NEW DISPLAY BUFFER POINTER
      CPA NXTSK     CHECK IF AT END OF BUFFER LIST? 
      JMP ADVS1     YES, SKIP ADVANCE 
      STA CURSK     FOR NEXT TIME 
      ISZ ADVSK     P+2 EXIT >> MOVED 
ADVS1 LDA SAVA      RESTORE A-REG 
      JMP ADVSK,I   YES, EXIT 
      SPC 1 
      SPC 1 
O77   OCT 77
O377  OCT 377 
      END 
                                                                              