:ST,S,$TC02,5 
ASMB,R,L,C
      NAM BUF,7 
      HED ***BUFFER MANAGER - 9/74*** 
      ENT BINIT,GBUF,PBUF,IBUF
      EXT ENTR,.RST                                B
A     EQU 0 
B     EQU 1 
N09$  EQU 42B       DEC -9                         B
N04$  EQU 47B       DEC -4                         B
N03$  EQU 50B       DEC -3                          B 
N01$  EQU 52B       DEC -1                         B
P02$  EQU 55B       DEC 2                          B
P03$  EQU 56B       DEC 3                          B
P07$  EQU 62B       DEC 7                          B
*                                                                  B
* THIS PROGRAM WILL ACCEPT A CALL TO INITIATE BUFFER MANAGEMENT 
* 
* IT ALLOWS UP TO EIGHT BUFFER POOLS EACH CONTAINING UP TO         B
* 
* 64 FIXED LENGTH BUFFERS.  THE CALLING SEQUENCE TO REQUEST        B
* 
* INITIATION OF A BUFFER POOL FOLLOWS:                             B
* 
*     JSB BINIT 
*     DEF *+5 
*     DEF BUF       ADDRESS OF BUFFER POOL
*     DEF NUM       NUMBER OF BUFFERS (1-64)                       B
*     DEF LEN       LENGTH OF EACH BUFFER 
*     DEF POOL      NUMBER OF BUFFER POOL (1-8)                    B
* 
* 
.BUF  DEF BUF 
      UNL                                          B
BUF   REP 56
      OCT 0 
      LST                                          B
*              BUF   BSS 56        INITIALIZED TO ZERO BY REP.     B
      OCT 0 
B1    OCT 0         POOL TABLE ADDRESS.            B
B2    OCT 0         NEG. COUNT OF REMAINING BUFFERSB
B3    OCT 0         MASK                           B
      HED ***ROUTINE BINIT*** 
BINIT NOP           ENTRY POINT 
* GET USER PARAMETERS                                              B
* 
      JSB ENTR
      DEF *+5 
ARG1  NOP 
ARG2  NOP 
ARG3  NOP 
ARG4  NOP 
* 
* CHECK THAT POOL # IS WITHIN RANGE 1 TO 8                         B
* GET ADDRESS OF POOL TABLE ENTRY 
* 
      CLA                                          B
      LDB .RST      CLEAR RETURN STATUS.           B
      STA B,I                                      B
      LDA ARG4,I    GET POOL #.                    B
      JSB PRNGE                                    B
      SSA                                          B
      JMP BERR                                     B
* 
* PUT POOL ADDR IN TABLE
* 
      LDA ARG1
      STA B1,I                                     B
      ISZ B1                                       B
* 
* CHECK THAT # OF BUFFERS IS WITHIN RANGE 1-64                     B
* SET TABLE ENTRY                                                  B
* 
      LDA ARG2,I
      SZA           IS IT ZERO                     B
      SSA            OR NEGATIVE?                  B
      JMP BERR      YES, REJECT.                   B
      STA B                                        B
      ADB =D-65     IS IT GREATER THAN 64?         B
      SSB,RSS                                      B
      JMP BERR      YES, REJECT.                   B
      STA B1,I                                     B
      ISZ B1                                       B
* 
* PUT BUFFER LENGTH INTO TABLE
* 
      LDA ARG3,I
      STA B1,I                                     B
* 
* NOW DECLARE ALL BUFFERS FREE
* 
      ISZ B1                                      B 
      LDB B1                                       B
      LDA N04$                                     B
      STA B1        CLEAR THE-
      CLA             NEXT FOUR-
B5    STA B,I          WORDS IN THE-
      INB               TABLE.
      ISZ B1
      JMP B5
      JMP OUT                                      B
* 
* RETURN                                                           B
* 
BERR  LDA N03$      SET REJECT STATUS.             B
      LDB .RST                                     B
      STA B,I                                      B
OUT   JMP BINIT,I   EXIT.                          B
      HED ***ROUTINE GBUF***
* 
* THIS PART OF THE ROUTINE PROCESSES USER REQUESTS FOR A BUFFER.
* THE CALLING SEQUENCE IS AS FOLLOWS
* 
*     JSB GBUF
*     DEF *+3 
*     DEF I         ADDRESS WHERE ARRAY INDEX IS PUT
*     DEF POOLN     POOL #
* 
* ON EXIT I IS SET TO THE RELATIVE WORD # IN THE
* POOL WHERE THE BUFFER STARTS
* 
* FOR ASSEMBLY LANGUAGE PROGRAMS THE ACTUAL BUFFER
* ADDRESS IS IN THE A REG ON EXIT 
* 
GBUF  NOP           ENTRY POINT 
      JSB ENTR
      DEF *+3 
ARG10 NOP 
ARG20 NOP 
* 
* CHECK THAT POOL # IS WITHIN RANGE 1-8                            B
* CALCULATE POOL TABLE ENTRY ADDRESS                               B
* 
      LDA ARG20,I   GET POOL #
      JSB PRNGE                                    B
      SSA                                          B
      JMP GERR      REJECT                         B
* 
* NOW HAVE TABLE ADDRESS SO SEE IF ITS INITIALIZED
* 
      LDB A,I       GET 1ST WORD.                  B
      SZB           INITIALIZED?                   B
      JMP ON        YES 
* 
* NO SO SET INDEX TO -1 CLEAR A AND EXIT
* 
NONE  LDB N01$
      STB ARG10,I 
      CLA 
GOUT  JMP GBUF,I
GERR  LDA N03$      SET REJECT STATUS.             B
      LDB .RST                                     B
      STA B,I                                      B
      CLA                                          B
      JMP GOUT      RETURN.                        B
* 
* POOL IS INITIALIZED SO SEE IF ANY ARE FREE
* 
ON    STA B1        SAVE POOL TABLE ENTRY ADDRESS. B
      INA 
      LDB A,I       GET # OF BUFFERS IN THIS POOL. B
      CMB,INB       MAKE -VE
      STB B2        SAVE
      ADA P02$      INDEX TO ENTRY'S BUSY TABLE.   B
      STA B         ADDR OF ENTRY'S 1ST BUSY WORD. B
* 
* NOW LOOK THROUGH TABLE FOR A FREE ENTRY 
* 
BACK1 CLA,INA       GET MASK
BACK  STA B3        SAVE
      AND B,I       MASK BUFFER INDICATOR.         B
      SZA,RSS       IS BUFFER FREE ?
      JMP GOTIT     YES 
      LDA B3        GET MASK
* 
      ISZ B2        ALL TESTED ?
      RSS           NO
      JMP NONE      YES 
      SSA           GROUP OF 16 TESTED
      JMP B9        YES.                           B
      RAL           NO, MOVE MASK.                 B
      JMP BACK      TRY NEXT BUFF 
* 
* NOW MOVE INDICATORS TO TRY NEXT GROUP OF 16 
* 
B9    INB 
      JMP BACK1 
* 
* NOW HAVE A BUFFER, SET A BUSY BIT FOR IT                         B
* 
GOTIT LDA B3        SET INDICATOR-
      IOR B,I         TO SAY BUFFER BUSY.          B
      STA B,I                                      B
* 
      LDA B2        GET -VE COUNT OF REMAINING BUFFS
      LDB B1        GET TABLE ADDR
      INB           MOVE TO # OF BUFFS
      ADA B,I       GET # OF FREE BUFFER.          B
      INA           GET ARRAY INDEX 
      STA ARG10,I   PUT IN USER CALL
      ADA N01$      CALCULATE                      B
      INB            BUFFER                        B
      MPY B,I                                      B
      ADA B1,I       ADDRESS.                      B
      JMP GOUT      RETURN.                        B
      HED ***ROUTINE PBUF***
* 
* THIS PART OF THE ROUTINE PROCESSES USER REQUESTS
*  TO FREE A BUFFER 
* 
*  CALLING SEQUENCE IS
*     JSB PBUF
*     DEF *+3 
*     DEF I         THE ARRAY INDEX SUPPLIED WHEN BUFF WAS ALLOCATED
*     DEF POOL      THE POOL #
* 
PBUF  NOP 
      JSB ENTR
      DEF *+3 
ARG8  NOP 
ARG9  NOP 
      LDA ARG9,I    GET POOL #
      JSB PRNGE                                    B
      SSA                                          B
      JMP PERR                                     B
* 
      LDA ARG8,I    GET ARRAY INDEX 
      ADA N01$                                     B
* 
* NOW FIND WHICH GROUP OF 16 THE BUFFER IS IN 
* 
      CLB 
      DIV =D16
* 
* A REG CONTAINS GROUP OF 16 (0-3)
* B REG CONTAINS OFFSET WITHIN GROUP(0-15)
* 
      ADA B1        ADD TABLE ADDR
      ADA P03$      POINT AT CORRECT BUSY WORD.    B
      STA B3        SAVE ADDR 
      CMB,INB       NEGATE OFFSET 
      CCA           SET A-REGISTER TO              B
      ERA,CLE,ELA    1777776B 
B50   SZB,RSS        POINTING AT CORRECT BIT? 
      JMP POUT      YES.                           B
* 
      RAL 
      INB 
      JMP B50      GO BACK
*                                                                  B
* RETURN                                                           B
*                                                                  B
PERR  LDA N03$      SET REJECT STATUS.             B
      LDB .RST                                     B
      STA B,I                                      B
      JMP OUT9      EXIT. 
POUT  AND B3,I      FREE BUFFER.                   B
      STA B3,I
OUT9  JMP PBUF,I    EXIT.                          B
      HED ***ROUTINE IBUF***
* 
* THIS ROUTINE IS CALLED TO FIND OUT HOW MANY BUFFERS IN A POOL 
* ARE CURRENTLY BEING USED
* CALLING SEQUENCE
*     JSB IBUF
*     DEF *+3 
*     DEF I         # OF BUFFS IN USE RETURNED IN I 
*     DEF POOL      POOL NUMBER 
* 
IBUF  NOP 
      JSB ENTR
      DEF *+3 
ARG   NOP 
RARG  NOP 
* 
* CHECK THAT POOL # IS IN RANGE 1-8                                B
* GET POOL TABLE ENTRY ADDRESS                                     B
* 
      LDA RARG,I
      JSB PRNGE                                    B
      SSA                                          B
      JMP IERR      REJECT
* 
* OFFSET TO BUSY WORDS                                             B
* 
      ADA P03$                                     B
      STA B2        SAVE IT.                       B
* 
* INITIALIZE COUNTS                                                B
* 
      CLB 
      STB B1
      LDB N04$                                     B
*                                                                  B
* SET MASK IN A REG AND B3
*                                                                  B
      CLA,CCE 
      ERA 
B12   RAL 
      STA B3
      AND B2,I      IS THIS  BUFFER-
      SZA             BUSY ?
      ISZ B1        YES INCR COUNT
* 
      LDA B3
      SSA,RSS 
      JMP B12 
      ISZ B2        POINT AT NEXT WORD
      INB,SZB       ALL DONE
      JMP B12       NO
* 
* NOW PUT COUNT IN USER PARAM 
* 
      LDA B1
      STA ARG,I 
IR9   JMP IBUF,I    RETURN
* 
IERR  LDA N03$      SET ERROR RETURN STATUS 
      LDB .RST
      STA B,I 
      JMP IR9 
      HED ***ROUTINE PRNGE*** 
* SUBROUTINE TO CHECK THAT POOL # IS IN                            B
*  RANGE 1-8 AND CALCULATE POOL TABLE ENTRY                        B
*  ADDRESS.                                                        B
*                                                                  B
*  ENTRY: (A) = USER SUPPLIED POOL #                               B
*                                                                  B
*  EXIT : (A) = ADDRESS OF POOL TABLE ENTRY                        B
*                IF # IN RANGE,                                    B
*             = -1, OTHERWISE.                                     B
*         (B1)= ADDRESS OF POOL TABLE ENTRY                        B
*                IF # IN RANGE,                                    B
*             = 0, OTHERWISE.                                      B
*                                                                  B
PRNGE NOP           ENTRY                          B
      SZA           IS IT ZERO                     B
      SSA            OR NEGATIVE?                  B
      JMP PRERR     YES.                           B
      STA B                                        B
      ADB N09$      IS IT GREATER THAN 8?          B
      SSB,RSS                                      B
      JMP PRERR     YES.                           B
      ADA N01$      NO, CALCULATE ENTRY ADDRESS.   B
      MPY P07$                                     B
      ADA .BUF                                     B
      STA B1        SAVE IT.                       B
RET   JMP PRNGE,I   RETURN.                        B
PRERR CCA                                          B
      CLB                                          B
      STB B1                                       B
      JMP RET                                      B
      END IBUF
::
:CO MOUNT TAPE #6, TYPE :GO 
:PA 
                                                                                                                                