1 TITLE SCNSER - SCANNER SERVICE
\r
2 SUBTTL TOM EGGERS 8-9-65
\r
3 EXTERN SETIOD, ADVBFE, ADVBFF, JBTADR, CLRBYT,STTYB1
\r
4 EXTERN SCNCHN, COMCNT, SCNSAV, SCNRET,STOP1, DEVLST,TTYTAB
\r
10 PION=200 ;TURN PI ON BIT
\r
11 PIOFF=400 ;TURN PI OFF BIT
\r
12 ;SCNDDB ;NUMBER OF DEVICE DATA BLOCKS
\r
13 ;STTYBF7 ;SIZE OF TELETYPE BUFFER
\r
14 CHREC=TEM ;AC FOR CHARACTER
\r
15 VPOS=ITEM ;VERITICAL POSITION OF TELETYPE
\r
16 HPOS=VPOS+1 ; HORIZONTAL POS.
\r
18 LINE=TAC1 ;AC THAT HOLDS SCANNER LINE NUMBER
\r
19 SYNC=40000 ;1 WHEN A BUFFER IS READY TO TRANSFER
\r
20 DETH=10000 ;1 IF TTY DETACHED AND OUTPUT WAITING
\r
21 NIO=20000 ;STOP ALL IO
\r
22 TOUT=IO ;OUTPUT IN PROGRESS
\r
23 NCERR=IOBKTL ;CHARACTER LOST ON TYPE IN
\r
24 DCHAR=177 ;DELETE CHARACTER
\r
25 ECHOF=IODTER ;ECHO FAILURE OCCURED
\r
26 TPMON=1000 ;IO IS FROM MONITOR
\r
27 SP=2000 ;SPECIAL TELETYPE CHAR. IS BEING INTERPRETED
\r
28 DDTM=100000 ;DDT MODE
\r
29 T35=4000 ;TELETYPE HAS TAB,FF,VT,ETC. MECHANISM
\r
30 USRB=100 ;TURN OFF TPMON WHEN OUTPUT IS FINISHED
\r
31 USRBC=20000 ;RT HALF MONITOR IOS WORD. REMAIN IN MONITOR MODE
\r
32 INTERNAL SCNINT,CTYINT,TTYUSR,TTYURC
\r
34 EXTERN TSCNLN,TCONLN,MTTYLN,CPOPJ1
\r
36 EXTERN FSNCHN,SCNCHL,OUT,PUUOAC,PJOBN,PUNIT,PIOMOD
\r
37 INTERNAL DDTGT,DDTRL,DDTIN,DDTOUT,TTYFND,TTYSTR,TTYFNU
\r
38 EXTERNAL WAIT1,WSYNC,CLRBYT,JOB,CLDS,CLEN,TTYBFE,TTYBM1
\r
39 EXTERNAL UXIT,ADRCK,TTYSAV,DEVPHY,DEVOPR
\r
40 EXTERNAL TTYCTR,TTYPTR,TTYBUF,TTYLST,MLTTYL,SETRUN,STTYBF,TTY0DB
\r
42 PHPOS: POINT 7,DEVIAD(DEVDAT),12 ;POINTER HORIZONTAL POSITION
\r
43 PVPOS: POINT 5,DEVOAD(DEVDAT),12 ;POINTER VERITICAL POSITION
\r
44 PLASTC: POINT 7,DEVOAD(DEVDAT),7 ;POINTER TO LAST CHARACTER OU
\r
45 PSCHAR: POINT 6,DEVIAD(DEVDAT),5 ;POINTER TO ^C OR ^O
\r
47 TPCJOBN: POINT 9,TTYTAB(LINE),9 ;CONSOLE NUMBER FOR TTY
\r
49 SCNINI: MOVEI TAC,100000
\r
50 CONO TTY,0 ;SHUT DOWN CONSOLE TTY
\r
51 CONO DCSA,4010 ;RELEASE XMITTER,RECEIVER
\r
58 CONO TTY,3600(TAC) ;CLEAR TTY, ASSIGN CHANNEL
\r
59 CONO DCSA,FSNCHN ;ASSIGN INTERRUPT CHANNELS
\r
60 MOVSI TAC,MLTTYL ;NO. OF TTY DEV. DATA BLOCKS
\r
61 MOVSI DAT,TTYUSE ;TTY DDB IN USE BIT
\r
62 MOVSI IOS,TPMON+IOFST ;VIRGIN STATUS
\r
63 MOVEI DDB,TTYLST ;FIRST TTY DDB ADDRESS
\r
64 SCN1: TDNN DAT,DEVMOD(DDB) ;IS THIS TTY DDB IN USE?
\r
65 SETZM DEVNAM(DDB) ;NO. SET NAME TO 0
\r
66 MOVEM IOS,DEVIOS(DDB)
\r
67 SETZM TTYSAV(DDB) ;CLEAR USER MODE TTY STATUS WORD
\r
68 ANDCAM DAT,DEVMOD(DDB) ;CLEAR USE BIT
\r
69 HLRZ DDB,DEVSER(DDB) ;GET NEXT TTY DDB
\r
71 MOVSI TAC,MTTYLN ;SET DDB USE BITS FROM TRANSLATOR TABLE
\r
73 SCN2: SKIPE DDB,TTYTAB(TAC)
\r
74 IORM TAC1,DEVMOD(DDB)
\r
78 ;ROUTINE TO RETURN TTY TO VIRGIN STATE
\r
79 ;CALL: MOVE DDB, ADDRESS OF DEVICE DATA BLOCK
\r
84 TTYKIL: MOVE TAC,[XWD TTYUSE+TTYATC,ASSCON+ASSPRG]
\r
85 ANDCAM TAC,DEVMOD(DEVDAT) ;CLEAR DDB USE BIT
\r
86 SETZM DEVNAM(DEVDAT) ;CLEAR PHYSICAL NAME
\r
87 SETZM DEVLOG(DEVDAT) ;CLEAR LOGICAL NAME
\r
90 ;ROUTINE TO DETACH TTY FROM JOB
\r
91 ;CALL: MOVE DEVDAT,ADDRESS OF TTY DDB TO BE DETACHED
\r
95 TTYDET: MOVE TAC,DEVMOD(DEVDAT)
\r
96 TLZN TAC,TTYATC ;WAS TTY ATTACHED?
\r
97 JRST TTYKIL ;NO, SO RETURN DDB TO POOL
\r
98 MOVEM TAC,DEVMOD(DEVDAT) ;YES, JUST CLEAR ATTACH BIT
\r
99 TTYDT1: LDB LINE,PUNIT
\r
104 CCHAR: 0 ;HOLDS CHARACTER FOR CONSOLE TELETYPE
\r
105 ;CONTROL C - GO BACK TO MONITOR
\r
106 ;CONTROL 0 - SUPPRESS OUTPUT
\r
108 TTYURC: SKIPA TAC,[XWD USRB,USRBC] ;START JOB BUT REMAIN IN MON1
\r
109 TTYUSR: MOVSI TAC,USRB ;CAUSE TTY TO GO INTO
\r
110 IORM TAC,DEVIOS(DEVDAT) ;USER MODE WHEN
\r
111 POPJ PDP, ;OUTPUT FINISHES
\r
115 TTYSET: MOVSI TAC,IOFST ;INITIALIZE USER TTY IOS WORD
\r
116 MOVEM TAC,TTYSAV(DEVDAT) ;FOR START COMMAND
\r
120 ;ROUTINE TO ATTACH TTY TO A JOB
\r
121 ;CALL: MOVE DEVDAT,ADDRESS OF TTY DEVICE DATA BLOCK
\r
122 ; MOVE ITEM,JOB NUMBER
\r
124 ; ERROR ;DEVDAT=DDB ADR OF OTHER TTY
\r
125 ;IF ANOTHER ALREADY IS ATTACHED.
\r
126 ; OK RETURN ;DEVDAT, DAT AND TRANSLATOR TABLE SET
\r
130 TTYATT: LDB LINE,PUNIT ;LINE NO. OF THIS TTY
\r
131 MOVEI DEVDAT,TTYLST ;SEARCH FOR DDB THAT IS ATTACHED
\r
133 TTYAT2: HLRZ DEVDAT,DEVSER(DEVDAT)
\r
134 JUMPE DEVDAT,TTYAT4
\r
135 LDB TAC,PJOBN ;JOB NUMBER
\r
136 HLL TAC,DEVMOD(DEVDAT) ;ATTACH AND USE BITS
\r
137 TLNN TAC,DVTTY ;IS THIS STILL A TTY DDB?
\r
138 JRST TTYAT4 ;NO, THIS MUST BE IJOB
\r
139 CAIN ITEM,(TAC) ;JOB NUMBER THE ONE TO ATTACH?
\r
140 TLNN TAC,TTYUSE ;YES, IS IT THE DETACHED ONE?
\r
141 JRST TTYAT2 ;NO, KEEP LOOKING
\r
142 TLNE TAC,TTYATC ;IS SOME TTY ALREADY ATTACHED?
\r
143 POPJ PDP, ;YES, ERROR RETURN WITH DEVDAT SET
\r
144 PUSH PDP,DEVDAT ;SAVE NEW DDB ADDRESS
\r
145 MOVE DEVDAT,TTYTAB(LINE)
\r
146 MOVE TAC,DEVMOD(DEVDAT)
\r
147 PUSHJ PDP,TTYDET ;DETACH DDB FROM TTY
\r
149 TTYAT3: DPB ITEM,TPCJOBN ;STORE ATTACHED JOB NO.
\r
150 DPB ITEM,PJOBN ;SET JOB NUMBER
\r
151 MOVSI TAC,TTYATC ;SET ATTACHED BIT
\r
152 PUSHJ PDP,TTYDAT ;SETUP OUTPUT BYTE
\r
153 JRST SCNIN ;GO INITIALIZE DDB
\r
155 TTYAT4: MOVE DEVDAT,TTYTAB(LINE) ;RESTORE OLD DDB ADDRESS
\r
159 ;ROUTINE TO SETUP AC DEVDAT TO ADDRESS OF TTY WHICH HAS TYPED A COMMA
\r
160 ;AC DAT TO BYTE POINTER TO OUTPUT BUFFER FOR COMMAND MESSAGE
\r
161 ;AC TAC TO BYTE POINTER TO COMMAND STRING
\r
162 ;AC ITEM TO JOB NUNMBER TTY IS ATTACHED TO
\r
163 ;CALL: PUSHJ PDP,TTYCOM
\r
169 TTYCOM: MOVSI LINE,MTTYLN
\r
173 MOVSI DEVDAT,400000
\r
174 ANDCAB DEVDAT,TTYTAB(LINE)
\r
176 ADDI DAT,TTYBUF(DEVDAT)
\r
181 ;ROUTINE TO RETURN IN AC ITEM JOB NUMBER WHICH TTY IS ATTACHED TO
\r
182 ;CALL: MOVE DEVDAT,ADDRESS OF TTY DEVICE DATA BLOCK
\r
186 TTYJOB: LDB LINE, PUNIT
\r
191 ;TELETYPE SCANNER UUO ROUTINES
\r
194 ;DDTGT WAITS FOR OUTPUT TO COMPLETE THEN PUTS
\r
195 ;TELETYPE INTO DDT MODE
\r
197 DDTGT: PUSHJ PDP,TTYSR1 ;FIND DEVICE DATA BLOCK
\r
198 MOVE IOS,DEVIOS(DEVDAT)
\r
200 TLNN IOS,IO ;OUTPUT IN PROGRESS
\r
202 ; PUSHJ PDP,OUT ;MAKE SURE OUTPUT STARTED
\r
203 PUSHJ PDP,WAIT1 ;WAIT FOR OUTPUT TO FINISH
\r
204 DDTGT2: TLO IOS,DDTM ;SET DDT MODE BIT
\r
205 MOVEM IOS,DEVIOS(DEVDAT)
\r
208 ;RELEASE TELETYPE FROM DDT MODE
\r
209 ;MAKE SURE OUPUT IS FINISHED FIRST
\r
211 DDTRL: PUSHJ PDP,TTYSR1 ;FIND DEVICE DATA BLOCK
\r
212 MOVE IOS,DEVIOS(DEVDAT)
\r
213 TLNE IOS,IO ;OUTPUT IN PROGRESS?
\r
214 PUSHJ PDP,WAIT1 ;YES, WAIT
\r
215 MOVSI IOS,DDTM+SYNC
\r
216 ANDCAM IOS,DEVIOS(DEVDAT) ;TURN OFF DDT BIT
\r
221 ;CALL AC,[SIXBIT /DDTIN/] AC CONTAINS POINTER TO BUFFER AREA
\r
222 ;BUFFER AREA MUST BE 21 WORDS LONG
\r
224 DDTIN: PUSHJ PDP,TTYSR1 ;SET UP DEVDAT
\r
225 MOVE IOS,DEVIOS(DEVDAT)
\r
226 TLNE IOS,IO ;OUTPUT IN PROGRESS
\r
227 PUSHJ PDP,WAIT1 ;YES, WAIT
\r
228 DDTIN2: MOVE IOS,DEVIOS(DEVDAT)
\r
229 TLNE IOS,IOEND ;BUFFER ALREADY?
\r
232 IORM IOS,DEVIOS(DDB)
\r
233 PUSHJ PDP,WSYNC ;NO, WAIT
\r
236 DDTIN3: MOVSI TAC,NIO+IOFST+DDTM
\r
237 IORM TAC,DEVIOS(DEVDAT) ;STOP ALL IO
\r
238 MOVE TAC,TTYPTR(DEVDAT)
\r
239 PUSHJ PDP,CLRBYT ;CLEAR OUT REMAINING BYTES
\r
240 SUBI TAC,TTYBM1(DEVDAT) ;NUMBER OF WORDS
\r
241 LDB TAC1,PUUOAC ;PICK UP AC NUMBER
\r
242 ADDI TAC1,(PROG) ;FIND REAL ADDRESS
\r
243 MOVE TAC1,(TAC1) ;PICK UP POINTER
\r
244 ADDI TAC1,(PROG) ;FIND REAL ADDRESS OF BUFFER
\r
245 HRLI TAC1,TTYBUF(DEVDAT)
\r
247 BLT TAC1,(TAC) ;TRANSFER MONITOR BUFFER TO U
\r
248 CLEARM 1(TAC) ;MAKE SURE THERE ARE SOME NUL
\r
249 MOVSI TAC,NIO+IOEND
\r
250 ANDCAM TAC,DEVIOS(DEVDAT)
\r
255 ;CALL AC,[SIXBIT /DDTOUT/] AC HAS POINTER TO DDT OUTPUT BUFFER
\r
257 DDTOUT: PUSHJ PDP,TTYSR1
\r
258 MOVE IOS,DEVIOS(DEVDAT)
\r
259 TLNE IOS,IO ;OUTPUT IN PROGRESS?
\r
260 PUSHJ PDP,WAIT1 ;YES, WAIT
\r
261 MOVE IOS,[XWD NIO+TOUT+DDTM,IOACT]
\r
262 IORB IOS,DEVIOS(DEVDAT)
\r
263 LDB TAC,PUUOAC ;PICK UP AC NUMBER
\r
264 HRLI TAC,JDAT ;CALC REAL ADDRESS OF AC
\r
265 HRR TAC,@TAC ;PICK UP AC
\r
266 HRLI TAC,@TAC ;CALC REAL ADDRESS OF DDT BUF
\r
267 HRRI TAC,TTYBUF(DEVDAT)
\r
268 HRRZM TAC,TTYCTR(DDB) ;A SUITABLY LARGE NUMBER
\r
270 BLT TAC,20(TAC1) ;MOVE DDT BUFFER TO MONITOR
\r
273 MOVEM TAC1,TTYPTR(DEVDAT)
\r
279 TTYSR1: MOVE ITEM,JOB
\r
280 TTYSRC: MOVSI LINE,MTTYLN
\r
281 HRRZ DEVDAT,TTYTAB(LINE)
\r
286 TTYF0: AOBJN LINE,TTYSRC+1
\r
287 MOVSI TAC,576062 ;SIXBIT /OPR/
\r
288 JRST DEVPHY ;SEARCH PHYSICAL DEVICE NAMES
\r
289 ;AND RETURN OPERATOR TTY.
\r
291 ;ROUTINE TO FIND A TTY FOR A JOB
\r
292 ;CALL: MOVE ITEM,JOB NUMBER
\r
293 ; PUSHJ PDP, TTYFND
\r
295 ; RETURN WITH DEVDAT SET TO ADR OF DDB
\r
296 ; AND DAT SET TO BYTE POINTER TO MONITOR OUTPUT BUFFER
\r
298 TTYFNU: MOVE ITEM,JOB
\r
299 TTYFND: PUSHJ PDP,TTYSRC ;CALLED BY PUSHJ PDP,TTYFND
\r
301 MOVSI TAC,NIO ;JOB NUMBER IN TAC1
\r
302 IORM TAC,DEVIOS(DEVDAT)
\r
303 TTYDAT: MOVEI DAT,TTYBUF(DEVDAT) ;SETUP OUTPUT BYTE POINTER
\r
307 TTYSTR: MOVE TAC,DAT
\r
309 SUBI TAC,TTYBM1(DEVDAT)
\r
312 MOVEM TAC,TTYCTR(DEVDAT)
\r
313 MOVEI TAC,TTYBUF(DEVDAT)
\r
315 MOVEM TAC,TTYPTR(DEVDAT)
\r
316 MOVE IOS,DEVIOS(DEVDAT)
\r
317 IOR IOS,[XWD NIO+IOFST,IODTER+IOBKTL]
\r
318 ANDCM IOS,[XWD NIO+IOFST,IODTER+IOBKTL]
\r
320 POPJ PDP, ;NOTHING TO TYPE
\r
321 JRST TTYOU2 ;START OUTPUT
\r
325 TTYDSP: POPJ PDP, ;RELEASE
\r
328 TDZ IOS,[XWD TPMON,ECHOF+NCERR] ;INPUT
\r
334 TTYOUT: TDO IOS,[XWD TOUT+IOFST,IOACT]
\r
335 TDZ IOS,[XWD TPMON,ECHOF+NCERR]
\r
336 TTYOU0: LDB HPOS,PHPOS
\r
342 TTYOU2: LDB LINE,PUNIT
\r
343 CONO CLDS ;DISABLE CLOCK
\r
346 CONO DCSA,0 ;DISABLE SCANNER
\r
351 TTYOU1: CONO CLEN ;RE-ENABLE CLOCK
\r
352 MOVEM IOS,DEVIOS(DEVDAT)
\r
355 CTYOUT: CONO TTY,0 ;DISABLE TTY
\r
358 CONO TTY,SCNCHN ;RE-ENABLE
\r
361 CTYINT: CONSO TTY,50
\r
365 MOVEM TAC, CCHAR ;DONT ECHO RUBOUT
\r
369 JRST CTYRUB ;IS A RUBOUT
\r
370 DATAO TTY, TAC ;NOT, SO ECHO
\r
372 JRST 12,@SCNCHL ;DISMISS INTERRUP
\r
374 CTYRUB: EXCH TAC, CCHAR
\r
377 CONO TTY,200(CHREC)
\r
382 SCNINT: CONSO DCSA,1010
\r
385 CONSO DCSA,10 ;RECEIVER FLAG?
\r
386 JRST SCNIN1 ;NO,XMITTER FLAG
\r
389 TCOMM: ANDI CHREC, 177
\r
390 CAILE LINE,TCONLN ;CTY LINE OR LESS
\r
392 SKIPE DDB,TTYTAB(LINE) ;DATA BLOCK ASSIGNED?
\r
394 PUSHJ PDP,DDBSRC ;SEARCH FOR FREE TTY DEV. DATA BLOCK
\r
395 JRST TYPX ;NONE FOUND, TYPE X
\r
396 CLEARB HPOS,VPOS ;ASSUME TTY IS AT BEGIN OF FORM
\r
397 CONSZ DCSA,700 ;FULL DUPLEX?
\r
398 CAIN LINE,TCONLN ;CTY?
\r
399 JRST INJEST ;NO, SWALLOW CHAR
\r
403 ;ROUTINE TO SEARCH FOR FREE TTY DEV DATA BLOCK
\r
404 ;CALL: MOVE LINE,TTY LINE NO
\r
407 ; RETURN DEVDAT, LINE SET
\r
409 DDBSRC: MOVSI IOS,MLTTYL ;NO. OF TTY DDB
\r
410 MOVEI DEVDAT,TTYLST ;ADDRESS OF FIRST DDB
\r
411 SKIPA TAC,[XWD TTYUSE+TTYATC,ASSPRG+ASSCON]
\r
412 HLRZ DEVDAT,DEVSER(DEVDAT)
\r
413 TDNE TAC,DEVMOD(DEVDAT) ;USE.ATTACH, AND BOTH ASSIGN
\r
415 JUMPGE IOS,CPOPJ ;DDB FOUND?
\r
416 MOVE IOS,[XWD TPMON+IOFST,IOACT]
\r
417 MOVE TAC,[XWD TTYUSE,ASSCON]
\r
419 ;INITIALIZE TTY DEVICE DATA BLOCK(CALLED FROM TTYATT TOO)
\r
421 SCNIN: IORM TAC,DEVMOD(DEVDAT)
\r
422 DPB LINE,PUNIT ;SET LINE NO. IN DDB
\r
423 MOVSI TAC,646471 ;SIXBIT /TTY/
\r
424 MOVEM TAC,DEVNAM(DEVDAT)
\r
425 MOVE TAC,[POINT 6,DEVNAM(DEVDAT),17]
\r
426 PUSH PDP,LINE ;SAVE LINE NO.
\r
427 TRNN LINE,70 ;IS THERE A HIGH ORDER OCTAL DIGIT?
\r
429 ROT LINE,-3 ;YES,CONVERT TO SIXBIT
\r
431 IDPB LINE,TAC ;STORE HIGH ORDER SIXBIT DIGIT
\r
432 LSH LINE,20 ;IN PHYSICAL NAME
\r
433 SCNIN0: ADDI LINE,20
\r
434 IDPB LINE,TAC ;STORE LOW ORDER DIGIT
\r
437 HRRM DEVDAT,TTYTAB(LINE) ;SET LINE NO. IN TRANSLATOR T
\r
438 MOVSI TAC,436471 ;SIXBIT /CTY/
\r
439 CAIN LINE,TCONLN ;IS THIS CONSOLE TTY?
\r
440 MOVEM TAC,DEVNAM(DEVDAT) ;YES, SET NAME TO CTY
\r
441 MOVE TAC,DEVNAM(DEVDAT)
\r
442 SKIPN DEVOPR ;IS THIS FIRST CHAR. TYPED BY ANYONE?
\r
443 MOVEM TAC,DEVOPR ;YES,SET THIS TTY AS OPERATOR TTY
\r
444 JRST CPOPJ1 ;SUCCESSFUL RETURN
\r
446 SCNIN1: DATAI DCSA,LINE ;GET LINE NO. FROM FULL DUPLEX
\r
448 CONO DCSA,4000(TAC) ;RELEASE XMITTER SCANNER
\r
449 SKIPE DDB,TTYTAB(LINE) ;DATA BLOCK ASSIGNED?
\r
450 CAIL LINE,TCONLN ;LINE NO. TOO LARGE?
\r
451 JRST SCNRET ;GO AWAY
\r
456 TYPX: CAIN CHREC,"X" ;CHARACTER RECEIVED AN X?
\r
457 JRST SCNRET ;YES, GO AWAY
\r
463 TYPX1: CONSO DCSB,(LINE)
\r
464 DATAO DCSA,CHREC ;TYPE AN X
\r
467 INUSE: CONSZ DCSA,700 ;FULL DUPLEX?
\r
475 INUS1: MOVE IOS,DEVIOS(DDB)
\r
477 HRRZ PROG,JBTADR(PROG)
\r
480 LDB TAC, TTYPTR(DDB)
\r
483 INUS2: TLNN IOS,TOUT
\r
487 INUS3: PUSHJ PDP, GCHAR
\r
489 TYPE: CAIN LINE,TCONLN
\r
491 TYP1: CONO DCSB,(LINE)
\r
493 DPB CHREC,PLASTC ;SAVE CHARACTER FOR FULL DUPLEX
\r
494 LEAVE: MOVEM IOS, DEVIOS(DDB)
\r
495 LEAV1: DPB HPOS,PHPOS
\r
498 LEAV0: MOVEM TAC,DEVMOD(DEVDAT) ;IS TTY ATTCHED?
\r
500 PUSHJ PDP,TTYKIL ;NO,RETURN TO POOL
\r
503 CTSER3: DATAO TTY,CHREC
\r
508 ECHO: TDO IOS,[XWD SP,ECHOF]
\r
510 MOVEI CHREC,177 ;SEND A RUBOUT AFTER ECHO CHE
\r
513 SIM35: MOVSI TAC,-SCTABL
\r
514 MOVE HPOS, SCTAB(TAC)
\r
519 MOVS TAC, SCTAB(TAC)
\r
520 TLNE TAC, 140 ;SPACING CHARACTER
\r
521 AOJA HPOS,(TAC) ;YES
\r
524 SCTAB: XWD SPACE," "
\r
526 XWD SIMRO,177 ;RUBOUT
\r
527 XWD SIMRO,134 ;BACK SLASH
\r
536 SPACE: TRNN HPOS,7 ;FINISHED SIMULATING TABS(8)
\r
538 JRST TYPE ;NO, SEND ANOTHER SPACE
\r
540 SIMVA: LDB CHREC,PSCHAR
\r
544 SIMLF: SOJG VPOS,TYPE ;SEND ANOTHER LINE-FEED
\r
550 SIMRO: TLZA IOS, SP
\r
555 INJEST: CAIN CHREC,3 ;CONTROL C?
\r
557 TLZE IOS,IOFST ;IF FIRST CHARACTER IN, INITIALIZE
\r
559 TLNE IOS,DDTM ;1 DDT CHAR RESTARTS PROGRAM
\r
560 TLO IOS,SYNC+IOEND ;YES, TERMINATE BUFFER
\r
561 CAIN CHREC,17 ;COTNROL O?
\r
562 JRST INJ6 ;YES, FLUSH OUTPUT
\r
563 TRZE IOS,ECHOF ;ECHO HAS OCCURRED?
\r
564 JRST INJ7 ;YES, NOW RESUME OUTPUT
\r
567 CAIE CHREC,033 ;NEW NEW ALT-MODE?
\r
568 CAIN CHREC,176 ;NEW ALT-MODE?
\r
569 MOVEI CHREC,175 ;CHANGE TO OLD
\r
570 CAIN CHREC,20 ;CONTROL P TAB SIMULATION FLIP FLOP SWI
\r
573 JRST INJ25 ;SENT RUBOUTS ON TO DDT
\r
574 CAIN CHREC,177 ;RUBOUT
\r
576 INJ25: DPBI CHREC, TTYPTR(DDB)
\r
577 SOS TAC, TTYCTR(DDB)
\r
582 INJ4: PUSHJ PDP, MOVBUF
\r
585 SETMB1: HRRI TAC, TTYBUF(DDB)
\r
587 MOVEM TAC, TTYPTR(DDB)
\r
591 BLT TAC,TTYBFE(DDB) ;CLEAR OUT MONITOR BUFFER
\r
593 MOVEM TAC, TTYCTR(DDB)
\r
597 INJ5: PUSHJ PDP,SETMB1
\r
599 LDB ITEM,TPCJOBN ;YES, GET USER CONSOLE NUMBER
\r
601 PUSHJ PDP,STOP1 ;SHUT OFF JOB
\r
603 TLNN IOS,TPMON ;SAVE STATUS OF TTY
\r
604 MOVEM IOS,TTYSAV(DDB) ;WHEN IT WAS IN USER MODE
\r
605 MOVE IOS,[XWD TPMON+IOFST,IOACT]
\r
609 INJ6: PUSH PDP,TAC1 ;^O
\r
613 TLNE IOS,TPMON+DDTM
\r
617 INJ6A: TLOA IOS,IOFST
\r
622 INJ61: DPB TAC,PSCHAR
\r
630 SPCIN: MOVSI TAC,-SCITL ;SEARCH FOR SPECIAL INPUT CHAR
\r
631 MOVE TAC1,SCITAB(TAC)
\r
632 CAIE CHREC,(TAC1) ;FOUND?
\r
634 HLR TAC,TAC1 ;SAVE DISPATCH ADDRESS
\r
635 LDB LINE,PUNIT ;RESTORE TAC1
\r
637 JRST INJ4 ;CHARACTER NOT FOUND
\r
639 SCITAB: XWD SPCCR,15 ;CR
\r
641 XWD SPC2,11 ;HORIZ TAB
\r
646 XWD ASC1, 175 ;ALT MODE
\r
649 SPCCR: MOVEI HPOS,0
\r
652 SPFF: SKIPA VPOS,[10]
\r
654 TLNN IOS,T35 ;DONT SIMULATE FOR A MOD 35
\r
656 ASC1: LDB TAC,PIOMOD
\r
662 ASC3: MOVEI CHREC,12 ;LINE FEED
\r
665 SPC4A: PUSHJ PDP,SETMB1
\r
675 SPC7: TLO IOS,SYNC+IOEND+SP ;^Z
\r
677 JRST INJ61 ;ECHO ^Z
\r
680 DELET: MOVE TAC,TTYCTR(DDB)
\r
685 ADD TAC,TTYPTR(DDB)
\r
687 ADD TAC,[XWD 347777,-1]
\r
688 MOVEM TAC,TTYPTR(DDB)
\r
691 MOVEI CHREC,334 ;BACK SLASH
\r
695 DELET1: MOVEI VPOS,1
\r
700 ;ROUTINE TO GET NEXT CHARACTER FROM OUTPUT BUFFER
\r
701 ;CALL: PUSHJ PDP,GCHAR
\r
703 ; RETURN WITH CHAR. IN CHREC
\r
705 GCHAR: TLZN IOS, IOFST
\r
707 GCHAR1: HRRZ TAC,DEVOAD(DDB)
\r
708 ADD TAC, [XWD 000700+PROG,1]
\r
709 MOVEM TAC, TTYPTR(DDB)
\r
712 MOVEM TAC,TTYCTR(DDB)
\r
713 GCHAR3: SOSGE TTYCTR(DDB)
\r
715 LDBI CHREC, TTYPTR(DDB)
\r
716 JUMPE CHREC, GCHAR7
\r
728 GCH3A: MOVE IOS,TTYSAV(DDB) ;RESTORE STATUS TO USER
\r
729 GCHAR4: MOVEM IOS,DEVIOS(DDB)
\r
732 GCHAR7: TLNN IOS,DDTM ;DDT BUFFER TERMINATED WITH NULL
\r
734 GCHAR5: PUSH PDP,TAC1
\r
738 TLNN IOS,TPMON+DDTM
\r
742 TDZ IOS,[XWD IO,IOACT]
\r
746 LDB LINE,PUNIT ;GET LINE NO.
\r
753 MOVSI IOS,TPMON+IOFST
\r
758 SPOUT: MOVEI CHREC,240
\r
767 MOVBUF: TLNE IOS,DDTM
\r
768 JRST MOV3 ;DONT ADVANCE BUFFERS FOR DDT MODE
\r
775 MOVE TAC,DEVIAD(DDB) ;IS TTY EXPECTING INPUT?
\r
777 SKIPGE @TAC ;OR IS NEXT BUFFER READY?
\r
780 MOVE TAC,TTYPTR(DDB)
\r
782 MOVE TAC,DEVIAD(DDB)
\r
783 PUSHJ PDP,ADRCK ;MAKE SURE BUFFER WILL FIT
\r
784 HRRZI TAC,STTYB1(TAC) ;LENGTH+1
\r
786 MOVEI TAC,@DEVIAD(DDB)
\r
790 HRLI CHREC,TTYBUF(DDB)
\r
794 SUB TAC, TTYCTR(DDB)
\r
797 MOVEI CHREC,@DEVIAD(DDB)
\r
802 MOV3: PUSH PDP,TAC1
\r
806 TRZA IOS,NCERR+IOACT
\r
807 MIS: TRO IOS, NCERR
\r
808 MIS1: MOVEM IOS, DEVIOS(DDB)
\r
810 MOVMON: MOVSI TAC,400000
\r
811 IORM TAC,TTYTAB(LINE) ;SET BIT FOR MONITOR
\r
814 DPB TAC,TTYPTR(DDB) ;FORCE A CARRIAGE RET INTO MONITOR COMM
\r