Trailing-Edge
-
PDP-10 Archives
-
decuslib20-02
-
decus/20-0038/bufio.pal
There are 2 other files named bufio.pal in the archive. Click here to see a list.
/***PROGRAM BUFIO.PAL, APRIL 14, 1970****
/PETER LEMKIN
/NATIONAL INSTITUTES OF HEALTH
/BETHESDA, MD. 20014
/
/
/
/INTRODUCTION:
/---------------
/BUFIO.PAL IS A COLLECTION OF THREE PDP8 PAL SUBROUTINES
/WHICH CAN BE USED FOR DOING ASYNCHRONOUS CHARACTER INPUT/OUTPUT.
/THEY ARE ALSO USEFUL FOR DOING ANY WORD ASYNCHROUS QUEUING
/IN OTHER TYPES OF PROGRAMS.
/
/
/MINIMUM HARDWARE:
/----------------
/A PDP8 WITH 4K OR MORE MEMORY. THE 3 ROUTINES
/ALL FIT WITHIN 1 PAGE OF MEMORY. THE QUEUE MAY RESIDE IN
/A DIFFERENT FIELD THAN THE BUFIO ROUTINES.
/
/
/
/DISCUSSION:
/-------------
/THE QUEUE IS OF SIZE TQMAX-TQMIN. IT IS A CIRCULAR QUEUE SIMULATED
/BY WRAPAROUND. THE ALGORITHM WAS TAKEN FROM KNEUTH VOL 1.
/AS LONG AS THE SIZE IS NOT EXCEEDED THE QUEUE WILL BE SIMULATED
/INDEFINATELY.( BY THIS IS MEANT THAT THE AMOUNT OF DATA STORED IN
/THE QUEUE MUST NOT BE GREATER THAN THE SIZE OF THE QUEUE.
/THE CONVENTIONS ARE THAT DATA IS INSERTED INTO THE "FRONT" OF THE
/QUEUE, AND REMOVED FROM THE "REAR" OF THE QUEUE. INITIALLY, THE
/THE EMPTY QUEUE HAS THE "FRONT" EQUAL TO THE "REAR" . THESE TWO
/POINTERS ARE CALLED KFQ AND KRQ RESPECTIVELY.
/
/
/
/
/USAGE:
/------
/1. TO CLEAR OUT THE QUEUE,
/ I.E. SET FRONT=REAR:
/
/ JMS INITQU /GO RESET THE QUEUE
/ NORMAL RETURN /AC=0000
/
/2. TO INSERT A DATA WORD INTO THE REAR OF THE QUEUE:
/ JMS INSRQ /DATA WORD IN THE AC
/ ERROR RETURN /THE QUEUE HAS OVERFLOWED WITH THIS
/ /ATTEMPTED ADDITION. THE QUEUE WAS NOT MODIFIED.
/ NORMAL RETURN /THE DATA WAS SUCCESSFULLY ADDED TO THE REAR OF
/ /THE QUEUE. THE AC=0000
/
/3. TO GET A DATA WORD FROM THE FRONT OF THE QUEUE:
/ JMS GETFQ /GET A DATUM FROM THE QUEUE
/ ERROR RETURN /THE QUEUE WAS EMPTY....
/ NORMAL RETURN /THE DATA IS IN THE AC...
/
/NORMALLY, THE QUEUE IS CLEARED BEFORE IT IS USED.
/
/
/
/
/
/PROGRAM DEFINITIONS:
/STARTING ADDRESS IS WHEREVER YOU WANT IT.
/THE QUEUE MAY BE IN ANY FIELD.
/THE QUEUE SIZE =TQMAX-TQMIN
TQMIN=400
TQMAX=577 /ARBITRARY LIMITS JUST FOR EXAMPLE
QSIZE=TQMAX-TQMIN
DATFLD=00 /THE QUEUE DATA FIELD
INSTFD=00 /THE BUFIO INSTRUCTION FIELD.
/
/
/
/
/
/**************************************************************
/
/
/
/SUBROUTINE INITQU
/IS USED TO INIT THE QUEUE
/RESETS THE QUEUE.
/FRONT <== REAR <== TQMIN.
/CALLING SEQUENCE:
/ JMS INITQU
/ NORMAL RETURN
INITQU, 0
CLA
TAD ITQMIN
DCA KFQ
TAD KFQ
DCA KRQ
JMP I INITQU
/
/
/
/
/
/
/
/
/
/SUBROUTINE INSRQ
/INSERTS A DATA WORD IN THE
/AC--> THE REAR OF THE QUEUE.
/CALLING SEQUENCE1G
/ JMS INSRQ /DATA IN AC
/ ERROR RETURN /QUEUE OVERFLOW
/ NORMAL RETURN /DATA ENTERED
/ /RQ POINTER ADVANCED.
/
INSRQ, 0
DCA TQDAT /SAVE DATA
/A.1 COMPUTE NEW KRQ
TAD ITQMAX
CIA
TAD KRQ
SMA CLA
JMP .+3
ISZ KRQ /KRQ<--KRQ+1
JMP .+3
TAD ITQMIN /KRQ<--TQMIN
DCA KRQ
/A.2 TEST FOR OVERFLOW
TAD KRQ
CIA
TAD KFQ
SNA CLA
JMP I INSRQ /ERROR RETURN
ISZ INSRQ
/A.3 INSERT DATA INTO THE REAR OF THE QUEUE.
TAD TQDAT
CDF DATFLD
DCA I KRQ
CDF INSTFD
JMP I INSRQ /RETURN
/.........................................
/
/SUBROUTINE GETFQ
/GET A DATA WORD FROM THE REAR
/OF THE QUEUE-->AC.
/CALLING SEQUENCE:
/ JMS GETFQ /DATA-->AC
/ ERROR RETURN /QUEUE EMPTY
/ NORMAL RETURN /DATA IN AC.
GETFQ, 0
/A.1 TEST IF KFQ=KRQ
/IF SO QUEUE EMPTY
CLA
TAD KFQ
CIA
TAD KRQ
SNA CLA
JMP I GETFQ /ERROR RETURN
ISZ GETFQ /SET UP NORMAL RETURN.
/A.2 ADVANCE THE KFQ POINTER
CLA
TAD ITQMAX
CIA
TAD KFQ
SMA CLA
JMP .+3 /YES, SET KFQ=TQMIN
ISZ KFQ /NO, SET KFQ=KFQ+1
JMP .+3
TAD ITQMIN
DCA KFQ
/A.3 GET DATA FROM THE QUEUE.
CDF DATFLD
TAD I KFQ
CDF INSTFD
JMP I GETFQ /RETURN
/...CONSTANTS...
ITQMAX, TQMAX
ITQMIN, TQMIN
KRQ, TQMIN
KFQ, TQMIN
TQDAT, 0
/..........................................
$