ITS Muddle.
[pdp10-muddle.git] / MUDDLE / readch.10
1
2 TITLE READC TELETYPE DEVICE HANDLER FOR MUDDLE
3
4 RELOCATABLE
5
6 .INSRT MUDDLE >
7
8 .GLOBAL BUFRIN,CHRCNT,SYSCHR,ECHO,BYTPTR,ERASCH,KILLCH,BRKCH,AGC
9 .GLOBAL IOIN2,READC,WRONGT,WRONGD,WRONGC,CALER1,BRFCHR,ESCAP,TTYOPE,TYI,TYO
10 .GLOBAL RRESET,TTICHN,TTOCHN,CHANNO,STATUS
11
12 TTYOUT==1
13 TTYIN==2
14
15
16 ; READC IS CALLED BY PUSHJ P,READC
17 ; B POINTS TO A TTY FLAVOR CHANNEL
18 ; ONE CHARACTER IS RETURNED IN  A
19 ; BECOMES INTERRUPTABLE IF NO CHARACTERS EXISTS
20
21 READC:  PUSH    P,E             ;SAVE E FROM DEATH
22         MOVE    E,BUFRIN(B)     ;GOBBLE POINTER TO BUFFER AND INFO
23         SOSGE   CHRCNT(E)       ;ANY CHARS LEFT?
24         PUSHJ   P,INCHAR        ;NO, GO READ SOME
25         ILDB    A,BYTPTR(E)     ;GOBBLE ONE
26         POP     P,E             ;RESTORE E
27         POPJ    P,
28
29 ; HERE TO ASK SYSTEM FOR SOME CHARACTERS
30
31 INCHAR: IRP     A,,[0,C,D]      ;SAVE ACS
32         PUSH    P,A
33         TERMIN
34         CLEARM  CHRCNT(E)       ;NO CHARS IN BUFFER
35         MOVE    D,[010700,,BYTPTR(E)]   ;MAKE A BYTE POINTER TO START OF BUFFER
36         HLRE    0,E             ;FIND END OF BUFFER
37         SUBM    E,0
38         ANDI    0,-1            ;ISOLATE RH
39
40 INCHR1: PUSHJ   P,GETCH         ;GET A CHARACTER
41         CAMN    A,ESCAP(E)              ;ESCAPE CHAR?
42         JRST    DOESCP
43         CAMN    A,BRFCHR(E)             ;BUFFER PRINT CHAR
44         JRST    CLEARQ          ;MAYBE CLEAR SCREEN
45         CAMN    A,BRKCH(E)      ;IS THIS A BREAK?
46         JRST    DONE            ;YES, DONE
47         CAMN    A,ERASCH(E)     ;ARE IS IT ERASE?
48         JRST    ERASE           ;YES, GO PROCESS
49         CAMN    A,KILLCH(E)     ;OR KILL
50         JRST    KILL
51
52 INCHR2: PUSHJ   P,PUTCHR        ;PUT ACHAR IN BUFFER
53         JRST    INCHR1
54
55 DONE:   IDPB    A,D             ;STORE 
56         MOVE    D,[010700,,BYTPTR(E)]   ;RESET BYTER
57         MOVEM   D,BYTPTR(E)
58         IRP     A,,[D,C,0]
59         POP     P,A
60         TERMIN
61         POPJ    P,
62
63
64 ERASE:  SUBI    A,177           ;IS THE ERASE RUBOUT
65         SKIPN   CHRCNT(E)       ;ANYTHING IN BUFFER?
66         JRST    BARFCR  ;NO, MAYBE TYPE CR
67
68         SOS     CHRCNT(E)       ;DELETE FROM COUNT
69         JUMPN   A,NECHO ;DONT ECHO IF ERASE OTHER THAN RUBOUT
70         LDB     A,D             ;RE-GOBBLE LAST CHAR
71         SKIPE   C,ECHO(E)       ;DOES AN ECHO INS EXIST?
72         XCT     C               ;YES, ECHO
73
74 NECHO:  ADD     D,[70000,,0]    ;DECREMENT BYTE POINTER
75         JUMPGE  D,INCHR1        ;AND GO ON, UNLESS BYTE POINTER LOST
76         SUB     D,[430000,,1]   ;FIX UP BYTE POINTER
77         JRST    INCHR1
78
79 ; HERE TO KILL THE WHOLE BUFFER
80
81 KILL:   CLEARM  CHRCNT(E)       ;NONE LEFT NOW
82         MOVE    D,[010700,,BYTPTR(E)]   ;RESET POINTER
83
84 BARFCR: MOVE    A,ERASCH(E)     ;GET THE ERASE CHAR
85         CAIE    A,177           ;IS IT RUBOUT?
86         JRST    INCHR1          ;NO, DO NOT TYPE A CR
87         MOVEI   A,15                    ;GET THE CR
88         SKIPE   C,ECHO(E)       ;ECHO INS IN C
89         XCT     C
90         JRST    INCHR1
91
92 DOESCP: PUSHJ   P,PUTCHR        ;PUT INTO BUFFER
93         PUSHJ   P,GETCH         ;GET NEXT ONE
94         JRST    INCHR2  ;INSERT IT AND GO ON
95
96 CLEARQ: MOVEI   A,0             ;INSERT A NULL CHAR
97         IDPB    A,D             ;DEPOSIT A 0 TERMINATOR
98         MOVE    A,STATUS(B)     ;CHECK CONSOLE KIND
99         ANDI    A,77
100         CAIN    A,2             ;DATAPOINT?
101         PUSHJ   P,CLR           ;YES, CLEAR SCREEN
102         MOVEI   A,15            ;C.R.
103         MOVE    C,[010700,,BYTPTR(E)]   ;POINT TO START OF BUFFER
104         SKIPN   ECHO(E)         ;ANY ECHO INS?
105         JRST    NECHO
106
107         XCT     ECHO(E) ;WRITE OUT C.R.
108
109         ILDB    A,C                     ;GOBBLE CHAR
110         JUMPE   A,NECHO
111         XCT     ECHO(E)         ;ECHO IT
112         JRST    .-3             ;DO FOR ENTIRE BUFFER
113
114 CLR:    SKIPN   C,ECHO(E)       ;ONLY IF INS EXISTS
115         POPJ    P,
116         MOVEI   A,20            ;ERASE SCREEN
117         XCT     C
118         MOVEI   A,103
119         XCT     C
120         POPJ    P,
121
122 PUTCHR: AOS     CHRCNT(E)       ;COUNT THIS CHARACTER
123         IBP     D               ;BUMP BYTE POINTER
124         CAIG    0,@D            ;DONT SKIP IF BUFFER FULL
125         PUSHJ   P,BUFULL                ;GROW BUFFER
126         DPB     A,D             ;CLOBBER BYTE POINTER IN
127         POPJ    P,
128
129 ; BUFFER FULL, GROW THE BUFFER
130
131 BUFULL: MOVEI   E,1000          ;GET GROWTH SPECS
132         HRRM    E,@0
133         PUSH    TP,$TCHAN       ;SAVE B
134         PUSH    TP,B
135         PUSHJ   P,AGC           ;GROW THE VECTOR
136         MOVE    B,(TP)          ;RESTORE CHANNEL POINTER
137         SUB     TP,[2,,2]       ;AND REMOVE CRUFT
138         MOVE    E,BUFRIN(B)     ;GET AUX BUFFER POINTER
139         HLRE    0,E             ;RECOMPUTE 0
140         SUBM    E,0
141         ANDI    0,-1
142         POPJ    P,
143
144 GETCH:  SOSGE   C,SYSCHR(E)     ;ANY CHARS IN SYSTEM?
145         JRST    ENBL            ;NO, ENABLE INTERRUPTS
146         XCT     IOIN2(E)        ;YES, GOBBLE ONE
147         POPJ    P,              ;AND RETURN
148
149 ENBL:   MOVSI   A,TCHAN         ;SET A'S TYPE
150         MOVEM   A,BSTO(PVP)
151         ENABLE                  ;ENABLE INTERRUPTS
152         XCT     IOIN2(E)
153         DISABLE                 ;GOT A CHARACTER, DISABLE INTERRUPTS
154         SETZM   BSTO(PVP)
155         POPJ    P,
156
157 ; SUBROUTINE TO FLUSH BUFFER
158
159 RRESET: MOVE    E,BUFRIN(B)             ;GET AUX BUFFER
160         SETZM   CHRCNT(E)
161         SETZM   SYSCHR(E)
162         MOVE    D,[010700,,BYTPTR(E)]   ;RESET BYTE POINTER
163         MOVEM   D,BYTPTR(E)
164         MOVE    D,CHANNO(B)     ;GOBBLE CHANNEL
165         LSH     D,23.           ;POSITION
166         IOR     D,[.RESET 0]
167         XCT     D               ;RESET ITS CHANNEL
168         POPJ    P,
169
170 ; SUBROUTINE TO ESTABLISH ECHO IOINS
171
172 MFUNCTION ECHOPAIR,SUBR
173
174         ENTRY   2
175
176         HLRZ    A,(AB)          ;CHECK ARG TYPES
177         HLRZ    C,(AB)
178         CAIN    A,TCHAN         ;IS A CHANNEL
179         CAIE    C,TCHAN         ;IS C ALSO
180         JRST    WRONGT          ;NO, ONE OF THEM LOSES
181
182         MOVE    A,1(AB)         ;GET CHANNEL
183         MOVE    B,DIRECT(A)     ;GET DIRECTION
184         CAME    B,CHQUOTE READ
185         JRST    WRONGD
186         LDB     C,[600,,STATUS(A)]      ;GET A CODE
187         CAILE   C,2             ;MAKE SURE A TTY FLAVOR DEVICE
188         JRST    WRONGC
189         MOVE    D,3(AB)         ;GET OTHER CHANNEL
190         MOVE    E,DIRECT(D)     ;AND ITS DIRECTION
191         CAME    E,CHQUOTE PRINT
192         JRST    WRONGD
193
194         MOVE    B,BUFRIN(A)     ;GET A'S AUX BUFFER
195         MOVE    C,IOINS(D)      ;AND C'S IO INS
196         MOVEM   C,ECHO(B)               ;CLOBBER
197         MOVE    A,(AB)
198         MOVE    B,1(AB)         ;RETURN 1ST ARG
199         JRST FINIS
200
201 TTYOPEN:        .OPEN   TTYIN,[SIXBIT /   TTY/]
202         .VALUE
203         .OPEN   TTYOUT,[SIXBIT /  !TTY/]        ;AND OUTPUT
204         .VALUE
205         .STATUS TTYOUT,A                ;CHECK IT OUT
206         ANDI    A,77            ;GET DEVICE
207         CAIE    A,2             ;IF 2, CAN OPEN IN DISPLAY MODE
208         JRST    SETCHN
209         .CLOSE  TTYOUT,
210         .OPEN   TTYOUT,[21,,(SIXBIT /TTY/)]
211         .VALUE
212         
213 SETCHN: MOVE    B,TTICHN+1(TVP) ;GET CHANNEL
214         MOVEI   A,TTYIN         ;GET ITS CHAN #
215         MOVEM   A,CHANNO(B)
216         .STATUS TTYIN,STATUS(B) ;CLOBBER STATUS
217
218         MOVE    B,TTOCHN+1(TVP) ;GET OUT CHAN
219         MOVEI   A,TTYOUT
220         MOVEM   A,CHANNO(B)
221         .STATUS TTYOUT,STATUS(B)
222         POPJ    P,
223
224 TYI:    .IOT    TTYIN,A
225         POPJ    P,
226
227 TYO:    .IOT    TTYOUT,A
228         POPJ    P,
229
230
231 WRONGD: PUSH    TP,$TATOM
232         PUSH    TP,MQUOTE WROND-DIRECTION-CHANNEL
233         JRST    CALER1
234
235 WRONGC: PUSH    TP,$TATOM
236         PUSH    TP,MQUOTE NOT-A-TTY-TYPE-CHANNEL
237         JRST    CALER1
238
239 END
240 \f\ 3\f