: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