TITLE READC TELETYPE DEVICE HANDLER FOR MUDDLE RELOCATABLE .INSRT MUDDLE > SYSQ IF1,[ IFE ITS,.INSRT MUDSYS;STENEX > ] .GLOBAL BUFRIN,CHRCNT,SYSCHR,ECHO,BYTPTR,ERASCH,KILLCH,BRKCH,AGC,CHRWRD,W1CHAR,GWB .GLOBAL IOIN2,READC,WRONGC,BRFCHR,ESCAP,TTYOPE,MTYI,MTYO,NOTTY,TTYOP2,IBLOCK .GLOBAL RRESET,TTICHN,TTOCHN,CHANNO,STATUS,BRFCH2,TTYBLK,TTYUNB,WAITNS .GLOBAL EXBUFR,INCHAR,BYTDOP,BUFSTR,LSTCH,CHNCNT,DIRECT,IOINS,IBLOCK,INCONS .GLOBAL BADCHN,WRONGD,CHNLOS,MODE1,MODE2,GMTYO,IDVAL,GETCHR,PAGLN,LINLN .GLOBAL RDEVIC TTYOUT==1 TTYIN==2 ; FLAGS CONCERNING TTY CHANNEL STATE N.ECHO==1 ; NO INPUT ECHO N.CNTL==2 ; NO RUBOUT ^L ^D ECHO N.IMED==4 ; ALL CHARS WAKE UP N.IME1==10 ; SOON WILL BE N.IMED ; OPEN BLOCK MODE BITS OUT==1 IMAGEM==4 ASCIIM==0 UNIT==0 ; READC IS CALLED BY PUSHJ P,READC ; B POINTS TO A TTY FLAVOR CHANNEL ; ONE CHARACTER IS RETURNED IN A ; BECOMES INTERRUPTABLE IF NO CHARACTERS EXISTS ; HERE TO ASK SYSTEM FOR SOME CHARACTERS INCHAR: IRP A,,[0,C,D,E] ;SAVE ACS PUSH P,A TERMIN MOVE E,BUFRIN(B) ; GET AUX BUFFER MOVE D,BYTPTR(E) HLRE 0,E ;FIND END OF BUFFER SUBM E,0 ANDI 0,-1 ;ISOLATE RH MOVE C,SYSCHR(E) ; GET FLAGS INCHR1: TRNE C,N.IMED+N.CNTL ; SKIP IF NOT IMMEDIATE JRST DONE TLZE D,40 ; SKIP IF NOT ESCAPED JRST INCHR2 ; ESCAPED CAMN A,ESCAP(E) ; IF ESCAPE TLO D,40 ; REMEMBER CAMN A,BRFCH2(E) JRST BRF CAMN A,BRFCHR(E) ;BUFFER PRINT CHAR JRST CLEARQ ;MAYBE CLEAR SCREEN CAMN A,BRKCH(E) ;IS THIS A BREAK? JRST DONE ;YES, DONE CAMN A,ERASCH(E) ;ARE IS IT ERASE? JRST ERASE ;YES, GO PROCESS CAMN A,KILLCH(E) ;OR KILL JRST KILL INCHR2: PUSHJ P,PUTCHR ;PUT ACHAR IN BUFFER INCHR3: MOVEM D,BYTPTR(E) JRST DONE1 DONE: SKIPL A ; IF JUST BUFFER FORCE, SKIP PUSHJ P,PUTCHR ; STORE CHAR MOVEI A,N.IMED ; TURN OFF IMEDIACY ANDCAM A,SYSCHR(E) MOVEM D,BYTPTR(E) PUSH TP,$TCHAN ; SAVE CHANNEL PUSH TP,B MOVE A,CHRCNT(E) ; GET # OF CHARS SETZM CHRCNT(E) PUSH P,A ADDI A,4 ; ROUND UP IDIVI A,5 ; AND DOWN PUSHJ P,IBLOCK ; GET CORE HLRE A,B ; FIND D.W. SUBM B,A MOVSI 0,TCHRS+.VECT. ; GET TYPE MOVEM 0,(A) ; AND STORE MOVEI D,(B) ; COPY PNTR POP P,C ; CHAR COUNT HRLI D,440700 HRLI C,TCHSTR PUSH TP,C PUSH TP,D PUSHJ P,INCONS ; CONS IT ON MOVE C,-2(TP) ; GET CHAN BACK MOVEI D,EXBUFR(C) ; POINT TO BUFFER LIST HRRZ 0,(D) ; LAST? JUMPE 0,.+3 MOVE D,0 JRST .-3 ; GO UNTIL END HRRM B,(D) ; SPLICE ; HERE TO BLT IN BUFFER MOVE D,BUFRIN(C) ; POINT TO COMPLETED BUFFER HRRZ C,(TP) ; START OF NEW STRING HRLI C,BYTPTR+1(D) ; 1ST WORD OF CHARS MOVE E,[010700,,BYTPTR(E)] EXCH E,BYTPTR(D) ; END OF STRING MOVEI E,-BYTPTR(E) ADD E,(TP) ; ADD TO START BLT C,-1(E) MOVE B,-2(TP) ; CHANNEL BACK SUB TP,[4,,4] ; FLUSH JUNK PUSHJ P,TTYUNB ; UNBLOCK THIS TTY DONE1: IRP A,,[E,D,C,0] POP P,A TERMIN POPJ P, ERASE: SKIPN CHRCNT(E) ;ANYTHING IN BUFFER? JRST BARFCR ;NO, MAYBE TYPE CR SOS CHRCNT(E) ;DELETE FROM COUNT LDB A,D ;RE-GOBBLE LAST CHAR IFN ITS,[ LDB C,[600,,STATUS(B)] ; CHECK FOR IMLAC CAIE C,2 ; SKIP IF IT IS ] JRST TYPCHR SKIPN ECHO(E) ; SKIP IF ECHOABLE JRST NECHO PUSHJ P,CHRTYP ; FOUND OUT IMALC BEHAVIOR SKIPGE C,FIXIM2(C) JRST (C) NOTFUN: PUSHJ P,DELCHR SOJG C,.-1 NECHO: ADD D,[70000,,0] ;DECREMENT BYTE POINTER JUMPGE D,INCHR3 ;AND GO ON, UNLESS BYTE POINTER LOST SUB D,[430000,,1] ;FIX UP BYTE POINTER JRST INCHR3 LFKILL: PUSHJ P,LNSTRV JRST NECHO BSKILL: PUSHJ P,GETPOS ; CURRENT POSITION TO A PUSHJ P,SETPOS ; POSITION IMLAC CURSOR MOVEI A,20 ; ^P XCT ECHO(E) MOVEI A,"L ; L , DELETE TO END OF LINE XCT ECHO(E) JRST NECHO TBKILL: PUSHJ P,GETPOS ANDI A,7 SUBI A,10 ; A -NUMBER OF DELS TO DO PUSH P,A PUSHJ P,DELCHR AOSE (P) JRST .-2 SUB P,[1,,1] JRST NECHO TYPCHR: IFE ITS,[ PUSH P,A ; USE TENEX SLASH RUBOUT MOVEI A,"\ SKIPE C,ECHO(E) XCT C POP P,A ] SKIPE C,ECHO(E) XCT C JRST NECHO ; ROUTINE TO DEL CHAR ON IMLAC DELCHR: MOVEI A,20 XCT ECHO(E) MOVEI A,"X XCT ECHO(E) POPJ P, ; HERE FOR SPECIAL IMLAC HACKS FOURQ: PUSH P,CNOTFU FOURQ2: MOVEI C,2 ; FOR ^Z AND ^_ CAMN B,TTICHN+1(TVP) ; SKIP IF NOT CONSOLE TTY MOVEI C,4 CNOTFU: POPJ P,NOTFUN CNECHO: JRST NECHO LNSTRV: MOVEI A,20 ; ^P XCT ECHO(E) MOVEI A,"U XCT ECHO(E) POPJ P, ; HERE IF KILLING A C.R., RE-POSITION CURSOR CRKILL: PUSHJ P,GETPOS ; COMPUTE LINE POS PUSHJ P,SETPOS JRST NECHO SETPOS: PUSH P,A ; SAVE POS MOVEI A,20 XCT ECHO(E) MOVEI A,"H XCT ECHO(E) POP P,A XCT ECHO(E) ; HORIZ POSIT AT END OF LINE POPJ P,0 GETPOS: PUSH P,0 MOVEI 0,10 ; MINIMUM CURSOR POS PUSH P,[010700,,BYTPTR(E)] ; POINT TO BUFFER PUSH P,CHRCNT(E) ; NUMBER THEREOF GETPO1: SOSGE (P) ; COUNT DOWN JRST GETPO2 ILDB A,-1(P) ; CHAR FROM BUFFER CAIN A,15 ; SKIP IF NOT CR MOVEI 0,10 ; C.R., RESET COUNT PUSHJ P,CHRTYP ; GET TYPE XCT FIXIM3(C) ; GET FIXED COUNT ADD 0,C JRST GETPO1 GETPO2: MOVE A,0 ; RET COUNT MOVE 0,-2(P) ; RESTORE AC 0 SUB P,[3,,3] POPJ P, CHRTYP: MOVEI C,0 ; NUMBER OF FLUSHEES CAILE A,37 ; SKIP IF CONTROL CHAR POPJ P, PUSH TP,$TCHAN PUSH TP,B ; SAVE CHAN IDIVI A,12. ; FIND SPECIAL HACKS MOVE A,FIXIML(A) ; GET CONT WORD IMULI B,3 ROTC A,3(B) ; GET CODE IN B ANDI B,7 MOVEI C,(B) MOVE B,(TP) ; RESTORE CHAN SUB TP,[2,,2] POPJ P, FIXIM2: 1 2 SETZ FOURQ SETZ CRKILL SETZ LFKILL SETZ BSKILL SETZ TBKILL FIXIM3: MOVEI C,1 MOVEI C,2 PUSHJ P,FOURQ2 MOVEI C,0 MOVEI C,0 MOVNI C,1 PUSHJ P,CNTTAB CNTTAB: ANDCMI 0,7 ; GET COUNT INCUDING TAB HACK ADDI 0,10 MOVEI C,0 POPJ P, FIXIML: 111111,,115641 ; CNTL @ABCDE,,FGHIJK 131111,,111111 ; LMNOPQ,,RSTUVW 112011,,120000 ; XYZ LBRAK \ RBRAK,,^ _ ; HERE TO KILL THE WHOLE BUFFER KILL: CLEARM CHRCNT(E) ;NONE LEFT NOW MOVE D,[010700,,BYTPTR(E)] ;RESET POINTER BARFCR: IFN ITS,[ MOVE A,ERASCH(E) ;GET THE ERASE CHAR CAIN A,177 ;IS IT RUBOUT? ] PUSHJ P,CRLF1 ; PRINT CR-LF JRST INCHR3 CLEARQ: IFN ITS,[ MOVE A,STATUS(B) ;CHECK CONSOLE KIND ANDI A,77 CAIN A,2 ;DATAPOINT? PUSHJ P,CLR ;YES, CLEAR SCREEN ] BRF: MOVE C,[010700,,BYTPTR(E)] ;POINT TO START OF BUFFER SKIPN ECHO(E) ;ANY ECHO INS? JRST NECHO PUSHJ P,CRLF2 PUSH P,CHRCNT(E) SOSGE (P) JRST DECHO ILDB A,C ;GOBBLE CHAR XCT ECHO(E) ;ECHO IT JRST .-4 ;DO FOR ENTIRE BUFFER DECHO: SUB P,[1,,1] JRST INCHR3 CLR: SKIPN C,ECHO(E) ;ONLY IF INS EXISTS POPJ P, MOVEI A,20 ;ERASE SCREEN XCT C MOVEI A,103 XCT C POPJ P, PUTCHR: AOS CHRCNT(E) ;COUNT THIS CHARACTER IBP D ;BUMP BYTE POINTER CAIG 0,@D ;DONT SKIP IF BUFFER FULL PUSHJ P,BUFULL ;GROW BUFFER IFE ITS,[ CAIN A,37 ; CHANGE EOL TO CRLF MOVEI A,15 ] DPB A,D ;CLOBBER BYTE POINTER IN MOVE C,SYSCHR(E) ; FLAGS TRNN C,N.IMED+N.CNTL CAIE A,15 ; IF CR INPUT, FOLLOW WITH LF POPJ P, MOVEI A,12 ; GET LF JRST PUTCHR ; BUFFER FULL, GROW THE BUFFER BUFULL: PUSH TP,$TCHAN ;SAVE B PUSH TP,B PUSH P,A ; SAVE CURRENT CHAR HLRE A,BUFRIN(B) MOVNS A ADDI A,100 ; MAKE ONE LONGER PUSHJ P,IBLOCK ; GET IT MOVE A,(TP) ;RESTORE CHANNEL POINTER SUB TP,[2,,2] ;AND REMOVE CRUFT MOVE E,BUFRIN(A) ;GET AUX BUFFER POINTER MOVEM B,BUFRIN(A) HLRE 0,E ;RECOMPUTE 0 MOVSI E,(E) HRRI E,(B) ; POINT TO DEST SUB B,0 BLT E,(B) MOVEI 0,100-2(B) MOVE B,A POP P,A POPJ P, ; ROUTINE TO CRLF ON ANY TTY CRLF1: SKIPN ECHO(E) POPJ P, ; NO ECHO INS CRLF2: MOVEI A,15 XCT ECHO(E) MOVEI A,12 XCT ECHO(E) POPJ P, ; SUBROUTINE TO FLUSH BUFFER RRESET: SETZM LSTCH(B) ; CLOBBER RE-USE CHAR MOVE E,BUFRIN(B) ;GET AUX BUFFER SETZM CHRCNT(E) MOVEI D,N.IMED+N.IME1 ANDCAM D,SYSCHR(E) MOVE D,[010700,,BYTPTR(E)] ;RESET BYTE POINTER MOVEM D,BYTPTR(E) MOVE D,CHANNO(B) ;GOBBLE CHANNEL SETZM CHNCNT(D) ; FLUSH COUNTERS IFN ITS,[ LSH D,23. ;POSITION IOR D,[.RESET 0] XCT D ;RESET ITS CHANNEL ] IFE ITS,[ MOVEI A,100 ; TTY IN JFN CFIBF ] SETZM EXBUFR(B) ; CLOBBER STAKED BUFFS MOVEI C,BUFSTR-1(B) ; FIND D.W. PUSHJ P,BYTDOP SUBI A,2 HRLI A,010700 MOVEM A,BUFSTR(B) HLLZS BUFSTR-1(B) POPJ P, ; SUBROUTINE TO ESTABLISH ECHO IOINS MFUNCTION ECHOPAIR,SUBR ENTRY 2 GETYP A,(AB) ;CHECK ARG TYPES GETYP C,2(AB) CAIN A,TCHAN ;IS A CHANNEL CAIE C,TCHAN ;IS C ALSO JRST WRONGT ;NO, ONE OF THEM LOSES MOVE A,1(AB) ;GET CHANNEL PUSHJ P,TCHANC ; VERIFY TTY IN MOVE D,3(AB) ;GET OTHER CHANNEL MOVEI B,DIRECT-1(D) ;AND ITS DIRECTION PUSHJ P,CHRWRD JFCL CAME B,[ASCII /PRINT/] JRST WRONGD MOVE B,BUFRIN(A) ;GET A'S AUX BUFFER HRLZ C,CHANNO(D) ; GET CHANNEL LSH C,5 IOR C,[.IOT A] ; BUILD AN IOT MOVEM C,ECHO(B) ;CLOBBER CHANRT: MOVE A,(AB) MOVE B,1(AB) ;RETURN 1ST ARG JRST FINIS TCHANC: MOVEI B,DIRECT-1(A) ;GET DIRECTION PUSHJ P,CHRWRD ; CONVERT JFCL CAME B,[ASCII /READ/] JRST WRONGD LDB C,[600,,STATUS(A)] ;GET A CODE CAILE C,2 ;MAKE SURE A TTY FLAVOR DEVICE JRST WRONGC POPJ P, IFE ITS,[ TTYOPEN: TTYOP2: MOVEI A,-1 ; TENEX JFN FOR TERMINAL MOVEI 2,145100 ; MAGIC BITS (SEE TENEX MANUAL) SFMOD ; ZAP RFMOD ; LETS FIND SCREEN SIZE LDB A,[220700,,B] ; GET PAGE WIDTH LDB B,[310700,,B] ; AND LENGTH MOVE C,TTOCHN+1(TVP) MOVEM A,LINLN(C) MOVEM B,PAGLN(C) MOVEI A,-1 ; NOW HACK CNTL CHAR STUFF RFCOC ; GET CURRENT AND B,[036377,,-1] ; CHANGE FOR ^@, ^A AND ^D (FOR NOW) SFCOC ; AND RESUSE IT POPJ P, ] IFN ITS,[ TTYOP2: .SUSET [.RTTY,,C] SETZM NOTTY JUMPL C,TTYNO ; DONT HAVE TTY TTYOPEN: SKIPE NOTTY POPJ P, .OPEN TTYIN,[SIXBIT / TTY/] JRST TTYNO .OPEN TTYOUT,[21,,(SIXBIT /TTY/)] ;AND OUTPUT FATAL CANT OPEN TTY DOTCAL TTYGET,[[1000,,TTYOUT],[2000,,0],[2000,,A],[2000,,B]] FATAL .CALL FAILURE DOTCAL TTYSET,[[1000,,TTYOUT],MODE1,MODE2,B] FATAL .CALL FAILURE SETCHN: MOVE B,TTICHN+1(TVP) ;GET CHANNEL MOVEI C,TTYIN ;GET ITS CHAN # MOVEM C,CHANNO(B) .STATUS TTYIN,STATUS(B) ;CLOBBER STATUS MOVE B,TTOCHN+1(TVP) ;GET OUT CHAN MOVEI C,TTYOUT MOVEM C,CHANNO(B) .STATUS TTYOUT,STATUS(B) SETZM IMAGFL ;RESET IMAGE MODE FLAG HLLZS IOINS-1(B) DOTCAL RSSIZE,[[1000,,TTYOUT],[2000,,C],[2000,,D]] FATAL .CALL RSSIZE LOSSAGE MOVEM C,PAGLN(B) MOVEM D,LINLN(B) POPJ P, ; HERE IF TTY WONT OPEN TTYNO: SETOM NOTTY POPJ P, ] MTYI: SKIPE NOTTY ; SKIP IF HAVE TTY FATAL TRIED TO USE NON-EXISTANT TTY IFN ITS, .IOT TTYIN,A IFE ITS, PBIN POPJ P, MTYO: SKIPE NOTTY POPJ P, ; IGNORE, DONT HAVE TTY SKIPE IMAGFL ;SKIP RE-OPENING IF ALREADY IN ASCII PUSHJ P,MTYO1 ;WAS IN IMAGE...RE-OPEN CAIE A,177 ;DONT OUTPUT A DELETE IFN ITS, .IOT TTYOUT,A IFE ITS, PBOUT POPJ P, MTYO1: MOVE B,TTOCHN+1(TVP) PUSH P,0 PUSHJ P,REASCI POP P,0 POPJ P, ; HERE FOR TYO TO ANY TTY FLAVOR DEVICE GMTYO: PUSH P,0 HRRZ 0,IOINS-1(B) ; GET FLAG SKIPE 0 PUSHJ P,REASCI ; RE-OPEN TTY HRLZ 0,CHANNO(B) ASH 0,5 IOR 0,[.IOT A] CAIE A,177 ; DONE OUTPUT A DELETE XCT 0 POP P,0 POPJ P, REASCI: PUSH P,A PUSH P,C PUSHJ P,DEVTOC HRLI C,21 ; ASCII GRAPHIC BIT MOVE A,CHANNO(B) ; GET CHANNEL ASH A,23. ; TO AC FIELD IOR A,[.OPEN 0,C] XCT A FATAL TTY OPEN LOSSAGE POP P,C POP P,A HLLZS IOINS-1(B) CAMN B,TTOCHN+1(TVP) SETZM IMAGFL POPJ P, WRONGC: PUSH TP,$TATOM PUSH TP,EQUOTE NOT-A-TTY-TYPE-CHANNEL JRST CALER1 ; HERE TO HANDLE TTY BLOCKING AND UNBLOCKING TTYBLK: PUSH TP,$TCHAN PUSH TP,B PUSH P,0 PUSH P,E ; SAVE SOME ACS IFN ITS,[ MOVE A,CHANNO(B) ; GET CHANNEL NUMBER SOSG CHNCNT(A) ; ANY PENDING CHARS JRST TTYBL1 SETZM CHNCNT(A) MOVEI 0,1 LSH 0,(A) .SUSET [.SIFPI,,0] ; SLAM AN INT ON ] TTYBL1: MOVE C,BUFRIN(B) MOVE A,SYSCHR(C) ; GET FLAGS TRZ A,N.IMED TRZE A,N.IME1 ; IF WILL BE TRO A,N.IMED ; THE MAKE IT MOVEM A,SYSCHR(C) IFN ITS,[ MOVE A,[.CALL TTYIOT]; NON-BUSY WAIT SKIPE NOTTY MOVE A,[.SLEEP A,] ] IFE ITS,[ MOVE A,[PUSHJ P,TNXIN] ] MOVEM A,WAITNS(B) PUSH TP,$TCHSTR PUSH TP,CHQUOTE BLOCKED PUSH TP,$TPVP PUSH TP,PVP MCALL 2,INTERRUPT MOVSI A,TCHAN MOVEM A,BSTO(PVP) MOVE B,(TP) ENABLE REBLK: MOVEI A,-1 ; IN CASE SLEEPING XCT WAITNS(B) ; NOW WAIT JFCL IFE ITS, JRST .-3 IFN ITS, JRST CHRSNR ; SNARF CHAR REBLK1: DISABLE ; FALL THROUG=> UNBLOCKED SETZM BSTO(PVP) POP P,E POP P,0 MOVE B,(TP) SUB TP,[2,,2] POPJ P, CHRSNR: SKIPE NOTTY ; TTY? JRST REBLK ; NO, JUST RESET AND BLOCK .SUSET [.SIFPI,,[1_]] JRST REBLK ; AND GO BACK TTYIOT: SETZ SIXBIT /IOT/ 1000,,TTYIN 0 405000,,20000 ; HERE TO UNBLOCK TTY TTYUNB: MOVE A,WAITNS(B) ; GET INS CAMN A,[JRST REBLK1] JRST TTYUN1 MOVE A,[JRST REBLK1] ; LEAVE THE SLEEP MOVEM A,WAITNS(B) PUSH TP,$TCHAN PUSH TP,B PUSH TP,$TCHSTR PUSH TP,CHQUOTE UNBLOCKED PUSH TP,$TCHAN PUSH TP,B MCALL 2,INTERRUPT MOVE B,(TP) ; RESTORE CHANNEL SUB TP,[2,,2] TTYUN1: POPJ P, IFE ITS,[ ; TENEX BASIC TTY I/O ROUTINE TNXIN: PUSHJ P,MTYI PUSHJ P,INCHAR POPJ P, ] MFUNCTION TTYECHO,SUBR ENTRY 2 GETYP 0,(AB) CAIE 0,TCHAN JRST WTYP1 MOVE A,1(AB) ; GET CHANNEL PUSHJ P,TCHANC ; MAKE SURE IT IS TTY INPUT MOVE E,BUFRIN(A) ; EXTRA INFO BUFFER IFN ITS,[ DOTCAL TTYGET,[CHANNO(A),[2000,,B],[2000,,C],[2000,,0]] FATAL .CALL FAILURE ] IFE ITS,[ MOVEI A,100 ; TTY JFN RFMOD ; MODE IN B TRZ B,6000 ; TURN OFF ECHO ] GETYP D,2(AB) ; ARG 2 CAIE D,TFALSE ; SKIP IF WANT ECHO OFF JRST ECHOON IFN ITS,[ ANDCM B,[606060,,606060] ANDCM C,[606060,,606060] DOTCAL TTYSET,[CHANNO(A),B,C,0] FATAL .CALL FAILURE ] IFE ITS,[ SFMOD ] MOVEI B,N.ECHO+N.CNTL ; SET FLAGS IORM B,SYSCHR(E) JRST CHANRT ECHOON: IFN ITS,[ IOR B,[202020,,202020] IOR C,[202020,,202020] DOTCAL TTYSET,[CHANNO(A),B,C,0] FATAL .CALL FAILURE ] IFE ITS,[ TRO B,4000 SFMOD ] MOVEI A,N.ECHO+N.CNTL ANDCAM A,SYSCHR(E) JRST CHANRT ; USER SUBR FOR INSTANT CHARACTER SNARFING MFUNCTION UTYI,SUBR,TYI ENTRY CAMGE AB,[-3,,] JRST TMA MOVE A,(AB) MOVE B,1(AB) JUMPL AB,.+3 MOVE B,IMQUOTE INCHAN PUSHJ P,IDVAL ; USE INCHAN GETYP 0,A ; GET TYPE CAIE 0,TCHAN JRST WTYP1 LDB 0,[600,,STATUS(B)] CAILE 0,2 JRST WTYP1 SKIPN A,LSTCH(B) ; ANY READ AHEAD CHAR JRST UTYI1 ; NO, SKIP SETZM LSTCH(B) TLZN A,400000 ; ! HACK? JRST UTYI2 ; NO, OK MOVEM A,LSTCH(B) ; YES SAVE MOVEI A,"! ; RET AN ! JRST UTYI2 UTYI1: MOVE 0,IOINS(B) CAME 0,[PUSHJ P,GETCHR] JRST WTYP1 PUSH TP,$TCHAN PUSH TP,B MOVE C,BUFRIN(B) MOVEI D,N.IME1+N.IMED IORM D,SYSCHR(C) ; CLOBBER IT IN DOTCAL TTYGET,[CHANNO(B),[2000,,A],[2000,,D],[2000,,0]] FATAL .CALL FAILURE PUSH P,A PUSH P,0 PUSH P,D ; SAVE THEM IOR D,[030303,,030303] IOR A,[030303,,030303] DOTCAL TTYSET,[CHANNO(B),A,D,0] FATAL .CALL FAILURE MOVNI A,1 SKIPE CHRCNT(C) ; ALREADY SOME? PUSHJ P,INCHAR MOVE C,BUFRIN(B) ; GET BUFFER BACK MOVEI D,N.IME1 IORM D,SYSCHR(C) PUSHJ P,GETCHR MOVE B,1(TB) MOVE C,BUFRIN(B) MOVEI D,N.IME1+N.IMED ANDCAM D,SYSCHR(C) POP P,D POP P,0 POP P,C DOTCAL TTYSET,[CHANNO(B),C,D,0] FATAL .CALL FAILURE UTYI2: MOVEI B,(A) MOVSI A,TCHRS JRST FINIS MFUNCTION IMAGE,SUBR ENTRY JUMPGE AB,TFA ; 1 OR 2 ARGS NEEDED GETYP A,(AB) ;GET THE TYPE OF THE ARG CAIE A,TFIX ;CHECK IT FOR CORRECT TYPE JRST WTYP1 ;WAS WRONG...ERROR EXIT HLRZ 0,AB CAIL 0,-2 JRST USEOTC CAIE 0,-4 JRST TMA GETYP 0,2(AB) CAIE 0,TCHAN JRST WTYP2 MOVE B,3(AB) ; GET CHANNEL IMAGE1: LDB 0,[600,,STATUS(B)] CAILE 0,2 ; MUST BE TTY JRST IMAGFO MOVE 0,IOINS(B) CAMN 0,[PUSHJ P,MTYO] JRST .+3 CAME 0,[PUSHJ P,GMTYO] JRST WRONGD HRRZ 0,IOINS-1(B) JUMPE 0,OPNIMG IMGIOT: MOVE A,1(AB) ;GET VALUE HRLZ 0,CHANNO(B) ASH 0,5 IOR 0,[.IOT A] XCT 0 IMGEXT: MOVE A,(AB) ;RETURN THE ORIGINAL ARG MOVE B,1(AB) JRST FINIS ;EXIT IMAGFO: PUSH TP,$TCHAN ;IMAGE OUTPUT FOR NON TTY PUSH TP,B MOVEI B,DIRECT-1(B) PUSHJ P,CHRWRD JFCL CAME B,[ASCII /PRINT/] CAMN B,[+1] JRST .+2 JRST BADCHN ; CHANNEL COULDNT BE BLESSED MOVE B,(TP) PUSHJ P,GWB ; MAKE SURE CHANNEL HAS BUFFER MOVE A,1(AB) ; GET THE CHARACTER TO DO PUSHJ P,W1CHAR MOVE A,(AB) MOVE B,1(AB) ;RETURN THE FIX JRST FINIS USEOTC: MOVSI A,TATOM MOVE B,IMQUOTE OUTCHAN PUSHJ P,IDVAL GETYP 0,A CAIE 0,TCHAN MOVE B,TTICHN+1(TVP) JRST IMAGE1 OPNIMG: HLLOS IOINS-1(B) CAMN B,TTOCHN+1(TVP) SETOM IMAGFL PUSHJ P,DEVTOC HRLI C,41 ; SUPER IMAGE BIT MOVE A,CHANNO(B) ASH A,23. IOR A,[.OPEN 0,C] XCT A FATAL TTY OPEN LOSSAGE JRST IMGIOT DEVTOC: PUSH P,D PUSH P,E PUSH P,0 PUSH P,A MOVE D,RDEVIC(B) MOVE E,[220600,,C] MOVEI A,3 MOVEI C,0 ILDB 0,D SUBI 0,40 IDPB 0,E SOJG A,.-3 POP P,A POP P,0 POP P,E POP P,D POPJ P, IMGBLK: OUT+IMAGEM+UNIT,,(SIXBIT /TTY/) 0 0 IMPURE IMAGFL: 0 PURE END