/ PAGE 1 /PDP-8/S MULTIPROCESSING SYSTEM FOR /ONE OR TWO CHARACTER DEVICES /(TY'S AND/OR H.S. READER-PUNCH) /WITH CIRCULAR BUFFERS /FEATURES: /SIMULTANEOUS I/O AND CALCULATIONS. /SEMI-AUTOMATIC EDITING OF INPUT /OPTIONAL AUTOMATIC ECHO. /INITIAL BUFFER ASSIGNMENTS. KBUF=2000 TBUF=2140 PBUF=2160 RBUF=2200 SPARE=2310 RESUM=0 SMP=6101 *0001 NOP /(RESUM=1)-FOR PDP-5 JMP I .+1 NTRPT / /STANDARD PARTS /LOCATION 7347 OF DDT MUST CONTAIN "DEBUG". DEBUG /DDT IN INTERRUPT MODE. BREAK, 7452 /FOR DDT. /CONSTANTS M5, -5 M1, -1 ////// ////// *0020 LF, 212 CR, 215 SPLAT, 243 MCR, -215 RTMSK, 0077 LFMSK, 7700 / PAGE 2 /SYSTEM PARTS. INTSW, 0 /PNZ IF INTERRUPT IS ON. RCOUNT, 0 /NO. OF LINES FROM READER IN BUFFER. KCOUNT, 0 /NO. OF KEYBOARD LINES IN BUFFER. LCHAR, 0 /INTERUPT CHARACTER STORAGE.MCHAR, 0 TESTCK=. TESTCR=. TESTC /BUFFER POINTERS./ KSTART, KBUF KNEXT, KBUF /NEXT OUT OF BUFFER. KLLINE, KBUF KCLEAR, KBUF /-Y KEND, TBUF /LAST+1 TSTART=KEND TNEXT, TBUF /NEXT OUTPUT FROM THE BUFFERS. TCLEAR, TBUF /AVAILABLE TEND, PBUF /START OF NEXT BUFFER INPUT SPACE. PSTART=TEND PNEXT, PBUF PCLEAR, PBUF PEND, RBUF RSTART=PEND RNEXT, RBUF RLLINE, RBUF /POINTS TO THE FIRST 0 IN THIS LINE. RCLEAR, RBUF /NEXT INTO BUFFER. REND, SPARE /BUFFER ASSIGNMENT ORDER: / KBUF-TBUF-PBUF-RBUF-SPARE / PAGE 3 /USER ADDRESSES:: /READER PROCESSOR ADDRESS. RADR, 0 KADR, 0 /PNZ TO ECHO THE INPUT. KCHOSW, 0 RCHOSW, 0 /OUTPUT SUBROUTINE ADDRESSES. OUTCP0, OUTCP OUTCT0, OUTCT GETCX, GETCK OUTCX, OUTCT TERROR, 0 /INPUT SUBROUTINE ADDRESSES. GETCK0, GETCK GETCR0, GETCR / PAGE 4 *177 /ALL USER PROGRAMS JUMP TO THIS PROGRAM WHEN /AWAITING INPUT FROM I/O DEVICES. /IT CHECKS TO SEE WHETHER THE USER HAS TOLD /IT WHERE TO GO WHEN A CARRIAGE RETURN HAS /BEEN RECIEVED. IDLE, CLA CLL ION /FAILSAFE AND DEBUG AID. TAD I RSWCHI /TEST H.S. READER. SNA CLA RFC /START READER TAD KCOUNT /COMPARE NO. OF LINES IN EACH. CIA TAD RCOUNT SMA CLA /CHOSE THE HIGHER. JMP IDLEK IDLER, TAD KADR SNA CLA /ADDRESS GIVEN YET JMP IDLEK TAD KCOUNT /YES SNA SPA CLA /IS THE LINE DONE? JMP IDLEK TAD M1 /YES IOF TAD KCOUNT /COUNT DOWN. DCA KCOUNT ION JMP I KADR /GO PROCESS IT. IDLEK, TAD RADR /TEST HIGH SPEED READER OR QDEV. SNA CLA JMP IDLER /MUST BE KEYBOARD DEPENDENT. TAD RCOUNT SNA SPA CLA /IS A LINE DONE YET? JMP IDLER TAD M1 IOF TAD RCOUNT /COUNT DOWN. DCA RCOUNT ION JMP I RADR /START PROGRAM. //////////// / PAGE 5 /THIS SECTION PROCESSES THE INTERRUPT AND TESTS ALL FLAGS. /IF THE KEYBOARD FLAG WAS ON IT DOUBLE CHECKS THE /READER FLAG TO TRY TO IMPROVE THE TIMEING. NTRPT, DCA SAVAC /SAVE THE MACHINE STATES. RAL DCA SAVLK /SAVE THE LINK. DCA INTSW /TURN OFF THE INTERUPT INDICATOR. RSF /(6011)-FOR HS ., (6411)-FOR QDEV. SKP JMS I RINTI KSF /TEST KEYBOARD. SKP JMS I KINTI SMP /SKIP IF MEMORY PARITY IS OK. HLT /(NOP)-IF NO MEM-PAR CHK ON COMPUTER. PSF /TEST HIGH SPEED PUNCH OR QDEV PRINTER. /(6021)-FOR HS., (6401)-FOR QDEV. SKP JMS I PINTI TSF /TEST TYPEWRITER FLAG. SKP JMS I TINTI NOP /(JMS I USRFLG)- FOR OTHER DEVICE TESTS TAD RTMSK DCA INTSW /TURN ON THE INTERRUPT INDICATOR. /RESTORE THE MAIN PROGRAM AND RESUME IT. TAD SAVLK /RESTORE THE LINK. CLL RAR TAD SAVAC /MACHINE STATE RESTORED. ION /RESTORE INTERRUPT MODE. JMP I RESUM /RESUME THE MAIN PROGRAM. /(5401)-FOR PDP-5. ///// SAVAC, 0 SAVLK, 0 RSWCHI, RSWCH /POINTER TO H.S. READER SWITCH. /DEVICE INTERRUPT HANDLER SUBROUTINE POINTERS. PINTI, PINT TINTI, TINT RINTI, RINT KINTI, KINT USRFLG, 00 /ADDRESS OF USER SUBROUTINE //////// / PAGE 6 /THIS SUBROUTINE TESTS THE INPUT /CHARACTER TO SEE WHETHER IT IS /AN EDIT OR A TERMINATOR CHARACTER. TESTC, 0 TAD M5 DCA TC TAD TX DCA TCP TESTC1, ISZ TCP TAD LCHAR TAD I TCP SNA CLA JMP I TESTC ISZ TESTC ISZ TC JMP TESTC1 JMP I TESTC TX, . MRO, -377 MBA, -337 -215 MBL, -000 MLT, -200 TC, 0 TCP, 0 / PAGE 7 /THESE TWO ROUTINES ARE CALLED FROM THE USER PROGRAM /TO GET EDITED CHARACTERS OUT OF THE BUFFERS. /THEY MAY NOT BE CALLED AFTER A C.R. IS RECIEVED /WITHOUT FIRST GOING TO IDLE. / /THE FIRST RETURN IS FOR C.R. WITH (AC)=0. /THE 2AND IS FOR OTHERS WITH (AC) = OTHER. GETCR, 0 TAD I RNEXT /LOAD AND SAVE CHARACTER. DCA MCHAR /SAVE FOR RETURN. TAD RNEXT CMA ISZ RNEXT TAD REND SZA CLA /AROUND THE END JMP .+3 TAD RSTART DCA RNEXT TAD MCHAR TAD MCR SNA CLA JMP I GETCR ISZ GETCR TAD MCHAR JMP I GETCR //////////// GETCK, 0 TAD I KNEXT DCA MCHAR /SAVE IT. TAD KNEXT CMA ISZ KNEXT TAD KEND SZA CLA JMP .+3 TAD KSTART DCA KNEXT TAD MCHAR TAD MCR SNA CLA JMP I GETCK ISZ GETCK TAD MCHAR JMP I GETCK //////// MCHAR, 0 / PAGE 8 /INPUT FROM KEYBOARD SUBROUTINES. *400 KINT, 0 /KEYBOARD INTERRUPT TAD KCLEAR /TEST YOUR BUFFERS. CMA TAD KNEXT SNA JMP .+5 /TROUBLE. TAD KEND CIA TAD KSTART SNA CLA /FULL? HLT /INPUT IS TOO FAST. /SYSTEM OVERFLOW, USE BIGGER BUFFER. / /RECOVERY IS POSSIBLE AT THIS POINT: /TYPE C.R. OR RUBOUT OR RUBOUT AND HIT CONTINUE. / /READ AND PROCESS THE CHARACTER. KRB /READ THE BUFFER DCA LCHAR TAD LCHAR DCA I KCLEAR /STORE CHARACTER ISZ KCLEAR /INCREMENT POINTERS TAD KCLEAR CIA TAD KEND SZA CLA /TURN OVER BUFFER? JMP .+3 TAD KSTART /YES DCA KCLEAR JMS I TESTCK /TEST CHARACTER JMP KROR JMP KBAR JMP KECR JMP KIGNOR JMP KIGNOR JMP KECHO ////// / PAGE 9 /INPUT CHARACTER PROCESSING. KECR, ISZ KCOUNT /CRLF. TAD KCLEAR DCA KLLINE /SET END OF LINE. KECHO, TAD KCHOSW SNA CLA /TEST FOR ECHO JMP I KINT TAD LCHAR JMS OUTCT JMP I KINT / //////////// /CREVAT EMPTOR: / /NO CHECK FOR ECHO CONFLICT IS MADE; /IF THE PROGRAM COUNTER IS WITHIN /THE SYSTEM/USER SUBROUTINES TO /OUTPUT A CHARACTER THEN IT MIGHT /CREATE AN OUTPUT-INTERMESH FAILURE IF /AN ECHO WERE MADE AT THAT TIME //////// KROR, JMS BACKK1 /BACKUP POINTER TAD KCLEAR /DO NOT GO PAST CIA TAD KLLINE /THE END OF THE LINE. SNA CLA /LINE? JMP I KINT /YES TAD SPLAT /PRINT # FOR EACH DCA LCHAR /RUBOUT CHARACTER USED. KIGNOR, JMS BACKK1 JMP KECHO ////////// KBAR, TAD KLLINE /RESTART THE LINE. DCA KCLEAR JMP KECHO/GO TEST FOR ECHO. //////// BACKK1, 0 /BACKUP THE POINTERS. TAD KCLEAR CIA TAD KLLINE SZA CLA /AT START? JMP .+5 TAD KEND /YES TAD M1 DCA KCLEAR JMP I BACKK1 TAD KCLEAR JMP .-4 //////// / PAGE 10 /OUTPUT VIA TELEPRINTER. TINT, 0 /OUTPUT COMPLETED. TCF /CLEAR FLAG CLA CMA /TEST FOR -1. TAD TSWCH SNA CLA /ANY OUTPUT LEFT? JMP TINTX /NO,LEAVE. TAD I TNEXT /YES,GET IT. TLS /OUTPUT IT. ISZ TNEXT /MOVE POINTERS. CLA CMA TAD TSWCH TINTX, DCA TSWCH /COUNT DOWN. TAD TNEXT CIA TAD TEND SZA CLA /AROUND THE END? JMP I TINT /NO. TAD TSTART /YES DCA TNEXT /RESTART BUFFER JMP I TINT / PAGE 11 OUTCT, 0 DCA NCHAR /SAVE CHARACTER. TAD NCHAR DCA I TCLEAR /STORE CHARACTER. IOF /INTERRUPTS OFF. ISZ TSWCH /COUNT UP. ISZ TCLEAR /MOVE POINTERS. TAD TEND CIA TAD TCLEAR SZA CLA /CHECK LIMITS. JMP .+3 TAD TSTART /AROUND END SO DCA TCLEAR /RESTART POINTERS. / CLA CMA TAD TSWCH SZA CLA /FIRST INTO BUFFER? JMP .+3 /NO. ISZ TSWCH /YES,COUNT AN EXTRA ONE. JMS TINT /PRETEND OUTPUT. TAD INTSW SZA CLA ION TAD TSWCH TAD TMLNGT /TEST LENGTH. SNA CLA /BUFFER FULL? JMP .-3 /YES,WAIT. TAD NCHAR /NO. TAD MCR SZA CLA JMP I OUTCT TAD LF / AUTOMATIC CR-LF. JMP OUTCT+1 NCHAR, 0 /TEMPORARY STORAGE. TSWCH, 0 TMLNGT, TBUF-PBUF-1 /WAIT FOR AT LEAST TWO SPACES. /THE FOLLOWING ROUTINE CAN PERMIT DDT AND DDT-JR. /TO BE USED WITH THIS SYSTEM WITH THE INTERRUPT ON. //LOCATION 4 MUST CONTAIN DEBUG. /IN DDT LOC 7347 MUST CONTAIN DEBUG. //"BREAK" MUST ALSO CONTAIN THE RIGHT ADDRESS. PSWCH DEBUG, TAD TSWCH TAD I .-2 SZA CLA JMP DEBUG /WAIT FOR EMPTY TTY BUFFER. IOF JMP I BREAK / PAGE 13 /HIGH SPEED I/O. /OR A QDEV (2AND TTY VIA LT08). *600 ///// RINT, 0 TAD RCLEAR /CHECK FOR OVERLAY ONTO NEXT OUTPUT. CMA TAD RNEXT SNA /SKIP IF OK SO FAR. JMP .+5 /LEAVE READER SWITCH OFF. TAD REND /TEST BOUNDARIES. CIA TAD RSTART NOP /(SNA CLA)-FOR QDEV DCA RSWCH /NO,TURN ON.;(HLT)-FOR QDEV. RRB DCA LCHAR /SAVE INPUT CHARACTER. TAD LCHAR DCA I RCLEAR /STORE THE INPUT. ISZ RCLEAR TAD RCLEAR CIA TAD REND SZA CLA /END OF BUFFER? JMP .+3 TAD RSTART /YES; RESTART IT. DCA RCLEAR TAD RSWCH SZA CLA /SHOULD WE CONTINUE TO RUN THE READER? RFC /-YES. (NOP)-FOR QDEV. /// JMS I TESTCR JMP RROR /(JMP RIGNOR)-FOR CERTAIN H.S. CASES. JMP RBAR JMP RECR JMP RIGNOR JMP RIGNOR JMP RECHO ////// / PAGE 14 RECR, ISZ RCOUNT /CR. L.F. TAD RCLEAR DCA RLLINE /RESET LINE POINTER RECHO, NOP /(TAD RCHO)-FOR QDEV.SW SNA CLA JMP I RINT TAD LCHAR JMS OUTCP JMP I RINT //////////// RROR, JMS BACKR1 /ELIMINATE TAD RCLEAR CIA TAD RLLINE /ALREADY AT THE END SNA CLA JMP I RINT TAD SPLAT DCA LCHAR RIGNOR, JMS BACKR1 /FORGET THIS CHARACTER. JMP RECHO /GO SEE IF AN ECHO IS DESIRED. /////// RBAR, TAD RLLINE /RESET THIS LINE DCA RCLEAR JMP RECHO ////// BACKR1, 0 /BACKUP READER POINTER TAD RCLEAR CIA TAD RSTART SZA CLA JMP .+5 TAD REND TAD M1 DCA RCLEAR JMP I BACKR1 TAD RCLEAR JMP .-4 RSWCH, 0 /ON-OFF INDICATOR FOR H.S. READER. ////// / PAGE 15 A /OUTPUT VIA H.S. PUNCK PINT, 0 /OUTPUT COMPLETED. PCF CMA CLA TAD PSWCH SNA CLA JMP PINTX /NO. TAD I PNEXT /YES PLS ISZ PNEXT CLA CMA TAD PSWCH PINTX, DCA PSWCH TAD PNEXT CIA TAD PEND SZA CLA /AROUND THE END? JMP I PINT /NO. TAD PSTART /YES DCA PNEXT /RESTART BBUFFER JMP I PINT ////// / PAGE 15 B /H.S. OUTPUT SUBROUTINES. OUTCP, 0 DCA OCHAR TAD OCHAR DCA I PCLEAR /PLACE INTO BUFFER. IOF ISZ PSWCH ISZ PCLEAR /MOVE POINTERS. TAD PEND /CHECK LIMITS. CIA TAD PCLEAR SZA CLA /OVER THE END? JMP .+3 TAD PSTART DCA PCLEAR /YES. CMA /CHECK FOR FIRST CHARACTER. TAD PSWCH SZA CLA JMP .+3 /NOT FIRST. ISZ PSWCH /COUNT AN EXTRA TIME. JMS PINT /INITIATE OUTPUT. TAD INTSW /TEST FOR INTERRUPT. SZA CLA ION TAD PSWCH /TEST FOR FULL BUFFER. TAD PMLNGTH SNA CLA JMP .-3 /YES,WAIT. TAD OCHAR /TEST FOR C.R. TAD MCR SZA CLA JMP I OUTCP TAD LF / AUTOMATIC CR-LF. JMP OUTCP+1 OCHAR, 0 /TEMPORARY STORAGE. PSWCH, 0 PMLNGTH, PBUF-RBUF-1 / PAGE 16 /TEST THE TIME SHARING SYSTEM. *1000 IOF /BE SURE INTERRUPT IS OFF TAD KSTART /INITIALIZE THE DCA KNEXT /BUFFER POINTERS. TAD KSTART DCA KCLEAR TAD KSTART DCA KLLINE TAD TSTART DCA TNEXT TAD TSTART DCA TCLEAR TAD PSTART DCA PCLEAR TAD PSTART DCA PNEXT TAD RSTART DCA RCLEAR TAD RSTART DCA RNEXT TAD RSTART DCA RLLINE DCA RCOUNT /CLEAN UP COUNTERS. DCA KCOUNT /CLEAR ALL POSSIBLE FLAGS. 6764 6772 6042 6402 6022 6102 6012 6032 6412 /INITIALIZE PROCESS ADDRESSES. TAD TK DCA KADR TAD RK DCA RADR /CLEAR ALL SWITCHES. DCA INTSW DCA I .+6 DCA I .+4 DCA I .+2 JMP I START TSWCH /SWITCH LIST PSWCH RSWCH START, IDLE /STARTING ADDRESS. TK, KTEST /PROCESS ADDRESSES RK, RTEST / PAGE 17 /BIT 0 - HOLD THIS DEVICE. /BIT 1 - LOOP 8192 TIMES. /BIT 2 - PLAYBACK. /BITS 3,4,5 - HIGH SPEED DEVICE. /BIT 11 - HOLD ACTIVATED FOR BOTH. / KTEST, LAS DCA XTST TAD GETCK0 /SETUP I/O-POINTERS. DCA GETCX TAD OUTCT0 JMP XTEST RTEST, LAS RTL RAL DCA XTST TAD GETCR0 DCA GETCX TAD OUTCP0 XTEST, DCA OUTCX LAS /READ SW POINTERS. RTR AND XTST SPA CLA JMP .-4 TAD XTST RAL SMA JMP .+3 ISZ XCNT JMP .-1 RAL DCA XTST XGET, JMS I GETCX JMP XOUT DCA XCHAR TAD XTST SMA CLA JMP XGET DCA RCHOSW /TURN OFF ECHOS. DCA KCHOSW TAD XCHAR JMS I OUTCX JMP XGET ////// XOUT, TAD XTST SMA CLA JMP .+3 TAD CR JMS I OUTCX TAD XECH DCA KCHOSW TAD XRECH DCA RCHOSW JMP IDLE /// XTST, 0 XCHAR, 0 XCNT, 0 XECH, 0 XRECH, 0 $