File TTYM.PA (PAL assembler source file)

Directory of image this file is from
This file as a plain text file

/ TTY DRIVER TASK FOR RTS/8 (V2B-B)		1/17/78
	XLIST	1	/COPYRIGHT ALSO IS IN PARAM.PA
/
/
/
/
/
/
/
/
/	COPYRIGHT  (C)  1974,1975,1976 BY
/
/	DIGITAL EQUIPMENT CORPORATION
/
/
/
/
/
/
/
/
/
/THE INFORMATION IN THIS DOCUMENT IS SUBJECT  TO  CHANGE
/WITHOUT  NOTICE  AND  SHOULD  NOT  BE  CONSTRUED  AS  A
/COMMITMENT BY DIGITAL  EQUIPMENT  CORPORATION.  DIGITAL
/EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR ANY
/ERRORS THAT MAY APPEAR IN THIS DOCUMENT.
/
/THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO
/THE  PURCHASER  UNDER  A  LICENSE  FOR  USE ON A SINGLE
/COMPUTER SYSTEM AND CAN BE COPIED  (WITH  INCLUSION  OF
/DIGITAL'S  COPYRIGHT  NOTICE)  ONLY  FOR  USE  IN  SUCH
/SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN  WRITING
/BY DIGITAL.
/
/DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY
/FOR THE USE OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT
/THAT IS NOT SUPPLIED BY DIGITAL.
/
/
/
/
/
/
/
/
/
/
	XLIST	0	/LIST TASK CODE

	VERS=	4


/
/EDIT HISTORY:
/
/	FEATURES ADDED BY S.R. ON 16-JUL-75:

/1.	CTRL/S, CTRL/Q
/2.	AUTOMATIC CR/LF AFTER TTY WIDTH REACHED (USUALLY
/	 80 COLUMNS)
/3.	RE-ECHOING OF PROMPT LINES ON CTRL/U
/4.	BACKSPACE FACILITY FOR RUBOUT ON SCOPE TERMINALS
/5.	CTRL/U PRINTS "^U"
/6.	TAB OPTIONS
/7.	FILL OPTIONS

/04-AUG-75:	COMBINED IN OLD TTY HANDLER
/25-NOV-75:	ADDED KL8A SUPPORT
/29-DEC-75:	ADDED WIDTH-IGNORING CODE
/23-JUN-76	REVISED KL8A SUPPORT
/25-Sep-76	FIXED WIDTH IGNORING CODE
/		FIXED ^S BUG.
/		FIXED BUG CONCERNING LINES WITH MORE
/		  THAN 4096 CHARS
/07-OCT-76	ADDED TTLOC AND TTFLD
/		ADJUSTED DEVICE CODE FOR MULTIPLE KL8A'S
/		ADDED GENERAL POWER FAIL CODE
/14-DEC-76	FIXED L7 BUG
/
/01-AUG-77:  (LHN)
/	1)  80 COLUMN LPT: CREF LISTING.
/	2)  CHANGED "ASSIGN" TO ALLOW 128 TASKS
/	3)  CHANGED ASSEMBLY PARAMETERS FROM "TTFLD" TO
/	    "TTYFLD" AND "TTLOC" TO "TTYLOC".
/	4)  CHANGED "PDP8E" CONDITIONALS TO "PDP8E+PDP8A".
/02-AUG-77:  (LHN)
/	1)  ADDED CODE TO SHARE THE TTY CONSOLE DEVICE WITH
/	    RTS/8 WHEN FBTTY = 1. (SEE 'FBTTY' IN THE
/	    PARAMETER FILE.)
/03-AUG-77:  (LHN)
/	1)  ADDED CONDITIONAL CODE TO ALLOW TTY HANDLER
/	    TO BUFFER UNSOLISITED INPUT FOR THE MESSAGE
/	    DRIVEN VERSION OF MCR.
/20-SEP-77:  (LHN)
/	1)  MODIFIED FOR USE WITH MAST, SEE BELOW.
/17-JAN-78:  (LHN)
/	1)  INCRESASED "FILL" MAXIMUM FOR DECWRITER.

/ IFNDEF TTYFLD <TTYFLD=0> IFNDEF TTYLOC <TTYLOC=3400> IFNDEF TASK <TASK= TTY> CUR= TTYFLD INIWT= 0 / /%RT TELETYPE PRINTER HANDLER TECHNIQUE / /%TW MOST OF THE MAST TELETYPE TEXT DATA IS STORED / IN THE STANDARD STRIPPED ASCII FORMAT WITH SOME OF / THE CHARACTERS REDEFINED. THE FOLLOWING CHARACTERS / ARE NOT PRINTED, BUT ARE DECODED FOR SPECIAL / FUNCTIONS: / / /%TN /%TN 1) # CAUSES A CARRIAGE RETURN AND LINE FEED /%TN TO BE PRINTED. /%TN /%TN 2) ' CAUSES THE PRINTER TO SPACE OVER TO THE /%TN NEXT TAB STOP. TAB STOPS ARE SOFTWARE /%TN SET TO EVERY 8 COLUMNS. /%TN /%TN 3) & IS A "NULL" CHARACTER AND CAUSES THE /%TN TELETYPE HANDLER TO GET THE NEXT TEXT /%TN CHARACTER. THE NULL CHARACTER GREATLY /%TN SIMPLIFIES THE SELF CHECK ROUTINES /%TN WHEN PLACING DATA IN TEXT STRINGS FOR /%TN OUTPUT. IT ALSO SIMPLIFIES TEXT /%TN FORMATTING IN CHARACTER PAIRS. /%TN
/ IFNDEF TTDEV <TTDEV= 04> IFNZRO TTDEV-4&4000 <TTDEV=KL8ALINE TTDEV> IFNZRO TTDEV&6000 <TTDEV=TTDEV&770%10> IFNDEF KBDEV <KBDEV= TTDEV-1> IFNZRO KBDEV&6000 <KBDEV=KBDEV&770%10> IFNDEF CONSOL <CONSOL=1> /DEFAULT IS CONSOLE IFNDEF VT50 <VT50= 0> /SET TO 1 FOR ^S AND / ^Q FEATURES IFNDEF SCOPE <SCOPE= 0> /SET TO 1 IF TTY CAN DO A / BACKSPACE IFNDEF FILL <FILL= 0> /NUMBER OF FILL CHARACTERS / AFTER CR/LF (0 TO 5) IFNDEF WIDTH <WIDTH= 120> /TTY LINE WIDTH IFNDEF TAB <TAB= 0> /SET TO 1 IF TTY HAS / HARDWARE TABS IFNDEF OLDTTY <OLDTTY=0> /SET TO 1 TO GET OLD / VERSION 1 TTY TASK IFNDEF LSTBOT <LSTBOT=0> /SET TO 1 TO LIST BOTH IFNDEF MCRTTY <MCRTTY=0> /SET TO 1 FOR LOCAL BUFFER /FOR MCR IFNDEF FBTTY <FBTTY=0> /IF NO OS/8 BACKGROUND TO / SHARE TTY WITH IFZERO TTDEV&100 < KSFX= KBDEV^10+6001 KRBX= KBDEV^10+6006 TSFX= TTDEV^10+6001 TCFX= TTDEV^10+6002 TSKX= TTDEV^10+6005 /PDP 8/E & 8/A ONLY TLSX= TTDEV^10+6006 > IFNZRO TTDEV&100 < IFNDEF KL8ADV <KL8ADV= 40> /DEFINE KL8A IO CODE KLNUM=TTDEV&77%4 /KL8A NUMBER IFNZRO KL8A-KLNUM&4000 <KL8LIN,ERROR_> /MUST BE .LE. 'KL8A' KLNUM=KLNUM^2 /DEVICE CODES COME IN PAIRS TLSX= KL8ADV+KLNUM^10+6004 > / WORST CASE ASSEMBLY: FBTTY = 1 / PRWF = DEFINED
/ THE RTS-8 TELETYPE DRIVER PRINTS AND INPUTS LINES OR / CHARACTER STRINGS ON A TELETYPE. THE INPUT AND OUTPUT / DEVICE CODES OF THE TELETYPE ARE SPECIFIED (RESPECIVELY) / BY THE PARAMETERS "KBDEV" AND "TTDEV". IF THE PARAMETER / "CONSOL" IS NOT DEFINED TO BE ZERO, THE TELETYPE IS / ASSUMED TO BE THE CONSOLE TELETYPE AND WILL INVOKE THE / MCR WHENEVER ^C IS TYPED ON IT. /THE FORMAT OF TTY DRIVER MESSAGES ARE: /WORD 1 USED AS EVENT FLAG FOR MESSAGE /WORDS 2-3 USED BY RTS-8 / /WORD 4 FLAGS WORD - FLAGS ARE: / BIT 0 0=PACKED OUTPUT MESSAGE, 1=UNPACKED / BIT 1 0=PUT CRLF AFTER MESSAGE, 1=DO NOT / BIT 2 0=OUTPUT MESSAGE BEGINS AT WORD 6, / 1=OUTPUT MESSAGE POINTED TO BY WORD 6 / BIT 3 0=INPUT IS LINE ORIENTED, WITH EDITING / 1=INPUT IS COUNT ORIENTED W/O EDITING / OR ECHOING / BIT 4 0=PERFORM I/O INDICATED BY OTHER BITS / 1=ASSIGN TTY DRIVER TO TASK IN BITS 5-11 / BITS 5-11 MAX # CHARS IN INPUT BUFFER (0 MEANS 4096) / OR TASK TO ASSIGN DRIVER TO (IF BIT 4=1) / /WORD 5 IF ZERO, NO INPUT - ELSE POINTS AT INPUT / BUFFER /WORD 6 OUTPUT MESSAGE OR POINTER TO MESSAGE /IF TTDEV OR KBDEV HAS FORM 100+LINE, THEN THIS /INDICATES THAT LINE OF KL8A IS TO BE USED.
FIELD CUR%10 *TTYLOC START, IFZERO TTDEV&100 < MEVFLG, CAL FLAGS, SKPINS HALF, TTINT IFZERO PDP8E+PDP8A < /ONLY NEED 1 SKIP CHAIN CAL / ENTRY ON 8/E [VB2-A] SKPINS KBINT > > IFNZRO TTDEV&100 < MEVFLG, CIF 0 /CONNECT ROUTINE IN FIELD 0 FLAGS, IOF HALF, TAD (TTDEV&77^4 /GET KL8A LINE # INTO AC JMS I (KL8ACT /CONNECT TO KL8A LINE KBINT /KEYBOARD INT ADR TTINT /PRINTER INT ADR > IFDEF PWRF < REPLYY, CAL SAVM, SENDW PWRF /SEND DERAIL ADDRESS TO POWER FAIL PWMSG / TASK > TTMSLP, IFNZRO MCRTTY <JMP I (TTYCTR)> TAD ASGNEE /GET ASIGNEE (IF ANY) CAL RECEIV /TAKE THE MESSAGE OFF THE Q MADDR, 0 /GETS ADDRESS OF MESSAGE DCA MSGCDF /FIELD OF MSG IN AC AC7775 TAD MADDR DCA MEVFLG /SAVE MESSAGE EVENT FLAG ADDRESS JMS CDFMSG TAD I MADDR DCA FLAGS /FIRST WORD OF MESSAGE IS FLAGS ISZ MADDR TAD I MADDR DCA REPLYY /2D WORD OF MESSAGE IS ADDRESS FOR ISZ MADDR /REPLY FROM KBD (0 IF NONE WANTED) TAD FLAGS AND (200 SZA CLA /IS THIS AN ASSIGN CALL? JMP ASSIGN /YES - JUST ASSIGN TTY TO SENDER
/ TAD FLAGS RTL SMA CLA /BIT 1000 OF FLAG WORD INDICATES JMP .+3 /IF MESSAGE OR POINTER TO IT FOLLOWS TAD I MADDR DCA MADDR CTRLU2, TAD MADDR DCA SAVM STA DCA HALF /INITIALIZE LEFT/RIGHT SWITCH /LOOP TO UNPACK AND OUTPUT MESSAGE TTOLP, JMS CDFMSG TAD FLAGS SPA CLA /BIT 0 IF FLAG WD TELLS WHETHER JMP ONEPWD /MESSAGE IS PACKED OR UNPACKED ASCII ISZ HALF /PACKED - WHICH HALF? JMP RGHTHF AC7776 DCA HALF TAD I SAVM CLL RTR RTR RTR JMP .+3 RGHTHF, TAD I SAVM ISZ SAVM AND (77 SNA JMP CKCRLF TAD (240 /CONVERT SIXBIT TO ASCII AND (77 TAD (240 OUTCH, JMS I (TTOUTR JMP TTOLP
/ ONEPWD, TAD I SAVM ISZ SAVM SZA JMP OUTCH CKCRLF, TAD FLAGS RAL /BIT 1 OF FLAGS TELLS WHETHER SMA CLA /TO FOLLOW MESSAGE BY A CR/LF CTRLU, JMS I (CRLF TAD REPLYY SZA /IS THERE INPUT REQUIRED? JMP I (EOMESS /YES - GO GET IT EORPLY, CDF CUR /HERE IF NO INPUT OR IF INPUT IS TAD MSGCDF / FINISHED DCA MF TAD MEVFLG CAL /POST THE SENDER'S EVENT FLAG POST /SO HE'LL KNOW HE GOT HIS INPUT MF, 0 JMP TTMSLP /NNNNNNNNNNNNNNNNNNNEXT! ASSIGN, TAD FLAGS AND (0177 /GET TASK NUMBER [V2B-A] DCA ASGNEE /SAVE AS ASSIGNED TASK JMP EORPLY ASGNEE, 0 /TASK ASSIGNMENT, 0 = UNASSIGNED IFNDEF PWRF < REPLYY, 0 /ADDRESS OF REPLY BUFFER (IF ANY) SAVM, 0 >
/LOW-LEVEL TTY OUTPUT CODE TTOUT, 0 AND (177 /STRIP OFF PARITY AND CRAP FOR KL8A DCA CDFMSG CDF CUR TAD I (INCH /GET THE LAST CHAR TYPED ON THE KBD AND (177 /STRIP OFF PARITY TAD (-17 /WAS IT ^O? SNA CLA JMP I TTOUT /YES - DON'T PRINT NOTHIN IFNZRO VT50< CAL WAITE /WAIT FOR XON XOFF > CAL WAITE /WAIT FOR LAST CHAR TO FINISH PTTOEV, TTOEV ISZ TTOEV /SET TTY BUSY (IN ADVANCE) IFNZRO TTDEV&100 <TAD (TTDEV&77^400 > /ADD LINE # TAD CDFMSG /GET CHAR TLSX /OUT WITH IT! CLA /CL(E)A(N) UP JMP I TTOUT TTINT, IFZERO TTDEV&100 < ZBLOCK 2 /USED FOR LINKING INTO SKIP CHAIN IFZERO PDP8E+PDP8A <TSFX> /[V2B-A] IFNZRO PDP8E+PDP8A <TSKX> /CHECK FOR KEYBOARD OR JMP I TTINT / PRINTER IFNZRO CONSOL < /ONLY SHARE CONSOLE [V2B-B] IFNZRO FBTTY < TAD OWNTTY /DO WE OWN THE DEVICE ? SNA CLA JMP I TTINT /NO, LET OS/8 HAVE IT. > > CDF CIF CUR IFNZRO PDP8E+PDP8A < /[V2B-A] TSFX /WHICH ONE? JMP I (KBINT /KEYBOARD > > CIF 0 IFZERO TTDEV&100 <TCFX> TAD PTTOEV POSTDS /POST "TTY COMPLETE" EVENT FLAG TTOEV, 0
/ CDFMSG, 0 MSGCDF, HLT JMP I CDFMSG PAGE
/INPUT REPLY FROM KEYBOARD EOMESS, DCA REPLY /SAVE REPLY BUFFER POINTER IN THIS CDF CUR / PAGE TAD I (FLAGS AND (177 /GET LOW ORDER BITS OF FLAG WORD CIA RPLYL1, DCA INPCNT /SET INPUT CHAR COUNT RPLYLP, CAL WAITE TTIEV /WAIT FOR KEYBOARD STRIKE ISZ I (TTIEV /IMMEDIATELY SET EVENT FLAG AGAIN TAD I (FLAGS JMS I (CDFMSG AND (400 /ARE WE EDITING INPUT? SZA CLA JMP NOEDIT /NO - JUST TAKE IT AS IT COMES TAD INCH AND (177 /STRIP PARITY BIT TAD (200 /NOW FORCE IT BACK IN DCA I REPLY /SAVE CHAR IN REPLY MESSAGE TAD I REPLY AND (177 /AND OUT GOES THE PARITY BIT (AGAIN) SZA TAD (-17 /IGNORE NULL AND ^O SNA JMP RPLYLP TAD (17-176 SMA SZA JMP RUBOUT /X - 176 GT 0 - X MUST BE 177 SZA IAC SZA TAD (175-33 /CHECK FOR 3 FLAVORS OF ALTMODE SNA JMP ALTMOD /ALT MODE IS SPECIAL END-OF-LINE TAD (33-15 / DELIMINTER SNA /IS THE CHAR A CARRIAGE RETURN? JMP CARRET CDF CUR TAD (15-25 SNA CLA /^U? JMP CTU /YES ISZ INPCNT /IS THERE ROOM IN THE BUFFER? JMP .+3 /YES STA JMP RPLYL1 /NO - KEEP IT FULL JMS I (CDFMSG TAD I REPLY /GET THE CHAR JMS I (TTOUTR /ECHO IT NEXTCH, ISZ REPLY /BUMP POINTER JMP RPLYLP /CONTINUE INPCNT, 0
/SPECIAL CHARACTER PROCESSING RUBOUT, CDF CUR TAD I (REPLYY /AC=1 ON ENTRY! CIA TAD REPLY /ARE WE AT THE BEGINNING SPA CLA /OF THE REPLY LINE? JMP RPLYLP /YES IFZERO SCOPE < TAD (334 JMS I (TTOUTR /OUTPUT A BACKSLASH > IFNZRO SCOPE < JMS I (BACK /DO BACKUP > STA TAD REPLY DCA REPLY /BUMP THE POINTER BACK ONE STA TAD INPCNT /REMEMBER TO INCREASE THE COUNT! JMP RPLYL1 ALTMOD, TAD (44 JMS I (TTOUTR /ECHO ALT MODE AS $ STA /PUT SPECIAL DELIMITER IN MESSAGE JMS I (CDFMSG CARRET, DCA I REPLY /SET THE LAST CHAR IN THE MESSAGE JMS I (CRLF JMP I (EORPLY NOEDIT, TAD INCH DCA I REPLY /NO PARITY, NO EDITING, NO ECHOING ISZ INPCNT /IF CONSOL=0, THIS MODE CAN JMP NEXTCH /BE USED TO READ BINARY PAPER TAPES JMP I (EORPLY
IFNDEF PWRF < REPLY, 0 INCH, 0 > CTU, TAD ("^ JMS I (TTOUTR /TYPE "^U" TAD ("U JMS I (TTOUTR TAD I (FLAGS /IF BIT 1 IS ON, WANT TO REPROMPT CLL RTL SNL CLA JMP I (CTRLU JMS I (CRLF JMP I (CTRLU2 IFDEF PWRF < PWMSG, 0 REPLY, 0 INCH, 0 /INPUT CHARACTER DRLADR, . /DERAIL ADDRESS DCA PWMSG /SAVE TASK AC DCA INCH /DESTROY INPUT CHARACTER IFNZRO TTDEV&100 <TAD (TTDEV&77^400> TLSX CLA TAD PWMSG /RESTORE AC JMP I DRLADR /RETURNTO MAINLINE > PAGE
/KEYBOARD INPUT INTERRUPT ROUTINE AND STORAGE KBINT, IFZERO TTDEV&100 < IFZERO PDP8E+PDP8A < /[VB2-A] ZBLOCK 2 /FOR LINKING INTO SKIP CHAIN KSFX JMP I KBINT IFNZRO CONSOL < /ONLY SHARE THE CONSOLE [V2B-B] IFNZRO FBTTY < TAD OWNTTY /DO WE OWN THE DEVICE ? SNA CLA JMP I KBINT /NO, LET OS/8 HAVE IT. > > CDF CIF CUR > KRBX /READ CHARACTER AND CLEAR FLAG > AND (377 /KILL ERROR BITS AND KL8A LINE # DCA I (INCH IFZERO VT50 < IFNZRO CONSOL < TAD I (INCH AND (177 TAD (-3 SNA /CHECK FOR ^C OR ^B TYPED JMP GETMCR /YES, SET "MCR REQUESTED" EVENT FLAG IAC /^B TYPED ? /[V2B-B] SNA CLA JMP CTLB /YES, MAYBE SWITCH TTY OWNERSHIP. > > IFNZRO VT50 < TAD I (INCH AND (177 IFNZRO CONSOL < TAD (-3 SNA /CHECK FOR ^C JMP GETMCR /REQUEST MCR ON CTRL/C IAC /^B TYPED ? /[V2B-B] SNA JMP CTLB /YES, MAYBE SWITCH TTY OWNERSHIP. TAD (2-23 /NOW CHECK FOR CTRL/S >
/ IFZERO CONSOL < TAD (-23 > SNA JMP CTRLS /^S TYPED (XOFF) TAD (23-21 SNA CLA JMP CTRLQ /^Q TYPED (XON) > TAD (TTIEV CTLBXT, CIF 0 POSTDS /POST "KEY STRUCK" EVENT FLAG IFNZRO CONSOL < /ONLY SHARE CONSOLE [V2B-B] CTLB, IFNZRO FBTTY < DCA OWNTTY /GIVE TTY OWNERSHIP TO OS/8, TLSX /SET THE TTY PRINTER FLAG, AND JMP CTLBXT /EXIT W/O POSTING KEYBOARD EF. > IFZERO FBTTY < JMP CTLBXT-1 /TAKE USUAL EXIT. > >
IFNZRO VT50 < XOFF, 0 /0 MEANS CAN PRINT /1 MEANS PRINT INHIBITED DUE TO ^S CTRLS, CIF 0 TAD XOFF SNA /SET XOFF TO 1 ONLY IF 0 CLA IAC DCA XOFF /INHIBIT PRINTING POSTDS /DISMISS, NO FLAGS POSTED CTRLQ, TAD TTIEV SNA CLA ISZ TTIEV CIF 0 TAD (XOFF POSTDS /POST RESUME TYPING EVENT FLAG > IFNZRO CONSOL < GETMCR, TAD TTIEV /^C WILL DELETE ANYTHING WHICH SNA CLA /IS CURRENTLY IN THE TTY BUFFER ISZ TTIEV /BY SETTING THE EVENT FLAG NON-ZERO IFZERO MCRTTY < CDF CIF 0 /THE MCR IS STARTED UP (IF IT IS TAD (MCREF /QUIESCENT) BY POSTING THE MCR EVENT > /FLAG ON PAGE 0 OF FIELD 0. IFNZRO MCRTTY < CIF 0 /IF THIS TASK BUFFERS THE KEYBOARD TAD (LMCREF / FOR MCR, POST THIS LOCAL EF. > POSTDS > TTIEV, 1 /KEYBOARD NOT STRUCK INITIALLY IFNZRO SCOPE < BACK, 0 TAD (10 /BACKSPACE JMS I (TTOUT TAD (240 /PRINT SPACE JMS I (TTOUT TAD (10 /BACKSPACE AGAIN JMS I (TTOUT STA TAD COLCNT SMA /CAN'T RUBOUT PAST COLUMN 1 DCA COLCNT /MOVE BACK ONE COLUMN CLA /CLEAR AC JMP I BACK /RETURN >
/ CRLF, 0 TAD (215 JMS I (TTOUT TAD (212 JMS I (TTOUT TAD (-FILL) SNA JMP .+5 DCA COLCNT JMS I (TTOUT) ISZ COLCNT JMP .-2 DCA COLCNT JMP I CRLF TTOUTR, 0 DCA TEM /SAVE CHAR TAD TEM AND (177 /7-BIT TAD (-15 /IS IT CR? SNA JMP ITSCR /IT'S A CR TAD (15-11 SNA /IS IT A TAB? JMP TABB /YES /*** SPECIAL MOD. FOR NEU-ISENBURG TAD (11-47) /*** SINGLE QUOTE IS A "TAB" SNA /*** JMP TABB /*** GO DO IT. TAD (47-46) /*** & IS A NULL CHARACTER, IGNORE SNA /*** JMP I TTOUTR /*** TAD (46-43) /*** # MEANS CR-LF, GO DO IT SZA CLA /*** JMP DOO /*** JMS CRLF /*** JMP I TTOUTR /*** DOO, ISZ COLCNT /AT END OF COLUMN? SND, IFNZRO WIDTH < TAD COLCNT CLL TAD WITH SZL /AT LAST COLUMN? (DON'T CLEAR AC) JMS NEWL /YES, DO EXTRA CR/LF > CLA /NOTE: THIS CLA COULD BE SKIPPED /AFTER 4096 INCREMENTS OF COLCNT
/ TAD TEM /NO JMS I (TTOUT /ACTUALLY TYPE CHARACTER JMP I TTOUTR /RETURN ITSCR, DCA COLCNT JMP DOO COLCNT, 0 WITH, -WIDTH-1 TEM, 0 NEWL, 0 DCA XTRA JMS I (CRLF TAD XTRA SZA CLA TAD L7 /IF LAST CHAR WAS TAB IAC /SET INIT COL TO 10; OTHERWISE 1 DCA COLCNT JMP I NEWL XTRA, 0 IFNZRO TAB < TABB, TAD COLCNT AND (7770 TAD (10 DCA COLCNT /GO TO NEXT TAB STOP JMP SND L7, 7 > IFZERO TAB < TABB, ISZ COLCNT L7, 7 /JUST IN CASE IT SKIPS IFNZRO WIDTH < TAD COLCNT TAD WITH SNA CLA JMP EO > TAD (" JMS I (TTOUT /SIMULATE WITH SPACES TAD COLCNT AND L7 SZA CLA /UNTIL THE NEXT TAB STOP JMP TABB JMP I TTOUTR EO, JMS I (CRLF JMP I TTOUTR >
/ PAGE XLIST 1 IFNZRO MCRTTY <XLIST 0>
/LOCAL KEYBOARD BUFFER CONTROL IFNZRO MCRTTY < TTYCTR, TAD FAKMSG /IS THE LOCAL BUFFER ACTIVE ? SZA CLA JMP TTYC1 /NO, GO ON. CAL /YES, SEND THE USER'S ENTRY TO MCR. SEND MCR MCRMSG ISZ FAKMSG /NOW MARK THE LOCAL BUFFER EMPTY. TTYC1, CLA IAC /SET THE KEYBOARD EVENT FLAG PENDING DCA I LTTIEV / SO THAT IT CANNOT INTERFERE. CDF CIF 0 /HOLDS INTERRUPTS OFF A MO. TAD I MSGPTR /ANY MESSAGES FOR US ? CIF CDF CUR /RESTORE THE DF AND IF TO HERE. SZA CLA JMP I (TTMSLP+1 /YES, GO PROCESS THE MESSAGE. IOF /NEED INTERRUPTS OFF HERE. TAD (4000+TASK /SET THE "CTRL C" EF WAITING. DCA LMCREF TAD (4000+TASK /SET THE KEYBOARD EF WAITING. DCA I LTTIEV CIF 0 WAITM /NOW WE'LL JUST WAIT FOR SOMETHING EORMWT /TO HAPPEN. AC4000 TAD LMCREF /DID THE USER TYPE A "CTRL C" ? CLA DCA LMCREF SZL JMP TTYC2 /NO, GO ON. JMS I (CRLF /YES, GO DO A CR-LF AND THEN TAD (PRMMSG+3 /SEND THE USER THE "MCR" PROMPT. JMP TTYC3 TTYC2, TAD I LTTIEV /DID THE KEYBOARD EVENT FLAG FIRE ? SZA CLA JMP TTYC1 /NO, GO LOOK FOR A MESSAGE. TAD (FAKMSG+3 /YES, SET UP AND CALL THE TTY CODE. TTYC3, DCA I (MADDR TAD TTYCDF JMP I (MADDR+1 /NOW GO DO IT TO IT.
/ / TAD LOCBUF /THIS CODE WOULD PREVENT SENDING MCR / SMA SZA CLA /A MESSAGE CONTAINONG ONLY A CR-LF / JMP .+6 / TAD PRMMSG+6 / JMS I (TTOUT / / PRMMSG, 0 /"MCR " PROMPT MESSAGE TTYCDF, CDF CUR LTTIEV, TTIEV 2000 /NO CARRIAGE RETURN - LINE FEED. 0 1503 2276 0000 LOCBLN= 40 /LOCAL BUFFER LENGTH. FAKMSG, 1 /FAKE MESSAGE FOR TTY HANDLER, USED LMCREF, 0 / TO GET USER INPUT. MSGPTR, TASK^2+MSGTBL 2000+LOCBLN LOCBUF 0 MCRMSG, ZBLOCK 3 /MCR MESSAGE 400+TASK /FUNCTION AND TASK # FOR OUTPUT. 0 LOCBUF, ZBLOCK LOCBLN > /END OF "TTYCTR" CONDITIONAL. XLIST 1 IFNZRO FBTTY <XLIST 0>
/ IFNZRO FBTTY < TTYWHO, 0 DCA TTYW4 /SAVE THE AC, MAY BE INPUT CHARACTER. CDF 0 TAD OWNTTY /DO WE OWN THE TTY ? CDF CUR SNA CLA JMP TTYW2 /NO, GO WAKE UP OS8SUP TAD TTYW4 /RESTORE THE AC. JMP I TTYWHO /GO FINISH TTY INTERRUPT SERVICE. TTYW2, CDF 0 /CDF OS8SUP" TAD TTYW4 / SNA JMP .+3 DCA I (OSCHAR) IAC TAD (OSTTEV) CIF 0 POSTDS TTYW4, 0 OSTTEV=60 OSKBEV=61 OSCHAR=62 > /END OF "TTYWHO" CONDITIONAL. XLIST 0 $=$=LHN=$=$



Feel free to contact me, David Gesswein djg@pdp8online.com with any questions, comments on the web site, or if you have related equipment, documentation, software etc. you are willing to part with.  I am interested in anything PDP-8 related, computers, peripherals used with them, DEC or third party, or documentation. 

PDP-8 Home Page   PDP-8 Site Map   PDP-8 Site Search