/TMSR - TELETYPE MONITOR SERVICE ROUTINE /PDP-8 - PDP-10 COMUNICATIONS MONITOR /USING A PT08 LINK TO THE DC-10 KSFPT=6401 /SKIP ON PT08 KEYBOARD FLAG KRBPT=6406 /READ IN A CHARACTER FROM PT08 TSFPT=6411 /SKIP ON PT08 PRINTER FLAG TCFPT=6412 /CLEAR PT08 PRINTER FLAG TLSPT=6416 /TYPE OUT A CHARACTER ON PT08 *1 JMP I 2 CH0 /DISPATCH TO INTERRUPT CHAIN *170 START, RUN /ADDRESS OF START OF USER PROGRAM CHAIN, RESTOR /ADDRESS OF USER INTERRUPT SKIP CHAIN DISMIS, RESTOR /ADDRESS OF INTERRUPT DISMISS ROUTINE TYPE8, STOTTO /ADDRESS OF ROUTINE TO TYPE ON PDP-8 CTY SEND10, STOPTO /ADDRESS OF ROUTINE TO SEND A CHAR TO THE PDP-10 CHAR, 0 /CHARACTER TO BE SENT BY SEND10 OR TYPE8 TTYINT, 0 /INTERCEPT FOR TTY CHARACTERS PTYINT, 0 /INTERCEPT FOR PT08 CHARACTERS *7000 INIT, JMS CLRTTB /CLEAR THE TTY BUFFER DCA TTOFLG /CLEAR TTY FLAGS DCA TTYINT /ALWAYS CLEAR TTY INTERCEPT JMP INIT1 /GO INIT PT08 VARIABLES CLRTTB, 0 /RETURN ADDRESS CLA CLL /INIT THE AC TAD TTOIPT /MAKE INPUT AND OUTPUT POINTERS THE SAME DCA TTOOPT / ... DCA TTOCNT /ZERO THE TTY CHARACTER COUNT DCA XFLAG /XON-XOFF FLAG DCA OXFLAG /PREVIOUSLY HONERED XFLAG JMP I CLRTTB /RETURN TO CALLER CH0, DCA SAVAC /SAV THE AC RAL DCA SAVLNK /AND THE LINK KSFPT /ANY CHARACTERS FROM PT08? JMP CHKTTI /NO, GO CHECK TTY PRINTER KRBPT /YES, READ IN CHARACTER DCA CHAR /STORE CHARACTER AWAY TAD PTYINT /IS THE CHARACTER INTERCEPT SET SZA CLA /... JMP I PTYINT /YES, GO TRAP TO USER PROG TAD CHAR /GET CHARACTER AGAIN AND C177 /STRIP OFF PARITY BIT JMP PTCHK /GO CHECK FOR XON AND STX PTRET, JMS STOTTO /STORE CHARACTER IN TTY OUTPUT BUFFER CHKTTI, KSF /TELETYPE INTERRUPT JMP CHKTTO /NO, TRY PT08 RECEIVER KRB /READ THE CHARACTER IN FROM TTY AND C177 /STRIP OFF PARITY BIT DCA CHAR /STORE FOR LATER USE TAD TTYINT /CHECK IF TTY INTERCEPT IS ENABLED SZA CLA / ... JMP I TTYINT /YES, IT IS SO GO INTERCEPT CHAR TAD MCNTRO /GET NEGATIVE CONTROL-O TAD CHAR SNA /IS THIS CHAR A CONTROL-O JMS CLRTTB /YES, GO CLEAR THE TTY OUTPUT BUFFER JMP READTT /YES, GO READ IN THE CHARACTER CHKTTO, TSF /TTY PRINTER INTERRUPT? JMP CHKPTO /NO, TRY PT08 PRINTER TCF /CLEAR FLAG CLA CLL DCA TTOFLG /MARK TTY PRINTER FREE JMS STATTO /GO SEND OUT MORE OUTPUT TO TTY RESTOR, CLA CLL /RESTORE AC AND LINK TAD SAVLNK /LINK RAR TAD SAVAC /AND AC RMF /RESTORE CORRECT DATA FIELD ION /ENABLE INTERRUPTS AGAIN JMP I 0 /RETURN TO INTERRUPTED PROGRAM MCNTRO, -17 /NEGATIVE CONTROL-O C177, 177 STOTTO, 0 /RETURN ADDR CLA CLL /INIT TAD TTOCNT /GET COUNT TAD MTOMAX /SUBTRACT MAXIMUM COUNT VALUE SMA /OVERFLOWED THE BUFFER? JMP I STOTTO /YES, IGNORE THIS CHARACTER TAD XOFFCT /NOW CHECK IF TIME TO SEND XOFF SMA CLA JMP SNDXOF /YES, SEND A XOFF RETXOF, ISZ TTOIPT /COUNT UP INPUT POINTER TAD TTOIPT /GET INPUT POINTER TAD MTTOEN /SUBTRACT END OF BUFFER POINTER SZA CLA /IS THIS THE END OF THE BUFFER JMP .+3 /NO TAD TTOBEG /YES, WRAP AROUND DCA TTOIPT /STORE NEW POINTER TAD CHAR /GET CHARACTER DCA I TTOIPT /STORE IT IN BUFFER ISZ TTOCNT /COUNT UP CHARACTERS IN BUFFER JMS STATTO /START TTY GOING ISZ STOTTO /SKIP RETURN MEANS CHARACTER IN BUFFER OK JMP I STOTTO /RETURN STATTO, 0 /RETURN ADDRESS CLA CLL /INIT TAD TTOFLG /TTY BUSY? SZA CLA JMP I STATTO /YES, WAIT FOR TTY DONE INTERRUPT TAD TTOCNT /GET COUNT OF CHAR IN BUFFER SPA SNA /ANY THERE? JMP I STATTO /NO, JUST RETURN TAD M1 /SUBTRACT 1 DCA TTOCNT /STORE NEW VALUE OF COUNT TAD MXONCT /GET NEGATIVE CHAR LEFT BEFORE XON TAD TTOCNT /IS BUFFER ALMOST EMPTY SPA SNA CLA JMP SNDXON /YES, SEND AN XON (MAYBE) RETXON, ISZ TTOOPT /COUNT UP OUTPUT POINTER TAD TTOOPT /GET POINTER TAD MTTOEN /WRAP AROUND NEEDED SZA CLA JMP .+3 /NO TAD TTOBEG /YES, GET START OF BUFFER DCA TTOOPT /STORE NEW POINTER TAD I TTOOPT /GET CHARACTER TO TYPE TLS /TYPE IT ON PRINTER ISZ TTOFLG /SET TTY BUSY FLAG JMP I STATTO /RETURN SNDXOF, CLA IAC /LOAD 1 DCA XFLAG /MARK THAT A XOFF IS NEEDED JMS STAPTO /START PT08 UP JMP RETXOF /RETURN SNDXON, CLA CMA /LOAD -1 DCA XFLAG /MARK THAT A XON IS NEEDED JMS STAPTO /START UP PT08 TO SEND OUT XON JMP RETXON /RETURN SAVAC, 0 /STORAGE PLACE FOR INTERRUPT AC SAVLNK, 0 /STORAGE PLACE FOR LINK TTOFLG, 0 /TTY PRINTER BUSY FLAG TTOCNT, 0 /COUNT OF CHARACTERS IN TTY BUFFER MTOMAX, -TOBFLN /NEGATIVE LENGTH OF TTY OUTPUT BUFFER XOFFCT, 10 /WHEN BUFFER FILLS TO WITHIN 10 CHAR, SEND XOFF TTOIPT, TTOBUF-1 /TTY OUTPUT INGOING POINTER MTTOEN, -TTOBUF-TOBFLN /MINUS END OF TTY BUFFER TTOBEG, TTOBUF /START OF TTY BUFFER M1, -1 /MINUS 1 CONSTANT MXONCT, -10 /MINUS # OF CHAR LEFT BEFORE SENDING XON TTOOPT, TTOBUF-1 /POINTER FOR OUTGOING TTY CHARACTERS XFLAG, 0 /1 = SEND XOFF, -1 = SEND XON OXFLAG, 0 /NEGATIVE OF LAST XFLAG HONERED *7200 INIT1, JMS CLRPTB /CLEAR THE PT08 BUFFER DCA PTOFLG /CLEAR THE PT08 BUSY FLAG DCA PTYINT /CLEAR INTERCEPT FLAG ION /INIT INTERRUPT SYSTEM RUN, JMP I START CLRPTB, 0 /RETURN ADDRESS TAD PTOIPT /GET INPUTER POINTER DCA PTOOPT /STORE AS NEW OUTPUTER POINTER DCA PTOCNT /ZERO PT08 CHARACTER COUNT DCA PTOSTP /ALLOW CHARACTERS TO GO OVER PT08 DCA LODFLG /CLEAR LOAD IN PROGRESS FLAG DCA DMPFLG /CLEAR DUMP IN PROGRESS FLAG JMP I CLRPTB /RETURN TO CALLER PTCHK, DCA CHAR /STORE THIS CHARACTER TAD CHAR /IS THIS A XOFF TAD MXOFF /SUBTRACT XOFF SNA /IS THIS A XOFF? ISZ PTOSTP /YES, STOP SENDING CHARACTERS TO PT08 TAD MXNPXF /AC = CHAR - XOFF - XON + XOFF SNA /IS THIS A XON JMP STRTPT /YES, START PT08 AGAIN TAD MCEPXN /AC = CHAR - XON - CONTRL-E + XON JMP CHKLOD /GO CHECK FOR LOAD OR DUMP COMMAND STRTPT, DCA PTOSTP /CLEAR STOP FLAG JMS STAPTO /START TYPING ON PT08 AGAIN JMP PTRET /RETURN MXNPXF, -21+23 /MINUS XON PLUS XOFF MXOFF, -23 /MINUS XOFF MCEPXN, -5+21 /MINUS CONTRL-E PLUS XON STOPTO, 0 /RETURN ADDR CLA CLL /CLEAR AC TAD PTOCNT /GET COUNT TAD MPTOMX /SUB MAXIMUM COUNT SMA CLA /DID COUNT OVERFLOW JMP I STOPTO /YES, IGNORE THIS CHARACTER ISZ PTOIPT /COUNT UP INPUT POINTER TAD PTOIPT /GET COUNTER TAD MPTOEN /HAS IT OVERFLOWED SZA CLA JMP .+3 /NO TAD PTOBEG /YES, WRAP IT AROUND DCA PTOIPT TAD CHAR /GET CHAR DCA I PTOIPT /STORE IT IN BUFFER ISZ PTOCNT /COUNT UP CHARACTER COUNT JMS STAPTO /START CHAR TYPING ISZ STOPTO /SKIP RETURN TO SIGNIFY ALL OK JMP I STOPTO /RETURN STAPTO, 0 /RETURN ADR CLA CLL /INIT AC TAD PTOFLG /GET OUTPUT FLAG SZA CLA /IS IT SET IE. TYPE OUT IN PROGRESS JMP I STAPTO /YES, RETURN TAD XFLAG /NEED AN XON OR XOFF TAD OXFLAG /NEGATIVE OF LAST XFLAG HONERED SNA JMP STAPT1 /NO, CHECK IF TYPING IS STOPPED SPA CLA /1=SEND XOFF, -1=SEND XON TAD XONMXF /AC=XON-XOFF TAD XOFF /GET XOFF JMP STAPT2 /GO SET BUSY FLAG STAPT1, TAD PTOSTP /IS TYPING STOPPED SZA CLA JMP I STAPTO /YES, WAIT FOR XON TAD DMPFLG /DUMPING? SZA CLA JMP DUMP /YES, GO SEND OUT NEXT ELEMENT DMPRET, TAD PTOCNT /GET CHARACTER COUNT SPA SNA /ANY THERE? JMP I STAPTO /NO, RETURN TAD M1 /SUBTRACT 1 DCA PTOCNT /STORE NEW VALUE ISZ PTOOPT /INCREMENT PT08 OUTPUTER POINTER TAD PTOOPT /GET POINTER TAD MPTOEN /WRAPPED AROUND? SZA CLA JMP .+3 /NO TAD PTOBEG /YES, INITIALIZE IT DCA PTOOPT /STORE NEW VALUE TAD I PTOOPT /GET CHAR STAPT2, TLSPT /TYPE IT OUT ISZ PTOFLG /MARK THAT PT08 IS BUSY CLA CLL /NEEDED FOR SNDXON AND SNDXOF TAD XFLAG /GET XFLAG CMA IAC /NEGATE IT DCA OXFLAG /STORE FOR FUTURE REFERENCE JMP I STAPTO /RETURN /ROUTINE TO READ AND PROCESS CHARACTERS FROM THE TTY READTT, TAD MCCPCO /AC = CHAR - CONTROL-C SZA CLA /IS THIS CHARACTER A CONTROL-C? JMP RTT1 /NO, GO PROCESS IT NORMALLY ISZ CCFLAG /YES, IS THIS THE FIRST OR SECOND IN A ROW JMP RTT2 /FIRST, GO STORE IN PT08 BUFFER TAD PTOCNT /ARE THERE CHARACTERS IN THE BUFFER SNA CLA /IF NO, DONT CLEAR BUFFER OR SEND EXTRA CONTROL-C JMP RTT0 /NO, CONTROL-C IS IN PDP-10, SEND THIS ONE NORMALLY JMS CLRPTB /CLEAR THE BUFFERS JMS I SEND10 /GO STORE CONTROL-C IN OUTPUT BUFFER NOP /SHOULD NEVER GET HERE RTT0, JMS CLRTTB /CLEAR THE TTY BUFFER RTT1, CLA CLL CMA RAL /LOAD -2 INTO AC DCA CCFLAG /INITIALIZE CONTROL-C COUNTER JMS I TYPE8 /THIS IS THE HALF DUPLEX CODE JMP I DISMIS /CHARACTER BUFFER FULL DONT SEND CHAR TO PT08 RTT2, JMS I SEND10 /NOW SEND CHAR OUT TO PT08 NOP /CHARACTER DIDNT GET INTO PT08 BUFFER JMP I DISMIS /RETURN TO CALLER MCCPCO, -3+17 /MINUS CONTROL-C PLUS CONTROL-O CCFLAG, -2 /CONTROL-C COUNTER XOFF, 23 /XOFF CHARACTER PTOFLG, 0 /PT08 BUSY FLAG PTOCNT, 0 /COUNT OF CHARACTERS IN PT08 BUFFER PTOOPT, PTOBUF-1 /POINTER FOR PT08 OUTGOING CHARACTERS PTOIPT, PTOBUF-1 /POINTER FOR INGOING PT08 CHARACTERS MPTOEN, -PTOBUF-POBFLN /NEG END OF PT08 BUFFER PTOBEG, PTOBUF /START OF PT08 BUFFER MPTOMX, -POBFLN /NEG LENGTH OF PT08 BUFFER PTOSTP, 0 /FLAG TO STOP OUTPUT TO PT08 XONMXF, 21-23 /XON MINUS XOFF *7400 /LOADER ROUTINES DFIELD, 0 /DUMP ROUTINE FIELD POINTER DORG, 0 /DUMP ORIGIN DCOUNT, 0 /NEGATIVE COUNT OF WORDS TO BE DUMPED WORD1, 0 M40, -40 CHKLOD, SNA /IS THIS A DUMP COMMAND? JMP DUMPI /YES, GO START DUMPING TAD MCBPCE /AC = CHAR - CONTRL-E - CONTRL-B + CONTRL-E SNA CLA /IS THIS A TAPE COMMAND JMP LOADI /YES, MARK THAT LOADING IS NOW IN PROGRESS TAD LODFLG /GET LOAD FLAG M140, SZA CLA /IS LOADING IN PROGRESS? (OPCODE = -140) JMP LOAD /YES, GO TO LOADER JMP PTRET /NO, RETURN MCBPCE, -2+5 /MINUS CONTRL-B PLUS CONTRL-E CHKPTO, TSFPT /PT08 PRINTER DONE JMP I CHAIN /NO, DISMISS THIS INTERRUPT TCFPT /YES, CLEAR THE FLAG CLA CLL DCA PTOFLG /MAR PT08 PRINTER AS FREE JMS STAPTO /SEND NEXT CHAR OUT OVER PT08 JMP I DISMIS /GO DISMIS THE INTERRUPT LOADI, ISZ LODFLG /COUNT UP LOADER FLAG JMP LOADI1 /START OF A LOAD DCA LODFLG /ZERO THE LOAD FLAG JMP I DISMIS /END OF LOADING LOADI1, CLA CMA /GET A -1 DCA LODFLG /STORE NEW VALUE TAD CHANGE /ASSUME PAGE 0 UNLESS TOLD OTHERWISE DCA MEMFLD /STORE IN CODE DCA CHKSUM /STORE CURRENT CHKSUM LOAD1, JMS READCH /GO GET NEXT DATA ELEMENT TAD CHAR /GET DATA ELEMENT TAD M140 /SUBTRACT 140 SPA SNA /CHANGE OF MEMORY INSTRUCTION JMP LOAD2 /NO, MUST BE DATA OR ORIGIN AND FMASK /CLEAR UNWANTED BITS RTL /SHIFT DATA TO CORRECT POSITION RAL TAD CHANGE /MAKE NEW CDF INSTRUCTION DCA MEMFLD /STORE JMP LOAD1 /GO GET NEXT DATA WORD LOAD2, SZA CLA /IS THIS THE ORIGIN? JMP LOAD3 /NO JMS READCH /YES, GO GET ANOTHER WORD TAD C100 LOAD3, TAD CHAR /GET THIS DATA ELEMENT TAD M40 /SUBTRACT 40 TO NORMALIZE DCA WORD1 /STORE FOR LATER JMS READCH /GET NEXT DATA WORD TAD WORD1 /GET FIRST WORD CLL RTL /SHIFT IT 6 PLACES RTL RTL TAD CHAR /GET SECOND WORD TAD M40 /SUBTRACT 40 TO NORMALIZE SZL /IS THIS AN ORIGIN WORD JMP MEMFLD /NO, GO STORE THIS WORD DCA ORIGIN /YES, STORE NEW ORIGIN WORD JMP LOAD1 /GO GET NEXT CHAR MEMFLD, 0 /CURRENT MEMORY FIELD BEING LOADED DCA I ORIGIN /STORE THIS WORD CHANGE, CDF /GET BACK TO THIS MEMORY FIELD ISZ ORIGIN /COUNT UP POINTER CLA /COULD OVERFLOW JMP LOAD1 /GO GET NEXT CHAR LODFLG, 0 /LOADING FLAG FMASK, 7 C100, 100 ORIGIN, 0 /ROUTINES TO DUMP CORE DUMPI, ISZ DMPFLG /MARK THAT A DUMP IS IN PROGRESS TAD CDMP1 /DUMMY UP THE PIVOT POINTER DCA DPIVOT DCA DCHKSM /INITIALIZE CHKSUM FOR DUMP JMS STAPTO /START DUMP GOING JMP I DISMIS /RETURN DUMP, JMP I DPIVOT /ENTER CORRECT PART OF DUMP CODE DPIVOT, 0 /DUMP PIVOT AND C77 /STRIP OFF ALL BUT 6 BITS TAD C40 /ENTER HERE WITH DATA TO BE SENT DCA TEMP /STORE THIS DATA ELEMENT TAD DCHKSM /CALCULATE NEW CHKSUM TAD TEMP DCA DCHKSM TAD TEMP /GET CHAR AGAIN JMP STAPT2 /GO TYPE IT OUT DUMP1, TAD DFIELD /GET DATA FIELD AND FMASK /MASK OUT UNWANTED BITS RTL /SHIFT 3 LEFT RAL TAD CHANGE /BUILD THE CDF INSTRUCTION DCA .+1 TEMP, CDF /CHANGE DATA FIELD TAD I DORG /GET DATA WORD CDF /GET BACK TO THIS FIELD JMS DMPWRD /GO DUMP THIS WORD ISZ DORG /INCREMENT ORIGIN POINTER CLA CLL /COULD WRAP AROUND AND SKIP ISZ DCOUNT /COUNT UP DUMP COUNTER JMP DUMP1 /GO SEND OUT NEXT ELEMENT TAD DCHKSM /GET CHECK SUM JMS DMPWRD /SEND IT OUT TO PDP-10 DCA DMPFLG /CLEAR DUMP IN PROGRESS FLAG JMP DMPRET /RETURN TO STAPTO ROUTINE DMPWRD, 0 /ROUTINE TO DUMP ONE WORD DCA WORD2 /SAVE WORD TAD WORD2 /GET WORD RTR RTR RTR /GET LEFT MOST 6 BITS JMS DPIVOT /GO SEND IT OUT TAD WORD2 /GET SECOND CHARACTER JMS DPIVOT /SEND IT OUT JMP I DMPWRD /RETURN WORD2, 0 C77, 77 C40, 40 CDMP1, DUMP1 DMPFLG, 0 DCHKSM, 0 *7600 CHKSUM, 0 /LOADER CHECKSUM VALUE LOAD, JMP I PIVOT /LOAD THIS DATA WORD PIVOT, 0 /JMS PIVOT CAUSES A WAIT FOR NEXT DATA ELEMENT JMP I DISMIS /RETURN READCH, 0 /READ IN NEXT DATA ELEMENT JMS PIVOT /WAIT FOR NEXT CHARACTER TAD CHAR /GET THE DATA ELEMENT TAD CHKSUM /COMPUTE NEW CHECK SUM DCA CHKSUM JMP I READCH /RETURN TO CALLER TTOBUF=. /TTY OUTPUT BUFFER TOBFLN=100 /LENGTH OF TTY OUTPUT BUFFER *TTOBUF+TOBFLN PTOBUF=TTOBUF+TOBFLN /PT08 OUTPUT BUFFER POBFLN=40 /LENGTH OF PT08 BUFFER $