2 ;;; Copyright (c) 1999 Massachusetts Institute of Technology
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.
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.
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.
19 .SBTTL MACROS AND CONDITIONAL ASSEMBLY
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
28 FONTSW==1 ;COMPILE FONTS
29 FONTMS==0 ;USE MACROS TO COMPILE FONTS
35 C=%2 ;C, T, AND TT ARE TEMPORARIES
38 U=%5 ;LINE EDITOR OR PAGE PRINTER
42 .XCREF A,B,C,T,TT,U,SP,PC,...,....
44 .IIF E FONTSW,.TITLE TV NOFONTS
49 .NLIST ;WE'RE ONLY INTERESTED IN FONTS
51 .PRINT /THIS ASSEMBLY WILL TAKE FOREVER!
69 .MACRO REPORT TEXT,NUM
109 .IIF NE .&3,.=<.&177774>+4
113 .MACRO CHECK TAG,LENGTH
115 .IF NE .-<TAG>-<LENGTH>
116 .ERROR TAG WRONG LENGTH
152 .MACRO CONC A,B,C,D,E,F,G,H,I
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
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
171 channel header pointer (location 40, read only)
173 ADDRESS(channel header area)
174 ADDRESS(pointer area)
176 source file version number
178 INITED non-zero indicates PDP-11 is running ok(can be cleared by PDP-10)
180 GDOWN used as flag by PDP-10 to acknowledge clear of INITED
181 channel header area (aligned on PDP-10 word)
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
199 format of KBD buffer (aligned on PDP-10 word)
201 KBDSTS negative=>-(data byte count), 0=>free
203 KBDRNG next KBD buffer associated with this KBD
204 KBDLST next buffer on activated list (0=>end of chain)
205 KBDCHN keyboard channel
207 KBDATA key board data area (1 PDP-11 word/character)
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).
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
216 DPYLGL last legal address in this buffer
217 DPYSIZ size of data area in bytes
219 DPYATA display data area (1 PDP-11 byte/character)
221 format of pointer area (aligned on PDP-10 word)
223 ADDRESS(system who line variables)
224 ADDRESS(PDP-10/PDP-11 communication area)
225 TENWHO -1=>PDP-10 should update who lines
227 SYMTAB BEGINNING OF TABLE OF SWITCHES WHICH 10 ACCESSES.
231 1. All addresses and pointers are in PDP-11 address space.
233 2. KBD buffers are ringed two per channel. While the PDP-10 is
234 emptying one, the PDP-11 can fill the other.
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.)
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)
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
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
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
274 WHUNAM uname in sixbit (left 18 bits in first two words, right in next two)
278 WHJNAM jname in sixbit
282 WHSNAM sname in sixbit
286 WHSTAT status in sixbit, 0=>job does not exist
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
295 NOTE: The PDP-11 will not update who lines until it sees that ITSTIM
298 PDP-10/PDP-11 COMMAND CHANNEL
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
306 CMDBUF each arg takes 4 bytes (1 PDP-10 word)
308 PDP-10/PDP-11 COMMANDS
311 arg1: video switch input # (set by PDP-10)
312 arg2: video switch output # ( " " " " )
315 arg1: DPY reserved (set by PDP-11)
318 arg1: DPY to free (set by PDP-10)
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)
329 arg1: audio switch input # (set by PDP-10)
330 arg2: audio switch output # (set by PDP-10)
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)
340 ;other 10-11 commuincation issues ..
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)
346 ;console scroll register 6/23/74
348 CSA==157776 ;selects where video scan starts in video buffer
350 __|_____|_____|_____|_____|_____|
353 |_____|_|_______________________|
355 | | |----------------->scroll offset (start video scan at n*4 PDP-11 words from TVLO)
357 | |------------------------------->black on white bit (1=>black on white)
359 |----------------------------------->not used
363 ;console register 6/24/74
365 CREG==164044 ;selects video buffer memory
367 __|_____|_____|_____|_____|_____|
370 |_______________|_______________|
372 | |-------------->console # (TVLO-TVHI on unibus is video bit map)
374 |------------------------------>ALU function
378 VSW==164060 ;sets video switch
380 __|_____|_____|_____|_____|_____|
382 | 3 | 2 | 3 | 4 | 4 |
383 |_____|___|_____|_______|_______|
385 | | | | |---------->video source
387 | | | |------------------>not used
389 | | |------------------------->| |card section
391 | |------------------------------>| |card select
393 |----------------------------------->switch section number
398 ASW==170670 ;SETS AUDIO SWITCH. (this is a write-only memory.)
400 __|_____|_____|_____|_____|_____|
402 | 2 | 3 | 3 | 4 | 4 |
403 |___|_____|_____|_______|_______|
405 | | | | |---------->audio source
407 | | | |------------------>not used
409 | | |------------------------->| |card section (complemented)
411 | |------------------------------->| |card select
413 |------------------------------------>not used
415 ASWXOR==1617 ;complemented fields of ASW.
417 keyboard multiplexor 3/15/74
419 KBDPC==340 ;interrupt vector
420 KBDLVL==5_7 ;interrupts on level 5
422 KMS==164050 ;keyboard status
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
435 | | | | | | | | | |----------------->direct memory access enable
437 | | | | | | | | |------------------->waiting to hack memory
439 | | | | | | | |--------------------->8th floor elevator
440 | | | | | | |----------------------->9th floor elevator
442 | | | | | |------------------------>extra OC output, pin BBF1.
444 | | | | |--------------------------->buzz the 9th floor door (dip relay)
446 | | | |----------------------------->generate copy from second source(currently not
448 | | |------------------------------->generate copy from first source
450 | |--------------------------------->ready line
452 |----------------------------------->waiting to interrupt
454 KMA==165052 ;keyboard memory address register
456 __|_____|_____|_____|_____|_____|
459 |_________________|_________|___|
463 | |------------>binary counter (overflow lost)
465 |------------------------->buffer origin
467 ;keyboard multiplexor 3/15/74
468 ;format of data written into memory (each record is two words)
472 __|_____|_____|_____|_____|_____|
474 |1|1| 2 | 2 | 2 | 2 | 6 |
475 |_|_|___|___|___|___|___________|
477 | | | | | | |--------->key struck
479 | | | | | |----------------->shift (7-left, 6-right)
481 | | | | |--------------------->top (9-left, 8-right)
483 | | | |------------------------->control (11-left, 10-right)
485 | | |----------------------------->meta (13-left, 12-right)
487 | |-------------------------------->shift lock
489 |---------------------------------->always 1
493 __|_____|_____|_____|_____|_____|
496 |___|___________|_______________|
498 | | |----------->high order bits of character (ignored)
500 | |------------------------->console number
502 |--------------------------------->always 0
506 ;CHARACTER FORMAT WRITTEN BY KBD MULTIPLEXOR
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
516 ;XTAB BITS USED FOR XTAB LOOK UP
519 XSLBIT==200 ;SHIFT LOCK
522 ;POSITION OF META BITS, ASCII COMPATIBLE
524 ACTBIT==SNB ;CAUSES CHARACTER TO ACT AS ACTIVATOR
527 ASHBIT==XSHBIT_3 ;SHIFT
528 ASLBIT==XSLBIT_3 ;SHIFT LOCK
529 ATPBIT==XTPBIT_3 ;TOP
530 ACMBIT==AMTBIT+ACLBIT ;CONTROL AND META TOGETHER
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
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
551 NXMPC== 4 ;BUS ERROR VECTOR
553 RESPC== 10 ;RESERVED INTRUCTION VECTOR
555 BPTPC== 14 ;BREAK POINT VECTOR
557 IOTPC== 20 ;IOT VECTOR
559 PWRPC== 24 ;POWER FAIL TRAP VECTOR
561 EMTPC== 30 ;EMULATE TRAP VECTOR
563 TRPPC== 34 ;TRAP INSTRUCTION VECTOR
565 TYIPC== 60 ;TTY INPUT INTERRUPT VECTOR
567 LKPC== 100 ;LINE CLOCK INTERRUPT VECTOR
569 KLIPC== 320 ;KL11 INPUT INTERRUPT VECTOR
571 KBDPC== 340 ;KEYBOARD MULTIPLEXOR INTERRUPT VECTOR
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)
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
593 .EXPUNGE DIV,MUL,ASH ;THESE ARE PREDEFINED AS 11/45 INSTRUCTIONS.
594 DIV== 177300 ;EAE GOODIES
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
613 ;TEN/11 COMMUNICATIONS AREA
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
620 INITED==52 ;INITED FLAG, SET BY 11 CLEARED BY 10
622 GDOWN==56 ;INTERLOCKS WITH INITED, CLEARED BY 11 SET BY 10
624 ;CONSOLE REGISTER FUNCTIONS
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
649 ;MISCELLANEOUS ASSIGNMENTS
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
691 .SBTTL GO CODE, PDL, AND KBD BUFFER
695 ;PUSH DOWN LIST AND KEYBOARD BUFFER
698 .IIF NE .&177,.=<.&177600>+200 ;ALIGN ON 200 BYTE BOUNDARY
707 GO: RESET ;IN THE PRIVACY OF YOUR OWN HOME
709 MOV #PDBUF,SP ;SET UP PUSH DOWN POINTER
710 MOV #ERRLVL,C ;ALL PROCESSOR TRAPS GO ON 7
712 MOV #NXMBRK,(B)+ ;BUS TIME OUT
714 MOV #RESBRK,(B)+ ;RESERVED INSTRUCTION
716 MOV (B),T ;BREAK POINT
721 MOV #IOTBRK,(B)+ ;IOT TRAP
723 MOV #PWRBRK,(B)+ ;POWER FAILURE
725 MOV #EMTBRK,(B)+ ;EMT
727 MOV #TRPBRK,(B)+ ;"TRAP" TRAP (LEV 7)
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
735 MOV C,(B)+ ;NON-ZERO SUFFICES
737 MOV #CLKBRK,LKPC ;CLOCK
739 MOV #KBDBRK,KBDPC ;KBD
741 MOV #BPT,0 ;CATCH JUMPS TO ZERO.
745 ;INITIALIZE VARIBLES FALLS THROUGH
754 MOV #140,KMS ;KEYBOARD MULTIPLEXOR
759 MAIN: MOV #MAXTV-1,U ;CHANNEL
760 CMP WHOTIM,ITSTI1 ;TIME FOR WHO LINES?
762 ZAPFLG WHOFLG ;TRIGGER WHO LINES
764 BEQ GO ;RESET THE WORLD
766 BLT GO2RUG ;SWITCH 15 => GO TO RUG
768 MOV CMDFLG,A ;PDP-10 GIVING COMMAND?
771 JSR PC,TENCMD ;PROCESS THE COMMAND
774 BGE MAIN1 ;CYCLED THROUGH ALL CHANNELS?
775 CLR WHOFLG ;TURN OFF WHO LINES
781 ;HERE TO RESTART, NOTIFY THE PDP-10
790 TST GDOWN ;WAIT FOR THE PDP-10 TO REPLY
794 .SBTTL INITIALIZATION
798 ;******* TEMPORARY CODE FOR FONT CHECKSUM *******
807 ;******* END OF TEMPORARY CODE *******
823 JSR PC,REASW ;FEED EVERY SPEAKER SILENCE.
825 MOV #LEBUFS,U ;INITIALIZE FREE LIST OF 11-TO-10 INPUT BUFFERS.
829 ADD #<LHLEN+LBLEN>,TT
834 CLR LHFS(U) ;END OF LIST
839 MOV #-1,T ;SET UP BELL COUNTS
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?
851 MOV ITSTDP,ITSFDP ;# FREE DPY'S
853 MOV #MAXBLK,B ;PUT ALL BLINKER BLOCKS ON THE FREE BLINKERS LIST.
863 CLR <BLNEXT-BLLEN>(U)
868 INIT2: MOV DPYCHN(T),U
869 JSR PC,CHCLR ;SET UP THAT CHANNEL
874 MOV #-1,(C) .SEE WHJOB
878 BGE INIT2 ;MORE DPY CHANNELS TO SET UP?
881 JSR PC,CHCONS ;GET A CHANNEL FOR THE FREE SCREENS.
883 BEQ .+4 ;THIS SHOULD ALWAYS GIVE US CHANNEL 0.
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
891 TYPOUT </TV's ready, but not in operation
893 MOVB LECREG(U),C ;DPY
895 MOV #MAXVSO-1,B ;SWITCH TO ALL OUTPUTS
896 INIT1: MOV DPYVSW(C),TT ;VIDEO SWITCH INPUT
897 MOV B,T ;SWITCH OUTPUT
902 MOV #MAXKBD,A ;CLEAR KBDLE
911 MOV #NCQSLT-1,C ;INITIALIZE CLOCK QUEUE
923 MOV CREG,T ;SEED QUEUE WITH GLITCH CONSOLE FREE
929 .SBTTL MAIN PROGRAM LEVEL ROUTINES
931 ;HERE TO GET CHARACTER FROM OPEN CHANNEL
932 ;LOOPS UNTIL NO MORE CHARACTERS AVAILABLE
934 DPYDPY: TSTB CHNUSE(U)
935 BLE DPYD5 ;IGNORE FREE DISPLAYS.
936 PUSH U ;DPY CHANNEL NUMBER
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
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?
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.
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
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
973 JSR PC,GETCHR ;NO, GET NEXT CHARACTER
974 BNE DPYDP1 ;AND LOOP BACK TO PROCESS IT
976 POP T ;DONE WITH THIS DPY FOR NOW
977 BLKON T ;ALLOW BLINKERS TO BLINK AGAIN
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).
985 BLT DPYFLS ;FLUSH DPY CHANNEL?
987 BEQ DPYD2 ;CAUSE PSEUDO ACTIVATION?
992 MOV KBDACT,LELIST(TT) ;PUT LINE EDITOR ON ACTIVE RING
1001 DPYD1: CLR ECOFLG(B)
1002 DPYD2: TST WHOFLG ;DO WHO LINES?
1006 BMI DPYD4 ;DON'T DO WHO LINE, BUT MIGHT WANT TO CLEAR IT
1008 BMI DPYD4 ;USER WHO MODE VAR CAN ALSO DISABLE WHO LINE
1009 JSR PC,DOWHO ;DO THE WHO LINE FOR THIS GUY
1013 ;HERE IF NO WHO LINE IS TO BE DONE, WE MIGHT WANT TO CLEAR IT
1015 DPYD4: MOV WHOLIN(B),T
1016 TST 2(T) ;IF NEGATIVE, THEN CLEAR IT
1018 CLR 2(T) ;ZAP THE SWITCH
1019 JSR PC,ZAPWHL ;CLEAR THE LINE
1022 ;HERE TO FLUSH DPY CHANNEL
1025 TSTB CHNUSE(T) ;ALREADY FREED?
1026 BEQ DPYD3 ;YES, THIS MEANS MAIN LOOP SHOULD SIMPLY IGNORE THIS DPY.
1032 ;HERE IF CONTROL CODE FOUND
1035 DPYCTL: BIC #177600,A ;DISPATCH ON CONTROL CODE
1037 BLOS DPYTVO ;BRANCH IF ILLEGAL CODE
1039 PUSH #DPYXIT ;MAKE THE RETURN ADDR BE "DPYXIT"
1040 JMP @CTLTAB(A) ;SO GETCHC COROUTINING WILL WORK.
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.
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)
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)
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
1077 .SBTTL WHO LINE ROUTINES
1079 ;PRINTS WHO LINE, TAKES 10/11 CHANNEL IN B
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
1087 MOV #WHOPP,U ;SET UP PAGE PRINTER INDEX
1089 MOV #CHRLN,B ;CHARACTER Y, PAST LAST LINE
1091 MOV (SP),B ;RESTORE 10/11 CHANNEL INDEX
1093 TST WHO1(A) ;SIGN OF .WHO1 VARIABLE INHIBITS ALL HACKERY
1094 BPL .+4 ;ASSUME USER HAS STUFF THERE AND SHOULDN'T CLOBBER IT.
1096 JSR PC,ZAPWHL ;CLEAR OUT THE WHO LINE
1097 WHINIT: MOV (SP),B ;10/11 CHANNEL INDEX
1099 CMP #NWHCMD-1,WHMODE(TT)
1100 BHI DATIME ;NO VERSION NUMBER FOR USER WHO LINE
1102 DECTYP ITSVER ;TYPE VERSION NUMBER
1106 TYPOUT /BEING DEBUGGED /
1108 ;TYPES DAY TIME AND DATE
1110 DATIME: MOV ITSDAT,A ;PRINT PACKED DATE FIRST
1111 JSR PC,DATTYP ; 7 BITS YEAR, 4 MONTH, 5 DAY
1116 JSR PC,TIMTY1 ;TYPE DAY TIME NEXT
1118 POP B ;10/11 CHANNEL
1120 CMP #NWHCMD-1,WHMODE(TT)
1121 BHI UWHLDO ;DO USER WHO LINE?
1124 ;ITS XXX {BEING DEBUGGED} MM/DD/YY HH:MM:SS ITSFDP/ITSTDP USR RU/JOB SHARE SWBJ JWP TRC/COR CFU
1126 SWLDO: TYPOUT /TVS: /
1127 DECTYP ITSFDP ;# FREE DPYS
1129 DECTYP ITSTDP ;TOTAL DPYS
1131 DECTYP ITSUSR ;# SYSTEM USERS
1133 DECTYP ITSRU ;RUNABLE JOBS/
1135 DECTYP ITSJOB ;# SYSTEM JOBS
1137 DECTYP ITSFSH ;FAIR SHARE IN %
1139 DECTYP ITSWBJ ;SWAP BLOCKED JOBS
1141 DECTYP ITSJWP ;JOBS WAITING FOR PAGES
1143 DECTYP ITSTRC ;RUNABLE CORE
1145 DECTYP ITSCOR ;TOTAL CORE
1147 DECTYP ITSCFU ;CORE FOR USERS
1151 ;MM/DD/YY HH:MM:SS JOB UNAME JNAME SNAME STATUS J%RT HH:MM:SS.S JCORE {USER VARS}
1153 WHNOJB: TYPOUT / JOB SLOT VACANT/ ;HERE IF JOB SLOT VACANT
1156 UWHLDO: OCTYPE WHJOB(TT) ;JOB #
1158 BEQ WHNOJB ;VACANT JOB SLOT?
1162 JSR PC,SIXPNT ;UNAME
1164 JSR PC,SIXPNT ;JNAME
1166 JSR PC,SIXPNT ;SNAME
1168 JSR PC,SIXPNT ;STATUS
1170 DECTYP WHJ%RT(TT) ;JOB % RUN TIME
1172 DECTYP ITSFSH ;OUT OF FAIR SHARE
1175 MOV WHJTRT(TT),A ;JOB RUNTIME IN .1-SEC TICKS
1178 DECTYP WHRPAG(TT) ;# PAGES REAL CORE
1180 DECTYP WHTPAG(TT) ;# PAGES OF VIRTUAL CORE
1184 MOV WHO1(TT),A ;PRINT FIRST USER WHO VAR
1187 MOV WHO1A(TT),A ;MAYBE PRINT SPACE
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
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
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
1203 ASR A ;GET FIRST MODE
1206 JSR PC,UWVDO4 ;PRINT FIRST HALF
1211 JSR PC,TVOMSK ;SEPARATOR CHAR(S)
1212 UWVDO3: JSR PC,TVOMSK
1213 UWVDO1: BITB #100,1(SP)
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
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
1231 ;USER-CONTROLLED WHO-LINE FIELD PRINT-OUT ROUTINES.
1263 ;SOME WHO LINE UTILITY ROUTINES
1274 ;TAKES POINTER TO SIXBIT IN T AND TYPES IT (ADVANCING T)
1276 SIXPNT: JSR PC,SIXPN1 ;DO TWO SETS OF THREE CHARS
1277 SIXPN1: MOV #MUL,B ;DO ONE SET OF THREE CHARS
1279 CMP (T)+,(T)+ ;BAG BITING EAE HAS TO LOADED IN JUST THE RIGHT ORDER
1280 MOV -(T),-(B) ;LOW ORDER FIRST
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
1292 MOV #6,(C) ;NEXT CHARACTER INTO AC
1295 ;TAKES TENTHS OF SECONDS IN A AND PRINTS AS HH:MM:SS.T
1300 MOV #10.,-(T) ;DO DIVIDE
1302 PUSH (T)+ ;TENTH'S OF SECONDS
1304 ASL A ;# HALF SECONDS JOB HAS BEEN RUNNING
1305 JSR PC,TIMTYP ;TYPE TIME
1308 POP A ;TENTH'S OF SECONDS
1311 ;TAKES # HALF SECONDS IN A AND TYPES TIME IN HH:MM:SS FORMAT
1316 ;TAKE # HALF SECONDS IN EAE AC-MQ AND TYPE AS HH:MM:SS
1317 TIMTY1: MOV #120.,-(B) ;MINUTES SINCE MIDNIGHT
1319 PUSH (B) ;REMAINDER IS SS*2
1322 MOV #60.,-(B) ;HOURS SINCE MIDNIGHT
1324 PUSH (B)+ ;REMAINDER IS MM
1327 MOV #':,C ;COLON SEPARATES GOODIES
1329 JSR PC,MSDPNT ;PRINTS COLON AND PADS WITH LEADING ZERO IF NECESSARY
1332 MOV C,A ;PRINT SEPARATING CHARACTER
1335 BLE MSDPN1 ;PAD WITH LEADING ZERO?
1339 JMP DECPNT ;PRINT NUMBER
1341 ;TAKE DATE PACKED AS 7 BITS YEAR, 4 MONTH, 5 DAY AND PRINT AS MM/DD/YY
1355 JSR PC,DECPNT ;PRINT MONTH
1356 MOV #'/,C ;USE SLASH AS SEPARATOR
1358 JSR PC,MSDPNT ;PRINT DAY
1360 JMP MSDPNT ;PRINT YEAR
1363 .SBTTL PDP-10 COMMAND PROCESSOR SWITCH VIDEO SWITCH, ETC.
1365 TENCMD: CMP #MAXCMD,A ;LEGAL COMMAND?
1366 BLOS TENCFL ;NO, COMMAND FAILS
1367 ASL A ;BYTES FOR DISPATCH
1370 ;PDP-10 COMMAND DISPATCH
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
1381 ;HERE TO SWITCH VIDEO SWITCH
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.
1389 TENCSD: MOV #-1,CMDFLG ;COMMAND SUCCEEDS
1392 ;SWITCH AUDIO SWITCH UPON COMMAND FROM PDP-10
1394 TENASW: MOV CMDBUF,TT ;SWITCH INPUT
1395 MOV CMDBUF+4,T ;SWITCH OUTPUT
1397 JSR PC,ASWCMD ;SWITCH SWITCH, TESTING LEGALITY.
1398 BHIS TENCF1 ;JUMP IF THEY WERE ILLEGAL, TO SAY COMMAND FAILED.
1401 ;HERE TO CONS UP DPY FOR PDP-10
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.
1407 JSR PC,CHCONS ;GET A CHANNEL, CONNECT IT TO THAT KEYBOARD.
1409 BLT TENCF1 ;CAN'T => COMMAND FAILS.
1410 MOVB LECREG(U),CMDBUF ;ELSE RETURN THE VIDEO BUFFER NUMBER
1412 MOV T,CMDBUF+4 ;AND THE 10-11 CHANNEL NUMBER (TTY NUMBER MINUS 52).
1416 TENCFL: CLR CMDFLG ;REPORT FAILURE OF A COMMAND TO THE TEN.
1419 ;HERE TO RETURN DPY ON COMMAND
1421 TENDPR: MOV CMDBUF,TT ;THE DPY TO RETURN
1423 TENDR0: CMPB CHCREG(T),TT ;WHICH CHANNEL DOES IT BELONG TO? GET # IN T.
1429 TENDR1: TST CHNUSE(T) ;DO NOTHING IF THE CHANNEL IS FREE.
1431 CHROFF ;OTHERWISE, FREE THAT CHANNEL.
1435 ;HERE RETURN STATE OF VIDEO SWITCH
1437 TENRVS: JSR PC,SWTARG ;SET UP 10-11 CHANNEL ARGUMENT
1438 BLOS TENCFL ;ILLEGAL ARG MAKES COMMAND FAIL
1440 RVSDSP: TENCFL ;0 IS ILLEGAL
1441 RVSCHN ;1 10/11 CHANNEL #
1443 RVSOUT ;3 VIDEO SWITCH OUTPUT #
1444 NSWTRG==<.-RVSDSP>/2
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
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
1456 RVSCHN: JSR PC,CHNKBD ;HERE GIVEN 10-11 CHANNEL #; GET KBD # IN T
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
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.
1466 RVSDF: ASL T ;MAKE IT BYTE INDEX
1467 BMI RVSNL ;NEGATIVE IF NOT LOGGED IN
1469 BEQ RVSNL ;KBD NOT LOGGED IN, ITS THE DEFAULT
1470 RVSDF1: MOVB LECREG(U),TT ;THE REGISTER HE HACKS
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
1478 RVSNL: MOV DPYCHN,U ;CHANNEL 0 IS CONSOLE FREE CHANNEL
1479 BR RVSDF1 ;AND BACK INTO MAIN STREAM
1481 ;GIVEN 10/11 CHANNEL # AND RETURNS KBD IN T
1483 CHNKBD: MOV CMDBUF+4,T ;PICK UP CHANNEL #
1486 ASL T ;MAKE CHANNEL # INTO INDEX INTO CHANNEL TABLES
1488 TST CHNCLS(T) ;MAKE SURE CHANNEL IS OPEN
1490 MOVB DPYKBD(T),T ;PICK UP KBD #
1491 CHNKB1: CMP #MAXKBD,T ;FIX CONDITION CODES FOR SUCCESSFUL RETURN
1494 CHNKB3: MOV #MAXKBD+1,T ;HERE IF CHANNEL CLOSED
1495 BR CHNKB1 ;CONS UP ILLEGAL KBD #
1497 CHKKBD: MOV CMDBUF+4,T ;CHECK FOR REASONABLE KBD #
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
1503 SWTARG: MOV CMDBUF,T ;ARGUMENT TYPE
1504 BPL .+4 ;MAKE SURE WE HAVE A POSITIVE #
1506 ASL T ;MAKE IT INTO A BYTE INDEX
1507 CMP #NSWTRG*2,T ;TEST FOR LEGAL
1510 ;HERE RETURN STATE OF AUDEO SWITCH
1512 TENRAS: JSR PC,SWTARG ;SET UP 10-11 CHANNEL ARGUMENT
1513 BLOS RASLOS ;ILLEGAL ARG MAKES COMMAND FAIL
1515 RASDSP: TENCFL ;0 IS ILLEGAL
1516 RASCHN ;1 10/11 CHANNEL #
1518 RASOUT ;3 AUDEO SWITCH OUTPUT #
1519 .IIF NZ .-<NSWTRG*2>-RASDSP,.ERROR RASDSP AND RVSDSP DIFFER.
1521 RASCHN: JSR PC,CHNKBD ;GIVEN A 10-11 CHANNEL #; GET KBD # IN T
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.
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.
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
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
1540 .SBTTL ERROR TRAPS HERE
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.
1553 BPTBRK: .REPT 7 ;SAVE THE ACS
1554 MOV %0+.RPCNT,BPTACS+<2*.RPCNT>
1556 MOV #INITED-2,A ;TELL THE 10 WE'RE DOWN
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.
1567 MOV BPTACS+<2*.RPCNT>,%0+.RPCNT
1573 .SBTTL CLOCK ROUTINES CAUSE BLINKING
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.
1600 ;******* END OF TEMPORARY CODE *******
1602 ADD #1,TICKS1 ;INC DOES NOT AFFECT C-BIT (SIGH)
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
1609 CLR KBDLAST ;POINTS TO END OF ACTIVE CHAIN
1611 ;CLOCK QUEUE DISPATCH
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.
1621 CLKBR3: PUSH CLOCKQ ;CDR THE CLOCK QUEUE
1623 JSR PC,@(T)+ ;CALL CLOCK LEVEL ROUTINE, T POINTS TO ARGUMENT
1625 MOV CLOCKF,(T) ;PUT OLD SLOT ON FREE LIST
1627 BR CLKBR1 ;CHECK AGAIN IF SOMETHING STILL ON QUEUE
1643 MOV BLINKS(T),T ;BLINK CHAIN FOR THIS DPY
1645 CLKLOP: MOV BLCURS(T),U ;CURSOR TO BLINK
1647 COMB BLON(T) ;CHANGE STATE OF BLINK
1650 CLKBR4: POP MQ ;CLOCK RETURN
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
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.
1673 RPT1: MOV LELSTA(U),A
1682 ;COME HERE EVERY 256./60. = 4.27 SECONDS FOR SEMI-SLOW CLOCK
1686 PUSH #69. ;FOR DEBUGGING
1690 MOV #KBDDEF+<2*MAXKBD>,T
1694 CLKBR5: CMP #KBDDEF-2,T
1696 TST -(T) ;FAST LOOP LOOKING FOR ANY KEYBOARD
1697 BGE CLKB10 ; NEEDING ITS CONSOLE'S VIDSW INPUT RESET
1700 BGE CLKBR9 ;NOT TIME TO RESET THIS SCREEN YET
1702 SUB #KBDDEF,C ;C HAS 2*KBD NUMBER, FOR VSWDEF.
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
1710 SSCRET: CMP (SP)+,#69. ;IS STACK SCREWED?
1714 POP C ;SEMI-SLOW CLOCK RETURN
1719 ;CLEARS ALL BLINKERS ON THIS DPY
1727 CLBL0: TSTB BLON(T) ;BLINK ON?
1732 CLBL1: MOV BLNEXT(T),T
1737 ;CLOCK QUEUE ROUTINES
1739 ;ADQUE CALLED WITH ARG IN T, THE CALLING SEQUENCE IS:
1743 ; ROUTINE TO CALL AT CLOCK LEVEL
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
1751 ADD (TT)+,(T)+ ;TIME TO CALL ROUTINE
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
1767 CMP (T)+,(TT)+ ;LOW ORDER
1769 ADQUE3: MOV @(SP),(SP) ;CDR THE QUEUE
1772 ;HERE TO SPLICE ENTRY INTO CLOCK QUEUE
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
1780 ;HERE FOR NO FREE CLOCK QUEUE SLOTS
1782 ADQFL: CMP (TT)+,(TT)+ ;SKIP OVER ARGS
1783 POP T ;CLEANSE STACK
1786 ;THIS CAUSES CONSOLE FREE DPY TO GLITCH
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?
1801 BIC #-1#<-BOWBIT>,(SP)
1807 ;HERE TO RING BELL ON DPY
1811 MOVB T,TT ;DOUBLE TV BUFFER # FOR BYTE INDEX
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
1824 ;HERE IF NO BELLS PENDING, FLASH SCREEN RIGHT AWAY, ADD CLOCK QUEUE ENTRY
1826 BELL0: JSR PC,BOWXOR ;FLASH THE SCREEN NOW!
1827 JSR PC,BELL1A ;ADD CLOCK QUEUE ENTRY
1833 ;CLOCK LEVEL BELL ROUTINE
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 #
1841 DEC BELCNT(T) ;WE JUST DID THAT ONE
1842 BMI BELL1B ;ANY MORE PENDING?
1843 JSR PC,BELL1A ;YES, PUT ANOTHER ON QUEUE
1847 BELL1A: MOV CREG,T ;PUT ANOTHER BELL ON CLOCK QUEUE
1853 .SBTTL KEYBOARD INTERRUPT ROUTINES
1855 ;KEYBOARD BREAK ROUTINES THE LINE EDITOR RUNS AT THIS LEVEL
1857 KBDBRK: JSR U,ACSAV ;PUT AC'S ON STACK
1861 KBDLOP: MOV OLDKMA,A
1862 CMP #KBDEND,A ;CHECK WRAP AROUND
1866 BEQ KBDRET ;NO MORE CHARACTERS
1867 MOV (A)+,B ;RAW CHARACTER
1869 MOVB (A)+,-(SP) ;KEYBOARD #
1872 ;GET ASCII REPRESENTATION OF CHARACTER
1873 ; ASCII CODE IN A, META BITS IN B
1875 MOV B,C ;TWO COPIES OF RAW CHARACTER
1876 BIC #RCHAR,B ;KEY STRUCK
1881 KBDX1: BIT #RSLBIT,C ;SHIFT LOCK?
1884 BIT #RSHBIT,C ;SHIFT?
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
1892 BIT #RMTBIT,C ;META?
1895 BIT #RCLBIT,C ;CONTROL?
1898 MOVB (SP)+,C ;KEYBOARD #
1899 ASL C ;BYTE FOR INDEX INTO KBDLE
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,
1906 JSR PC,VSWUNS ;UN-SPY IT IMMEDIATELY.
1907 KBDUN1: MOV KBDLE(C),U ;ASSOCIATED LINE EDITOR?
1909 TST LERPT(U) ;IF THE REPEAT KEY IS IN EFFECT,
1910 BEQ KBDUN2 ;TURN IT OFF, AND FLUSH THIS CHARACTER.
1914 KBDUN2: MOVB LECREG(U),CREG ;SET UP CONSOLE REGISTER
1915 BIS #ACTBIT,B ;FEED THIS CHAR TO THE PDP-10
1932 ;NON-ASCII CHARACTERS COME HERE
1937 NONAS1: BPT ;ILLEGAL CHARACTER
1938 CMP #<MAXKBD*2>,C ;C HAS BEEN DOUBLED
1943 JSR PC,@NASCTB(A) ;DISPATCH TO ROUTINE
1946 ;PROCESS ESCAPE AND BREAK COMMANDS
1948 ESCBRK: JSR PC,UPPER ;CONVERT LOWER CASE TO UPPER CASE
1950 ESCBR1: CMPB (T),A ;MATCH?
1952 TSTB (T)+ ;END OF TABLE?
1954 ESCBR2: CLRB KBDESC(C) ;NO COMMAND
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
1962 ASL T ;MAKE A WORD INDEX.
1963 JSR PC,@ESCTAB(T) ;C MUST BE KBD #, SOME ESCAPE ROUTINES RELY ON IT
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
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.
1976 BRKCLX: TST (SP)+ ;FLUSH RETURN POINTER TO JBDLOP
1977 JMP KBDUN3 ;AND GO GIVE CHARACTER TO TEN.
1991 .SBTTL 10/11 INPUT/OUTPUT ROUTINES
1993 ;HERE TO COMPLEMENT STATE OF BOW BIT WHEN PDP-10 FALLS BEHIND ON KBD
1995 SLOW10: MOVB LECREG(U),CREG
1999 ;PUT CHARACTER WHICH IS A OR'D WITH B INTO BUFFER. ACTIVATES IF
2000 ; 1 FINDS ACTIVATION CHARACTER
2002 ;A AND B ARE SAVED IN LELSTA AND LELSTB IN CASE THE USER DECIDES
2003 ;TO REPEAT THE CHARACTER.
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?
2011 BEQ SLOW10 ;NOPE, DO SOME ERROR CHECKING
2012 BPT ;LOSE IF LESS THAN NO ROOM
2014 PUTCH2: MOV A,@LECHR(U)
2019 DEC LEFREE(U) ;BUFFER FULL?
2021 BEQ .+4 ;WE MUST ACTIVATE ANYWAY
2024 TST LHQUED(T) ;IF ALREADY QUEUED TO ACTIVATE,
2025 BEQ ACTIVA ; DON'T ACTIVATE NOW
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
2036 ;HERE TO ACTIVATE BUFFER
2038 ACTIVA: SUB #LBCHRS,LEFREE(U) ;NEGATIVE OF ACTIVE CHARS
2040 BPT ;HAD BETTER BE NEGATIVE
2041 MOV LEBUF(U),T ;THE BUFFER TO ACTIVATE
2042 MOV LEFREE(U),LHFLAG(T) ;THAT ACTIVATES IT
2045 CLR LHALST(T) ;PUT THIS ONE AT END CHAIN
2049 BNE ACTIV0 ;EMPTY ACTIVATION LIST?
2050 MOV KBDLAST,KBDACT ;YES, MAKE ACTIVE LIST POINT TO THIS ONE
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
2056 MOV KBDACT,KBDFLG ;ACTIVATE THIS LIST
2057 CLR KBDACT ;AND PREPARE FOR NEXT
2061 MOV LHNEXT(T),T ;NEXT ON RING
2063 ADD T,TT ;FIRST FREE CHARACTER
2064 MOV T,LEBUF(U) ;NEW BUFFER
2065 TST (T)+ ;LHFLAG IS SET AT PUTCHR
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
2072 ;HERE AT CLOCK LEVEL TO ACTIVATE BUFFER
2076 MOV (T),U ;THE LINE EDITOR
2077 MOV LEBUF(U),T ;THE BUFFER
2080 BPT ;CAN'T ACTIVATE AN ALREADY ACTIVATED BUFFFER
2081 TST @LHNEXT(T) ;THE NEXT BUFFER
2082 BMI CLKAC1 ;ACTIVATE IF READY
2089 CLKAC1: JSR PC,QBFR ;NOT, READY TRY ANOTHER CLOCK TICK
2092 ;HERE IF NEXT BUFFER ON RING IS NOT FREE, TRY ACTIVATION AT NEXT CLOCK TICK
2094 QBFR: ZAPFLG LHQUED(T) ;SET FLAG THAT SAYS WE'RE QUEUED
2096 CHROFF ;INHIBIT INTERRUPTS WHILE WE DO THIS
2097 JSR TT,ADQUE ;PUT ON CLOCK QUEUE
2099 CLKACT ;CLOCK LEVEL ACTIVATION
2103 ;SAVE ALL ACS ON STACK
2110 PUSH U ;RETURN ADDRESS
2111 MOV 14(SP),U ;RESTORE U
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.
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?
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
2128 BCC GETCH1 ;BRANCH IF 0->3
2129 MOV DPY11B(U),TT ;OTHERWISE NEXT PDP10 WORD
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?
2135 MOV U,DPY11B(U) ;YES, RESET TO
2136 ADD #DPDATA+1,DPY11B(U) ;FIRST WORD OF DATA AREA, HIGH BYTE
2138 RTS PC ;RETURN CONDITION CODE 'NE'
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
2147 BIC #-400,A ;CLEAR EXTRA BITS DUE TO SIGN-EXTENSION
2150 GETCH2: MOV B,LESVB(U)
2155 BPT ;CALLER OF GETCHC HAD WRONG RETURN ADDRESS
2156 GETCH3: JMP DPYDX2 ;CEASE TYPING ON THIS TV FOR A WHILE
2158 .SBTTL DISPLAY FUNCTION (%TD, ETC) ROUTINES
2160 TVOMSK: BIC #177600,A ;HERE IF YOU DON'T TRUST THE HIGH BITS
2162 ;TYPE CHARACTER IN A AND ADVANCE OVER IT. PRESERVES A.
2164 TVO: JSR PC,GENCHR ;GENERATES CHARACTER AND ADVANCES CURSOR
2166 ;LEDADC ADVANCES LINE EDITOR CURSOR
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.
2172 ADD #20,LEPHS(U) ;HERE IF WE ARE ADVANCING TO A NEW WORD.
2174 CMP LECC(U),#TVCFENCE
2177 LEDAD1: SUB #CHRWD,LEPHS(U)
2182 ;RETREATS LINE EDITOR CURSOR
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.
2188 CMP #<20-CHRWD>,LEPHS(U)
2190 SUB #20,LEPHS(U) ;BACKUP A WORD IN DISPLAY
2194 BPT ;BACKING UP PAST BEGINNING OF SCREEN?
2197 ;HERE TO CRLF AND CLEAR EOL.
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.
2204 CRLF1: JSR PC,SCROLL ;MOVE EVERYTHING UP 4 LINES,
2205 JMP LF ;THEN MOVE DOWN 1 LINE.
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.
2214 POP LECC(U) ;THEN RESTORE POSITION (TO LAST LINE, USUALLY)
2218 SUB #4*BYTPL*LINHT,A ;AND MOVE UP 4 LINES (OR TO SCREEN TOP).
2223 SCROL1: MOV A,LELCC(U)
2224 SUB #4*BYTPL*LINHT,LECC(U)
2228 ;HERE TO BACKSPACE (NO-OP IF AT BEGINNING OF LINE)
2230 DPYBS: CMP LELCC(U),LECC(U)
2234 ;HERE TO HOME UP AND CLEAR SCREEN.
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)
2243 CMP #TVFENCE,LELCC(U)
2245 SUB #TVFENCE-TVLO,LELCC(U)
2246 SUB #TVFENCE-TVLO,LECC(U)
2251 HU: MOV #TVLO,LELCC(U) ;RESET POINTER TO CURRENT LINE BEGINNING.
2252 MOV #-NLINS,LEY(U) ;AND ITS POSITION ON SCREEN.
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
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"
2268 MOV #BYTPL*LINHT,MUL ;GET # LINES * BYTPL*LINHT, = # BYTES TO SHIFT BY.
2269 MOV LELCC(U),TT ;TT GETS ADDR OF THIS LINE.
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.
2279 ;CLEAR TEXT LINES FROM THE ONE T POINTS TO, TO END OF REGION IN B. PUTS CIOR IN CALU.
2281 BHIS LINSX ;POPJ, SETTING CALU TO CIOR.
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).
2289 BEQ LINSX ;DON'T WASTE TIME IF INSERTING 0 LINES.
2290 CMP A,#50 ;DELETING INFINITE LINES = CLEAREOF
2292 MOV #BYTPL*LINHT,MUL
2293 MOV #TVFENCE-<BYTPL*LINHT>,TT ;TT POINTS AT LAST ACTUAL LINE ON SCREEN.
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.
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.
2304 LINS3: MOV LELCC(U),T
2306 ;CLEAR C(A) LINES OF CHARACTERS, STARTING AT THE LINE T POINTS TO, BUT STOP IF REACH END OF SCREEN.
2308 LINS2: CMP #TVFENCE,T
2313 LINSX: MOVB #CIOR,CALU
2318 RGSCDN: JSR PC,GETCHC ;NUMBER OF LINES IN REGION
2320 JSR PC,GETCHC ;NUMBER OF LINES TO MOVE DOWN
2322 MOV #BYTPL*LINHT,MUL
2325 ADD MQ,TT ;ADDRESS OF LAST LINE IN REGION
2326 BCS LINSX ;IGNORE IF GARBAGE REGION (WRAPPED AROUND ADDRESS)
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
2334 RGSCUP: JSR PC,GETCHC ;NUMBER OF LINES IN REGION
2336 JSR PC,GETCHC ;NUMBER OF LINES TO MOVE UP
2338 MOV #BYTPL*LINHT,MUL
2340 ADD MQ,B ;ADDRESS OF FIRST LINE AFTER REGION
2341 BR LDEL00 ;GO DO IT, USING DELETE-LINES SUBROUTINE
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).
2355 ADD #6,SP ;FLUSH ALL BIT # CHAR POSITIONS FROM STACK.
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.
2364 POP LECC(U) ;AND RESTORE THE CURSOR.
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.
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.
2375 SUB LEPHS(U),TT ;TT GETS # BITS AT FRONT OF 1ST WORD NOT TO CHANGE.
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.
2381 ADD #BYTPL,A ;A GETS ADDR TO AUTODECREMENT TO LAST WORD OF LINE.
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.
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
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.
2397 CINS3: MOV AC,-(A) ;REMAINDER OF LAST FROM-WORD GOES INTO LAST TO-WORD.
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
2407 MOV LEX(U),C ;AT WHAT DOT POSITION DOES REGION INSERTED/DELETED END?
2409 BLT .+6 ;PAST RIGHT MARGIN => THIS OPERATION EQUIVALENT
2410 JMP CLEOL ;TO A CLEAR-TO-END-OF-LINE.
2412 PUSH A ;SAVE # CHAR POSITIONS TO INSERT.
2413 PUSH LELCC(U) ;SAVE ADDR START OF 1ST RASTER LINE (ADVANCES)
2415 PUSH LECC(U) ;AND ADDR OF CURSOR IN 1ST RASTER LINE.
2416 JMP (B) ;RETURN TO OUR CALLER, HAVING PUSHED HIS TEMPS.
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).
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.
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.
2442 SUB LEPHS(U),TT ;TT GETS # BITS AT FRONT OF 1ST WORD NOT TO CHANGE.
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.
2450 ADD #BYTPL,C ;C GETS ADDR OF 1ST WORD PAST END OF LINE.
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.
2458 MOV B,MQ ;CLOBBERS AC, SO RELOAD IT FROM T.
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.
2465 CDEL2: MOV A,MQ ;REMAINDER OF LAST FROM-WORD IS NEXT TO-WORD.
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).
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.
2477 MOV T,LSH ;MQ GETS MASK TO BITS WE WANT SHIFTED INTO.
2479 BIC T,A ;FLUSH THOSE IN SAVED CONTENTS.
2481 BIC T,(C) ;FLUSH THE OTHERS IN SHIFTED CONTENTS.
2482 BIS A,(C) ;MERGE OLD BITS WITH NEW.
2490 ;CLEARS TO END OF LINE
2495 JSR PC,CLEOL1 ;DO THE DIRTY WORK
2499 MOVB #CIOR,CALU ;RESTORE FOR DPYDP1 LOOP
2502 CLEOL1: MOV LEX(U),TT ;ALREADY AT END OF LINE?
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.
2509 BEQ CLEOLX ;CLEARED WHOLE LINE AND WRAPPED AROUND => DONE
2515 ASR TT ;-(# WORDS TO CLEAR)
2517 PUSH LECC(U) ;ADDR OF 1ST WORD TO CLEAR,
2518 PUSH #LINHT ;# LINES TO PROCESS
2520 CLEOL3: MOV 2(SP),T ;START CLEARING HERE
2525 MOV 4(SP),TT ;-(# WORDS TO CLEAR)
2528 ADD #6,SP ;CLEANSE STACK
2530 JMP CR1 ;RESET X AND PHASE
2532 CLEOLX: MOV LELCC(U),T
2533 ADD #<LINHT*BYTPL>,T ;HERE IF ALREADY AT END OF LINE
2537 ;CLEARS TO END OF SCREEN
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.
2543 MOV LELCC(U),T ;AND START FAST CLEAR WITH NEXT LINE.
2545 CLEOF1: MOV #TVFENCE,B
2548 ;HERE TO FORWARD SPACE
2553 SETCUR: JSR PC,GETCHC ;OLD VERTICAL AND HORIZONTAL
2556 ;HANDLE %TDMV0, %TDMV1 ABSOLUTE POSITIONING COMMANDS.
2557 SETCR1: JSR PC,GETCHC ;NEW VERTICAL
2559 JSR PC,GETCHC ;NEW HORIZONTAL
2560 ;NOTE GETCHC MAY RETURN AND BE REENTERED,
2561 ;RESETTING ALL ACS BUT B.
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
2567 SETXY: CMP #CHRPL,A ;CHECK FOR LEGAL POSITION
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
2576 MOV A,(T)+ ;X POSITION
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
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
2587 ADD #20-CHRWD,LEPHS(U) ;PHASE IS SET
2588 MOV B,(T)+ ;Y POSITION AGAIN
2591 ADD #-NLINS,LEY(U) ;LEY SET
2594 BIT #1,LECC(U) ;MAKE SURE IT LINES UP ON WORD BOUNDARY
2599 ;OUTSTR TAKES STRING TO PRINT IN B
2616 OUTSX: ASR (SP) ;MAKE SURE WE RETURN TO EVEN ADDRESS
2621 ;TAKES # IN A AND PRINTS AS UNSIGNED INTEGER
2625 OCTPN1: JSR PC,DECPN0
2630 MOV #10.,RADIX ;FOR DECIMAL PRINTING
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
2639 TST (A) ;QUOTIENT IS IN MQ
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
2646 .SBTTL CALL, BREAK AND ESCAPE ROUTINES
2648 ;LEGAL ESCAPE AND BREAK COMMAND TABLE
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
2654 .BYTE 0 ;MARKS END OF TABLE
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
2681 ESCAPE: BIT #ACLBIT+AMTBIT,B
2682 BEQ ESCAP1 ;ESCAPE WITH CONTROL OR META TURNS INTO TOP-A.
2685 ESCAP1: MOVB A,KBDESC(C) ;SAY FOLLOWING CHARS TO BE INTERPRETED AS AN ESCAPE CMD.
2686 CLRB KBDARG(C) ;DEFAULT ARG TO ZERO
2689 ;ACCUMULATE ARGS FOR ESCAPE AND BREAK
2691 ESCDIG: ASR T ;DIGIT
2692 MOVB KBDARG(C),A ;MULTIPLY ACCUMULATED VALUE BY 8
2696 ADD T,A ;ADD IN NEW DIGIT
2698 INCB KBDESC(C) ;READ NEXT CHAR AS A COMMAND CHAR, NOT AS PDP-10 INPUT.
2701 ;TAKES CHARACTER IN A AND CONVERTS IT UPPER CASE
2703 UPPER: TST A ;MAKE SURE ITS LEGAL ASCII
2705 CMP #'a,A ;LOWER CASE?
2709 SUB #'a-'A,A ;MAKE IT UPPER CASE
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
2718 ESCRP1: MOV A,LERPT(U)
2721 ;HERE TO SELECT VIDEO SWITCH INPUT.
2722 ;C HAS 2*KBD NUMBER; KBDARG(C) HAS VSW INPUT # OR 0 => DEFAULT.
2724 VSWSEL: JSR PC,VSWSGO ;SET UP L.E. IDX IN U, VSW OUTPUT IN T.
2726 MOV #-1,KBDDEF(C) ;NORMALLY RESET ANY TIME-OUT, BUT
2727 TSTB KBDARG(C) ;IF THERE'S AN ARGUMENT,
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?
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.
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.
2744 MOV DPYVSW(TT),TT ;DEFAULT VIDEO SWITCH INPUT
2745 JMP VSWIT ;DON'T NEED TO CHECK THIS
2747 ;COME HERE FOR [ESC]<N>S, WITH <N> IN TT.
2748 VSWSL1: BIC #-400,TT ;UNDO SIGN-EXTENSION AT VSWSL0
2750 BLO VSWSL2 ;<N> TOO SMALL TO BE TTY # => IT IS VSW INPUT #.
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
2757 BHIS RTSPC4 ;DO NOTHING IF ARG OUT OF RANGE.
2760 MOVB DPYKBD+1(TT),TT ;GET DPY BUFFER # FOR THIS TV, AND SELECT THAT DPY BUFFER.
2764 VSWSL4: SUB #200,TT ;TT SUPPOSEDLY HAS 200 PLUS DPY BUFFER NUMBER.
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
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
2780 ESCFRE: JSR PC,VSWSGO ;SET UP U AND T FOR VSWDE1.
2782 JSR PC,VSWSL3 ;THERE IS A TIMEOUT ON THIS SPYING.
2783 VSWFRE: MOV DPYFRE,TT ;GET DPY # OF FREE CONSOLE SCREEN
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.
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.
2803 ;DO [ESC]S ON KBD SPEC'D BY 2*KBD IN C.
2804 VSWUNS: JSR PC,VSWSGO
2809 ;HANDLE [ESC] <ASW INPUT> A.
2810 ESCAUD: MOVB KBDARG(C),TT ;ASW INPUT NUMBER.
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.
2817 ;CHANGE STATE OF BOW BIT
2819 BOWXOR: MOVB #CXOR,CALU
2823 ;HERE TO CLEAR SCREEN
2825 ESCCLR: MOVB CREG,T ;THE SCREEN TO CLEAR
2829 JSR PC,CLBLIN ;CLEAR ALL BLINKERS
2830 JSR PC,CLRSCR ;CLEAR THE SCREEN
2836 ;HERE TO RESET SCROLL REGISTER
2838 ESCCSR: MOVB #CSET,CALU
2839 BIC #SAMSK,CSA ;RESET THE SCROLL REGISTER
2842 ;HERE TO GENERATE VIDEO HARD COPY
2844 ESCQPY: TST QPYSWT ;IS THE SWITCH LOCKED?
2846 TST QPYDWN ;IS THE QPY DOWN?
2848 ESCQP1: MOV KBDLE(C),U
2852 ESCQP6: MOV #QPYVSW,T ;THE VIDEO SWITCH OUTPUT FOR THE HARD COPY UNIT
2853 JSR PC,VSWSL0 ;PROCESS THE ARG
2855 ZAPFLG QPYSWT ;LOCK THE SWITCH
2856 BIS #QPYKMS,KMS ;CAUSE THE COPY
2857 JSR TT,ADQUE ;SCHEDULE THE UNCOPY
2861 JSR TT,ADQUE ;SCHEDULE THE SWITCH UNLOCK
2867 ESCQPB: JMP BELL ;SOME ONE ELSE IS COPYING, GIVE HIM A BELL
2869 ESCQP2: BIC #QPYKMS,KMS ;UNCAUSE THE COPY
2872 ESCQP3: JSR PC,CLKBEL ;BELL WHEN COPY DONE
2876 ;HERE TO BUZZ 9TH FLOOR DOOR
2877 ESCBUZ: TST BUZSWT ;IS THE SWITCH LOCKED?
2881 ZAPFLG BUZSWT ;LOCK SWITCH
2882 BIS #BUZKMS,KMS ;BUZZ THE DOOR
2884 JSR TT,ADQUE ;SCHEDULE THE UNBUZZ
2889 ESCBZ2: JSR PC,CLKBEL ;BELL WHEN BUZZ DONE
2890 BIC #BUZKMS,KMS ;UNBUZZ THE DOOR
2891 CLR BUZSWT ;UNLOCK THE SWITCH
2894 ;HERE TO CALL THE ELEVATOR
2895 ; C HAS 2*KBD NUMBER
2897 ESCELE: TST ELESWT ;IS THE SWITCH LOCKED?
2901 ZAPFLG ELESWT ;LOCK SWITCH
2904 CMP T,#MAXVSO ;IS IT IN RANGE?
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
2910 JSR TT,ADQUE ;SCHEDULE THE UNPUSH
2916 ESCEL2: JSR PC,CLKBEL ;BELL WHEN DONE
2917 BIC #ELEKMS,KMS ;UNPRESS
2918 CLR ELESWT ;UNLOCK THE SWITCH
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!!
2931 ;HERE TO CONTROL WHO LINE
2934 ; N=0 TURN OFF WHO LINE -1
2935 ; 1 FOLLOW KEYBORAD 0
2939 ;ALL OTHERS SYSTEM WHO LINE
2942 ;FREEZES WHOLINE ON JOB WHOSE USER INDEX IS N*L (L IS THE ITS SYMBOL).
2944 NWHCMD==5 ;NUMBER OF WHO COMMANDS
2946 ESCWHO: MOV LECHN(U),TT ;10/11 CHANNEL
2947 ASL TT ;MAKE IT CHANNEL INDEX
2949 MOV WHOLIN(TT),TT ;WHO LINE VARIABLES
2952 MOVB KBDARG(C),T ;ARGUMENT
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
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
2967 ZAPWHL: MOV DPYCHN(B),A ;SET UP CREG
2969 CLRWHL: MOV #TVLO+<LINHT*CHRLN*BYTPL>,T
2973 ESCWHU: MOV #1,WHMODE(TT)
2974 MOVB KBDARG(C),WHJOB(TT)
2978 ;COME HERE FOR CALL KEY
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?
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.
2992 CLR CSA ;CLRSCR SETS UP CALU
2994 ;HERE IF CALL AND LINE EDITOR EXISTS.
2998 MOV #32,A ;CONTROL-Z (SIGH)
2999 BIS #ACTBIT,B ;ACTIVATES BUFFER
3000 JMP PUTCHR ;SEND THAT CHARACTER TO PDP-10
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.
3013 CHCONS: MOV C,T ;IF A KEYBOARD IS SPECIFIED,
3015 TSTB KBDVSW(C) ;DON'T ALLOW IT IF KEYBOARD HAS NO SCREEN
3018 TST KBDLE(T) ;OR IS ALREADY IN USE.
3020 CHCON4: CLR T ;NOW FIND A FREE CHANNEL
3021 CHCON1: TSTB CHCREG(T) ;DON'T ALLOCATE CHANNELS THAT DON'T HAVE BUFFERS.
3029 RTS PC ;NO FREE CHANNEL
3031 CHCON2: INCB CHNUSE(T) ;FOUND A CHANNEL. MARK IT IN USE.
3032 DEC ITSFDP ;DECREASE COUNT OF FREE CHANNELS.
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)
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.
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
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
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?
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
3070 ASL C ;MAKE THE KEYBOARD AND THIS LINE EDITOR POINT AT EACH OTHER.
3072 CHCON3: PUSH WHOLIN(A)
3076 JSR PC,CLRING ;CLEAR THE 11-TO-10 INPUT BUFFER RING.
3082 ;CLEAR OUT THE 10-TO-11 BUFFER WHICH U POINTS AT.
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)+
3092 ;HERE TO INITIALIZE MOST OF THE WORDS OF A LINE EDITOR BLOCK,
3093 ;AND GET A RING OF KEYBOARD BUFFERS FOR IT.
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
3102 MOV FSP,T ;FIRST FREE BUFFER
3104 MOV LHFS(T),TT ;NEXT BUFFER
3106 MOV LHFS(TT),FSP ;TAKE THOSE TWO
3108 MOV TT,LHNEXT(T) ;ALL NICE AND COZY
3109 MOV T,LEBUF(U) ;POINTER TO RING
3111 MOV T,LECHR(U) ;BUFFER ACCESS POINTER
3115 LECON3: BPT ;NO 11-TO-10 BUFFERS AVAILABLE FOR A RING?
3117 ;CLEARS HEADERS OF BUFFER RING, CALLED WITH RING IN T, CHN# IN TT
3120 CLRNG1: CLR (T)+ .SEE LHFLAG
3121 CLR (T)+ .SEE LHZERO
3122 TST (T)+ .SEE LHNEXT
3123 CLR (T)+ .SEE LHALST
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
3134 ;HERE TO COPY A BLOCK OF CORE
3137 ; U BYTE COUNT (ONLY EVEN NUMBERS WILL WORK)
3139 CALCPY: INC U ;MAKE A WORD COUNT
3141 CALCP1: MOV (T)+,(TT)+
3146 ;HERE TO RETURN DPY CHANNEL. T HAS CHANNEL NUMBER.
3148 CHRETN: TST T ;DON'T RETURN CHANNEL 0.
3150 DECB CHNUSE(T) ;MARK THE CHANNEL AS NOT IN USE
3153 INC ITSFDP ;AND INCLUDE IT IN THE COUNT OF FREE CHANNELS.
3156 CHRET0: MOV #377,CHNCLS ;IF FREEING THE FREE TV DISPLAY, DON'T REALLY FREE IT
3160 JSR PC,CHCLR ;RESET THE 10-TO-11 BUFFER AND POINTERS.
3162 BEQ CHRETX ;DON'T RETURN CHANNEL 0 (FREE CONSOLE DISPLAY)
3163 MOV #-1,DPYKBD(T) ;TELL THE PDP-10 WE'RE LOGGING OUT
3165 MOV #-1,WHMODE(TT) ;TURN OFF WHO-LINE GENERATION ON THIS CHANNEL.
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?
3173 LERET1: MOV LHNEXT(T),LHFS(T)
3178 LERET2: MOV FSP,LHFS(T) ;CUT RING, PATCH ON TO FREE LIST
3180 CLR LEBUF(U) ;MARK AS FREE
3181 LERT2A: MOV LEKBD(U),T
3182 BLT LERT2B ;A KEYBOARD?
3186 MOVB KBDVSW(T),T ;VSW THE OUTPUT
3188 MOV DPYFRE,TT ;MESSAGE DPY
3191 JSR PC,VSWIT ;GIVE HIM THE CONSOLE FREE MESSAGE
3192 LERT2B: MOVB LECREG(U),T ;RETURN ALL THE BLINKERS
3194 MOVB #-1,LECREG(U) ;INVALIDATE DPY #
3196 TST BELCNT(T) ;ANY BELLS PENDING?
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.
3201 LERET3: TST BLNEXT(TT)
3205 LERET4: MOV FBLINK,BLNEXT(TT)
3206 MOV BLINKS(T),FBLINK
3208 LERET5: MOV #-1,LEKBD(U)
3209 CLRUJ: CLR U ;SEARCH FAILED
3212 .SBTTL VIDEO AND AUDIO SWITCH ROUTINES
3214 ;VIDEO SWITCH TABLES (ONE INPUT CAN DRIVE MANY OUTPUTS)
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.
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.
3225 VSWTAB: .BLKB MAXVSO
3228 ;HERE TO SWITCH VIDEO SWITCH (OUTPUT IN T, INPUT IN TT).
3232 JSR PC,VSWNUL ;FLUSH ALL OTHER INPUTS TO THAT OUTPUT.
3236 MOVB TT,VSWTAB(T) ;UPDATE OUR OWN INTERNAL TABLE.
3238 MOV #MAXVSI,DIV ;DIVIDE TO TURN INPUT NUMBER
3239 MOV MQ,C ;INTO SECTION NUMBER
3240 MOV AC,B ;AND NUMBER WITHIN SECTION.
3245 ROR C ;GET SECTION NUMBER INTO TOP THREE BITS OF WORD.
3249 BIS C,B ;CREATE ARGUMENT FOR VIDEO SWITCH.
3250 MOV B,VSW ;SWITCH IT!
3255 ;HERE SEND NULL VIDEO TO OUTPUT SPECIFIED IN T
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
3263 TST (SP)+ ;CLEANSE STACK
3264 CLRB VSWTAB(T) ;MAKE SURE INTERNAL TABLE SAYS NOTHING FEEDING THIS OUTPUT.
3267 ;AUDEO SWITCH TABLES (ONE INPUT CAN DRIVE MANY OUTPUTS)
3269 ;INPUT 0 IS SILENCE. RIGHT NOW, THAT IS THE NORMAL SETTING FOR ANY OUTPUT.
3271 ;ASWTAB, INDEXED BY OUTPUT NUMBER, IS A BYTE GIVING THE INPUT FEEDING THAT OUTPUT.
3272 ASWTAB: .BLKB MAXASO
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
3282 ;HERE TO SWITCH AUDEO SWITCH (OUTPUT IN T, INPUT IN TT).
3288 BIS TT,C ;CONSTRUCT OUTPUT,,INPUT AND GIVE TO SWITCH AS COMMAND.
3290 MOV C,B ;NOW COMPLEMENT SOME OF C (WHAT'S IN ASWXOR).
3296 MOVB TT,ASWTAB(T) ;UPDATE OUR OWN INTERNAL TABLE.
3300 ;RESET THE AUDEO SWITCH (ALL OUTPUTS RECEIVING SILENCE).
3301 REASW: MOV #MAXASO-1,T
3303 REASW1: JSR PC,ASWIT
3308 .SBTTL CHARACTER GENERATOR ROUTINES
3310 ;CLEARS CHARACTER AT LINE EDITOR CURSOR
3314 CLCHR1: MOV #BLOB,T ;BLOB MASKS ENTIRE CHARACTER
3315 CLCHR2: MOV LEPHS(U),C
3318 MOVB #CIOR,CALU ;RESTORE FOR DPYDP1 LOOP
3321 ;BLINK CHARACTER AT CURSOR
3328 ;GENERATE A CHARACTER
3329 ;CALL WITH CHARACTER IN A AND PAGE PRINTER IN U
3336 ASL A ;MAKE IT A BYTE OFFSET
3337 MOV CTAB(A),T ;POINTS AT FONT DESCRIPTION
3347 ;The lowest level character generator
3348 ;Initial AC settings
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
3357 ;initial memory settings
3360 ;CREG CIOR,,console number, console register
3362 ;THIS ROUTINE CLOBBERS -ALL- ACS
3367 EZCASE: MOV #BYTPL,U
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
3382 ;initial settings same as EZCASE with one exception
3383 ;U <number of bytes per line of display memory>-2
3385 OVRLAP: MOV #BYTPL-2,U
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
3402 ;SOME LOW LEVEL GOODIES
3404 ;CLEARS ONE RASTER LINE
3406 CLRRST: MOVB #CSET,CALU
3414 ;CLEARS ONE CHARACTER LINE
3416 CLRCHL: MOV #LINHT-1,TT
3417 CLRCL0: JSR PC,CLRRST
3418 CLRCH1: JSR PC,CLRRS1
3423 ;CLEAR ENTIRE SCREEN
3428 CLRSC1: JSR PC,CLRRS1
3433 ;COPIES ONE RASTER LINE
3435 CPYRST: MOVB #CSET,CALU
3443 ;COPIES ONE CHARACTER LINE
3448 CPYCH1: JSR PC,CPYRS1
3454 .SBTTL KEYBOARD TABLES
3456 .MACRO KBDKEY N,PLAIN,SH,SL,SLSH,TOP
3471 ;WHAT FOLLOWS IS THE GRAND CHARACTER CONVERSION TABLE
3473 ;AN 8 BIT QUANTITY IS USED TO INDEX INTO THE XTAB
3474 ; 0-5 KEYBOARD KEY NUMBER
3477 ; 8 TOP (6 AND 7 GUARANTEED TO BE ZERO)
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:
3482 NASCTB: NONAS1 ; 0 ILLEGAL
3486 PLSMNS ; -4 PLUS-MINUS
3487 CRCPLS ; -5 CIRCLE-PLUS
3491 RTSPC ; -11 BACK -- not really used
3492 RTSPC ; -12 NEXT -- not really used
3494 MAXNAS==<<.-NASCTB>/2>-1 ;MAXIMUM # NON-ASCII CHARACTERS
3498 ; CHAR NORMAL SHIFT LOCK SHIFT&LOCK TOP
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
3567 .SBTTL FONT MACROS AND DEFINITION
3569 .IIF E FONTSW,CTAB==0
3582 ...200 ;THIS CHAR IS A BLOB FOR CURSORS.
3634 .ERROR ;FONT LOSSAGE NUM
3641 .XCREF CURCHR,FONT,CDEF1,CDEF
5179 CDEF1 200 ;BLOB CHARACTER FOR CURSORS
5191 .ENDC ;.IF NE FONTMS
5195 .BYTE 000,000,000,016,016,016,000,000,000,000
5197 .BYTE 000,004,004,004,004,025,016,004,000,000
5199 .BYTE 000,000,000,015,022,022,022,015,000,000
5201 .BYTE 000,000,000,016,021,036,021,036,020,020
5203 .BYTE 000,000,000,004,012,021,000,000,000,000
5205 .BYTE 000,000,000,000,037,001,001,000,000,000
5207 .BYTE 000,000,000,006,010,016,010,006,000,000
5209 .BYTE 000,000,000,037,012,012,012,012,000,000
5211 .BYTE 000,000,020,020,010,004,012,021,000,000
5213 .BYTE 000,021,012,004,012,021,021,016,000,000
5215 .BYTE 000,016,001,002,004,012,021,016,000,000
5217 .BYTE 000,004,016,025,004,004,004,004,000,000
5219 .BYTE 000,004,004,037,004,004,037,000,000,000
5221 .BYTE 000,000,016,025,037,025,016,000,000,000
5223 .BYTE 000,000,000,012,025,025,012,000,000,000
5225 .BYTE 000,014,002,001,017,021,021,016,000,000
5227 .BYTE 000,000,017,020,020,020,017,000,000,000
5229 .BYTE 000,000,036,001,001,001,036,000,000,000
5231 .BYTE 000,000,016,021,021,021,000,000,000,000
5233 .BYTE 000,000,021,021,021,016,000,000,000,000
5235 .BYTE 000,021,021,037,021,012,012,004,000,000
5237 .BYTE 000,037,001,001,017,001,001,037,000,000
5239 .BYTE 000,000,016,033,025,033,016,000,000,000
5241 .BYTE 000,004,002,037,002,004,010,037,010,004
5243 .BYTE 000,000,004,010,037,010,004,000,000,000
5245 .BYTE 000,000,004,002,037,002,004,000,000,000
5247 .BYTE 000,001,002,037,004,037,010,020,000,000
5249 .BYTE 000,004,004,012,021,012,004,004,000,000
5251 .BYTE 000,002,004,010,004,002,000,016,000,000
5253 .BYTE 000,010,004,002,004,010,000,016,000,000
5255 .BYTE 000,000,037,000,037,000,037,000,000,000
5257 .BYTE 000,000,000,021,012,004,000,000,000,000
5259 .BYTE 000,000,000,000,000,000,000,000,000,000
5261 .BYTE 000,004,004,004,004,004,000,004,000,000
5263 .BYTE 012,012,012,000,000,000,000,000,000,000
5265 .BYTE 000,000,012,037,012,012,037,012,000,000
5267 .BYTE 004,016,025,024,016,005,025,016,004,000
5269 .BYTE 000,037,031,002,004,010,023,023,000,000
5271 .BYTE 000,010,024,024,010,025,022,015,000,000
5273 .BYTE 014,014,030,000,000,000,000,000,000,000
5275 .BYTE 000,001,002,004,004,004,002,001,000,000
5277 .BYTE 000,020,010,004,004,004,010,020,000,000
5279 .BYTE 000,004,025,016,004,016,025,004,000,000
5281 .BYTE 000,000,004,004,037,004,004,000,000,000
5283 .BYTE 000,000,000,000,000,000,014,014,030,000
5285 .BYTE 000,000,000,000,037,000,000,000,000,000
5287 .BYTE 000,000,000,000,000,000,014,014,000,000
5289 .BYTE 000,000,001,002,004,010,020,000,000,000
5291 .BYTE 000,016,021,023,025,031,021,016,000,000
5293 .BYTE 000,004,014,004,004,004,004,016,000,000
5295 .BYTE 000,016,021,001,002,004,010,037,000,000
5297 .BYTE 000,016,021,001,006,001,021,016,000,000
5299 .BYTE 000,002,006,012,022,037,002,002,000,000
5301 .BYTE 000,037,020,036,001,001,021,016,000,000
5303 .BYTE 000,006,010,020,036,021,021,016,000,000
5305 .BYTE 000,037,001,002,002,004,004,004,000,000
5307 .BYTE 000,016,021,021,016,021,021,016,000,000
5309 .BYTE 000,016,021,021,017,001,002,014,000,000
5311 .BYTE 000,000,000,014,014,000,014,014,000,000
5313 .BYTE 000,000,000,014,014,000,014,014,030,000
5315 .BYTE 000,000,002,004,010,004,002,000,000,000
5317 .BYTE 000,000,000,037,000,037,000,000,000,000
5319 .BYTE 000,000,010,004,002,004,010,000,000,000
5321 .BYTE 000,016,021,002,004,004,000,004,000,000
5323 .BYTE 000,016,021,027,025,027,020,016,000,000
5325 .BYTE 000,016,021,021,037,021,021,021,000,000
5327 .BYTE 000,036,021,021,036,021,021,036,000,000
5329 .BYTE 000,016,021,020,020,020,021,016,000,000
5331 .BYTE 000,036,011,011,011,011,011,036,000,000
5333 .BYTE 000,037,020,020,036,020,020,037,000,000
5335 .BYTE 000,037,020,020,036,020,020,020,000,000
5337 .BYTE 000,016,021,020,020,023,021,016,000,000
5339 .BYTE 000,021,021,021,037,021,021,021,000,000
5341 .BYTE 000,016,004,004,004,004,004,016,000,000
5343 .BYTE 000,001,001,001,001,001,021,016,000,000
5345 .BYTE 000,021,022,024,030,024,022,021,000,000
5347 .BYTE 000,020,020,020,020,020,020,037,000,000
5349 .BYTE 000,021,033,025,021,021,021,021,000,000
5351 .BYTE 000,021,021,031,025,023,021,021,000,000
5353 .BYTE 000,016,021,021,021,021,021,016,000,000
5355 .BYTE 000,036,021,021,036,020,020,020,000,000
5357 .BYTE 000,016,021,021,021,025,022,015,000,000
5359 .BYTE 000,036,021,021,036,024,022,021,000,000
5361 .BYTE 000,016,021,020,016,001,021,016,000,000
5363 .BYTE 000,037,004,004,004,004,004,004,000,000
5365 .BYTE 000,021,021,021,021,021,021,016,000,000
5367 .BYTE 000,021,021,021,021,012,012,004,000,000
5369 .BYTE 000,021,021,021,021,025,033,021,000,000
5371 .BYTE 000,021,021,012,004,012,021,021,000,000
5373 .BYTE 000,021,021,012,004,004,004,004,000,000
5375 .BYTE 000,037,001,002,037,010,020,037,000,000
5377 .BYTE 007,004,004,004,004,004,004,004,007,000
5379 .BYTE 000,000,020,010,004,002,001,000,000,000
5381 .BYTE 034,004,004,004,004,004,004,004,034,000
5383 .BYTE 004,012,021,000,000,000,000,000,000,000
5385 .BYTE 000,000,000,000,000,000,000,000,000,037
5387 .BYTE 006,006,003,000,000,000,000,000,000,000
5389 .BYTE 000,000,000,016,001,017,021,017,000,000
5391 .BYTE 000,020,020,036,021,021,021,036,000,000
5393 .BYTE 000,000,000,016,021,020,020,017,000,000
5395 .BYTE 000,001,001,017,021,021,021,017,000,000
5397 .BYTE 000,000,000,016,021,036,020,016,000,000
5399 .BYTE 000,006,011,010,034,010,010,010,000,000
5401 .BYTE 000,000,000,016,021,021,021,017,001,016
5403 .BYTE 000,020,020,036,021,021,021,021,000,000
5405 .BYTE 000,000,004,000,004,004,004,004,000,000
5407 .BYTE 000,000,001,000,001,001,001,001,021,016
5409 .BYTE 000,020,020,021,022,034,022,021,000,000
5411 .BYTE 000,004,004,004,004,004,004,004,000,000
5413 .BYTE 000,000,000,032,025,025,025,025,000,000
5415 .BYTE 000,000,000,026,031,021,021,021,000,000
5417 .BYTE 000,000,000,016,021,021,021,016,000,000
5419 .BYTE 000,000,000,036,021,021,021,036,020,020
5421 .BYTE 000,000,000,016,021,021,021,017,001,001
5423 .BYTE 000,000,000,026,031,020,020,020,000,000
5425 .BYTE 000,000,000,017,020,016,001,036,000,000
5427 .BYTE 000,004,004,037,004,004,004,003,000,000
5429 .BYTE 000,000,000,021,021,021,021,016,000,000
5431 .BYTE 000,000,000,021,021,021,012,004,000,000
5433 .BYTE 000,000,000,021,021,025,025,012,000,000
5435 .BYTE 000,000,000,021,012,004,012,021,000,000
5437 .BYTE 000,000,000,021,021,021,012,004,010,020
5439 .BYTE 000,000,000,037,002,016,010,037,000,000
5441 .BYTE 001,002,002,002,004,002,002,002,001,000
5443 .BYTE 004,004,004,004,004,004,004,004,004,004
5445 .BYTE 020,010,010,010,004,010,010,010,020,000
5447 .BYTE 015,026,000,000,000,000,000,000,000,000
5449 .BYTE 002,005,004,004,004,004,004,024,010,000
5451 .BYTE 037,037,037,037,037,037,037,037,037,037
5455 BLOB=...200 ;BLOB IS THE CHAR THAT COVERS ENTIRE CHARACTER AREA.
5457 .IIF E FONTSW,.=.+3000 ;APPROXIMATE SIZE OF FONT
5459 REPORT FONT SIZE=,\.-FNTORG
5462 .ENDC ;.IF NE FONTSW
5465 .SBTTL LINE EDITOR AND PAGE PRINTER VARIABLES
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.
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
5491 DPDATA:: .BLKB DPSIZE ;DATA AREA OF BUFFER.
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
5500 LEZER0:: 0 ;FAKE LINE BUFFER HEADER (SENT TO PDP10 IN RESPONSE TO ECOFLG)
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.
5521 ;LINE EDITOR VARIABLE AREAS.
5524 ;HERE WE ASSEMBLE IN THE "DPY BUFFERS".
5536 ;THE WHO-LINE LINE EDITOR IS DIFFERENT AND APART FROM ALL THE REST
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
5552 .OFFSET -. ;LINE BUFFER HEADER AREA
5553 ;DON'T ADD NEW VARS WITHOUT CHANGING PDP10 CODE
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)
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
5572 BLKVAR: .=.+<MAXBLK*BLLEN>
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
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
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)
5593 WHJNAM:: .=.+2 ;jname in sixbit
5597 WHSNAM:: .=.+2 ;sname in sixbit
5601 WHSTAT:: .=.+2 ;status in sixbit, 0=>job does not exist
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
5611 WHO2:: .=.+2 ;first user who line var
5615 WHO3:: .=.+2 ;second user who line var
5620 .=.+30 ;EXTRA SPACE SO NEW HACKS CAN SAFELY BE PUT IN PDP10.
5623 ;USER WHO LINE VARIABLES
5627 WHVARS: .=.+<WHLEN*MAXTV>
5629 .SBTTL MISCELLANEOUS TABLES
5632 ;KEYBOARD/VIDEO SWITCH DEFAULTS
5633 ;INDEXED BY KBD #, GIVES NEAREST VIDEO SWITCH OUTPUT, -1=>NO DEFAULT
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
5643 .BYTE 4 ;10 817 JABARI
5646 .BYTE 10 ;13 819 GOLDSTEIN
5647 .BYTE 1 ;14 820 MINSKY
5650 .BYTE 11 ;17 821A MARR
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
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
5702 ;THIS TABLE SAYS WHICH FLOOR TO CALL THE ELEVATOR TO FOR <ESC>E
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
5712 .BYTE ELKMS8 ;10 817 JABARI
5715 .BYTE ELKMS8 ;13 819 GOLDSTEIN
5716 .BYTE ELKMS8 ;14 820 MINSKY
5719 .BYTE ELKMS8 ;17 821A MARR
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
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
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.
5774 CHCREG: .BYTE 0,1,4,5,6,7,10,11,12,13,14,15,16,17,-1,-1
5777 ;VIDEO SWITCH INPUT INDEXED BY DPY #, HIGH ORDER BYTE GIVES SWITCH SECTION
5787 21 ;10 THESE INPUTS ARE IN SECOND SECTION
5791 11 ;14 1ST SECTION AGAIN
5795 CHECK DPYVSW,MAXTV*2
5797 ;AUDIO SWITCH TABLES (INDEXED BY KBD #, GIVES AUDIO SWITCH OUTPUT #)
5799 KBDASW: .BYTE 00 ; 0
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.
5875 NF11TY: 0 ;PDP-10 PUTS TTY # OF FIRST CHANNEL HERE.
5877 QPYDWN: 0 ;THIS NEEDS TO BE READ BY THE 10 FOR LOCK TVQPY CMD.
5879 .=.+10 ;LEAVE A LITTLE ROOM FOR GROWTH
5881 ;10/11 CHANNEL HEADER AREA
5886 KBDFLG: 0 ;KEYBOARD ACTIVATED LIST (SET BY 11 CLEARED BY 10)
5888 DPYCHN: LEUVAR ;THE CHANNEL VARS BLOCK ADDR
5889 DPYKBD: 0 ;.BYTE KBD #,DPY #, OR -1 FOR FREE CHANNEL.
5891 LEUVAR+<<.RPCNT+1>*LELEN>
5895 CHNCLS: 0 ;FLAGS DPY CHANNEL AS OPEN (SET TO -1 BY TEN)
5897 WHOLIN: 0 ;POINTS TO WHO LINE VARIABLES FOR THIS CHANNEL
5901 ;PDP-10/PDP-10 COMMAND BUFFER
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
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 %
5931 .SBTTL MISCELLANEOUS VARIABLES AND FREE STORAGE
5933 ;CHANNEL USE FLAGS NON-ZERO MEANS CHANNEL IN USE
5934 CHNUSE: .BLKB MAXTV ;BYTES INDEXED BY DPY CHANNEL #
5938 ;BLINKERS. INDEXED BY TV-BUFFER # (CREG)
5939 BLINKS: .BLKW MAXTV ;ADDRESS OF 1ST BLINKER OF THIS TV'S BLINKER LIST.
5941 BLKSWT: .BLKB MAXTV ;NONZERO => DON'T DO ANY BLINKING ON THIS TV NOW.
5944 ;BELLS PENDING COUNTS. INDEXED BY TV-BUFFER #
5948 ;PER-KEYBOARD INFORMATION. INDEXED BY KBD#.
5949 KBDLE: .BLKW MAXKBD ;KEYBOARD/LINE EDITOR ASSOCIATION
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.
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
5963 CLOCKF: 0 ;CLOCK QUEUE FREE LIST
5964 CLOCKQ: 0 ;FIRST ENTRY ON CLOCK QUEUE
5965 CQUEUE: .=.+<CQLEN*NCQSLT>
5967 ;MISCELLANEOUS VARIBLES
5969 FSP: 0 ;POINTS TO LEBUFS FREE SPACE
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)
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
5994 ;******* TEMPORARY VARIABLES FOR FONT CHECKSUMS *******
5995 CKSPNT: 0 ;RUNNING POINTER
5996 CKSSUM: 0 ;RUNNING CHECKSUM
5997 CKSSMG: 0 ;GOOD CHECKSUM OF [FNTORG,FNTEND)
5999 ;LINE EDITOR BUFFER RINGS
6002 NLBUFS==<RUGSA-.>/<LHLEN+LBLEN>
6004 .IIF LT NLBUFS-<MAXTV*2>, .ERROR NOT ENOUGH LEBUFS
6005 REPORT NLBUFS=,\NLBUFS
6007 LEBUFS: .=.+<NLBUFS*<LHLEN+LBLEN>>
6009 REPORT HIGHEST USED=,\.