1 ;;; Copyright (c) 1999 Massachusetts Institute of Technology
3 ;;; This program is free software; you can redistribute it and/or
4 ;;; modify it under the terms of the GNU General Public License as
5 ;;; published by the Free Software Foundation; either version 3 of the
6 ;;; License, or (at your option) any later version.
8 ;;; This program is distributed in the hope that it will be useful,
9 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
10 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 ;;; General Public License for more details.
13 ;;; You should have received a copy of the GNU General Public License
14 ;;; along with this program; if not, write to the Free Software
15 ;;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 ; I T S MISCELLANEOUS DEVICES
21 SUBTTL PAPER TAPE PUNCH ROUTINES
56 POPJ P, ;PUNCH OUT OF TAPE
98 PBRK1: MOVEI A,PUNSIZ*4-4
101 CONSZ PTP,100 ;CHECK NO TAPE FLAG
102 JRST PBRK2 ;PUNCH OUT OF TAPE
113 PBRK2: SETOM PUNNT ;PTP OUT OF TAPE
116 ;PTP SLOW CLOCK ROUTINE
121 JRST PUNST ;PTP HAS TAPE NOW
125 PUNNT: 105 ;-1 => PTP OUT OF TAPE
134 PUNCLR: MOVEI A,PUNSIZ*4-4
140 PUNFIN: MOVE T,PUNSIZ*4-4 ;.CALL FINISH
146 CAIL A,PTPI ;LOWEST PTP DEV #
147 CAILE A,PTPWB ;HIGHEST PTP DEV #
148 POPJ P, ;PTP NOT OPEN ON CHNL
153 SUBTTL PAPER TAPE READER ROUTINES
155 PTRCHX==10 ;NUMBER OF CHARACTERS IGNORED AT END OF TAPE
157 PTRO: PUSH P,[PTRO1] ;SO STDOPN WILL RETURN
160 REDUAI,,REDBAI ;ASCII MODE
161 REDUII,,REDBII ;IMAGE MODE
162 REDUTI,,0 ;ALL 8 HOLES MODE
166 PTRO1: POPJ P, ;OPEN LOST
167 AOS (P) ;OPEN WON, MAKE RETURN SKIP
169 POPJ P, ;READER ALREADY OPEN, DON'T RESET
170 ;READER NOT ALREADY OPEN, SO
171 ;RESET PTR POINTERS AND START UP READER
172 CONO PI,PTROFF ;INHIBIT INTERRUPTS
173 MOVEI T,20 ;BUSY FLAG
174 PUSHJ P,PTRST ;START UP READER IF NOT ALREADY RUNNING
175 ;RESET PTR BUFFER POINTERS
176 PTRZAP: MOVE A,[041000,,PTRBUF-1] ;BUFFER BYTE POINTER
177 MOVEM A,PTRIP ;BUFFER INPUT (INTERRUPT) POINTER
178 MOVEM A,PTROP ;BUFFER OUTPUT (IOT) POINTER
179 MOVEI A,PTRCHX ;REINITIALIZE CHARACTER COUNT
181 CONO PI,PTRON ;RE-ENABLE INTERRUPTS
182 JRST PTRSIW ;RESET STATUS OF IMAGE WORD AND RETURN
184 ;CLOSE CHANNEL ON WHICH PTR OPEN
186 PTRCLS: CONO PI,PTROFF ;INHIBIT INTERRUPTS
187 SOSL PTRUSE ;DECREMENT USE COUNTER
188 JRST PTRONJ ;PTR OPENED ON MORE CHANNELS
189 SETOM PTRUSR ;NO MORE OPENS ON READER, INDICATE NO USER
190 SETOM PTRDIE ;EVENTUALLY TURN OFF READER
191 JRST PTRZAP ;RESET BUFFER STATUS
193 PTRRS: CONO PI,PTROFF ;PTR .RESET ROUTINE
198 PTRBAI: JSP E,INBTCH ;DO IT A CHARACTER AT A TIME
200 ;GET AN ASCII CHARACTER IN W
203 PTRCHA: PUSHJ P,PTRCH ;GET CHARACTER - SKIPS IF EOF.
204 TRZA W,200 ;CLEAR 200 BIT
206 JUMPE W,PTRCHA ;IF RESULT ZERO THEN DON'T CALL IT ASCII
207 CAIN W,177 ;IF RUBOUT,
208 JRST PTRCHA ;THEN IGNORE IT
209 POPJ P, ;ASCII, USE IT
211 PTRBII: JSP W,WRDBTI ;BLOCK IMAGE INPUT.
214 ;END-OF-FILE GIVES SIXBIT /######/
216 PTRUII: PUSHJ P,PTRCH ;GET CHARACTER
218 CAIA ;CALL IT BINARY IF 200 SET, OR IF EOF.
221 JUMPL W,PTRUI2 ;IF REACHED EOF, SKIP 1 OR 2.
222 SOSLE PTRICC ;IF WORD NOT FULL,
223 JRST PTRUII ;THEN GO BACK FOR MORE
224 JRST PTRUI1 ;ELSE RETURN THE WORD.
226 PTRUI2: SOSG B,PTRICC
232 PTRUI3: AOS (P) ;IF WE REACHED EOF, SKIP TWICE.
233 PTRUI4: AOS (P) ;REACHED EOF BEFORE WORD; SKIP ONCE.
234 PTRUI1: MOVE W,PTRIW ;WORD FULL,
235 PTRSIW: MOVEI B,6 ;NOW REINITIALIZE POINTERS TO WORD
236 MOVEM B,PTRICC ;CHARACTER COUNT OF WORD
237 MOVE B,[440600,,PTRIW] ;POINTER TO WORD
241 ;GET A CHARACTER IN W OR SKIP RETURNING -1,,EOFCH IF NONE AVAILABLE
243 PTRUTI: ;UNIT MODE ALL-HOLES INPUT.
244 PTRCH: MOVEI T,20 ;BUSY FLAG
245 PUSHJ P,PTRCHW ;WAIT FOR A CHARACTER
247 SOSGE I,PTRCC ;DECREMENT CHARACTER COUNT
248 JRST PTRCH1 ;BUFFER EMPTY
249 MOVEI T,10 ;DONE FLAG
250 CAIGE I,REDSIZ-PTRCHX ;IF BUFFER LESS THAN 1/4-FULL,
251 PUSHJ P,PTRST ;THEN MAKE SURE READER RUNNING
252 ILDB W,PTROP ;GET CHARACTER
253 HRRZ B,PTROP ;RING THE BUFFER
254 CAIL B,PTRBUF+REDSIZ-1
259 ;END-OF-FILE ENCOUNTERED DURING PTRCH
261 PTRCH1: AOS PTRCC ;RESTORE CHARACTER COUNT TO ITS ORIGINAL STATE
264 ;SKIP IF CHARACTER IN BUFFER OR END-OF-TAPE
266 PTRCHW: SKIPG PTRCC ;IF CHARACTER IN BUFFER,
267 CONSO PTR,400 ;OR POWER IS OFF,
268 JRST POPJ1 ;THEN EXIT SKIPPING
270 ;MAKE SURE READER RUNNING
273 CONSO PTR,30 ;IF RUNNING,
275 POPJ P, ;THEN THAT'S ALL
276 CONO PTR,PTRCHN(T) ;NOT RUNNING, RESTART WITH SELECTED FLAG
277 SETOM PTRDIE ;LET SLOW CLOCK FIGURE OUT IF THERE'S TAPE
280 ;PTR INTERRUPT ROUTINE
282 PTRBRK: AOSN PTRSTP ;IF READER SHOULD BE STOPPED THIS BREAK,
283 JRST PTRFUL ;THEN STOP IT (BUFFER FULL)
284 DATAI PTR,A ;GET CHARACTER
285 SETOM PTRDIE ;TELL SLOW CLOCK THAT BREAK HAS HAPPENED
286 IDPB A,PTRIP ;PUT IN BUFFER
287 HRRZ A,PTRIP ;RING THE BUFFER
288 CAIN A,PTRBUF+REDSIZ-1
291 AOS A,PTRCC ;TOTAL CHARACTER COUNT-PTRCHX
292 CAIGE A,REDSIZ*4-10-PTRCHX
294 SETOM PTRSTP ;STOP READER AT NEXT BREAK
297 PTRFUL: CONO PTR,PTRCHN ;BUFFER FULL, STOP READER
298 MOVEI A,1 ;TELL SLOW CLOCK...
299 MOVEM A,PTRDIE ;NOT TO TURN IT OFF
303 ;CHECKS READER EVERY HALF-SECOND
306 CAIN A,1 ;IF UNINTENTIONALLY STOPPED FOR OVER HALF-SECOND
307 CONO PTR,400 ;THEN TURN THE READER OFF
313 PTRDIE: -264 ;END-OF-TAPE DETECTION
314 PTRSTP: 0 ;-1 => STOP READER AT NEXT BREAK (SET DURING BREAK WHEN BUFFER FULL)
315 PTRIP: 041000,,PTRBUF-1 ;BUFFER INPUT (INTERRUPT) POINTER
316 PTROP: 041000,,PTRBUF-1 ;BUFFER OUTPUT (IOT) POINTER
317 PTRBUF: BLOCK REDSIZ ;READER BUFFER
318 PTRCC: -PTRCHX ;NUMBER OF CHARACTERS IN BUFFER -PTRCHX
320 PTRIW: 0 ;CURRENT WORD FOR IMAGE MODE
321 PTRIBP: 440600,,PTRIW ;POINTER TO CURRENT WORD
322 PTRICC: 0 ;CHARACTER COUNT TO CURRENT IMAGE MODE WORD
328 SUBTTL LINE PRINTER ROUTINES
331 NLPTO: MOVE A,UTMPTR(U)
333 SKIPL TTYTYP-USRRCE(A)
337 CAME T,NLPTBR ;WAIT TILL LPT BUFFER IS EMPTY.
339 CONSZ NLPT,207 ;AND LPT ISN'T STILL PRINTING LAST WD
346 NLPTO1: POPJ P, ;LPT NOT AVAIL & NOT ASSIGNED.
347 ;LPT ASSIGNED, INIT IT.
348 CONO NLPT,1000 ;PUT LPT INTERFACE IN IMAGE MODE,
349 DATAO NLPT,[23*2] ;TURN ON THE LPT'S MOTOR.
351 CONSZ NLPT,200 ;WAIT TILL IT IS ON.
354 NLPTO3: HRROI I,NLPTCF
356 PUSHJ P,BNLPTO ;CAN'T PCLSR SINCE BUFFER IS EMPTY.
362 NLPTCF: 15_29.+14_22.+177_15.+177_8+177_1
365 IFN GLPTP,[ ;GOULD ELECTROSTATIC PRINTER ROUTINES
367 IFE DL10P,.ERR GOULD PRINTER WITHOUT A PDP11 TO RUN IT?
372 JRST OPNL7 ;DEV NOT READY IF 11 UNHAPPY
378 TLNE C,10 ;BIT 3.4 => GRAPHICS MODE.
389 SKIPA T,[SIOKT] ;SIOT HANDLER = UNIT HANDLER MINUS ONE
390 GLPTDO: MOVEI T,CHRKTO
406 GLPCLS: SKIPE GLPMPP ;IF THERE'S AN UN-SENT BUFFER,
407 PUSHJ P,GLPBWW ;BARK AT THE PDP11
408 SKIPE GLPTBC ;WAIT FOR ALL BUFFERED STUFF TO BE SENT
410 PUSHJ P,GLPBG0 ;AVOID IOCERR AT NEXT OPEN
411 IRPS CH,,12 14 177 105
412 MOVE C,[SETZ I] ;AT CLOSE SEND FF, EOF
413 MOVEI I,CH ;THIS CAN'T PCLSR ONCE IT GETS A NEW BUFFER.
417 PUSHJ P,GLPBWW ;WRITE LAST BUFFER
425 JRST IOCER1 ;DEV NOT READY IF 11 UNHAPPY ABOU IT.
428 GLPBG0: MOVEI TT,GLPTBF
432 ;BUFFER DISCARD ROUTINE
434 GLPBWW: MOVE D,[450000,,GLPTBF-1] ;DL10 BYTE POINTER (7-BIT BYTES)
436 HRLI D,340000 ;GRAPHICS MODE => 8-BIT BYTES
438 SKIPN D,GLPMPP ;COMPUTE # CHARS IN BUFFER
440 JUMPL D,[SOJA D,GLPBW1]
441 MOVEI TT,15 ;INDEPENDENT OF E, BLOCK VS UNIT, ETC.
443 JRST [ IDPB TT,D ? JRST .-1 ]
444 GLPBW1: MOVEI D,-GLPTBF+1(D)
445 IMUL D,[4 ? 5]+1(J) ;GRAPHICS => 4, ELSE 5.
446 MOVEM D,GLPTBC ;START THE PDP11
447 SETZM GLPMPP ;FLAG THAT BUFFER IS NOT ACTIVE AT M.P. LEVEL
451 ;NOTE: TPL CODE HAS DELIBERATELY BEEN OMITTED.
452 ;THE DL10 LIMITS THE BUFFER SIZE TO 256 WORDS. WITH THIS SMALL
453 ;A BUFFER THE SYSTEM JOB CAN'T DRIVE THE PRINTER AT FULL SPEED
454 ;BECAUSE IT CAN ONLY IOT ONCE A SECOND OR SO.
455 ;ANYWAY, THE NECESSARY TPL CODE IS HAIRY.
463 JRST LPTO2 ;ALREADY HAS IT
464 MOVE A,UTMPTR(U) ;GET POINTER TO USER RESOURCE
466 SKIPL TTYTYP-USRRCE(A)
468 LPTO2: PUSH P,[LPTO1]
473 LPTO1: POPJ P, ;OPEN LOST
474 SKIPE OLUSE ;OPEN WON
475 JRST POPJ1 ;NOT FIRST OPEN BY THIS USER
477 LPTRS2: MOVEI A,15 ;ENTRY FROM LPTRS, DUMP OUT CRUD ON THIS LINE THEN FORM FEED
490 POPJ P, ;IGNORE RUBOUTS
491 MOVEI T,130. ;LPTCC COMPARED WITH 132. BY SYSTEM JOB BEFORE TRY OF .OPEN
499 PUSHJ P,LPC ;PRINT PREV STUFF AND SPACE OVER
501 BADCOL: CAIN T,-1 ;PATCH NUM OF BAD COL IN HERE WHEN NECESSARY
523 JRST LPTBS ;BACK SPACE
535 LPT.CR: SETZM LINEPOS
546 CAIL T,<LPTBE-LPTBO>*2
551 POPJ P, ;AT BEG OF LINE, IGNORE
572 SUB P,[1,,1] ;SYSTEM JOB HACKING SO CLOBBER TO EOF
573 XCTR XRW,[CLEARM (C)]
576 LPTCLS: SKIPLE OLUSE ;LPT CLOSE, IS THIS THE ONLY CHANNEL LPT OPEN ON
578 SKIPN LINEPOS ;THIS IS LAST CLOSE, CHECK TO SEE IF LOSER LEFT POSITION SCREWED
580 PUSHJ P,LPTCL2 ;INCREMENT TO NEXT PAGE
582 IORM T,SUPCOR ;LOOK FOR TPL FILES TO PRINT
583 SETOM OLUSR ;DO THIS FIRST SO DONT NEED CLOCK OFF LPT HACKED BY ONE JOB AT A TIME
584 LPTCL3: SOS OLUSE ;DECREMENT USE COUNT
589 POPJ P, ;NO ROOM FORGET IT
594 \fLPTTAB: PUSHJ P,LPTS
602 LPTLF: AOS J,LPTPPS ;LINE FEED, INCREMENT LINE #
603 CAIL J,LPTLPP ;END OF PAGE?
604 LPTFF: SETZM LPTPPS ;END OF PAGE CLEAR OUT PAGE POS (ENTRY FOR FF)
608 LPC: MOVE J,LINEPOS ;CR AND SPACE BACK OVER TO LINPOS
614 CLEARM LPTBSF ;IN CASE WAS ALREADY AT BEG OF LINE
624 LPTCC: <LPTBE-LPTBO>*5-5
625 LINEPOS: 0 ;LINE POSITION # CHARS PRINTED THIS LINE BEFORE CURRENT
626 LPTPPS: 0 ;PAGE POSITION (# LINES PRINTED BEFORE CURRENT)
628 PCL: 0 ;INCREMENTED BY LF OR FF, SETOMED BY OHTER CONTROL CHARS
629 ;PROBABLY UNNECESSARY BUT NOT WORTH FLUSHING
630 LPTBSF: 0 ;-1 => BACKSPACES HAVE BEEN TYPED, CR AND SPACE OVER BEFORE MAKING INK
637 LPTCN: CAIN A,<15-40>&177
640 MOVEI A,400 ;LINE FEED
642 MOVEI A,401 ;FORM FEED
643 CAIE A,177 ;SKIP IF LOOKS LIKE A LEFT ARROW
644 JRST LPTCN1 ;GO TO PRINT
645 HRRZ A,LPTOP ;LOAD OUPUT POINTER
646 CAIE A,LPTBE-1 ;SKIP IF CURRENT PNTR = END OF BUFFER
647 JRST LPENT3 ;REAL LEFT ARR
648 MOVE A,[350700,,LPTBO]
659 JRST NLPTW ;MAY NOT BE ROOM
660 NLPTW1: IDPB A,NLPTIP
669 NLPTGO: CONO PI,LPTOFF
671 CONO NLPT,100+LPTCHN ;SET OUTPUT DONE
680 NLPTIP: 010700,,NLPTBO-1
682 NLPTEP: 010700,,NLPTBO+LPTBSZ-1
683 NLPTPP: NLPTBO ;OUTPUT PNTR (PI)
685 NLPTBP: 004400,,NLPTBO-1 ;BLKT POINTER
686 NLPTBC: LPTBSZ ;BLKT CNT = MIN(# WDS TILL END OF BUF,NLPTBR)
687 NLPTOP: NLPTBO ;VALUE OF NLPTBP BEFORE BLKT CALL
688 NLFREE: -1 ;-1 => LPT IN USE RECENTLY.
689 ;0 => NOT IN USE SINCE LAST VSCLK.
690 ;1 => NOT SINCE NEXT-TO-LAST VSCLK.
691 ;=>2 => LPT MOTOR NOW OFF.
695 BNLPTO: MOVE B,NLPTBP
707 BNLPT1: MOVE T,NLPTBP
709 CAMN T,[004400,,NLPTBO+LPTBSZ-1]
710 MOVE T,[004400,,NLPTBO-1]
713 SUB T,W ;- # WORDS WRITTEN
714 ADDB T,NLPTBR ;DECREASE ROOM
718 BNLPTG: MOVE TT,NLPTBP
720 MOVEI T,NLPTBO+LPTBSZ-1
721 SUBI T,(TT) ;# WORDS UNTIL END OF BUFFER
727 NLPTCL: SKIPLE NLPTBR ;ENOUGH ROOM?
734 NLPDCL: MOVSI H,760000
736 NLPDC1: PUSHJ P,NLPTW1
740 CAIN A,NLPTBO+LPTBSZ-1
745 ADDI A,NLPTBO+LPTBSZ-1
753 IFN NTYP\OLPTP\NLPTP\PLTP\340P\PDP6P\STKP\PTRP,[
763 IFN NTYP,[ ;A KLUDGE FOR THE PDP 11 ON DM
766 TRNN A,200000 ;NO FLAG
768 JRST NTYBRK ;AHH, FLAG AND PIA
775 JRST LPENT1 ;LINE PRINTER
781 JRST NLPENT ;NEW LINE PRINTER
788 JUMPL A,SRECYC ;SPECIAL DISPLAY CHNL
801 JRST PBRK1 ;PAPER TAPE PUNCH
807 JRST DSDBRK ;INTERRUPT FROM OTHER PROCESSOR
813 JRST STKINT ;STANFORD KEYBOARD
818 LPTRT1: MOVS A,[C,,LPTACS]
823 ] ;END IFN OLPTP\ ETC.
835 LPTCR: CONO OLPT,10+LPTCHN ;PRINT LINE
839 LPENT1: MOVEI A,<LPTBE-LPTBO>*5-5
845 LPTCN1: DATAO OLPT,A ;OUTPUT CHARACTER
849 CAIGE A,<LPTBE-LPTBO>*5-5
851 LPTSTP: CONO OLPT,0 ;CLEAR PIA
854 IORM A,SUPCOR ;LPT NOW IDLE
859 LPTBO: BLOCK LPTBSZ-1
865 STALPT: MOVE E,LINEPOS
867 DPB A,[60300,,D] ;MODE
875 LPTRS: CONO PI,LPTOFF
876 MOVEI A,5*<LPTBE-LPTBO>-5
878 MOVE A,[700,,LPTBO-1]
888 NLPENT: MOVE A,NLPTBR
901 NLPTST: CONO NLPT,200 ;CLEAR DONE AND PIA
904 IORM A,SUPCOR ;LPT NOW IDLE
907 NLPTRS: CONO PI,LPTOFF
908 MOVE A,[010700,,NLPTBO-1]
912 MOVE A,[004400,,NLPTBO-1]
922 SUBTTL STANFORD KEYBOARD
925 ;3.4 => DON'T HANG ON IOT IF NO CHAR (RETURN -1 INSTEAD)
926 ;3.5 = 1 => DON'T DO CHAR CONVERSION
927 ; = 0 => CONVERT ACCORDING TO OTHER BITS
928 ;3.6 = 1 => ITS MODE (CTRL DOES CTRL AND META IS 8TH BIT)
929 ; = 0 => STANFORD MODE (400 = META, 200 = CTRL, AND ALL THE
930 ; CHARS FROM 1-177 CAN BE GENERATED WITH TOP AND SHIFT.)
931 ;3.7 = 1 => IF 3.5 = 0, 3.6 = 1, THEN DON'T INPUT META BIT
933 STKO: TLNE C,3 ;BLOCK OR OUTPUT
934 JRST OPNL12 ;MODE NOT AVAILABLE
937 JRST OPNL10 ;DEVICE NOT AVAILABLE
940 JRST 4,. ;CAN ONLY BE OPEN ONCE
951 DATAI STK,A ;CLEAR DONE
957 STKCLS: CONO STK,0 ;CLEAR PIA
959 JRST 4,. ;CAN ONLY BE OPEN ONCE
963 STKRS: CONO PI,LPTOFF
979 JRST STKCV ;DO CONVERSION
993 ANDI B,1777 ;CURRENTLY 10 BITS
996 JRST LPTRT3 ;NO ROOM. JUST IGNORE CHAR
1012 STKIP: 001400,,STKIB-1
1014 STKEP: 001400,,STKIB+STKBL-1
1015 STKBP: 001400,,STKIB-1
1016 STKOP: 001400,,STKIB-1
1018 STKMSK: 0 ;BIT FOR CHANNEL STK OPEN ON
1019 ;3.1 => DON'T HANG ON IOTS MODE
1020 ;3.2 => DON'T CONVERT CHARS
1022 ;3.4 => DON'T INPUT META IN ITS MODE
1025 STKCV: LDB B,[000600,,A] ;LOW 6 BITS
1037 JRST STKCVT ;TOP IS ON
1040 CAIN B,34 ;SKIP IF 50-73
1042 STKCVX: TLNN TT,4 ;SKIP ON ITS MODE
1043 JRST STKCVY ;STANFORD MODE
1044 ANDI A,1000 ;META BIT
1046 TLNN TT,10 ;SKIP ON DON'T INPUT META BIT
1051 STKCVY: LDB D,[110100,,A] ;META BIT
1052 LSH D,8 ;IN 400 POSITION
1053 ANDI A,200 ;CTRL BIT
1061 STKCV2: MOVEI Q,-35(B) ;35-47 (-35)
1074 STKCVT: CAIG B,32 ;TOP IS ON
1078 MOVEI Q,-50(B) ;50-73 (-50)
1082 TRNE A,200 ;SKIP IF CTRL IS OFF
1083 TLNN TT,4 ;SKIP IF ITS MODE
1090 STKCT1: MOVE Q,B ;0-32 TOP ON
1094 TRNE A,200 ;SKIP IF CTRL IS OFF
1095 TLNN TT,4 ;SKIP IF ITS MODE
1104 STKCV4: TLNN TT,4 ;SKIP IF ITS MODE
1107 JRST STKCVX ;ITS, CTRL
1110 TRO B,40 ;SHIFT WAS OFF
1114 TRNE A,200 ;SKIP IF CTRL IS OFF
1115 TLNN TT,4 ;SKIP IF ITS MODE
1120 DEFINE STKM A,B,C,D,E
1121 A_29.+B_22.+C_15.+D_8+E_1
1132 STKBPT: STKM1 STKTBL
1133 STKTBL: STKM 12,0,0,40,0
1137 STKBP1: STKM1 STKTB1
1138 STKTB1: STKM 133,135,26,174,41
1143 STKBP2: STKM1 STKTB2
1144 STKTB2: STKM 0,34,7,6,74
1145 STKM 100,76,33,75,47
1146 STKM 137,31,27,25,24
1147 STKM 173,176,4,43,35
1152 SUBTTL INTERFACE (?) TO DM PDP11 ON NTY (REALLY WANT A CAIOS)
1154 IFN TK10P, .ERR YOU REALLY WILL LOSE WITH BOTH TTY AND 11 ON NTY
1155 NTYOPN: PUSHJ P,NTYOP1 ;SET UP OPEN
1157 SKIPE NTYUSE ;IF THIS IS FIRST OPEN, DO SOME INITIALIZING
1159 CONO NTY,0 ;STOP INTS
1161 MOVE A,[NTYIOI,,NTYIOR]
1162 BLT A,NTYORM ;INITIALIZE ALL THE POINTERS AND COUNTERS
1163 CONO NTY,620000+NTYCHN
1166 NTYOP1: ROT D,1 ;MODE BACK, TO GET INPUT & OUTPUT
1170 0,,0 ;NTYBIT,,NTYBOT
1174 NTYCLS: SOSL NTYUSE ;-1 MEANS FREE (USE STDCLS?)
1180 ;MAIN PROGRAM ROUTINES FOR IOT/SIOT ...
1186 NTYOPT: PCLT ;PUT OUTPUT INTO BUFFER
1189 UMOVE A,(C) ;FETCH THE USERS BYTE
1190 SKIPG NTYORM ;WAIT FOR ROOM
1194 JRST 4,. ;WENT BELOW ZRO?
1196 CONO NTY,10+NTYCHN ;NOT ACTIVE, START PI LEVEL
1199 MOVE A,[NTYOII,,NTYOIR] ;RING AROUND THE ROSY
1203 NTYIGT: MOVEI T,NTYIBS*4
1206 PUSHJ P,UFLS ;WAIT UNTIL A BYTE COMES IN
1208 AOS NTYIRM ;NOW MORE ROOM
1211 MOVE B,[NTYIOI,,NTYIOR] ;REDO POINTERS
1217 NTYBRK: TRC A,2000 ;DEVICE #
1219 JRST NTYSEL ;STOPPED ON OTHER DEVICE
1224 NTYRET: CONO NTY,620000+NTYCHN ;RESTART
1227 NTYSEL: TRC A,2000 ;HAVE TO KNOCK DOWN SOME OTHER FLAG
1230 CONO NTY,400000+NTYCHN(A)
1232 DATAI NTY,A ;CLEAR INPUT
1234 CONO NTY,20+NTYCHN ;CLEAR OUTPUT
1238 NTYOGT: MOVEI A,NTYOBS*4
1248 MOVE A,[NTYOOI,,NTYOOR]
1249 BLT A,NTYOOP ;ZAP THE POINTER AND COUNT (RING BUF)
1253 CONO NTY,100+NTYCHN ;IF HDWE NOT IN, BUFFER WILL BE CLOBBERED
1254 ;BUT ALSO, THE COUNT WILL BE NEG!!!
1259 MOVE A,[NTYIII,,NTYIIR]
1260 BLT A,NTYIIP ;RING THE BUFFER POINTERS
1263 ;DATA AREAS FOR THE NTY INTERFACE TO DM PDP 11
1268 NTYIOI: -NTYIBS*4 ;STUFF TO INITIALIZE INPUT SIDE
1274 NTYOOI: -NTYOBS*4 ;INITIALIZES OUTPUT SIDE
1282 NTYIOR: -NTYIBS*4 ;RING COUNTER, INPUT BUFFER, OUTPUT PART
1283 NTYIOP: 041000,,NTYIBF-1 ;BYTE POINTER, " "
1284 NTYIIR: -NTYIBS*4 ;RING CTR, INPUT BUFFER, INPUT PART
1285 NTYIIP: 041000,,NTYIBF-1 ;BYTE POINTER, " "
1286 NTYIRM: NTYIBS*4 ;ROOM EMPTY IN IN BUFFER
1288 NTYOOR: -NTYOBS*4 ;RING CTR, OUTPUT BUFF, OUT PART
1289 NTYOOP: 041000,,NTYOBF-1 ; BYT PTR, " "
1290 NTYOIR: -NTYOBS*4 ;RING CTR, OUT BUFF, IN PART
1291 NTYOIP: 041000,,NTYOBF-1 ;BYT PTR, " "
1292 NTYORM: NTYOBS*4 ;ROOM IN THE OUTPUT BUFFER
1294 NTYIBF: BLOCK NTYIBS ;INPUT BUFFER
1295 NTYOBF: BLOCK NTYOBS ;OUTPUT BUFFER
1297 NTYOAC: -1 ;FLAG, OUTPUT ACTIVE UNLESS -1
1306 SUBTTL PDP-10 TO PDP-11 INTERFACE AND XGP
1310 T11MP: BLOCK 256. ;CONTENTS OF TEN11 MAP, -1 => CONFLICT PAGE
1313 ;4.9=1 => CONTENTS OF MAP WD EXCEPT 4.7-4.3 => USE COUNT
1314 IFN XGP,XGPTP==376 ;PAGE NUMBER IN 10-11 RESERVED FOR CLK LEVEL XGP HACKS
1316 ;PLACE WD IN A IN AVAIL 10-11 MAP ENTRY (RETURN IN RH B)
1320 JSP Q,T11FND ;SKIP UNLESS NO MAP ENTRIES AVAIL
1321 JRST T11A1 ;WD ALREADY IN PAGE
1322 MOVEI C,0 ;FIND FREE PAGE
1325 POPJ P, ;NO FREE PGS AVAIL
1327 T11A1: LDB E,[350500,,T11MP(B)]
1329 JRST T11FN2 ;USAGE COUNT MAX FOR THAT ENTRY
1331 DPB E,[350500,,T11MP(B)]
1335 T11A2: MOVEM A,T11MP(B)
1336 MOVEM A,400000+T11CP*2000(B) ;STORE IN HARDWARE
1339 T11FND: MOVSI B,-256.
1341 IFN XGP,[ CAMN B,[-256.+XGPTP,,XGPTP] ;DON'T ALLOCATE SPECIAL XGP ENTRY TO OTHER USERS
1345 TLZ E,174000 ;USE COUNT BITS
1348 T11FN2: AOBJN B,T11FN1
1349 JRST 1(Q) ;CANT FIND IT
1352 ;DELETE REF TO T11 PAGE IN B
1356 AOJE E,CPOPJ ;REALLY CONFLICT PAGE
1357 LDB E,[350500,,T11MP(B)]
1358 SOJL E,T11DL1 ;DELETING LAST REF TO PAGE?
1359 DPB E,[350500,,T11MP(B)]
1362 T11DL1: CLEARM T11MP(B)
1363 CLEARM 400000+T11CP*2000(B)
1375 ; ARG 2 DESIRED T11 MAP WORD
1377 NT11M: TDNE A,[-400] ;TEMP? TEN11 CALL A HAS USER PG
1378 JRST OPNL33 ;INVALID ARG - BAD USER PAGE #.
1380 JRST OPNL7 ;DEVICE NOT READY.
1384 TLZ B,174000 ;DONT ALLOW ANYTHING IN USAGE COUNT BITS
1387 JUMPE E,NT11M1 ;PAGE MUST BE FREE OR ABS, OTHERWISE ERROR
1389 JRST OPNL13 ;FILE ALREADY EXISTS
1392 LDB E,[.BP <PMRCM-377> B] ;GET MOBY #
1402 JRST OPNL37 ;NO CORE AVAILABLE.
1403 ADDI B,200000+<<T11CPA_-18.>_8> ;ADDRESS CORRECT MOBY
1405 TRO B,400000 ;WRITE PERMISSION
1415 .ELSE NT11M: JRST OPNL1 ;NO SUCH DEVICE.
1417 ;CLOCK LEVEL XGP CODE FOR FILLING IMAGE MODE BUFFERS
1418 ;ASSUMES XGP11P IS POINTER TO FIRST 11 RING NODE
1419 ;AND THAT THE 11 BUFFER RING STRUCTURE IS:
1421 ; POINTER TO NEXT NODE OF BUFFER
1422 ; USE WORD (0=> EMPTY)
1423 ; POINTER TO BUFFER (ASSUMED TO BE 1K 10 STYLE, 2K 11 STYLE)
1426 ;THE NODES AND THE BUFFERS MUST BEGIN ON EVEN PDP-11 WORDS
1427 ;I.E. 11 ADDRESSES ENDING WITH TWO ZEROES.
1429 ;THIS CODE USES A SPECIAL 10-11 INTERFACE ENTRY
1430 ;NAMELY, XGPTP, AND THREE EXEC PAGES, XGPC WHICH POINTS TO
1431 ;THE LOW 2K OF PDP-11 CORE, USED FOR THE RING NODE POINTERS
1432 ;XGPUB WHICH POINTS TO THE CURRENTLY HACKED USER PAGE
1433 ;AND XGPB WHICH POINTS PERMANENTLY TO THE 10-11 PAGE CORRESPONDING
1436 XGP11==1 ;PDP-11 RUNNING XGP
1437 XGPCA==XGPC*2000+400000 ;EXEC ADR OF LOW PDP-11 CORE
1438 XGPBA==XGPB*2000+400000 ;EXEC ADR OF BUFFER IN PDP-11
1439 XGPUBA==XGPUB*2000+400000 ;EXEC ADR OF CURRENT PAGE IN USER'S MAP
1440 XGNTPG==117. ;MAX # TIED DOWN PAGES (WOULD YOU BELIEVE...)
1441 X11BFP==102 ;LOC OF XGP BUFF HEAD IN 11 (PDP11 ADR 410)
1445 MOVE A,XGPTM1 ;TIME FIRST PAGE LOCKED IN CORE
1446 ADDI A,30.*60. ;1 MINUTE
1448 JSP Q,XGPFLS ;LOSE...
1449 SKIPL XGPINI ;DON'T HACK UNTIL MAIN PGM HAS PAGES TIED DOWN
1451 SPM XGPSPM ;SAVE OLD MAP
1452 XGPC1: MOVE A,XGP11P ;GET POINTER TO FIRST PDP-11 BUFFER
1453 MOVE A,XGPCA(A) ;GET CONTENTS FROM PDP-11
1454 LDB B,[242000,,A] ;GET NEXT RING POINTER
1455 LDB A,[042000,,A] ;GET USE WORD
1456 JUMPN A,POPBAJ ;BUFFERS FULL
1458 JSP Q,XGPFLS ;NEW BUF POINTER NOT ON EVEN WD BNDY
1459 LSH B,-2 ;CONVERT TO 10 ADDRESS
1461 CAIL B,2000 ;IS IT WITHIN CONTROL PAGE?
1463 EXCH B,XGP11P ;SETUP NEXT POINTER, GET BACK OLD ONE
1464 MOVEM B,XGPOB ;SAVE OLD POINTER FOR HACKING BUFF FULL
1465 MOVE B,XGPCA+1(B) ;GET POINTER TO 11 BUFFER
1469 LSH B,8 ;SETUP 10-11 ENTRY
1470 IOR B,[600000+<XGP11_8>,,1777] ;R/W, PROT INFINITE
1471 MOVEM B,400000+2000*T11CP+XGPTP ;GRONK INTO 10-11 INTERFACE
1472 MOVEM B,T11MP+XGPTP ;FOR DEBUGGING ONLY
1473 ILDB A,XGP10P ;GET POINTER TO NEXT 10 PAGE
1475 JRST 4,. ;MAIN PGM HAS POINTER TO NXM
1476 JUMPE A,XGPFIN ;HERE WE ARE DONE, I HOPE. DEUS GRATIUS
1477 MOVE B,A ;SAVE MMSWP ENTRY # TO CLEAR OUT TIE DOWN
1479 DPB A,[.XGPUB+EXEUMP] ;GRONK EXEC MAP
1480 LPMR XGPSPM ;RESET ASSOC REGS
1481 MOVE A,[XGPUBA,,XGPBA]
1482 BLT A,XGPBA+1777 ;DO THE STUFF!
1484 ADDM A,MMSWP(B) ;CLEAR TIE DOWN, PHEW!
1485 SKIPGE MMSWP(B) ;STOP BUGGY LOSSAGE
1487 PUSHJ P,XGPBIT ;GET TABLE INFO
1489 JRST 4,. ;UNTIED PAGE NOT TIED DOWN
1490 ANDCAM A,XGPMTB(B) ;CLEAR THE BIT
1492 DPB A,[.XGPUB+EXEUMP] ;CLEAR EXEC PAGE MAP
1493 MOVE A,XGPOB ;GET OLD RING PTR
1494 MOVEI B,30 ;CHANGE RH ONLY TO A 1
1495 MOVEM B,XGPCA(A) ;SET BUFFER FULL
1496 JRST XGPC1 ;LOOP TO GET A NEW BUFFER
1500 XGPFIN: SETZM XGPINI
1514 ;CALLED FROM CORE ALLOCATOR WHEN FLUSHING PAGES
1515 ;OF A JOB WHICH HAVE LH OF MMSWP NON ZERO.
1517 XGPCFL: CAME U,XGPUSR ;ARE WE CONCERNED?
1521 MOVE B,TT ;B GETS MMSWP INDEX
1522 PUSHJ P,XGPBIT ;GET INDEXES INTO XGPMTB
1523 TRNN A,XGPMTB(B) ;IS THIS A PAGE BEING HACKED BY XGP?
1527 ;XGPFLS IS CALLED AT THE CLOCK LEVEL IF ANYTHING GOES WRONG WITH ANYTING
1528 ;AND AT THE END OF THE RUN.
1529 ;IT FREES THE WORLD, AND FLUSHES THE XGP USER
1531 XGPFLS: MOVEM Q,XFLSPC
1532 SETOM XGPUSR ;FLUSHES XGP, ALSO PREVENTS TIMING ERRORS IF XGPFLS CALLED
1533 ;AT CLOCK LEVEL, SINCE IT WON'T BE ANY MORE
1539 XGPFL1: TDNN C,XGPMTB(B)
1540 JRST XGPFL3 ;THIS PAGE NOT HACKED
1541 ADDM D,MMSWP(A) ;UNTIE THIS PAGE
1544 ANDCAM C,XGPMTB(B) ;AND FLUSH THIS BIT
1545 XGPFL3: ROT C,-1 ;MOVE ON TO NEXT BIT
1546 SKIPGE C ;BEG OF NEW WORD?
1547 AOS B ;YES, AOS XGPMTB INDEX
1548 CAIGE A,TSYSM-1 ;FINISHED WITH ALL OF MMSWP ENTRIES?
1549 XGPFL2: AOJA A,XGPFL1 ;NOPE, LOOP BACK FOR MORE FUN
1555 ;MAIN PROGRAM BUFFER TIE DOWN ROUTINES
1559 ; SETZ POINTER TO [# OF PAGES,,FIRST PAGE]
1561 NXGPIM: XCTR XRW,[MOVES B,(A)] ;GET POINTER, AND CHECK FOR WRITE
1562 JUMPL B,XCONT ;CONTINUING A PREVIOUS CALL
1566 MOVEI C,X11BFP ;BUFF HEAD IN 11 DEFINED AS 1000
1568 MOVE C,XGPCA(C) ;GET BUFF POINTER FROM 11
1569 JUMPE C,CPOPJ ;LOSE, THE 10-11 IS LOSING OR PGM LOSING
1571 MOVEM C,XGPTM1 ;SET UP TIMEOUT ON PAGE LOCK
1572 SETZM XGPINI ;SAY NOT ACTIVE
1573 MOVEM U,XGPUSR ;AND BEING LOADED
1575 MOVE C,[XGPTAB,,XGPTAB+1]
1576 BLT C,XGPTAB+LXTAB-1 ;CLEAR OUT OLD PAGE BUF TABLE
1577 MOVE C,[441400,,XGPTAB]
1578 MOVEM C,XGP10P ;SETUP BYTE POINTER TO PAGE LIST
1582 HRRZ E,B ;C,E GET PAGE # NEXT TO BE TIED DOWN
1583 HLRZ D,B ;D GETS COUNT OF PAGES LEFT
1585 UMOVE B,20(C) ;BRING IN THAT LOSING PAGE
1589 CAIL D,XGNTPG ;MAX # PAGES TIED DOWN
1593 JRST XLOSE ;PAGE OUT OF REASONABLE RANGE
1595 PUSHJ P,UPLC ;FIND OUT PAGE MAP ENTRY
1604 CONO PI,CLKOFF ;CLOCK OFF TO PREVENT PAGES 1/2 TIED DOWN
1605 TDNN A,XGPMTB(B) ;WE HAVE HIT THIS PAGE ALREADY
1606 CAME U,XGPUSR ;TIMEOUT OR OTHER GROSS LOSSAGE
1607 JRST XLOSE1 ;DON'T TIE THIS ONE DOWN, AND FLUSH ALL THE REST
1608 IORM A,XGPMTB(B) ;SET BIT IN XGP MEM TABLE
1611 IDPB B,XGP10P ;PUT IN BUFFER LIST
1613 ADDM A,MMSWP(B) ;TIE IT DOWN GOOD (FOR ALL YOU BONDAGE FREAKS)
1615 PUSHJ P,LSWPOP ;CIRPSW
1617 SOJLE D,XBFIN ;WE ARE DONE TYING START XGPING
1620 MOVE A,E ;NOW, LOOP FOR MORE CRUFTIES, OR
1621 XCONT: CAME U,XGPUSR ;REENTER HERE IF THE MAD SWAPPER HAD US SWAPPED OUT
1625 XLOSE1: CONO PI,CLKON ;CLEANUP AFTER LOSSAGE
1627 XLOSE: PUSHJ P,LSWPOP ;CIRPSW
1630 JSP Q,XGPFLS ;FLUSH THE LAST VESTIGE OF THIS ABORTIVE ATTEMPT TO CAUSE WINNAGE
1632 XBFIN: SETOM XGPINI ;THE WORST IS OVER, SIT BACK AND RELAX
1633 MOVE A,[441400,,XGPTAB]
1635 JRST POPJ1 ;TELL HIM HE MAY EVEN WIN SOMEDAY
1637 XPLO: CONO PI,CLKOFF
1651 MOVSI B,(SIXBIT /XPL/)
1659 XPLO1: PUSHJ P,UDELAY
1671 XPLWT: SKIPGE T,XPLU
1686 MOVSI U,(SIXBIT /XPL/)
1695 XGPTAB: BLOCK XGNTPG/3+1 ;PAGE #'S OF XGP BUFS IN 12 BIT BYTES
1697 XGP11P: 0 ;POINTER TO 11 RING STRUCTURE (10 STYLE ADR INTO XGPC)
1698 XGPOB: 0 ;TEMP FOR OLD XGP11P
1699 XGP10P: 0 ;BYTE POINTER INTO XGPTAB FOR GETTING 10 BUFFERS
1700 XGPMTB: BLOCK TSYSM/36.+1 ;BIT TABLE FOR KEEPING
1701 ;TRACK OF AOSES OF MMSWP
1702 XGPUSR: -1 ;XGP USER INDEX, -1 IF NONE
1703 XGPINI: 0 ;IF -1, SIGNAL TO CLK CODE THAT ALL BUFFERS ARE NOW TIED DOWN.
1704 XFLSPC: 0 ;PC OF LAST CALL TO XGPFLS
1705 XGPSPM: BLOCK 8 ;STORAGE FOR PAGE MAP ENTRIES
1706 XGPTM1: 0 ;TIME FIRST PAGE TIED DOWN
1707 XPL: SIXBIT /XPL/ ;FILE + JNAME OF XPL INTERPRETER
1708 XPLU: 0 ;INDEX OF LOADED XPL
1713 IFE XGP,NXGPIM: JRST OPNL1 ;NO SUCH DEVICE
1715 SUBTTL ROBOT ARM ROUTINES
1720 AARMOVE: UMOVE A,(J)
1731 ; JUMPE C,ILUUO ;DONT ALLOW ARM TO RUN WITHOUT TIPBRK
1734 ; JRST ILUUO ;WRIST DETENT OFF NORMAL- BARF
1735 ; CONO TIPDEV,TIPBCH
1737 AARM1A: CONO PI,CLKON
1739 AARM1: SETZM ARMDF(B)
1741 SETOM DESTIN(B) ;NOT PREV IN USE, INITIALIZE
1746 PUSHJ P,IMXON ;START IMX
1747 SETOM ARMF ;ARM NOW IN USE
1749 ARML: UMOVE E,(A) ;PICK UP COMM
1751 JUMPE C,ARML1 ;NO INDEX
1752 XCTR XRW,[HRRZ Q,(C)]
1756 XCTR XRW,[HRR E,(E)]
1757 LDB D,[360600,,E] ;CHNL
1758 LDB C,[300600,,E] ;OP
1764 \fADF1: MOVSI D,-NARMCH
1765 ADFL: SKIPL A,ARMDF(D)
1776 ARMLOS: SETZM DLSRCH
1779 ARMOPT: ASDEST ;0 SET DEST
1781 ATDEST ;2 COMPARE COMPUTED POSN
1782 ATVEL ;3 COMPARE COMPUTED VELOC
1783 AADST ;4 COMPARE ACTUAL POS
1784 ARPOST ;5 READ CURRENT POSITION
1787 ARPOST: LDB B,IMPXPP(D) ;READ POSITION
1798 ADFSET: IORM E,ARMDF(D)
1808 AADST: LDB C,IMPXPP(D) ;COMPARE ACTUAL POSITION
1812 ATDEST: SKIPA C,DESTIN(D) ;COMPARE COMPUTED POSITION
1813 ATVEL: SKIPA C,VELOC(D) ;COMPARE COMPUTED VELOCITY
1820 SERVO: MOVSI A,-NARMCH
1823 SERV1: MOVE T,DESTIN(A)
1827 SERV1A: MOVN B,MAXV(A)
1842 SERV3: MOVEM T,VELOC(A)
1846 SERVX: AOBJN A,SERV1
1870 SERVI: LDB B,IMPXPP(A) ;INITIALIZE TO CURRENT ARM STATE
1880 AARMOFF: CAME U,ARMUSR
1888 AARMRS: CAME U,ARMUSR ;RESET ARM LOCK FLAGS
1891 AARMR1: SKIPL ARMLOK(A)
1894 SETOM DESTIN(A) ;RELOAD ARM COMM FROM CURRENT POS
1898 AARMR2: AOBJN A,AARMR1
1902 TIPBRK: DATAI TIPDEV,B
1903 TRNE B,1 ;WRIST DETENT
1905 SETOM ARMLOK+ARMVRT ;UNHAPPINESS
1906 TIPBR2: EXCH B,TIPBR
1919 ;0-10 AMF SWING VERT HORIZ YAW TILT GRIP ROTATE EXTEND ROLL
1920 ;11-12 NEW VIDI FOCUS IRIS
1922 ARMVRT==1 ;CHNL # OF ARM VERT
1924 DESMIN: IRPS A,,0 41 233 0 0 0 0 0 0 0 0
1927 DESMAX: IRPS A,,7777 7777 7323 7777 7777 7777 7777 7777 7777 7777 7777
1930 DESTIN: BLOCK NARMCH ;-1 NOT COMMANDED + VAL OF POSITION COMMAND
1931 POST: BLOCK NARMCH ;POSITION OF ARM AT PI LEVEL
1934 ARMDF: BLOCK NARMCH ;4.9 VARIABLE CHANGED 4.5 POS VAR 4.7 VEL 4.6 ACC
1935 ARMLOK: BLOCK NARMCH ;IF -1 AXIS LOCKED DO NOT ALLOW CHNG IN COMMAND
1937 MAXA: REPEAT NARMCH,14
1938 RMAXV: REPEAT NARMCH,140
1940 OMPXP: IRPS A,,2 3 4 6 7 12 11 10 5 32 31
1944 IMPXPP: IRPS A,,102 103 104 106 107 112 111 110 105 132 131
1945 301400-140000*<A-A/3*3>,,MPXBUF+A/3
1948 ARMUSR: -1 ;-1 OR INDEX OF USER DOING ARMOVE
1949 OMPXIF: 0 ;-1 => INITIALIZE DESTINS'S TO CURRENT ARM POSITION
1950 ARMF: 0 ;-1 ARM IN USE, 0 NO ARMOV EXECUTED
1951 TIPBR: 0 ;TIP BREAK REG LAST TIME READ IN
1955 SUBTTL INPUT MULTIPLEXOR
1959 JUMPE T,ILUUO ;MPX NOT AVAIL
1962 ANDI A,377 ;GET IMPX CHNL
1963 JUMPE A,CPOPJ ;CHNL 0 = END OF LIST
1964 IDIVI A,3 ;COMPUTE MPXBUF INDEX
1965 ADD A,MPXPT(B) ;FORM BYTE PTR
1966 MOVSI B,-NPOTCH ;SET UP TN DELETE PREVIOUS POT CONN
1967 PTS1: CAMN A,POTBPT(B) ;IS ENTRY FOR SAME CHNL
1968 SKIPG POTUSR(B) ;AND ACTIVE
1969 JRST PTS2 ;NO,KEEP LOOKING
1970 CAME U,POTUSR(B) ;IS THIS USER THE ONE WHO MADE ENTRY
1971 JRST ILUUO ;NO,ILLEGAL
1972 PUSHJ P,NARK ;DEACTIVATE AND FREE ENTRY
1974 PTS2: AOBJN B,PTS1 ;TRY NEXT ENTRY
1975 MOVEI B,400000 ;MASK FOR DELETE ONLY
1976 XCTR XRW,[TDNE B,(C)] ;SKIP ON NEW ENTRY WANTED
1977 JRST PTSR ;TRY FOR NEXT BLOCK
1978 MOVSI B,-NPOTCH ;SET UP TO FIND FREE ENTRY
1979 PTS3: SKIPL POTUSR(B) ;SKIP ON FREE
1980 PTS4: AOBJN B,PTS3 ;TRY OTHER SLOTS
1981 JUMPGE B,ILUUO ;NO SLOTS AVAIL
1982 CONO PI,CLKOFF ;PREVENT OTHER GRABBERS
1983 SKIPGE POTUSR(B) ;SKIP IF JUST TAKEN
1984 JRST PTS5 ;OKAY FOR SURE
1985 CONO PI,CLKON ;REENABLE
1986 JRST PTS4 ;TRY ANOTHER
1988 PTS5: SETZM POTUSR(B) ;MARK TAKEN
1990 AOS POTCON ;INCREMENT NUMBER SLOTS IN USE
1991 PUSHJ P,IMXON ;START IMPX
1992 CONO PI,CLKON ;AND ENABLE
1993 PTS6: MOVEM A,POTBPT(B) ;SAVE PTR TO MPXBUF FOR MPX ROUTINE
1994 XCTR XRW,[HRRZ A,1(C)] ;GET USER ADR
1995 XCTRI XRW,[MOVES (A)]
1998 XCTR XRW,[HLL A,1(C)] ;GET BYTE FIELDS
1999 TLNN A,777700 ;IF NONE SPECIFIED
2000 TLC A,4400 ;ASSUME FULL WORD
2001 TLZ A,77 ;FLUSH INDEX,INDIRECT
2002 MOVEM A,POTVPT(B) ;SAVE AS USER MEM PTR FOR MPX ROUTINE
2004 ANDI A,3 ;GET FLOAT + ABS BITS
2005 MOVEI D,PUFLI ;ADDR OF FLOATING INCREMENTAL UPDATE
2006 TRNN A,1 ;SKIP ON FLOATING
2007 MOVEI D,PUFXI ;ADDR OF FIXED INCREMENTAL UPDATE
2008 TRNE A,2 ;SKIP ON NOT ABSOLUTE
2009 SOS D ;ABS ROUTINE STARTS ONE BEFORE INCREMENTAL
2010 MOVEM D,POTUPD(B) ;SAVE ROUTINE ADDR FOR MPX ROUTINE
2011 PTS8: XCTR XRW,[MOVN D,2(C)] ;GET LOWER LIMIT
2012 MOVNM D,POTOFS(B) ;SAVE AS OFFSET FOR MPX ROUTINE
2013 TRNE A,1 ;SKIP ON FIXED
2014 JRST PTS9 ;GO SET FLOATING PARAMS
2015 XCTR XRW,[ADD D,3(C)] ;UL-LL
2016 ASH D,-2 ;SCALE MULTIPLIER
2018 PTS9R: MOVEM D,POTSCL(B) ;STORE SCALE FACTOR FOR MPX ROUTINE
2019 LDB D,POTVPT(B) ;GET CURRENT VARIABLE VALUE
2020 TRNE A,1 ;SKIP ON FIXED
2021 JRST PTS10 ;COMPUTE FLOATING INCR VALUE
2022 SUB D,POTOFS(B) ;D_VAL-LL FIXED
2023 MOVSI E,200000 ;SET TO ROUND VALUE
2024 ASHC D,-25. ;SCALE TO GET 12 BIT VALUE
2025 DIV D,POTSCL(B) ;COMPUTE INCR VAL FOR VAR
2026 PTS10R: HRROM D,POTVAL(B) ;STORE INCR VALUE FOR MPX ROUTINE
2027 MOVEM U,POTUSR(B) ;STORE USER TO ACTIVATE MPX ROUTINE
2028 PTSR: ADDI C,4 ;ADVANCE POINTER TO NEXT 4 WORD BLOCK
2029 JRST APOTS1 ;GO SET MORE TABLE ENTRIES
2031 PTS9: FADR D,3(C) ;UL-LL IN FLOATING
2032 FSC D,-12. ;SCALE DOWN FOR POT RANGE
2033 JRST PTS9R ;RETURN WITH SCALE FACTOR
2035 PTS10: FSBR D,POTOFS(B) ;D_VAL-LL FLOATING
2036 FDVR D,POTSCL(B) ;COMPUTE INCR VAL FLOATING
2037 MULI D,400 ;FIX INCR VAL
2038 TSC D,D ;WORK FOR BELOW LOWER LIMIT
2039 ASH E,-243(D) ;VALUE IN E
2040 MOVE D,E ;TO D LIKE FIXED
2041 JRST PTS10R ;RETURN WITH INCR VALUE
2048 ;POTS UPDATE CALLED BY MPX ROUTINE
2051 MOVSI A,-NPOTCH ;SET UP TO LOOP FOR ALL POT TABLE POSITIONS
2052 SETZM UPUSR ;INDICATE NO USER SET UP
2053 UPOT1: SKIPLE U,POTUSR(A) ;SKIP ON SLOT UNUSED OR IN PROCESS
2054 JRST UPOT2 ;GO TRY TO UPDATE VAR
2055 UPOTR: AOBJN A,UPOT1 ;TRY NEXT POT TABLE ENTRY
2056 LPMR UPTPGT ;RESTORE MAP
2059 UPOT2: CAMN U,UPUSR ;IS THIS USER LAST UPDATED
2060 JRST UPOT3 ;YES, RELOCATION IS SETUP
2061 MOVE T,USTP(U) ;TEST TO SEE IF
2062 SKIPN UMAPS(U) ;MAP LOADED TO POINT TO OTHER USER
2063 TLNE T,BUCSTP+BCSTOP ;USER BEING MOVED
2064 JRST UPOTR ;YES DON'T UPDATE FOR HIM
2065 MOVEM U,UPUSR ;SAVE AS LAST USER SET UP
2066 LPMR UPGML(U) ;LOAD USERS MAP
2067 \fUPOT3: LDB B,POTBPT(A) ;GET CURRENT ABS POSITION
2068 HLRZ C,POTVAL(A) ;GET POS LAST TIME
2069 TRNE C,400000 ;SKIP UNLESS FIRST TIME
2076 UPOT3B: HRLM B,POTVAL(A) ;SAVE FOR NEXT TIME
2077 SUB B,C ;GET AMOUNT OF INCREMENT
2078 CAIL C,5252 ;SKIP IF NOT IN UPPER THIRD
2079 JUMPG B,UPOT4 ;JUMP IF IN UPPER THIRD AND GOING UP
2080 CAIGE C,2525 ;SKIP IF NOT IN LOWER THIRD
2081 JUMPL B,UPOT5 ;JUMP IF IN LOWER THIRD AND GOING DOWN
2082 UPOT6: HRRE C,POTVAL(A) ;GET PREV INCREMENTAL VALUE
2083 ADD C,B ;UPDATE BY POT INCR
2084 CAILE C,7777 ;IF NEW VALUE WOULD EXCEED 7777
2085 MOVEI C,7777 ;CLAMP IT TO 7777
2086 CAIGE C,0 ;IF NEW VALUE WOULD BE LESS THAN 0
2087 MOVEI C,0 ;CLAMP IT TO 0
2088 HRRM C,POTVAL(A) ;STORE NEW INCR VALUE
2089 JSP B,@POTUPD(A) ;CALL ROUTINE TO COMPUTE NEW VARIABLE VALUE
2090 HRRZ T,POTVPT(A) ;STORE VAR IN USER MEM
2091 XCTRI XR,[MOVE B,(T)]
2097 XCTRI XW,[MOVEM B,(T)] ;STORE VAR IN USER MEM
2100 INARK: SETOM POTUSR(A) ;THIS POT A LOSER, FLUSH
2105 JRST UPOTR ;RETURN FOR MORE POTS
2107 UPOT4: HRREI C,-6(B) ;C_DELTA-6
2108 IMULI C,3 ;C_DELTA*3-22
2109 CAMLE C,B ;IF POT TURNED UP FAST
2110 MOVEM C,B ;THEN BOOST INCREMENT
2111 JRST UPOT6 ;RETURN TO STORE
2113 UPOT5: HRREI C,6(B) ;C_DELTA+6
2114 IMULI C,3 ;C_DELTA*3+22
2115 CAMGE C,B ;IF POT TURNED DOWN FAST
2116 MOVEM C,B ;THEN DECREASE DECREMENT
2117 JRST UPOT6 ;RETURN TO STORE
2119 PUFXA: HLRZ C,POTVAL(A) ;ABS ENTRY, USE DIRECT VALUE
2120 PUFXI: MUL C,POTSCL(A) ;INCR ENTRY, SCALE VALUE
2121 ASHC C,25. ;200000,,=FULL WORD
2122 ADD C,POTOFS(A) ;OFFSET VALUE
2123 JRST (B) ;RETURN WITH USER FIELD VALUE
2125 PUFLA: HLRZ C,POTVAL(A) ;ABS ENTRY FOR FLOAT PT
2126 PUFLI: TLC C,232000 ;FLOAT POT VALUE
2128 FMPR C,POTSCL(A) ;SCALE FLOATING VALUE
2129 FADR C,POTOFS(A) ;ADD OFFSET
2130 JRST (B) ;RETURN WITH NEW FLOATING VAR VALUE
2132 UPOT3A: MOVE C,B ;FIRST TIME USE CURRENT VALUE
2136 NARK: SETOM POTUSR(B) ;TURN OFF AND FREE POT CHANNEL
2137 SOS POTCON ;DECREMENT # OF SLOTS IN USE
2138 JRST IMXCL1 ;FLUSH THIS USE OF MPX AND MAYBE DEASSIGN MPXR
2140 POTCLS: MOVEI A,NARK ;ON CLOSE FLUSH ALL ENTRIES FOR USER
2141 POTCLA: MOVSI B,-NPOTCH ;SET UP TO TEST ALL ENTRIES FOR USER U
2142 POTCL1: CAMN U,POTUSR(B) ;SKIP IF DIFFERENT USER
2143 PUSHJ P,(A) ;FLUSH IT MAYBE
2144 AOBJN B,POTCL1 ;TRY ALL SLOTS
2148 POTUSR: REPEAT NPOTCH,-1 ;-1=FREE, 0=PROCESS, +=USER INDEX
2149 POTBPT: BLOCK NPOTCH ;BYTE PTR INTO MPXBUF
2150 POTVPT: BLOCK NPOTCH ;BYTE PTR INTO USER MEM INDEXED BY R
2151 POTVAL: BLOCK NPOTCH ;DIRECT VALUE,,INCR VALUE
2152 POTUPD: BLOCK NPOTCH ;ADDR OF ROUTINE TO COMPUTE NEW VALUE
2153 POTSCL: BLOCK NPOTCH ;SCALE FACTOR FOR VARIABLE
2154 POTOFS: BLOCK NPOTCH ;OFFSET FOR VARIABLE
2155 MPXPT: REPEAT 3,301400-140000*.RPCNT,,MPXBUF ;POINTERS FOR 12 BIT MPX BYTES
2156 UPUSR: 0 ;USER FOR WHOM RELOC SETUP AND NOT STOPPED
2157 UPTPGT: BLOCK 8 ;SAVE MAP
2159 POTCON: -1 ;<NUMBER OF POTS CONNECTED>-1
2161 PTNOIS: 3 ;IGNORE ANY CHANGE < OR = THIS AS POT NOISE
2168 ; DISPLAY INTERRUPT ROUTINE
2180 SRECYC: MOVE A,[B,,LPTB]
2183 JRST DSLTPB ;LIGHT PEN BREAK
2185 JRST SRCYRB ;RANDOM BREAK
2192 ; JRST DISF2 ;MISSING CLOCK BREAK DUE TO DIS
2197 ADDB A,DWDS ;CREDIT BACK WDS NOT USED
2201 JRST SRCY3 ;IDS OR DIS
2205 JUMPL A,SRCY2A ;SINGLE BLKO PNTR
2208 JUMPE A,SRCY5 ;THIS ENTRY NULL
2212 SRCY1C: JUMPGE A,SRCY5
2213 MOVEM A,LUBLKP ;SAVE FOR DEBUGGING
2216 LDB E,[1200,,A] ;WD WITHIN PG
2220 MOVE J,E ;SAVE # EXEC PGS REQD
2222 JUMPG E,SRCY2B ;CANT MAKE IT IN ONE WHACK
2223 MOVN Q,E ;SAVE MAX ACCEPT STARTING EXEC PG #
2228 ANDI C,776000 ;USER PG #
2229 MOVNI R,1 ;BEST STARTING PLACE SO FAR
2230 SRCY2D: CAMN C,340DA(E) ;LOOK FOR PG SET UP TO RIGHT USER PG
2231 JRST SRCY2F ;FOUND ONE
2232 SRCY2I: AOBJN E,SRCY2D
2234 JUMPGE R,SRCY2C ;PARTIALLY SET UP PLACE FOUND
2236 CAML Q,340DP ;NONE AVAIL, IS RING PNTR IN ACCEPTABLE AREA?
2238 CLEARB E,340DP ;NO RESET
2239 SRCY2C: MOVE R,DDAD(E)
2241 DPB R,[121000,,A] ;SWITCH BLKO PNTR TO EXEC MD PG
2244 HLRES A ;FOR GROSS DISPLAY LISTS
2245 ADDM A,DWDS ;APPROX TO WDS TO DISPLAY
2247 SOS A ;QUOTIENT MAY BE ZERO
2251 ADDI E,2 ;OFFSET FOR POINTER PAGES
2253 SRCY2E: CAME C,A340P1(E) ;PG SET TO RIGHT ADR?
2254 JRST SRCY2J ;NO SET UP
2257 SOJG J,SRCY2E ;SET UP ALL PGS IN BLOCK
2259 CONO DIS,100\SDCHN_3\DISCHN
2267 SRCY2B: JRST DISLOS ;TEMP
2269 SRCY2F: MOVE D,J ;FIRST PAGE MATCHES, DO ENOUGH ADDITIONAL PAGES MATCH?
2270 SOJLE D,SRCY2C ;ONLY ONE PAGE NEEDED. WINS
2273 SRCY2H: CAME TT,340DA(R)
2274 JRST SRCY2G ;NOT SET UP FOR WHOLE BLOCK
2278 JRST SRCY2C ;SET UP FOR WHOLE BLOCK. WIN
2280 SRCY2G: HRRZ R,E ;SAVE BEST SO FAR
2287 DPFTC2: CAME C,A340P1(E) ;PG SET UP TO RIGHT ADR?
2289 TRZ A,776000 ;YES RETCH REL ADR
2290 XCTRI [MOVE A,@DPAP(E)]
2292 JRST 4,. ;SHOULD HAVE BEEN VERIFIED WHEN LOADED
2294 DPFTC1: AOBJN E,DPFTC2 ;LOOP ON ALL EXEC PNTR PAGES
2295 MOVE E,340PP ;NONE SET UP SO SELECT ONE TO SET UP
2296 AOS D,340PP ;INCR IT FOR NEXT TIME
2299 DDFTC: SPM DPBS ;ENTRY FOR DATA PGS STORE MAP
2303 JRST DDFTC2 ;MAP MIGHT CHANGE
2306 SETOM A340P1(E) ;WIPE OUT OLD ENTRY
2307 LDB W,DPEP(E) ;PICK UP OLD PAGE
2308 TRZN W,600000 ;NO ACCESS
2315 SKIPGE DDEXCF+340P1(E)
2317 LDB R,[MUR,,MEMBLT(W)]
2321 ADDM R,MMSWP(W) ;REDUCE COUNT OF EXEC REFS
2322 DDFTC3: MOVE W,C ;SET PAGE IN E TO PNT TO ADR IN C
2323 LSH W,-10. ;GET USR PG #
2324 ROT W,-1 ;GET WD # AND SAVE WHICH HALF IN SIGN
2328 HRRZ R,(W) ;PICKS UP PAGE ENTRY
2329 HLRZ T,UPGCP-UPGMP(W)
2331 HRRZ T,UPGCP-UPGMP(W)
2333 JRST DDFTC1 ;NO ACCESS OR SWAPPED OUT
2340 JRST DDFTC2 ;CAN'T SET UP EXEC PG POINTING TO THIS ONE
2341 LDB TT,[MUR,,MEMBLT(Q)]
2344 CLEARM DDEXCF+340P1(E)
2346 ADDM TT,MMSWP(Q) ;AOS COUNT OF EXEC PGS
2347 DDFTC5: MOVEM C,A340P1(E)
2348 DPB R,DPEP(E) ;STORE USERS PG ENTRY IN EXEC MAP
2349 LPMR DPBS ;RESET ASSOC REG
2350 ANDI A,1777 ;FLUSH USER ADR EXCEPT WD IN PAGE
2351 XCTRI [MOVE A,@DPAP(E)] ;REF PAGE TO MAKE SURE ITS THERE, ETC
2355 DDFTC4: SETOM DDEXCF+340P1(E) ;INDICATE PAGE POINTING TO ABS PAGE
2358 DDFTC1: JUMPE R,DISLOS ;MAP COMPLETELY 0 MUST BE ILM
2362 MOVEM W,DISSPG ;RQ PG IN
2363 DDFTC2: MOVNI A,3 ;HANG FOR 3 60THS
2366 SRCY1A: JUMPGE A,SRCY1B
2368 SRCY1D: JSP B,DPFTCH
2371 SRCY1B: TLNN A,777000
2377 JRST DISF ;LIMIT REPETITION RATE
2378 SKIPL NDSFMS ;SKIP ON FRAME HACK NOT ACTIVE
2379 JSP B,ENDFM1 ;MAYBE STOP DISPLAY AFTER SPEC # OF FRAMES
2382 CONO DIS,100\SDCHN_3\DISCHN
2386 SRCY4: CONO DIS,200\SDCHN_3\DISCHN ;EDGE GRONK DIS AND KEEP GOING
2390 DISF2A: MOVEM A,DTIME
2398 DISF4: MOVEI A,DIS300-1
2400 SRCYCX: MOVE A,[JSR DBLKPB]
2401 SRCYB1: MOVEM A,40+2*DISCHN
2407 DCRSTP: SKIPE 340MD ;STOP DISPLAY FOR CORE SHUFFLING
2408 POPJ P, ;BUFFER NOT IN USER CORE SO NO ACTION
2409 DCRST1: SETOM CDISOF
2413 DCRRST: SKIPE 340MD ;DISPLAY RESTART
2416 CONO DIS,SDCHN_3+DISCHN
2420 DSLTPB: DATAI DIS,LLTPSN
2441 MOVE A,[BLKO DIS,DBLKOP]
2448 CONO DIS,100 ;WOULD ASSIGN IF IDLE
2458 DATAO DSDEV,[DSNDIS]
2461 ENDLIS: SETOM DISDIE
2465 JRST DISF ;LIMIT REPETION RATE
2467 JSP B,ENDFM1 ;HACK FRAME HACK
2468 CONO DIS,100\SDCHN_3\DISCHN
2471 ENDFM1: SKIPE NDSFMS ;STOP DISPLAY IF SPEC # OF FRAMES UP ELSE RETURN
2473 JRST ENDFM2 ;STOP WORLD
2476 ENDFM2: SETOM DISOFF
2479 SRCY5: MOVNI A,EWRT/2
2491 JRST DISF2A ;DIE FOR A LONG TIME
2497 CONO DIS,100\SDCHN_3\DISCHN
2501 SUBTTL 340 DISPLAY - .DSTART, .DSTRTL
2503 DISACR: CAME U,DISUSR
2505 SKIPE 340MD ;COME HERE IF PAGE BEING FLUSHED + EXEC PAGE POINTING TO IT
2506 JRST 4,. ;SHOULD NOT BE SET UP TO USER PAGE
2508 SETOM A340P1-340P1(T)
2514 DISAC1: SKIPGE DISOFF
2521 ;ROUTINES TO START 340 DISPLAY WITH DIS BUFF IN USERS CORE
2522 ADSTART: TDZA E,E ;CALL 10,
2523 ADSTL: MOVNI E,1 ;CALL 12,
2538 ANDIS: CAME U,DISUSR
2541 JUMPL A,ANDIT1 ;WAIT FOR COMPLETION OF LAST NDIS
2542 JUMPE A,ANDIT2 ;RETURN COUNT LEFT FROM LAST NDIS
2543 MOVEM A,NDSFMS ;DISPLAY N TIMES AND THEN STOP
2551 ANDIT1: SKIPL DISOFF
2555 ANDIT2: MOVE A,NDSFMS
2558 SUBTTL 340 DISPLAY - .DSTOP, .DCLOSE, .LTPEN
2559 ADSTOP: CAMN U,DISUSR ;OPER 16
2574 ADCLB1: SETOM A340P1(A)
2577 SKIPGE DDEXCF+340P1(A)
2578 JRST ADCLB2 ;POINTING TO EXEC PG
2581 ADCLB2: AOBJN A,ADCLB1
2584 CLEARM EXEUMP+.340P1
2585 REPEAT N340PB/2,CLEARM EXEUMP+.DPG0+.RPCNT
2596 ADCLOSE: CAME U,DISUSR ;OPER 15
2600 AIDS7: PUSHJ P,ADCLB
2605 DATAO DSDEV,[DSNDIS] ;DEASSIGN DIS
2608 AIDS8: MOVE A,U ;FLUSH CHNLS IN CASE OF .DCLOSE FROM DIS OR IDS
2614 CAME U,DISUSR ;CALL 14,
2616 XCTR XR,[SKIPL A,(C)]
2622 ALTPP1: CONO PI,LPTOFF ;INHIBITS LPEN BREAKS
2624 XCTRI XW,[MOVEM A,4(C)]
2629 LDB B,[121000,,A340P1-340P1(B)]
2631 XCTRI XW,[MOVEM A,5(C)]
2635 XCTRI XBW,[BLT B,3(C)]
2643 ALTPP2: XCTR XW,[SETZM (C)]
2644 XCTR XW,[SETZM 1(C)]
2647 ALTPPL: CONO PI,LPTON
2653 ADSDV: ;A HAS NEW 340MD
2655 CONI DIS,T ;DIS AVAILABLE
2659 JUMPE T,ADSDVN ;DIS NOT AVAIABLE
2660 ADSDV1: SKIPL T,DISUSR
2665 ADSDV2: SKIPGE A,DISUSR ;TAKE AWAY DISPLAY
2668 ADSDV7: SKIPL DISUSR
2672 PUSHJ P,CHSCAA ;CHANGE 340 CHANNELS TO NUL DEV
2676 ADSDV3: MOVE A,340MD
2677 ADSDVY: SETZM DBLINK
2678 SETOM NDSFMS ;TURN OFF FRAMER HACK
2680 JUMPE A,ADSDV5 ;SAME USER CLOBBERING HIS IDS OR DIS
2681 ADSDV6: PUSHJ P,ADCLB
2683 ADCL2: SKIPGE A,340BF
2693 POPJ P, ;NOT A 340 CH
2695 SKIPA T,[NLODN] ;UNIT MODE
2696 MOVEI T,NLBDN ;BLOCK MODE
2701 ADSDV5: SKIPGE 340MD
2706 ADSDVM: CAMN T,UMASTER
2707 JRST ADSDVN ;CURRENT USER UMASTER
2709 MOVE T,TTYTYP-USRRCE(T) ;GET BITS FOR NEW GUY IN LH OF T
2712 HLR T,TTYTYP-USRRCE(T)
2714 JRST ADSEQ1 ;CURRENT USER HAS HIGH PRIORITY
2716 JRST ADSEQ2 ;CURRENT USER NEAR 340
2717 TLNN T,%TT340+%TT3HP ;GIVE TO NEW GUY IF HE IS EITHER
2721 ADSEQ1: TLNN T,%TT3HP
2723 ADSEQ: SKIPL TTYTBL(U) ;MAYBE
2727 ADSEQ2: TLNE T,%TT3HP
2733 SUBTTL 340 DISPLAY AS ASCII DEVICE
2736 JRST OPNL10 ;NOT AVAILABLE
2743 LDB TT,[40200,,CSCALE]
2748 MOVEM T,DISCHS ;CHARS THAT WILL FIT THIS SIZE
2751 MOVEM T,DISLNL ;LINES THAT WILL FIT
2777 DSIZAP: SETZM DBLOAT
2784 PUSH T,[221700060000]
2787 MOVE A,[403737403737]
2797 MOVEI T,(HRRZ I,(A))
2823 PUSHJ P,340D1 ;ENTER CHR MOD INF NOT ALREADY
2825 AIDC1: HRRZ\HLRZ I,DISTBL(A)
2828 JRST 340FC ;NORMAL CHR
2830 JRST 340K ;FAKE OUT 340 NON-SPACING CHRS
2831 PUSHJ P,(I) ;ROUTINE DISPATCH (MAY SKIP OR SKIP TWICE)
2832 JRST 340E ;WRONG CASE OR SOMETHING, TRY AGAIN
2834 340F2: MOVE J,340BFP
2840 340FC1: SKIPL DISCHC ;DISPLAY IF COUNT NOT OUT BUT DONT INCR COUNT
2841 340FC: AOSG DISCHC ;INCR COUNT + DISPLAY IF NOT OUT
2845 340HD1: SKIPN 340XMD ;ESCAPE TO PARAM MODE
2847 340D1: MOVEI I,74117 ;PARAM WD
2849 PUSHJ P,340F ;STORE PARAM WD
2851 DPB I,[300600,,340BFP] ;SWITCH TO CHR MODE
2855 340K: MOVEI I,40 ;SPACE TO MAKE SPACING
2857 XCT AIDC1 ;GET NON-SPACING LETTER AND DISPLAY
2861 XCTR XRW,[MOVSS (C)]
2863 XCTR XRW,[MOVSS (C)]
2867 PUSHJ P,340H1 ;ENTER HALF WD MODE IF NOT ALREADY
2868 UMOVE I,(C) ;PICK UP LOSERS HALF WD
2871 340H1: MOVEI I,37 ;IN CHR MODE, EXCAPE
2873 LDB I,[360600,,340BFP]
2878 DPB A,[300600,,340BFP]
2882 BLNKON: MOVE A,DBLINK
2887 AND B,[770060,,1777] ;ADR OF PARAM WD TO BLINK INTEN OF
2897 BLNKOF: PUSHJ P,340HD1
2900 BLNKBR: SKIPN A,DBLINK
2901 JRST CLQRET ;BLINKING TURNED OFF
2906 BLNKB2: DPB C,DBLNKB-1(A)
2908 SETCMM DBLNKF ;COMPLEMENT FLAG
2909 BLNKB3: MOVEI T,15. ;1/4 SEC
2916 PUSHJ P,ADSDV ;DETERMINE IF THIS LOSER SHOULD GET DISPLAY
2918 AIDS3: PUSHJ P,TCALL
2920 JRST AIDS2 ;NO MEM AVAIL
2925 DPB B,[MUR,,MEMBLT(A)]
2939 ;INTERPRETIVE DISPLAY COMPILER
2941 IDISO: PUSHJ P,AIDS1
2942 JRST OPNL10 ;NOT AVAIL
2948 MOVEI Q,10135 ;TURN OFF LP SCALE 1 INT 5
2954 MOVSI A,(MOVE) ;DONT HACK CHR'S PER LINE
2962 340I: MOVEM C,AIDPCP
2967 JRST AIDL1 ;NOT CHR MODE
2968 MOVEI Q,(HRRZ I,(A))
2974 AIDCL: MOVE B,[440700,,R]
2977 AIDC1: HRRZ\HLRZ I,DISTBL(A)
2993 CAMN I,[JRST ONEFLS]
3004 CAMN B,[JRST ONEFLS]
3027 AIPT: LDB I,[251600,,R] ;PICK UP Y
3038 TRO E,2000 ;INTENSIFY
3051 AIDC4C: SKIPL DISCHC
3055 AIDC4B: AOSLE DISCHC
3064 AIDC2: PUSHJ P,AIDPY
3069 AIDC4A: IDPB I,340BFP
3076 AIDP1A: CONSZ DIS,DVEF+DHEF ;EDGE FLAGS
3086 DEG4B: HRRZ H,340BFP
3094 DEGFS: DATAI DIS,DEGVCC
3107 PUSHJ P,DEG4B ;LEAVING INSERT APPROPRIATE ESCAPE INSTEAD
3111 CONSO DIS,DVEF+DHEF+200
3115 JRST DEG5A ;RIDE OUT TO FINAL EDGE
3134 DEG5: MOVE TT,DEGVCC
3137 DEG3: CONSO DIS,DHEF
3144 DPB TT,[44000,,XFLD]
3145 DPB TT,[44000,,YFLD]
3147 CONO DIS,200 ;CONTINUE
3149 CONSO DIS,200+DVEF+DHEF
3154 JRST AIDP1 ;NOT COMING ON
3158 PUSH P,Q ;COMING ON PRODUCE SETPOINT
3194 JRST DEG5 ;NOT GOING OFF
3217 JRST DEG4D ;VECTOR TOTALLY OUT OF IT
3232 DEG4C: HRRZ I,DEGVCC
3246 LDB I,[40200,,VSCALE]
3248 ASH A,(I) ;GET X INC IN A
3252 AIINC: MOVE Q,ISCALE
3258 AIIN1: MOVE D,[440600,,R]
3260 LDB E,[200,,T] ;LOAD COUNT
3261 JUMPE E,AIIN5 ;NULL INCREMENT
3262 AIIN7: TRNN T,4 ;SKIP ON INTENSIFY
3264 SKIPG DDINCI ;SKIP ON SET TO INTENSIFY
3267 AIIN7A: LDB H,[30300,,T]
3270 PUSHJ P,AIIN6 ;MAYBE START NEW WORD
3273 AIIN5: TLNE D,700000
3284 AIIN6: TLNE B,770000
3287 AIIN6A: PUSHJ P,AIDPY
3294 JRST AIIN7A ;INTENSITY AGREES
3305 LDB A,[251700,,R] ;DY
3306 LDB B,[61700,,R] ;DX
3357 AIOP: LDB B,[60300,,R]
3370 AIPSJ: XCTR XRW,[AOS D,43] ;PICK UP PDL PNTR AND INCR
3371 XCTR XRW,[MOVEM C,(D)] ;STORE RETURN PC
3376 XCTR XRW,[HRRZ C,(D)]
3377 JUMPE C,AIEXT ;POPJ INTO 0 START SIGNAL
3392 CONO DIS,1100\DISCHN\SDCHN_3
3407 AIPS: LDB A,[140600,,R]
3417 HLLEM R,AISWS ;START MODE
3426 AIPSA: MOVEM B,CSCALE
3432 XFLD: 0 ;HIGH ORDER BITS OF X COOR REG (LIGHT=0)
3434 CDISOF: 0 ;DISPLAY OFF IN CORE ALLOC
3435 340BF: -1 ;POINTER TO 1K BLOCK FOR 340 BF (MEM ADR)
3436 340BFP: 0 ;POINTER TO 340BF
3438 DBLINK: 0 ;0=IDLE ;+N=NUM OF ENTRIES
3439 DBLNKF: 0 ;BLINK FLAG, -1 MEANS START BLINK OFF
3440 DBLNKB: BLOCK DBLNKN ;BYTE POINTER TO PARAMETER HW TO CHANGE
3441 BLINKB: 0 ;CLOCK QUEUE BLOCK
3444 AIDPCP: 0 ;USER LOCN WHERE TO STORE BACK PC IF NECC
3445 CSCALE: 0 ;SCALE FOR CHR WRDS
3446 ISCALE: 0 ;SCALE FOR INCREMENT
3447 VSCALE: 0 ;SCALE FOR VECTOR WDS
3448 DWDL: 0 ;14 BIT COOR OF LH 340
3449 DWDB: 0 ;14 BIT COOD OF BOT 340
3450 DEGVCF: 0 ;EDGE FLAG FOR VECT -1 UNLESS GOING AWAY
3451 DEGVCC: 0 ;COORD AT EDGE
3452 DDINCI: 0 ;-1 CURRENT INTENSITY NOT COMMITED (IN INCREMENT MODE)
3454 AISWS: 0 ;SELECT DISPLAY START MODE -1 STARTS DISPLAY AFTER IOT
3455 AIDPIC: 0 ;COORDINATES AT START OF AIDPY
3457 LLTPSN: 0 ;. TO .+3 BLTED TO USER
3461 LTPDCN: 200\SDCHN_3\DISCHN
3463 LDISP: 0 ;DISPLAY LINK POINTER
3464 LMODE: 0 ;LISP LINK MODE FLAG
3465 DISOFF: -1 ;-1 IF DIS NOT IN USE OR STOPPED DUE TO FRAME HACK
3468 340MD: -1 ;MODE IN WHICH DISPLAY OPEN
3469 ;-1 NOT DISPLAYING 0 .DSTART ETC 2 AS DIS OR IDS
3470 340DMD: 0 ;0 IDS -1 DIS
3471 340XMD: 0 ;IN DIS, 0=CH 1=IMAGE
3473 340T: 0 ;TIMER FOR DIS PAGE
3474 LUBLKP: 0 ;LAST USER BLKO PNTR SET UP AT IN LEVEL, FOR DEBUGGING
3476 ;START 340 EXECPG AREA
3478 A340P1: -1 ;USER ADR THAT EXEC PG SET UP FOR
3480 340DA: REPEAT N340PB,-1
3481 N340CL==.-A340P1 ;THIS BLOCK MUST BE CONSEC
3482 340DP: 0 ;0=> N30PB-1 PNTR TO DATA PGS
3483 340PP: 0 ;PNTR TO 340P1 OR P2 ALTNERATELY
3485 DPAP: 400000+340P1*2000(A) ;EXEC ADR TO REF PAGE
3486 400000+340P2*2000(A)
3487 DDAD: REPEAT N340PB, 400000+<DPG0+.RPCNT>*2000(A)
3489 DPEP: .340P1+EXEUMP ;BYTE PNTR TO EXEC MAP PAGE ENTRY
3491 DDEP: REPEAT N340PB, CONC .DPG,\.RPCNT,+EXEUMP
3493 DPBS: BLOCK 8 ;SAVE PAGE BOX AT PI DIS LVL
3495 DROOT: 0 ;DIS RESTART POINTER TO LOSER CORE
3496 DBLKOP: 0 ;TEMP DIS BLKO PTR
3498 DISON: 0 ;-1 IF DIS STOPPED AFTER SPECIAL INT OR BLKO OVERFLOW
3499 ;IE RESTART AFTER PASSAGE OF TIME
3500 DISDIE: 0 ;0 ;-1 IF DIS HASNT DIED
3501 DISTPR: 0 ;-1 TO TURN OFF DISPLAY
3502 IDBLKP: 0 ;BLKO PNTR IF IN INTERP DISPLAY MODE
3503 NDSFMS: -1 ;-1 NOT HACKING FRAME HACK ELSE NUMBER OF FRAMES REMAINING
3504 DISNTO: 0 ;# TIMES DIS OR IDS OPEN
3505 DWDS: 0 ;- # WDS SENT TO DIS-EWRT PER TRIP THRU SRECYC
3506 ;RESET TO MDISWD EVERY 1/30
3507 ;IF <0 DISPLAY STOPS FOR 5 SEC -300.->DTIME
3509 DISCHS: 0 ;LENGTH OF LINE IN CURRENT SIZE
3510 DISCHC: 0 ;-# CHR POS REMAINING
3511 DISLNL: 0 ;# OF LINES WILL FIT CURRENT SIZE
3512 DISLNS: 0 ;# LINES REMAINING
3529 ADISCR: MOVE I,DISCHS
3538 DSATB: MOVEI I,40 ;B
3545 DISBLB: MOVEI I,50 ;DOWN ARROW
3547 TRO A,100 ;CONVERT TO UC LETTER
3548 DISUC: SKIPA I,[HRRZ I,35(A)] ;SWITCH TO UC
3549 DISLC: MOVE I,[HLRZ I,36(A)] ;SWITCH TO LC
3550 PUSHJ P,AIDC4 ;STORE CASE CODE
3554 ADISBS: MOVEI I,72 ;BACKSPACE
3558 DISRUB: MOVEI I,"X&77 ;LC X
3560 MOVEI I,72 ;340 BACKSPACE
3565 DISTBL: POPJ2,,POPJ2 ;IGNORE 0
3574 REPEAT 33-16,LC DISBLB
3575 LC 47 ;ALT MD (RT ARROW)
3578 REPEAT 133-41,UC <.-DISTBL>&77
3585 REPEAT 173-141,LC <.-DISTBL-140>
3587 LC 62 ;VERTICAL BAR=174
3591 IFN .-DISTBL-200,PRINTX /DISTBL LOSS/
3605 REPEAT NDOPL, CONC AIER,\.RPCNT+1,: JSP D,AIER
3607 AIER: HRRZ R,UUAC(U)
3609 MOVEI D,1+1-AIER1(D)
3611 IORM D,IOCHST-IOCHNM(R)
3619 SUBTTL NEW VIDISECTOR ROUTINES
3623 NVIDI: MOVEI Q,NVDOBK
3636 TLNE C,1 ;ONLY DO IF TVC OUTPUT OPEN
3640 NVIDI3: PUSHJ P,OPNL25
3647 NVIDIT: SKIPGE NVDIFL
3653 PUSHJ P,NVDVS1 ;TURNS OMPCH ON
3661 RNVDIU: SKIPN NVDCNT ;TVC INPUT
3663 XCTR XRW,[MOVES (C)] ;MAKE SURE GOING TO WIN
3671 CAIL T,NVDBUF+NVDLNG
3680 TVCCLS: SOSGE NTVCOS
3681 PUSHJ P,TVCINI ;TRY TO AVOID GARBAGE PNT PART WAY VIDISECTED
3682 NVDCLS: SOSGE NVDUSE
3686 TVCNOS: LDB A,[251700,,C] ;TVC OPEN ROUTINE
3687 TVCN1: TRZ A,703000 ;DONT LET LOSER FOOL AROUND
3689 LDB B,[20300,,A] ;DCO
3692 JRST TVCO6 ;DCO DISABLED FOR DCL=7
3695 TVCO7: MOVEM B,NVDDK ;DARK VALUE CORRECT FOR DCO
3699 JRST TVCO5 ;CHANGE IN VIDI SELECTION STATUS
3700 TVCO5A: MOVEM A,TVCONO
3703 TVCO3: LDB T,[200,,A] ;CONF
3705 MOVNI B,100 ;IF CONF=3 & DCO=0 VALUE 100 LESS THAN PREDICTED ABOVE
3708 TVCO5: TRZ A,700000 ;CLEAR CHNL OUT OF TVCONO
3709 CONO NVDX,(A) ;START RLYS
3711 SKIPL TVQBLK+1 ;WAIT IF PREV RQ NOT SATISFIED
3713 PUSHJ P,CLQADD ;RQ LATER TRANSFER TO VIDD1
3717 TVCO6: LDB T,[200,,A] ;CONF
3718 IMUL T,[-200] ;CALCULATE WHEN OVF HAPPENS
3722 TVCINI: CONO PI,OMXOFF
3732 VIDFLS: SKIPL NVDUSE ;SKIP IF OPENS ON NVD, .VSCAN
3734 DATAO DSDEV,[DSNVID] ;DEASSIGN VIDI
3738 NVDGET: CONO NVDX,@TVCONO ;TRY TO ASSIGN BAT
3744 NVDBRK: MOVE T,NVDBKR
3745 JRST NVTAB(T) ;DISPATCH ON REASON FOR BREAK
3747 JRST NEWORK ;STARTUP OF SOME NEW FUNCTION
3748 NVTAB: JRST SCNB1 ;NEW VSCAN POINT
3749 JRST TVB1 ;NEW TVC POINT
3750 JRST INVD1 ;NEW NVD PNT
3751 ; JRST DRET ;NEW DAEMON POINT
3753 TVB1: DATAI NVDX,@NVDVPT ;READ IN OF TV POINT
3756 DPB T,[220200,,@NVDVPT] ;READ ALL RELAVENT INFO FROM BAT
3758 JRST TVB2 ;DCO OR OVFL
3762 JRST TVB2 ;DUE TO NOISE/PROB DARKER THAN DCO
3764 CAIL T,NVDBUF+NVDLNG
3766 MOVEM T,NVDVPT ;INCREMENT TO NEXT POINT
3770 DPB T,[1200,,@NVDVPT]
3771 DPB T,[240600,,@NVDVPT] ;PUT IN FLOATING PART
3773 DPB T,[330400,,@NVDVPT]
3776 TVNEXT: MOVE T,NVDVPT
3779 MOVEI T,1 ;SET UP FOR NEXT TV POINT
3800 TVB5: TLC T,232000 ;CALCULATE SETTLING TIME
3803 DATAO NVDT,SETLL-10.(T)
3806 SETLL: ;SETTLING TIME IN 10 MICROSEC
3807 -6 ;DEFLECTING 512 - 1023
3815 RNVDOU: MOVEI T,NVDLNG-1 ;TO PREVENT HANGUP AT PI ON WRAPAROUND
3822 CAIL T,NVDBUF+NVDLNG
3827 NVDVS1: MOVE T,TVCONO
3832 RNVDO2: POP P,T ;CALLED FROM RNVDI ALSO
3838 NEWORK:; SKIPGE DAEMFL
3840 SKIPL SCNUSR ;DEFLECT FOR NEW VSCAN POINT
3844 SKIPGE TVFLG ;DEFLECT FOR NEW TVC POINT
3846 SETOM NVDBKR ;NO MORE CROCKS FOR VIDISECTOR TO DO
3848 TRZ T,703000 ;SAVE STATE OF VIDI SELECT
3852 DATAO DSDEV,[DSNVID] ;RE DEASSIGN VIDI IF WAS DEASSIGNED
3853 ;(CONO DID CLEAR PIA, DONE, AND SET MODE FLOPS THO)
3859 INVD1: DATAI NVDX,NVDCOR
3862 DPB T,[220200,,NVDCOR]
3876 SUBTTL NEW VIDISECTOR ROUTINES - .VSTST
3881 JUMPE A,AVST1 ;READ CURRENT STATE
3883 AVST3: SKIPL SCNUSR ;HANGUP TILL VSCAN FINISHED
3886 SCNSTP: CONO PI,OMXOFF ;FLUSH VSCAN ENTIRELY
3888 JRST OMXONJ ;ALREADY FINISHED
3892 SKIPN NVDBKR ;IGNORE VSCAN POINT IN PROGRESS IF ANY
3899 SCNS2: LDB A,VEXT(W)
3916 AVST4: JUMPE A,ILUUO
3919 AVST1: SKIPGE SCNUSR
3922 SUBI A,400000+VSB1*2000
3925 ;CHECK TO SEE IF MEM PROTECT STILL OK
3926 SCNACR: CAMN U,SCNUSR
3935 ;RESTART SCAN AFTER STOP FOR SHUFFLING
3936 SCNRST: CONO NVDX,NVDCHN_17
3940 SUBTTL NEW VIDISECTOR ROUTINES - .VSCAN
3942 AVSCAN: XCTR XRW,[MOVES (C)]
3943 XCTR XRW,[MOVES 12(C)]
3956 XCTR XRW,[HLRZ A,2(C)]
3959 XCTR XRW,[HRRZ A,2(C)]
3961 IRPS XY,,X Y P X Y P,A12,,1 1 1 2 2 2,N,,3 6 11 4 7 12,YX,,X X X Y Y Y
3966 IRP XY,,[P,X,Y]ADR,,[[[1,,]],5(C),10(C)]
3970 IFE .IRPCNT, ADD A,ADR
3971 IFN .IRPCNT, XCTR XRW,[ADD A,ADR]
3974 IFN .IRPCN,[IDIV A,BATP1
3977 XCTR XRW,[HRRZ B,1(C)]
3990 XCTR XRW,[HLRO D,1(C)]
3993 JUMPLE A,VSLOS ;SIZE OF RASTOR
3996 JRST VSLOS ;WON'T FIT
3998 JRST VSLOS ;WON'T FIT IN EXEC PGS
4005 TRCE A,600000 ;SKIP ON R/W/F
4006 JRST VSLOS ;TOP PAGE LOSES
4008 ADDI B,400000+VSB1*2000
4010 XCTR XRW,[HRRZ A,(C)]
4020 XCTR XRW,[SKIPL (C)]
4024 VSLS3: PUSHJ P,LSWPOP
4025 VSLOS: PUSHJ P,VSLS1
4029 VPGLOS: PUSHJ P,VSLS1
4046 JUMPE A,VSMS2 ;NO ACCESS
4051 JRST VSMS3 ;SWAPPED OUT
4055 VSMS2: DPB A,T ;CHANGE R/W/F TO R/W
4066 VSLS4: PUSHJ P,LSWPOP
4069 VSMS3: PUSHJ P,LSWPOP
4081 \fSCNB1: DATAI NVDX,@NVDPTR
4084 DPB T,[220200,,@NVDPTR]
4086 JRST SCNB1C ;OVF OR DCO?
4089 CAMG T,NVDDK ;OR VALUE GREATER THAN DCO LEVEL
4091 SCNB1C: MOVE T,NVDDK
4092 DPB T,[1200,,@NVDPTR]
4093 DPB T,[240600,,@NVDPTR] ;PUT IN FLOATING PART
4095 DPB T,[330400,,@NVDPTR]
4098 SCNB2: CONO NVDX,@TVCONO ;SETUP FOR NEXT VSCAN POINT
4114 SCNT4: CLEARM NVDBKR
4116 SCNB1A: JRST SCNG1 ;OR AOS (AOSA) NVDPTR
4118 JRST SCNS1 ;HOMO LINEAR FROB
4119 SCNB1B: SOSG NVDCNX ;SIMPLE MINDED
4128 SCNT5: TLC T,232000 ;CALCULATE SETTLING TIME
4131 DATAO NVDT,SETLL-10.(T)
4147 SCNB4: SKIPL NVDCNY ;WAIT FOR LAST DATAO TO RETURN A POINT
4153 DATAO DSDEV,[DSNVID] ;DEASSIGN BAT
4156 SCNB4B: LDB A,VEXT(W)
4166 SCNS1: MOVEM U,NVDTMU
4172 IFN .IRPCN,[IDIV T,BATP1
4176 SCNBX1: MOVE U,NVDTMU
4185 IFN .IRPCN,[IDIV T,BATP1
4192 SCNG1: MOVSI T,(AOSA)
4203 SUBTTL NEW VIDISECTOR ROUTINES
4207 NVDIPT: NVDBUF ;POINTER TO INSERT IN BUF
4208 NVDVPT: NVDBUF ;POINTER TO WORD BEING VIDISECTED
4209 NVDOPT: NVDBUF ;POINTER TO WITHDRAW FROM BUF
4210 NVDCNT: 0 ;NUMBER PTS IN BUF
4211 NVDBUF: BLOCK NVDLNG
4213 LBTCNO: 0 ;LAST CONO TO BAT
4214 NVDIFL: 0 ;+=> RQ TO READ NVD PNT
4215 NVDCOR: 0 ;NVD DEV, COORDINATES TO PI, READ DATA FROM PI
4216 NTVCOS: -1 ;# TVC OPENS
4233 SCNUSR: -1 ;USER IN CURRENT .VSCAN, -1 .VSCAN FREE
4235 TVCONO: 0 ;CONO FOR TVC DEVICE AND VSCAN (NORM HAS CHNL BUT NOT IF IN VIDDLY)
4236 NVDDK: 0 ;-1=>VID VALUE CORRESP TO DCO
4237 TVFLG: 0 ;-1=>TVC WORK IN PROGRESS
4238 NVDBKR: -1 ;REASON LAST POINT READ IN, DISPATCH ADDRESS FOR INTS
4239 ;-1 NONE 0 VSCAN 1 TVC 2 NVD
4240 TVQBLK: 0 ;CLOCK QUEUE BLOCK
4243 VIDXOL: 0 ;OLD VIDI CORDS
4244 VIDYOL: 0 ;OLD VIDI CORDS
4245 VIDTEM: 0 ;LARGEST DELTA
4252 VIDD1: MOVEI A,NVDCHN_15.
4253 IORB A,TVCONO ;RESTORE CHNLS TO TVCONO
4254 CONO NVDX,2000(A) ;CAUSE EVENTUAL VIDI INT TO SEE IF ANYTHING YO DO
4255 JRST CLQRET ;RETURN TO CLOCK ROUTINE
4258 SUBTTL VIDEO SWITCH AND VIDEO BUFFER ROUTINES
4260 ;SYSTEM CALLS FOR HACKING THE VIDEO SWITCH AND VIDEO BUFFERS.
4274 MOVSI B,-MXVBN ;FLUSH ALL BUFFERS ASSIGNED TO JOB IN U
4275 VBDFL3: CAMN U,VBAST(B)
4277 VBDFL2: AOBJN B,VBDFL3
4290 JSP Q,NVDBU2 ;FLUSH BUFFER
4291 JFCL ;PDP11 TIMED OUT
4292 JFCL ;PDP11 GAVE NEGATIVE REPLY
4296 VBDFL5: CAMN U,VBAST(B)
4297 VBDFL4: SETOM VBAST(B)
4302 ;VIDBUF SYSTEM CALL - ASSIGN OR DEASSIGN VIDEO BUFFERS
4303 NVDBF: JSP Q,11CM1 ;SET UP ACS, LOCK SWITCH.
4305 JUMPGE A,NVDBU1 ;JUMP IF DEASSIGN COMMAND
4306 MOVSI C,2_<16.+4-18.>
4307 JSP Q,NVDCMD ;TELL PDP11 TO ASSIGN BUFFER.
4308 JRST OPNL7 ;PDP11 TIMED OUT
4309 JRST OPNL6 ;PDP11 GAVE NEGATIVE REPLY
4312 JRST OPNL6 ;PDP11 HAS MORE VIDEO BUFFERS THAN WE DO
4317 NVDBU1: MOVE B,A ;DEASSIGN VIDEO BUFFER
4318 CAIGE B,MXVBN ;CHECK THAT VIDEO BUFFER IS LEGAL
4319 CAME U,VBAST(B) ;AND BELONGS TO THIS JOB
4320 JRST OPNL33 ;NOT LEGAL VIDEO BUFFER NO
4321 JSP Q,NVDBU2 ;TELL PDP11 TO FREE THE BUFFER.
4322 JRST OPNL7 ;TIMED OUT
4323 JRST OPNL23 ;GAVE NEG REPLY
4327 ;TABLE OF VIDEO BUFFER ASSIGNMENTS.
4328 VBAST: REPEAT MXVBN,-1 ;-1 => FREE, ELSE USR IDX.
4329 11CVSR: -1 ? 0 ;SWITCH TO LOCK TO PROTECT 10-TO-11 COMMAND VARS.
4332 ;VIDSW SYSTEM CALL - SET VIDEO SWITCH.
4333 NVIDSW: JSP Q,11CM1 ;LOCK SWITCH, ETC.
4339 MOVSI C,1_<16.+4-18.>
4341 JRST OPNL7 ;TIMED OUT
4342 JRST OPNL23 ;PDP11 DIDN'T FEEL LIKE SWITCHING THE SWITCH
4345 NVDBU2: SETOM VBAST(B) ;GIVE DEASSIGN COMMAND TO 11
4347 MOVEM B,1(I) ;WHICH ONE TO DEASSIGN
4350 MOVSI C,3_<16.+4-18.>
4351 ;GIVE COMMAND IN C TO PDP11, WAIT, RETURN (Q) IF 11 TIMES OUT,
4352 ;1(Q) IF 11 GIVES NEGATIVE REPLY AND 2(Q) IF SUCESSFUL
4353 ;IN ANY CASE, SWITCH IS UNLOCKED
4354 ;ASSUMES ARGS ALREADY SET UP, AND 11CVSR LOCKED.
4355 NVDCMD: MOVEM C,(I) ;STORE COMMAND-TYPE, TELLING PDP11 TO GO.
4357 JRST NVDCM2 ;IT'S FINISHED, WE WIN.
4358 SOJG T,NVDCM1 ;LOOP FOR A WHILE,
4360 JRST (Q) ;FAIL - 11 TIMED OUT
4362 NVDCM2: MOVE C,1(I) ;RETURNED ARG IN CASE OF ASSIGN VIDEO BUFFER
4364 SKIPGE (I) ;PDP11 FINISHED: DID COMMAND SUCCEED?
4365 AOS Q ;YES SKIP EXTRA TIME
4370 ;LOCK SWITCH AND SET UP.. RETURN TO (Q) IF FAILS (SWITCH NOT LOCKED IN THAT CASE)
4371 ;RETURN TO 1(Q) IF SUCEEDS
4377 LDB T,[061600,,TT11HA]
4378 LDB I,[061600,,400000+TTPG0*2000(T)]
4379 ADDI I,400000+TTPG0*2000 ;I HAS 10-TO-11 COMMAND BFR ADDR.
4380 MOVSI T,1 ;# TIMES TO LOOP WAITING FOR 11 TO ACKNOWLEDGE
4382 JRST 1(Q) ;11 READY FOR COMMAND.
4388 SUBTTL TABLET AND ROBOT CONSOLE
4399 CONO RBTCON,RTABC_3+TABCHN
4400 ] IFN TABCLK, CONO RBTCON,RTABC_3
4403 JUMPL A,ITAB ;TRY AGAIN
4408 JRST ITAB3 ;PEN OUT OF CONTACT
4409 LDB B,[221400,,A] ;X
4431 ITAB6: DATAI RBTCON,A ;FLUSH DATA
4434 ITAB7: CONO RBTCON,0
4437 ITAB2: MOVE B,TABSMC
4438 DPB B,[140600,,TABLST]
4446 JUMPE A,ITAB5 ;JUST STARTING UP
4458 ITAB4: MOVSI B,(SETZ) ;SET DATA LOST
4466 ;ROBOT CONSOLE READ SWITCHES
4469 CONO RBTCON,RLTSWC_3+IFE TABCLK,TABCHN
4479 ;4.9 DATA LOST BEFORE THIS
4483 ;2.9-2.4 REPEAT COUNT
4486 TABO: PUSH P,[TABO1]
4491 TABO1: POPJ P, ;OPEN LOST
4492 SKIPE TABUSE ;OPEN WON
4493 JRST POPJ1 ;NOT FIRST OPEN
4496 MOVEM T,TABRTE ;TABLET RATE (IGNORE THIS MANY BETWEEN TAKES)
4498 MOVEM T,TABDTA ;DELTA FOR COORD TO BE DIFFERENT
4500 IFE TABCLK, CONO RBTCON,RTABC_3+TABCHN
4501 IFN TABCLK,[ PUSHJ P,CLQAD1 ;START UP CLOCK LEVEL
4505 BTABI: UMOVE J,(C) ;INITIAL AOBJN PNT
4507 UTABI: SKIPG TABCC ;TABLET .IOT
4508 JRST TABI1 ;NO DATA AVAIL, SEE IF BEING ACCUMULATED
4509 UTABI1: MOVE A,@TABOP
4525 TABI2: XCTR XRW,[CAMN J,(H)]
4526 JRST TABI3 ;NO WDS TRANSFERRED
4527 SUB P,[1,,1] ;RETURN TO USER SOME HAVE BEEN TRANSFERRED
4530 TABCLR: CONO PI,TABOFF
4540 IFE TABCLK, SETZM TABRTC
4545 TABBUF: BLOCK LTABBF
4547 TABOP: TABBUF ;OUTPUT PNTR (MP)
4548 TABIP: TABBUF ;INPUT PNTR (PI)
4549 TABCC: 0 ;ACTIVE WDS IN TAB BUFFER
4550 TABSMC: 0 ;COUNT OF TIMES "SAME" DATA RECEIVED FOR TAB
4551 TABLST: 0 ;LAST DATA
4552 TABLSZ: 0 ;Z OF LAST DATA
4555 TABDTA: 0 ;DELTA FOR COORD TO BE DIFFERENT
4556 TABRTE: 0 ;TABLET RATE (TAKE EVERY N'TH ONE)
4557 IFN TABCLK,[TABQBK: 0 ;CLOCK QUEUE BLOCK
4562 TABRTC: 0 ;COUNT WITHIN TABRTE
4568 SUBTTL INPUT MULTIPLEXOR ROUTINES
4573 JRST IMPXO2 ;READ AT MN PRGM
4574 SKIPGE IMPXF ;IMAGE (READ AT PI)
4584 JRST 4,. ;SHOULD NOT HAVE BEEN LESS THAN -1
4585 PUSHJ P,CLQAD1 ;START CLOCK LEVEL
4601 IMPXCL: TRNE A,4 ;SKIP ON WAS READING AT MP
4602 IMXCL1: SOS IMPXF ;WAS READING AT PI
4610 IMPXT: 301400,,MPXBUF(A)
4618 AIMXW4: MOVE T,MPXWF
4620 MOVNI T,2 ;CHNL NOT READ IN BY PI HACK
4624 AOJGE T,AIMXW3 ;PI FROB HAS CYCLED (MAYBE)
4626 JRST AIMXW2 ;READING IMX AT PI
4627 DATAO MPX,A ;SELECT CHNL
4628 CONO MPX,0 ;START CONVERSION
4633 XCTR XRW,[DATAI MPX,(C)]
4637 AIMXW3: SKIPGE MPXWF
4638 JRST AIMXW4 ;IT WAS JUST SETOMMED
4639 JRST AIMXW5 ;HAS BEEN READ IN BY PI HACK SO GOBBLE DATA
4641 IMPXFE: XCTR XRW,[SETOM (C)]
4645 JRST MPXRT1 ;USING IMX AT MN PRGM LVL
4646 MOVE T,[<-LCHN>/3-1,,MPXBUF-1]
4647 MOVEM T,MPXPTR ;SET UP BLKI POINTER
4648 MOVE T,[BLKI MPX,MPXPTR]
4649 MOVEM T,IMXLC ;SET UP DC INTERUPT LOCN
4651 MOVEM T,IMXLC+1 ;SET UP DC INT LOC+1
4652 DATAO MPX,[0] ;READ STARTING WITH CHNL 0
4657 MOVEI T,2 ;1/30 SEC, HAIRY POTS
4659 MPXRT1: MOVEI T,1 ;LOST RETRY IN 1/60
4662 JRST CLQREE ;RE-ENTER RQ
4669 IMPXF: -1 ;-1 IF MPX NOT RUNNING
4671 MPXBLK: 0 ;CLOCK QUEUE BLOCK
4676 IMXSW: -1 ;-1 IF IMX AVAIL
4678 MPXBUF: BLOCK <LCHN>/3+1
4698 MPXCYG: MOVEM 17,IMXACS+17
4707 UPOTRT: MOVSI 17,IMXACS
4713 SUBTTL OUTPUT MULTIPLEXOR ROUTINES
4726 OMPXS: XCTR XRW,[DATAO OMPX,(C)] ;ZAP CHNL
4729 OMPXCL: SOSGE OMXNTO
4758 ; JSP E,SPUR ;SPURIOUS INT
4759 OMXRET: MOVSI 17,OMXACS
4764 SUBTTL MORSE CODE SENDER (COD DEVICE)
4767 ; CODITC==CODBFL*5-1 ;WHEN TO TRY TO INTERRUPT
4769 CLKCOD: SETOM TT ;USED AS A FLAG
4781 JRST CLQTTR ;RE-ENTER OR NOT DEPENDING ON TT
4783 CLKCC1: MOVE A,CODCC
4789 CAMN A,[10700,,CODBUF+CODBFL-1]
4798 CLKCC6: MOVE B,CDRUB
4810 SETZM TT ;INDICATE IDLE
4813 ;CLKCC7: MOVE A,CODUSR ;GET INDEX OF USER
4814 ; MOVE B,CODITB ;GET CHANNELS OPEN MASK
4815 ; AND B,MSKST2(A) ;FIND OUT WHAT CODE CHANNELS ENABLED,
4818 ; IORM B,IFPIR(A) ;AND REQUEST INTERRUPT ON LOWEST NUMBERED ONE
4819 ; JRST CLKCC8 ;SEND REMAINING CHARACTER(S) IN BUFFER
4821 ;RETURN HERE FROM STDOPN
4822 CODO1: POPJ P, ;NON-SKIP RETURN
4823 AOS (P) ;DO NOT CHANGE TO JRST POPJ1 AT END
4824 MOVEI I,1 ;INDICATE "IOPOP"
4826 ;CODE DEVICE IOPUSH AND IOPOP ROUTINE (SETS INTERRUPT MASK)
4828 CODIOP: SUBI R,IOCHNM(U) ;GET "AC FIELD" (ROUTINES THAT NEED IT RESTORE R)
4829 MOVE A,CHNBIT(R) ;SET UP INTERRUPT BIT
4830 XCT CDPTBL(I) ;IORM OR ANDCAM TO CODITB
4833 CDPTBL: ANDCAM A,CODITB ;IOPUSH AND CLOSE
4834 IORM A,CODITB ;IOPOP AND OPEN
4837 CODCLS: MOVEI I,0 ;TO SIMULATE IOPUSH
4838 PUSHJ P,CODIOP ;CLEAR RELEVANT INTERRUPT BIT
4839 CONO PI,CLKOFF ;CLOSE, USE STANDARD SEQUENCE
4846 XCTR XRW,[MOVE A,(C)] ;UNIT OUTPUT
4848 BSEND: JSP E,NBTOCH ;BLOCK OUTPUT
4854 SKIPG CODCC ;WAIT FOR ROOM
4858 CAMN A,[10700,,CODBUF+CODBFL-1]
4863 PUSHJ P,CLQADD ;START UP CLOCK LEVEL
4867 CODO: PUSH P,[CODO1] ;CODO1 SETS UP INTERRUPT BIT
4873 CODSSS: SETOM CODSSF
4876 CODSST: SETZM CODSSF
4882 CODRS: CONO PI,CLKOFF
4889 CODFIN: MOVE T,CODBFL*5 ;.CALL FINISH
4895 CODITB: 0 ;MASK OF CHANNELS OPEN, 1.1=>0
4896 CODITD: 0 ;RANDOM SCRATCH LOCATION
4897 CODWD: 2 ;CURRENT WORD
4898 CODTIM: 0 ;CLOCK QUEUE BLOCK
4901 CODSPD: 3 ;CODE SPEED (SET FROM CHARS >=140) WPM= 75./(CODSPD)
4903 CODPTR: 440700,,CODBUF
4904 CODIPT: 440700,,CODBUF
4905 LSTBIT: 0 ;FLUSH 60 CPS CHIRPS
4908 CODBUF: BLOCK CODBFL
4915 IFSE B,-,[WRD=WRD+7*BIT
4917 IFSE B,.,[WRD=WRD+BIT
4919 IFSE B, ,[BIT=BIT_2]
4931 REPEAT 2,GCODE -.--.-
4938 IRP A,,[-----,.----,..---,...--,....-,.....,-....,--...,---..,----.]
4943 27727 ;K WITH LONG LAST DAH
4948 IRP A,,[.-,-...,-.-.,-..,.,..-.,--.,....,..,.---,-.-,.-..,--,-.,---,.--.,--.-
4949 .-.,...,-,..-,...-,.--,-..-,-.--,--..]
4958 CDRUB: GCODE ........
4965 SUBTTL CALCOMP PLOTTER ROUTINES
4975 PLOTW2: IDPB A,PLPTR
4977 CAMN A,[600,,PLBUF+LPLBUF-1]
4986 PLOTW1: PUSHJ P,UFLS
4989 PLOTW3: SKIPG T,PLBFS
4995 BPLOT: MOVEI E,PLOT1
4998 PLOTO: MOVEI Q,PLOTOC
5002 PLOTEL: ;TELL WHO'S USING THE PLOTTER
5003 BUG INFO,[PLOTTER USER],SIXBIT,UNAME(U),SIXBIT,JNAME(U)
5009 PLTRS: MOVEI A,LPLBUF*6
5016 PLTBRK: MOVE A,PLBFS
5022 CAMN B,[600,,PLBUF+LPLBUF-1]
5027 TRO A,SDC+PDC+SD+PLTCHN
5034 PLSTP: CONO PLT,SDC+PDC
5041 PLPTR: 440600,,PLBUF
5042 PLIPTR: 440600,,PLBUF
5044 IPL: SIXBIT /IPL/ ;FILE NAME 2 OF IPL JOB (USED FOR LOADING ASO JNAME OF IPL JOB)
5045 IPLU: 0 ;USER INDEX OF IPL JOB IF IT EXISTS OR -1 IF IPL BEING LOADED
5047 ;INTERPRET PLOTTER OPEN ROUTINE
5049 IPLO: CONO PI,CLKOFF
5050 PUSHJ P,IPLST ;INITIATE LOADING OF IPL JOB
5054 PUSHJ P,IPLWT ;WAIT FOR IPL JOB TO FINISH LOADING
5056 MOVE T,IPLU ;INDEX OF IPL JOB
5058 JRST IPLO2 ;IPL JOB OPNS CLA ON CNNL 0
5060 CAME T,[.SLEEP 17,] ;IPL JOB DOES SLEEP 17, WHEN READY
5061 IPLO2: JRST OPNL10 ;DEVICE NOT AVAILABLE
5064 MOVE A,UNAME(T) ;SET UP CLI OPEN
5065 MOVSI B,(SIXBIT /IPL/)
5073 IPLO1: PUSHJ P,UDELAY
5076 IPLST: SKIPL T,IPLU ;MAKE SURE IPL JOB NOT ALREADY BEING LOADED
5077 PUSHJ P,IPLIN ;MAKE SURE IPL JOB NOT ALREADY IN
5078 JRST POPJ1 ;DONT LOAD
5085 ;ROUTINE TO SEE IF IPL JOB WINS. CLKOFF OR CLKBRK IN PROGRESS
5086 IPLWT: SKIPGE T,IPLU ;CHECK IPL JOB LOADING FLAG
5087 POPJ P, ;IPL JOB STILL LOADING WAIT
5088 PUSHJ P,IPLIN ;SEE IF IPL JOB IN CORE
5089 SKIPE IOCHNM(T) ;SEE IF IPL JOB IN USE
5091 MOVE T,SV40(T) ;SEE IF IPL JOB READY
5092 CAMN T,[.SLEEP 17,] ;IPL JOB DOES .SLEEP 17, WHEN READY
5094 POPJ P, ;NOT READY YET, WAIT
5096 IPLIN: PUSH P,U ;ROUTINE TO SEE IF IPL JOB IN. C(T)=C(IPLU), CLKOFF OR CLKBRK IN PROGRESS
5098 JRST IPLIN1 ;USER VARIABLES SLOT FLUSHED
5100 AOJN U,IPLIN1 ;UNAME OF IPL JOB IS -1 (IN LH)
5101 MOVSI U,(SIXBIT /IPL/)
5103 IPLIN1: AOS -1(P) ;IPL JOB NOT IN, SO SKIP
5109 NUJBST: MOVEI TT,MXCZS ;ENTRY FROM ELSEWHERE TO DO SIMILAR THINGS
5110 SKIPL DEDTIM ;SKIP IF SYS DEAD
5112 POPJ P, ;RING BUFFER FULL, WAIT
5119 SETOM 1(T) ;SET JOB LOADING FLAG
5122 SUBTTL PDP-6 AS INFERIOR
5126 ;INTERRUPT THE PDP6, I/O CH SHOULD HAVE PDP6 OPEN AS INFERIOR
5127 ;THIS CALL DOESNT SKIP OR INTERRUPT TO THE USER
5129 AIPDP: MOVSI T,%CLS6
5140 ;INTERRUPT FROM PDP6, MAYBE GENERATE IO CHANNEL USER INTERRUPT
5142 DSDBRK: CONO DSDEV,10 ;TURN OFF FLAG
5143 ;ALSO KEEP IT FROM INTERRUPTING FOR A WHILE
5144 ;GETS TURNED ON AT DISMISS, SETOM PICLR AND SLOW CLK
5146 JRST LPTRT3 ;NO ONE WANTS AN INT
5151 IORM B,IFPIR(A) ;GENERATE USER INT
5154 ;PDP6 .OPEN ROUTINE (GET HERE FROM USR OPEN)
5156 PDPO: SKIPL PDP6UP ;MAKE IT EASY TO MARK PDP6 AS DOWN.
5159 JRST PDPO1 ;DON'T TRY TO ENABLE INTERRUPTS
5160 TLO C,400000 ;TRY TO ENABLE INTERRUPTS
5174 MOVEM U,PDPISR;GOT IT AS INFERIOR
5175 PUSHJ P,LSWPOP ;RELEASE TREESW
5176 MOVEI I,1 ;DO "IOPOP" INTO CHNL
5179 POPJ P, ;NOT OPEN TO INTERRUPT
5182 ADDI R,IOCHNM(U) ;RESTORE R
5186 PDPIOT: ANDCAM A,PDPMSK
5189 PDPCLS: MOVEI I,0 ;CLOSE
5190 PUSHJ P,PDPIOP ;=> DO "IOPUSH"
5191 PDPCL1: CONO PI,CLKOFF
5193 SETOM PDPUSR ;LAST CHANNEL CLOSED
5195 JRST CLKONJ ;NOT INTERRUPT ENABLED THIS CHNL
5197 SETOM PDPISR ;LAST CHANNEL CLOSED
5201 PDPO3: MOVEI U,(A) ;MAKE U INDEX OF SUPERIOR
5202 PDPO2: SKIPL A,SUPPRO(U) ;GET POINTER TO SUPERIOR, SKIP IF TOP LEVEL
5203 JRST PDPO3 ;TRY AGAIN
5205 TLO C,200000 ;SIGNAL PDP6 TO UBI ETC
5212 PDPUCL: MOVSI C,%CLS6 ;GET PDP6 CLSTB BIT
5213 MOVEI R,IOCHNM(U) ;GET PNTR TO USER'S IO CHNL AREA
5214 HRLI R,-20 ;MAKE AOBJN PNTR TO ALL CHNLS
5215 PUSHJ P,PDPCCK ;CHECK CHNL
5216 PUSHJ P,PDPCZP ;CLOSE CHNL IF PDP6 OPEN ON IT
5217 AOBJN R,.-2 ;REPEAT FOR ALL CHNLS
5218 HRLI R,-LUIOP/2 ;MAKE AOBJN PNTR TO IO PDL (ADR ALREADY THERE)
5219 PUSHJ P,PDPCCK ;CHECK ENTRY FOR PDP6
5220 PUSHJ P,PDPPZP ;CLEAR ENTRY IF PDP6 CHNL
5221 AOJ R, ;INCR TO SKIP IOCHST ENTRY
5222 AOBJN R,.-3 ;REPEAT FOR WHOLE IO PDL
5223 POPJ P, ;ALL PDP6 CHNLS THIS JOB SHOULD NOW BE CLOSED
5225 PDPCCK: HRRZ B,(R) ;GET CLSTB INDEX FROM IOCHNM
5226 TDNN C,CLSTB(B) ;IF NOT PDP6 CHNL
5227 AOS (P) ;SKIP CLOSING CHNL
5230 ;CLOSE PDP6 USER CHNL
5231 PDPCZP: PUSHJ P,PDPCLS ;ADJUST PDP6 VARS
5232 JRST STDCLX ;CLOBBER CHNL & RETURN
5234 ;CLEAR PDP6 IO PDL ENTRY
5235 PDPPZP: PUSHJ P,PDPCL1 ;ADJUST PDP6 VARS (EXCEPT PDPMSK)
5236 SETZB A,(R) ;CLEAR SAVED IOCHNM
5237 DPB A,[4000,,1(R)] ;CLEAR SAVED IOCHST (SAVING CHNL # FOR .IOPDL)
5239 \fPDPCLR: OFFSET 20-. ;ROUTINE TO BE MOVED
5240 CONO PI,11577 ;CLEAR PI
5241 CONO 655550 ;CLEAR PROCESSOR
5242 DATAO 20,.+1 ;RELEASE DEVICES
5243 SETZ ;CLEAR 0, ALSO BIT FOR DEASSIGNMENT (^)
5244 HRRZI 1,1 ;BLT POINTER 0,,1
5245 BLT 1,41 ;CLEAR AC'S, SELF, AND 41
5247 OFFSET 0 ;BACK TO NORMAL
5250 PDPTMP: 0 ;TEMP FOR INT
5251 PDPMSK: 0 ;MASK OF INT BITS OF CHNLS OPEN
5255 PDPRST: PUSHJ P,MP6LD
5256 MOVE C,[400020,,400021]
5257 XCTR XW,[CLEARM 400020]
5258 XCTR XBRW,[BLT C,437777]
5259 MOVE C,[PDPCLR,,400020]
5260 XCTR XBW,[BLT C,400000+PDPCLE-1]
5265 JUMPE A,PDPRS2 ;JUMP ON ROUTINE WON, DON'T HAVE TO CLEAR IT OUT
5266 XCTR XW,[CLEARM 400020]
5267 MOVE C,[400020,,400021]
5268 XCTR XBRW,[BLT C,400041]
5272 SUBTTL DL10MP SYSTEM CALL
5277 ;CREATES A READ/WRITE, UNENCACHED, ABSOLUTE PAGE AT THAT POINT
5278 ;IN THE USER'S MAP. THE PAGE CONTAINS THE DL10 CONTROL AREA.
5279 ; VAL 1 - AOBJN POINTER TO DL10 CONTROL AREA WITHIN PAGE
5280 ; VAL 2 - POINTER TO 3 WORDS USED FOR PDP11 EXAMINE/DEPOSIT COMMANDS
5281 ; VAL 3 - POINTER TO FIRST FREE WORD WITHIN DL10 CONTROL AREA
5283 DL10MP: TDNE A,[-400]
5284 JRST OPNL33 ;PAGE NUMBER TOO BIG
5286 LDB C,Q ;GET CIRC POINTER
5288 JUMPN C,OPNL13 ;PAGE SLOT ALREADY IN USE
5289 BUG INFO,[DL10MP BY],SIXBIT,UNAME(U),SIXBIT,JNAME(U)
5290 MOVEI C,600000+<DL10AR_-10.> ;SUITABLE PTW
5292 MOVEI C,-1 ;ABS CIRC PNTR
5295 LSH A,10. ;USER'S VIRTUAL ADDRESS
5299 SUBI A,2000-<DL10AR&1777> ;VIR ADDR OF START OF DL10 CONTROL AREA
5300 HRLI A,-100 ;SIZE OF DL10 CONTROL AREA
5301 MOVEI B,DL10XD-DL10AR(A)
5302 MOVEI C,DLXEND-DL10AR(A)
5309 ; ARG 1 - <JOB> SPEC
5310 ; ARG 2 - CHANNEL NUMBER IN THAT JOB TO BE OPENED AS TRAP DEVICE
5311 ; ARG 3 - IOCHNM WORD (ONLY LH IS USED)
5312 ; ARG 4 - IOCHST WORD
5313 ;THIS GIVES THE INFERIOR A TRAP DEVICE CHANNEL, WHICH GIVES
5314 ;A %PITRP INTERRUPT ON MOST OPERATIONS. THE INFERIOR SIGNALS
5315 ;ITS DESIRE TO GET SUCH A CHANNEL BY OPENING THE TRAP DEVICE,
5316 ;WHICH ALSO GIVES A %PITRP INTERRUPT.
5317 ;TRPOPN IS ALSO USEFUL FOR STORING ERROR CODES INTO IOCHST OF AN ALREADY-OPEN TRAP CHANNEL
5319 TRPOPN: TDNE B,[-NIOCHN]
5320 JRST OPNL14 ;BAD CHANNEL NUMBER
5329 JRST OPNL31 ;CAN'T MODIFY JOB
5330 ADDI B,IOCHNM(J) ;GET IOCHNM WORD ADDRESS
5333 JUMPN T,OPNL13 ;FILE ALREADY EXISTS (YOU MUST CLOSE THE CHANNEL FIRST)
5336 MOVEM D,IOCHST-IOCHNM(B)
5337 JRST LSWPJ1 ;UNLOCK DIELOK, TAKE SUCCESS RETURN