/BUFFERED IPB SUPPORT PROGRAM /SUPPORT PROGRAM FOR THE INTER-PROCESSOR BUFFER ON THE PDP-8/E / LAST EDIT: 15-SEP-1980 05:00:00 CJL / MAY BE ASSEMBLED WITH '/J' SWITCH SET. / DEFINITIONS: BUFFLD= 0020 /BUFFER FIELD DEVCOD= 6620 /DEVICE CODE BASE OF IPB NL7775= CLA CLL CMA RTL /LOAD AC WITH 7775 RRBC= DEVCOD+6 /READ RECEIVE BUFFER, CLEAR RECEIVE FLAG, /SET OPPOSITE SIDE TRANSMIT FLAG RRBS= DEVCOD+4 /READ RECEIVE BUFFER, CLEAR RECEIVE FLAG RSKF= DEVCOD+1 /SKIP ON RECEIVE FLAG RTIE= DEVCOD+2 /SET/CLEAR INTERRUPT ENABLE PER AC[11] TBLS= DEVCOD+16 /LOAD TRANSMIT BUFFER, CLEAR TRANSMIT FLAG TCLF= DEVCOD+12 /CLEAR TRANSMIT BUFFER, CLEAR TRANSMIT FLAG TLBC= DEVCOD+14 /OR AC, TRANSMIT BUFFER TSKF= DEVCOD+11 /SKIP ON TRANSMIT FLAG PAGE 0 /WHERE TO PUT SOME STUFF FOO1, .-. /TIME-WASTING FOO2, .-. /TEMPORARIES SHFTMP, .-. /FOR SHIFT ROUTINE *20 /GET PAST AUTO-INDEX REGISTERS CHECKSU,.-. /LINE CHECKSUM COUNT, .-. /IPB COUNT INBUF, .-. /INPUT TEMPORARY PTR, .-. /IPB POINTER ZEROSW, .-. /ZERO (REQUEST) SWITCH LINPUT, .-. /LINE INPUT ROUTINE RSKF /FLAG UP? JMP .-1 /NO, WAIT FOR IT RRBC /READ IT IN SNA /ZERO? JMP CHKZER /YES DCA INBUF /NO, SAVE IT TAD ZEROSW /ZERO READ IN BEFORE? SZA CLA /SKIP IF NOT JMP RQUEST /JUMP IF SO TAD INBUF /GET LATEST JMP I LINPUT /RETURN CHKZER, TAD ZEROSW /GET SWITCH SNA CLA /ZERO BEFORE? JMP SETZER /NO, SET SWITCH DCA ZEROSW /YES, CLEAR IT JMP I LINPUT /RETURN WITH ONE ZERO SETZER, STA /SET THE DCA ZEROSW /SWITCH JMP LINPUT+1 /KEEP GOING RQUEST, TAD INBUF /GET LATEST SNA /SKIP IF NOT MULTI-ZERO JMP SETZER /TRY TO FIND SLURRED REQUEST IAC /IS IT 7777? SZA /SKIP IF SO JMP OTHER /TRY OTHER COMBINATIONS DCA ZEROSW /CLEAR SWITCH JMP I (NEWREQ) /PROCESS NEW REQUEST TRANS, .-. /LOW LEVEL XMIT ROUTINE TBLS /SEND CHARACTER TSTOUT, TSKF /FLAG UP? JMP TSTIN /NO, WAIT FOR IT JMP I TRANS /RETURN TSTIN, RSKF /INPUT FLAG UP? JMP TSTOUT /NO, TRY OUTPUT CLA /CLEAN UP JMS LINPUT /GET A REQUEST (WE HOPE) SNA /SKIP IF BAD JMP SETZER /COULD BE REQUEST OTHER, /TEMPORARILY BARF, HLT /BARF JMP BARF /MAKE SURE RECV, .-. /RECEIVE ROUTINE JMS SETUP /SETUP COUNT, ETC. CDF BUFFLD /GOTO BUFFER FIELD RECLUP, JMS LINPUT /GET A WORD DCA I PTR /STORE IT TAD I PTR /GET IT BACK TAD CHECKSUM /ADD ON CHECKSUM DCA CHECKSUM /UPDATE IT ISZ PTR /BUMP TO NEXT NOP /JUST IN CASE ISZ COUNT /DONE ALL YET? JMP RECLUP /NO, GO BACK CDF 00 /BACK TO FIELD 0 JMP I RECV /RETURN XMIT, .-. /TRANSMIT ROUTINE JMS SETUP /SETUP COUNT, ETC. CDF BUFFLD /GOTO BUFFER FIELD XMTLUP, TAD I PTR /GET A WORD JMS TRANS /SEND IT TAD CHECKSUM /ADD ON CHECKSUM DCA CHECKSUM /UPDATE IT ISZ PTR /BUMP TO NEXT NOP /JUST IN CASE ISZ COUNT /DONE ALL YET? JMP XMTLUP /NO, GO BACK CDF 00 /BACK TO FIELD 0 JMP I XMIT /RETURN SETUP, .-. /SETUP ROUTINE AND (3700) /JUST PAGE BITS CLL RAL /TURN INTO COUNT CIA /NEGATE FOR WORD COUNT DCA COUNT /SAVE IT DCA PTR /RESET POINTER JMP I SETUP /RETURN SHIFT, .-. /SHIFT THE LIGHTS ROUTINE ISZ SHFTMP /BUMP TO NEXT TAD SHFTMP /GET THE VALUE ISZ FOO1 /WASTE JMP .-1 /SOME TIME ISZ FOO2 /WASTED ENOUGH? JMP .-3 /NO, CONTINUE WASTING AWAY NL7775 /YES, RESET DCA FOO2 /FOR NEXT TIME JMP I SHIFT /RETURN PAGE START, TCLF /CLEAR OUTPUT FLAG RRBS /AND INPUT FLAG CLEAR, NL7775 /SETUP DCA FOO2 /COUNTER DCA ZEROSW /CLEAR ZERO SWITCH IDLE, JMS SHIFT /GO SHIFT THE LIGHTS KSF /FLAG UP? JMP NOFLAG /NO KRS /YES, READ IT IN AND (177) /JUST SEVEN-BIT TAD (-3) /IS IT <^C>? SNA CLA /SKIP IF NOT JMP I (7600) /JUMP IF SO KCC /CLEAR OTHERWISE NOFLAG, RSKF /FLAG UP? JMP IDLE /NO, FORGET IT JMS LINPUT /GET REQUEST SZA CLA /SKIP IF A SLURRED REQUEST JMP IDLE /NOT A REQUEST JMP SETZER /TRY TO MAKE A REQUEST NEWREQ, JMS LINPUT /GET FUNCTION WORD AND (7707) /NO FIELD BITS TAD (BUFFLD) /ADD ON OUR FIELD BITS DCA FUNCT /SAVE IT JMS LINPUT /GET BLOCK NUMBER DCA BLOCK /SAVE IT TAD BLOCK /GET IT BACK MQL /LET'S SEE IT CLA /IN CASE NO MQ DCA CHECKSUM /CLEAR CHECKSUM CDF 00 /MAKE SURE FIELD 0 IN CASE NEW REQUEST! TAD FUNCT /GET FUNCTION AGAIN SPA CLA /READING? JMP WRITE /NO, GO DO WRITE FUNCTION JMS I (DECTAPE) /CALL I/O ROUTINES RPARM /READ ARGUMENT JMP .-2 /TRY AGAIN TAD FUNCT /GET FUNCTION FOR AMOUNT JMS XMIT /TRANSMIT TO OTHER SIDE TAD CHECKSUM /GET CHECKSUM CIA /INVERT IT JMS TRANS /SEND IT JMP CLEAR /WE'RE DONE RPARM, 0 /CORE FUNCT, .-. /FUNCTION WORD BLOCK, .-. /BLOCK NUMBER WRITE, TAD FUNCT /GET FUNCTION DCA FUN2 /SAVE IT TAD BLOCK /GET BLOCK NUMBER DCA BLK2 /SAVE IT TAD FUN2 /GET PAGE COUNT JMS RECV /GET WORDS IN JMS I (DECTAPE) /CALL I/O ROUTINES WPARM /WITH THIS ARGUMENT JMP .-2 /TRY AGAIN JMS LINPUT /GET CHECKSUM TAD CHECKSUM /COMPARE TO OURS SZA /SKIP IF OK JMP BARF /BARF JMP CLEAR /WE'RE DONE WPARM, 0 /CORE FUN2, .-. /FUNCTION BLK2, .-. /BLOCK NUMBER PAGE /P?S NON-SYSTEM TC01/08 DECTAPE HANDLER XLIST 1 IFNDEF OFF IFNDEF ON XLIST ON; IFZERO 1 < FEATURES: 1) SUPPORT OF EIGHT UNITS (0-7). 2) INDIVIDUAL RETENTION OF LATEST BLOCK INFORMATION. 3) THROUGH USE OF 2), CORRECT INITIAL SEARCH DIRECTION. 4) ADJUSTABLE (ONE WORD) CUSTOM OVERSHOOT FACTOR. 5) SPECIAL HANDLING OF TAPE ERRORS: A) DURING SEARCH: 1) SELECT AND REVERSE END ZONE ERRORS ARE IGNORED. 2) ALL OTHER ERRORS ARE RETRIED (SUBJECT TO ERROR COUNTER). B) DURING READ OR WRITE, ALL ERRORS ARE RETRIED (SUBJECT TO ERROR COUNTER). LAST EDIT: 15-SEP-80 04:00:00 CJL MAY BE ASSEMBLED WITH '/J' SWITCH SET. DEFINITIONS: > XLIST ON DTLA= 6766 /LOAD DECTAPE "A" REGISTER DTLB= 6774 /LOAD DECTAPE "B" REGISTER DTRA= 6761 /READ DECTAPE "A" REGISTER DTRB= 6772 /READ DECTAPE "B" REGISTER DTSF= 6771 /SKIP ON DECTAPE DONE OR ERROR FLAG DTXA= 6764 /EXCLUSIVE OR AC WITH DECTAPE "A" REGISTER NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 NL2000= CLA CLL CML RTR /LOAD AC WITH 2000 NL7775= CLA CLL CMA RTL /LOAD AC WITH 7775 PAGE /CAN ACTUALLY BE ANY PAGE! IFNZRO .&177 D7, 7 /CONSTANT 0007 DFUNCT, .-. /FUNCTION WORD DBLK, .-. /BLOCK NUMBER DADDR, .-. /TRANSFER ADDRESS DWC, 7754 /WORD COUNT DCAA, 7755 /CURRENT ADDRESS DOVSHT, 5 /OVERSHOOT FACTOR;MUST BE CUSTOMIZED FOR YOUR /DRIVES;FIVE WILL WORK ON AN ECO'D TU56! D4002, 4002 /CONSTANT 4002 IFNZRO .&177-10 D400, 400 /CONSTANT 0400 DECTAPE,.-. /MAIN ENTRY POINT NL0002 /SET INSTRUCTION FIELD BIT RDF /GET CALLING FIELD TAD DCDF /FORM CIF CDF RETURN INSTRUCTION DCA DTEXIT /SAVE FOR LATER TAD I DECTAPE /GET PARAMETER POINTER DCA GETBLK /SAVE IT ISZ DECTAPE /BUMP TO ERROR RETURN STA /BACKUP TAD I GETBLK /GET TRANSFER ADDRESS DCA DADDR /SAVE FOR LATER ISZ GETBLK /BUMP TO FUNCTION WORD TAD I GETBLK /GET FUNCTION DCA DFUNCT /SAVE IT ISZ GETBLK /BUMP TO BLOCK TAD I GETBLK /GET BLOCK NUMBER DCA DBLK /SAVE IT DCDF, CDF 00 /MUST HAVE FIELD 0 NOW NL7775 /SETUP THE ERROR DCA I D7750 /RETRY COUNTER TAD DFUNCT /GET FUNCTION D200, AND D7 /ISOLATE UNIT BITS TAD TADOLB /NOW HAVE "TAD OLBLK" DCA GETBLK /SAVE IN-LINE NL2000 /GET "DCA"-"TAD" TAD GETBLK /NOW HAVE "DCA OLBLK" DCA PUTBLK /SAVE IN-LINE TAD DBLK /GET DESIRED BLOCK CLL CIA /INVERT GETBLK, .-. /WILL BE "TAD OLBLK" TAD DOVSHT /ADD ON OVERSHOOT FACTOR D7600, CLA+400 /CLEAN UP TAD D7 /SETUP FOR UNIT MASK AND DFUNCT /NOW HAVE UNIT RTR /MOVE UNITS, DIRECTION RTR /TO AC[0-3] TAD D210 /ADD ON SEARCH, GO BITS DTLA /LOAD "A" WITH GO, CORRECT DIRECTION, /UNIT, AND SEARCH FUNCTION BITS DTLB /SEARCH INTO FIELD 0 TAD DBLK /GET DESIRED BLOCK DCA GETBLK /BECOMES NEW OLBLK EVENTUALLY TAD DWC /SEARCH INTO DCA I DCAA / LOCATION JMP DTWAIT /JUMP INTO IT DCONT, SPA CLA /CHANGE DIRECTION? TAD D400 /YES DTXA /CLEAR FLAG (MAYBE CHANGE DIRECTION) DTWAIT, DTSF DTRB /WAIT FOR IT JMP .-1 /TO HAPPEN SMA /ANY ERRORS? JMP DTAPOK /NO CMA RTL /MOVE END TO LINK, RAL /MOVE SELECT TO AC[0] SMA CLA /SELECT ERROR? JMP D7600 /IGNORE IT SZL CLA /END ZONE ERROR? JMP TAPERR /NO, COMPLAIN OF OTHER ERRORS TPERR2, DTRA /GET DIRECTION AND D400 /ISOLATE DIRECTION BIT SNA CLA /SKIP IF REVERSE TAPERR, ISZ I D7750 /TOO MANY ERRORS? JMP D7600 /NO, RESTART IN DIRECTION OF LINK DTRB /GET STATUS JMP DEXCOM /BARF DTAPOK, DTRA /GET DIRECTION D210, AND D400 /JUST DIRECTION BIT D7640, SZA CLA /GOING FORWARD? TAD D4002 /NO, ADD MAGIC REVERSE FUDGE TAD I DWC /GET LATEST BLOCK CIA /INVERT FOR TEST TAD DBLK /GET DESIRED BLOCK SZA /DID WE FIND IT? JMP DCONT /NO, BUT SIGN TELLS WHAT TO DO NEXT! TAD DADDR /YES, GET TRANSFER ADDRESS DCA I DCAA /STORE IN TAD DFUNCT /GET FUNCTION AGAIN DTLB /SET TRANSFER FIELD TAD DFUNCT /GET IT AGAIN RAL /READ/WRITE TO LINK AND D7600 /ISOLATE PAGE BITS / DCA I D7640 /SAVE AS PAGE COUNT DCA DPAGCT /SAVE AS PAGE COUNT RAL /GET READ/WRITE BIT BACK IAC /AC= 1 OR 2 STL RTL /AC= 6 OR 12 RTL /AC=30 OR 50 DNEXT, DTXA /SETUP NEXT BLOCK TO READ OR WRITE TAD D7600 /SETUP DCA I DWC / DTSF DTRB /WAIT FOR TRANSFER JMP .-1 /TO HAPPEN D7750, SPA SNA CLA /ANY ERRORS? JMP TPERR2 /YES ISZ GETBLK /BUMP CURRENT BLOCK / TAD I D7640 /GET PAGE COUNT TAD DPAGCT /GET PAGE COUNT TAD D7600 /COUNT DOWN SNA /DONE? JMP DEXIT /YES / DCA I D7640 /PUT IT BACK DCA DPAGCT /PUT IT BACK JMP DNEXT /GO DO NEXT DEXIT, TAD GETBLK /GET LATEST BLOCK PUTBLK, DCA OLBLK0 /SAVE AS OLBLK ISZ DECTAPE /BUMP TO GOOD RETURN DEXCOM, DCA PUTBLK /SAVE STATUS DTRA /GET GO BIT AND D200 /ISOLATE IT DTXA /TAPE IS NOW STOPPED TAD PUTBLK /RESTORE STATUS DTEXIT, .-. /WILL BE CIF CDF RETURN FIELD JMP I DECTAPE /RETURN TO CALLER OLBLK0, ZBLOCK 10 /FOR REMEMBERING BLOCK NUMBERS TADOLB, TAD OLBLK0 /INSTRUCTION CONSTANT DPAGCT, .-. /PAGE COUNTER;THIS CAN BE OPTIMIZED OUT! $ /THAT'S ALL FOLK!