File: KL8E.PA of Disk: Disks/Working/Build-11-03-07
(Source file text)
/SUPER TTY HANDLER VERSION V40 / / / / / / / / / /COPYRIGHT (C) 1980 BY DATAPLAN GMBH, LAUDA, BRD / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DATAPLAN GMBH. /DATAPLAN GMBH 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 DATAPLAN'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DATAPLAN. / /DATAPLAN GMBH ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY /OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DATAPLAN. / / / / / / / / / / / /W.V.D.MARK, DP CONSULTING, ZUERICH. /1-JAN-80 *0 -1 DEVICE KL8E;DEVICE TTY;0;TTY&177+4000;ZBLOCK 2 /TWO-PAGE TELETYPE HANDLER FOR OS/8 V3. /ON INPUT, RECOGNIZES ^Z, ^C, ^U, RUBOUT (RO) /^Z MEANS END OF INPUT, INSERT ^Z IN BUFFER, / PAD WITH ZEROES, AND ECHO "^Z,CRLF" /^C MEANS ABORT JOB, RETURN TO OS/8 VIA LOC 7600 TO SAVE CORE /^U MEANS DELETE THE LAST LINE, ALLOW OPERATOR TO RETYPE / (LINE STARTS AT BEGIN OF BUFFER AND IS TERMINATED BY A CR) / A CR GETS ENTERED INTO BUFFER, CAUSES A LF TO ALSO ECHO / AND GET ENTERED INTO BUFFER, BUFFER IS THEN PADDED WITH NULLS. /RO DELETES LAST CHARACTER FROM BUFFER, IF BEGIN OF BUFFER / REACHED A CRLF (LIKE ^U) IS GIVEN. / SCOPE RO'S CONSIST IN BS/SPACE/BS. / PAPER RO'S CONSIST IN BS/LINEFEED. /ON OUTPUT RECOGNIZES ^C, ^O, ^S, ^Q FROM KEYBOARD /^C CAUSES JOB TO ABORT, RETURN TO OS/8 VIA LOCATION 7600 / TO SAVE CORE. /^O CAUSES ECHOING BY THE HANDLER TO CEASE / TYPING ANY OTHER CHARACTER RESUMES ECHOING. /^S CAUSES THE HANDLER TO STOP SENDING TO TERMINAL /^Q (OR ANY OTHER CHAR) RESUMES HANDLER SENDING / AND REENABLES PAUSE IF SCOPE-MODE AFTER ^S. / ANY CHAR GIVEN DURING PAUSE DISABLES PAUSE. /WHENEVER PRINTING CHARACTERS (EITHER ON OUTPUT OR WHEN ECHOING), /SEVERAL OPTIONS CAN BE ACTIVATED OR NOT. / ALWAYS IGNORES NULLS / CONVERTS LC TO UC OR NOT. / HANDLES TABS CORRECTLY (INCLUDING COLUMN COUNTING) / PRINTS ESCAPE AS $, AS ^[ OR AS ESC. / PRINTS CONTROL CHARACTERS AS "^K" OR UNMODIFIED. / DOES AUTOMATIC CR/LF AT END OF LINE WIDTH. / DELAYS AFTER FORM-FEED IF NON-SCOPE MODE. TTYVERSION="M&77 VT78=1 /SET TO 0 TO ALLOW OTHER PARAMETERS /SET TO 1 TO FORCE OTHER PARAMETERS TO VT78 COMPATIBLE CTRL=1 /SET TO 1 TO ECHO CONTROL CHARS AS ^K /SET TO 0 TO ACCEPT CONTROL CHARACTERS AND PUT /IN BUFFER, AS WELL AS ECHO THEM. RUB=0 /SET TO 0 TO ECHO EACH RUBOUT BY TYPING BS/LF. /SET TO 1 TO PERFORM SCOPE TYPE RUBOUTS: BS/SP/BS SIMTAB=1 /SET TO 1 TO SIMULATE TABS AS THE CORRECT NUMBER OF SPACES /SET TO 0 TO TYPE TABS AS TABS ESC=1 /SET TO 1 TO ECHO ESCAPE AS $ /SET TO 0 TO ECHO ESCAPE AS A CONTROL CHAR (^[) CNVLC=1 /SET TO 1 TO CONVERT LOWER CASE CHARS TO UPPER CASE /SET TO 0 TO PRINT LOWER CASE CHARS AS THEY ARE PAG=0 /NO CONTROL-S FEATURE ON TTY PAUS=0 /NO PAUSE ON TTY HEIGHT=110 /NUMBER OF LINES ON TTY PAGE WIDTH=110 /TTY WIDTH = 72 IFNZRO VT78 < CTRL=1 RUB=1 SIMTAB=0 ESC=1 CNVLC=0 PAG=1 /CONTROL-S FEATURE ON SCOPE PAUS=100 /PAUSE ENABLED ON SCOPE HEIGHT=30 /NUMBER OF LINES PER SCREEN WIDTH=120 /SCOPE WIDTH=80 > /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 BOTH TTYPCH AND TTYGCH. /TTYPCH AND TTYGCH SHARE THE SAME ENTRY POINT. /IF IT IS CALLED WITH A 0 AC, IT IS A CALL TO TTYGCH, /IF IT IS CALLED WITH A NON-ZERO AC, IT IS A CALL TO TTYPCH. /TTYGCH JUST GETS THE CHARACTER FROM THE KEYBOARD AND /CHECKS IF IT IS ^C, IF NOT, IT RETURNS THIS CHAR TO /PAGE 1, WHERE THE DIFFERENT INPUT OPTIONS ARE DECODED. /TTYPCH TAKES RETURN 1 IF IT WANTS THE HANDLER TO GO AWAY, /I.E IF IT SAW A ^Z. /IT NORMALLY TAKES RETURN 2 /AND TAKES RETURN 3 IF THE LINE OVERFLOWED. /WHEN ECHOING WE PREVENT THE ^Z RETURN BY TELLING /PAGE 2. (LINK=1 MEANS ECHOING) *200 L3700, 3700 /*200 PUNCH, 0 /MAKE SURE AC NON-ZERO JMS I PLINK /CALL TTYPCH JMP TTYRTN /RETURN ON OUTPUT JMP I PUNCH /DID WE REACH END OF TTY LINE?:NO JMS CRLF /YES, PERFORM CR/LF JMP I PUNCH /RETURN TTYCDF, CDF 0 BUFSIZ, 0 BUFSTRT,0 TTY70, 70 /*212 TTYCA, 0 TTYWC, 0 CIFCDF, CIF CDF 0 /*215 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 TTY200, 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 TTY215, TAD CIFCDF /FORM OUR EXIT CIF CDF DCA TTYXIT /STORE AWAY FOR EXIT ROUTINE TAD I TTY /GET FUNCTION WORD TTY212, AND TTY70 /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 # ISZ TTY /POINT TO ERROR RETURN SHIFT, /OUTPUT SHIFT REGISTER TTYEOF, /0 IF SAW CR OR ^Z AND WISH TO PAD BUFFER WITH 0'S TTCDBF, HLT /*240 : 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 SZA /PREVENT ZERO KILLER JMS PUNCH /PRINT A CHARACTER TAD I BUFSTRT ISZ BUFSTRT /BUMP INPUT POINTER TT7400, 7400 /PROTECT ISZ AND TT7400 CLL RAL TTY240, 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 TTYX, TAD TTYEOF /IF INPUT AND WE WERE PADDING WITH 0'S SZA CLA /TAKE SOFT ERROR EXIT TTYRTN, ISZ TTY /POINT TO NORMAL RETURN /CAN'T GET ERROR OR END-OF-FILE ON OUTPUT TTYXIT, HLT /RETURN TO USER'S FIELD JMP I TTY /RETURN TO USER CTRLU, JMS CRLF /PERFORM A CR/LF 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 TSTEND, TAD TTYEOF SNA CLA JMP ZERO JMS I PLINK /CALL TTYGCH TO GET A CHARACTER ZERO, TAD TTY200 /SET BIT 200 CONVENTION DCA I TTYCA /STORE AWAY TEMPORARILY /USING USER'S BUFFER AS A TEMP LOCATION CLA IAC STL /SET LINK FOR ECHO TAD I TTYCA /GET FOR RO TEST (377+1=400) TAD TT7400 /=-400 SNA CLA JMP RUBOUT /WE HAVE A RO IFNZRO ECHO < TAD I TTYCA> /GET BACK CHARACTER IFZERO ECHO < SKP> /*NO ECHO JMS PUNCH /ECHO IT TAD I TTYCA /AND AGAIN FOR CTRL Z TEST TAD M232 SNA DCA TTYEOF /EOF: SET ZERO FILL SNA JMS CRLF /AND POLISH PAGING TAD TTY5 /^Z-^U SNA /IS IT ^U? JMP CTRLU /YES TAD TTY7 DCA TMP ISZ TTYCA /NO TTY7, 7 ISZ TTYWC /IS BUFFER FULL? TTY10, SKP JMP TTYX ISZ TMP /WAS LAST CHAR A CR? JMP TSTEND /NO DCA TTYEOF /YES, SET "PAD WITH 0'S" FLAG ISZ TTY /POINT TO NORMAL RETURN /CR IS NOT AN ERROR OR END-OF-FILE TAD TTY212 /IF LAST CHAR INPUT WAS CR, NOW PRETEND LF WAS INPUT JMP ZERO+1 /REJOIN PROCESSING TMP, CRLF, 0 TAD TTY215 JMS I PLINK /CALL TTYPCH TO PRINT CR TTY5, 5 /*EOF AND EOL IMPOSSIBLE TAD TTY212 JMS I PLINK /CALL TTYPCH TO PRINT LF M232, -232 /*EOF AND EOL IMPOSSIBLE JMP I CRLF /RETURN RUBOUT, TAD TTYCA CIA TAD BUFSTRT SNA CLA /ARE WE AT BEGIN OF BUFFER? JMP CTRLU /YES STA TAD TTYCA /NO; SET POINTER BACK ONE DCA TTYCA TAD TTY10 JMS PUNCH IFNZRO RUB < /SCOPE TYPE RUBOUT: TAD TTY240> /BACKSPACE-SPACE-BACKSPACE IFZERO RUB < /PAPER TYPE RUBOUT: TAD TTY212> /BACKSPACE-LINEFEED JMS PUNCH IFNZRO RUB < TAD TTY10> IFZERO RUB < SKP> JMS PUNCH STA TAD TTYWC JMP DCAWC /BUMP BACK WC AND GET ANOTHER CHAR ZBLOCK 376-. TTY, TTYVERSION /ENTRY POINT TO HANDLER JMS PLINK /SET UP CROSS PAGE LINKAGE IFNZRO TTY-376 <ENTERR,QQQQ> PAGE /INTERLUDE: /USA STANDARD CODE FOR INFORMATION INTERCHANGE: / XX XX0 XX1 XX2 XX3 XX4 XX5 XX6 XX7 / 000 001 010 011 100 101 110 111 / / 00 0000 NUL SOH STX ETX EOT ENQ ACK BEL / / 01 0001 BS HT LF VT FF CR SO SI / / 02 0010 DLE DC1 DC2 DC3 DC4 NAK SYN ETB / / 03 0011 CAN EM SUB ESC FS GS RS US / / 04 0100 SP ! " # $ % & ' / / 05 0101 ( ) * + , - . / / / 06 0110 0 1 2 3 4 5 6 7 / / 07 0111 8 9 : ; < = > ? / / 10 1000 @ A B C D E F G / / 11 1001 H I J K L M N O / / 12 1010 P Q R S T U V W / / 13 1011 X Y Z [ \ ] ^ _ / / 14 1100 ` a b c d e f g / / 15 1101 h i j k l m n o / / 16 1110 p q r s t u v w / / 17 1111 x y z { | } ~ DEL / /MUST BE AT TOP OF PAGE TTYPCH, /ENTRY POINT TO TTY PRINT ROUTINE TTYGCH, 0 /ENTRY POINT TO TTY GET CHAR ROUTINE SNA JMP TGCH /ZERO AC-MEANT CALL TO TTYGCH TTYUPA, AND TT177 /REDUCE TO 7 BIT (ECHO:L=1) TAD (-33 SNA /IS IT ESC? IFNZRO ESC < TAD TT11> /YES CONVERT TO $ IFZERO ESC < NOP> /*ESC IAC /TEST CTRL Z SZL /ECHO NOW L=0:DON'T MAKE EOF RETURN SZA /IF 0:EOF; RETURN ON EOF,NO ECHO SKP JMP I TTYPCH /CTRL Z RETURN TAD TT32 DCA TCHAR /THIS IS OUR CHAR ISZ TTYPCH /SET TO NORMAL RETURN IFNZRO PAUS < TAD PAUSN DCA TTYTLS> /SET PAUSE DELAY IFZERO PAUS < SNL /IF ECHO DON'T KSF JMP ECHO> TAD TT11 TTY140, CMA CLL /=-12 TTC, TAD TCHAR /GET CHAR BACK FOR PAGE TEST SNA CLA /LOOK FOR LF ISZ LINCNT /GOT LF. AT END OF PAGE? TAD LINCNT /NOT AT END OR NO LF: AC=C(LINCNT) PAUSL, KSF /3-WAY BRANCH IFNZRO PAUS < JMP WAIT> /WAIT IF AC=0. IFZERO PAUS < JMP NOPAUS> /*NO PAUSE JMS TTYTST /GET KEYBOARD CHAR AND CLA TAD TTC /GET 'TAD TCHAR' DCA ECHO /RESTORE *KLUDGE TAD TTYTLS /GET INPUT CHAR TAD (-17 SNA /^O? DCA ECHO /YES, SET *KLUDGE FOR EXIT TAD TTM4 /NO (17-23=-4) M140, SZA CLA /^S? JMP NOPAUS /NO, IGNORE CHAR KSF IFNZRO PAG < JMP .-1> /WAIT FOR SOME CHAR IFZERO PAG < NOP> /*NO PAUSE NOPAUS, SNA /IF C(LINCNT)=0 TAD PAGSIZ /RESET FOR NEXT PAGEFUL DCA LINCNT ECHO, TAD TCHAR /*K* OR 0 TO RETURN ON ^O SNA JMP I TTYPCH /IGNORE NULLS TAD (-17 /AT CR+2=SO+1 TTY100, CLL TAD TT7 SNL CLL STA RAL /-2 WILL BECOME +2 FOR 'TNORM' CMA /CONTROL -, NORMAL +1 CLL RAL /CONTROL -2*, NORMAL +2 TAD TTJUMP /'JMP TTSET' DCA TTYTLS /AND FALL INTO JUMP TTYTLS, 0 TLS TT7600, 7600 /CLEAR AC TSF JMP .-1 ISZ TABCTR /END OF LINE? JMP I TTYTLS /NO: NORMAL RETURN ISZ TTYPCH /YES: EOL RETURN JMP I TTYTLS TCHAR, 0 LINSIZ, -WIDTH-1 /-1 BECAUSE CR WILL INC ONCE TABCTR, -WIDTH PAGSIZ, -HEIGHT LINCNT, -HEIGHT TGCH, KSF /NON-ZERO MEANS TTYGCH WAS CALLED JMP .-1 /WAIT FOR CHAR TO BE TYPED JMS TTYTST /GET CHAR AND CLA TAD TTYTLS JMP I TTYGCH /TAKE ONLY RETURN TTYTST, 0 /'KRB' WILL CLEAR AC KRB /FLAG IS UP AND TT177 DCA TTYTLS /KEEP INPUT CLL STA RTL /CTRL C? TAD TTYTLS SZA CLA JMP I TTYTST /NO CIF CDF 0 /BRANCH TO OS/8 MONITOR AT 07600 JMP I TT7600 TUPA, TAD TTYUPA /ECHO 201-237 AS ^X (EXCEPT 210-216) JMS TTYTLS TCONV, TAD TTY100 /ADD X100 TO ^K TO GET K PRIN, TAD TCHAR JMS TTYTLS TKILL, JMP I TTYPCH /*K* OR ZEROED BY FF IFZERO PAUS < /IF FF FALL INTO HERE FROM PRINT TAD TTJRT /RESTORE 'JMP I TTYPCH' DCA TKILL ISZ TCHAR /MAKE 'CR' OUT OF 'FF' JMS TTYTLS /PRINT NULLS ISZ LINCNT /TILL PAGE HAS HAD TIME JMP .-2 /TO POSITION JMP NOPAUS> /RESET LINE AND CR RESET COLUMN IFNZRO PAUS < WAIT, SZA /IF AC=0, WAIT JMP NOPAUS /C(LINCNT) IN AC ISZ LINCNT JMP .-1 /WAIT 18MS ISZ TTYTLS /OUTER LOOP JMP PAUSL /CHECK FLAG JMP NOPAUS> /RESET LINCNT TO PAGE SIZE TT177, 177 /'SO' ENTRY POINT TT11, 11 /FALL THRU TO 'CR' CR, TAD LINSIZ /CR AND SO RESET COLUMN COUNTER TTJUMP, JMP TTSET IFNZRO PAUS < /IGNORE 'FF' ON SCOPE FF, SKP PAUSN, -PAUS> IFZERO PAUS < /FORCE 'FF' DELAY ON LA36 FF, DCA TKILL /FALL OUT OF PRINT AFTER FF PAUSN, JMP TTSET> /PAGE MAY BE LONGER THAN LINE TT7, 7 /'VT' ENTRY POINT TT32, 32 /VT FALL ON LF LF, STA /LF NO MOVE OF 'TABCTR' JMP BS+1 TAB, JMP TTYTAB TTM4, -4 BS, CLL STA RAL /-2 TAD TABCTR TTSET, DCA TABCTR JMP PRIN TNORM, TAD TCHAR /NORMAL ENTRY: GET BACK CHAR AND TTY140 /HIGH ORDER BITS IRRELEVANT SNA IFNZRO CTRL < JMP TUPA> /A CONTROL CHARACTER IFZERO CTRL < JMP LF> /*NO ARROW (NO TABCTR MOVE) TAD M140 /BUT IS IT LC? IFNZRO CNVLC < SZA CLA> IFZERO CNVLC < 7600> /*LC JMP PRIN /NO PRINT UC TAD M140 /YES, CONVERT TO UC JMP TCONV /-140+100=-40 IFZERO SIMTAB < TTYTAB, TAD TT7 CMA /MAKES 7770 MASK AND TABCTR /GO BACK TO THIS TAB STOP TAD TT7 /ADD 7 AND... DCA TABCTR JMP PRIN> /1 FROM TAB TO NEXT TAB STOP IFNZRO SIMTAB < TTYTAB, TAD M140 /USE AS SPACE JMS TTYTLS /ALWAYS ONE MOVE TAD TABCTR AND TT7 SZA CLA /ARE WE AT NEXT TAB STOP? JMP TTYTAB> /NO, ANOTHER SPACE PLEASE! TTJRT, JMP I TTYPCH /YES, GET OUT $$$