1
0
mirror of https://github.com/PDP-10/its.git synced 2026-03-05 11:04:02 +00:00
Files
PDP-10.its/src/mudsys/readch.206
Adam Sampson a7399d0f9a Revert MUDSYS to match Muddle 106 source files.
Looking at the backup dates for files in <mdl.int>, mdl106.exe is from
20th January 1981, whereas some of the source files are from a couple of
years later. Revert to the last version prior to 20th January 1981 -- in
every case, this was the earliest revision that was kept in <mdl.int>.

This undoes the changes that we'd previously made to these files, many
of which are no longer necessary now that we're using MIDAS 73.
2020-08-26 21:26:02 +01:00

1448 lines
25 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
TITLE READCH TELETYPE DEVICE HANDLER FOR MUDDLE
RELOCATABLE
.INSRT MUDDLE >
SYSQ
IF1,[
IFE ITS,.INSRT STENEX >
]
.GLOBAL BUFRIN,CHRCNT,SYSCHR,ECHO,BYTPTR,ERASCH,KILLCH,BRKCH,AGC,CHRWRD,W1CHAR,GWB
.GLOBAL IOIN2,READC,WRONGC,BRFCHR,ESCAP,TTYOPE,MTYI,MTYO,IMTYO,INMTYO,NOTTY,DEMFLG,TTYOP2,OPSYS
.GLOBAL IBLOCK,PVSTOR,SPSTOR
.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,DEMFLG,READ,MAKACT,CITOP,MPOPJ,CIMAGE,GTLPOS,LINPOS
.GLOBAL NTTYPE,CLRSTR
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
CNTLPC==20 ; USE ^P CODE MODE IOT
; OPEN BLOCK MODE BITS
OUT==1
IMAGEM==4
ASCIIM==0
UNIT==0
IFE ITS,[
DP%AG1==200000,,0
DP%AG2==100000,,0
TC%MOV==400000,,0
TC%CLR==40000,,0
.VTUP==3
.VTMOV==7
.VTCLR==15
.VTCEL==17
.VTBEC==21
]
; 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,-1(B) ; COPY PNTR
MOVE C,(P) ; CHAR COUNT
HRLI D,010700
HRLI C,TCHSTR
PUSH TP,$TUVEC
PUSH TP,B
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
POP P,C
SOJG C,.+3
MOVE E,BUFRIN(B)
SETZM BYTPTR+1(E)
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,
; HERE TO ERASE A CHARACTER
BARFC1: PUSHJ P,RUBALT ; CAN WE RUBOUT AN ALTMODE?
JRST BARFCR ; NO, C.R.
JRST ERASAL
ERASE: SKIPN CHRCNT(E) ;ANYTHING IN BUFFER?
JRST BARFC1 ;NO, MAYBE TYPE CR
ERASAL: SOS CHRCNT(E) ;DELETE FROM COUNT
LDB A,D ;RE-GOBBLE LAST CHAR
IFN ITS,[
LDB C,[600,,STATUS(B)] ; CHECK FOR DISPLAY
CAIE C,2 ; SKIP IF IT IS
]
IFE ITS,[
HLRE C,STATUS(B) ; CONTAINS RESULT OF GTTYP
SKIPN DELSTR(C) ; INTERESTING DELETION METHOD?
]
JUMPGE C,TYPCHR ; DELETE BY ECHOING DELETED CHAR
SKIPN ECHO(E) ; SKIP IF ECHOABLE
JRST NECHO
PUSHJ P,CHRTYP ; FOUND OUT DISPLAY BEHAVIOR
SKIPGE C,FIXIM2(C) ; METHOD OF FLUSHING THIS CHARACTER
JRST (C) ; DISPATCH TO FUNNY ONES
NOTFUN: PUSHJ P,DELCHR ; DELETE ONE CHARACTER
SOJG C,.-1 ; AND LOOP UNTIL GOT THEM ALL
; REJOINS HERE TO UPDATE BUFFER POINTER, ETC.
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
; RUB OUT A CHARACTER BY ECHOING IT (NON-DISPLAYS)
TYPCHR: SKIPE C,ECHO(E)
XCT C
JRST NECHO
; SPECIAL HACKS FOR RUBBING OUT ON DISPLAYS
; RUB OUT A LINE FEED
LFKILL: PUSHJ P,LNSTRV
JRST NECHO
LNSTRV: PUSH P,0 ; STORE USEFUL DATA
IFN ITS,[
TLO 0,CNTLPC ; SWITCH ON TEMPORARY ^P MODE
MOVEI A,20 ; ^P
XCT ECHO(E)
MOVEI A,"U ; U , MOVE UP ONE LINE
XCT ECHO(E)
]
IFE ITS,[
PUSH P,B
MOVE B,TTOCHN+1
HLRE A,STATUS(B) ; terminal type
JUMPGE A,UPCRF
MOVE A,1(B) ; DISPLAY IN VTS MODE
MOVEI B,.VTUP
VTSOP
JRST UPCXIT
UPCRF: PUSHJ P,GETPOS ; HERE FOR DISPLAY STUFF IN IMAGE MODE
SOS LINPOS(B)
PUSHJ P,SETPOS
UPCXIT: POP P,B
]
POP P,0 ; RESTORE USEFUL DATA
POPJ P,
; RUB OUT A BACK SPACE
BSKILL: PUSHJ P,GETPOS ; CURRENT POSITION TO A
PUSHJ P,SETPOS ; POSITION DISPLAY CURSOR
PUSH P,0 ; STORE USEFUL DATA
IFN ITS,[
TLO 0,CNTLPC ; SWITCH ON TEMPORARY ^P MODE
MOVEI A,20 ; ^P
XCT ECHO(E)
MOVEI A,"L ; L , DELETE TO END OF LINE
XCT ECHO(E)
]
IFE ITS,[
HLRE A,STATUS(B)
JUMPGE A,CLECRF
PUSH P,B
MOVE A,1(B)
MOVEI B,.VTCEL
VTSOP
POP P,B
JRST CLEXIT
CLECRF: MOVEI 0,EOLSTR(A)
PUSHJ P,STBOUT
]
CLEXIT: POP P,0 ; RESTORE USEFUL DATA
JRST NECHO
; RUB OUT A TAB
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
; ROUTINE TO DEL CHAR ON DISPLAY
DELCHR: PUSH P,0 ; STORE USEFUL DATA
IFN ITS,[
TLO 0,CNTLPC ; SWITCH ON TEMPORARY ^P MODE
MOVEI A,20
XCT ECHO(E)
MOVEI A,"X
XCT ECHO(E)
]
IFE ITS,[
HLRE A,STATUS(B)
JUMPGE A,DELCRF
PUSH P,B
MOVE A,1(B)
MOVEI B,.VTBEC ;BACKSPACE AND ERASE
VTSOP
POP P,B
JRST DELXIT
DELCRF: MOVEI 0,DELSTR(A)
PUSHJ P,STBOUT
]
DELXIT: POP P,0 ;RESTORE USEFUL DATA
POPJ P,
; DELETE FOUR-CHARACTER LOSSAGES
FOURQ: PUSH P,CNOTFU
FOURQ2: MOVEI C,2 ; FOR ^Z AND ^_
CAMN B,TTICHN+1 ; SKIP IF NOT CONSOLE TTY
MOVEI C,4
CNOTFU: POPJ P,NOTFUN
; HERE IF KILLING A C.R., RE-POSITION CURSOR
CRKILL: PUSHJ P,GETPOS ; COMPUTE LINE POS
PUSHJ P,SETPOS
JRST NECHO
; HERE TO SET CURRENT CURSOR POSITION, USUALLY TO END OF LINE
; A/ POSITION TO GO TO
SETPOS: PUSH P,0 ; STORE USEFUL DATA
IFN ITS,[
TLO 0,CNTLPC ; SWITCH ON TEMPORARY ^P MODE
PUSH P,A ; SAVE POS
MOVEI A,20
XCT ECHO(E)
MOVEI A,"H
XCT ECHO(E)
POP P,A
ADDI A,10 ; MINIMUM CURSOR POS
XCT ECHO(E) ; HORIZ POSIT AT END OF LINE
]
IFE ITS,[
HLRE 0,STATUS(B)
JUMPGE ABPCRF
PUSH P,B ; VTS ABSOLUTE POSITIONING
PUSH P,C
PUSH P,A
PUSHJ P,GTLPOS
HRL C,A ; LINE NUMBER
POP P,A
HRR C,A ; COLUMN NUMBER
MOVE A,1(B)
MOVEI B,.VTMOV
HRLI B,(DP%AG1+DP%AG2)
VTSOP
POP P,C
POP P,B
JRST ABPXIT
ABPCRF: ADD 0,[SETZ POSTAB]
XCT @0 ; ROUTINES FOR ABSOLUTE POSITIONING (UGH)
]
ABPXIT: POP P,0 ; RESTORE USEFUL DATA
POPJ P,
; HERE TO CALCULATE CURRENT CURSOR POSITION
; RETURNS A/ CURSOR POS (CORRESPONDS TO EOL, TOO)
GETPOS: PUSH P,0
MOVEI 0,0 ; COUNT OF CHARACTER POSITIONS
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,0 ; 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,
; FIGURE OUT HOW MANY CHARACTER POSITIONS A CHARACTER TAKES
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,
; TABLE OF HOW MANY OR HOW TO FIND OUT
FIXIM2: 1
2
SETZ FOURQ
SETZ CRKILL
SETZ LFKILL
SETZ BSKILL
SETZ TBKILL
; TABLE OF WHAT TO ADD TO HPOS ON ENCOUNTERING CHARACTER
FIXIM3: MOVEI C,1
MOVEI C,2
PUSHJ P,FOURQ2
MOVEI C,0
MOVEI C,0
MOVNI C,1
PUSHJ P,CNTTAB
; HORRIBLE KLUDGE TO COUNT SPACES FOR A TAB
CNTTAB: ANDCMI 0,7 ; GET COUNT INCUDING TAB HACK
ADDI 0,10
MOVEI C,0
POPJ P,
; TYPE TABLE FOR EACH CONTROL CHARACTER
FIXIML: 111111,,115641 ; CNTL @ABCDE,,FGHIJK
131111,,111111 ; LMNOPQ,,RSTUVW
112011,,120000 ; XYZ LBRAK \ RBRAK,,^ _
; HERE TO KILL THE WHOLE BUFFER
KILL: PUSHJ P,RUBALT ; COULD WE RUB OUT ALT MODE
JFCL
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
; SKIP IF CAN RUB OUT AN ALTMODE
RUBALT: PUSH TP,$TCHAN
PUSH TP,B
HRRZ A,FSAV(TB) ; ARE WE IN READ ?
CAIE A,READ
JRST RUBAL1
MOVEI A,(TP)
SUBI A,(TB)
IFN ITS,CAIG A,53 ; SOMEWHAT HEURISTIC (WATCH OUT IN NEW VERSIONS!!!!!!)
IFE ITS,CAIG A,17
JRST RUBAL1
HRRZ A,BUFSTR-1(B) ; IS BUFFER OF SAME RUN OUT?
JUMPN A,RUBAL1 ; NO
MOVE B,IMQUOTE INCHAN
PUSHJ P,IDVAL ; REALLY CHECK IT OUT
MOVE C,(TP)
CAME C,B
JRST RUBAL1
MOVE A,BUFSTR-1(B)
MOVE B,BUFSTR(B)
PUSHJ P,CITOP
ANDI A,-1
MOVE D,[10700,,BYTPTR(E)]
MOVE E,(TP)
MOVE E,BUFRIN(E)
MOVEM A,CHRCNT(E)
; CHECK WINNAGE OF BUFFER
ILDB 0,D
ILDB C,B
CAIE 0,(C)
JRST RUBAL1
SOJG A,.-4
MOVE B,(TP)
MOVEM D,BYTPTR(E)
MOVE A,[JRST RETREA]
MOVEM A,WAITNS(B)
AOS (P)
SUB TP,[2,,2]
POPJ P,
RUBAL1: MOVE B,(TP)
MOVE D,[010700,,BYTPTR(E)]
SETZM CHRCNT(E)
SUB TP,[2,,2]
POPJ P,
RETREA: PUSHJ P,MAKACT
HRLI A,TFRAME
PUSH TP,A
PUSH TP,B
MCALL 1,RETRY
JRST TTYBLK
; HERE TO CLEAR SCREEN AND RETYPE BUFFER
CLEARQ:
IFN ITS,[
MOVE A,STATUS(B) ; FIGURE OUT CONSOLE TYPE
ANDI A,77
CAIN A,2 ; DISPLAY?
]
IFE ITS,[
HLRE A,STATUS(B)
SKIPE CLRSTR(A) ; TRY IT ONLY ON DISPLAYS
]
PUSHJ P,CLR ; CLEAR SCREEN
; HERE TO RETYPE BUFFER
BRF: MOVE C,[010700,,BYTPTR(E)] ;POINT TO START OF BUFFER
SKIPN ECHO(E) ;ANY ECHO INS?
JRST NECHO
IFE ITS,PUSH P,B
MOVE B,TTOCHN+1
PUSHJ P,CRLF2
IFE ITS,AOS LINPOS(B)
PUSH P,CHRCNT(E)
BRF1: SOSGE (P)
JRST DECHO
ILDB A,C ;GOBBLE CHAR
XCT ECHO(E) ;ECHO IT
IFE ITS,[
CAIN A,12
AOS LINPOS(B)
]
JRST BRF1 ;DO FOR ENTIRE BUFFER
DECHO: SUB P,[1,,1]
IFE ITS,POP P,B
JRST INCHR3
; 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,
; CLEAR SCREEN
CLR: SKIPN C,ECHO(E) ;ONLY IF INS EXISTS
POPJ P,
PUSH P,0
IFN ITS,[
TLO 0,CNTLPC ;SWITCH ON TEMPORARY ^P MODE
MOVEI A,20 ;ERASE SCREEN
XCT C
MOVEI A,103
XCT C
]
IFE ITS,[
JUMPGE A,CLRCRF
PUSH P,B
MOVE A,1(B)
MOVEI B,.VTCLR
VTSOP
POP P,B
JRST CLRXIT
CLRCRF: MOVEI 0,CLRSTR(A)
PUSHJ P,STBOUT
PUSH P,B
MOVE B,TTOCHN+1
SETZM LINPOS(B)
POP P,B
]
CLRXIT: POP P,0 ;RESTORE USEFUL DATA
POPJ P,
IFE ITS,[
STBOUT: PUSH P,B
SKIPE IMAGFL
JRST STBOU1
MOVE A,1(B)
HRRZ B,STATUS(B)
TRZ B,300
SFMOD
STBOU1: HRLI 0,440700
ILDB A,0
JUMPE A,STBOUX
PBOUT
JRST .-3
STBOUX: SKIPE IMAGFL
JRST STBOU2
MOVE B,(P)
MOVE A,1(B)
HRRZ B,STATUS(B)
SFMOD
STBOU2: POP P,B
POPJ P,
; SPECIAL CASE GOODIES FOR DISPLAY TERMINALS
NTTYPE==40 ; MAX TERMINAL TYPES SUPPORTED
; HOW TO CLEAR SCREENS ON TOPS-20/TENEX
CLRSTR: 0
0
0
0
ASCII // ; ITS SOFTWARE
ASCII // ; DATAMEDIA
ASCII /HJ/ ; HP2640
0
0
0
0
ASCII /HJ/ ; VT50
0
ASCII /(/ ; GT40
0
ASCII /HJ/ ; VT52
0
0
ASCII /HJ/ ; VT100
ASCII /HJ/ ; TELERAY
ASCII /HJ/ ; H19
0
0
0
0
0
0
0
0
0
0
0
IFN <.-CLRSTR>-NTTYPE,PRINTC /ERROR -- CLEAR SCREEN TABLE LOSES
/
; HOW TO RUB OUT ON VARIOUS TERMINALS
DELSTR: 0
0
0
0
ASCII / / ; ITS SOFTWARE DISPLAY
0
ASCII /DK/ ; HP2640
0
0
0
0
ASCII /DK/ ; VT50
0
0
0
ASCII /DK/ ; VT52
0
0
ASCII /DK/ ; VT100
ASCII /DK/ ; TELERAY
ASCII /DK/ ; H19
0
0
0
0
0
0
0
0
0
0
0
IFN <.-DELSTR>-NTTYPE,PRINTC /ERROR -- DELETE TABLE LOSES
/
; CLEAR TO EOL
EOLSTR: 0
0
0
0
ASCII // ; ITS SOFTWARE DISPLAY
0
ASCII /K/ ; HP2640
0
0
0
0
ASCII /K/ ; VT50
0
0
0
ASCII /K/ ; VT52
0
0
ASCII /K/ ; VT100
ASCII /K/ ; TELERAY
ASCII /K/ ; H19
0
0
0
0
0
0
0
0
0
0
0
IFN <.-EOLSTR>-NTTYPE,PRINTC /ERROR -- END OF LINE TABLE LOSES
/
POSTAB: JFCL
JFCL
JFCL
JFCL
PUSHJ P,PSOFT ; ITS SOFTWARE
JFCL
PUSHJ P,PVT52 ; HP2640
JFCL
JFCL
JFCL
JFCL
PUSHJ P,PVT52 ; VT50
JFCL
JFCL
JFCL
PUSHJ P,PVT52 ; VT52
JFCL
JFCL
PUSHJ P,PVT52 ; VT100
PUSHJ P,PVT52 ; TELERAY
PUSHJ P,PVT52 ; H19
JFCL
JFCL
JFCL
JFCL
JFCL
JFCL
JFCL
JFCL
JFCL
JFCL
JFCL
IFN <.-POSTAB>-NTTYPE,PRINTC /ERROR -- ABSOLUTE POSITION TABLE LOSES
/
; ROUTINES FOR ABSOLUTE POSITIONING ON TENEX/TOPS-20
PSOFT: PUSH P,A
PUSHJ P,TNXIMG
MOVEI A,177
XCT ECHO(E)
MOVEI A,21
XCT ECHO(E)
PUSHJ P,GTLPOS
XCT ECHO(E)
POP P,A
XCT ECHO(E)
PUSHJ P,TNXASC
POPJ P,
PVT52: PUSH P,A
PUSHJ P,TNXIMG
MOVEI A,33
XCT ECHO(E)
MOVEI A,"Y
XCT ECHO(E)
PUSHJ P,GTLPOS
ADDI A,40 ; MUDDLE PAGES START AT 0, VT52 AT 1
XCT ECHO(E)
POP P,A
ADDI A,40 ; DITTO COLUMNS
XCT ECHO(E)
PUSHJ P,TNXASC
POPJ P,
TNXIMG: PUSH P,B
MOVE A,1(B)
MOVE B,STATUS(B)
TRZ B,300
SFMOD
POP P,B
POPJ P,
TNXASC: PUSH P,B
MOVE A,1(B)
HRRZ B,STATUS(B)
SFMOD
POP P,B
POPJ P,
]
PUTCHR: AOS CHRCNT(E) ;COUNT THIS CHARACTER
IBP D ;BUMP BYTE POINTER
IFE ITS,[
HRRZ C,D
ADDI C,(E)
CAIG 0,(C) ;DONT SKIP IF BUFFER FULL
]
IFN ITS, 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
IFE ITS,[
POPJ P,
]
IFN ITS,[
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: MOVEM D,BYTPTR(E)
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
MOVE E,BUFRIN(B)
POP P,A
MOVE D,BYTPTR(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
IFN ITS,[
SETZM CHNCNT(D) ; FLUSH COUNTERS
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
IFN ITS,[
LDB C,[600,,STATUS(A)] ;GET A CODE
CAILE C,2 ;MAKE SURE A TTY FLAVOR DEVICE
JRST WRONGC
POPJ P,
]
IFE ITS,[
PUSH P,A
MOVE A,1(A)
DVCHR
LDB A,[221100,,B] ;DEVICE TYPE FIELD
CAIE A,12 ;TTY
CAIN A,13 ;PTY
SKIPA
JRST WRONGC ;NOT A TTY, HOPE WE DON'T GET HERE IN LISTEN
POP P,A
POPJ P,
]
; TTY OPEN
IFE ITS,[
TTYOPEN:
TTYOP2: SKIPE DEMFLG
POPJ P,
MOVE C,TTOCHN+1
HLLZS IOINS-1(C)
SETZM IMAGFL ; UNFORTUNATELY SFMOD CLOBBERS IMAGENESS
MOVEI A,-1 ; TERMINAL; STAYS HERE THROUGHOUT ROUTINE
MOVEI 2,175100 ; MAGIC BITS (SEE TENEX MANUAL)
SFMOD ; ZAP
RFMOD ; LETS FIND SCREEN SIZE
MOVEM B,STATUS(C)
LDB B,[220700,,B] ; GET PAGE WIDTH
JUMPG B,.+2
MOVEI B,80. ; MUST BE VIRTUAL, SO MAKE IT 80.
MOVEM B,LINLN(C)
LDB B,[310700,,STATUS(C)] ; AND LENGTH
MOVEM B,PAGLN(C)
SKIPE OPSYS ; CHECK FOR TOPS-20
JRST NONVTS ; ONLY TOPS-20 CAN HAVE VTS
RTCHR
ERJMP NONVTS ; NO RTCHR JSYS, HENCE NO VTS
TLNN B,(TC%MOV+TC%CLR) ; HAS MINIMAL CHARACTERISTICS?
JRST NONVTS ; NO GOOD ENOUGH FOR US
MOVNI B,1 ; TERMINAL TYPE -1 IS VTS DISPLAY
JRST HASVTS ; WINS
NONVTS: PUSH P,C ; IDIOT GETTYP CLOBBERS C
GTTYP ; FIND TERMINAL TYPE
POP P,C
HASVTS: HRLM B,STATUS(C) ; USED TO FIGURE OUT DISPLAY STUFF
MOVE B,STATUS(C)
MOVE C,TTICHN+1
MOVEM B,STATUS(C) ; SET UP INCHAN TOO
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,
DOTCAL OPEN,[[1000,,TTYIN],[[SIXBIT /TTY /]]]
JRST TTYNO
DOTCAL OPEN,[[1000,,TTYOUT],[[SIXBIT /TTY /]],[5000,,1]]
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 ;GET CHANNEL
MOVEI C,TTYIN ;GET ITS CHAN #
MOVEM C,CHANNO(B)
.STATUS TTYIN,STATUS(B) ;CLOBBER STATUS
MOVE B,TTOCHN+1 ;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,
]
GTLPOS:
IFN ITS,[
DOTCAL RCPOS,[[CHANNO(B)],[2000,,A]]
JFCL
HLRZS A
POPJ P,
]
IFE ITS,[
PUSH P,B
MOVE B,TTOCHN+1
HLRE A,STATUS(B)
JUMPGE A,GETCRF
MOVE A,1(B)
RFPOS
HLRZ A,B
SKIPA
GETCRF: MOVE A,LINPOS(B)
POP P,B
POPJ P,
]
MTYI: SKIPN DEMFLG ; SKIP IF DEMON
SKIPE NOTTY ; SKIP IF HAVE TTY
FATAL TRIED TO USE NON-EXISTANT TTY
; TRY TO AVOID HANGING IN .IOT TO TTY
IFN ITS,[
DOTCAL IOT,[[1000,,TTYIN],[A],[5000,,1000]]
JFCL
]
IFE ITS,[
SKIPN IMAGFL
JRST MTYI1
PUSH P,B
PUSHJ P,MTYO1
POP P,B
MTYI1: PBIN
]
POPJ P,
INMTYO: ; BOTH ARE INTERRUPTABLE
MTYO: ENABLE
PUSHJ P,IMTYO
DISABLE
POPJ P,
; NON-INTERRUPTABLE VERSION, FOR ECHO INSTRUCTION AND SUCHLIKE
IMTYO: SKIPE NOTTY
POPJ P, ; IGNORE, DONT HAVE TTY
IFE ITS,[
SKIPE IMAGFL ;SKIP RE-OPENING IF ALREADY IN ASCII
PUSHJ P,MTYO1 ;WAS IN IMAGE...RE-OPEN
]
IFN ITS,[
CAIN A,177 ;DONT OUTPUT A DELETE
POPJ P,
PUSH P,B
MOVEI B,0 ; SETUP CONTROL BITS
TLNE 0,CNTLPC ; SKIP IF ^P MODE SWITCH IS OFF
MOVEI B,%TJDIS ; SWITCH ON TEMPORARY ^P MODE
DOTCAL IOT,[[1000,,TTYOUT],[A],[4000,,B]]
JFCL
POP P,B
]
IFE ITS, PBOUT
POPJ P,
MTYO1: MOVE B,TTOCHN+1
PUSH P,0
PUSHJ P,REASCI
POP P,0
POPJ P,
; HERE FOR TYO TO ANY TTY FLAVOR DEVICE
GMTYO: PUSH P,0
IFE ITS,[
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
IFE ITS,[
PUSH P,B
MOVE A,1(B)
RFMOD
TRO B,102
SFMOD
STPAR
POP P,B ]
POP P,C
POP P,A
HLLZS IOINS-1(B)
CAMN B,TTOCHN+1
SETZM IMAGFL
POPJ P,
WRONGC: ERRUUO EQUOTE NOT-A-TTY-TYPE-CHANNEL
; 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 (IF CHAR READ, LEAVE IN BUFFER
; TO LET IT BE READ AT INTERRUPT LEVEL)
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,PVSTOR+1
MCALL 2,INTERRUPT
MOVSI A,TCHAN
MOVE PVP,PVSTOR+1
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
MOVE PVP,PVSTOR+1
SETZM BSTO(PVP)
POP P,E
POP P,0
MOVE B,(TP)
SUB TP,[2,,2]
POPJ P,
CHRSNR: SKIPN DEMFLG ; SKIP IF DEMON
SKIPE NOTTY ; TTY?
JRST REBLK ; NO, JUST RESET AND BLOCK
.SUSET [.SIFPI,,[1_<TTYIN>]]
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,,200020]
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
IFN ITS,[
LDB 0,[600,,STATUS(B)]
CAILE 0,2
JRST WTYP1
SKIPN A,LSTCH(B) ; ANY READ AHEAD CHAR
JRST UTYI1 ; NO, SKIP
ANDI A,-1
SETZM LSTCH(B)
TLZN A,400000 ; ! HACK?
JRST UTYI2 ; NO, OK
HRRM 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) ]
IFE ITS,[
MOVE A,1(B) ;GET JFN FOR INPUT
ENABLE
BIN ;SNARF A CHARACTER
DISABLE
]
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: MOVE A,1(AB)
PUSHJ P,CIMAGE
JRST FINIS
CIMAGE: SUBM M,(P)
IFN ITS,[
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 ]
IFE ITS,[
MOVE 0,CHANNO(B) ; SEE IF TTY
CAIE 0,101
JRST IMAGFO
]
IFN ITS,[
DOTCAL IOT,[[5000,,2000],[CHANNO(B)],[A]]
JFCL
MOVE B,A
]
IFE ITS,[
MOVE B,CHANNO(B)
EXCH A,B
MOVE 0,B
RFMOD
PUSH P,B
TRZ B,300
SFMOD
STPAR
IMGIOT:
MOVE B,0
BOUT
POP P,B
SFMOD
STPAR
MOVE B,0
]
IMGEXT: MOVSI A,TFIX
JRST MPOPJ
IMAGFO: PUSH TP,$TCHAN ;IMAGE OUTPUT FOR NON TTY
PUSH TP,B
PUSH P,A
HRRZ 0,-2(B) ; GET BITS
TRC 0,C.OPN+C.PRIN
TRNE 0,C.OPN+C.PRIN
JRST BADCHN
MOVE B,(TP)
PUSHJ P,GWB ; MAKE SURE CHANNEL HAS BUFFER
MOVE A,(P) ; GET THE CHARACTER TO DO
PUSHJ P,W1CHAR
POP P,B
MOVSI A,TFIX
SUB TP,[2,,2]
JRST MPOPJ
USEOTC: MOVSI A,TATOM
MOVE B,IMQUOTE OUTCHAN
PUSHJ P,IDVAL
GETYP 0,A
CAIE 0,TCHAN
MOVE B,TTOCHN+1
MOVE A,1(B)
JRST IMAGE1
IFE ITS,[
OPNIMG: MOVE E,A ; SAVE CHAR
MOVE D,B
MOVE A,1(B) ;GET JFN OUT OF CHANNEL
RFMOD ;GET THE MAGIC BITS
TRZ B,302
SFMOD ; MAKE IMAGE AND PUT BITS IN CHANNEL
STPAR
MOVE B,E
HLLOS IOINS-1(D)
CAMN D,TTOCHN+1
SETOM IMAGFL
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