/OS/8 TTY HANDLER FOR ETOS /ETTT VERSION 1.16 TUESDAY 31-AUGUST-1976 11:18 AM /RECONSTRUCTION OF ETTT V1.015 4:10 PM 7/29/75 /MODIFIED FOR ETOS BY DOUG BERGENGREN, EDUCOMP CORP. /11 SUPER TTY HANDLER FOR OS/8 / / / / / / / / / /COPYRIGHT (C) 1974 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. / / / / / / / / / / /S.W.,S.R.,H.J.,R.L. /TWO-PAGE TELETYPE HANDLER FOR OS/8 V3. /ON INPUT, RECOGNIZES ^Z, ^C, ^U, RUBOUT: /^Z MEANS END OF INPUT, INSERT ^Z IN BUFFER, / AND PAD WITH ZEROES. /^C MEANS ABORT JOB, RETURN TO OS/8 VIA LOC 7600 / TO SAVE CORE AND PRINT "^C". /^U MEANS DELETE THE LAST LINE AND ALLOW OPERATOR TO / RETYPE IT. /RUBOUT MEANS DELETE LAST CHARACTER ON LINE. ECHOES / EITHER AS THE CHARACTER RUBBED OUT OR AS A / BACKSLASH. IF NO CHARACTERS REMAIN TO BE RUBBED / OUT, THE RUBOUT IS IGNORED. /LOWER CASE / LOWER CASE CHARACTERS ARE CONVERTED TO UPPER CASE. /CARRIAGE RETURN / TERMINATES THE INPUT LINE. THERE IS ONLY ONE / INPUT LINE PER BUFFER. EACH LINE STARTS AT THE / BEGINNING OF THE BUFFER, IS TERMINATED BY A / CR/LF, AND IS FOLLOWED BY NULLS TO THE END OF / THE BUFFER. THE INPUT CHARACTERS ARE PACKED / ONE-FOR-ONE IN BITS 4-11 IN EACH WORD OF THE / INPUT BUFFER. /ON OUTPUT RECOGNIZES ^C^C, ^O, ^S, ^Q FROM KEYBOARD: /^C^C CAUSES JOB TO ABORT, RETURN TO OS/8 VIA / LOCATION 7600 TO SAVE CORE AND PRINT "^C". /^O CAUSES OUTPUT BY THE HANDLER TO CEASE. / TYPING ANOTHER ^O RESUMES OUTPUT. /^S CAUSES THE HANDLER TO SUSPEND OUTPUT TO TERMINAL. /^Q RESUMES HANDLER OUTPUT. / ^S AND ^Q ARE IGNORED IN OTHER CASES. /WHENEVER PRINTING CHARACTERS (EITHER ON OUTPUT /OR WHEN ECHOING): / IGNORES NULLS, / FLAGS LC WITH AN APOSTROPHE, / HANDLES TABS CORRECTLY (SEVERAL WAYS), / PRINTS ESCAPE AS "$", / PRINTS CONTROL CHARACTERS AS "^K", / TREATS ^Z AS NONPRINTING END OF BUFFER, / DOES AUTOMATIC CR/LF AT END OF LINE WIDTH. /BUILD YOUR OWN TELETYPE HANDLER: /THE FOLLOWING CONDITIONALS ALLOW YOU TO INCLUDE OPTIONAL /FEATURES. YOU MAY INCLUDE AS MANY OR AS FEW AS YOU /DESIRE. /SYMBOL FEATURES /CTRL PRINT CONTROL CHARS AS ^K /RUB PRINT CHAR RUBBED OUT ON RUBOUTS /SIMTAB SIMULATE TABS AS SPACES /SLOTAB PUT OUT 2 RUBOUTS AFTER A TAB /ESC PRINT ESCAPE AS $ /FLAGLC FLAG LOWER CASE CHARS ON OUTPUT /CNVLC CONVERT LOWER CASE ON INPUT TO UPPER CASE /ALTMOD CONVERT ALTMODES (175,176) TO ESCAPE (33) /WIDTH SET CARRIAGE WIDTH IFNDEF CTRL /SET TO 1 TO ECHO CONTROL CHARS AS ^K /SET TO 0 TO ACCEPT CONTROL CHARACTERS AND PUT /IN BUFFER, BUT NOT ECHO THEM (EXCEPT THE USUAL) IFNDEF RUB /SET TO 0 TO ECHO EACH RUBOUT BY TYPING A BACK /SLASH /SET TO 1 TO ECHO CHARS RUBBED OUT UPON RUB-OUT IFNDEF SIMTAB /SET TO 1 TO SIMULATE TABS AS THE CORRECT NUMBER /OF SPACES /SET TO 0 TO TYPE TABS AS TABS IFNDEF SLOTAB /SET TO 1 TO TYPE 2 RUBOUTS AFTER A TAB IFNDEF ALTMOD /SET TO 1 TO CONVERT 175,176 TO 33 IFNDEF ESC /SET TO 1 TO ECHO ESCAPE AS $ /SET TO 0 TO ECHO ESCAPE AS A CONTROL CHAR (^[) IFNDEF FLAGLC /SET TO 1 TO FLAG LOWER CASE CHARS ON OUTPUT /THIS IS FOR PEOPLE NOT PRIVILEDGED ENOUGH TO /OWN A LOWER CASE TERMINAL /SET TO 0 TO PRINT LOWER CASE CHARS AS IS IFNDEF CNVLC /SET TO 1 TO CONVERT LOWER CASE CHARS ON INPUT TO /UPPER CASE /SET TO 0 TO ACCEPT INPUTTED LOWER CASE CHARS AS IS /THIS IS FOR PEOPLE WHO ARE HANDICAPPED BY A LOWER /CASE TERMINAL AND ONLY WANT UPPER CASE IFNDEF WIDTH /SET TO THE WIDTH OF THE TERMINAL'S CARRIAGE /SOME OF THE ABOVE OPTIONS SHOULD ACTUALLY BE IMPLEMENTED /IN SUCH A MANNER THAT THE USER CAN CHANGE THEM VIA AN /ALTER COMMAND RATHER THAN HAVE TO REASSEMBLE. INDVC=03 OUTDVC=04 KSF=10^INDVC+6001 KCC=10^INDVC+6002 KRS=10^INDVC+6004 KRB=KCC KRS TSF=10^OUTDVC+6001 TCF=10^OUTDVC+6002 TPC=10^OUTDVC+6004 TLS=TCF TPC TTYVERSION="A&77 L0001=CLA IAC L0002=CLA CLL CML RTL L0003=CLA CLL IAC CML RAL L0004=CLA CLL IAC RTL L0006=CLA CLL IAC CML RTL L0100=CLA IAC BSW L2000=CLA CLL CML RTR L3777=CLA CLL CMA RAR L4000=CLA CLL CML RAR L5777=CLA CLL CMA RTR L6000=CLA CLL IAC CML RTR L7775=CLA CLL CMA RTL L7776=CLA CLL CMA RAL L7777=CLA CMA GETSTAT=6037 SETSTAT=6047 *0 -1 DEVICE ETTT;DEVICE TTY;0;TTY&177+4000;ZBLOCK 2 /CROSS PAGE LINKAGE: /THIS CODE MUST BE ABLE TO LOAD INTO ANY TWO PAGES OF CORE. /THE ENTRY POINT IS AT THE NEXT LOCATION TO THE END OF THE /FIRST PAGE. AT THE END OF THE FIRST PAGE WE JMS TO PLINK. /THIS LEAVES THE ADDRESS OF THE FIRST LOCATION OF THE NEXT /PAGE IN LOCATION 'PLINK'. THIS JUST HAPPENS TO BE THE /ADDRESS OF SUBROUTINE IO. /IF IO IS CALLED WITH A 0 AC, IT IS A CALL TO / INPUT A CHARACTER. /IF IO IS CALLED WITH A NON-ZERO AC, IT IS A CALL TO / PRINT A CHARACTER. /WHEN PRINTING: / RETURN 1 MEANS IO SAW A ^Z. / RETURN 2 IS THE NORMAL RETURN. /WHEN INPUTTING: / RETURN 1 MEANS IO GOT A RUBOUT. / RETURN 2 IS THE NORMAL RETURN. THE AC / CONTAINS THE INPUTTED CHARACTER. / RETURN 3 MEANS IO GOT A ^U. / RETURN 4 MEANS IO GOT A CR. *200 PLINK, 0 /GETS ADDRESS OF TTYPCH AND TTYGCH (START OF NEXT PAGE) STL CLA RAR /4000 TAD I TTY /RETRIEVE FUNCTION WORD, BUT PUT R/W BIT IN LINK AND L3700 /EXTRACT NUMBER OF DOUBLE-WORDS TO TRANSFER CMA /GET -COUNT-1 DCA BUFSIZ /STORE AWAY RDF /FIND OUT THE USER'S DATA FIELD TAD CIFCDF /FORM OUR EXIT CIF CDF DCA TTYXIT /STORE AWAY FOR EXIT ROUTINE TAD TTY70 /GET FUNCTION WORD L776, AND I TTY /ISOLATE FIELD OF BUFFER TAD TTYCDF /FORM CDF TO FIELD OF BUFFER DCA TTCDBF /STORE WHERE IT WILL BE USEFUL /AT SAME TIME, INITIALIZE TTYEOF ISZ TTY /POINT TO BUFFER ADDRESS TAD I TTY /AND GET IT DCA BUFSTRT /AND SAVE IT ISZ TTY /POINT TO BLOCK # TAD I TTY /GET BLOCK # ISZ TTY /POINT TO ERROR RETURN SZA CLA /IS IT BLOCK 0? JMP TTCDBF /NO: SKIP INITIALIZATION JMS PKS /MAKE POINTER TO KEYBOARD STATUS 4374 /KSTAT: ECHO,ENABLE ^C,^O,^Q,^S,^V 4000 /BREAK MASK: BREAK ON ALL CHARS 7600 /^C RESTART ADDRESS PKS, 0 /POINTER TO KEYBOARD STATUS TAD PKS /GET POINTER SETSTAT /SET STATUS. NOTE: THIS IS ONLY DONE /ONCE & CURRENTLY IT IS NOT UNDONE AT END. SHIFT, /OUTPUT SHIFT REGISTER TTCDBF, HLT /CDF BUFFER FIELD JMP TTYKLG TTYLP, SNL CLA /LINK=1 MEANS OUTPUT JMP TTYGET /INPUT IS FROM TTY: /LINK MUST BE SET FIRST TIME THROUGH HERE. /IT ACTS AS A GUARD BIT IN THE SHIFT REGISTER ROTL, RTL RTL SPA /DO WE HAVE 8 BITS SHIFTED IN? JMP TELP DCA SHIFT /SAVE SHIFT REGISTER TAD I BUFSTRT JMS PUNCH /PRINT A CHARACTER TAD I BUFSTRT ISZ BUFSTRT /BUMP INPUT POINTER TT7400, 7400 /PROTECT ISZ AND TT7400 CLL RAL TAD SHIFT /SHIFT HIGH ORDER 4 BITS INTO JMP ROTL /SHIFT REGISTER TELP, JMS PUNCH /PRINT 3RD CHARACTER OF DOUBLE-WORD STL /***KLUDGE TTYKLG, ISZ BUFSIZ /DONE? JMP TTYLP /NOT YET NORM, ISZ TTY /POINT TO NORMAL RETURN TTYXIT, HLT /RETURN TO USER'S FIELD JMP I TTY /RETURN TO USER PUNCH, 0 /NEVER CALL TTYPCH WITH ZERO AC AND L177 /ISOLATE CHARACTER SNA /IS THE CHAR A NULL? JMP I PUNCH /YES: IGNORE IT JMS I PLINK /CALL TTYPCH JMP NORM /GO AWAY, WE SAW A ^Z JMP I PUNCH /RETURN CTRLU, TTYGET, TAD BUFSTRT DCA TTYCA /POINT TO START OF BUFFER TAD BUFSIZ CLL RAL /CONVERT DOUBLE-WORDS TO WORDS DCAWC, DCA TTYWC /SET SIZE OF BUFFER NEXT, JMS I PLINK /GET NEXT CHAR JMP GOTCHR /GOT AN ORDINARY CHARACTER JMP RUBOUT /GOT A RUBOUT JMP CTRLU /GOT A ^U ISZ TTY /GOT A CR: POINT TO NORMAL RETURN TAD L215 /PUT CR IN BUFFER DCA I TTYCA TAD L212 /NOW PUT LF IN BUFFER CTRLZ, ZERO, ISZ TTYCA /POINT TO NEXT WORD IN BUFFER NOP /TO PROTECT THE ISZ ISZ TTYWC /END OF BUFFER? JMP .+3 /NO CLA /YES: TAKE SOFT ERROR JMP TTYXIT /OR NORMAL RETURN DCA I TTYCA /ZERO BUFFER TO END JMP ZERO GOTCHR, DCA I TTYCA /STORE CHAR IN BUFFER TAD I TTYCA /GET IT BACK AND L177 JMS I PLINK /ECHO IT (CAN'T BE ZERO) JMP CTRLZ /IT WAS ^Z ISZ TTYCA /POINT TO NEXT WORD IN BUFFER L212, 212 /CONSTANT TO PROTECT THE ISZ ISZ TTYWC /END OF BUFFER? JMP NEXT /NO: GET NEXT CHAR JMP NORM /TAKE NORMAL RETURN TTY70, 70 L177, 177 L215, 215 L3700, 3700 CIFCDF, CIF CDF 0 TTYCDF, CDF 0 TTYCA, 0 TTYWC, 0 BUFSIZ, 0 BUFSTRT, 0 /DON'T DO YET: /RUBOUT, AND TTYWC /177 IN AC / SNA CLA / JMP CTRLU RUBOUT, TAD TTYCA CIA TAD BUFSTRT SNA CLA /ARE WE AT BEGIN OF BUFFER? JMP CTRLU /YES STA TAD TTYCA DCA TTYCA IFZERO RUB < LSLASH, "\ TAD LSLASH /PRINT A BACK SLASH FOR EACH RUBBED OUT CHAR > IFNZRO RUB /PRINT CHAR JUST DELETED JMS PUNCH STA TAD TTYWC JMP DCAWC /BUMP BACK WC AND GET ANOTHER CHAR IFNZRO 376-.&4000 *376 TTY, TTYVERSION /ENTRY POINT TO HANDLER JMS PLINK /SET UP CROSS PAGE LINKAGE PAGE IO, 0 IFNZRO IO&177 /IO MUST BE AT TOP OF PAGE SNA JMP GCH DCA CHAR TAD CHAR TAD (-11 IFNZRO SIMTAB!SLOTAB < SNA JMP TAB > CLL TAD (-16+11 SNL JMP SPCHR IFNZRO ESC < TAD (-33+16 SNA JMP ESCAPE IAC > IFZERO ESC < TAD (-32+16 > IFNZRO CTRL < SNA JMP RET1 TAD (-37+32 SPA SNA CLA JMP CTX > IFZERO CTRL < SNA CLA JMP RET1 > IFNZRO FLAGLC < TAD CHAR IFDEF M140 < TAD M140 > IFNDEF M140 < TAD (-140 > SPA CLA JMP IMAGE TAD ("'&177 TAD EFLAG SMA SZA JMS TYPE TAD M40 > IMAGE, TAD CHAR PRINT, JMS TYPE RET2, ISZ IO RET1, DCA EFLAG JMP I IO LINSIZ, -WIDTH COLCNT, -WIDTH EFLAG, 0 CHAR, 0 SPCHR, L7777 TAD LINSIZ /RESET COLUMN COUNT IFZERO COLCNT&177-44 DCA COLCNT JMP IMAGE IFNZRO ESC < ESCAPE, IFDEF KX244 < TAD KX244 > IFNDEF KX244 < TAD ("$&177 > JMP PRINT > IFNZRO SIMTAB < TAB, DCA EFLAG TABLP, TAD KX240 JMS TYPE IFNZRO -WIDTH&7 TAD COLCNT AND (7 M140, KX240, SZA CLA JMP TABLP JMP RET2 > IFNZRO SLOTAB < TAB, TAD CHAR JMS TYPE TAD (177 TLS TLS M140, SZA CLA /CAN'T SKIP /BUG: SLOTAB & HARDWARE TAB DON'T COUNT COLUMNS CORRECTLY JMP RET2 > IFNZRO CTRL < CTX, DCA EFLAG TAD ("^-200 JMS TYPE L0100 JMP IMAGE > GCH, L4000 DCA EFLAG GCH2, KRB AND (177 SZA TAD (-17 SNA JMP GCH2 TAD (-15+17 SNA JMP CR TAD (-25+15 SNA JMP CTU TAD (-3+25 SNA JMP CTC TAD (-177+3 SNA JMP RET2 IFNZRO ALTMOD < TAD (-175+177 SPA JMP .+3 CLA TAD (33-175 > IFNZRO CNVLC < IFNZRO ALTMOD < TAD (-140+175 > IFZERO ALTMOD < TAD (-140+177 > SMA TAD M40 TAD (200+140 > IFZERO CNVLC < IFNZRO ALTMOD < TAD (200+175 > IFZERO ALTMOD < TAD (200+177 > > JMP I IO CR, ISZ IO /TAKE RETURN 4 CTU, ISZ IO /TAKE RETURN 3 TAD LINSIZ DCA COLCNT JMP RET2 CTC, CDF 0 JMP I K7600 TYPE, 0 AND (177 TAD EFLAG SMA TLS K7600, CLA 400 ISZ COLCNT JMP I TYPE TAD (15 TLS TAD (12-15 TLS M40, SMA SZA CLA TAD LINSIZ DCA COLCNT JMP I TYPE PAGE IFDEF TEST < *600 /TEST ROUTINE FOR KL8E HANDLER GO, JMS I (TTY /CALL HANDLER 0600 /READ SIX PAGES 1000 /BUFFER AT 01000 0000 /BLOCK 0 HLT /ERROR RETURN JMS I (TTY /CALL HANDLER AGAIN 4600 /OUTPUT SIX PAGES 1000 0000 HLT CLA JMP GO > $