Consolidate license copies
[its.git] / system / tv.132
1 ;-*-MIDAS-*-
2 ;;; Copyright (c) 1999 Massachusetts Institute of Technology
3 ;;;
4 ;;; This program is free software; you can redistribute it and/or
5 ;;; modify it under the terms of the GNU General Public License as
6 ;;; published by the Free Software Foundation; either version 3 of the
7 ;;; License, or (at your option) any later version.
8 ;;;
9 ;;; This program is distributed in the hope that it will be useful,
10 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
11 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 ;;; General Public License for more details.
13 ;;;
14 ;;; You should have received a copy of the GNU General Public License
15 ;;; along with this program; if not, write to the Free Software
16 ;;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18
19 .SBTTL MACROS AND CONDITIONAL ASSEMBLY
20
21 ;AI PDP-11 TV CONSOLE PROGRAM
22 ;       USER WHO-LINE VARIABLES CODE ADDED 7/28/75 BY GLS
23 ;       AUDIO SWITCH CODE REWRITTEN 7/12/76 BY ED
24 ;       TV IS PDP-11 NUMBER 0 TO THE 10-11 INTERFACE.
25 ;       ELEVATOR CODE 2/13/79 BY DANNY & HIC
26 ;       REGION-SCROLLING 11/3/79 MOON
27
28 FONTSW==1       ;COMPILE FONTS
29 FONTMS==0       ;USE MACROS TO COMPILE FONTS
30
31 ;REGISTER ASSIGNMENTS
32
33 A=%0            ;ASCII CHARACTER
34 B=%1            ;META BITS
35 C=%2            ;C, T, AND TT ARE TEMPORARIES
36 T=%3
37 TT=%4
38 U=%5            ;LINE EDITOR OR PAGE PRINTER
39 SP=%6
40 PC=%7
41
42 .XCREF  A,B,C,T,TT,U,SP,PC,...,....
43
44 .IIF E FONTSW,.TITLE TV NOFONTS
45
46 .IF NE FONTSW
47 .TITLE TV
48 .IF NE FONTMS
49 .NLIST  ;WE'RE ONLY INTERESTED IN FONTS
50 .IF1
51 .PRINT /THIS ASSEMBLY WILL TAKE FOREVER!
52 /
53 .ENDC   ;.IF1
54 .ENDC   ;.IF NE FONTMS
55 .ENDC   ;.IF NE FONTSW
56
57 .MACRO  PUSH A
58 .NLIST
59         MOV     A,-(SP)
60 .LIST
61 .ENDM
62
63 .MACRO  POP A
64 .NLIST
65         MOV     (SP)+,A
66 .LIST
67 .ENDM
68
69 .MACRO REPORT TEXT,NUM
70 .NLIST
71 .IF2
72 .LIST
73 .PRINT /TEXT'NUM
74 /
75 .NLIST
76 .ENDC
77 .LIST
78 .ENDM
79
80 .MACRO CHROFF
81 .NLIST
82         MOVB    PS,-(SP)
83         MOVB    #LKLVL,PS
84 .LIST
85 .ENDM
86
87 .MACRO CHRON
88 .NLIST
89         MOVB    (SP)+,PS
90 .LIST
91 .ENDM
92 \f
93 .MACRO BLKOFF A
94 .NLIST
95         INCB    BLKSWT(A)
96 .LIST
97 .ENDM
98
99 .MACRO BLKON A
100 .NLIST
101         DECB    BLKSWT(A)
102         BGE     .+4
103         BPT
104 .LIST
105 .ENDM
106
107 .MACRO TENWRD
108 .NLIST
109 .IIF NE .&3,.=<.&177774>+4
110 .LIST
111 .ENDM
112
113 .MACRO CHECK TAG,LENGTH
114 .NLIST
115 .IF NE .-<TAG>-<LENGTH>
116 .ERROR TAG WRONG LENGTH
117 .ENDC
118 .EVEN
119 .LIST
120 .ENDM
121
122 .MACRO TYPOUT A
123 .NLIST
124         JSR     PC,OUTSTR
125         .ASCIZ A
126         .EVEN
127 .LIST
128 .ENDM
129
130 .MACRO DECTYPE  NUM
131 .NLIST
132         MOV     NUM,A
133         JSR     PC,DECPNT
134 .LIST
135 .ENDM
136
137 .MACRO  OCTYPE  NUM
138 .NLIST
139         MOV     NUM,A
140         JSR     PC,OCTPNT
141 .LIST
142 .ENDM
143
144 .MACRO ZAPFLG   FLAG
145 .NLIST
146 %COMPAT==0
147         MOV     PC,FLAG
148 %COMPAT==1
149 .LIST
150 .ENDM
151
152 .MACRO CONC A,B,C,D,E,F,G,H,I
153 A'B'C'D'E'F'G'H'I
154 .ENDM
155
156 .IF NE 0        ;PROGRAM MAP:
157 0, TO PDLORG            ;TRAP VECTORS
158 PDLORG, TO KBDBUF       ;PUSH DOWN LIST
159 KBDBUF, TO GO           ;KBD BUFFER
160 GO, TO XTAB             ;PROGRAM
161 XTAB, TO FNTORG         ;KEYBOARD TRANSLATION TABLE
162 FNTORG, TO VARORG       ;FONT DEFINITION
163 VARORG, TO MISORG       ;LINE EDITOR/PAGE PRINTER VARIABLES
164 MISORG, TO PATCH        ;MISCELLANEOUS TABLES AND VARIABLES
165 PATCH, TO LEBUFS        ;PATCH AREA
166 LEBUFS, TO RUGSA        ;FREE STORAGE
167 .ENDC
168 \f
169 .SBTTL HOW IT WORKS
170 .REPT 0
171 channel header pointer (location 40, read only)
172
173         ADDRESS(channel header area)
174         ADDRESS(pointer area)
175         I/O version number
176         source file version number
177         0       always 0
178         INITED  non-zero indicates PDP-11 is running ok(can be cleared by PDP-10)
179         0       always 0
180         GDOWN   used as flag by PDP-10 to acknowledge clear of INITED
181 channel header area (aligned on PDP-10 word)
182
183     KBD channel:
184         KBDFLG  cleared by 10/set by 11 (chain of activated KBD buffers)
185         0       allows PDP-10 to do SKIPN for activation test
186     DPY channel: (1 per console)
187         DPYCHN  buffer assigned to channel, if zero then DPY channel is closed
188         DPYKBD  .BYTE KBD#, DPY# (377 for either implies not assigned)
189     KBD flags: (1 per console)
190         ECOFLG  Set by PDP-10.  Next time DPYBUF is empty clear ECOFLG
191                 and put flag on KBD ring to signal this condition
192         CHNCLS  if -1, log this guy out!!!!
193                 If non-negative, has keyboard number (377 if none).
194     WHO flags: (1 per console)
195         WHOLIN  who line variables for this console
196         WHOUSR  -1=>user who line, 0=>system who line
197
198
199 format of KBD buffer (aligned on PDP-10 word)
200
201         KBDSTS  negative=>-(data byte count), 0=>free
202         0
203         KBDRNG  next KBD buffer associated with this KBD
204         KBDLST  next buffer on activated list (0=>end of chain)
205         KBDCHN  keyboard channel
206         0       not used
207         KBDATA  key board data area (1 PDP-11 word/character)
208
209 format of DPY buffer (aligned on PDP-10 word)
210   (actually, this is the beginning of the "line editor vars" or "channel vars" block).
211
212         DPY10B  word PDP-10 is hacking (used only for initailization)
213                 This always points at DPYATA for this buffer these days.
214         DPY11B  word PDP-11 is hacking
215         0
216         DPYLGL  last legal address in this buffer
217         DPYSIZ  size of data area in bytes
218         0       not used
219         DPYATA  display data area (1 PDP-11 byte/character)
220
221 format of pointer area (aligned on PDP-10 word)
222
223         ADDRESS(system who line variables)
224         ADDRESS(PDP-10/PDP-11 communication area)
225         TENWHO  -1=>PDP-10 should update who lines
226         TENWH1  pads TENWHO
227         SYMTAB BEGINNING OF TABLE OF SWITCHES WHICH 10 ACCESSES.
228
229 Notes:
230
231 1.      All addresses and pointers are in PDP-11 address space.
232
233 2.      KBD buffers are ringed two per channel.  While the PDP-10 is
234         emptying one, the PDP-11 can fill the other.
235
236 3.      There is only one DPY buffer per channel.  When the buffer is filled
237         with negative ones, it is free.  When the PDP-10 writes a character
238         in the current word: then the PDP-11 processes the data in that
239         word, sets that word to negative one, and advances to the next word.
240         (Formerly any negative number would do, but now that the byte size is
241         8 rather than 16, -1 [377] must be used since valid characters > 200 exist.)
242 \f
243 WHO LINE VARIABLES
244
245 SYSTEM WHO LINE (ALIGNED ON PDP-10 WORD)
246     ITSTDP      # total # dpy's (read only for PDP-10)
247     ITSFDP      # free  dpys (read only for PDP-10)
248     ITSVER      ITS version #
249     ITSJOB      total jobs
250     ITSCOR      total core
251     ITSRU       runnable users
252     ITSWBJ      # jobs swap blocked
253     ITSJWP      # jobs waiting for pages
254     ITSTRC      total runable core
255     ITSCFU      core available for users
256     ITSDAT      date [byte (7) year (4) month (5) day]
257     ITSDBG      system debug flag
258     ITSTIM      time of day (# half seconds since midnight) aligned on PDP-10 word
259     ITSTI1      low order of time
260     ITSUSR      total number of users
261     ITSFSH      fair share
262
263 USER WHO LINE (ALIGNED ON PDP-10 WORD)
264     WHJOB       job #, -1=>who line not in use
265     WHJOB1      if negative then clear who line
266     WHMODE      mode    0=>follow keyboard
267                         1=>freeze
268                         2=>next higher (when PDP-10 sees this state, it searches
269                            user variables for next higher job index number with same
270                            uname.  When it finds it, it stores the number in job #
271                            and changes mode to 1
272                         3=>next lower
273     WHMOD1      pads WHMODE
274     WHUNAM      uname in sixbit (left 18 bits in first two words, right in next two)
275     WHUNM1
276     WHUNM2
277     WHUNM3
278     WHJNAM      jname in sixbit
279     WHJNM1
280     WHJNM2
281     WHJNM3
282     WHSNAM      sname in sixbit
283     WHSNM1
284     WHSNM2
285     WHSNM3
286     WHSTAT      status in sixbit, 0=>job does not exist
287     WHSTA1
288     WHSTA2
289     WHSTA3
290     WHJ%RT      job % run time
291     WHJTRT      job total run time (in tenth's of seconds)
292     WHRPAG      job real memory pages (swapped in)
293     WHTPAG      job total pages
294
295 NOTE:   The PDP-11 will not update who lines until it sees that ITSTIM
296         has changed.
297 \f
298 PDP-10/PDP-11 COMMAND CHANNEL
299
300     CMDFLG      aligned on PDP-10
301                 0=>buffer is free (PDP-10 can write CMDBUF)
302                 positive=>command # from PDP-10 (PDP-11 can write CMDBUF)
303                 negative=>affirmative reply from PDP-11 (0=>command failed)
304                 PDP-10 can read CMDBUF, then must zero CMDFLG
305     CMDFL1      always 0
306     CMDBUF      each arg takes 4 bytes (1 PDP-10 word)
307
308     PDP-10/PDP-11 COMMANDS
309
310         1       video switch
311                 arg1:   video switch input #  (set by PDP-10)
312                 arg2:   video switch output # ( "  "   "  " )
313
314         2       reserve DPY
315                 arg1:   DPY reserved (set by PDP-11)
316
317         3       free DPY
318                 arg1:   DPY to free (set by PDP-10)
319
320         4       read video switch
321                 arg1:   < 0 for default setting, > 0 for current setting (set by PDP-10)
322                         1=>tty chnl, 2=>KBD, 3=>video switch output
323                 arg2:   # described by arg1 (set by PDP-10)
324                 arg3:   input (set by PDP-11)
325                 arg4:   input (set by PDP-11)
326                 arg5:   output(set by PDP-11)
327
328         5       audio switch
329                 arg1:   audio switch input #  (set by PDP-10)
330                 arg2:   audio switch output # (set by PDP-10)
331
332         6       read audio switch (for this to be useful, 11 must maintain table, since 
333                                 the audio switch is read-only.
334                 arg1:   < 0 for default setting, > 0 for current setting (set by PDP-10)
335                         1=>tty chnl, 2=>KBD, 3=>audio switch output
336                 arg2:   # described by arg1 (set by PDP-10)
337                 arg3:   input (set by PDP-11)
338                 arg4:   output(set by PDP-11)
339
340 ;other 10-11 commuincation issues ..
341
342 ;go down resetting video switch vs not
343 ;PDP-11 indicates it has reset video switch
344         ;(PDP-10 then detaches all jobs with tv ttys)
345 \f
346 ;console scroll register        6/23/74
347
348 CSA==157776             ;selects where video scan starts in video buffer
349
350 __|_____|_____|_____|_____|_____|
351 15    1211                      |
352 |  3  |1|           12          |
353 |_____|_|_______________________|
354    |   |             |
355    |   |             |----------------->scroll offset (start video scan at n*4 PDP-11 words from TVLO)
356    |   |
357    |   |------------------------------->black on white bit (1=>black on white)
358    |
359    |----------------------------------->not used
360
361
362
363 ;console register               6/24/74
364
365 CREG==164044            ;selects video buffer memory
366
367 __|_____|_____|_____|_____|_____|
368 15              7               |
369 |       8       |       8       |
370 |_______________|_______________|
371         |               |
372         |               |-------------->console # (TVLO-TVHI on unibus is video bit map)
373         |
374         |------------------------------>ALU function
375
376 video switch    4/17/74
377
378 VSW==164060             ;sets video switch
379
380 __|_____|_____|_____|_____|_____|
381 15    12  10    7       3       |
382 |  3  | 2 |  3  |   4   |   4   |
383 |_____|___|_____|_______|_______|
384    |    |    |      |       |
385    |    |    |      |       |---------->video source
386    |    |    |      |
387    |    |    |      |------------------>not used
388    |    |    |
389    |    |    |------------------------->|             |card section
390    |    |                               |switch output|
391    |    |------------------------------>|             |card select
392    |
393    |----------------------------------->switch section number
394
395
396 audio switch   7/12/76
397
398 ASW==170670     ;SETS AUDIO SWITCH. (this is a write-only memory.)
399
400 __|_____|_____|_____|_____|_____|
401 15  13    10    7       3       |
402 | 2 |  3  |  3  |   4   |   4   |
403 |___|_____|_____|_______|_______|
404   |    |     |      |       |
405   |    |     |      |       |---------->audio source
406   |    |     |      |
407   |    |     |      |------------------>not used
408   |    |     |
409   |    |     |------------------------->|             |card section (complemented)
410   |    |                                |switch output|
411   |    |------------------------------->|             |card select
412   |
413   |------------------------------------>not used
414
415 ASWXOR==1617    ;complemented fields of ASW.
416 \f
417 keyboard multiplexor    3/15/74
418
419 KBDPC==340      ;interrupt vector
420 KBDLVL==5_7     ;interrupts on level 5
421
422 KMS==164050     ;keyboard status
423
424 __|_____|_____|_____|_____|_____|
425 151413121110 9 8 7 6 5 4    1   |
426 |1|1|1|1|1|1|1|1|1|1|1|  3  | 2 |
427 |_|_|_|_|_|_|_|_|_|_|_|_____|___|
428  | | | | | | | | | | |   |    |
429  | | | | | | | | | | |   |    |------>KMA extension (bits 17 and 16)
430  | | | | | | | | | | |   |
431  | | | | | | | | | | |   |----------->not used
432  | | | | | | | | | | |
433  | | | | | | | | | | |--------------->interrupt enable
434  | | | | | | | | | |
435  | | | | | | | | | |----------------->direct memory access enable
436  | | | | | | | | |
437  | | | | | | | | |------------------->waiting to hack memory
438  | | | | | | | |
439  | | | | | | | |--------------------->8th floor elevator
440  | | | | | | |----------------------->9th floor elevator
441  | | | | | |
442  | | | | | |------------------------>extra OC output, pin BBF1.
443  | | | | |
444  | | | | |--------------------------->buzz the 9th floor door (dip relay)
445  | | | |
446  | | | |----------------------------->generate copy from second source(currently not
447  | | |                                                                  enabled)
448  | | |------------------------------->generate copy from first source
449  | |
450  | |--------------------------------->ready line
451  |
452  |----------------------------------->waiting to interrupt
453
454 KMA==165052     ;keyboard memory address register
455
456 __|_____|_____|_____|_____|_____|
457 15                7         1   |
458 |         9       |    5    | 2 |
459 |_________________|_________|___|
460           |            |      |
461           |            |      |----->always 0
462           |            |
463           |            |------------>binary counter (overflow lost)
464           |
465           |------------------------->buffer origin
466 \f
467 ;keyboard multiplexor   3/15/74
468 ;format of data written into memory (each record is two words)
469
470 ;first word
471
472 __|_____|_____|_____|_____|_____|
473 151413  11  9   7   5           |
474 |1|1| 2 | 2 | 2 | 2 |     6     |
475 |_|_|___|___|___|___|___________|
476  | |  |   |   |   |       |
477  | |  |   |   |   |       |--------->key struck
478  | |  |   |   |   |
479  | |  |   |   |   |----------------->shift (7-left, 6-right)
480  | |  |   |   |
481  | |  |   |   |--------------------->top (9-left, 8-right)
482  | |  |   |
483  | |  |   |------------------------->control (11-left, 10-right)
484  | |  |
485  | |  |----------------------------->meta (13-left, 12-right)
486  | |
487  | |-------------------------------->shift lock
488  |
489  |---------------------------------->always 1
490
491 ;second word
492
493 __|_____|_____|_____|_____|_____|
494 15  13          7               |
495 | 2 |     6     |       8       |
496 |___|___________|_______________|
497   |       |             |
498   |       |             |----------->high order bits of character (ignored)
499   |       |
500   |       |------------------------->console number
501   |
502   |--------------------------------->always 0
503
504 .ENDR
505
506 ;CHARACTER FORMAT WRITTEN BY KBD MULTIPLEXOR
507
508 RCHAR==177700   ;6 BITS FOR KEY STRUCK
509 RSHBIT==300     ;SHIFT BITS
510 RTPBIT==1400    ;TOP BITS
511 RCLBIT==6000    ;CONTROL BITS
512 RMTBIT==30000   ;META BITS
513 RSLBIT==40000   ;SHIFT LOCK
514 RXTRA==100000   ;UNUSED BITS
515
516 ;XTAB BITS USED FOR XTAB LOOK UP
517
518 XTPBIT==400     ;TOP
519 XSLBIT==200     ;SHIFT LOCK
520 XSHBIT==100     ;SHIFT
521
522 ;POSITION OF META BITS, ASCII COMPATIBLE
523
524 ACTBIT==SNB             ;CAUSES CHARACTER TO ACT AS ACTIVATOR
525 ACLBIT==200             ;CONTROL
526 AMTBIT==400             ;META
527 ASHBIT==XSHBIT_3        ;SHIFT
528 ASLBIT==XSLBIT_3        ;SHIFT LOCK
529 ATPBIT==XTPBIT_3        ;TOP
530 ACMBIT==AMTBIT+ACLBIT   ;CONTROL AND META TOGETHER
531 \f
532 .SBTTL ASSIGNMENTS
533
534 ;GEOMETRY
535
536 BITPL==1100             ;BITS PER LINE
537 NLINS==706              ;LINES ON SCREEN
538 BYTPL==BITPL/10         ;BYTES PER LINE
539 WRDPL==BYTPL/2          ;WORDS PER LINE
540
541 CHRWD==6                ;CHARACTER WIDTH ON TEXT LINE
542 GRIDWD==5               ;WIDTH OF CHARACTER GRID
543 CHRHT==12               ;CHARACTER HEIGHT
544 CHRVSP==2               ;BLANK RASTER LINES BETWEEN CHARACTER LINES
545 LINHT==CHRHT+CHRVSP     ;CHRACTER LINE HEIGHT
546 CHRPL==BITPL/CHRWD      ;CHARACTERS PER LINE
547 CHRLN==NLINS/LINHT      ;CHARACTER LINES ON SCREEN
548
549 ;MEMORY MAP
550
551 NXMPC==   4             ;BUS ERROR VECTOR
552 NXMPSW==  6
553 RESPC==  10             ;RESERVED INTRUCTION VECTOR
554 RESPSW== 12
555 BPTPC==  14             ;BREAK POINT VECTOR
556 BPTPSW== 16
557 IOTPC==  20             ;IOT VECTOR
558 IOTPSW== 22
559 PWRPC==  24             ;POWER FAIL TRAP VECTOR
560 PWRPSW== 26
561 EMTPC==  30             ;EMULATE TRAP VECTOR
562 EMTPSW== 32
563 TRPPC==  34             ;TRAP INSTRUCTION VECTOR
564 TRPPSW== 36
565 TYIPC==  60             ;TTY INPUT INTERRUPT VECTOR
566 TYIPSW== 62
567 LKPC==  100             ;LINE CLOCK INTERRUPT VECTOR
568 LKPSW== 102
569 KLIPC== 320             ;KL11 INPUT INTERRUPT VECTOR
570 KLIPSW==322
571 KBDPC== 340             ;KEYBOARD MULTIPLEXOR INTERRUPT VECTOR
572 KBDPSW==342
573
574 PDLORG==400                     ;ORIGIN OF PUSH DOWN LIST
575 TVLO=60000                      ;ORIGIN OF DISPLAY MEMORY
576 TVFENCE=TVLO+<CHRLN*LINHT*BYTPL> ;ADDR OF FIRST TEXT LINE THAT SHOULDN'T BE USED
577                                 ;(IT'S INCOMPLETE AND CONTAINS THE WHO-LINE).
578 TVCFENC=TVHI-<BYTPL*<CHRHT-1>>  ;DON'T TRY TO DISPLAY A CHARACTER AFTER THIS POINT
579 TVHI=TVLO+<BYTPL*NLINS>-2       ;HIGHEST LEGAL DISPLAY ADDRESS
580 CSA=157776                      ;DISPLAY REFRESH STARTING ADDRESS (STARTS AT 0)
581
582 CREG==  164044          ;UNIBUS CONSOLE REGISTER ADDRESS
583 CALU==  164045          ;CONSOLE REGISTER LOGICAL FUNCTION ADDR
584 KMS==   164050          ;KEYBOARD MULTIPLEXOR STATUS
585 KMA==   164052          ;KEYBOARD MULTIPLEXOR MEMORY ADDRESS
586 VSW==   164060          ;VIDEO SWITCH
587 ASW==   170670          ;AUDIO SWITCH
588 KLIS==  174000          ;KL11 INPUT STATUS
589 KLIB==  174002          ;KL11 INPUT BUFFER
590 KLOS==  174004          ;KL11 OUTPUT STATUS
591 KLOB==  174006          ;KL11 OUTPUT BUFFER
592
593 .EXPUNGE DIV,MUL,ASH    ;THESE ARE PREDEFINED AS 11/45 INSTRUCTIONS.
594 DIV==   177300          ;EAE GOODIES
595 AC==    177302
596 MQ==    177304
597 MUL==   177306
598 SC==    177310
599 SR==    177311
600 NOR==   177312
601 LSH==   177314
602 ASH==   177316
603 LKS==   177546          ;LINE CLOCK STATUS
604 TKS==   177560          ;TTY KEYBOARD STATUS
605 TKB==   177562          ;TTY KEYBOARD BUFFER
606 TPS==   177564          ;TTY PRINTER STATUS
607 TPB==   177566          ;TTY PRINTER BUFFER
608 CSR==   177570          ;CONSOLE SWITCH REGISTER
609 PS==    177776          ;PROCESSOR STATUS REGISTER
610 ...==0
611 ....==0
612 \f
613 ;TEN/11 COMMUNICATIONS AREA
614
615 CHAP==40                ;CHANNEL HEADER AREA POINTER
616 POINTP==42              ;POINTER TO POINTER AREA
617 CIOVER==44              ;HOLDS I/O VERSION FOR PDP-10 TO LOOK AT
618 CVERSE==46              ;ASSEMBLY VERSION FOR PDP-10
619         ;50             ;ALWAYS 0
620 INITED==52              ;INITED FLAG, SET BY 11 CLEARED BY 10
621         ;54             ;ALWAYS 0
622 GDOWN==56               ;INTERLOCKS WITH INITED, CLEARED BY 11 SET BY 10
623
624 ;CONSOLE REGISTER FUNCTIONS
625
626 CSETC==0
627 CNOR==1
628 CANDC==2
629 CSETZ==3
630 CNAND==4
631 CCOMP==5
632 CXOR==6
633 CANCSD==7
634 CEQV==11
635 CORCSD==10
636 CSAME==12
637 CAND==13
638 CORSCD==13
639 CSETO==14
640 CIOR==16
641 CSET==17
642
643 ;INTERRUPT LEVELS
644
645 KBDLVL==5_5     ;KEYBOARD MULTIPLEXOR INT. PRIORITY (BUT HANDLER RUNS AT LKLVL).
646 LKLVL==6_5      ;LINE CLOCK
647 ERRLVL==7_5     ;PROCESSOR ERRORS
648
649 ;MISCELLANEOUS ASSIGNMENTS
650
651 IOVER==3        ;I/O VERSION FOR ITS
652 PDL==400        ;PUSH DOWN LIST SIZE
653 MAXKBD==64.     ;MAXIMUM # OF KEYBOARDS
654 MAXTV==16.      ;MAX NUMBER OF TV DISPLAYS
655 MAXBLK==MAXTV   ;MAXIMUM # OF BLINKERS
656 MAXASI==20      ;AUDIO SWITCH INPUTS
657 MAXASO==100     ;AUDIO SWITCH OUTPUTS
658 ASWXOR==3400    ;XOR THIS INTO EACH CONTROL WORD TO BE SENT TO THE ASW.
659 MAXVSI==20      ;VIDEO SWITCH INPUTS
660 MAXVSO==40      ;VIDEO SWITCH OUTPUTS
661 VSWSEC==2       ;# VIDEO SWITCH SECTIONS
662 VSWINC==MAXVSO_10       ;INCREMENTS VIDEO SWITCH SECTION NUMBER
663 QPYVSW==27      ;VIDEO SWITCH OUTPUT FOR TEKTRONIX VIDEO HARD COPY UNIT
664 QPTIME==21.*60. ;21. SECONDS BETWEEN COPIES
665 QPYKMS==20000   ;GENERATE COPY FROM FIRST SOURCE (IN KEYBOARD STATUS, NATURALLY)
666 QPYKM2==10000   ;GENERATE COPY FROM SECOND SOURCE.
667 BUZKMS==4000    ;BUZZ DOOR (ALSO IN KEYBOARD STATUS)
668 BUZTIM==3*60.   ;LEAVE THE DOOR BUZZING FOR 3 SECONDS
669 ELKMS8==1       ;8TH FLOOR ELEVATOR BIT, SWAPPED (IT LIVES IN BYTE 1 OR WORD)
670 ELKMS9==2       ;9TH FLOOR ELEVATOR BIT, SWAPPED.
671 ELEKMS==1400    ;ALL ELEVATOR BITS
672 ELETIM==20      ;PUSH THE BUTTON FOR 1/3 OF A SEC
673 KBDTIM==10.     ;TIME UNTIL KEYBOARD GETS RESET (IN SEMI-SLOW CLOCK TICKS)
674 MAXBEL==4       ;MAXIMUM # OF BELLS ALLOWED
675 GLITIM==60.*60.*2       ;# CLOCK TICKS BETWEEN GLITCHES ON CONSOLE FREE DPY
676 NCQSLT==100     ;# CLOCK QUEUE SLOTS
677 KBDBFL==200     ;SIZE OF KEYBOARD BUFFER
678 LBLEN==100      ;PDP-10 INPUT BUFFER SIZE (BETTER BE DIVISIBLE BY 4)
679 LBCHRS==LBLEN/2 ;# CHARACTERS IN INPUT BUFFER
680 DPSIZE==600     ;PDP-10 OUTPUT BUFFER SIZE
681 BOWBIT==10000   ;CSA BLACK ON WHITE BIT
682 SAMSK==BOWBIT-1 ;MASK FOR SCROLL REGISTER
683 CSAMSK==170000  ;COMPLEMENT OF SAMSK
684 BLKTIM==15.     ;CLOCK TICKS BETWEEN BLINKS
685 SNB==100000     ;SIGN BIT
686 PATL==400       ;SIZE OF PATCH AREA
687 CMDARG==10      ;# ARGUMENTS WHICH WILL FIT INTO PDP-10/PDP-11 COMMAND BUFFER
688 RUGSA==57100    ;STARTING ADDRESS OF RUG
689 TYMSLC==2       ;MAX # 60THS OF A SECOND, MINUS 1, TO CONCENTRATE ON ONE TV
690 \f
691 .SBTTL GO CODE, PDL, AND KBD BUFFER
692
693 .ABS
694
695 ;PUSH DOWN LIST AND KEYBOARD BUFFER
696
697 .=PDLORG+PDL
698 .IIF NE .&177,.=<.&177600>+200  ;ALIGN ON 200 BYTE BOUNDARY
699 PDBUF==.
700
701 KBDBUF:
702 .=.+KBDBFL
703 KBDEND==.
704
705 REPORT GO=,\GO
706
707 GO:     RESET                   ;IN THE PRIVACY OF YOUR OWN HOME
708         CLR     PS
709         MOV     #PDBUF,SP       ;SET UP PUSH DOWN POINTER
710         MOV     #ERRLVL,C       ;ALL PROCESSOR TRAPS GO ON 7
711         MOV     #NXMPC,B
712         MOV     #NXMBRK,(B)+    ;BUS TIME OUT
713         MOV     C,(B)+
714         MOV     #RESBRK,(B)+    ;RESERVED INSTRUCTION
715         MOV     C,(B)+
716         MOV     (B),T           ;BREAK POINT
717         BNE     .+6
718         MOV     #BPTBRK,T
719         MOV     T,(B)+
720         MOV     C,(B)+
721         MOV     #IOTBRK,(B)+    ;IOT TRAP
722         MOV     C,(B)+
723         MOV     #PWRBRK,(B)+    ;POWER FAILURE
724         MOV     C,(B)+
725         MOV     #EMTBRK,(B)+    ;EMT
726         MOV     C,(B)+
727         MOV     #TRPBRK,(B)+    ;"TRAP" TRAP (LEV 7)
728         MOV     C,(B)+
729         MOV     #CHA,(B)+       ;CHANNEL HEADER AREA
730         MOV     #POINTA,(B)+    ;POINTER AREA POINTER
731         MOV     #IOVER,(B)+     ;I/O VERSION
732         MOV     VERSE,(B)+      ;ASSEMBLY VERSION
733         CLR     (B)+            ;INITED
734         CLR     (B)+
735         MOV     C,(B)+          ;NON-ZERO SUFFICES
736         MOV     C,(B)+          ;GDOWN
737         MOV     #CLKBRK,LKPC    ;CLOCK
738         MOV     #LKLVL,LKPSW
739         MOV     #KBDBRK,KBDPC   ;KBD
740         MOV     #LKLVL,KBDPSW
741         MOV     #BPT,0          ;CATCH JUMPS TO ZERO.
742
743 ;FALLS THROUGH
744 \f
745 ;INITIALIZE VARIBLES    FALLS THROUGH
746
747         JSR     PC,INIT
748
749 ;ENABLE INTERRUPTS
750
751         MOV     #100,LKS        ;CLOCK
752         MOV     #KBDBUF,KMA
753         MOV     #KBDBUF,OLDKMA
754         MOV     #140,KMS        ;KEYBOARD MULTIPLEXOR
755         MOV     #-1,INITED
756
757 ;THE MAIN LOOP
758
759 MAIN:   MOV     #MAXTV-1,U              ;CHANNEL
760         CMP     WHOTIM,ITSTI1           ;TIME FOR WHO LINES?
761         BEQ     MAIN1
762         ZAPFLG  WHOFLG                  ;TRIGGER WHO LINES
763 MAIN1:  TST     INITED
764         BEQ     GO                      ;RESET THE WORLD
765         TST     CSR
766         BLT     GO2RUG                  ;SWITCH 15 => GO TO RUG
767 MAIN3:  JSR     PC,DPYDPY
768         MOV     CMDFLG,A                ;PDP-10 GIVING COMMAND?
769         BLE     MAIN2
770         PUSH    U
771         JSR     PC,TENCMD               ;PROCESS THE COMMAND
772         POP     U
773 MAIN2:  DEC     U
774         BGE     MAIN1                   ;CYCLED THROUGH ALL CHANNELS?
775         CLR     WHOFLG                  ;TURN OFF WHO LINES
776         BR      MAIN
777
778 GO2RUG: BPT
779         BR      MAIN3
780
781 ;HERE TO RESTART, NOTIFY THE PDP-10
782
783 GODOWN: RESET
784         CLR     PS
785         MOV     #INITED-2,B
786         CLR     (B)+
787         CLR     (B)+            ;INITED
788         CLR     (B)+
789         CLR     (B)+            ;GDOWN
790         TST     GDOWN           ;WAIT FOR THE PDP-10 TO REPLY
791         BEQ     .-4
792         JMP     GO
793 \f
794 .SBTTL INITIALIZATION
795
796 INIT:   CLR     TICKS
797         CLR     TICKS1
798 ;******* TEMPORARY CODE FOR FONT CHECKSUM *******
799         MOV #FNTORG,T
800         MOV T,CKSPNT
801         CLR CKSSUM
802         CLR TT
803 1$:     ADD (T)+,TT
804         CMP T,#FNTEND
805         BLO 1$
806         MOV TT,CKSSMG
807 ;******* END OF TEMPORARY CODE *******
808         CLR     KBDFLG
809         CLR     KBDFLG+2
810         CLR     KBDACT
811         CLR     KBDLAST
812         CLR     KBDTSW
813         CLR     CMDFLG
814         CLR     CMDFLG+2
815         CLR     WHOTIM
816         CLR     ITSTI1
817         CLR     WHOFLG
818         CLR     TENWHO
819         CLR     QPYSWT
820         CLR     BUZSWT
821         CLR     ELESWT
822         CLR     SSCC
823         JSR     PC,REASW                ;FEED EVERY SPEAKER SILENCE.
824
825         MOV     #LEBUFS,U               ;INITIALIZE FREE LIST OF 11-TO-10 INPUT BUFFERS.
826         MOV     U,FSP
827         MOV     #NLBUFS-1,B
828 INIT6:  MOV     U,TT
829         ADD     #<LHLEN+LBLEN>,TT
830         MOV     TT,LHFS(U)
831         MOV     TT,U
832         DEC     B
833         BGT     INIT6
834         CLR     LHFS(U)                 ;END OF LIST
835
836         CLR     BLINK
837         MOV     #BLINKS,A
838         MOV     #BELCNT,C
839         MOV     #-1,T                   ;SET UP BELL COUNTS
840         MOV     #MAXTV-1,B
841         CLR     ITSTDP
842 INIT5:  CLRB    CHNUSE(B)               ;EVERY CHANNEL IS FREE.
843         CLRB    BLKSWT(B)               ;NO TV HAS BLINKING TEMPORARILY INHIBITED.
844         TSTB    CHCREG(B)               ;HOW MANY CHANNELS ARE WORKING?
845         BLT     INIT5A
846         INC     ITSTDP
847 INIT5A: CLR     (A)+
848         MOV     T,(C)+
849         DEC     B
850         BGE     INIT5
851         MOV     ITSTDP,ITSFDP           ;# FREE DPY'S
852
853         MOV     #MAXBLK,B               ;PUT ALL BLINKER BLOCKS ON THE FREE BLINKERS LIST.
854         MOV     #BLKVAR,U
855         MOV     U,FBLINK
856 INIT7:  MOV     U,TT
857         ADD     #BLLEN,TT
858         MOV     TT,BLNEXT(U)
859         CLRB    BLON(U)
860         MOV     TT,U
861         DEC     B
862         BGT     INIT7
863         CLR     <BLNEXT-BLLEN>(U)
864
865         MOV     #MAXTV-1,A
866         CLR     T
867         MOV     #WHVARS,C
868 INIT2:  MOV     DPYCHN(T),U
869         JSR     PC,CHCLR                ;SET UP THAT CHANNEL
870         MOV     #-1,DPYKBD(T)
871         MOV     #-1,CHNCLS(T)
872         CLR     ECOFLG(T)
873         MOV     C,WHOLIN(T)
874         MOV     #-1,(C) .SEE WHJOB
875         ADD     #WHLEN,C
876         CMP     (T)+,(T)+
877         DEC     A
878         BGE     INIT2                   ;MORE DPY CHANNELS TO SET UP?
879
880         MOV     #-1,C
881         JSR     PC,CHCONS       ;GET A CHANNEL FOR THE FREE SCREENS.
882         TST     T
883         BEQ     .+4             ;THIS SHOULD ALWAYS GIVE US CHANNEL 0.
884          BPT
885         MOV     WHOLIN,TT               ;WANT SYSTEM WHO LINE ON CONSOLE FREE DPY
886         MOV     #NWHCMD,WHMODE(TT)
887         MOVB    CHCREG,TT               ;TT GETS WHICH VIDEO BUFFER IT IS.
888         MOV     TT,DPYFRE               ;REMEMBER # OF DPY USED FOR FREE SCREENS.
889         MOVB    TT,CREG                 ;SET UP CONSOLE REGISTER FOR PRINT
890         CLR     CSA
891         TYPOUT  </TV's ready, but not in operation
892 />
893         MOVB    LECREG(U),C             ;DPY
894         ASL     C
895         MOV     #MAXVSO-1,B             ;SWITCH TO ALL OUTPUTS
896 INIT1:  MOV     DPYVSW(C),TT            ;VIDEO SWITCH INPUT
897         MOV     B,T                     ;SWITCH OUTPUT
898         JSR     PC,VSWIT
899         DEC     B
900         BGE     INIT1
901
902         MOV     #MAXKBD,A               ;CLEAR KBDLE
903         CLR     B
904 INIT8:  CLR     KBDLE(B)
905         CLR     KBDESC(B)
906         MOV     #-1,KBDDEF(B)
907         TST     (B)+
908         DEC     A
909         BGT     INIT8
910
911         MOV     #NCQSLT-1,C             ;INITIALIZE CLOCK QUEUE
912         CLR     CLOCKQ
913         MOV     #CQUEUE,A
914         MOV     A,CLOCKF
915 INIT9:  MOV     A,B
916         ADD     #CQLEN,B
917         MOV     B,(A)
918         MOV     B,A
919         DEC     C
920         BGT     INIT9
921         CLR     (A)
922         MOVB    #CSET,CALU
923         MOV     CREG,T                  ;SEED QUEUE WITH GLITCH CONSOLE FREE
924         JSR     TT,ADQUE
925                 GLITIM
926                 MSGLIT
927         RTS     PC
928 \f
929 .SBTTL MAIN PROGRAM LEVEL ROUTINES
930
931 ;HERE TO GET CHARACTER FROM OPEN CHANNEL
932 ;LOOPS UNTIL NO MORE CHARACTERS AVAILABLE
933
934 DPYDPY: TSTB    CHNUSE(U)
935         BLE     DPYD5                   ;IGNORE FREE DISPLAYS.
936         PUSH    U                       ;DPY CHANNEL NUMBER
937         ASL     U
938         ASL     U
939         PUSH    U
940         MOV     DPYCHN(U),U             ;U GETS CHANNEL VAR BLOCK ADDR
941         JSR     PC,GETCHR               ;ANY OUTPUT FOR THIS CHANNEL?
942         BEQ     DPYDON                  ;NO, GO CHECK FOR WHO LINES, ETC.
943         MOV     #TYMSLC,TYMSHR          ;MAX TIME BEFORE CHECKING OTHER CHANNELS
944         MOVB    LECREG(U),T             ;SET UP CONSOLE REGISTER
945         MOVB    T,CREG
946         PUSH    T
947         BLKOFF  T                       ;TURN OFF ALL BLINKERS ON THIS SCREEN
948         JSR     PC,CLBLIN               ;AND CLEAR THEM
949         PUSH    U                       ;SAVE PAGE PRINTER FOR DPYTVO+5
950         MOVB    #CIOR,CALU              ;ALU FUNCTION FOR DRAWING CHARACTERS
951         MOV     LECPC(U),TT             ;RESUMING COROUTINE?
952         BEQ     DPYDP1                  ;NO.
953         MOV     LESVB(U),B              ;YES, RESTORE B AND PC FOR CORETURN FROM THE
954         CLR     LECPC(U)                ;GETCHC THAT DIDN'T FIND ANY CHARS.
955         BIC     #-400,A                 ;CLEAR EXTRA BITS DUE TO SIGN-EXTENSION
956         PUSH    #DPYXIT                 ;GETCHC'S CALLER'S RETURN ADDR MUST BE DPYXIT.
957         JMP     (TT)                    ;GETCHC ENFORCES THAT.
958
959 ;FAST CHARACTER OUTPUT LOOP
960 DPYDP1: MOV     (SP),U                  ;GET PP POINTER
961         MOVB    A,A                     ;FLUSH HIGH BITS FROM CHAR
962         BLT     DPYCTL                  ;BRANCH IF NON-PRINTING CONTROL FUNCTION
963 DPYTVO: MOV     LEPHS(U),C              ;SET UP TO DRAW CHARACTER
964         MOV     LECC(U),TT              ;THIS IS OPEN-CODED FOR SPEED
965         ASL     A                       ;COPIED FROM CODE AT GENCHR
966         MOV     CTAB(A),T
967         JSR     PC,GENCH1               ;GENERATE CHARACTER, CLOBBER ALL ACS
968         MOV     (SP),U                  ;RESTORE PP POINTER, CLOBBERED BY GENCH1
969         JSR     PC,LEDADC               ;ADVANCE CURSOR
970 DPYXIT: TST     TYMSHR                  ;TIME UP?
971         BMI     DPYDX2                  ;YES, LEAVE THIS TV FOR A WHILE
972         MOV     (SP),U
973         JSR     PC,GETCHR               ;NO, GET NEXT CHARACTER
974         BNE     DPYDP1                  ;AND LOOP BACK TO PROCESS IT
975 DPYDX2: POP     U
976         POP     T                       ;DONE WITH THIS DPY FOR NOW
977         BLKON   T                       ;ALLOW BLINKERS TO BLINK AGAIN
978         BR      DPYDON
979 \f
980 ;HERE IF NO CHARACTER AVAILABLE.  TWO WORDS STILL ON THE STACK:
981 ;(SP) IS 4 TIMES CHANNEL NUMBER, 2(SP) IS CHANNEL NUMBER (TO BE POPPED INTO U).
982
983 DPYDON: POP     B
984         TST     CHNCLS(B)
985         BLT     DPYFLS                  ;FLUSH DPY CHANNEL?
986         TST     ECOFLG(B)
987         BEQ     DPYD2                   ;CAUSE PSEUDO ACTIVATION?
988         MOV     U,T
989         ADD     #LEZER0,T
990
991         CHROFF
992         MOV     KBDACT,LELIST(TT)       ;PUT LINE EDITOR ON ACTIVE RING
993         MOV     T,KBDACT
994         TST     KBDFLG
995         BNE     DPYD0
996         MOV     T,KBDFLG
997         CLR     KBDACT
998         CLR     KBDLAST
999 DPYD0:  CHRON
1000
1001 DPYD1:  CLR     ECOFLG(B)
1002 DPYD2:  TST     WHOFLG                  ;DO WHO LINES?
1003         BEQ     DPYD3
1004         MOV     WHOLIN(B),T
1005         TST     WHMODE(T)
1006         BMI     DPYD4                   ;DON'T DO WHO LINE, BUT MIGHT WANT TO CLEAR IT
1007         TST     WHO1(T)
1008         BMI     DPYD4                   ;USER WHO MODE VAR CAN ALSO DISABLE WHO LINE
1009         JSR     PC,DOWHO                ;DO THE WHO LINE FOR THIS GUY
1010 DPYD3:  POP     U
1011 DPYD5:  RTS     PC
1012
1013 ;HERE IF NO WHO LINE IS TO BE DONE, WE MIGHT WANT TO CLEAR IT
1014
1015 DPYD4:  MOV     WHOLIN(B),T
1016         TST     2(T)                    ;IF NEGATIVE, THEN CLEAR IT
1017         BGE     DPYD3
1018         CLR     2(T)                    ;ZAP THE SWITCH
1019         JSR     PC,ZAPWHL               ;CLEAR THE LINE
1020         BR      DPYD3
1021
1022 ;HERE TO FLUSH DPY CHANNEL
1023
1024 DPYFLS: MOV     (SP),T
1025         TSTB    CHNUSE(T)       ;ALREADY FREED?
1026         BEQ     DPYD3           ;YES, THIS MEANS MAIN LOOP SHOULD SIMPLY IGNORE THIS DPY.
1027         CHROFF
1028         JSR     PC,CHRETN
1029         CHRON
1030         BR      DPYD3
1031 \f
1032 ;HERE IF CONTROL CODE FOUND
1033
1034 DPYCRF: SUB     #5,A
1035 DPYCTL: BIC     #177600,A       ;DISPATCH ON CONTROL CODE
1036         CMP     #ILLCTL,A
1037         BLOS    DPYTVO          ;BRANCH IF ILLEGAL CODE
1038         ASL     A
1039         PUSH    #DPYXIT         ;MAKE THE RETURN ADDR BE "DPYXIT"
1040         JMP     @CTLTAB(A)      ;SO GETCHC COROUTINING WILL WORK.
1041
1042 ;CONTROL FUNCTION ROUTINES CALLED WITH PP INDEX IN U.
1043 ;MAY CLOBBER ALL ACS BUT MUST LEAVE CIOR IN CALU.  MANY ARE ALSO
1044 ;CALLED FROM ELSEWHERE AND EXPECTED TO PRESERVE U.
1045
1046 CTLTAB: SETCUR          ;200    %TDMOV (FOLLOWED BY TWO IGNORED CHARS, THEN VPOS, HPOS).
1047         SETCR1          ;201    %TDMV1 (FOLLOWED BY NEW VPOS AND NEW HPOS)
1048         CLEOF           ;202    %TDEOF (CLEAR TO END OF SCREEN)
1049         CLEOL           ;203    %TDEOL (CLEAR TO END OF LINE)
1050         CLRCHR          ;204    %TDDLF (DELETE FORWARD)
1051         RTSPC           ;205    %TDMTF (MOTOR OFF - IGNORED)
1052         RTSPC           ;206    %TDMTN (MOTOR ON - IGNORED)
1053         CRLF            ;207    %TDCRL (CRLF AND CLEAR EOL, BUT SCROLL AT END OF SCREEN)
1054         RTSPC           ;210    %TDNOP (NO-OP)
1055         DPYBS           ;211    %TDBS (BACKSPACE)
1056         LF              ;212    %TDLF (LF)
1057         CR              ;213    %TDRCR (RAW CR)
1058         RTSPC           ;214    %TDORS (OUTPUT RESET - WE CAN'T DO ANYTHING USEFUL)
1059         RTSPC           ;215    %TDQOT (DEVICE DEPENDENT DATA FOLLOWS - WELL, THIS DEVICE
1060                                         ;SAYS IT DOESN'T REALLY DEPEND)
1061         LEDADC          ;216    %TDFS
1062         SETCR1          ;217    %TDMV0 (SAME AS %TDMV1 FOR OUR PURPOSES)
1063         DPYCLR          ;220    %TDCLR (HOME UP AND CLEAR SCREEN)
1064         BELL            ;221    %TDBEL (FLASH THE SCREEN)
1065         RTSPC           ;222    %TDINI (REINITIALIZE INTELLIGENT TERMINAL (NOT APPLICABLE))
1066         LINS            ;223    %TDILP (INSERT LINE POSITION (FOLLOW BY # LINES TO INSERT))
1067         LDEL            ;224    %TDDLP (DELETE LINE POSITION (FOLLOW BY # LINES TO DELETE))
1068         CINS            ;225    %TDICP (INSERT CHARACTER POSITION (FOLLOW BY # CHARS))
1069         CDEL            ;226    %TDDCP (DELETE CHARACTER POSITION (FOLLOW BY # CHARS))
1070         RTSPC           ;227    %TDBOW (IGNORED)
1071         RTSPC           ;230    %TDRST (IGNORED)
1072         RTSPC           ;231    %TDGPH (IGNORED)
1073         RGSCUP          ;232    %TDRSU (REGION SCROLL UPWARDS)
1074         RGSCDN          ;233    %TDRSD (REGION SCROLL DOWN)
1075 ILLCTL==<.-CTLTAB>/2
1076 \f
1077 .SBTTL WHO LINE ROUTINES
1078
1079 ;PRINTS WHO LINE, TAKES 10/11 CHANNEL IN B
1080
1081 DOWHO:  PUSH    B               ;SAVE 10/11 CHANNEL
1082         MOV     ITSTI1,WHOTIM   ;TIME WE DID WHO LINE
1083         MOV     #WHOPP,TT       ;SET DEFAULTS FOR WHO PAGE PRINTER
1084         MOV     #LEDFLT,T
1085         MOV     #LELEN,U
1086         JSR     PC,CALCPY       ;ZAP
1087         MOV     #WHOPP,U        ;SET UP PAGE PRINTER INDEX
1088         CLR     A               ;CHARACTER X
1089         MOV     #CHRLN,B        ;CHARACTER Y, PAST LAST LINE
1090         JSR     PC,SETXY0
1091         MOV     (SP),B          ;RESTORE 10/11 CHANNEL INDEX
1092         MOV     WHOLIN(B),A
1093         TST     WHO1(A)         ;SIGN OF .WHO1 VARIABLE INHIBITS ALL HACKERY
1094         BPL     .+4             ;ASSUME USER HAS STUFF THERE AND SHOULDN'T CLOBBER IT.
1095          RTS    PC
1096         JSR     PC,ZAPWHL       ;CLEAR OUT THE WHO LINE
1097 WHINIT: MOV     (SP),B          ;10/11 CHANNEL INDEX
1098         MOV     WHOLIN(B),TT
1099         CMP     #NWHCMD-1,WHMODE(TT)
1100         BHI     DATIME          ;NO VERSION NUMBER FOR USER WHO LINE
1101         TYPOUT  /ITS /
1102         DECTYP  ITSVER          ;TYPE VERSION NUMBER
1103         JSR     PC,SPACE
1104         TST     ITSDBG
1105         BEQ     DATIME
1106         TYPOUT  /BEING DEBUGGED /
1107
1108 ;TYPES DAY TIME AND DATE
1109
1110 DATIME: MOV     ITSDAT,A        ;PRINT PACKED DATE FIRST
1111         JSR     PC,DATTYP       ; 7 BITS YEAR, 4 MONTH, 5 DAY
1112         JSR     PC,SPACE
1113         MOV     #MQ,B
1114         MOV     ITSTI1,(B)
1115         MOV     ITSTIM,-(B)
1116         JSR     PC,TIMTY1       ;TYPE DAY TIME NEXT
1117         JSR     PC,SPACE
1118         POP     B               ;10/11 CHANNEL
1119         MOV     WHOLIN(B),TT
1120         CMP     #NWHCMD-1,WHMODE(TT)
1121         BHI     UWHLDO          ;DO USER WHO LINE?
1122
1123 ;SYSTEM WHO LINE
1124 ;ITS XXX {BEING DEBUGGED} MM/DD/YY HH:MM:SS ITSFDP/ITSTDP USR RU/JOB SHARE SWBJ JWP TRC/COR CFU
1125
1126 SWLDO:  TYPOUT  /TVS: /
1127         DECTYP  ITSFDP          ;# FREE DPYS
1128         JSR     PC,SLASH
1129         DECTYP  ITSTDP          ;TOTAL DPYS
1130         TYPOUT  / USERS: /
1131         DECTYP  ITSUSR          ;# SYSTEM USERS
1132         JSR     PC,SPACE
1133         DECTYP  ITSRU           ;RUNABLE JOBS/
1134         JSR     PC,SLASH
1135         DECTYP  ITSJOB          ;# SYSTEM JOBS
1136         JSR     PC,SPACE
1137         DECTYP  ITSFSH          ;FAIR SHARE IN %
1138         TYPOUT  /% SB=/
1139         DECTYP  ITSWBJ          ;SWAP BLOCKED JOBS
1140         TYPOUT  / PG=/
1141         DECTYP  ITSJWP          ;JOBS WAITING FOR PAGES
1142         TYPOUT  / CORE: /
1143         DECTYP  ITSTRC          ;RUNABLE CORE
1144         JSR     PC,SLASH
1145         DECTYP  ITSCOR          ;TOTAL CORE
1146         JSR     PC,SPACE
1147         DECTYP  ITSCFU          ;CORE FOR USERS
1148         RTS     PC
1149 \f
1150 ;USER WHO LINE
1151 ;MM/DD/YY HH:MM:SS JOB UNAME JNAME SNAME STATUS J%RT HH:MM:SS.S JCORE {USER VARS}
1152
1153 WHNOJB: TYPOUT / JOB SLOT VACANT/               ;HERE IF JOB SLOT VACANT
1154         RTS     PC
1155
1156 UWHLDO: OCTYPE  WHJOB(TT)       ;JOB #
1157         TST     WHSTAT(TT)
1158         BEQ     WHNOJB          ;VACANT JOB SLOT?
1159         JSR     PC,SPACE
1160         MOV     #WHUNAM,T
1161         ADD     TT,T
1162         JSR     PC,SIXPNT       ;UNAME
1163         JSR     PC,SPACE
1164         JSR     PC,SIXPNT       ;JNAME
1165         JSR     PC,SPACE
1166         JSR     PC,SIXPNT       ;SNAME
1167         JSR     PC,SPACE
1168         JSR     PC,SIXPNT       ;STATUS
1169         JSR     PC,SPACE
1170         DECTYP  WHJ%RT(TT)      ;JOB % RUN TIME
1171         JSR     PC,SLASH
1172         DECTYP  ITSFSH          ;OUT OF FAIR SHARE
1173         JSR     PC,PERCNT
1174         JSR     PC,SPACE
1175         MOV     WHJTRT(TT),A    ;JOB RUNTIME IN .1-SEC TICKS
1176         JSR     PC,TIMTEN
1177         JSR     PC,SPACE
1178         DECTYP  WHRPAG(TT)      ;# PAGES REAL CORE
1179         JSR     PC,SLASH
1180         DECTYP  WHTPAG(TT)      ;# PAGES OF VIRTUAL CORE
1181         MOV     #'K,A
1182         JSR     PC,TVO
1183         JSR     PC,SPACE
1184         MOV     WHO1(TT),A      ;PRINT FIRST USER WHO VAR
1185         MOV     #WHO2,T
1186         JSR     PC,UWVDO
1187         MOV     WHO1A(TT),A     ;MAYBE PRINT SPACE
1188         BMI     UWHLD1
1189         JSR     PC,SPACE
1190         MOV     WHO1A(TT),A
1191 UWHLD1: MOV     #WHO3,T         ;NOW SECOND USER WHO VAR
1192 ;TAKE CONTROL WORD IN A, OFFSET (OFF TT) TO FOUR WORDS IN T, PRINT USER WHO VAR
1193 ;CONTROL WORD:
1194 ;       15      USED ELSEWHERE - IGNORE HERE
1195 ;       14      SUPPRESS SPACE BETWEEN TWO HALVES
1196 ;       13-11   MODE FOR FIRST HALF
1197 ;       10-08   MODE FOR SECOND HALF
1198 ;       07      DOUBLE 06-00
1199 ;       06-00   CHARACTER TO PRINT AFTER FIRST HALF, BEFORE SPACE
1200 UWVDO:  PUSH    A               ;SAVE CONTROL WORD
1201         ADD     TT,T            ;T POINT TO VAR
1202         MOVB    1(SP),A
1203         ASR     A               ;GET FIRST MODE
1204         ASR     A
1205         ASR     A
1206         JSR     PC,UWVDO4       ;PRINT FIRST HALF
1207         MOVB    (SP),A
1208         BEQ     UWVDO1
1209         BIT     #200,A
1210         BEQ     UWVDO3
1211         JSR     PC,TVOMSK       ;SEPARATOR CHAR(S)
1212 UWVDO3: JSR     PC,TVOMSK
1213 UWVDO1: BITB    #100,1(SP)
1214         BNE     UWVDO2
1215         JSR     PC,SPACE        ;INTERVENING SPACE
1216 UWVDO2: MOVB    1(SP),A         ;GET SECOND MODE
1217         TST     (SP)+           ;POP CONTROL WORD, THEN DO SECOND HALF
1218 UWVDO4: BIC     #177770,A
1219         ASL     A
1220         JMP     @UWVDTB(A)
1221
1222 UWVDTB: RTSPC                   ;0      DON'T PRINT
1223         UWVDAT                  ;1      PACKED DATE AS MM/DD/YY
1224         UWVTEN                  ;2      TIME IN .025 SECONDS AS HH:MM:SS.T
1225         UWVHAK                  ;3      TIME IN .5 SECONDS AS HH:MM:SS
1226         UWVHAK                  ;4      OCTAL (18. BITS)
1227         UWVHAK                  ;5      DECIMAL (18. BITS)
1228         SIXPN1                  ;6      THREE SIXBIT CHARS
1229         RTSPC                   ;7      RESERVED FOR EXPANSION
1230 \f
1231 ;USER-CONTROLLED WHO-LINE FIELD PRINT-OUT ROUTINES.
1232
1233 UWVHAK: MOV     #MQ,B
1234         TST     (T)+
1235         MOV     (T),(B)
1236         MOV     -(T),-(B)
1237         CMP     (T)+,(T)+
1238         MOV     #-14.,LSH
1239         JMP     @UWVDT1-6(A)
1240
1241 UWVDT1: TIMTY1
1242         UWVOCT
1243         UWVDEC
1244
1245 UWVOCT: MOV     #10,B
1246         BR      UWVDC1
1247
1248 UWVDEC: MOV     #10.,B
1249 UWVDC1: PUSH    RADIX
1250         MOV     B,RADIX
1251         JSR     PC,DECPN9
1252         POP     RADIX
1253         RTS     PC
1254
1255 UWVTEN: MOV     (T)+,A
1256         TST     (T)+
1257         JMP     TIMTEN
1258
1259 UWVDAT: MOV     (T)+,A
1260         TST     (T)+
1261         JMP     DATTYP
1262
1263 ;SOME WHO LINE UTILITY ROUTINES
1264
1265 PERCNT: MOV     #'%,A
1266 JMPTVO: JMP     TVO
1267
1268 SPACE:  MOV     #40,A
1269         BR      JMPTVO
1270
1271 SLASH:  MOV     #'/,A
1272         BR      JMPTVO
1273
1274 ;TAKES POINTER TO SIXBIT IN T AND TYPES IT (ADVANCING T)
1275
1276 SIXPNT: JSR     PC,SIXPN1       ;DO TWO SETS OF THREE CHARS
1277 SIXPN1: MOV     #MUL,B          ;DO ONE SET OF THREE CHARS
1278         MOV     #LSH,C
1279         CMP     (T)+,(T)+       ;BAG BITING EAE HAS TO LOADED IN JUST THE RIGHT ORDER
1280         MOV     -(T),-(B)       ;LOW ORDER FIRST
1281         MOV     -(T),-(B)
1282         CMP     (T)+,(T)+
1283         MOV     #-10.,(C)       ;FIRST CHARCTER IN AC, THE REST IN MQ
1284         JSR     PC,SIXPN2       ;PRINT FIRST CHAR
1285         JSR     PC,SIXPN2       ;PRINT SECOND, FALL IN FOR THIRD
1286 SIXPN2: MOV     (B)+,A          ;SIXBIT
1287         ADD     #40,A           ;ASCII
1288         PUSH    (B)+
1289         JSR     PC,TVO
1290         POP     -(B)
1291         CLR     -(B)            ;CLEAR AC
1292         MOV     #6,(C)          ;NEXT CHARACTER INTO AC
1293         RTS     PC
1294 \f
1295 ;TAKES TENTHS OF SECONDS IN A AND PRINTS AS HH:MM:SS.T
1296
1297 TIMTEN: MOV     #MQ,T
1298         MOV     A,(T)
1299         CLR     -(T)
1300         MOV     #10.,-(T)       ;DO DIVIDE
1301         TST     (T)+
1302         PUSH    (T)+            ;TENTH'S OF SECONDS
1303         MOV     (T),A
1304         ASL     A               ;# HALF SECONDS JOB HAS BEEN RUNNING
1305         JSR     PC,TIMTYP       ;TYPE TIME
1306         MOV     #'.,A
1307         JSR     PC,TVO
1308         POP     A               ;TENTH'S OF SECONDS
1309         JMP     DECPNT
1310
1311 ;TAKES # HALF SECONDS IN A AND TYPES TIME IN HH:MM:SS FORMAT
1312
1313 TIMTYP: MOV     #MQ,B
1314         MOV     A,(B)
1315         CLR     -(B)
1316 ;TAKE # HALF SECONDS IN EAE AC-MQ AND TYPE AS HH:MM:SS
1317 TIMTY1: MOV     #120.,-(B)      ;MINUTES SINCE MIDNIGHT
1318         TST     (B)+
1319         PUSH    (B)             ;REMAINDER IS SS*2
1320         ASR     (SP)
1321         CLR     (B)             ;CLEAR AC
1322         MOV     #60.,-(B)       ;HOURS SINCE MIDNIGHT
1323         TST     (B)+
1324         PUSH    (B)+            ;REMAINDER IS MM
1325         MOV     (B),A           ;HH
1326         JSR     PC,DECPNT
1327         MOV     #':,C           ;COLON SEPARATES GOODIES
1328         POP     A
1329         JSR     PC,MSDPNT       ;PRINTS COLON AND PADS WITH LEADING ZERO IF NECESSARY
1330         POP     A
1331 MSDPNT: PUSH    A
1332         MOV     C,A             ;PRINT SEPARATING CHARACTER
1333         JSR     PC,TVO
1334         CMP     #10.,(SP)
1335         BLE     MSDPN1          ;PAD WITH LEADING ZERO?
1336         MOV     #'0,A
1337         JSR     PC,TVO
1338 MSDPN1: POP     A
1339         JMP     DECPNT          ;PRINT NUMBER
1340
1341 ;TAKE DATE PACKED AS 7 BITS YEAR, 4 MONTH, 5 DAY AND PRINT AS MM/DD/YY
1342
1343 DATTYP: MOV     #MQ,B
1344         MOV     A,(B)
1345         CLR     -(B)            ;CLEAR AC
1346         MOV     #LSH,C
1347         MOV     #7,(C)          ;YEAR
1348         PUSH    (B)
1349         CLR     (B)
1350         MOV     #4,(C)          ;MONTH
1351         MOV     (B),A
1352         CLR     (B)
1353         MOV     #5,(C)          ;DAY
1354         PUSH    (B)
1355         JSR     PC,DECPNT       ;PRINT MONTH
1356         MOV     #'/,C           ;USE SLASH AS SEPARATOR
1357         POP     A
1358         JSR     PC,MSDPNT       ;PRINT DAY
1359         POP     A
1360         JMP     MSDPNT          ;PRINT YEAR
1361
1362 \f
1363 .SBTTL PDP-10 COMMAND PROCESSOR SWITCH VIDEO SWITCH, ETC.
1364
1365 TENCMD: CMP     #MAXCMD,A       ;LEGAL COMMAND?
1366         BLOS    TENCFL          ;NO, COMMAND FAILS
1367         ASL     A               ;BYTES FOR DISPATCH
1368         JMP     @TENDSP(A)
1369
1370 ;PDP-10 COMMAND DISPATCH
1371
1372 TENDSP: TENCFL  ;0 ILLEGAL
1373         TENVSW  ;1 VIDEO SWITCH
1374         TENDPC  ;2 CONS DPY FOR PDP-10
1375         TENDPR  ;3 RETURN DPY
1376         TENRVS  ;4 READ VIDEO SWITCH
1377         TENASW  ;5 AUDIO SWITCH
1378         TENRAS  ;6 READ AUDIO SWITCH
1379 MAXCMD==<.-TENDSP>/2
1380
1381 ;HERE TO SWITCH VIDEO SWITCH
1382
1383 TENVSW: MOV     CMDBUF,TT       ;SWITCH INPUT
1384         MOV     CMDBUF+4,T      ;SWITCH OUTPUT
1385         CHROFF                  ;INHIBIT INTERRUPTS WHILE WE DO THIS
1386         JSR     PC,VSWCMD       ;CHECKS FOR LEGAL BEFORE SWITCHING
1387         BHIS    TENCF1          ;JUMP IF THEY WERE ILLEGAL.
1388 TENCS1: CHRON
1389 TENCSD: MOV     #-1,CMDFLG      ;COMMAND SUCCEEDS
1390         RTS     PC
1391
1392 ;SWITCH AUDIO SWITCH UPON COMMAND FROM PDP-10
1393
1394 TENASW: MOV     CMDBUF,TT       ;SWITCH INPUT
1395         MOV     CMDBUF+4,T      ;SWITCH OUTPUT
1396         CHROFF
1397         JSR     PC,ASWCMD       ;SWITCH SWITCH, TESTING LEGALITY.
1398         BHIS    TENCF1          ;JUMP IF THEY WERE ILLEGAL, TO SAY COMMAND FAILED.
1399         BR      TENCS1
1400
1401 ;HERE TO CONS UP DPY FOR PDP-10
1402
1403 TENDPC: CHROFF                  ;INHIBIT INTERRUPTS AGAIN
1404         MOV     CMDBUF,C        ;ARG IS KEYBOARD TO USE, OR -1 FOR NO KEYBOARD.
1405         CMP     C,#MAXKBD       ;BUT BARF IF ILLEGAL KEYBOARD NUMBER.
1406         BGE     TENCF1
1407         JSR     PC,CHCONS       ;GET A CHANNEL, CONNECT IT TO THAT KEYBOARD.
1408         TST     T
1409         BLT     TENCF1          ;CAN'T => COMMAND FAILS.
1410         MOVB    LECREG(U),CMDBUF ;ELSE RETURN THE VIDEO BUFFER NUMBER
1411         CLRB    CMDBUF+1
1412         MOV     T,CMDBUF+4      ;AND THE 10-11 CHANNEL NUMBER (TTY NUMBER MINUS 52).
1413         BR      TENCS1
1414
1415 TENCF1: CHRON
1416 TENCFL: CLR     CMDFLG          ;REPORT FAILURE OF A COMMAND TO THE TEN.
1417         RTS     PC
1418
1419 ;HERE TO RETURN DPY ON COMMAND
1420
1421 TENDPR: MOV     CMDBUF,TT       ;THE DPY TO RETURN
1422         MOV     #MAXTV-1,T
1423 TENDR0: CMPB    CHCREG(T),TT    ;WHICH CHANNEL DOES IT BELONG TO?  GET # IN T.
1424         BEQ     TENDR1
1425         DEC     T
1426         BGE     TENDR0
1427         BR      TENCSD
1428
1429 TENDR1: TST     CHNUSE(T)       ;DO NOTHING IF THE CHANNEL IS FREE.
1430         BEQ     TENCSD
1431         CHROFF                  ;OTHERWISE, FREE THAT CHANNEL.
1432         JSR     PC,CHRETN
1433         BR      TENCS1
1434 \f
1435 ;HERE RETURN STATE OF VIDEO SWITCH
1436
1437 TENRVS: JSR     PC,SWTARG       ;SET UP 10-11 CHANNEL ARGUMENT
1438         BLOS    TENCFL          ;ILLEGAL ARG MAKES COMMAND FAIL
1439         JMP     @RVSDSP(T)
1440 RVSDSP: TENCFL                  ;0 IS ILLEGAL
1441         RVSCHN                  ;1 10/11 CHANNEL #
1442         RVSKBD                  ;2 KBD #
1443         RVSOUT                  ;3 VIDEO SWITCH OUTPUT #
1444 NSWTRG==<.-RVSDSP>/2
1445
1446 RVSKBD: JSR     PC,CHKKBD       ;HERE GIVEN KBD #;  TEST IT.
1447         BHI     RVSCH1          ;IF LEGAL, FALL INTO MAIN LINE CODE
1448         BR      TENCFL          ;ILLEGAL, TELL HIM SO
1449
1450 RVSOUT: MOV     CMDBUF+4,TT     ;HERE GIVEN VIDEO SWITCH OUTPUT #.
1451         MOV     #-1,T           ;ILLEGAL KBD #
1452         CMP     #MAXVSO,TT      ;CHECK FOR LEGAL
1453         BHI     RVSCH2          ;FALL INTO MAIN LINE CODE
1454         BR      TENCFL          ;HERE IF ILLEGAL        
1455
1456 RVSCHN: JSR     PC,CHNKBD       ;HERE GIVEN 10-11 CHANNEL #; GET KBD # IN T
1457         BLOS    TENCFL
1458 RVSCH1: MOVB    KBDVSW(T),TT    ;GET VIDEO SWITCH OUTPUT INTO TT
1459 RVSCH2: MOV     TT,CMDBUF+<4*4> ;PUT VIDEO SWITCH OUTPUT INTO COMMAND BUFFER
1460         MOV     TT,CMDBUF+<3*4>
1461         TST     CMDBUF
1462         BMI     RVSDF           ;BRANCH IF HE WANTS DEFAULT INPUT OF THIS OUTPUT.
1463         MOVB    VSWTAB(TT),TT   ;GET CURRENT INPUT OF THIS OUTPUT AND STORE.
1464         BR      RVSCH3
1465
1466 RVSDF:  ASL     T               ;MAKE IT BYTE INDEX
1467         BMI     RVSNL           ;NEGATIVE IF NOT LOGGED IN
1468         MOV     KBDLE(T),U
1469         BEQ     RVSNL           ;KBD NOT LOGGED IN, ITS THE DEFAULT
1470 RVSDF1: MOVB    LECREG(U),TT    ;THE REGISTER HE HACKS
1471         CMP     #MAXTV,TT
1472         BLOS    TENCFL          ;BRANCH IF ILLEGAL CONSOLE #
1473         ASL     TT              ;MAKE IT A BYTE INDEX
1474         MOV     DPYVSW(TT),TT   ;VIDEO SWITCH INPUT
1475 RVSCH3: MOV     TT,CMDBUF+<2*4> ;STORE SWITCH INPUT INTO COMMAND BUFFER
1476         BR      TENCSD
1477
1478 RVSNL:  MOV     DPYCHN,U        ;CHANNEL 0 IS CONSOLE FREE CHANNEL
1479         BR      RVSDF1          ;AND BACK INTO MAIN STREAM
1480 \f
1481 ;GIVEN 10/11 CHANNEL # AND RETURNS KBD IN T
1482
1483 CHNKBD: MOV     CMDBUF+4,T      ;PICK UP CHANNEL #
1484         CMP     #MAXTV,T
1485         BLOS    CHNKB2
1486         ASL     T               ;MAKE CHANNEL # INTO INDEX INTO CHANNEL TABLES
1487         ASL     T
1488         TST     CHNCLS(T)       ;MAKE SURE CHANNEL IS OPEN
1489         BLT     CHNKB3
1490         MOVB    DPYKBD(T),T     ;PICK UP KBD #
1491 CHNKB1: CMP     #MAXKBD,T       ;FIX CONDITION CODES FOR SUCCESSFUL RETURN
1492 CHNKB2: RTS     PC
1493
1494 CHNKB3: MOV     #MAXKBD+1,T     ;HERE IF CHANNEL CLOSED
1495         BR      CHNKB1          ;CONS UP ILLEGAL KBD #
1496
1497 CHKKBD: MOV     CMDBUF+4,T      ;CHECK FOR REASONABLE KBD #
1498         BR      CHNKB1
1499
1500 ;HERE TO SET UP SWITCH ARG FOR 10-11 COMMAND RETURN IN CONDITION CODES
1501 ;IS THE RESULT OF CMP #NCHARG,<argument type> TO CHECK FOR LEGALITY
1502
1503 SWTARG: MOV     CMDBUF,T        ;ARGUMENT TYPE
1504         BPL     .+4             ;MAKE SURE WE HAVE A POSITIVE #
1505         NEG     T
1506         ASL     T               ;MAKE IT INTO A BYTE INDEX
1507         CMP     #NSWTRG*2,T     ;TEST FOR LEGAL
1508         RTS     PC
1509 \f
1510 ;HERE RETURN STATE OF AUDEO SWITCH
1511
1512 TENRAS: JSR     PC,SWTARG       ;SET UP 10-11 CHANNEL ARGUMENT
1513         BLOS    RASLOS          ;ILLEGAL ARG MAKES COMMAND FAIL
1514         JMP     @RASDSP(T)
1515 RASDSP: TENCFL                  ;0 IS ILLEGAL
1516         RASCHN                  ;1 10/11 CHANNEL #
1517         RASKBD                  ;2 KBD #
1518         RASOUT                  ;3 AUDEO SWITCH OUTPUT #
1519 .IIF NZ .-<NSWTRG*2>-RASDSP,.ERROR RASDSP AND RVSDSP DIFFER.
1520
1521 RASCHN: JSR     PC,CHNKBD               ;GIVEN A 10-11 CHANNEL #;  GET KBD # IN T
1522         BLOS    RASLOS
1523 RASCH1: MOVB    KBDASW(T),TT            ;GET AUDEO SWITCH OUTPUT INTO TT
1524 RASCH2: MOV     TT,CMDBUF+<3*4>         ;PUT OUTPUT NUMBER IN AS RETURN VALUE.
1525         CLR     CMDBUF+<2*4>            ;IF HE WANTS DEFAULT INPUT OF THIS OUTPUT, IT'S 0.
1526         TST     CMDBUF
1527         BMI     RASCH3                  ;BRANCH IF HE WANTS DEFAULT INPUT OF THIS OUTPUT.
1528         MOVB    ASWTAB(TT),CMDBUF+<2*4> ;GET CURRENT INPUT OF THIS OUTPUT AND STORE.
1529 RASCH3: JMP     TENCSD
1530
1531 RASKBD: JSR     PC,CHKKBD       ;HERE IF GIVEN KBD #; TEST FOR LEGALITY.
1532         BHI     RASCH1          ;IF LEGAL, FALL INTO MAIN LINE CODE
1533 RASLOS: JMP     TENCFL          ;ILLEGAL, TELL HIM SO
1534
1535 RASOUT: MOV     CMDBUF+4,TT     ;HERE IS GIVEN AUDEO SWITCH OUTPUT
1536         CMP     #MAXASO,TT      ;CHECK FOR LEGAL
1537         BHI     RASCH2          ;FALL INTO MAIN LINE CODE
1538         BR      RASLOS          ;HERE IF ILLEGAL        
1539 \f
1540 .SBTTL ERROR TRAPS HERE
1541
1542 NXMBRK: BPT
1543 RESBRK: BPT
1544 IOTBRK: BPT
1545 PWRBRK: BPT
1546 EMTBRK: BPT
1547 TRPBRK: BPT
1548
1549 ;BPT BREAKS COME HERE IF THERE IS NO RUG.
1550 ;DON'T WANT TO HALT THE 11 SINCE 11TEN INTERFACE WOULDN'T BE ABLE TO GET TO BUS.
1551 ;WANT TO PUT CONTENTS OF REGISTERS IN CORE WHERE CARPET CAN GET AT THEM.
1552
1553 BPTBRK: .REPT 7                 ;SAVE THE ACS
1554          MOV %0+.RPCNT,BPTACS+<2*.RPCNT>
1555         .ENDR
1556         MOV #INITED-2,A         ;TELL THE 10 WE'RE DOWN
1557         CLR (A)+
1558         CLR (A)+
1559         CLR (A)+
1560         CLR (A)+
1561
1562 ; BELOW LOSES - PREVENTS RESTUFFING UNLESS YOU GO HIT SWITCHES
1563 ;       WAIT                    ;PUT 000001 IN LIGHTS (11/05)
1564         BR .                    ;WAIT FOR RELOAD OR MANUAL INTERVENTION
1565                                 ;BRANCH TO POINT SO STUFF WILL AUTOMATICALLY START IT.
1566         .REPT 7                 ;PROCEED
1567          MOV BPTACS+<2*.RPCNT>,%0+.RPCNT
1568         .ENDR
1569         RTI
1570
1571 BPTACS: .BLKW 7
1572 \f
1573 .SBTTL CLOCK ROUTINES CAUSE BLINKING
1574
1575 CLKBRK: DEC     TYMSHR          ;COUNT DOWN THIS DPY'S QUANTUM
1576 ;******* TEMPORARY CODE TO CHECKSUM THE FONT *******
1577 ;CHECKSUM IT 100 OCTAL WORDS AT A TIME, SO AS NOT TO SLOW THINGS DOWN
1578 ;TOO MUCH.  WILL GET CHECKED APPROXIMATELY FOUR TIMES A SECOND.
1579         PUSH T
1580         PUSH TT
1581         MOV CKSPNT,T
1582         MOV T,TT
1583         ADD #100*2,TT
1584         CMP TT,#FNTEND
1585         BLOS 1$
1586         MOV #FNTEND,TT
1587 1$:     ADD (T)+,CKSSUM
1588         CMP T,TT
1589         BLO 1$
1590         MOV T,CKSPNT
1591         CMP TT,#FNTEND
1592         BNE 2$
1593         CMP CKSSUM,CKSSMG
1594         BEQ .+4
1595          BPT
1596         CLR CKSSUM
1597         MOV #FNTORG,CKSPNT
1598 2$:     POP TT
1599         POP T
1600 ;******* END OF TEMPORARY CODE *******
1601         PUSH    T
1602         ADD     #1,TICKS1       ;INC DOES NOT AFFECT C-BIT (SIGH)
1603         ADC     TICKS
1604         TST     KBDFLG
1605         BNE     CLKBR1          ;HAS PDP-10 HACKED THE LAST BUNCH?
1606         MOV     KBDACT,KBDFLG   ;YES, GIVE HIM THE NEW BUNCH
1607         CLR     KBDFLG+2        ;PARANOIA REIGNS SUPREME
1608         CLR     KBDACT
1609         CLR     KBDLAST         ;POINTS TO END OF ACTIVE CHAIN
1610
1611 ;CLOCK QUEUE DISPATCH
1612
1613 CLKBR1: MOV     CLOCKQ,T
1614         BEQ     CLKBR2          ;ANYTHING ON CLOCK QUEUE?
1615         TST     (T)+            ;IGNORE CDR
1616         CMP     (T)+,TICKS      ;DOUBLE-PRECISION COMPARE TIME NOW
1617         BHI     CLKBR2          ;WITH TIME IN QUEUE BLOCK; TO CLKBR2 IF NOT DUE YET.
1618         BLO     CLKBR3
1619         CMP     (T)+,TICKS1
1620         BHI     CLKBR2
1621 CLKBR3: PUSH    CLOCKQ          ;CDR THE CLOCK QUEUE
1622         MOV     @(SP),CLOCKQ
1623         JSR     PC,@(T)+        ;CALL CLOCK LEVEL ROUTINE, T POINTS TO ARGUMENT
1624         POP     T
1625         MOV     CLOCKF,(T)      ;PUT OLD SLOT ON FREE LIST
1626         MOV     T,CLOCKF
1627         BR      CLKBR1          ;CHECK AGAIN IF SOMETHING STILL ON QUEUE
1628
1629 CLKBR2: DEC     BLINK
1630         BGE     .+10
1631         MOV     #BLKTIM,BLINK
1632         CMP     BLINK,#MAXTV
1633         BHIS    CLKR1
1634         MOV     BLINK,T
1635         TSTB    BLKSWT(T)
1636         BNE     CLKR1
1637         PUSH    U
1638         PUSH    CREG
1639         PUSH    AC
1640         PUSH    MQ
1641         MOVB    T,CREG
1642         ASL     T
1643         MOV     BLINKS(T),T     ;BLINK CHAIN FOR THIS DPY
1644         BEQ     CLKBR4
1645 CLKLOP: MOV     BLCURS(T),U     ;CURSOR TO BLINK
1646         JSR     PC,XORCHR
1647         COMB    BLON(T)         ;CHANGE STATE OF BLINK
1648         MOV     BLNEXT(T),T
1649         BNE     CLKLOP
1650 CLKBR4: POP     MQ              ;CLOCK RETURN
1651         POP     AC
1652         POP     CREG
1653         POP     U
1654 CLKR1:  TST     BLINK
1655         BEQ     CLKR3
1656         CMP     BLINK,#BLKTIM/2
1657         BNE     CLKR2
1658 CLKR3:  JSR     PC,RPT          ;AS OFTEN AS WE BLINK, HANDLE THE REPEAT KEY.
1659 CLKR2:  INCB    SSCC            ;INCREMENT SEMI-SLOW CLOCK COUNT
1660         BNE     CLKRET          ;WRAP-AROUND => SEMI-SLOW CLOCK TICK
1661         BR      CLKBRS
1662 \f
1663 ;ON ALL CONSOLES IN "REPEAT" MODE, PERFORM ONE REPETITION
1664 ;BY SENDING AS INPUT TO THE PDP-10 ANOTHER COPY OF THE CHAR
1665 ;MOST RECENTLY SENT.  ALSO DECREMENTS ALL FINITE REPEAT COUNTS.
1666 RPT:    JSR U,ACSAV
1667         PUSH CREG
1668         MOV #LEUVAR,U
1669 RPT4:   TST LERPT(U)
1670         BEQ RPT3
1671         BMI RPT1
1672         DEC LERPT(U)
1673 RPT1:   MOV LELSTA(U),A
1674         MOV LELSTB(U),B
1675         JSR PC,PUTCHR
1676 RPT3:   ADD #LELEN,U
1677         CMP #LEUEND,U
1678         BGT RPT4
1679         POP CREG
1680         JMP ACRES
1681
1682 ;COME HERE EVERY  256./60. = 4.27  SECONDS FOR SEMI-SLOW CLOCK
1683 CLKBRS: PUSH    TT
1684         PUSH    C
1685         PUSH    U
1686         PUSH    #69.            ;FOR DEBUGGING
1687         TST     KBDTSW
1688         BEQ     SSCRET
1689         CLR     KBDTSW
1690         MOV     #KBDDEF+<2*MAXKBD>,T
1691         BR      CLKBR5
1692
1693 CLKBR9: INC     KBDTSW
1694 CLKBR5: CMP     #KBDDEF-2,T
1695         BEQ     SSCRET
1696         TST     -(T)            ;FAST LOOP LOOKING FOR ANY KEYBOARD
1697         BGE     CLKB10          ; NEEDING ITS CONSOLE'S VIDSW INPUT RESET
1698         BR      CLKBR5
1699 CLKB10: DECB    1(T)
1700         BGE     CLKBR9          ;NOT TIME TO RESET THIS SCREEN YET
1701         MOV     T,C
1702         SUB     #KBDDEF,C       ;C HAS 2*KBD NUMBER, FOR VSWDEF.
1703         PUSH    T
1704         JSR     PC,VSWSGO       ;SET UP L.E. INDEX IN U, VSW OUTPUT IN T
1705         BLT     CLKBR7          ;VSWSGO IS NEGATIVE IF SOMETHING IS FUNNY.
1706         JSR     PC,VSWDEF       ;RESET VIDEO SWITCH INPUT
1707 CLKBR7: POP     T
1708         BR      CLKBR5
1709
1710 SSCRET: CMP     (SP)+,#69.      ;IS STACK SCREWED?
1711         BEQ     SSCRE1
1712         BPT
1713 SSCRE1: POP     U
1714         POP     C               ;SEMI-SLOW CLOCK RETURN
1715         POP     TT
1716 CLKRET: POP     T
1717 CRTI:   RTI
1718
1719 ;CLEARS ALL BLINKERS ON THIS DPY
1720
1721 CLBLIN: PUSH    U
1722         MOVB    CREG,T
1723         BIC     #177400,T
1724         ASL     T
1725         MOV     BLINKS(T),T
1726         BEQ     CLBL2
1727 CLBL0:  TSTB    BLON(T)         ;BLINK ON?
1728         BEQ     CLBL1
1729         MOV     BLCURS(T),U
1730         JSR     PC,XORCHR
1731         CLRB    BLON(T)
1732 CLBL1:  MOV     BLNEXT(T),T
1733         BNE     CLBL0
1734 CLBL2:  POP     U
1735         RTS     PC
1736 \f
1737 ;CLOCK QUEUE ROUTINES
1738
1739 ;ADQUE  CALLED WITH ARG IN T, THE CALLING SEQUENCE IS:
1740
1741 ;       JSR     TT,ADQUE
1742 ;               DELTA T
1743 ;               ROUTINE TO CALL AT CLOCK LEVEL
1744
1745 ADQUE:  PUSH    T               ;ARG FOR ROUTINE
1746         MOV     CLOCKF,T        ;GET FREE CLOCK QUEUE SLOT
1747         BEQ     ADQFL           ;IF THERE IS A FREE ONE
1748         TST     (T)+            ;IGNORE CDR
1749         MOV     TICKS,(T)+      ;MOVE IN CURRENT TIME
1750         MOV     TICKS1,(T)
1751         ADD     (TT)+,(T)+      ;TIME TO CALL ROUTINE
1752         ADC     -4(T)
1753         MOV     (TT)+,(T)+      ;ROUTINE TO CALL
1754         MOV     (SP)+,(T)       ;AND ITS ARG
1755         PUSH    TT              ;RETURN ADDRESS
1756         MOV     CLOCKF,TT       ;ADDRESS OF THIS CLOCK QUEUE SLOT
1757         MOV     (TT),CLOCKF     ;CDR THE FREE LIST
1758         PUSH    TT              ;ADDRESS OF ONE TO ADD
1759         PUSH    #CLOCKQ         ;ADDRESS OF PREVIOUS CLOCK QUEUE ENTRY
1760 ADQUE1: MOV     @(SP),TT        ;CURRENT ENTRY IN QUEUE
1761         BEQ     ADQUE2          ;END OF QUEUE?
1762         MOV     2(SP),T         ;THE ONE WE WANT TO ADD
1763         CMP     (T)+,(TT)+      ;IGNORE CDR'S
1764         CMP     (T)+,(TT)+      ;HIGH ORDER OF TIME
1765         BLO     ADQUE2          ;GO SPLICE IT IN HERE
1766         BHI     ADQUE3
1767         CMP     (T)+,(TT)+      ;LOW ORDER
1768         BLOS    ADQUE2
1769 ADQUE3: MOV     @(SP),(SP)      ;CDR THE QUEUE
1770         BR      ADQUE1
1771
1772 ;HERE TO SPLICE ENTRY INTO CLOCK QUEUE
1773
1774 ADQUE2: MOV     @(SP),@2(SP)    ;CDR OF QUEUE, GOES TO CDR OF NEW ENTRY
1775         MOV     2(SP),@(SP)     ;CURRENT SLOT GOES TO CDR OF PREVIOUS
1776         CMP     (SP)+,(SP)+     ;CLEANSE STACK
1777         POP     TT
1778         RTS     TT
1779
1780 ;HERE FOR NO FREE CLOCK QUEUE SLOTS
1781
1782 ADQFL:  CMP     (TT)+,(TT)+     ;SKIP OVER ARGS
1783         POP     T               ;CLEANSE STACK
1784         RTS     TT
1785 \f
1786 ;THIS CAUSES CONSOLE FREE DPY TO GLITCH
1787
1788 MSGLIT: PUSH    CREG
1789         MOV     (T),T
1790         MOV     T,CREG
1791         JSR     TT,ADQUE
1792                 GLITIM
1793                 MSGLIT
1794         MOV     CSA,T
1795         PUSH    T
1796         BIC     #-BOWBIT,T              ;CLEAR BOW AND OTHER GARBAGE
1797         ADD     #LINHT*BYTPL/10,T       ;GLITCH ONE CHARACTER LINE
1798         CMP     #LINHT*BYTPL*CHRLN/10,T
1799         BHI     .+4                     ;WRAP AROUND?
1800         CLR     T
1801         BIC     #-1#<-BOWBIT>,(SP)
1802         BIS     T,(SP)
1803         POP     CSA             ;ZAP
1804         POP     CREG
1805         RTS     PC
1806
1807 ;HERE TO RING BELL ON DPY
1808
1809 BELL:   PUSH    T
1810         MOV     CREG,T
1811         MOVB    T,TT            ;DOUBLE TV BUFFER # FOR BYTE INDEX
1812         ASL     TT
1813
1814         CHROFF                  ;INHIBIT INTERRUPTS WHILE WE HACK CLOCK QUEUE, ETC.
1815         INC     BELCNT(TT)      ;FLASH SCREEN AT LEAST ONCE
1816         BEQ     BELL0           ;IF NONE PENDING, FLASH IT NOW
1817         INC     BELCNT(TT)      ;IF BELLS PENDING THEN FLASH TWICE
1818         CMP     BELCNT(TT),#MAXBEL
1819         BLOS    BELL0A
1820         DEC     BELCNT(TT)
1821         DEC     BELCNT(TT)
1822         BR      BELL0A
1823
1824 ;HERE IF NO BELLS PENDING, FLASH SCREEN RIGHT AWAY, ADD CLOCK QUEUE ENTRY
1825
1826 BELL0:  JSR     PC,BOWXOR       ;FLASH THE SCREEN NOW!
1827         JSR     PC,BELL1A       ;ADD CLOCK QUEUE ENTRY
1828 BELL0A: CHRON
1829
1830         POP     T
1831         RTS     PC
1832
1833 ;CLOCK LEVEL BELL ROUTINE
1834
1835 BELL1:  PUSH    CREG
1836         MOV     (T),T           ;THE DESIRED CONSOLE REGISTER
1837         MOV     T,CREG          ;N.B. THE ALU MODE WAS SAVED AS "XOR"
1838         MOV     #BOWBIT,CSA     ;FLASH THE SCREEN
1839         BIC     #177400,T       ;THE DPY #
1840         ASL     T               ;BYTE INDEX
1841         DEC     BELCNT(T)       ;WE JUST DID THAT ONE
1842         BMI     BELL1B          ;ANY MORE PENDING?
1843         JSR     PC,BELL1A       ;YES, PUT ANOTHER ON QUEUE
1844 BELL1B: POP     CREG
1845         RTS     PC
1846
1847 BELL1A: MOV     CREG,T          ;PUT ANOTHER BELL ON CLOCK QUEUE
1848         JSR     TT,ADQUE
1849                 BLKTIM
1850                 BELL1
1851         RTS     PC
1852 \f
1853 .SBTTL KEYBOARD INTERRUPT ROUTINES
1854
1855 ;KEYBOARD BREAK ROUTINES  THE LINE EDITOR RUNS AT THIS LEVEL
1856
1857 KBDBRK: JSR     U,ACSAV         ;PUT AC'S ON STACK
1858         PUSH    CREG
1859         PUSH    AC
1860         PUSH    MQ
1861 KBDLOP: MOV     OLDKMA,A
1862         CMP     #KBDEND,A       ;CHECK WRAP AROUND
1863         BHI     .+6
1864         MOV     #KBDBUF,A
1865         CMP     KMA,A
1866         BEQ     KBDRET          ;NO MORE CHARACTERS
1867         MOV     (A)+,B          ;RAW CHARACTER
1868         TSTB    (A)+            ;GARBAGE
1869         MOVB    (A)+,-(SP)      ;KEYBOARD #
1870         MOV     A,OLDKMA
1871
1872 ;GET ASCII REPRESENTATION OF CHARACTER
1873 ;       ASCII CODE IN A, META BITS IN B
1874
1875         MOV     B,C             ;TWO COPIES OF RAW CHARACTER
1876         BIC     #RCHAR,B        ;KEY STRUCK
1877         BIT     #RTPBIT,C       ;TOP?
1878         BEQ     KBDX1
1879         BIS     #XTPBIT,B
1880         BR      KBDX2
1881 KBDX1:  BIT     #RSLBIT,C       ;SHIFT LOCK?
1882         BEQ     .+6
1883         BIS     #XSLBIT,B
1884         BIT     #RSHBIT,C       ;SHIFT?
1885         BEQ     KBDX2
1886         BIS     #XSHBIT,B
1887 KBDX2:  MOVB    XTAB(B),A       ;ASCII REPRESENTATION
1888         BIC     #<<XSLBIT!XSHBIT!XTPBIT>#-1>,B  ;FLUSH ALL UNINTERESTING BITS
1889         ASL     B               ;XTAB TO ASCII REPRESENTATION
1890         ASL     B
1891         ASL     B
1892         BIT     #RMTBIT,C       ;META?
1893         BEQ     .+6
1894         BIS     #AMTBIT,B
1895         BIT     #RCLBIT,C       ;CONTROL?
1896         BEQ     .+6
1897         BIS     #ACLBIT,B
1898         MOVB    (SP)+,C         ;KEYBOARD #
1899         ASL     C               ;BYTE FOR INDEX INTO KBDLE
1900         TST     A
1901         BLT     NONASC          ;NON-ASCII
1902 KBDUN3: TSTB    KBDESC(C)
1903         BNE     ESCBRK          ;ESCAPE OR BREAK IS IN PROGRESS
1904         TSTB    KBDCNT(C)       ;IF THIS SCREEN IS SPYING WITH A TIMEOUT,
1905         BLT     KBDUN1
1906         JSR     PC,VSWUNS       ;UN-SPY IT IMMEDIATELY.
1907 KBDUN1: MOV     KBDLE(C),U      ;ASSOCIATED LINE EDITOR?
1908         BEQ     KBDLOP
1909         TST     LERPT(U)        ;IF THE REPEAT KEY IS IN EFFECT,
1910         BEQ     KBDUN2          ;TURN IT OFF, AND FLUSH THIS CHARACTER.
1911         CLR     LERPT(U)
1912         BR      KBDLOP
1913
1914 KBDUN2: MOVB    LECREG(U),CREG  ;SET UP CONSOLE REGISTER
1915         BIS     #ACTBIT,B       ;FEED THIS CHAR TO THE PDP-10
1916         JSR     PC,PUTCHR
1917         BR      KBDLOP
1918 \f
1919 ;KEYBOARD RETURN
1920
1921 KBDRET: POP     MQ
1922         POP     AC
1923         POP     CREG
1924         POP     A
1925         POP     B
1926         POP     C
1927         POP     T
1928         POP     TT
1929         POP     U
1930         RTI
1931
1932 ;NON-ASCII CHARACTERS COME HERE
1933
1934 NONASC: NEG     A
1935         CMP     #MAXNAS,A
1936         BHIS    .+4
1937 NONAS1: BPT                     ;ILLEGAL CHARACTER
1938         CMP     #<MAXKBD*2>,C   ;C HAS BEEN DOUBLED
1939         BHI     .+4
1940         BPT                     ;GARBAGE KBD #
1941         CLRB    KBDESC(C)
1942         ASL     A               ;BYTES
1943         JSR     PC,@NASCTB(A)   ;DISPATCH TO ROUTINE
1944 JBDLOP: JMP     KBDLOP
1945
1946 ;PROCESS ESCAPE AND BREAK COMMANDS
1947
1948 ESCBRK: JSR     PC,UPPER        ;CONVERT LOWER CASE TO UPPER CASE
1949         MOV     #ESCHAR,T
1950 ESCBR1: CMPB    (T),A           ;MATCH?
1951         BEQ     DOESC
1952         TSTB    (T)+            ;END OF TABLE?
1953         BNE     ESCBR1
1954 ESCBR2: CLRB    KBDESC(C)       ;NO COMMAND
1955         BR      JBDLOP
1956
1957 DOESC:  MOV     KBDLE(C),U      ;IF COMMAND NEEDS LOGGED-IN KBD,
1958         BEQ     DOESC2          ; MAKE SURE WE'RE LOGGED IN,
1959         MOVB    LECREG(U),CREG  ; AND SET UP U AND CREG
1960 DOESC1: SUB     #ESCHAR,T
1961         CLRB    KBDESC(C)
1962         ASL     T               ;MAKE A WORD INDEX.
1963         JSR     PC,@ESCTAB(T)   ;C MUST BE KBD #, SOME ESCAPE ROUTINES RELY ON IT
1964         BR      JBDLOP
1965
1966 DOESC2: CMP     #ESCSRN,T       ;IF NOT LOGGED IN BUT MUST BE,
1967         BLE     ESCBR2          ; THEN WE LOSE TOTALLY
1968         MOVB    DPYFRE,CREG     ;OTHERWISE SET UP CREG FOR THE
1969         BR      DOESC1          ; SAKE OF RANDOM BELLS
1970
1971 ;NASCTB FOR KEYS SUCH AS BREAK, CLEAR, ETC POINTS HERE
1972 ;TO TURN THOSE CHARACTERS INTO TOP-LETTERS STARTING WITH "A".
1973 ;A HOLDS TWICE THE NASCTB INDEX.
1974 BRKCLR: ASR     A
1975         ADD     #4000+'@,A
1976 BRKCLX: TST     (SP)+           ;FLUSH RETURN POINTER TO JBDLOP
1977         JMP     KBDUN3          ;AND GO GIVE CHARACTER TO TEN.
1978
1979 GAMMA:  MOV #4011,A
1980         BR BRKCLX
1981
1982 DELTA:  MOV #4012,A
1983         BR BRKCLX
1984
1985 CRCPLS: MOV #4015,A
1986         BR BRKCLX
1987
1988 PLSMNS: MOV #4014,A
1989         BR BRKCLX
1990 \f
1991 .SBTTL 10/11 INPUT/OUTPUT ROUTINES
1992
1993 ;HERE TO COMPLEMENT STATE OF BOW BIT WHEN PDP-10 FALLS BEHIND ON KBD
1994
1995 SLOW10: MOVB    LECREG(U),CREG
1996         JMP     BELL            ;RING BELL
1997
1998
1999 ;PUT CHARACTER WHICH IS A OR'D WITH B INTO BUFFER. ACTIVATES IF
2000 ;       1       FINDS ACTIVATION CHARACTER
2001 ;       2       BUFFER FILLS
2002 ;A AND B ARE SAVED IN LELSTA AND LELSTB IN CASE THE USER DECIDES
2003 ;TO REPEAT THE CHARACTER.
2004
2005 PUTCHR: TST     @LEBUF(U)
2006         BGT     PUTCH0                  ;BUFFER BEING FILLED?
2007         BLT     SLOW10                  ;HAS PDP-10 FALLEN BEHIND?
2008         MOV     #LBCHRS,@LEBUF(U)       ;MARK BUFFER BUSY WITH # FREE CHARACTERS
2009 PUTCH0: TST     LEFREE(U)               ;ANY ROOM LEFT IN BUFFER?
2010         BGT     PUTCH2
2011         BEQ     SLOW10                  ;NOPE, DO SOME ERROR CHECKING
2012         BPT                             ;LOSE IF LESS THAN NO ROOM
2013
2014 PUTCH2: MOV     A,@LECHR(U)
2015         BIS     B,@LECHR(U)
2016         MOV     A,LELSTA(U)
2017         MOV     B,LELSTB(U)
2018         ADD     #2,LECHR(U)
2019         DEC     LEFREE(U)               ;BUFFER FULL?
2020         BGT     PUTCH4
2021         BEQ     .+4                     ;WE MUST ACTIVATE ANYWAY
2022         BPT
2023         MOV     LEBUF(U),T
2024         TST     LHQUED(T)               ;IF ALREADY QUEUED TO ACTIVATE,
2025         BEQ     ACTIVA                  ; DON'T ACTIVATE NOW
2026         RTS     PC
2027
2028 PUTCH4: TST     B
2029         BGE     RTSPC1                  ;NOT ACTIVATING
2030         MOV     LEBUF(U),T              ;ACTIVATION CHAR, MUST ACTIVATE
2031         TST     LHQUED(T)               ;IF ALREADY QUEUED TO ACTIVATE,
2032         BNE     RTSPC1                  ; DON'T ACTIVATE NOW
2033         TST     @LHNEXT(T)              ;TEST NEXT BUFFER IN RING
2034         BMI     QBFR                    ;IF NOT FREE, TRY ACTIVATION ON NEXT CLOCK TICK
2035
2036 ;HERE TO ACTIVATE BUFFER
2037
2038 ACTIVA: SUB     #LBCHRS,LEFREE(U)       ;NEGATIVE OF ACTIVE CHARS
2039         BLT     .+4
2040         BPT                             ;HAD BETTER BE NEGATIVE
2041         MOV     LEBUF(U),T              ;THE BUFFER TO ACTIVATE
2042         MOV     LEFREE(U),LHFLAG(T)     ;THAT ACTIVATES IT
2043
2044         CHROFF
2045         CLR     LHALST(T)               ;PUT THIS ONE AT END CHAIN
2046         PUSH    KBDLAST
2047         MOV     T,KBDLAST
2048         POP     T
2049         BNE     ACTIV0                  ;EMPTY ACTIVATION LIST?
2050         MOV     KBDLAST,KBDACT          ;YES, MAKE ACTIVE LIST POINT TO THIS ONE
2051         BR      ACTV0A
2052 ACTIV0: MOV     KBDLAST,LHALST(T)       ;OLD LAST POINTS TO NEW LAST
2053 ACTV0A: MOV     KBDLAST,T               ;IN ANY EVENT THIS THE ONE JUST ADDED
2054         TST     KBDFLG                  ;DOES THE PDP-10 WANT MORE
2055         BNE     ACTIV1
2056         MOV     KBDACT,KBDFLG           ;ACTIVATE THIS LIST
2057         CLR     KBDACT                  ;AND PREPARE FOR NEXT
2058         CLR     KBDLAST
2059 ACTIV1: CHRON
2060
2061         MOV     LHNEXT(T),T             ;NEXT ON RING
2062         MOV     #LHLEN,TT
2063         ADD     T,TT                    ;FIRST FREE CHARACTER
2064         MOV     T,LEBUF(U)              ;NEW BUFFER
2065         TST     (T)+                    ;LHFLAG IS SET AT PUTCHR
2066         CLR     (T)+                    ;LHZERO
2067 ;       CMP     (T)+,(T)+               ;DON'T HACK LHNEXT AND LHALST
2068         MOV     TT,LECHR(U)             ;FIRST FREE CHARACTER
2069         MOV     #LBCHRS,LEFREE(U)       ;FREE CHARACTERS IN BUFFER
2070 RTSPC1: RTS     PC
2071
2072 ;HERE AT CLOCK LEVEL TO ACTIVATE BUFFER
2073
2074 CLKACT: PUSH    TT
2075         PUSH    U
2076         MOV     (T),U                   ;THE LINE EDITOR
2077         MOV     LEBUF(U),T              ;THE BUFFER
2078         TST     LHFLAG(T)
2079         BGE     .+4
2080         BPT                             ;CAN'T ACTIVATE AN ALREADY ACTIVATED BUFFFER
2081         TST     @LHNEXT(T)              ;THE NEXT BUFFER
2082         BMI     CLKAC1                  ;ACTIVATE IF READY
2083         CLR     LHQUED(T)
2084         JSR     PC,ACTIVA
2085 CLKAC2: POP     U
2086         POP     TT
2087         RTS     PC
2088
2089 CLKAC1: JSR     PC,QBFR                 ;NOT, READY TRY ANOTHER CLOCK TICK
2090         BR      CLKAC2
2091
2092 ;HERE IF NEXT BUFFER ON RING IS NOT FREE, TRY ACTIVATION AT NEXT CLOCK TICK
2093
2094 QBFR:   ZAPFLG  LHQUED(T)               ;SET FLAG THAT SAYS WE'RE QUEUED
2095         MOV     U,T                     ;ARG
2096         CHROFF                          ;INHIBIT INTERRUPTS WHILE WE DO THIS
2097         JSR     TT,ADQUE                ;PUT ON CLOCK QUEUE
2098                 1                       ;AT NEXT TICK
2099                 CLKACT                  ;CLOCK LEVEL ACTIVATION
2100         CHRON
2101         RTS     PC
2102
2103 ;SAVE ALL ACS ON STACK
2104
2105 ACSAV:  PUSH    TT
2106         PUSH    T
2107         PUSH    C
2108         PUSH    B
2109         PUSH    A
2110         PUSH    U               ;RETURN ADDRESS
2111         MOV     14(SP),U        ;RESTORE U
2112         RTS     PC
2113 \f
2114 ;GETS NEXT CHARACTER FROM DPY BUFFER
2115 ;DPY CHANNEL POINTER IN U.  RETURNS SIGN-EXTENDED CHARACTER IN A, CLOBBERS TT.
2116 ;RETURNS 'EQ' IN CONDITION CODES IF NO CHARACTER PRESENT.
2117
2118 GETCHR: MOV     DPY11B(U),TT            ;GET POINTER FOR EASE IN INCREMENTING
2119         MOVB    (TT),A                  ;GET NEXT CHARACTER
2120         CMP     A,#-1                   ;HAS TEN PUT GOODIES THERE?
2121         BEQ     RTSPC1                  ;NO
2122         MOVB    #-1,(TT)                ;MARK AS TAKEN
2123         DEC     DPY11B(U)               ;ADVANCE POINTER
2124         ROR     TT                      ;USING PDP10 BYTE ORDER (1, 0, 3, 2)
2125         BCS     GETCH1                  ;BRANCH IF 1->0 OR 3->2
2126         ADD     #4,DPY11B(U)            ;0->3 OR 2->1 NEXT WORD
2127         ROR     TT
2128         BCC     GETCH1                  ;BRANCH IF 0->3
2129         MOV     DPY11B(U),TT            ;OTHERWISE NEXT PDP10 WORD
2130         DEC     TT
2131         MOV     #-1,-2(TT)              ;SO SET PREV ONE TO ALL -1.
2132         MOV     #-1,-4(TT)              ; IN CASE OF TIMING ERROR
2133         CMP     TT,DPYLGL(U)            ;PAST END OF BUFFER?
2134         BLOS    GETCH1
2135         MOV     U,DPY11B(U)             ;YES, RESET TO
2136         ADD     #DPDATA+1,DPY11B(U)     ;FIRST WORD OF DATA AREA, HIGH BYTE
2137 GETCH1: CLZ
2138         RTS     PC                      ;RETURN CONDITION CODE 'NE'
2139
2140 ;GET NEXT CHARACTER BUT IF NOT AVAILABLE DO A COROUTINE-RETURN
2141 ;FROM THE CHARACTER-READING LOOP, SO THAT WHEN THE NEXT CHARACTER
2142 ;IS READ THIS CALL WILL BE RETURNED FROM.  ASSUMES THAT U CONTAINS THE
2143 ;ADDRESS OF THE CHANNEL VAR BLOCK, AND MAY RESET ALL ACS
2144 ;BUT B TO WHAT THEY HOLD AT DPYCTL. B IS ALWAYS PRESERVED.
2145 GETCHC: JSR     PC,GETCHR
2146         BEQ     GETCH2
2147         BIC     #-400,A         ;CLEAR EXTRA BITS DUE TO SIGN-EXTENSION
2148         RTS     PC
2149
2150 GETCH2: MOV     B,LESVB(U)
2151         POP     LECPC(U)
2152         POP     B
2153         CMP     B,#DPYXIT
2154         BEQ     GETCH3
2155         BPT                     ;CALLER OF GETCHC HAD WRONG RETURN ADDRESS
2156 GETCH3: JMP     DPYDX2          ;CEASE TYPING ON THIS TV FOR A WHILE
2157 \f
2158 .SBTTL DISPLAY FUNCTION (%TD, ETC) ROUTINES
2159
2160 TVOMSK: BIC     #177600,A       ;HERE IF YOU DON'T TRUST THE HIGH BITS
2161
2162 ;TYPE CHARACTER IN A AND ADVANCE OVER IT.  PRESERVES A.
2163
2164 TVO:    JSR     PC,GENCHR       ;GENERATES CHARACTER AND ADVANCES CURSOR
2165
2166 ;LEDADC ADVANCES LINE EDITOR CURSOR
2167
2168 LEDADC: ADD     #CHRWD,LEX(U)   ;INCREMENT HPOS IN BITS FROM RIGHT MARGIN.
2169         BEQ     LEDAD2          ;REACHED MARGIN => WRAP AROUND.
2170         TST     LEPHS(U)        ;ELSE, INCREMENT THE AUXILIARY VARIABLES.
2171         BGT     LEDAD1
2172         ADD     #20,LEPHS(U)    ;HERE IF WE ARE ADVANCING TO A NEW WORD.
2173         ADD     #2,LECC(U)
2174         CMP     LECC(U),#TVCFENCE
2175         BLOS    LEDAD1
2176         MOV     #TVLO,LECC(U)
2177 LEDAD1: SUB     #CHRWD,LEPHS(U)
2178         RTS     PC
2179
2180 LEDAD2: JMP     CR
2181
2182 ;RETREATS LINE EDITOR CURSOR
2183
2184 LEDREC: CMP     LEX(U),#-BYTPL  ;IF AT LEFT MARGIN, DON'T DO ANYTHING.  WE COULD WRAP AROUND,
2185         BEQ     LEDRE1          ;BUT THAT'S MORE WORK, AND SHOULDN'T EVER HAPPEN ANYWAY.
2186         ADD     #CHRWD,LEPHS(U)
2187         SUB     #CHRWD,LEX(U)
2188         CMP     #<20-CHRWD>,LEPHS(U)
2189         BGE     LEDRE1
2190         SUB     #20,LEPHS(U)    ;BACKUP A WORD IN DISPLAY
2191         SUB     #2,LECC(U)
2192         CMP     LECC(U),#TVLO
2193         BHIS    LEDRE1
2194         BPT                     ;BACKING UP PAST BEGINNING OF SCREEN?
2195 LEDRE1: RTS     PC
2196 \f
2197 ;HERE TO CRLF AND CLEAR EOL.
2198 CRLF:   JSR     PC,CR
2199         CMP     #TVFENCE-<BYTPL*LINHT>,LELCC(U) ;IF NOW ON LAST LINE OF SCREEN,
2200         BEQ     CRLF1                   ;MUST SCROLL.
2201         JSR     PC,LF                   ;ELSE JUST MOVE DOWN AND CLEAR A LINE.
2202         JMP     CLEOL
2203
2204 CRLF1:  JSR     PC,SCROLL               ;MOVE EVERYTHING UP 4 LINES,
2205         JMP     LF                      ;THEN MOVE DOWN 1 LINE.
2206
2207 ;SCROLL THE TEXT, MOVING THE CURSOR WITH IT, UP 4 LINES.
2208 SCROLL: PUSH    LEY(U)                  ;TO SCROLL, HOME UP AND DELETE 4 LINES AT SCREEN TOP.
2209         PUSH    LELCC(U)
2210         PUSH    LECC(U)
2211         JSR     PC,HU
2212         MOV     #4,A
2213         JSR     PC,LDEL0
2214         POP     LECC(U)                 ;THEN RESTORE POSITION (TO LAST LINE, USUALLY)
2215         POP     LELCC(U)
2216         POP     LEY(U)
2217         MOV     LELCC(U),A
2218         SUB     #4*BYTPL*LINHT,A        ;AND MOVE UP 4 LINES (OR TO SCREEN TOP).
2219         CMP     A,#TVLO
2220         BHI     SCROL1
2221         JMP     HU
2222
2223 SCROL1: MOV     A,LELCC(U)
2224         SUB     #4*BYTPL*LINHT,LECC(U)
2225         SUB     #4*LINHT,LEY(U)
2226 SCROLX: RTS     PC
2227
2228 ;HERE TO BACKSPACE (NO-OP IF AT BEGINNING OF LINE)
2229
2230 DPYBS:  CMP     LELCC(U),LECC(U)
2231         BEQ     SCROLX
2232         JMP     LEDREC
2233
2234 ;HERE TO HOME UP AND CLEAR SCREEN.
2235
2236 DPYCLR: JSR     PC,HU
2237         JMP     CLEOF
2238
2239 ;HERE FOR LINE FEED, NO FRILLS.  WRAP AROUND AT SCREEN BOTTOM.
2240 LF:     ADD     #<BYTPL*LINHT>,LELCC(U)
2241         ADD     #<BYTPL*LINHT>,LECC(U)
2242         ADD     #LINHT,LEY(U)
2243         CMP     #TVFENCE,LELCC(U)
2244         BHI     LF1
2245         SUB     #TVFENCE-TVLO,LELCC(U)
2246         SUB     #TVFENCE-TVLO,LECC(U)
2247         MOV     #-NLINS,LEY(U)
2248 LF1:    RTS     PC
2249
2250 ;HERE TO HOME UP
2251 HU:     MOV     #TVLO,LELCC(U)          ;RESET POINTER TO CURRENT LINE BEGINNING.
2252         MOV     #-NLINS,LEY(U)          ;AND ITS POSITION ON SCREEN.
2253
2254 ;HERE FOR CARRIAGE RETURN
2255 CR:     MOV     LELCC(U),LECC(U)        ;ORIGIN OF THIS LINE
2256 CR1:    MOV     #20-CHRWD,LEPHS(U)      ;PHASE
2257         MOV     #-BITPL,LEX(U)          ;RESET X
2258         RTS     PC
2259 \f
2260 ;DELETE LINE(S).  MOVE UP THE LINES BELOW THE CURRENT ONE,
2261 ;FLUSHING THE CURRENT ONE.  BLANK LINES ARE SHIFTED IN AT THE BOTTOM.
2262 LDEL:   JSR     PC,GETCHC               ;READ NUMBER OF LINES TO DELETE IN A.
2263 LDEL0:  MOV     #TVFENCE,B              ;ADDRESS OF "END OF REGION"
2264 LDEL00: MOV     A,MQ
2265         BEQ     LINSX
2266         CMP     A,#50
2267         BHI     LINS3
2268         MOV     #BYTPL*LINHT,MUL        ;GET # LINES * BYTPL*LINHT, = # BYTES TO SHIFT BY.
2269         MOV     LELCC(U),TT             ;TT GETS ADDR OF THIS LINE.
2270         MOV     TT,T
2271         ADD     MQ,T                    ;T GETS ADDR OF LINE TO COPY INTO THIS.
2272         BCS     LDEL4                   ;CARRY => T IS PAST BOTTOM OF SCREEN ALREADY.
2273 LDEL3:  CMP     T,B                     ;NO MORE LINES AT BOTTOM TO COPY UP =>
2274         BHIS    LDEL4                   ; START CLEARING INSTEAD.
2275         JSR     PC,CPYCHL               ;COPY THEM, INCREMENTING T AND TT TO NEXT LINES.
2276         BR      LDEL3
2277
2278 LDEL4:  MOV     TT,T
2279 ;CLEAR TEXT LINES FROM THE ONE T POINTS TO, TO END OF REGION IN B.  PUTS CIOR IN CALU.
2280 LDEL5:  CMP     T,B
2281         BHIS    LINSX                   ;POPJ, SETTING CALU TO CIOR.
2282         JSR     PC,CLRCHL
2283         BR      LDEL5
2284
2285 ;INSERT LINE(S).  MOVE THE CURRENT LINE AND LOWER ONES DOWN ONE OR MORE POSITIONS.
2286 ;BLANK LINES SHIFT IN AT THE CURRENT POSITION.
2287 LINS:   JSR     PC,GETCHC               ;HOW MANY LINES TO INSERT (IN A).
2288         MOV     A,MQ
2289         BEQ     LINSX                   ;DON'T WASTE TIME IF INSERTING 0 LINES.
2290         CMP     A,#50                   ;DELETING INFINITE LINES = CLEAREOF
2291         BHI     LINS3
2292         MOV     #BYTPL*LINHT,MUL
2293         MOV     #TVFENCE-<BYTPL*LINHT>,TT       ;TT POINTS AT LAST ACTUAL LINE ON SCREEN.
2294 LINS4:  MOV     TT,T
2295         SUB     MQ,T                    ;T IS LINE TO COPY INTO IT (COPYING DOWNWARD).
2296         BCS     LINS3                   ;IF T IS ABOVE TOP OF SCREEN, GIVE UP.
2297 LINS1:  CMP     LELCC(U),T              ;STOP AFTER COPYING CURRENT LINE DOWN.
2298         BHI     LINS3
2299         JSR     PC,CPYCHL               ;COPY ONE LINE DOWNWARD.
2300         SUB     #2*BYTPL*LINHT,T        ;THIS ADVANCES T AND TT TO NEXT LINE DOWN,
2301         SUB     #2*BYTPL*LINHT,TT       ; WHEN WHAT WE WANT IS NEXT LINE UP.
2302         BR      LINS1
2303
2304 LINS3:  MOV     LELCC(U),T
2305
2306 ;CLEAR C(A) LINES OF CHARACTERS, STARTING AT THE LINE T POINTS TO, BUT STOP IF REACH END OF SCREEN.
2307 ;SETS CALU TO CIOR.
2308 LINS2:  CMP     #TVFENCE,T
2309         BLOS    LINSX
2310         JSR     PC,CLRCHL
2311         DEC     A
2312         BNE     LINS2
2313 LINSX:  MOVB    #CIOR,CALU
2314         RTS     PC
2315 \f
2316 ;REGION SCROLLING
2317
2318 RGSCDN: JSR PC,GETCHC           ;NUMBER OF LINES IN REGION
2319         MOV A,B
2320         JSR PC,GETCHC           ;NUMBER OF LINES TO MOVE DOWN
2321         MOV B,MQ
2322         MOV #BYTPL*LINHT,MUL
2323         MOV LELCC(U),TT
2324         SUB #BYTPL*LINHT,TT
2325         ADD MQ,TT               ;ADDRESS OF LAST LINE IN REGION
2326         BCS LINSX               ;IGNORE IF GARBAGE REGION (WRAPPED AROUND ADDRESS)
2327         CMP TT,#TVFENCE
2328         BHIS LINSX              ;IGNORE IF GARBAGE REGION
2329         MOV A,MQ                ;CONVERT DISTANCE TO MOVE TO BYTES
2330         BEQ LINSX               ;EXIT IF NOT MOVING
2331         MOV #BYTPL*LINHT,MUL
2332         BR LINS4                ;GO DO IT, USING INSERT-LINES SUBROUTINE
2333
2334 RGSCUP: JSR PC,GETCHC           ;NUMBER OF LINES IN REGION
2335         MOV A,B
2336         JSR PC,GETCHC           ;NUMBER OF LINES TO MOVE UP
2337         MOV B,MQ
2338         MOV #BYTPL*LINHT,MUL
2339         MOV LELCC(U),B
2340         ADD MQ,B                ;ADDRESS OF FIRST LINE AFTER REGION
2341         BR LDEL00               ;GO DO IT, USING DELETE-LINES SUBROUTINE
2342 \f
2343 ;INSERT CHARACTER(S).  MOVE THE CURRENT CHARACTER AND FOLLOWING ONES TO THE RIGHT.
2344 ;BLANKS ARE SHOFTED IN AT THE CURRENT POSITION.
2345 CINS:   JSR     PC,GETCHC               ;A GETS HOW MANY CHARACTERS TO INSERT.
2346         JSR     PC,CINSET       ;CHECK A FOR VALIDITY;  PUSH A, LELCC(U), LINHT, AND LECC(U).
2347 CINSL:  MOV     6(SP),A
2348         MOV     (SP),T
2349         MOV     4(SP),C
2350         JSR     PC,CINS1L
2351         ADD     #BYTPL,(SP)
2352         ADD     #BYTPL,4(SP)
2353         DEC     2(SP)
2354         BNE     CINSL
2355         ADD     #6,SP                   ;FLUSH ALL BIT # CHAR POSITIONS FROM STACK.
2356         POP     B
2357         PUSH    LEX(U)
2358         PUSH    LEPHS(U)
2359         PUSH    LECC(U)
2360 CINSC:  JSR     PC,CLRCHR               ;NOW CLEAR OUT THE CHAR POSITIONS WE INSERTED.
2361         JSR     PC,LEDADC               ;AND MOVE CURSOR PAST IT.
2362         DEC     B                       ;NOTE CLRCHR SETS CALU TO CIOR.
2363         BNE     CINSC
2364         POP     LECC(U)                 ;AND RESTORE THE CURSOR.
2365         POP     LEPHS(U)
2366         POP     LEX(U)
2367 CINSX:  RTS     PC
2368
2369 ;INSERT C(A) CHARACTER POSITIONS IN ONE RASTER LINE AT PLACE T POINTS AT.
2370 ;C POINTS AT FRONT OF RASTER LINE.  REQUIRES CALU/ CSET.
2371 CINS1L: MOV     A,MQ
2372         MOV     #CHRWD,MUL              ;COMPUTE # OF BITS TO SHIFT THE LINE BY.
2373         MOV     #20,DIV                 ;COMPUTE # WORDS TO SHIFT IN MQ, # BITS IN AC.
2374         MOV     #20-CHRWD,TT
2375         SUB     LEPHS(U),TT             ;TT GETS # BITS AT FRONT OF 1ST WORD NOT TO CHANGE.
2376         PUSH    TT
2377         PUSH    (T)                     ;ALSO SAVE THE WORD CONTAINING THEM.
2378         PUSH    T                       ;AND ITS ADDRESS
2379         PUSH    U                       ;FIT IN WITH WHAT CINS2 WILL POP.
2380         MOV     C,A
2381         ADD     #BYTPL,A                ;A GETS ADDR TO AUTODECREMENT TO LAST WORD OF LINE.
2382         MOV     A,B
2383         SUB     MQ,B                    ;SUBTRACT THE # OF BYTES IN THE DESIRED # OF WORDS.
2384         SUB     MQ,B                    ;B GETS ADDR OF LAST WORD NOT SHIFTED INTO BIT BUCKET,
2385         MOV     -(B),TT                 ;TT GETS ITS CONTENTS, TO INIT THE LOOP.
2386         MOV     AC,C
2387         NEG     C                       ;C <= SHIFT COUNT, TO GET 1 NEW WORD FROM PAIR OF OLD.
2388 CINS1:  CMP     B,T                     ;NOTE T STILL HAS ADDR OF LOWEST (LAST) WORD TO SHIFT
2389         BEQ     CINS3
2390         MOV     TT,MQ
2391         MOV     -(B),TT                 ;FETCH ANOTHER (LOWER) OLD WORD, FROM WHICH
2392         MOV     TT,AC                   ;(COMBINED WITH PREVIOUS OLD WORD)
2393         MOV     C,LSH                   ;WE MAKE A NEW SHIFTED WORD.
2394         MOV     MQ,-(A)                 ;STORE THE NEXT NEW WORD.
2395         BR      CINS1
2396
2397 CINS3:  MOV     AC,-(A)                 ;REMAINDER OF LAST FROM-WORD GOES INTO LAST TO-WORD.
2398         BR      CINS2
2399
2400 ;FOR INSERT/DELETE CHARACTER, CHECK ARG IN A FOR LEGALITY.  MAYBE JUMP OFF
2401 ;TO CLEAR-TO-END-OF-LINE FOR INSERTING OR DELETING TOO MANY CHARACTERS.
2402 ;OTHERWISE, RETURN HAVING PUSHED ON THE STACK THE ARG, LELCC(U), #LINHT, AND LECC(U).
2403 CINSET: POP     B                       ;GET RET ADDR OFF STACK SO WE CAN POPJ OUR CALLER
2404         MOV     A,MQ                    ;OR PUSH ON HIS STACK.
2405         BEQ     CINSX                   ;IF ARG IS 0, OUR CALLER HAS NOTHING TO DO, SO POPJ HIM
2406         MOV     #CHRWD,MUL
2407         MOV     LEX(U),C                ;AT WHAT DOT POSITION DOES REGION INSERTED/DELETED END?
2408         ADD     MQ,C
2409         BLT     .+6                     ;PAST RIGHT MARGIN => THIS OPERATION EQUIVALENT
2410          JMP    CLEOL                   ;TO A CLEAR-TO-END-OF-LINE.
2411         MOVB    #CSET,CALU
2412         PUSH    A                       ;SAVE # CHAR POSITIONS TO INSERT.
2413         PUSH    LELCC(U)                ;SAVE ADDR START OF 1ST RASTER LINE (ADVANCES)
2414         PUSH    #LINHT
2415         PUSH    LECC(U)                 ;AND ADDR OF CURSOR IN 1ST RASTER LINE.
2416         JMP     (B)                     ;RETURN TO OUR CALLER, HAVING PUSHED HIS TEMPS.
2417 \f
2418 ;DELETE CHARACTERS.  DELETE SOME CHARACTERS AFTER THE CURSOR.  THE FOLLOWING ONES
2419 ;MOVE LEFT.  BLANKS ARE SHOFTED IN AT THE RIGHT MARGIN.
2420 CDEL:   JSR     PC,GETCHC               ;A GETS HOW MANY CHARACTERS TO DELETE.
2421         JSR     PC,CINSET               ;DECODE A.  MAYBE POPJ OR JUMP TO CLEOL.
2422                                         ;OTHERWISE, PUSH ON STACK A, LELCC(U), #LINHT, LECC(U).
2423 CDELL:  MOV     6(SP),A
2424         MOV     (SP),T
2425         MOV     4(SP),C
2426         JSR     PC,CDEL1L
2427         ADD     #BYTPL,(SP)
2428         ADD     #BYTPL,4(SP)
2429         DEC     2(SP)
2430         BNE     CDELL
2431         ADD     #10,SP
2432         MOVB    #CIOR,CALU
2433 CDELX:  RTS     PC
2434
2435 ;DELETE C(A) CHARACTER POSITIONS FROM ONE RASTER LINE
2436 ;T POINTS AT WORD CONTAINING CURSOR, IN THAT RASTER LINE.
2437 ;C POINTS AT START OF THAT RASTER LINE.  ASSUMES CALU/ CSET.
2438 CDEL1L: MOV     A,MQ
2439         MOV     #CHRWD,MUL              ;COMPUTE # OF BITS TO SHIFT THE LINE BY.
2440         MOV     #20,DIV                 ;COMPUTE # WORDS TO SHIFT IN MQ, # BITS IN AC.
2441         MOV     #20-CHRWD,TT
2442         SUB     LEPHS(U),TT             ;TT GETS # BITS AT FRONT OF 1ST WORD NOT TO CHANGE.
2443         PUSH    TT
2444         PUSH    (T)                     ;ALSO SAVE THE WORD CONTAINING THEM.
2445         PUSH    T                       ;AND ITS ADDRESS
2446         MOV     T,TT                    ;(WHICH IS ALSO ADDR TO START SHIFTING INTO).
2447         ADD     MQ,TT                   ;AND ADDR TO START SHIFTING FROM, AND 1ST FROM-WORD.
2448         ADD     MQ,TT                   ;MQ HAS # OF WORDS, BUT TT HAS AN ADDRESS.
2449         MOV     (TT)+,A
2450         ADD     #BYTPL,C                ;C GETS ADDR OF 1ST WORD PAST END OF LINE.
2451         PUSH    U
2452         MOV     AC,U                    ;U HAS # BITS SHIFTING BY.
2453 ;NOW MAKE TO-WORDS 1 BY 1 EACH OUT OF A PAIR OF FROM-WORDS.
2454 ;THE LAST FROM-WORD IS IN A.  T HAS STORE ADDRESS, TT HAS FETCH ADDRESS.
2455 CDEL1:  CMP     C,TT                    ;STOP AFTER GOBBLING ALL OF THIS RASTER LINE.
2456         BLOS    CDEL2
2457         MOV     (TT)+,B
2458         MOV     B,MQ                    ;CLOBBERS AC, SO RELOAD IT FROM T.
2459         MOV     A,AC
2460         MOV     U,LSH                   ;NOW SHIFT THE 2 FROM-WORDS BY # BITS SHIFTING BY,
2461         MOV     AC,(T)+                 ;WHICH GIVES AC THE RIGHT STUFF FOR NEXT TO-WORD.
2462         MOV     B,A                     ;NOW T GETS THE NEWEST FROM-WORD, AND FETCH ANOTHER.
2463         BR      CDEL1
2464
2465 CDEL2:  MOV     A,MQ                    ;REMAINDER OF LAST FROM-WORD IS NEXT TO-WORD.
2466         MOV     U,LSH
2467         MOV     MQ,(T)+
2468         JSR     PC,CLRRNG               ;CLEAR STARTING WHERE T POINTS, ENDING WHERE C POINTS.
2469 ;NOW RESTORE THE FIRST FEW BITS OF THE FIRST WORD (WHICH WEREN'T SUPPOSED
2470 ;TO BE INCLUDED IN THE SHIFT).
2471 CINS2:  POP     U
2472         POP     C                       ;GET ADDRESS OF 1ST TO-WORD
2473         POP     A                       ;GET OLD 1ST TO-WORD CONTENTS
2474         POP     T                       ;AND NUMBER OF BITS AT TOP NOT TO INCLUDE IN SHIFT.
2475         MOV     #-1,AC
2476         NEG     T
2477         MOV     T,LSH                   ;MQ GETS MASK TO BITS WE WANT SHIFTED INTO.
2478         MOV     AC,T
2479         BIC     T,A                     ;FLUSH THOSE IN SAVED CONTENTS.
2480         COM     T
2481         BIC     T,(C)                   ;FLUSH THE OTHERS IN SHIFTED CONTENTS.
2482         BIS     A,(C)                   ;MERGE OLD BITS WITH NEW.
2483         RTS     PC
2484
2485 CLRRN1: CLR     (T)+
2486 CLRRNG: CMP     T,C
2487         BNE     CLRRN1
2488         RTS     PC
2489 \f
2490 ;CLEARS TO END OF LINE
2491
2492 CLEOL:  PUSH    LECC(U)
2493         PUSH    LEPHS(U)
2494         PUSH    LEX(U)
2495         JSR     PC,CLEOL1       ;DO THE DIRTY WORK
2496 CLEOX:  POP     LEX(U)
2497         POP     LEPHS(U)
2498         POP     LECC(U)
2499         MOVB    #CIOR,CALU      ;RESTORE FOR DPYDP1 LOOP
2500         RTS     PC
2501
2502 CLEOL1: MOV     LEX(U),TT       ;ALREADY AT END OF LINE?
2503         BGE     CLEOLX
2504         CMP     LEPHS(U),#20-CHRWD
2505         BEQ     CLEOL2          ;IF AT START OF WORD, START CLEARING WORD-WISE
2506         JSR     PC,CLRCHR       ;ELSE CLEAR 1 CHAR AT A TIME TILL REACH WORD BOUNDARY.
2507         JSR     PC,LEDADC
2508         CMP     LEX(U),#-BITPL
2509         BEQ     CLEOLX          ;CLEARED WHOLE LINE AND WRAPPED AROUND => DONE
2510         BR      CLEOL1
2511
2512 CLEOL2: ASR     TT
2513         ASR     TT
2514         ASR     TT
2515         ASR     TT              ;-(# WORDS TO CLEAR)
2516         PUSH    TT
2517         PUSH    LECC(U)         ;ADDR OF 1ST WORD TO CLEAR,
2518         PUSH    #LINHT          ;# LINES TO PROCESS
2519         MOVB    #CSET,CALU
2520 CLEOL3: MOV     2(SP),T         ;START CLEARING HERE
2521 CLEOL4: CLR     (T)+
2522         INC     TT
2523         BLT     CLEOL4
2524         ADD     #BYTPL,2(SP)
2525         MOV     4(SP),TT        ;-(# WORDS TO CLEAR)
2526         DEC     (SP)
2527         BGT     CLEOL3
2528         ADD     #6,SP           ;CLEANSE STACK
2529         MOV     T,LECC(U)
2530         JMP     CR1             ;RESET X AND PHASE
2531
2532 CLEOLX: MOV     LELCC(U),T
2533         ADD     #<LINHT*BYTPL>,T        ;HERE IF ALREADY AT END OF LINE
2534         MOV     T,LECC(U)
2535         JMP     CR1
2536
2537 ;CLEARS TO END OF SCREEN
2538
2539 CLEOF:  MOV     LELCC(U),T              ;IF AT START OF LINE, DO FAST CLEAR FROM THIS LINE.
2540         CMP     #-BYTPL,LEX(U)          ;IF NOT AT BEGINNING OF LINE, USE CLEOL TO CLEAR
2541         BEQ     CLEOF1                  ;ONLY THE REST OF THIS LINE.
2542         JSR     PC,CLEOL
2543         MOV     LELCC(U),T              ;AND START FAST CLEAR WITH NEXT LINE.
2544         ADD     #BYTPL*LINHT,T
2545 CLEOF1: MOV     #TVFENCE,B
2546         JMP     LDEL5
2547
2548 ;HERE TO FORWARD SPACE
2549
2550 FS:     JMP     LEDADC
2551 \f
2552 ;HANDLE %TDMOV
2553 SETCUR: JSR     PC,GETCHC       ;OLD VERTICAL AND HORIZONTAL
2554         JSR     PC,GETCHC
2555
2556 ;HANDLE %TDMV0, %TDMV1  ABSOLUTE POSITIONING COMMANDS.
2557 SETCR1: JSR     PC,GETCHC       ;NEW VERTICAL
2558         MOV     A,B
2559         JSR     PC,GETCHC       ;NEW HORIZONTAL
2560                                 ;NOTE GETCHC MAY RETURN AND BE REENTERED,
2561                                 ;RESETTING ALL ACS BUT B.
2562
2563 ;HERE TO SET CURSOR GIVEN A COORDINATE PAIR (X,Y) IN CHARACTERS.
2564 ;X AND Y ARE IN A AND B RESPECTIVELY, (0,0) IS UPPER LEFTHAND CORNER
2565 ;(1,3) IS THE SECOND CHARACTER OF FOURTH LINE
2566
2567 SETXY:  CMP     #CHRPL,A                ;CHECK FOR LEGAL POSITION
2568         BLOS    SETXY1
2569         CMP     #CHRLN,B
2570         BLOS    SETXY1
2571 SETXY0: MOV     #MQ,T                   ;FOR THE MYRIAD MULTIPLIES AND DIVIDES
2572         MOV     B,(T)+                  ;Y POSITION
2573         MOV     #BYTPL*LINHT,(T)        ;FIND ORIGIN OF LINE IN MEMORY
2574         MOV     -(T),LECC(U)
2575         MOV     (T),LELCC(U)
2576         MOV     A,(T)+                  ;X POSITION
2577         MOV     #CHRWD,(T)
2578         MOV     -(T),LEX(U)             ;BITS FROM LEFT OF SCREEN
2579         CLR     -(T)                    ;CLEAR OUT AC
2580         MOV     #20,-(T)                ;DIVIDE GIVES WORDS FROM LEFT AND PHASE
2581         TST     (T)+
2582         MOV     (T)+,LEPHS(U)           ;PHASE
2583         ASL     (T)                     ;BYTES FROM BEGIN OF LINE
2584         ADD     (T),LECC(U)             ;LEAVE T POINTING AT MQ
2585         ADD     #-BITPL,LEX(U)          ;THAT'S ALL DONE
2586         NEG     LEPHS(U)
2587         ADD     #20-CHRWD,LEPHS(U)      ;PHASE IS SET
2588         MOV     B,(T)+                  ;Y POSITION AGAIN
2589         MOV     #LINHT,(T)
2590         MOV     -(T),LEY(U)
2591         ADD     #-NLINS,LEY(U)          ;LEY SET
2592         ADD     #TVLO,LECC(U)
2593         ADD     #TVLO,LELCC(U)
2594         BIT     #1,LECC(U)              ;MAKE SURE IT LINES UP ON WORD BOUNDARY
2595         BEQ     .+4
2596         BPT
2597 SETXY1: RTS     PC
2598 \f
2599 ;OUTSTR TAKES STRING TO PRINT IN B
2600
2601 OUTSTR:
2602 OUTS1:  MOVB    @(SP),A
2603         INC     (SP)
2604         TST     A
2605         BEQ     OUTSX
2606         CMP     #12,A
2607         BEQ     OUTSLF
2608         CMP     #15,A
2609         BEQ     OUTSCR
2610         JSR     PC,TVO
2611         BR      OUTS1
2612 OUTSLF: JSR     PC,LF
2613         BR      OUTS1
2614 OUTSCR: JSR     PC,CR
2615         BR      OUTS1
2616 OUTSX:  ASR     (SP)    ;MAKE SURE WE RETURN TO EVEN ADDRESS
2617         ADC     (SP)
2618         ASL     (SP)
2619         RTS     PC
2620
2621 ;TAKES # IN A AND PRINTS AS UNSIGNED INTEGER
2622
2623 OCTPNT: PUSH    RADIX
2624         MOV     #10,RADIX
2625 OCTPN1: JSR     PC,DECPN0
2626         POP     RADIX
2627         RTS     PC
2628
2629 DECPNT: PUSH    RADIX
2630         MOV     #10.,RADIX      ;FOR DECIMAL PRINTING
2631         BR      OCTPN1
2632
2633 DECPN0: MOV     A,MQ            ;INTO EAE
2634 DECPN9: MOV     #AC,A           ;FOR FAST ACCESS
2635 DECPN1: MOV     RADIX,-(A)      ;DIVIDE BY RADIX
2636         TST     (A)+            ;POINTS AT AC
2637         MOV     (A)+,-(SP)      ;REMAINDER
2638         ADD     #'0,(SP)
2639         TST     (A)             ;QUOTIENT IS IN MQ
2640         BEQ     DECPN2
2641         CLR     -(A)            ;FLUSH OUT AC, LEAVING MQ UNTOUCHED
2642         JSR     PC,DECPN1       ;RECURSIVE YET!
2643 DECPN2: POP     A               ;TYPE OUT THAT DIGIT
2644         JMP     TVO             ;TYPES DIGIT AND ADVANCES CURSOR
2645 \f
2646 .SBTTL CALL, BREAK AND ESCAPE ROUTINES
2647
2648 ;LEGAL ESCAPE AND BREAK COMMAND TABLE
2649
2650 ESCHAR: .BYTE '0,'1,'2,'3,'4,'5,'6,'7,'8,'9     ;DON'T DISTURB DIGITS
2651         .BYTE 'S,'Q,'F,'D,'A,'E                 ;THESE CAN BE DONE ON ANY KBD
2652 ESCSRN: .BYTE 'C,'L,'I,'R,'W,'U                 ;THESE NEED A SCREEN TO WIN
2653 NESCMD==.-ESCHAR
2654         .BYTE 0                                 ;MARKS END OF TABLE
2655         .EVEN
2656
2657 ;DISPATCH TABLE
2658
2659 ESCTAB: .REPT 10.
2660         .NLIST
2661         ESCDIG          ;DIGIT
2662         .LIST
2663         .ENDR
2664         VSWSEL          ;<S> SELECT VIDEO CHANNEL
2665         ESCQPY          ;<Q> CAUSE A HARD COPY TO EXIST
2666         ESCFRE          ;<F> SAME AS S, BUT TO CONSOLE FREE BUFFER
2667         ESCBUZ          ;<D> BUZZ 9TH FLOOR DOOR
2668         ESCAUD          ;<A> SELECT AUDIO INPUT.
2669         ESCELE          ;<E> CALL THE ELEVATOR
2670 CHECK ESCTAB,<<ESCSRN-ESCHAR>*2>
2671         BOWXOR          ;<C> TOGGLE BLACK ON WHITE BIT
2672         ESCCLR          ;<L> CLEAR SCREEN UNBEKNOWNST TO TEN.
2673         ESCCSR          ;<I> CLEAR SCROLL REGISTER
2674         ESCRPT          ;<R> START REPEATING THE PREV. CHAR TYPED IN.
2675         ESCWHO          ;<W> WHO LINE CONTROL
2676         ESCWHO          ;<U> WHO LINE CONTROL
2677 CHECK ESCTAB,NESCMD*2
2678
2679 ;HERE FOR ESCAPE
2680
2681 ESCAPE: BIT     #ACLBIT+AMTBIT,B
2682         BEQ     ESCAP1          ;ESCAPE WITH CONTROL OR META TURNS INTO TOP-A.
2683         JMP     BRKCLR
2684
2685 ESCAP1: MOVB    A,KBDESC(C)     ;SAY FOLLOWING CHARS TO BE INTERPRETED AS AN ESCAPE CMD.
2686         CLRB    KBDARG(C)       ;DEFAULT ARG TO ZERO
2687 RTSPC4: RTS     PC
2688
2689 ;ACCUMULATE ARGS FOR ESCAPE AND BREAK
2690
2691 ESCDIG: ASR     T               ;DIGIT
2692         MOVB    KBDARG(C),A     ;MULTIPLY ACCUMULATED VALUE BY 8
2693         ASL     A
2694         ASL     A
2695         ASL     A
2696         ADD     T,A             ;ADD IN NEW DIGIT
2697         MOVB    A,KBDARG(C)
2698         INCB    KBDESC(C)       ;READ NEXT CHAR AS A COMMAND CHAR, NOT AS PDP-10 INPUT.
2699         RTS     PC
2700
2701 ;TAKES CHARACTER IN A AND CONVERTS IT UPPER CASE
2702
2703 UPPER:  TST     A               ;MAKE SURE ITS LEGAL ASCII
2704         BLE     UPPER1
2705         CMP     #'a,A           ;LOWER CASE?
2706         BGT     UPPER1
2707         CMP     #'z,A
2708         BLT     UPPER1
2709         SUB     #'a-'A,A        ;MAKE IT UPPER CASE
2710 UPPER1: RTS     PC
2711
2712 ;HANDLE ESCAPE-R.  WITH NO ARG, STARTS INDEFINITE REPETITION OF LAST CHARACTER TYPED.
2713 ;WITH ARG, STOPS AFTER THAT MANY REPETITIONS.  IN ANY CASE, ANY USER-SUPPLIED
2714 ;INPUT STOPS THE REPETITION.
2715 ESCRPT: MOVB KBDARG(C),A
2716         BNE ESCRP1
2717         DEC A
2718 ESCRP1: MOV A,LERPT(U)
2719         RTS PC
2720 \f
2721 ;HERE TO SELECT VIDEO SWITCH INPUT.
2722 ;C HAS 2*KBD NUMBER; KBDARG(C) HAS VSW INPUT # OR 0 => DEFAULT.
2723
2724 VSWSEL: JSR     PC,VSWSGO       ;SET UP L.E. IDX IN U, VSW OUTPUT IN T.
2725         BLT     RTSPC4
2726         MOV     #-1,KBDDEF(C)   ;NORMALLY RESET ANY TIME-OUT, BUT
2727         TSTB    KBDARG(C)       ;IF THERE'S AN ARGUMENT,
2728         BEQ     VSWSL0
2729         TST     U
2730         BNE     VSWSL0
2731         JSR     PC,VSWSL3       ;SET UP A TIMEOUT, IF WE ARE A FREE SCREEN.
2732 VSWSL0: MOVB    KBDARG(C),TT    ;GET ARG
2733         BNE     VSWSL1          ;SELECT DEFAULT?
2734
2735 ;SELECT THE DEFAULT INPUT FOR A KEYBOARD.
2736 ;C HAS 2*KBD #, U HAS L.E. IDX OR 0 IF NONE, T HAS DEFAULT VSW OUTPUT OF THAT KBD.
2737 VSWDEF: MOV     #-1,KBDDEF(C)   ;SAY THERE'S NO TIMEOUT ON THIS VSW SELECTION.
2738         TST     U               ;FREE SCREEN => DEFAULT IS THE FREE DPY BUFFER.
2739         BEQ     VSWFRE
2740         MOVB    LECREG(U),TT    ;GET DPY # TO SET DEFAULT
2741         BLT     RTSPC4          ;GARBAGE?
2742 ;COME HERE WITH DPY BUFFER # IN TT, TO SELECT THAT DPY BUFFER.
2743 VSWDE1: ASL     TT
2744         MOV     DPYVSW(TT),TT   ;DEFAULT VIDEO SWITCH INPUT
2745         JMP     VSWIT           ;DON'T NEED TO CHECK THIS
2746
2747 ;COME HERE FOR [ESC]<N>S, WITH <N> IN TT.
2748 VSWSL1: BIC     #-400,TT        ;UNDO SIGN-EXTENSION AT VSWSL0
2749         CMP     TT,NF11TY
2750         BLO     VSWSL2          ;<N> TOO SMALL TO BE TTY # => IT IS VSW INPUT #.
2751         CMP     TT,#200
2752         BHIS    VSWSL4          ;<N> >= 200 => IT IS DPY BUFFER # PLUS 200.
2753         TST     NF11TY          ;IF NF11TY ISN'T KNOWN, VSW INPUT #S LOOK LIKE TTY #S
2754         BEQ     VSWSL2          ;BUT WE ARE EVEN SMARTER AND KNOW IT'S REALLY VSW INPUT.
2755         SUB     NF11TY,TT       ;ELSE <N> SHOULD BE TTY NUMBER
2756         CMP     TT,#MAXTV
2757         BHIS    RTSPC4          ;DO NOTHING IF ARG OUT OF RANGE.
2758         ASL     TT
2759         ASL     TT
2760         MOVB    DPYKBD+1(TT),TT ;GET DPY BUFFER # FOR THIS TV, AND SELECT THAT DPY BUFFER.
2761         BMI     RTSPC4
2762         BR      VSWDE1
2763
2764 VSWSL4: SUB     #200,TT         ;TT SUPPOSEDLY HAS 200 PLUS DPY BUFFER NUMBER.
2765         CMP     TT,#MAXTV
2766         BLO     VSWDE1
2767         BR      RTSPC4
2768 \f
2769 ;COME HERE TO HANDLE SET-VSW COMMAND FROM PDP10. T HAS OUTPUT #, TT HAS INPUT #.
2770 ;IF THEY ARE ILLEGAL WE DO NOTHING.
2771 ;ON RETURN, BLO JUMPS IF THEY WERE LEGAL.
2772 VSWCMD: MOV     #-1,KBDDEF(C)   ;FLUSH ANY TIME-OUT.
2773         CMP     T,#MAXVSO       ;CHECK FOR LEGAL OUTPUT
2774         BHIS    RTSPC4
2775 ;COME HERE WITH VALID OUTPUT # IN T, AND (MAYBE INVALID) INPUT # IN TT.
2776 VSWSL2: CMP     TT,#MAXVSI*VSWSEC
2777         BHIS    RTSPC4          ;REASONABLE?
2778         JMP     VSWIT           ;SWITCH THE SWITCH
2779
2780 ESCFRE: JSR     PC,VSWSGO       ;SET UP U AND T FOR VSWDE1.
2781         BLT     RTSPC5
2782         JSR     PC,VSWSL3       ;THERE IS A TIMEOUT ON THIS SPYING.
2783 VSWFRE: MOV     DPYFRE,TT       ;GET DPY # OF FREE CONSOLE SCREEN
2784         BR      VSWDE1
2785
2786 ;SET UP A TIMEOUT WHEN A SPY IS ABOUT TO BE DONE. C HAS 2*KBD.
2787 VSWSL3: MOVB    #KBDTIM,KBDCNT(C)       ;SET UP A TIMEOUT ON THIS KEYBOARD.
2788         INC     KBDTSW          ;TELL CLOCK LEVEL TO START CHECKING TIMEOUTS.
2789         RTS     PC
2790
2791 ;SET UP U := L.E. IDX, OR 0 IF NONE; T HAS DEFAULT VSW OUTPUT; GIVEN 2*KBD # IN C
2792 ;NEGATIVE IF SOMETHING FUNNY IS GOING ON, AND CALLER SHOULDN'T HACK.
2793 VSWSGO: MOV     KBDLE(C),U
2794         BLT     RTSPC5          ;THIS IF TEN SELECTS NON-EXISTENT VSW OUTPUT.
2795         BEQ     VSWSG1
2796         TST     LEKBD(U)
2797         BLT     RTSPC5
2798 VSWSG1: MOV     C,T
2799         ASR     T
2800         MOVB    KBDVSW(T),T
2801         RTS     PC
2802
2803 ;DO [ESC]S ON KBD SPEC'D BY 2*KBD IN C.
2804 VSWUNS: JSR     PC,VSWSGO
2805         BLT     RTSPC5
2806         JMP     VSWDEF
2807
2808
2809 ;HANDLE [ESC] <ASW INPUT> A.
2810 ESCAUD: MOVB    KBDARG(C),TT            ;ASW INPUT NUMBER.
2811         MOV     C,T
2812         ASR     T                       ;KEYBOARD NUMBER.
2813         MOVB    KBDASW(T),T             ;OUTPUT NUMBER OF KEYBOARD.
2814         BMI     RTSPC5                  ;WE DON'T KNOW YET OR IT HAS NO SPEAKER.
2815         JMP     ASWIT                   ;CONNECT THEM.
2816 \f
2817 ;CHANGE STATE OF BOW BIT
2818
2819 BOWXOR: MOVB    #CXOR,CALU
2820         MOV     #BOWBIT,CSA
2821         RTS     PC
2822
2823 ;HERE TO CLEAR SCREEN
2824
2825 ESCCLR: MOVB    CREG,T          ;THE SCREEN TO CLEAR
2826         PUSH    T
2827
2828         BLKOFF  T
2829         JSR     PC,CLBLIN       ;CLEAR ALL BLINKERS
2830         JSR     PC,CLRSCR       ;CLEAR THE SCREEN
2831         POP     T
2832         BLKON   T
2833
2834         RTS     PC
2835
2836 ;HERE TO RESET SCROLL REGISTER
2837
2838 ESCCSR: MOVB #CSET,CALU
2839         BIC #SAMSK,CSA  ;RESET THE SCROLL REGISTER
2840         RTS PC
2841
2842 ;HERE TO GENERATE VIDEO HARD COPY
2843
2844 ESCQPY: TST     QPYSWT          ;IS THE SWITCH LOCKED?
2845         BNE     ESCQPB
2846         TST     QPYDWN          ;IS THE QPY DOWN?
2847         BNE     ESCQPB
2848 ESCQP1: MOV     KBDLE(C),U
2849         BEQ     ESCQP6
2850         TST     LEKBD(U)
2851         BLT     RTSPC5
2852 ESCQP6: MOV     #QPYVSW,T       ;THE VIDEO SWITCH OUTPUT FOR THE HARD COPY UNIT
2853         JSR     PC,VSWSL0       ;PROCESS THE ARG
2854         CHROFF
2855         ZAPFLG  QPYSWT          ;LOCK THE SWITCH
2856         BIS     #QPYKMS,KMS     ;CAUSE THE COPY
2857         JSR     TT,ADQUE        ;SCHEDULE THE UNCOPY
2858                 2
2859                 ESCQP2
2860         MOV     CREG,T
2861         JSR     TT,ADQUE        ;SCHEDULE THE SWITCH UNLOCK
2862                 QPTIME
2863                 ESCQP3
2864 RTSON:  CHRON
2865 RTSPC5: RTS     PC
2866
2867 ESCQPB: JMP     BELL            ;SOME ONE ELSE IS COPYING, GIVE HIM A BELL
2868
2869 ESCQP2: BIC     #QPYKMS,KMS     ;UNCAUSE THE COPY
2870         RTS     PC
2871
2872 ESCQP3: JSR     PC,CLKBEL       ;BELL WHEN COPY DONE
2873         CLR     QPYSWT
2874         RTS     PC
2875
2876 ;HERE TO BUZZ 9TH FLOOR DOOR
2877 ESCBUZ: TST     BUZSWT          ;IS THE SWITCH LOCKED?
2878         BEQ     ESCBZ1
2879         JMP     BELL
2880 ESCBZ1: CHROFF
2881         ZAPFLG  BUZSWT          ;LOCK SWITCH
2882         BIS     #BUZKMS,KMS     ;BUZZ THE DOOR
2883         MOV     CREG,T
2884         JSR     TT,ADQUE        ;SCHEDULE THE UNBUZZ
2885                 BUZTIM
2886                 ESCBZ2
2887         BR      RTSON
2888
2889 ESCBZ2: JSR     PC,CLKBEL       ;BELL WHEN BUZZ DONE
2890         BIC     #BUZKMS,KMS     ;UNBUZZ THE DOOR
2891         CLR     BUZSWT          ;UNLOCK THE SWITCH
2892         RTS     PC
2893
2894 ;HERE TO CALL THE ELEVATOR
2895 ; C HAS 2*KBD NUMBER
2896
2897 ESCELE: TST     ELESWT          ;IS THE SWITCH LOCKED?
2898         BEQ     ESCEL1
2899         JMP     BELL
2900 ESCEL1: CHROFF
2901         ZAPFLG  ELESWT          ;LOCK SWITCH
2902         MOV     C,T
2903         ASR     T               ;DEVIDE BY 2
2904         CMP     T,#MAXVSO       ;IS IT IN RANGE?
2905         BHIS    RTSON
2906         MOVB    ELETAB(T),TT    ;WHICH FLOOR IS IT ON?
2907         SWAB    TT              ;GET CONSTANT INTO THE LEFT HALF WORD
2908         BIS     TT,KMS          ;FROB THE CORRECT BIT
2909         MOV     CREG,T
2910         JSR     TT,ADQUE        ;SCHEDULE THE UNPUSH
2911                 ELETIM
2912                 ESCEL2
2913         BR      RTSON
2914
2915
2916 ESCEL2: JSR     PC,CLKBEL       ;BELL WHEN DONE
2917         BIC     #ELEKMS,KMS     ;UNPRESS
2918         CLR     ELESWT          ;UNLOCK THE SWITCH
2919         RTS     PC
2920
2921
2922
2923 CLKBEL: PUSH    CREG            ;FOR USE BY CLOCK QUEUED ROUTINES
2924         MOV     (T),CREG        ;T POINTS TO DESIRED CREG
2925         PUSH    TT              ;DON'T CLOBBER AT PI LEVEL!!
2926         JSR     PC,BELL
2927         POP     TT
2928         POP     CREG
2929         RTS     PC
2930 \f
2931 ;HERE TO CONTROL WHO LINE
2932
2933 ;         [ESC]<N>W                   WHMODE
2934 ;       N=0     TURN OFF WHO LINE      -1
2935 ;         1     FOLLOW KEYBORAD         0
2936 ;         2     FREEZE                  1
2937 ;         3     NEXT HIGHER             2
2938 ;         4     NEXT LOWER              3
2939 ;ALL OTHERS     SYSTEM WHO LINE
2940
2941 ;         [ESC]<N>U
2942 ;FREEZES WHOLINE ON JOB WHOSE USER INDEX IS N*L (L IS THE ITS SYMBOL).
2943
2944 NWHCMD==5       ;NUMBER OF WHO COMMANDS
2945
2946 ESCWHO: MOV     LECHN(U),TT     ;10/11 CHANNEL
2947         ASL     TT              ;MAKE IT CHANNEL INDEX
2948         ASL     TT
2949         MOV     WHOLIN(TT),TT   ;WHO LINE VARIABLES
2950         CMPB    A,#'U
2951         BEQ     ESCWHU
2952         MOVB    KBDARG(C),T     ;ARGUMENT
2953         DEC     T               ;HACK
2954         BMI     ESCWH2          ;TURN IT OFF?
2955         MOV     T,WHMODE(TT)    ;SET THE MODE WE WANT
2956 ESCWU1: CLR     WHMOD1(TT)      ;JUST TO BE SURE
2957         MOV     #-1,TENWHO      ;TELL PDP-10 TO UPDATE WHO LINES
2958         RTS     PC
2959
2960 ;TURNS OFF WHO LINE
2961
2962 ESCWH2: ;CLEAR WHO LINE AT MAIN PROGRAM LEVEL TOO
2963         MOV     T,2(TT)         ;(T HAS -1 IN IT)
2964         MOV     T,WHMODE(TT)    ;AND TURN IT OFF
2965         BR      CLRWHL
2966
2967 ZAPWHL: MOV     DPYCHN(B),A     ;SET UP CREG
2968         MOVB    LECREG(A),CREG
2969 CLRWHL: MOV     #TVLO+<LINHT*CHRLN*BYTPL>,T
2970         MOV     #CHRHT-1,TT
2971         JMP     CLRCL0
2972
2973 ESCWHU: MOV     #1,WHMODE(TT)
2974         MOVB    KBDARG(C),WHJOB(TT)
2975         CLR     WHJOB1(TT)
2976         BR      ESCWU1
2977 \f
2978 ;COME HERE FOR CALL KEY
2979
2980 CALL:   PUSH    B
2981         TSTB    KBDCNT(C)
2982         BLT     CALL1
2983         JSR     PC,VSWUNS       ;IF DOING A SPY WITH A TIMEOUT, UNDO IT.
2984 CALL1:  MOV     KBDLE(C),U      ;LINE EDITOR VARIABLES
2985         BNE     UPTREE          ;GET FRESH LINE EDITOR?
2986         ASR     C
2987         JSR     PC,CHCONS       ;ALLOCATE A CHANNEL.
2988 ;T HAS CHANNEL NUMBER.  U HAS LINE EDITOR ADDR.  A HAS WHOLINE VAR BLOCK ADDR.
2989         TST     T               ;-1 RETURNED AS CHANNEL # => NONE AVAILABLE.
2990         BLT     CALLLS
2991         MOVB    LECREG(U),CREG
2992         CLR     CSA             ;CLRSCR SETS UP CALU
2993
2994 ;HERE IF CALL AND LINE EDITOR EXISTS.
2995
2996 UPTREE: POP     B
2997         CLR     LERPT(U)
2998         MOV     #32,A           ;CONTROL-Z (SIGH)
2999         BIS     #ACTBIT,B       ;ACTIVATES BUFFER
3000         JMP     PUTCHR          ;SEND THAT CHARACTER TO PDP-10
3001
3002 CALLLS: POP     B
3003 RTSPC2: RTS     PC
3004 \f
3005 ;HERE TO ALLOCATE A DISPLAY CHANNEL.
3006 ;CALLED WITH KEYBOARD NUMBER IN C, OR -1 IF NOT ALLOCATING THIS DPY FOR A KEYBOARD.
3007 ;RETURNS THE CHANNEL NUMBER (TTY NUMBER MINUS NF11TY) IN T,
3008 ;THE LINE EDITOR BLOCK ADDR IN U,
3009 ;AND THE ADDRESS OF THE WHOLINE VARIABLE BLOCK IN A.  SETS WHMODE TO 0.
3010 ;IF NO CHANNEL IS AVAILABLE, OR THE KEYBOARD CAN'T BE USED FOR SOME REASON,
3011 ;WE RETURN -1 IN T TO INDICATE THAT.
3012
3013 CHCONS: MOV     C,T             ;IF A KEYBOARD IS SPECIFIED,
3014         BLT     CHCON4
3015         TSTB    KBDVSW(C)       ;DON'T ALLOW IT IF KEYBOARD HAS NO SCREEN
3016         BLT     CHCNFL
3017         ASL     T
3018         TST     KBDLE(T)        ;OR IS ALREADY IN USE.
3019         BNE     CHCNFL
3020 CHCON4: CLR     T               ;NOW FIND A FREE CHANNEL
3021 CHCON1: TSTB    CHCREG(T)       ;DON'T ALLOCATE CHANNELS THAT DON'T HAVE BUFFERS.
3022         BLT     CHCON0
3023         TSTB    CHNUSE(T)
3024         BEQ     CHCON2
3025 CHCON0: INC     T
3026         CMP     T,#MAXTV
3027         BLT     CHCON1
3028 CHCNFL: MOV     #-1,T
3029         RTS     PC              ;NO FREE CHANNEL
3030
3031 CHCON2: INCB    CHNUSE(T)       ;FOUND A CHANNEL.  MARK IT IN USE.
3032         DEC     ITSFDP          ;DECREASE COUNT OF FREE CHANNELS.
3033         MOVB    CHCREG(T),A
3034         PUSH    A               ;SAVE VIDEO BUFFER NUMBER FOR POPPING INTO LECREG
3035         MOVB    A,CREG          ;SELECT THAT BUFFER
3036         PUSH    T               ;PROTECT T, SMASHED BY CLRSCR (TT ALSO SMASHED)
3037         JSR     PC,CLRSCR       ;AND CLEAR IT (SLOW, BUT NECESSARY BEFORE SWITCHING VSW)
3038         POP     T
3039         MOV     T,A
3040         ASL     A
3041         ASL     A
3042         MOV     DPYCHN(A),U     ;GET THE ADDR OF CHANNEL'S VAR BLOCK.
3043         JSR     PC,CHCLR        ;PUT -1'S IN THE 10-TO-11 BUFFER, RESET POINTERS.
3044         JSR     PC,LECON2       ;INITIALIZE THE LINE EDITOR BLOCK.
3045         MOVB    (SP),DPYKBD+1(A)        ;TELL THE 10 WHICH TV BUFFER.
3046         POP     LECREG(U)       ;TELL THE LINE EDITOR WHICH TV BUFFER IT IS.
3047         MOV     C,LEKBD(U)      ;AND WHICH KEYBOARD IT IS.
3048         BLT     CHCON3
3049         MOV     C,CHNCLS(A)     ;TELL THE 10 ABOUT THE KEYBOARD.
3050         CLRB    CHNCLS+1(A)     ;MAKE SURE CHNCLS IS NON-NEGATIVE EVEN IF KBD WAS -1
3051         MOVB    C,DPYKBD(A)
3052         MOV     T,LECHN(U)      ;TELL LE WHICH DPY CHANNEL NUMBER IT IS
3053         PUSH    T               ;SHOW OUR DPY BUFFER ON THE KBD'S SCREEN.
3054         MOVB    KBDVSW(C),T     ;VIDEO SWITCH OUTPUT
3055         MOVB    LECREG(U),B
3056         ASL     B
3057         MOV     DPYVSW(B),TT    ;GET OUR DPY'S VIDEO INPUT NUMBER.
3058         JSR     PC,VSWIT        ;SWITCH THE SWITCH
3059         MOV     FBLINK,T        ;CONS UP A BLINKER FOR THE CURSOR
3060         BNE     .+4             ;ARE THERE FREE BLINKERS?
3061         BPT
3062
3063         MOV     BLNEXT(T),FBLINK
3064         MOV     BLINKS(B),BLNEXT(T)
3065         MOV     T,BLINKS(B)     ;THE BLINKER
3066         MOV     U,BLCURS(T)     ;FOLLOW PAGE PRINTER
3067         CLRB    BLON(T)         ;BLON
3068
3069         POP     T
3070         ASL     C               ;MAKE THE KEYBOARD AND THIS LINE EDITOR POINT AT EACH OTHER.
3071         MOV     U,KBDLE(C)
3072 CHCON3: PUSH    WHOLIN(A)
3073         PUSH    T
3074         MOV     T,TT
3075         MOV     LEBUF(U),T
3076         JSR     PC,CLRING       ;CLEAR THE 11-TO-10 INPUT BUFFER RING.
3077         POP     T
3078         POP     A
3079         MOV     #0,WHMODE(A)
3080         RTS     PC
3081 \f
3082 ;CLEAR OUT THE 10-TO-11 BUFFER WHICH U POINTS AT.
3083
3084 CHCLR:  MOV     DPY10B(U),TT    ;POINTER TO START OF BUFFER
3085         MOV     TT,DPY11B(U)    ;RESET OUR POINTER INTO THE CHANNEL'S BUFFER.
3086         INC     DPY11B(U)       ;MAKE POINT AT 1ST BYTE IN PDP10 ORDER!
3087 CHCLR1: MOV     #-1,(TT)+
3088         CMP     TT,DPYLGL(U)
3089         BLOS    CHCLR1
3090         RTS     PC
3091
3092 ;HERE TO INITIALIZE MOST OF THE WORDS OF A LINE EDITOR BLOCK,
3093 ;AND GET A RING OF KEYBOARD BUFFERS FOR IT.
3094 LECON2: PUSH    T
3095         PUSH    U
3096         MOV     U,TT            ;SET DEFAULTS
3097         ADD     #DPSIZE+DPDATA,TT
3098         MOV     #LEDFLT+DPSIZE+DPDATA,T
3099         MOV     #LELEN-DPSIZE-DPDATA,U
3100         JSR     PC,CALCPY       ;DEFAULT IS FOR FREE VARIABLES
3101         POP     U
3102         MOV     FSP,T           ;FIRST FREE BUFFER
3103         BEQ     LECON3
3104         MOV     LHFS(T),TT      ;NEXT BUFFER
3105         BEQ     LECON3
3106         MOV     LHFS(TT),FSP    ;TAKE THOSE TWO
3107         MOV     T,LHNEXT(TT)
3108         MOV     TT,LHNEXT(T)    ;ALL NICE AND COZY
3109         MOV     T,LEBUF(U)      ;POINTER TO RING
3110         ADD     #LHLEN,T
3111         MOV     T,LECHR(U)      ;BUFFER ACCESS POINTER
3112         POP     T
3113         RTS     PC
3114
3115 LECON3: BPT             ;NO 11-TO-10 BUFFERS AVAILABLE FOR A RING?
3116
3117 ;CLEARS HEADERS OF BUFFER RING, CALLED WITH RING IN T, CHN# IN TT
3118
3119 CLRING: PUSH    T
3120 CLRNG1: CLR     (T)+    .SEE LHFLAG
3121         CLR     (T)+    .SEE LHZERO
3122         TST     (T)+    .SEE LHNEXT
3123         CLR     (T)+    .SEE LHALST
3124         CLR     2(T)    .SEE LHFS
3125         CLR     4(T)    .SEE LHQUED
3126         MOV     TT,(T)  .SEE LHCHN
3127         TST     -(T)    .SEE LHALST
3128         MOV     -(T),T  ;.SEE LHNEXT COMMENT THIS OUT DUE TO PALX BRAIN DAMAGE
3129         CMP     (SP),T
3130         BNE     CLRNG1
3131         POP     T
3132         RTS     PC
3133
3134 ;HERE TO COPY A BLOCK OF CORE
3135 :        T SOURCE
3136 ;       TT DESTINATION
3137 ;        U BYTE COUNT (ONLY EVEN NUMBERS WILL WORK)
3138
3139 CALCPY: INC     U               ;MAKE A WORD COUNT
3140         ASR     U
3141 CALCP1: MOV     (T)+,(TT)+
3142         DEC     U
3143         BGT     CALCP1
3144         RTS     PC
3145 \f
3146 ;HERE TO RETURN DPY CHANNEL.  T HAS CHANNEL NUMBER.
3147
3148 CHRETN: TST     T               ;DON'T RETURN CHANNEL 0.
3149         BEQ     CHRET0
3150         DECB    CHNUSE(T)       ;MARK THE CHANNEL AS NOT IN USE
3151         BGE     .+4
3152          BPT
3153         INC     ITSFDP          ;AND INCLUDE IT IN THE COUNT OF FREE CHANNELS.
3154         BR      CHRET1
3155
3156 CHRET0: MOV     #377,CHNCLS     ;IF FREEING THE FREE TV DISPLAY, DON'T REALLY FREE IT
3157 CHRET1: ASL     T
3158         ASL     T
3159         MOV     DPYCHN(T),U
3160         JSR     PC,CHCLR        ;RESET THE 10-TO-11 BUFFER AND POINTERS.
3161         TST     T
3162         BEQ     CHRETX          ;DON'T RETURN CHANNEL 0 (FREE CONSOLE DISPLAY)
3163         MOV     #-1,DPYKBD(T)   ;TELL THE PDP-10 WE'RE LOGGING OUT
3164         MOV     WHOLIN(T),TT
3165         MOV     #-1,WHMODE(TT)  ;TURN OFF WHO-LINE GENERATION ON THIS CHANNEL.
3166
3167 ;HERE TO FREE THE 11-TO-10 INPUT BUFFERS, AND MARK THE KEYBOARD AND CHANNEL
3168 ;AS DISCONNECTED.  ALSO FREE THE BLINKERS.
3169 LERETN: CLR     LERPT(U)
3170         MOV     LEBUF(U),T      ;RETURN BUFERS IN RING
3171         BEQ     LERT2A          ;BUFFERS TO RETURN?
3172         PUSH    T
3173 LERET1: MOV     LHNEXT(T),LHFS(T)
3174         CMP     LHFS(T),(SP)
3175         BEQ     LERET2
3176         MOV     LHFS(T),T
3177         BR      LERET1
3178 LERET2: MOV     FSP,LHFS(T)     ;CUT RING, PATCH ON TO FREE LIST
3179         POP     FSP
3180         CLR     LEBUF(U)        ;MARK AS FREE
3181 LERT2A: MOV     LEKBD(U),T
3182         BLT     LERT2B          ;A KEYBOARD?
3183         ASL     T               ;BYTES
3184         CLR     KBDLE(T)
3185         ASR     T
3186         MOVB    KBDVSW(T),T     ;VSW THE OUTPUT
3187         BLT     LERT2B
3188         MOV     DPYFRE,TT       ;MESSAGE DPY
3189         ASL     TT              ;BYTES
3190         MOV     DPYVSW(TT),TT
3191         JSR     PC,VSWIT        ;GIVE HIM THE CONSOLE FREE MESSAGE
3192 LERT2B: MOVB    LECREG(U),T     ;RETURN ALL THE BLINKERS
3193         BLT     LERET5          ;A DPY?
3194         MOVB    #-1,LECREG(U)   ;INVALIDATE DPY #
3195         ASL     T
3196         TST     BELCNT(T)       ;ANY BELLS PENDING?
3197         BMI     LERET6
3198         CLR     BELCNT(T)       ;THE NEXT FLASH WILL BE THE LAST
3199 LERET6: MOV     BLINKS(T),TT    ;RETURN THIS DISPLAY'S BLINKERS TO FREE LIST.
3200         BEQ     LERET5
3201 LERET3: TST     BLNEXT(TT)
3202         BEQ     LERET4
3203         MOV     BLNEXT(TT),TT
3204         BR      LERET3
3205 LERET4: MOV     FBLINK,BLNEXT(TT)
3206         MOV     BLINKS(T),FBLINK
3207         CLR     BLINKS(T)
3208 LERET5: MOV     #-1,LEKBD(U)
3209 CLRUJ:  CLR     U               ;SEARCH FAILED
3210 CHRETX: RTS     PC
3211 \f
3212 .SBTTL VIDEO AND AUDIO SWITCH ROUTINES
3213
3214 ;VIDEO SWITCH TABLES (ONE INPUT CAN DRIVE MANY OUTPUTS)
3215
3216 ;THE SWITCH IS COMPOSED OF SEVERAL IDENTICAL SECTIONS, THE CORRESPONDING
3217 ;OUTPUTS OF EACH SECTION ARE MIXED TOGETHER TO FORM THE FINAL VIDEO THAT IS
3218 ;SENT TO THE MONITOR.  INPUT 0 OF EACH SECTION OF THE SWITCH IS THE NULL INPUT,
3219 ;HENCE WE USUALLY USE THAT INPUT WHEN USING A MONITOR AS A DISPLAY.
3220
3221 ;VSWTAB, INDEXED BY OUTPUT NUMBER, IS A BYTE GIVING THE NONNULL INPUT FEEDING THAT OUTPUT.
3222 ;THE INPUT NUMBER IS RELATIVE TO THE WHOLE SWITCH, NOT JUST THE SECTION.
3223 ;0 MEANS THAT ONLY NULL INPUTS ARE FEEDING AN OUTPUT.
3224
3225 VSWTAB: .BLKB   MAXVSO
3226
3227
3228 ;HERE TO SWITCH VIDEO SWITCH (OUTPUT IN T, INPUT IN TT).
3229 ;CLOBBERS NO ACS.
3230
3231 VSWIT:  PUSH    TT
3232         JSR     PC,VSWNUL               ;FLUSH ALL OTHER INPUTS TO THAT OUTPUT.
3233         POP     TT
3234 VSWIT1: PUSH    B
3235         PUSH    C
3236         MOVB    TT,VSWTAB(T)            ;UPDATE OUR OWN INTERNAL TABLE.
3237         MOV     TT,MQ
3238         MOV     #MAXVSI,DIV             ;DIVIDE TO TURN INPUT NUMBER
3239         MOV     MQ,C                    ;INTO SECTION NUMBER
3240         MOV     AC,B                    ;AND NUMBER WITHIN SECTION.
3241         TST     A                       ;CLEAR C BIT
3242         ROR     C
3243         ROR     C
3244         ROR     C
3245         ROR     C                       ;GET SECTION NUMBER INTO TOP THREE BITS OF WORD.
3246         BIS     C,B
3247         MOV     T,C
3248         SWAB    C
3249         BIS     C,B                     ;CREATE ARGUMENT FOR VIDEO SWITCH.
3250         MOV     B,VSW                   ;SWITCH IT!
3251         POP     C
3252         POP     B
3253         RTS     PC
3254
3255 ;HERE SEND NULL VIDEO TO OUTPUT SPECIFIED IN T
3256 ;CLOBBERS TT
3257 VSWNUL: PUSH    #VSWSEC         ;# SECTIONS
3258         CLR     TT              ;INPUT 0 IN SECTION 0.
3259 VSWN1:  JSR     PC,VSWIT1       ;SWITCH IT
3260         ADD     #MAXVSI,TT      ;ADVANCE TO INPUT 0 IN NEXT SECTION
3261         DEC     (SP)
3262         BGT     VSWN1           ;MORE
3263         TST     (SP)+           ;CLEANSE STACK
3264         CLRB    VSWTAB(T)       ;MAKE SURE INTERNAL TABLE SAYS NOTHING FEEDING THIS OUTPUT.
3265         RTS     PC
3266 \f
3267 ;AUDEO SWITCH TABLES (ONE INPUT CAN DRIVE MANY OUTPUTS)
3268
3269 ;INPUT 0 IS SILENCE.  RIGHT NOW, THAT IS THE NORMAL SETTING FOR ANY OUTPUT.
3270
3271 ;ASWTAB, INDEXED BY OUTPUT NUMBER, IS A BYTE GIVING THE INPUT FEEDING THAT OUTPUT.
3272 ASWTAB: .BLKB   MAXASO
3273
3274
3275 ;GIVEN ASW OUTPUT IN T AND INPUT IN TT, CONNECT THEM IF THEY ARE LEGAL.
3276 ;ON RETURN, BLO JUMPS IF THEY WERE LEGAL.
3277 ASWCMD: CMP     T,#MAXASO
3278         BHIS    ASWITX
3279         CMP     TT,#MAXASI
3280         BHIS    ASWITX
3281
3282 ;HERE TO SWITCH AUDEO SWITCH (OUTPUT IN T, INPUT IN TT).
3283 ;CLOBBERS NO ACS.
3284
3285 ASWIT:  PUSH    C
3286         MOV     T,C
3287         SWAB    C
3288         BIS     TT,C                    ;CONSTRUCT OUTPUT,,INPUT AND GIVE TO SWITCH AS COMMAND.
3289         PUSH    B
3290         MOV     C,B                     ;NOW COMPLEMENT SOME OF C (WHAT'S IN ASWXOR).
3291         BIC     #<-1>#ASWXOR,B
3292         BIS     #ASWXOR,C
3293         BIC     B,C
3294         POP     B
3295         MOV     C,ASW
3296         MOVB    TT,ASWTAB(T)            ;UPDATE OUR OWN INTERNAL TABLE.
3297         POP     C
3298 ASWITX: RTS     PC
3299
3300 ;RESET THE AUDEO SWITCH (ALL OUTPUTS RECEIVING SILENCE).
3301 REASW:  MOV     #MAXASO-1,T
3302         CLR     TT
3303 REASW1: JSR     PC,ASWIT
3304         DEC     T
3305         BGE     REASW1
3306         RTS     PC\f
3307 \f
3308 .SBTTL CHARACTER GENERATOR ROUTINES
3309
3310 ;CLEARS CHARACTER AT LINE EDITOR CURSOR
3311
3312 CLRCHR: JSR     U,ACSAV
3313         MOVB    #CANDC,CALU
3314 CLCHR1: MOV     #BLOB,T                 ;BLOB MASKS ENTIRE CHARACTER
3315 CLCHR2: MOV     LEPHS(U),C
3316         MOV     LECC(U),TT
3317         JSR     PC,GENCH1
3318         MOVB    #CIOR,CALU              ;RESTORE FOR DPYDP1 LOOP
3319         BR      ACRES
3320
3321 ;BLINK CHARACTER AT CURSOR
3322
3323 XORCHR: JSR     U,ACSAV
3324         MOVB    #CXOR,CALU
3325         MOV     #BLOB,T
3326         BR      CLCHR2
3327 \f
3328 ;GENERATE A CHARACTER
3329 ;CALL WITH CHARACTER IN A AND PAGE PRINTER IN U
3330 ;PRESERVES ALL ACS
3331
3332 GENCHR: JSR     U,ACSAV
3333         MOV     LEPHS(U),C
3334         MOV     LECC(U),TT
3335         MOVB    #CIOR,CALU
3336         ASL     A               ;MAKE IT A BYTE OFFSET
3337         MOV     CTAB(A),T       ;POINTS AT FONT DESCRIPTION
3338         JSR     PC,GENCH1
3339 ACRES:  POP     A
3340         POP     B
3341         POP     C
3342         POP     T
3343         POP     TT
3344         POP     U
3345         RTS     PC
3346
3347 ;The lowest level character generator
3348 ;Initial AC settings
3349
3350 ;A      LSH address of EAE shift counter
3351 ;B      MQ address of EAE regiseter
3352 ;C      number of desired shifts
3353 ;T      points into font description
3354 ;TT     points into display memory
3355 ;U      number of bytes per line of display memory
3356
3357 ;initial memory settings
3358
3359 ;AC     0, EAE register
3360 ;CREG   CIOR,,console number, console register
3361 ;;NOTE THAT MQ=AC+2
3362 ;THIS ROUTINE CLOBBERS -ALL- ACS
3363
3364 GENCH1: MOV     #LSH,A
3365         TST     C
3366         BLT     OVRLAP
3367 EZCASE: MOV     #BYTPL,U
3368         MOV     #AC,B
3369         CLR     (B)+            ;CLEAR AC
3370
3371 .REPT CHRHT
3372 .NLIST
3373         MOVB    (T)+,(B)        ;5.2    ;CHARACTER RASTER LINE INTO MQ
3374         MOV     C,(A)           ;3.7    ;INITIATE SHIFT
3375         MOV     (B),(TT)        ;5.2    ;OUT OF MQ INTO DISPLAY MEMORY
3376         ADD     U,TT            ;2.3    ;GET TO NEXT RASTER LINE
3377 ;                       TOTAL   16.4 MICRO-SECONDS
3378 .LIST
3379 .ENDR
3380         RTS     PC
3381
3382 ;initial settings same as EZCASE with one exception
3383 ;U      <number of bytes per line of display memory>-2
3384
3385 OVRLAP: MOV     #BYTPL-2,U
3386         MOV     #MQ+2,B
3387
3388 .REPT CHRHT
3389 .NLIST
3390         CLR     -(B)            ;3.7    ;CLEAR MQ
3391         CLRB    -(B)            ;2.3    ;CLEAR HIGH ORDER OF AC
3392         MOVB    (T)+,-(B)       ;5.2    ;LOAD AC WITH CHARACTER LINE
3393         MOV     C,(A)           ;3.7    ;INIATE SHIFT
3394         MOV     (B)+,(TT)+      ;5.2    ;AC TO DISPLAY MEMORY
3395         MOV     (B)+,(TT)       ;5.2    ;MQ TO DISPLAY MEMORY
3396         ADD     U,TT            ;2.3    ;SET TO NEXT RASTER LINE
3397                         ;TOTAL  27.6 MICRO-SECONDS
3398 .LIST
3399 .ENDR
3400 RTSPC:  RTS     PC
3401 \f
3402 ;SOME LOW LEVEL GOODIES
3403
3404 ;CLEARS ONE RASTER LINE
3405
3406 CLRRST: MOVB    #CSET,CALU
3407 CLRRS1: .REPT WRDPL
3408         .NLIST
3409         CLR     (T)+
3410         .LIST
3411         .ENDR
3412         RTS     PC
3413
3414 ;CLEARS ONE CHARACTER LINE
3415
3416 CLRCHL: MOV     #LINHT-1,TT
3417 CLRCL0: JSR     PC,CLRRST
3418 CLRCH1: JSR     PC,CLRRS1
3419         DEC     TT
3420         BGT     CLRCH1
3421         RTS     PC
3422
3423 ;CLEAR ENTIRE SCREEN
3424
3425 CLRSCR: MOV     #TVLO,T
3426         JSR     PC,CLRRST
3427         MOV     #NLINS-1,TT
3428 CLRSC1: JSR     PC,CLRRS1
3429         DEC     TT
3430         BGT     CLRSC1
3431         RTS     PC
3432
3433 ;COPIES ONE RASTER LINE
3434
3435 CPYRST: MOVB    #CSET,CALU
3436 CPYRS1: .REPT WRDPL
3437         .NLIST
3438         MOV     (T)+,(TT)+
3439         .LIST
3440         .ENDR
3441         RTS     PC
3442
3443 ;COPIES ONE CHARACTER LINE
3444
3445 CPYCHL: PUSH    A
3446         MOV     #LINHT-1,A
3447         JSR     PC,CPYRST
3448 CPYCH1: JSR     PC,CPYRS1
3449         DEC     A
3450         BGT     CPYCH1
3451         POP     A
3452         RTS     PC
3453 \f
3454 .SBTTL KEYBOARD TABLES
3455
3456 .MACRO KBDKEY N,PLAIN,SH,SL,SLSH,TOP
3457 .XLIST
3458 .=XTAB+N
3459 .BYTE PLAIN
3460 .=XTAB+N+100
3461 .BYTE SH
3462 .=XTAB+N+200
3463 .BYTE SL
3464 .=XTAB+N+300
3465 .BYTE SLSH
3466 .=XTAB+N+400
3467 .BYTE TOP
3468 .LIST
3469 .ENDM
3470
3471 ;WHAT FOLLOWS IS THE GRAND CHARACTER CONVERSION TABLE
3472
3473 ;AN 8 BIT QUANTITY IS USED TO INDEX INTO THE XTAB
3474 ;       0-5     KEYBOARD KEY NUMBER
3475 ;         6     SHIFT
3476 ;         7     SHIFT LOCK
3477 ;         8     TOP (6 AND 7 GUARANTEED TO BE ZERO)
3478
3479 ;IF THE BYTE PICKED IS NEGATIVE, YOU HAVE STRUCK A KEY THAT DOES NOT
3480 ;HAVE AN ASCII CODE.  THESE CODES ARE ASSIGNED AS FOLLOWS:
3481
3482 NASCTB: NONAS1  ;        0      ILLEGAL
3483         ESCAPE  ;       -1      ESCAPE
3484         BRKCLR  ;       -2      BREAK
3485         BRKCLR  ;       -3      CLEAR
3486         PLSMNS  ;       -4      PLUS-MINUS
3487         CRCPLS  ;       -5      CIRCLE-PLUS
3488         DELTA   ;       -6      DELTA
3489         GAMMA   ;       -7      GAMMA
3490         BRKCLR  ;       -10     HELP
3491         RTSPC   ;       -11     BACK -- not really used
3492         RTSPC   ;       -12     NEXT -- not really used
3493         CALL    ;       -13     CALL
3494 MAXNAS==<<.-NASCTB>/2>-1        ;MAXIMUM # NON-ASCII CHARACTERS
3495
3496 .EVEN
3497 \f
3498 ;       CHAR    NORMAL  SHIFT   LOCK    SHIFT&LOCK      TOP
3499
3500 XTAB:
3501 KBDKEY  0,      -2,     -2,     -2,     -2,             -2      ;BREAK
3502 KBDKEY  1,      -1,     -1,     -1,     -1,             -1      ;ESCAPE
3503 KBDKEY  2,      '1,     '!,     '1,     '!,             '!
3504 KBDKEY  3,      '2,     '",     '2,     '",             '"
3505 KBDKEY  4,      '3,     '#,     '3,     '#,             '#
3506 KBDKEY  5,      '4,     '$,     '4,     '$,             '$
3507 KBDKEY  6,      '5,     '%,     '5,     '%,             '%
3508 KBDKEY  7,      '6,     '&,     '6,     '&,             '&
3509 KBDKEY  10,     '7,     '',     '7,     '',             ''
3510 KBDKEY  11,     '8,     '(,     '8,     '(,             '(
3511 KBDKEY  12,     '9,     '),     '9,     '),             ')
3512 KBDKEY  13,     '0,     '_,     '0,     '_,             '_
3513 KBDKEY  14,     '-,     '=,     '-,     '=,             '=
3514 KBDKEY  15,     '@,     '`,     '@,     '`,             '`
3515 KBDKEY  16,     '^,     '~,     '^,     '~,             '~
3516 KBDKEY  17,     10,     10,     10,     10,             10      ;BACK SPACE
3517 KBDKEY  20,     -13,    -13,    -13,    -13,            -13     ;CALL
3518 KBDKEY  21,     -3,     -3,     -3,     -3,             -3      ;CLEAR
3519 KBDKEY  22,     11,     11,     11,     11,             11      ;TAB
3520 KBDKEY  23,     33,     33,     33,     33,             33      ;ALT-MODE
3521 KBDKEY  24,     'q,     'Q,     'Q,     'Q,             4,      ;and
3522 KBDKEY  25,     'w,     'W,     'W,     'W,             37      ;or
3523 KBDKEY  26,     'e,     'E,     'E,     'E,             22      ;intersection
3524 KBDKEY  27,     'r,     'R,     'R,     'R,             23      ;union
3525 KBDKEY  30,     't,     'T,     'T,     'T,             20      ;subset
3526 KBDKEY  31,     'y,     'Y,     'Y,     'Y,             21      ;superset
3527 KBDKEY  32,     'u,     'U,     'U,     'U,             5       ;not
3528 KBDKEY  33,     'i,     'I,     'I,     'I,             26      ;xor
3529 KBDKEY  34,     'o,     'O,     'O,     'O,             1       ;down arrow
3530 KBDKEY  35,     'p,     'P,     'P,     'P,             13      ;up arrow
3531 KBDKEY  36,     '[,     '{,     '[,     '{,             '{
3532 KBDKEY  37,     '],     '},     '],     '},             '}
3533 KBDKEY  40,     '\,     '|,     '\,     '|,             '|
3534 KBDKEY  41,     '/,     16,     '/,     16,             16      ;infinity
3535 KBDKEY  42,     -4,     -6,     -4,     -6,             -6      ;plus-minus, delta
3536 KBDKEY  43,     -5,     -7,     -5,     -7,             -7      ;circle-plus, gamma
3537 KBDKEY  44,     14,     14,     14,     14,             14      ;form
3538 KBDKEY  45,     13,     13,     13,     13,             13      ;vertical tab
3539 KBDKEY  46,     177,    177,    177,    177,            177     ;rubout
3540 KBDKEY  47,     'a,     'A,     'A,     'A,             34      ;.leq.
3541 KBDKEY  50,     's,     'S,     'S,     'S,             35      ;.geq
3542 KBDKEY  51,     'd,     'D,     'D,     'D,             36      ;equivalence
3543 KBDKEY  52,     'f,     'F,     'F,     'F,             17      ;delta (partial derivative)
3544 KBDKEY  53,     'g,     'G,     'G,     'G,             32      ;not equals
3545 KBDKEY  54,     'h,     'H,     'H,     'H,             -10     ;HELP!!!!!
3546 KBDKEY  55,     'j,     'J,     'J,     'J,             30      ;back arrow
3547 KBDKEY  56,     'k,     'K,     'K,     'K,             31      ;forward arrow
3548 KBDKEY  57,     'l,     'L,     'L,     'L,             27      ;both ways arrow
3549 KBDKEY  60,<';>,        '+,<';>,        '+,             '+
3550 KBDKEY  61,     ':,     '*,     ':,     '*,             '*
3551 KBDKEY  62,     15,     15,     15,     15,             15      ;carriage return
3552 KBDKEY  63,     12,     12,     12,     12,             12      ;line feed
3553 KBDKEY  64,     37,     37,     37,     37,             37      ;next, back gives ^_
3554 ;KBDKEY 64,     -12,    -11,    -12,    -11,            -11     ;next, back
3555 KBDKEY  65,     'z,     'Z,     'Z,     'Z,             2       ;alpha
3556 KBDKEY  66,     'x,     'X,     'X,     'X,             3       ;beta
3557 KBDKEY  67,     'c,     'C,     'C,     'C,             6       ;epsilon
3558 KBDKEY  70,     'v,     'V,     'V,     'V,             10      ;lambda
3559 KBDKEY  71,     'b,     'B,     'B,     'B,             7       ;pi
3560 KBDKEY  72,     'n,     'N,     'N,     'N,             24      ;for all
3561 KBDKEY  73,     'm,     'M,     'M,     'M,             25      ;there exists
3562 KBDKEY  74,<',>,        '<,<',>,        '<,             '<
3563 KBDKEY  75,     '.,     '>,     '.,     '>,             '>
3564 KBDKEY  76,     '/,     '?,     '/,     '?,             '?
3565 KBDKEY  77,     40,     40,     40,     40,             40      ;space
3566 \f
3567 .SBTTL FONT MACROS AND DEFINITION
3568
3569 .IIF E FONTSW,CTAB==0
3570 .IF NE FONTSW
3571 FNTORG==.
3572         .MACRO CTBENT A
3573         .XCREF ...'A
3574         ...'A
3575         .ENDM
3576
3577 CTAB:   .REPT 200
3578         .NLIST
3579         CTBENT \.RPCNT
3580         .LIST
3581         .ENDR
3582         ...200                          ;THIS CHAR IS A BLOB FOR CURSORS.
3583
3584 .MACRO  FONT A
3585 .NLIST
3586 ....==0
3587 ...==1_GRIDWD
3588
3589 .IRPC   CHR,A
3590 ...==..._<-1>
3591 .IF NB  CHR
3592 ....==....!...
3593 .ENDC
3594 .ENDM
3595
3596 .IF NE  ...-1
3597 ERROR   \CURCHR
3598 .ENDC
3599
3600 ;...FOO==%XLIST
3601 ;.REPT ...FOO
3602 ;.LIST
3603 ;.ENDR
3604 .BYTE   ....
3605 ;.XLIST
3606 ;%XLIST=...FOO
3607 .LIST
3608 .ENDM
3609
3610 .MACRO CDEF A
3611 .NLIST
3612 CURCHR==''A
3613 CDEF1   \CURCHR
3614 .LIST
3615 .ENDM
3616
3617 .MACRO  CDEF1 A
3618 .NLIST
3619 .XCREF ...'A
3620 CURCHR==A
3621 ;...FOO==%XLIST
3622 ;.REPT ...FOO
3623 ;.LIST
3624 ;.ENDR
3625 ...'A==.
3626 ;.XLIST
3627 ;%XLIST=...FOO
3628
3629 .LIST
3630 .ENDM
3631
3632 .MACRO  ERROR NUM
3633 .IF1
3634 .ERROR  ;FONT LOSSAGE NUM
3635 .ENDC
3636 .ENDM
3637 .ENDC
3638 .XLIST
3639 .IF NE FONTSW
3640 .IF NE FONTMS
3641 .XCREF CURCHR,FONT,CDEF1,CDEF
3642 \f
3643 CDEF1 0
3644 FONT <     >
3645 FONT <     >
3646 FONT <     >
3647 FONT < *** >
3648 FONT < *** >
3649 FONT < *** >
3650 FONT <     >
3651 FONT <     >
3652 FONT <     >
3653 FONT <     >
3654
3655 CDEF1 1
3656 FONT <     >
3657 FONT <  *  >
3658 FONT <  *  >
3659 FONT <  *  >
3660 FONT <  *  >
3661 FONT <* * *>
3662 FONT < *** >
3663 FONT <  *  >
3664 FONT <     >
3665 FONT <     >
3666
3667 CDEF1 2
3668 FONT <     >
3669 FONT <     >
3670 FONT <     >
3671 FONT < ** *>
3672 FONT <*  * >
3673 FONT <*  * >
3674 FONT <*  * >
3675 FONT < ** *>
3676 FONT <     >
3677 FONT <     >
3678
3679 CDEF1 3
3680 FONT <     >
3681 FONT <     >
3682 FONT <     >
3683 FONT < *** >
3684 FONT <*   *>
3685 FONT <**** >
3686 FONT <*   *>
3687 FONT <**** >
3688 FONT <*    >
3689 FONT <*    >
3690
3691 CDEF1 4
3692 FONT <     >
3693 FONT <     >
3694 FONT <     >
3695 FONT <  *  >
3696 FONT < * * >
3697 FONT <*   *>
3698 FONT <     >
3699 FONT <     >
3700 FONT <     >
3701 FONT <     >
3702 \f
3703 CDEF1 5
3704 FONT <     >
3705 FONT <     >
3706 FONT <     >
3707 FONT <     >
3708 FONT <*****>
3709 FONT <    *>
3710 FONT <    *>
3711 FONT <     >
3712 FONT <     >
3713 FONT <     >
3714
3715 CDEF1 6
3716 FONT <     >
3717 FONT <     >
3718 FONT <     >
3719 FONT <  ** >
3720 FONT < *   >
3721 FONT < *** >
3722 FONT < *   >
3723 FONT <  ** >
3724 FONT <     >
3725 FONT <     >
3726
3727 CDEF1 7
3728 FONT <     >
3729 FONT <     >
3730 FONT <     >
3731 FONT <*****>
3732 FONT < * * >
3733 FONT < * * >
3734 FONT < * * >
3735 FONT < * * >
3736 FONT <     >
3737 FONT <     >
3738
3739 CDEF1 10
3740 FONT <     >
3741 FONT <     >
3742 FONT <*    >
3743 FONT <*    >
3744 FONT < *   >
3745 FONT <  *  >
3746 FONT < * * >
3747 FONT <*   *>
3748 FONT <     >
3749 FONT <     >
3750
3751 CDEF1 11
3752 FONT <     >
3753 FONT <*   *>
3754 FONT < * * >
3755 FONT <  *  >
3756 FONT < * * >
3757 FONT <*   *>
3758 FONT <*   *>
3759 FONT < *** >
3760 FONT <     >
3761 FONT <     >
3762 \f
3763 CDEF1 12
3764 FONT <     >
3765 FONT < *** >
3766 FONT <    *>
3767 FONT <   * >
3768 FONT <  *  >
3769 FONT < * * >
3770 FONT <*   *>
3771 FONT < *** >
3772 FONT <     >
3773 FONT <     >
3774
3775 CDEF1 13
3776 FONT <     >
3777 FONT <  *  >
3778 FONT < *** >
3779 FONT <* * *>
3780 FONT <  *  >
3781 FONT <  *  >
3782 FONT <  *  >
3783 FONT <  *  >
3784 FONT <     >
3785 FONT <     >
3786
3787 CDEF1 14
3788 FONT <     >
3789 FONT <  *  >
3790 FONT <  *  >
3791 FONT <*****>
3792 FONT <  *  >
3793 FONT <  *  >
3794 FONT <*****>
3795 FONT <     >
3796 FONT <     >
3797 FONT <     >
3798
3799 CDEF1 15
3800 FONT <     >
3801 FONT <     >
3802 FONT < *** >
3803 FONT <* * *>
3804 FONT <*****>
3805 FONT <* * *>
3806 FONT < *** >
3807 FONT <     >
3808 FONT <     >
3809 FONT <     >
3810
3811 CDEF1 16
3812 FONT <     >
3813 FONT <     >
3814 FONT <     >
3815 FONT < * * >
3816 FONT <* * *>
3817 FONT <* * *>
3818 FONT < * * >
3819 FONT <     >
3820 FONT <     >
3821 FONT <     >
3822 \f
3823 CDEF1 17
3824 FONT <     >
3825 FONT < **  >
3826 FONT <   * >
3827 FONT <    *>
3828 FONT < ****>
3829 FONT <*   *>
3830 FONT <*   *>
3831 FONT < *** >
3832 FONT <     >
3833 FONT <     >
3834
3835 CDEF1 20
3836 FONT <     >
3837 FONT <     >
3838 FONT < ****>
3839 FONT <*    >
3840 FONT <*    >
3841 FONT <*    >
3842 FONT < ****>
3843 FONT <     >
3844 FONT <     >
3845 FONT <     >
3846
3847 CDEF1 21
3848 FONT <     >
3849 FONT <     >
3850 FONT <**** >
3851 FONT <    *>
3852 FONT <    *>
3853 FONT <    *>
3854 FONT <**** >
3855 FONT <     >
3856 FONT <     >
3857 FONT <     >
3858
3859 CDEF1 22
3860 FONT <     >
3861 FONT <     >
3862 FONT < *** >
3863 FONT <*   *>
3864 FONT <*   *>
3865 FONT <*   *>
3866 FONT <     >
3867 FONT <     >
3868 FONT <     >
3869 FONT <     >
3870
3871 CDEF1 23
3872 FONT <     >
3873 FONT <     >
3874 FONT <*   *>
3875 FONT <*   *>
3876 FONT <*   *>
3877 FONT < *** >
3878 FONT <     >
3879 FONT <     >
3880 FONT <     >
3881 FONT <     >
3882 \f
3883 CDEF1 24
3884 FONT <     >
3885 FONT <*   *>
3886 FONT <*   *>
3887 FONT <*****>
3888 FONT <*   *>
3889 FONT < * * >
3890 FONT < * * >
3891 FONT <  *  >
3892 FONT <     >
3893 FONT <     >
3894
3895 CDEF1 25
3896 FONT <     >
3897 FONT <*****>
3898 FONT <    *>
3899 FONT <    *>
3900 FONT < ****>
3901 FONT <    *>
3902 FONT <    *>
3903 FONT <*****>
3904 FONT <     >
3905 FONT <     >
3906
3907 CDEF1 26
3908 FONT <     >
3909 FONT <     >
3910 FONT < *** >
3911 FONT <** **>
3912 FONT <* * *>
3913 FONT <** **>
3914 FONT < *** >
3915 FONT <     >
3916 FONT <     >
3917 FONT <     >
3918
3919 CDEF1 27
3920 FONT <     >
3921 FONT <  *  >
3922 FONT <   * >
3923 FONT <*****>
3924 FONT <   * >
3925 FONT <  *  >
3926 FONT < *   >
3927 FONT <*****>
3928 FONT < *   >
3929 FONT <  *  >
3930
3931 CDEF1 30
3932 FONT <     >
3933 FONT <     >
3934 FONT <  *  >
3935 FONT < *   >
3936 FONT <*****>
3937 FONT < *   >
3938 FONT <  *  >
3939 FONT <     >
3940 FONT <     >
3941 FONT <     >
3942 \f
3943 CDEF1 31
3944 FONT <     >
3945 FONT <     >
3946 FONT <  *  >
3947 FONT <   * >
3948 FONT <*****>
3949 FONT <   * >
3950 FONT <  *  >
3951 FONT <     >
3952 FONT <     >
3953 FONT <     >
3954
3955 CDEF1 32
3956 FONT <     >
3957 FONT <    *>
3958 FONT <   * >
3959 FONT <*****>
3960 FONT <  *  >
3961 FONT <*****>
3962 FONT < *   >
3963 FONT <*    >
3964 FONT <     >
3965 FONT <     >
3966
3967 CDEF1 33
3968 FONT <     >
3969 FONT <  *  >
3970 FONT <  *  >
3971 FONT < * * >
3972 FONT <*   *>
3973 FONT < * * >
3974 FONT <  *  >
3975 FONT <  *  >
3976 FONT <     >
3977 FONT <     >
3978
3979 CDEF1 34
3980 FONT <     >
3981 FONT <   * >
3982 FONT <  *  >
3983 FONT < *   >
3984 FONT <  *  >
3985 FONT <   * >
3986 FONT <     >
3987 FONT < *** >
3988 FONT <     >
3989 FONT <     >
3990
3991 CDEF1 35
3992 FONT <     >
3993 FONT < *   >
3994 FONT <  *  >
3995 FONT <   * >
3996 FONT <  *  >
3997 FONT < *   >
3998 FONT <     >
3999 FONT < *** >
4000 FONT <     >
4001 FONT <     >
4002 \f
4003 CDEF1 36
4004 FONT <     >
4005 FONT <     >
4006 FONT <*****>
4007 FONT <     >
4008 FONT <*****>
4009 FONT <     >
4010 FONT <*****>
4011 FONT <     >
4012 FONT <     >
4013 FONT <     >
4014
4015 CDEF1 37
4016 FONT <     >
4017 FONT <     >
4018 FONT <     >
4019 FONT <*   *>
4020 FONT < * * >
4021 FONT <  *  >
4022 FONT <     >
4023 FONT <     >
4024 FONT <     >
4025 FONT <     >
4026
4027 CDEF < >
4028 FONT <     >
4029 FONT <     >
4030 FONT <     >
4031 FONT <     >
4032 FONT <     >
4033 FONT <     >
4034 FONT <     >
4035 FONT <     >
4036 FONT <     >
4037 FONT <     >
4038
4039 CDEF <!>
4040 FONT <     >
4041 FONT <  *  >
4042 FONT <  *  >
4043 FONT <  *  >
4044 FONT <  *  >
4045 FONT <  *  >
4046 FONT <     >
4047 FONT <  *  >
4048 FONT <     >
4049 FONT <     >
4050
4051 CDEF <">
4052 FONT < * * >
4053 FONT < * * >
4054 FONT < * * >
4055 FONT <     >
4056 FONT <     >
4057 FONT <     >
4058 FONT <     >
4059 FONT <     >
4060 FONT <     >
4061 FONT <     >
4062 \f
4063 CDEF <#>
4064 FONT <     >
4065 FONT <     >
4066 FONT < * * >
4067 FONT <*****>
4068 FONT < * * >
4069 FONT < * * >
4070 FONT <*****>
4071 FONT < * * >
4072 FONT <     >
4073 FONT <     >
4074
4075 CDEF <$>
4076 FONT <  *  >
4077 FONT < *** >
4078 FONT <* * *>
4079 FONT <* *  >
4080 FONT < *** >
4081 FONT <  * *>
4082 FONT <* * *>
4083 FONT < *** >
4084 FONT <  *  >
4085 FONT <     >
4086
4087 CDEF <%>
4088 FONT <     >
4089 FONT <*****>
4090 FONT <**  *>
4091 FONT <   * >
4092 FONT <  *  >
4093 FONT < *   >
4094 FONT <*  **>
4095 FONT <*  **>
4096 FONT <     >
4097 FONT <     >
4098
4099 CDEF <&>
4100 FONT <     >
4101 FONT < *   >
4102 FONT <* *  >
4103 FONT <* *  >
4104 FONT < *   >
4105 FONT <* * *>
4106 FONT <*  * >
4107 FONT < ** *>
4108 FONT <     >
4109 FONT <     >
4110
4111 CDEF <'>
4112 FONT < **  >
4113 FONT < **  >
4114 FONT <**   >
4115 FONT <     >
4116 FONT <     >
4117 FONT <     >
4118 FONT <     >
4119 FONT <     >
4120 FONT <     >
4121 FONT <     >
4122 \f
4123 CDEF <(>
4124 FONT <     >
4125 FONT <    *>
4126 FONT <   * >
4127 FONT <  *  >
4128 FONT <  *  >
4129 FONT <  *  >
4130 FONT <   * >
4131 FONT <    *>
4132 FONT <     >
4133 FONT <     >
4134
4135 CDEF <)>
4136 FONT <     >
4137 FONT <*    >
4138 FONT < *   >
4139 FONT <  *  >
4140 FONT <  *  >
4141 FONT <  *  >
4142 FONT < *   >
4143 FONT <*    >
4144 FONT <     >
4145 FONT <     >
4146
4147 CDEF <*>
4148 FONT <     >
4149 FONT <  *  >
4150 FONT <* * *>
4151 FONT < *** >
4152 FONT <  *  >
4153 FONT < *** >
4154 FONT <* * *>
4155 FONT <  *  >
4156 FONT <     >
4157 FONT <     >
4158
4159 CDEF <+>
4160 FONT <     >
4161 FONT <     >
4162 FONT <  *  >
4163 FONT <  *  >
4164 FONT <*****>
4165 FONT <  *  >
4166 FONT <  *  >
4167 FONT <     >
4168 FONT <     >
4169 FONT <     >
4170
4171 CDEF <,>
4172 FONT <     >
4173 FONT <     >
4174 FONT <     >
4175 FONT <     >
4176 FONT <     >
4177 FONT <     >
4178 FONT < **  >
4179 FONT < **  >
4180 FONT <**   >
4181 FONT <     >
4182 \f
4183 CDEF <->
4184 FONT <     >
4185 FONT <     >
4186 FONT <     >
4187 FONT <     >
4188 FONT <*****>
4189 FONT <     >
4190 FONT <     >
4191 FONT <     >
4192 FONT <     >
4193 FONT <     >
4194
4195 CDEF <.>
4196 FONT <     >
4197 FONT <     >
4198 FONT <     >
4199 FONT <     >
4200 FONT <     >
4201 FONT <     >
4202 FONT < **  >
4203 FONT < **  >
4204 FONT <     >
4205 FONT <     >
4206
4207 CDEF </>
4208 FONT <     >
4209 FONT <     >
4210 FONT <    *>
4211 FONT <   * >
4212 FONT <  *  >
4213 FONT < *   >
4214 FONT <*    >
4215 FONT <     >
4216 FONT <     >
4217 FONT <     >
4218
4219 CDEF 0
4220 FONT <     >
4221 FONT < *** >
4222 FONT <*   *>
4223 FONT <*  **>
4224 FONT <* * *>
4225 FONT <**  *>
4226 FONT <*   *>
4227 FONT < *** >
4228 FONT <     >
4229 FONT <     >
4230
4231 CDEF 1
4232 FONT <     >
4233 FONT <  *  >
4234 FONT < **  >
4235 FONT <  *  >
4236 FONT <  *  >
4237 FONT <  *  >
4238 FONT <  *  >
4239 FONT < *** >
4240 FONT <     >
4241 FONT <     >
4242 \f
4243 CDEF 2
4244 FONT <     >
4245 FONT < *** >
4246 FONT <*   *>
4247 FONT <    *>
4248 FONT <   * >
4249 FONT <  *  >
4250 FONT < *   >
4251 FONT <*****>
4252 FONT <     >
4253 FONT <     >
4254
4255 CDEF 3
4256 FONT <     >
4257 FONT < *** >
4258 FONT <*   *>
4259 FONT <    *>
4260 FONT <  ** >
4261 FONT <    *>
4262 FONT <*   *>
4263 FONT < *** >
4264 FONT <     >
4265 FONT <     >
4266
4267 CDEF 4
4268 FONT <     >
4269 FONT <   * >
4270 FONT <  ** >
4271 FONT < * * >
4272 FONT <*  * >
4273 FONT <*****>
4274 FONT <   * >
4275 FONT <   * >
4276 FONT <     >
4277 FONT <     >
4278
4279 CDEF 5
4280 FONT <     >
4281 FONT <*****>
4282 FONT <*    >
4283 FONT <**** >
4284 FONT <    *>
4285 FONT <    *>
4286 FONT <*   *>
4287 FONT < *** >
4288 FONT <     >
4289 FONT <     >
4290
4291 CDEF 6
4292 FONT <     >
4293 FONT <  ** >
4294 FONT < *   >
4295 FONT <*    >
4296 FONT <**** >
4297 FONT <*   *>
4298 FONT <*   *>
4299 FONT < *** >
4300 FONT <     >
4301 FONT <     >
4302 \f
4303 CDEF 7
4304 FONT <     >
4305 FONT <*****>
4306 FONT <    *>
4307 FONT <   * >
4308 FONT <   * >
4309 FONT <  *  >
4310 FONT <  *  >
4311 FONT <  *  >
4312 FONT <     >
4313 FONT <     >
4314
4315 CDEF 8
4316 FONT <     >
4317 FONT < *** >
4318 FONT <*   *>
4319 FONT <*   *>
4320 FONT < *** >
4321 FONT <*   *>
4322 FONT <*   *>
4323 FONT < *** >
4324 FONT <     >
4325 FONT <     >
4326
4327 CDEF 9
4328 FONT <     >
4329 FONT < *** >
4330 FONT <*   *>
4331 FONT <*   *>
4332 FONT < ****>
4333 FONT <    *>
4334 FONT <   * >
4335 FONT < **  >
4336 FONT <     >
4337 FONT <     >
4338
4339 CDEF <:>
4340 FONT <     >
4341 FONT <     >
4342 FONT <     >
4343 FONT < **  >
4344 FONT < **  >
4345 FONT <     >
4346 FONT < **  >
4347 FONT < **  >
4348 FONT <     >
4349 FONT <     >
4350
4351 CDEF <;>
4352 FONT <     >
4353 FONT <     >
4354 FONT <     >
4355 FONT < **  >
4356 FONT < **  >
4357 FONT <     >
4358 FONT < **  >
4359 FONT < **  >
4360 FONT <**   >
4361 FONT <     >
4362 \f
4363 CDEF1 74
4364 FONT <     >
4365 FONT <     >
4366 FONT <   * >
4367 FONT <  *  >
4368 FONT < *   >
4369 FONT <  *  >
4370 FONT <   * >
4371 FONT <     >
4372 FONT <     >
4373 FONT <     >
4374
4375 CDEF <=>
4376 FONT <     >
4377 FONT <     >
4378 FONT <     >
4379 FONT <*****>
4380 FONT <     >
4381 FONT <*****>
4382 FONT <     >
4383 FONT <     >
4384 FONT <     >
4385 FONT <     >
4386
4387 CDEF1 76
4388 FONT <     >
4389 FONT <     >
4390 FONT < *   >
4391 FONT <  *  >
4392 FONT <   * >
4393 FONT <  *  >
4394 FONT < *   >
4395 FONT <     >
4396 FONT <     >
4397 FONT <     >
4398
4399 CDEF <?>
4400 FONT <     >
4401 FONT < *** >
4402 FONT <*   *>
4403 FONT <   * >
4404 FONT <  *  >
4405 FONT <  *  >
4406 FONT <     >
4407 FONT <  *  >
4408 FONT <     >
4409 FONT <     >
4410
4411 CDEF <@>
4412 FONT <     >
4413 FONT < *** >
4414 FONT <*   *>
4415 FONT <* ***>
4416 FONT <* * *>
4417 FONT <* ***>
4418 FONT <*    >
4419 FONT < *** >
4420 FONT <     >
4421 FONT <     >
4422 \f
4423 CDEF A
4424 FONT <     >
4425 FONT < *** >
4426 FONT <*   *>
4427 FONT <*   *>
4428 FONT <*****>
4429 FONT <*   *>
4430 FONT <*   *>
4431 FONT <*   *>
4432 FONT <     >
4433 FONT <     >
4434
4435 CDEF B
4436 FONT <     >
4437 FONT <**** >
4438 FONT <*   *>
4439 FONT <*   *>
4440 FONT <**** >
4441 FONT <*   *>
4442 FONT <*   *>
4443 FONT <**** >
4444 FONT <     >
4445 FONT <     >
4446
4447 CDEF C
4448 FONT <     >
4449 FONT < *** >
4450 FONT <*   *>
4451 FONT <*    >
4452 FONT <*    >
4453 FONT <*    >
4454 FONT <*   *>
4455 FONT < *** >
4456 FONT <     >
4457 FONT <     >
4458
4459 CDEF D
4460 FONT <     >
4461 FONT <**** >
4462 FONT < *  *>
4463 FONT < *  *>
4464 FONT < *  *>
4465 FONT < *  *>
4466 FONT < *  *>
4467 FONT <**** >
4468 FONT <     >
4469 FONT <     >
4470
4471 CDEF E
4472 FONT <     >
4473 FONT <*****>
4474 FONT <*    >
4475 FONT <*    >
4476 FONT <**** >
4477 FONT <*    >
4478 FONT <*    >
4479 FONT <*****>
4480 FONT <     >
4481 FONT <     >
4482 \f
4483 CDEF F
4484 FONT <     >
4485 FONT <*****>
4486 FONT <*    >
4487 FONT <*    >
4488 FONT <**** >
4489 FONT <*    >
4490 FONT <*    >
4491 FONT <*    >
4492 FONT <     >
4493 FONT <     >
4494
4495 CDEF G
4496 FONT <     >
4497 FONT < *** >
4498 FONT <*   *>
4499 FONT <*    >
4500 FONT <*    >
4501 FONT <*  **>
4502 FONT <*   *>
4503 FONT < *** >
4504 FONT <     >
4505 FONT <     >
4506
4507 CDEF H
4508 FONT <     >
4509 FONT <*   *>
4510 FONT <*   *>
4511 FONT <*   *>
4512 FONT <*****>
4513 FONT <*   *>
4514 FONT <*   *>
4515 FONT <*   *>
4516 FONT <     >
4517 FONT <     >
4518
4519 CDEF I
4520 FONT <     >
4521 FONT < *** >
4522 FONT <  *  >
4523 FONT <  *  >
4524 FONT <  *  >
4525 FONT <  *  >
4526 FONT <  *  >
4527 FONT < *** >
4528 FONT <     >
4529 FONT <     >
4530
4531 CDEF J
4532 FONT <     >
4533 FONT <    *>
4534 FONT <    *>
4535 FONT <    *>
4536 FONT <    *>
4537 FONT <    *>
4538 FONT <*   *>
4539 FONT < *** >
4540 FONT <     >
4541 FONT <     >
4542 \f
4543 CDEF K
4544 FONT <     >
4545 FONT <*   *>
4546 FONT <*  * >
4547 FONT <* *  >
4548 FONT <**   >
4549 FONT <* *  >
4550 FONT <*  * >
4551 FONT <*   *>
4552 FONT <     >
4553 FONT <     >
4554
4555 CDEF L
4556 FONT <     >
4557 FONT <*    >
4558 FONT <*    >
4559 FONT <*    >
4560 FONT <*    >
4561 FONT <*    >
4562 FONT <*    >
4563 FONT <*****>
4564 FONT <     >
4565 FONT <     >
4566
4567 CDEF M
4568 FONT <     >
4569 FONT <*   *>
4570 FONT <** **>
4571 FONT <* * *>
4572 FONT <*   *>
4573 FONT <*   *>
4574 FONT <*   *>
4575 FONT <*   *>
4576 FONT <     >
4577 FONT <     >
4578
4579 CDEF N
4580 FONT <     >
4581 FONT <*   *>
4582 FONT <*   *>
4583 FONT <**  *>
4584 FONT <* * *>
4585 FONT <*  **>
4586 FONT <*   *>
4587 FONT <*   *>
4588 FONT <     >
4589 FONT <     >
4590
4591 CDEF O
4592 FONT <     >
4593 FONT < *** >
4594 FONT <*   *>
4595 FONT <*   *>
4596 FONT <*   *>
4597 FONT <*   *>
4598 FONT <*   *>
4599 FONT < *** >
4600 FONT <     >
4601 FONT <     >
4602 \f
4603 CDEF P
4604 FONT <     >
4605 FONT <**** >
4606 FONT <*   *>
4607 FONT <*   *>
4608 FONT <**** >
4609 FONT <*    >
4610 FONT <*    >
4611 FONT <*    >
4612 FONT <     >
4613 FONT <     >
4614
4615 CDEF Q
4616 FONT <     >
4617 FONT < *** >
4618 FONT <*   *>
4619 FONT <*   *>
4620 FONT <*   *>
4621 FONT <* * *>
4622 FONT <*  * >
4623 FONT < ** *>
4624 FONT <     >
4625 FONT <     >
4626
4627 CDEF R
4628 FONT <     >
4629 FONT <**** >
4630 FONT <*   *>
4631 FONT <*   *>
4632 FONT <**** >
4633 FONT <* *  >
4634 FONT <*  * >
4635 FONT <*   *>
4636 FONT <     >
4637 FONT <     >
4638
4639 CDEF S
4640 FONT <     >
4641 FONT < *** >
4642 FONT <*   *>
4643 FONT <*    >
4644 FONT < *** >
4645 FONT <    *>
4646 FONT <*   *>
4647 FONT < *** >
4648 FONT <     >
4649 FONT <     >
4650
4651 CDEF T
4652 FONT <     >
4653 FONT <*****>
4654 FONT <  *  >
4655 FONT <  *  >
4656 FONT <  *  >
4657 FONT <  *  >
4658 FONT <  *  >
4659 FONT <  *  >
4660 FONT <     >
4661 FONT <     >
4662 \f
4663 CDEF U
4664 FONT <     >
4665 FONT <*   *>
4666 FONT <*   *>
4667 FONT <*   *>
4668 FONT <*   *>
4669 FONT <*   *>
4670 FONT <*   *>
4671 FONT < *** >
4672 FONT <     >
4673 FONT <     >
4674
4675 CDEF V
4676 FONT <     >
4677 FONT <*   *>
4678 FONT <*   *>
4679 FONT <*   *>
4680 FONT <*   *>
4681 FONT < * * >
4682 FONT < * * >
4683 FONT <  *  >
4684 FONT <     >
4685 FONT <     >
4686
4687 CDEF W
4688 FONT <     >
4689 FONT <*   *>
4690 FONT <*   *>
4691 FONT <*   *>
4692 FONT <*   *>
4693 FONT <* * *>
4694 FONT <** **>
4695 FONT <*   *>
4696 FONT <     >
4697 FONT <     >
4698
4699 CDEF X
4700 FONT <     >
4701 FONT <*   *>
4702 FONT <*   *>
4703 FONT < * * >
4704 FONT <  *  >
4705 FONT < * * >
4706 FONT <*   *>
4707 FONT <*   *>
4708 FONT <     >
4709 FONT <     >
4710
4711 CDEF Y
4712 FONT <     >
4713 FONT <*   *>
4714 FONT <*   *>
4715 FONT < * * >
4716 FONT <  *  >
4717 FONT <  *  >
4718 FONT <  *  >
4719 FONT <  *  >
4720 FONT <     >
4721 FONT <     >
4722 \f
4723 CDEF Z
4724 FONT <     >
4725 FONT <*****>
4726 FONT <    *>
4727 FONT <   * >
4728 FONT <*****>
4729 FONT < *   >
4730 FONT <*    >
4731 FONT <*****>
4732 FONT <     >
4733 FONT <     >
4734
4735 CDEF <[>
4736 FONT <  ***>
4737 FONT <  *  >
4738 FONT <  *  >
4739 FONT <  *  >
4740 FONT <  *  >
4741 FONT <  *  >
4742 FONT <  *  >
4743 FONT <  *  >
4744 FONT <  ***>
4745 FONT <     >
4746
4747 CDEF <\>
4748 FONT <     >
4749 FONT <     >
4750 FONT <*    >
4751 FONT < *   >
4752 FONT <  *  >
4753 FONT <   * >
4754 FONT <    *>
4755 FONT <     >
4756 FONT <     >
4757 FONT <     >
4758
4759 CDEF <]>
4760 FONT <***  >
4761 FONT <  *  >
4762 FONT <  *  >
4763 FONT <  *  >
4764 FONT <  *  >
4765 FONT <  *  >
4766 FONT <  *  >
4767 FONT <  *  >
4768 FONT <***  >
4769 FONT <     >
4770
4771 CDEF <^>
4772 FONT <  *  >
4773 FONT < * * >
4774 FONT <*   *>
4775 FONT <     >
4776 FONT <     >
4777 FONT <     >
4778 FONT <     >
4779 FONT <     >
4780 FONT <     >
4781 FONT <     >
4782 \f
4783 CDEF <_>
4784 FONT <     >
4785 FONT <     >
4786 FONT <     >
4787 FONT <     >
4788 FONT <     >
4789 FONT <     >
4790 FONT <     >
4791 FONT <     >
4792 FONT <     >
4793 FONT <*****>
4794
4795 CDEF <`>
4796 FONT <  ** >
4797 FONT <  ** >
4798 FONT <   **>
4799 FONT <     >
4800 FONT <     >
4801 FONT <     >
4802 FONT <     >
4803 FONT <     >
4804 FONT <     >
4805 FONT <     >
4806
4807 CDEF a
4808 FONT <     >
4809 FONT <     >
4810 FONT <     >
4811 FONT < *** >
4812 FONT <    *>
4813 FONT < ****>
4814 FONT <*   *>
4815 FONT < ****>
4816 FONT <     >
4817 FONT <     >
4818
4819 CDEF b
4820 FONT <     >
4821 FONT <*    >
4822 FONT <*    >
4823 FONT <**** >
4824 FONT <*   *>
4825 FONT <*   *>
4826 FONT <*   *>
4827 FONT <**** >
4828 FONT <     >
4829 FONT <     >
4830
4831 CDEF c
4832 FONT <     >
4833 FONT <     >
4834 FONT <     >
4835 FONT < *** >
4836 FONT <*   *>
4837 FONT <*    >
4838 FONT <*    >
4839 FONT < ****>
4840 FONT <     >
4841 FONT <     >
4842 \f
4843 CDEF d
4844 FONT <     >
4845 FONT <    *>
4846 FONT <    *>
4847 FONT < ****>
4848 FONT <*   *>
4849 FONT <*   *>
4850 FONT <*   *>
4851 FONT < ****>
4852 FONT <     >
4853 FONT <     >
4854
4855 CDEF e
4856 FONT <     >
4857 FONT <     >
4858 FONT <     >
4859 FONT < *** >
4860 FONT <*   *>
4861 FONT <**** >
4862 FONT <*    >
4863 FONT < *** >
4864 FONT <     >
4865 FONT <     >
4866
4867 CDEF f
4868 FONT <     >
4869 FONT <  ** >
4870 FONT < *  *>
4871 FONT < *   >
4872 FONT <***  >
4873 FONT < *   >
4874 FONT < *   >
4875 FONT < *   >
4876 FONT <     >
4877 FONT <     >
4878
4879 CDEF g
4880 FONT <     >
4881 FONT <     >
4882 FONT <     >
4883 FONT < *** >
4884 FONT <*   *>
4885 FONT <*   *>
4886 FONT <*   *>
4887 FONT < ****>
4888 FONT <    *>
4889 FONT < *** >
4890
4891 CDEF h
4892 FONT <     >
4893 FONT <*    >
4894 FONT <*    >
4895 FONT <**** >
4896 FONT <*   *>
4897 FONT <*   *>
4898 FONT <*   *>
4899 FONT <*   *>
4900 FONT <     >
4901 FONT <     >
4902 \f
4903 CDEF i
4904 FONT <     >
4905 FONT <     >
4906 FONT <  *  >
4907 FONT <     >
4908 FONT <  *  >
4909 FONT <  *  >
4910 FONT <  *  >
4911 FONT <  *  >
4912 FONT <     >
4913 FONT <     >
4914
4915 CDEF j
4916 FONT <     >
4917 FONT <     >
4918 FONT <    *>
4919 FONT <     >
4920 FONT <    *>
4921 FONT <    *>
4922 FONT <    *>
4923 FONT <    *>
4924 FONT <*   *>
4925 FONT < *** >
4926
4927 CDEF k
4928 FONT <     >
4929 FONT <*    >
4930 FONT <*    >
4931 FONT <*   *>
4932 FONT <*  * >
4933 FONT <***  >
4934 FONT <*  * >
4935 FONT <*   *>
4936 FONT <     >
4937 FONT <     >
4938
4939 CDEF l
4940 FONT <     >
4941 FONT <  *  >
4942 FONT <  *  >
4943 FONT <  *  >
4944 FONT <  *  >
4945 FONT <  *  >
4946 FONT <  *  >
4947 FONT <  *  >
4948 FONT <     >
4949 FONT <     >
4950
4951 CDEF m
4952 FONT <     >
4953 FONT <     >
4954 FONT <     >
4955 FONT <** * >
4956 FONT <* * *>
4957 FONT <* * *>
4958 FONT <* * *>
4959 FONT <* * *>
4960 FONT <     >
4961 FONT <     >
4962 \f
4963 CDEF n
4964 FONT <     >
4965 FONT <     >
4966 FONT <     >
4967 FONT <* ** >
4968 FONT <**  *>
4969 FONT <*   *>
4970 FONT <*   *>
4971 FONT <*   *>
4972 FONT <     >
4973 FONT <     >
4974
4975 CDEF o
4976 FONT <     >
4977 FONT <     >
4978 FONT <     >
4979 FONT < *** >
4980 FONT <*   *>
4981 FONT <*   *>
4982 FONT <*   *>
4983 FONT < *** >
4984 FONT <     >
4985 FONT <     >
4986
4987 CDEF p
4988 FONT <     >
4989 FONT <     >
4990 FONT <     >
4991 FONT <**** >
4992 FONT <*   *>
4993 FONT <*   *>
4994 FONT <*   *>
4995 FONT <**** >
4996 FONT <*    >
4997 FONT <*    >
4998
4999 CDEF q
5000 FONT <     >
5001 FONT <     >
5002 FONT <     >
5003 FONT < *** >
5004 FONT <*   *>
5005 FONT <*   *>
5006 FONT <*   *>
5007 FONT < ****>
5008 FONT <    *>
5009 FONT <    *>
5010
5011 CDEF r
5012 FONT <     >
5013 FONT <     >
5014 FONT <     >
5015 FONT <* ** >
5016 FONT <**  *>
5017 FONT <*    >
5018 FONT <*    >
5019 FONT <*    >
5020 FONT <     >
5021 FONT <     >
5022 \f
5023 CDEF s
5024 FONT <     >
5025 FONT <     >
5026 FONT <     >
5027 FONT < ****>
5028 FONT <*    >
5029 FONT < *** >
5030 FONT <    *>
5031 FONT <**** >
5032 FONT <     >
5033 FONT <     >
5034
5035 CDEF t
5036 FONT <     >
5037 FONT <  *  >
5038 FONT <  *  >
5039 FONT <*****>
5040 FONT <  *  >
5041 FONT <  *  >
5042 FONT <  *  >
5043 FONT <   **>
5044 FONT <     >
5045 FONT <     >
5046
5047 CDEF u
5048 FONT <     >
5049 FONT <     >
5050 FONT <     >
5051 FONT <*   *>
5052 FONT <*   *>
5053 FONT <*   *>
5054 FONT <*   *>
5055 FONT < *** >
5056 FONT <     >
5057 FONT <     >
5058
5059 CDEF v
5060 FONT <     >
5061 FONT <     >
5062 FONT <     >
5063 FONT <*   *>
5064 FONT <*   *>
5065 FONT <*   *>
5066 FONT < * * >
5067 FONT <  *  >
5068 FONT <     >
5069 FONT <     >
5070
5071 CDEF w
5072 FONT <     >
5073 FONT <     >
5074 FONT <     >
5075 FONT <*   *>
5076 FONT <*   *>
5077 FONT <* * *>
5078 FONT <* * *>
5079 FONT < * * >
5080 FONT <     >
5081 FONT <     >
5082 \f
5083 CDEF x
5084 FONT <     >
5085 FONT <     >
5086 FONT <     >
5087 FONT <*   *>
5088 FONT < * * >
5089 FONT <  *  >
5090 FONT < * * >
5091 FONT <*   *>
5092 FONT <     >
5093 FONT <     >
5094
5095 CDEF y
5096 FONT <     >
5097 FONT <     >
5098 FONT <     >
5099 FONT <*   *>
5100 FONT <*   *>
5101 FONT <*   *>
5102 FONT < * * >
5103 FONT <  *  >
5104 FONT < *   >
5105 FONT <*    >
5106
5107 CDEF z
5108 FONT <     >
5109 FONT <     >
5110 FONT <     >
5111 FONT <*****>
5112 FONT <   * >
5113 FONT < *** >
5114 FONT < *   >
5115 FONT <*****>
5116 FONT <     >
5117 FONT <     >
5118
5119 CDEF1 173
5120 FONT <    *>
5121 FONT <   * >
5122 FONT <   * >
5123 FONT <   * >
5124 FONT <  *  >
5125 FONT <   * >
5126 FONT <   * >
5127 FONT <   * >
5128 FONT <    *>
5129 FONT <     >
5130
5131 CDEF1 174
5132 FONT <  *  >
5133 FONT <  *  >
5134 FONT <  *  >
5135 FONT <  *  >
5136 FONT <  *  >
5137 FONT <  *  >
5138 FONT <  *  >
5139 FONT <  *  >
5140 FONT <  *  >
5141 FONT <  *  >
5142 \f
5143 CDEF1 175
5144 FONT <*    >
5145 FONT < *   >
5146 FONT < *   >
5147 FONT < *   >
5148 FONT <  *  >
5149 FONT < *   >
5150 FONT < *   >
5151 FONT < *   >
5152 FONT <*    >
5153 FONT <     >
5154
5155 CDEF1 176
5156 FONT < ** *>
5157 FONT <* ** >
5158 FONT <     >
5159 FONT <     >
5160 FONT <     >
5161 FONT <     >
5162 FONT <     >
5163 FONT <     >
5164 FONT <     >
5165 FONT <     >
5166
5167 CDEF1 177
5168 FONT <   * >
5169 FONT <  * *>
5170 FONT <  *  >
5171 FONT <  *  >
5172 FONT <  *  >
5173 FONT <  *  >
5174 FONT <  *  >
5175 FONT <* *  >
5176 FONT < *   >
5177 FONT <     >
5178
5179 CDEF1 200                               ;BLOB CHARACTER FOR CURSORS
5180 FONT <*****>
5181 FONT <*****>
5182 FONT <*****>
5183 FONT <*****>
5184 FONT <*****>
5185 FONT <*****>
5186 FONT <*****>
5187 FONT <*****>
5188 FONT <*****>
5189 FONT <*****>
5190
5191 .ENDC   ;.IF NE FONTMS
5192 \f
5193 .IF E FONTMS
5194 ...0==.
5195 .BYTE 000,000,000,016,016,016,000,000,000,000
5196 ...1==.
5197 .BYTE 000,004,004,004,004,025,016,004,000,000
5198 ...2==.
5199 .BYTE 000,000,000,015,022,022,022,015,000,000
5200 ...3==.
5201 .BYTE 000,000,000,016,021,036,021,036,020,020
5202 ...4==.
5203 .BYTE 000,000,000,004,012,021,000,000,000,000
5204 ...5==.
5205 .BYTE 000,000,000,000,037,001,001,000,000,000
5206 ...6==.
5207 .BYTE 000,000,000,006,010,016,010,006,000,000
5208 ...7==.
5209 .BYTE 000,000,000,037,012,012,012,012,000,000
5210 ...10==.
5211 .BYTE 000,000,020,020,010,004,012,021,000,000
5212 ...11==.
5213 .BYTE 000,021,012,004,012,021,021,016,000,000
5214 ...12==.
5215 .BYTE 000,016,001,002,004,012,021,016,000,000
5216 ...13==.
5217 .BYTE 000,004,016,025,004,004,004,004,000,000
5218 ...14==.
5219 .BYTE 000,004,004,037,004,004,037,000,000,000
5220 ...15==.
5221 .BYTE 000,000,016,025,037,025,016,000,000,000
5222 ...16==.
5223 .BYTE 000,000,000,012,025,025,012,000,000,000
5224 ...17==.
5225 .BYTE 000,014,002,001,017,021,021,016,000,000
5226 ...20==.
5227 .BYTE 000,000,017,020,020,020,017,000,000,000
5228 ...21==.
5229 .BYTE 000,000,036,001,001,001,036,000,000,000
5230 ...22==.
5231 .BYTE 000,000,016,021,021,021,000,000,000,000
5232 ...23==.
5233 .BYTE 000,000,021,021,021,016,000,000,000,000
5234 ...24==.
5235 .BYTE 000,021,021,037,021,012,012,004,000,000
5236 ...25==.
5237 .BYTE 000,037,001,001,017,001,001,037,000,000
5238 ...26==.
5239 .BYTE 000,000,016,033,025,033,016,000,000,000
5240 ...27==.
5241 .BYTE 000,004,002,037,002,004,010,037,010,004
5242 ...30==.
5243 .BYTE 000,000,004,010,037,010,004,000,000,000
5244 ...31==.
5245 .BYTE 000,000,004,002,037,002,004,000,000,000
5246 ...32==.
5247 .BYTE 000,001,002,037,004,037,010,020,000,000
5248 ...33==.
5249 .BYTE 000,004,004,012,021,012,004,004,000,000
5250 ...34==.
5251 .BYTE 000,002,004,010,004,002,000,016,000,000
5252 ...35==.
5253 .BYTE 000,010,004,002,004,010,000,016,000,000
5254 ...36==.
5255 .BYTE 000,000,037,000,037,000,037,000,000,000
5256 ...37==.
5257 .BYTE 000,000,000,021,012,004,000,000,000,000
5258 ...40==.
5259 .BYTE 000,000,000,000,000,000,000,000,000,000
5260 ...41==.
5261 .BYTE 000,004,004,004,004,004,000,004,000,000
5262 ...42==.
5263 .BYTE 012,012,012,000,000,000,000,000,000,000
5264 ...43==.
5265 .BYTE 000,000,012,037,012,012,037,012,000,000
5266 ...44==.
5267 .BYTE 004,016,025,024,016,005,025,016,004,000
5268 ...45==.
5269 .BYTE 000,037,031,002,004,010,023,023,000,000
5270 ...46==.
5271 .BYTE 000,010,024,024,010,025,022,015,000,000
5272 ...47==.
5273 .BYTE 014,014,030,000,000,000,000,000,000,000
5274 ...50==.
5275 .BYTE 000,001,002,004,004,004,002,001,000,000
5276 ...51==.
5277 .BYTE 000,020,010,004,004,004,010,020,000,000
5278 ...52==.
5279 .BYTE 000,004,025,016,004,016,025,004,000,000
5280 ...53==.
5281 .BYTE 000,000,004,004,037,004,004,000,000,000
5282 ...54==.
5283 .BYTE 000,000,000,000,000,000,014,014,030,000
5284 ...55==.
5285 .BYTE 000,000,000,000,037,000,000,000,000,000
5286 ...56==.
5287 .BYTE 000,000,000,000,000,000,014,014,000,000
5288 ...57==.
5289 .BYTE 000,000,001,002,004,010,020,000,000,000
5290 ...60==.
5291 .BYTE 000,016,021,023,025,031,021,016,000,000
5292 ...61==.
5293 .BYTE 000,004,014,004,004,004,004,016,000,000
5294 ...62==.
5295 .BYTE 000,016,021,001,002,004,010,037,000,000
5296 ...63==.
5297 .BYTE 000,016,021,001,006,001,021,016,000,000
5298 ...64==.
5299 .BYTE 000,002,006,012,022,037,002,002,000,000
5300 ...65==.
5301 .BYTE 000,037,020,036,001,001,021,016,000,000
5302 ...66==.
5303 .BYTE 000,006,010,020,036,021,021,016,000,000
5304 ...67==.
5305 .BYTE 000,037,001,002,002,004,004,004,000,000
5306 ...70==.
5307 .BYTE 000,016,021,021,016,021,021,016,000,000
5308 ...71==.
5309 .BYTE 000,016,021,021,017,001,002,014,000,000
5310 ...72==.
5311 .BYTE 000,000,000,014,014,000,014,014,000,000
5312 ...73==.
5313 .BYTE 000,000,000,014,014,000,014,014,030,000
5314 ...74==.
5315 .BYTE 000,000,002,004,010,004,002,000,000,000
5316 ...75==.
5317 .BYTE 000,000,000,037,000,037,000,000,000,000
5318 ...76==.
5319 .BYTE 000,000,010,004,002,004,010,000,000,000
5320 ...77==.
5321 .BYTE 000,016,021,002,004,004,000,004,000,000
5322 ...100==.
5323 .BYTE 000,016,021,027,025,027,020,016,000,000
5324 ...101==.
5325 .BYTE 000,016,021,021,037,021,021,021,000,000
5326 ...102==.
5327 .BYTE 000,036,021,021,036,021,021,036,000,000
5328 ...103==.
5329 .BYTE 000,016,021,020,020,020,021,016,000,000
5330 ...104==.
5331 .BYTE 000,036,011,011,011,011,011,036,000,000
5332 ...105==.
5333 .BYTE 000,037,020,020,036,020,020,037,000,000
5334 ...106==.
5335 .BYTE 000,037,020,020,036,020,020,020,000,000
5336 ...107==.
5337 .BYTE 000,016,021,020,020,023,021,016,000,000
5338 ...110==.
5339 .BYTE 000,021,021,021,037,021,021,021,000,000
5340 ...111==.
5341 .BYTE 000,016,004,004,004,004,004,016,000,000
5342 ...112==.
5343 .BYTE 000,001,001,001,001,001,021,016,000,000
5344 ...113==.
5345 .BYTE 000,021,022,024,030,024,022,021,000,000
5346 ...114==.
5347 .BYTE 000,020,020,020,020,020,020,037,000,000
5348 ...115==.
5349 .BYTE 000,021,033,025,021,021,021,021,000,000
5350 ...116==.
5351 .BYTE 000,021,021,031,025,023,021,021,000,000
5352 ...117==.
5353 .BYTE 000,016,021,021,021,021,021,016,000,000
5354 ...120==.
5355 .BYTE 000,036,021,021,036,020,020,020,000,000
5356 ...121==.
5357 .BYTE 000,016,021,021,021,025,022,015,000,000
5358 ...122==.
5359 .BYTE 000,036,021,021,036,024,022,021,000,000
5360 ...123==.
5361 .BYTE 000,016,021,020,016,001,021,016,000,000
5362 ...124==.
5363 .BYTE 000,037,004,004,004,004,004,004,000,000
5364 ...125==.
5365 .BYTE 000,021,021,021,021,021,021,016,000,000
5366 ...126==.
5367 .BYTE 000,021,021,021,021,012,012,004,000,000
5368 ...127==.
5369 .BYTE 000,021,021,021,021,025,033,021,000,000
5370 ...130==.
5371 .BYTE 000,021,021,012,004,012,021,021,000,000
5372 ...131==.
5373 .BYTE 000,021,021,012,004,004,004,004,000,000
5374 ...132==.
5375 .BYTE 000,037,001,002,037,010,020,037,000,000
5376 ...133==.
5377 .BYTE 007,004,004,004,004,004,004,004,007,000
5378 ...134==.
5379 .BYTE 000,000,020,010,004,002,001,000,000,000
5380 ...135==.
5381 .BYTE 034,004,004,004,004,004,004,004,034,000
5382 ...136==.
5383 .BYTE 004,012,021,000,000,000,000,000,000,000
5384 ...137==.
5385 .BYTE 000,000,000,000,000,000,000,000,000,037
5386 ...140==.
5387 .BYTE 006,006,003,000,000,000,000,000,000,000
5388 ...141==.
5389 .BYTE 000,000,000,016,001,017,021,017,000,000
5390 ...142==.
5391 .BYTE 000,020,020,036,021,021,021,036,000,000
5392 ...143==.
5393 .BYTE 000,000,000,016,021,020,020,017,000,000
5394 ...144==.
5395 .BYTE 000,001,001,017,021,021,021,017,000,000
5396 ...145==.
5397 .BYTE 000,000,000,016,021,036,020,016,000,000
5398 ...146==.
5399 .BYTE 000,006,011,010,034,010,010,010,000,000
5400 ...147==.
5401 .BYTE 000,000,000,016,021,021,021,017,001,016
5402 ...150==.
5403 .BYTE 000,020,020,036,021,021,021,021,000,000
5404 ...151==.
5405 .BYTE 000,000,004,000,004,004,004,004,000,000
5406 ...152==.
5407 .BYTE 000,000,001,000,001,001,001,001,021,016
5408 ...153==.
5409 .BYTE 000,020,020,021,022,034,022,021,000,000
5410 ...154==.
5411 .BYTE 000,004,004,004,004,004,004,004,000,000
5412 ...155==.
5413 .BYTE 000,000,000,032,025,025,025,025,000,000
5414 ...156==.
5415 .BYTE 000,000,000,026,031,021,021,021,000,000
5416 ...157==.
5417 .BYTE 000,000,000,016,021,021,021,016,000,000
5418 ...160==.
5419 .BYTE 000,000,000,036,021,021,021,036,020,020
5420 ...161==.
5421 .BYTE 000,000,000,016,021,021,021,017,001,001
5422 ...162==.
5423 .BYTE 000,000,000,026,031,020,020,020,000,000
5424 ...163==.
5425 .BYTE 000,000,000,017,020,016,001,036,000,000
5426 ...164==.
5427 .BYTE 000,004,004,037,004,004,004,003,000,000
5428 ...165==.
5429 .BYTE 000,000,000,021,021,021,021,016,000,000
5430 ...166==.
5431 .BYTE 000,000,000,021,021,021,012,004,000,000
5432 ...167==.
5433 .BYTE 000,000,000,021,021,025,025,012,000,000
5434 ...170==.
5435 .BYTE 000,000,000,021,012,004,012,021,000,000
5436 ...171==.
5437 .BYTE 000,000,000,021,021,021,012,004,010,020
5438 ...172==.
5439 .BYTE 000,000,000,037,002,016,010,037,000,000
5440 ...173==.
5441 .BYTE 001,002,002,002,004,002,002,002,001,000
5442 ...174==.
5443 .BYTE 004,004,004,004,004,004,004,004,004,004
5444 ...175==.
5445 .BYTE 020,010,010,010,004,010,010,010,020,000
5446 ...176==.
5447 .BYTE 015,026,000,000,000,000,000,000,000,000
5448 ...177==.
5449 .BYTE 002,005,004,004,004,004,004,024,010,000
5450 ...200==.
5451 .BYTE 037,037,037,037,037,037,037,037,037,037
5452 .ENDC   ;.IF E FONTMS
5453 .LIST
5454
5455 BLOB=...200                     ;BLOB IS THE CHAR THAT COVERS ENTIRE CHARACTER AREA.
5456
5457 .IIF E FONTSW,.=.+3000          ;APPROXIMATE SIZE OF FONT
5458
5459 REPORT FONT SIZE=,\.-FNTORG
5460 FNTEND==.
5461 .NLIST
5462 .ENDC   ;.IF NE FONTSW
5463 .LIST
5464 \f
5465 .SBTTL LINE EDITOR AND PAGE PRINTER VARIABLES
5466 VARORG==.
5467
5468 .MACRO ...TEN
5469 .=<.+3>&<-4>
5470 .ENDM
5471
5472 ;LINE EDITOR VARIABLE BLOCK FORMAT:
5473 ;THIS DOESN'T REALLY HAVE ANYTHING TO WITH LINE-EDITING.  THIS BLOCK
5474 ;CONTAINS MOST OF THE VARIABLES FOR EACH TV-CHANNEL (OR VIRTUAL TTY),
5475 ;COMBINING THE OLD IDEAS OF DPY BUFFER, LINE EDITOR, AND PAGE PRINTER.
5476 ;THERE IS ALSO A TV-BUFFER NUMBER, WHICH GOES IN THE CREG, AND INDEXES
5477 ;SOME ARRAYS ON THE LAST PAGE, A DPY CHANNEL # WHICH = A PDP10 TTY # MINUS NF11TY
5478 ;AND INDEXES SOME 11-10 SHARED ARRAYS, AND A KBD# WHICH IS A HARDWARE KEYBOARD
5479 ;NUMBER AND INDEXES SOME ARRAYS ON THE LAST PAGE.
5480
5481 LEDFLT:         .OFFSET -.
5482 ;FIRST COMES THE 10-TO-11 DPY OUTPUT BUFFER.  NOTE THAT THE "DEFAULT VALUES
5483 ;FOR THIS PART ARE NOT USED IN INITIALIZATION.
5484 DPY10B::        .=.+2           ;WORD PDP-10 IS HACKING (USED FOR INITIALIZATION ONLY)
5485 DPY11B::        .=.+2           ;WORD PDP-11 IS HACKING
5486 DPYFS1::        .=.+2           ;WASTED WORD.
5487 DPYLGL::        .=.+2           ;HIGHEST LEGAL BUFFER CELL
5488 DPYSIZ::        .=.+2           ;SIZE OF DATA AREA
5489 DPYFS::         .=.+2           ;NOT USED
5490 ...TEN
5491 DPDATA::        .BLKB DPSIZE    ;DATA AREA OF BUFFER.
5492
5493 LECC::          TVLO            ;ADDRESS OF CURSOR
5494 LEPHS::         20-CHRWD        ;PHASE OF CURSOR
5495 LEX::           -BITPL          ;X POSITON OF LE CURSOR
5496 LECREG::        .BYTE -1        ;CONSOLE REGISTER FOR THIS LE DISPLAY
5497                 .BYTE 0         ;UNUSED
5498 ...TEN
5499
5500 LEZER0::        0               ;FAKE LINE BUFFER HEADER (SENT TO PDP10 IN RESPONSE TO ECOFLG)
5501 LEZER1::        0
5502 LEBUF::         0               ;CURRENT TEXT BUFFER
5503 LELIST::        0               ;KEYBOARD BUFFER CHAIN
5504 LECHN::         -1              ;DPY CHANNEL NUMBER, SET UP AT INIT TIME.
5505 LEKBD::         -1              ;KEYBOARD DRIVING THIS LINE EDITOR
5506 LEY::           -NLINS          ;Y COORDINATE OF LINE EDITOR DISPLAY
5507 LELCC::         TVLO            ;ADDRESS OF START OF CURRENT CHARACTER LINE, IN VIDEO BUFFER.
5508 ;LEFONT::       CTAB            ;FONT FOR WRITING WITH IN THIS L.E. (NOT USED)
5509 LECPC::         0               ;COROUTINE PC SAVED BY GETCHC.
5510 LESVB::         0               ;VALUE OF B SAVED OVER CALL TO GETCHC.
5511 LEFREE::        LBCHRS          ;FREE CHARACTER COUNT
5512 LECHR::         0               ;POINTS AT FREE CHARACTER IN BUFFER
5513 ;LEBLNK::       0               ;LINE EDITOR BLINKER (NOT USED, THERE IS NO LINE EDITOR)
5514 LERPT::         0               ;0 NORMAL, -1 => INDEFINITE REPEAT, ELSE REPEAT COUNT.
5515                                 ;REPEAT REFERS TO REPEAT-ACTION ON AN INPUT CHARACTER.
5516 LELSTA::        0               ;A AND B AT MOST RECENT CALL TO PUTCHR.
5517 LELSTB::        0               ;FOR THE SAKE OF REPEAT-ACTION ON INPUT.
5518 ...TEN
5519 LELEN::         .OFFSET 0
5520
5521 ;LINE EDITOR VARIABLE AREAS.
5522
5523 TENWRD
5524 ;HERE WE ASSEMBLE IN THE "DPY BUFFERS".
5525 LEUVAR: .REPT   MAXTV
5526         .+DPDATA
5527         .-2+DPDATA
5528         0
5529         .-6+DPDATA+DPSIZE-2
5530         DPSIZE
5531         0
5532         .BLKB LELEN-DPDATA
5533         .ENDR
5534 LEUEND==.
5535
5536 ;THE WHO-LINE LINE EDITOR IS DIFFERENT AND APART FROM ALL THE REST
5537
5538 WHOPP:  .=.+LELEN
5539 \f
5540 ;CLOCK QUEUE ENTRY
5541
5542                 .OFFSET -.      ;CLOCK QUEUE ENTRY
5543 CQNEXT::        .=.+2           ;CDR OF QUEUE
5544 CQTIME::        .=.+2           ;HIGH ORDER OF TIME
5545 CQTIM1::        .=.+2           ;LOW ORDER
5546 CQROUT::        .=.+2           ;ROUTINE TO CALL AT CLOCK LEVEL
5547 CQARG::         .=.+2           ;ARGUMENT FOR CLOCK LEVEL ROUTINE
5548 CQLEN::         .OFFSET 0
5549
5550
5551
5552                 .OFFSET -.      ;LINE BUFFER HEADER AREA
5553                                 ;DON'T ADD NEW VARS WITHOUT CHANGING PDP10 CODE
5554                                 ;IN TT11IN.
5555 LHFLAG::        .=.+2           ;0=>FREE, POS=>BUSY, NEG=>ACTIVE.
5556 LHZERO::        .=.+2           ;BETTER BE ZERO SO THAT PDP-10 CAN TEST LHFLAG
5557 LHNEXT::        .=.+2           ;NEXT BUFFER ON RING OF TWO FOR THIS TTY
5558 LHALST::        .=.+2           ;NEXT BUFFER ON LIST OF ACTIVE BUFFERS.
5559 LHCHN::         .=.+2           ;PDP-10 LINE NUMBER (TTY NUMBER MINUS NF11TY).
5560 LHFS::          .=.+2           ;CHAINS FREE STORAGE BLOCKS
5561 LHQUED::        .=.+2           ;NON-ZERO => THIS BUFFER CLOCK QUEUED FOR ACTIVATION (SEE QBFR)
5562 ...TEN
5563 LHLEN::         .OFFSET 0
5564
5565                 .OFFSET -.      ;BLINKER VARIABLES
5566 BLNEXT::        0               ;NEXT BLINKER ON LIST
5567 BLCURS::        0               ;POINTS AT CURSOR VARIABLES
5568 BLON::          .BYTE 0         ;PHASE; 0=INVISIBLE, 377=VISIBLE
5569 BLCHAR::        .BYTE 177       ;UNUSED
5570 BLLEN::         .OFFSET 0
5571
5572 BLKVAR: .=.+<MAXBLK*BLLEN>
5573         .EVEN
5574 \f
5575                 .OFFSET -.      ;USER WHO LINE
5576 WHJOB::         .=.+2           ;job #
5577 WHJOB1::        .=.+2           ;if negative then clear who line
5578 WHMODE::        .=.+2           ;mode
5579                                 ;-1=>who line is off
5580                                 ; 0=>follow keyboard
5581                                 ; 1=>freeze
5582                                 ; 2=>next higher (when PDP-10 sees this state, it searches
5583                                 ;   user variables for next higher job index number with same
5584                                 ;   uname.  When it finds it, it stores the number in job #
5585                                 ;   and changes mode to 1
5586                                 ; 3=>next lower
5587                                 ;any other=>system who line
5588 WHMOD1::        .=.+2           ;pads WHMODE
5589 WHUNAM::        .=.+2           ;uname in sixbit (left 18 bits in first two words, right in next two)
5590 WHUNM1::        .=.+2
5591 WHUNM2::        .=.+2
5592 WHUNM3::        .=.+2
5593 WHJNAM::        .=.+2           ;jname in sixbit
5594 WHJNM1::        .=.+2
5595 WHJNM2::        .=.+2
5596 WHJNM3::        .=.+2
5597 WHSNAM::        .=.+2           ;sname in sixbit
5598 WHSNM1::        .=.+2
5599 WHSNM2::        .=.+2
5600 WHSNM3::        .=.+2
5601 WHSTAT::        .=.+2           ;status in sixbit, 0=>job does not exist
5602 WHSTA1::        .=.+2
5603 WHSTA2::        .=.+2
5604 WHSTA3::        .=.+2
5605 WHJ%RT::        .=.+2           ;job % run time
5606 WHJTRT::        .=.+2           ;job total run time (in tenth's of seconds)
5607 WHRPAG::        .=.+2           ;job real pages (swapped in)
5608 WHTPAG::        .=.+2           ;job total pages
5609 WHO1::          .=.+2           ;user who mode control word
5610 WHO1A::         .=.+2
5611 WHO2::          .=.+2           ;first user who line var
5612 WHO2A::         .=.+2
5613 WHO2B::         .=.+2
5614 WHO2C::         .=.+2
5615 WHO3::          .=.+2           ;second user who line var
5616 WHO3A::         .=.+2
5617 WHO3B::         .=.+2
5618 WHO3C::         .=.+2
5619 ...TEN
5620                 .=.+30          ;EXTRA SPACE SO NEW HACKS CAN SAFELY BE PUT IN PDP10.
5621 WHLEN::         .OFFSET 0
5622
5623 ;USER WHO LINE VARIABLES
5624
5625 TENWRD
5626
5627 WHVARS: .=.+<WHLEN*MAXTV>
5628 \f
5629 .SBTTL MISCELLANEOUS TABLES
5630 MISORG==.
5631
5632 ;KEYBOARD/VIDEO SWITCH DEFAULTS
5633 ;INDEXED BY KBD #, GIVES NEAREST VIDEO SWITCH OUTPUT, -1=>NO DEFAULT
5634
5635 KBDVSW: .BYTE    0      ; 0     809 FAHLMAN, HOLLOWAY, KNIGHT
5636         .BYTE   23      ; 1     810 LAVIN, KUIPERS, MILLER
5637         .BYTE   24      ; 2     919 Very Small Data Bases NORTH (FAR END)
5638         .BYTE   20      ; 3     812 YVONNE
5639         .BYTE    6      ; 4     813 HEWITT
5640         .BYTE    7      ; 5     814 SUSSMAN
5641         .BYTE    3      ; 6     808 FREILING, ULLMAN
5642         .BYTE   -1      ; 7
5643         .BYTE    4      ;10     817 JABARI
5644         .BYTE   -1      ;11
5645         .BYTE   -1      ;12
5646         .BYTE   10      ;13     819 GOLDSTEIN
5647         .BYTE    1      ;14     820 MINSKY
5648         .BYTE   -1      ;15
5649         .BYTE   -1      ;16
5650         .BYTE   11      ;17     821A  MARR
5651         .BYTE   -1      ;20
5652         .BYTE    2      ;21     824 RICH, DEKLEER
5653         .BYTE    5      ;22     825 Sjoberg
5654         .BYTE   26      ;23     826 Fredkin
5655         .BYTE   31      ;24     815 Horn
5656         .BYTE   -1      ;25
5657         .BYTE   -1      ;26
5658         .BYTE   -1      ;27
5659         .BYTE   15      ;30     925 MOON'S REFRIGERATOR
5660         .BYTE   16      ;31     902 TAENZER, MASON
5661         .BYTE   17      ;32     919 Very Small Data losers
5662         .BYTE   14      ;33     334 EDWARDS, LEBEL
5663         .BYTE   13      ;34     913 BAISLEY, GREENBLATT
5664         .BYTE   12      ;35     914 COHEN, GOSPER, ETC.
5665         .BYTE   21      ;36     912 9TH FLOOR LOUNGE
5666         .BYTE   22      ;37     907 CHESS, LISP MACHINES
5667         .BYTE   -1      ;40     906 Lisp Machines
5668         .BYTE   37      ;41     3rd Floor #1
5669         .BYTE   36      ;42     3rd Floor #2
5670         .BYTE   35      ;43     3rd Floor #3
5671         .BYTE   34      ;44     3rd Floor #4
5672         .BYTE   33      ;45     3rd Floor #5
5673         .BYTE   30      ;46     3rd Floor #6
5674         .BYTE   -1      ;47     NOT CONNECTED
5675         .BYTE   -1      ;50     NOT CONNECTED
5676         .BYTE   -1      ;51     NOT CONNECTED
5677         .BYTE   -1      ;52     NOT CONNECTED
5678         .BYTE   -1      ;53     NOT CONNECTED
5679         .BYTE   -1      ;54     NOT CONNECTED
5680         .BYTE   -1      ;55     NOT CONNECTED
5681         .BYTE   -1      ;56     NOT CONNECTED
5682         .BYTE   -1      ;57     NOT CONNECTED
5683         .BYTE   -1      ;60     NOT CONNECTED
5684         .BYTE   -1      ;61     NOT CONNECTED
5685         .BYTE   -1      ;62     NOT CONNECTED
5686         .BYTE   -1      ;63     NOT CONNECTED
5687         .BYTE   -1      ;64     NOT CONNECTED
5688         .BYTE   -1      ;65     NOT CONNECTED
5689         .BYTE   -1      ;66     NOT CONNECTED
5690         .BYTE   -1      ;67     NOT CONNECTED
5691         .BYTE   -1      ;70     NOT CONNECTED
5692         .BYTE   -1      ;71     NOT CONNECTED
5693         .BYTE   -1      ;72     NOT CONNECTED
5694         .BYTE   -1      ;73     NOT CONNECTED
5695         .BYTE   -1      ;74     NOT CONNECTED
5696         .BYTE   -1      ;75     NOT CONNECTED
5697         .BYTE   -1      ;76     NOT CONNECTED
5698         .BYTE   -1      ;77     NOT CONNECTED
5699 CHECK KBDVSW,MAXKBD
5700 \f
5701
5702 ;THIS TABLE SAYS WHICH FLOOR TO CALL THE ELEVATOR TO FOR <ESC>E
5703
5704 ELETAB: .BYTE   ELKMS8  ; 0     809 FAHLMAN, HOLLOWAY, KNIGHT
5705         .BYTE   ELKMS8  ; 1     810 LAVIN, KUIPERS, MILLER
5706         .BYTE   ELKMS9  ; 2     919 Very Small Data Bases NORTH (FAR END)
5707         .BYTE   ELKMS8  ; 3     812 YVONNE
5708         .BYTE   ELKMS8  ; 4     813 HEWITT
5709         .BYTE   ELKMS8  ; 5     814 SUSSMAN
5710         .BYTE   ELKMS8  ; 6     808 FREILING, ULLMAN
5711         .BYTE   0       ; 7
5712         .BYTE   ELKMS8  ;10     817 JABARI
5713         .BYTE   0       ;11
5714         .BYTE   0       ;12
5715         .BYTE   ELKMS8  ;13     819 GOLDSTEIN
5716         .BYTE   ELKMS8  ;14     820 MINSKY
5717         .BYTE   0       ;15
5718         .BYTE   0       ;16
5719         .BYTE   ELKMS8  ;17     821A  MARR
5720         .BYTE   0       ;20
5721         .BYTE   ELKMS8  ;21     824 RICH, DEKLEER
5722         .BYTE   ELKMS8  ;22     825 Sjoberg
5723         .BYTE   ELKMS8  ;23     826 Fredkin
5724         .BYTE   ELKMS8  ;24     815 Horn
5725         .BYTE   0       ;25
5726         .BYTE   0       ;26
5727         .BYTE   0       ;27
5728         .BYTE   ELKMS9  ;30     925 MOON'S REFRIGERATOR
5729         .BYTE   ELKMS9  ;31     902 TAENZER, MASON
5730         .BYTE   ELKMS9  ;32     919 Very Small Data losers
5731         .BYTE   0       ;33     334 EDWARDS, LEBEL
5732         .BYTE   ELKMS9  ;34     913 BAISLEY, GREENBLATT
5733         .BYTE   ELKMS9  ;35     914 COHEN, GOSPER, ETC.
5734         .BYTE   ELKMS9  ;36     912 9TH FLOOR LOUNGE
5735         .BYTE   ELKMS9  ;37     907 CHESS, LISP MACHINES
5736         .BYTE   ELKMS9  ;40     906 Lisp Machines
5737         .BYTE   0       ;41     NOT CONNECTED
5738         .BYTE   0       ;42     NOT CONNECTED
5739         .BYTE   0       ;43     NOT CONNECTED
5740         .BYTE   0       ;44     NOT CONNECTED
5741         .BYTE   0       ;45     NOT CONNECTED
5742         .BYTE   0       ;46     NOT CONNECTED
5743         .BYTE   0       ;47     NOT CONNECTED
5744         .BYTE   0       ;50     NOT CONNECTED
5745         .BYTE   0       ;51     NOT CONNECTED
5746         .BYTE   0       ;52     NOT CONNECTED
5747         .BYTE   0       ;53     NOT CONNECTED
5748         .BYTE   0       ;54     NOT CONNECTED
5749         .BYTE   0       ;55     NOT CONNECTED
5750         .BYTE   0       ;56     NOT CONNECTED
5751         .BYTE   0       ;57     NOT CONNECTED
5752         .BYTE   0       ;60     NOT CONNECTED
5753         .BYTE   0       ;61     NOT CONNECTED
5754         .BYTE   0       ;62     NOT CONNECTED
5755         .BYTE   0       ;63     NOT CONNECTED
5756         .BYTE   0       ;64     NOT CONNECTED
5757         .BYTE   0       ;65     NOT CONNECTED
5758         .BYTE   0       ;66     NOT CONNECTED
5759         .BYTE   0       ;67     NOT CONNECTED
5760         .BYTE   0       ;70     NOT CONNECTED
5761         .BYTE   0       ;71     NOT CONNECTED
5762         .BYTE   0       ;72     NOT CONNECTED
5763         .BYTE   0       ;73     NOT CONNECTED
5764         .BYTE   0       ;74     NOT CONNECTED
5765         .BYTE   0       ;75     NOT CONNECTED
5766         .BYTE   0       ;76     NOT CONNECTED
5767         .BYTE   0       ;77     NOT CONNECTED
5768 CHECK ELETAB,MAXKBD
5769 \f
5770 ;CHCREG TABLE, INDEXED BY CHANNEL NUMBER, GIVES TV BUFFER NUMBER.
5771 ;NON-WORKING TV BUFFERS SHOULD NOT BE IN THE LIST.
5772 ;IF THERE ARE MORE CHANNELS THAN BUFFERS, PUT -1 IN FOR SOME CHANNELS.
5773
5774 CHCREG: .BYTE 0,1,4,5,6,7,10,11,12,13,14,15,16,17,-1,-1
5775
5776
5777 ;VIDEO SWITCH INPUT INDEXED BY DPY #, HIGH ORDER BYTE GIVES SWITCH SECTION
5778
5779 DPYVSW: 1               ; 0
5780         2               ; 1
5781         3               ; 2
5782         4               ; 3
5783         5               ; 4
5784         6               ; 5
5785         7               ; 6
5786         10              ; 7
5787         21              ;10 THESE INPUTS ARE IN SECOND SECTION
5788         22              ;11
5789         23              ;12
5790         24              ;13
5791         11              ;14 1ST SECTION AGAIN
5792         12              ;15
5793         13              ;16
5794         14              ;17
5795 CHECK DPYVSW,MAXTV*2
5796 \f
5797 ;AUDIO SWITCH TABLES (INDEXED BY KBD #, GIVES AUDIO SWITCH OUTPUT #)
5798
5799 KBDASW: .BYTE 00        ; 0
5800         .BYTE 01        ; 1
5801         .BYTE 02        ; 2
5802         .BYTE 03        ; 3
5803         .BYTE 04        ; 4
5804         .BYTE 05        ; 5
5805         .BYTE 06        ; 6
5806         .BYTE 07        ; 7
5807         .BYTE 10        ;10
5808         .BYTE 11        ;11
5809         .BYTE 12        ;12
5810         .BYTE 13        ;13
5811         .BYTE 14        ;14
5812         .BYTE 15        ;15
5813         .BYTE 16        ;16
5814         .BYTE 17        ;17
5815         .BYTE 20        ;20
5816         .BYTE 21        ;21
5817         .BYTE 22        ;22
5818         .BYTE 23        ;23
5819         .BYTE 24        ;24
5820         .BYTE 25        ;25
5821         .BYTE 26        ;26
5822         .BYTE 27        ;27
5823         .BYTE 30        ;30
5824         .BYTE 31        ;31
5825         .BYTE 32        ;32
5826         .BYTE 33        ;33
5827         .BYTE 34        ;34
5828         .BYTE 35        ;35
5829         .BYTE 36        ;36
5830         .BYTE 37        ;37
5831         .BYTE -1        ;40
5832         .BYTE -1        ;41
5833         .BYTE -1        ;42
5834         .BYTE -1        ;43
5835         .BYTE -1        ;44
5836         .BYTE -1        ;45
5837         .BYTE -1        ;46
5838         .BYTE -1        ;47
5839         .BYTE -1        ;50
5840         .BYTE -1        ;51
5841         .BYTE -1        ;52
5842         .BYTE -1        ;53
5843         .BYTE -1        ;54
5844         .BYTE -1        ;55
5845         .BYTE -1        ;56
5846         .BYTE -1        ;57
5847         .BYTE -1        ;60
5848         .BYTE -1        ;61
5849         .BYTE -1        ;62
5850         .BYTE -1        ;63
5851         .BYTE -1        ;64
5852         .BYTE -1        ;65
5853         .BYTE -1        ;66
5854         .BYTE -1        ;67
5855         .BYTE -1        ;70
5856         .BYTE -1        ;71
5857         .BYTE -1        ;72
5858         .BYTE -1        ;73
5859         .BYTE -1        ;74
5860         .BYTE -1        ;75
5861         .BYTE -1        ;76
5862         .BYTE -1        ;77
5863 CHECK KBDASW,MAXKBD
5864 \f
5865 ;POINTER AREA
5866
5867 TENWRD
5868
5869 POINTA: ITSWHO
5870         CMDFLG
5871 TENWHO: 0               ;-1=>PDP-10 SHOULD UPDATE WHO LINES
5872 TENWH1: 0               ;FILLS OUT TENWHO
5873         MAXTV           ;PUT # OF PDP-10 CHANNELS HERE FOR ITS.
5874         0
5875 NF11TY: 0               ;PDP-10 PUTS TTY # OF FIRST CHANNEL HERE.
5876         0
5877 QPYDWN: 0               ;THIS NEEDS TO BE READ BY THE 10 FOR LOCK TVQPY CMD.
5878         0               
5879 .=.+10                  ;LEAVE A LITTLE ROOM FOR GROWTH
5880
5881 ;10/11 CHANNEL HEADER AREA
5882
5883 TENWRD
5884
5885 CHA==.
5886 KBDFLG: 0               ;KEYBOARD ACTIVATED LIST (SET BY 11 CLEARED BY 10)
5887         0               ;ALWAYS ZERO
5888 DPYCHN: LEUVAR          ;THE CHANNEL VARS BLOCK ADDR
5889 DPYKBD: 0               ;.BYTE KBD #,DPY #, OR -1 FOR FREE CHANNEL.
5890 .REPT MAXTV-1
5891         LEUVAR+<<.RPCNT+1>*LELEN>
5892         0
5893 .ENDR
5894 ECOFLG: 0
5895 CHNCLS: 0               ;FLAGS DPY CHANNEL AS OPEN (SET TO -1 BY TEN)
5896         .=.+<<MAXTV-1>*4>
5897 WHOLIN: 0               ;POINTS TO WHO LINE VARIABLES FOR THIS CHANNEL
5898         0               ;NOT USED
5899         .=.+<<MAXTV-1>*4>
5900
5901 ;PDP-10/PDP-10 COMMAND BUFFER
5902
5903 TENWRD
5904
5905 CMDFLG: 0               ;0=>TEN CAN WRITE, POSITIVE=>ELEVEN CAN WRITE, NEGATVE=>TEN WON
5906         0               ;FULL PDP-10 WORD BOUNDARY
5907 CMDBUF: .=.+<CMDARG*4>  ;EACH ARG IN COMMAND BUFFER IS PDP-10 WORD
5908
5909 ;SYSTEM WHO LINE
5910
5911 TENWRD
5912
5913 ITSWHO==.
5914 ITSTDP: 0       ;# total # dpy's (read only for PDP-10)
5915 ITSFDP: 0       ;# free  dpys (read only for PDP-10)
5916 ITSVER: 0       ;ITS version #
5917 ITSJOB: 0       ;total jobs
5918 ITSCOR: 0       ;total core
5919 ITSRU:  0       ;runnable users
5920 ITSWBJ: 0       ;# jobs swap blocked
5921 ITSJWP: 0       ;# jobs waiting for pages
5922 ITSTRC: 0       ;total runable core
5923 ITSCFU: 0       ;core available for users
5924 ITSDAT: 0       ;date [byte (7) year (4) month (5) day]
5925 ITSDBG: 0       ;system debug flag
5926 ITSTIM: 0       ;time of day (# half seconds since midnight) aligned on PDP-10 word
5927 ITSTI1: 0       ;low order of time
5928 ITSUSR: 0       ;total number of users
5929 ITSFSH: 0       ;fair share in %
5930 \f
5931 .SBTTL MISCELLANEOUS VARIABLES AND FREE STORAGE
5932
5933 ;CHANNEL USE FLAGS NON-ZERO MEANS CHANNEL IN USE
5934 CHNUSE: .BLKB MAXTV     ;BYTES INDEXED BY DPY CHANNEL #
5935         .EVEN
5936
5937
5938 ;BLINKERS.  INDEXED BY TV-BUFFER # (CREG)
5939 BLINKS: .BLKW MAXTV     ;ADDRESS OF 1ST BLINKER OF THIS TV'S BLINKER LIST.
5940
5941 BLKSWT: .BLKB MAXTV     ;NONZERO => DON'T DO ANY BLINKING ON THIS TV NOW.
5942         .EVEN
5943
5944 ;BELLS PENDING COUNTS.  INDEXED BY TV-BUFFER #
5945 BELCNT: .BLKW MAXTV
5946
5947
5948 ;PER-KEYBOARD INFORMATION.  INDEXED BY KBD#.
5949 KBDLE:  .BLKW MAXKBD    ;KEYBOARD/LINE EDITOR ASSOCIATION
5950
5951 KBDESC: .BYTE 0         ;NON-ZERO => <ESC> KEY HAS BEEN TYPED, READING ARG
5952 KBDARG: .BYTE 0         ;NUMERIC ARGUMENT FOR <ESC>
5953         .=.+<<MAXKBD-1>*2>      ;THE ABOVE TWO BYTE ARRAYS ARE INTERLEAVED.
5954
5955         0       ;THIS ZERO WORD NEEDED - SEE CLKBR5
5956 KBDDEF: .BYTE 0         ;DEFAULT VIDEO SOURCE FOR THIS KBD WHEN LOOKING AT ANOTHER
5957 KBDCNT: .BYTE 0         ;COUNTDOWN UNTIL RESET TO DEFAULT VIDEO SOURCE, OR -1
5958         .=.+<<MAXKBD-1>*2>
5959
5960
5961 ;CLOCK QUEUE
5962
5963 CLOCKF: 0       ;CLOCK QUEUE FREE LIST
5964 CLOCKQ: 0       ;FIRST ENTRY ON CLOCK QUEUE
5965 CQUEUE: .=.+<CQLEN*NCQSLT>
5966
5967 ;MISCELLANEOUS VARIBLES
5968
5969 FSP:    0       ;POINTS TO LEBUFS FREE SPACE
5970 OLDKMA: 0       ;LAST KMA
5971 BLINK:  0       ;TV-BUFFER # OF NEXT GUY TO BLINK.  ALSO, COUNTS CLOCK TICKS
5972                 ; UNTIL NEXT BLINK.  IT'S PRETTY KLUDGEY, SEE CODE AT CLKLOP.
5973 FBLINK: BLKVAR  ;LIST OF FREE BLINKERS
5974 TICKS:  0       ;HIGH ORDER OF TIME
5975 TICKS1: 0       ;LOW ORDER OF TIME
5976 SSCC:   .BYTE 0 ;SEMI-SLOW CLOCK COUNTER (WRAPS AROUND EVERY 256./60. SEC)
5977         .BYTE 0 ;UNUSED
5978 QPYSWT: 0       ;INTER LOCK TO SAVE COPY PAPER
5979 BUZSWT: 0       ;INTERLOCK FOR BUZZING 9TH FLOOR DOOR
5980 ELESWT: 0       ;INTERLOCKING THE ELEVATOR
5981 RADIX:  0       ;HOLDS OUTPUT RADIX
5982 VERSE:  %FNAM2  ;SOURCE FILE VERSION #
5983 KBDACT: 0       ;KEYBOARD ACTIVE LIST (NOT YET SEEN BY PDP-10)
5984 KBDLAST:0       ;POINTS TO LAST BUFFER ON ACTIVE LIST
5985 KBDTSW: 0       ;NON-ZERO => EXAMINE KBDCNT ARRAY AT SSC LEVEL.
5986 WHOTIM: 0       ;LAST TIME WE DID WHO LINES
5987 WHOFLG: 0       ;DO WHO LINES FLAG
5988 DPYFRE: 0       ;DPY # OF FREE-CONSOLE CHANNEL.
5989 TYMSHR: 0       ;# CLOCK TICKS TO GO BEFORE CHECKING NEXT DPY CHANNEL
5990
5991 ;PATCH AREA
5992 PATCH:  .=.+PATL
5993
5994 ;******* TEMPORARY VARIABLES FOR FONT CHECKSUMS *******
5995 CKSPNT: 0       ;RUNNING POINTER
5996 CKSSUM: 0       ;RUNNING CHECKSUM
5997 CKSSMG: 0       ;GOOD CHECKSUM OF [FNTORG,FNTEND)
5998
5999 ;LINE EDITOR BUFFER RINGS
6000
6001 TENWRD
6002 NLBUFS==<RUGSA-.>/<LHLEN+LBLEN>
6003
6004 .IIF LT NLBUFS-<MAXTV*2>, .ERROR NOT ENOUGH LEBUFS
6005 REPORT NLBUFS=,\NLBUFS
6006
6007 LEBUFS: .=.+<NLBUFS*<LHLEN+LBLEN>>
6008
6009 REPORT HIGHEST USED=,\.
6010
6011 .END    GO