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 UTAPE SERVICE ROUTINE
24 UTCHNT: ;BEG FOR GETSYS (UTAPE)
25 UTBFP: REPEAT NUTIC+NUTOC,400000,,377 ;L H BUFFER LINK PTR (INPUT PI)
26 ;RH " " OUTPUT MAIN PROG
27 UTUSR: ;USER OR -1 IF FREE (LH)
28 UTUL: REPEAT NUTIC+NUTOC,-1 ;LINK TO CHANNEL ON SAME UTAPE OR -1(RH)
29 UTDIRP: BLOCK NUTIC+NUTOC ;BYTE POINTER TO UTDIR
30 UTDBC: BLOCK NUTIC+NUTOC ;RH BLCK COUNT CORRESP WITH UTDIRP
31 ;L H 3.1 3.5 READ FILE NO 4.9 ERROR 4.5 4.8 ERROR CNT
32 ;3.6 =0 FORD EXT =1 BACK EXT 3.7 4.2 PUT FILE NO
33 ;4.4 DELETE ON READ CLOSE
34 UTBFS: BLOCK NUTIC+NUTOC ;BUFFERS IN USE
35 UTLSTM: BLOCK NUTIC+NUTOC ; TIME LAST BUF TAKEN BY PROG
36 UTMBN: BLOCK NUTIC+NUTOC ; MN PROG ACTIVE BFFR NO OR -1,IF NO BUFFER ACIVE (LH)
37 UTRAC: BLOCK NUTIC+NUTOC+1 ;ACTIVE BUFFER NO PI RH
38 ;FLAG TO MAIN PROG TP FULL (WRITE) RH
39 ;SIGN SET =>CHANNEL LOCKED
40 ;4.8 READ EOF REACHED AT PILEVEL OR CHNL CLOSED
41 ;EXTRA WORD FOR FILE DIR CHNL
42 ;4.7 DONT RELOAD AT PI
46 BLOCK NUTOC ;NAME OF FILE BEING WRITTEN
49 MPRP: BLOCK NUTIC+NUTOC ;MAIN PRGM BUFFER PNTR
50 MPRC: BLOCK NUTIC+NUTOC ;CNT REMAINING
51 UTTNO: BLOCK NUTOC+NUTIC ;TAPE NO (RH)
52 ;LH CLOSE FLAG WRITE ORG FILE NO READ
53 UTEOF: BLOCK NUTIC ;END OF FILE CHR
55 UTLDD: BLOCK NUTIC+NUTOC+1 ;IF -1, DC IS ACTUALLY SET UP AND TRANSFER CAN
56 ;BE EXPECTED IN LESS TAH 100 MS.
57 ;IF D CHANNEL LOCKED FLAG(4.9 UTRAC) WELL BE CHECKED
58 ;BEFORE GOING TO THE -1 STATE
59 ;EXTRA WORD FOR DIR CHNL
60 UTDERR: BLOCK NUTIC+NUTOC+1 ;4.9 ERROR 4.8 ABORT 4.7 UTAPE FULL
62 NUTCA: 0 ;NUMBER UTAPE CHANNELS ACTIVE
63 NUWCA: 0 ;# WRITE CHNLS ACT
65 UPCHFS: 0 ;FAIR SHARE BFS PER CHNL
67 LUTWBF==40 ;LENGTH OF BLK # PASSING LIST
68 UTWBF: REPEAT LUTWBF,.+1 ;LIST FOR PASSING BLK NOS FROM M.P. TO PI ON WRITE (INIT FS)
69 0 ;TERMINATOR FOR FS LIST
70 UTWBFS: UTWBF ;FS PNTR
72 IFNDEF MXUTBF,MXUTBF==40 ;MAX BUFFERS FOR AN INPUT CHANNEL.
84 UTCH: ;BEG FOR GETSYS (UTAPE)
85 TAG ULCTM:, REPEAT NUNITS,-1 ;LAST TIME EUPOS RECOMPUTED
86 ;IF DG2=0.E. 0 THEN ACT POS =EUPOS+<TIME-ULCTM>*UDIR
87 TAG DRTM:, REPEAT NUNITS,177777,,-1 ;177777,,-1 => NO TIMING OP
88 ;N => DEAD RECKON UNTIL T=N
90 TAG UDIR:, BLOCK NUNITS ;0=>STOP -1=>BACK 1=>FORW
91 IFN NEWDTP, TAG OUDIR:, BLOCK NUNITS ;DIR OF LAST OP
92 TAG UGOAL:, REPEAT NUNITS,-1;POSIT GOAL OR -1 IF UNIT FREE
93 TAG EUPOS:, BLOCK NUNITS ;ESTIMATED UNIT POSITION
94 ;SEE ULCTM IF DGW .NE. 1
95 TAG DCHNT:, REPEAT NUNITS,-1;HEAD CHANNEL LIST OF UT OR -1 IF NO CHN ACT
96 TAG UMEMAD:, IFE NEWDTP,REPEAT NUNITS, BLKO DC, ;GOAL MEMADR-1
97 IFN NEWDTP,REPEAT NUNITS,BLKO DTC,
98 TAG URDWR:, BLOCK NUNITS ;0 READ -1 WRITE(LOADED OPERATION)
99 TAG DG2:, REPEAT NUNITS,-1;+ => ACCURATE
100 ;0 => EUPOS FAIRLY ACCURATE
101 ;-1 => DO NOT DEAD RECKON WITHOUT UTC
102 TAG UTASS:, REPEAT NUNITS,0 ;0 IF NOT ASSIGNED, SYSTEM NAME IF ASSIGNED
103 TAG UDIRO:, REPEAT NUNITS,-1;ORGIN OF DIRECTORY
104 ;OR -1 DIR NOT LOADED OR 4.9 DIR LOCKED OR 4.8+4.9 DIR DOUB LOCKED
106 ;IF DIR LOCKED, IT MAY BE REFERENCED BUT NOT CHANGED
107 ;4.5=0 => DIR AT LEAST ON WAY IN
108 ;4.4=1 => TAPE IN UBLAT MODE
111 TAG UFLAPF:, BLOCK NUNITS ;4.9 FLAPPING RQSTED OR IN PROGRESS
112 ;4.8 RQ TO ABORT FLAPPING
113 ;4.7 DRIVE ACTUALLY ON THE WAY
114 ;4.6 (TD10 ONLY) 0 PHASE 1 STOP 1 PHASE 1 STOP DONE
115 ;RH TIME TO STOP AFTER FLAPPED
117 TAG ULDCH:, BLOCK NUNITS ;NUMBER OF LOADED CHANNEL IN LH
118 ;BUFFER NO OF DIR (INDEX INTO IOBFT) IN RH
119 ;LH 4.9 = LOW PRIORITY POSIT
122 TAG UDPWF:, REPEAT NUNITS,-1 ;DIRECTORY PAWED OVER FLAG
124 TAG UMNFB:, BLOCK NUNITS ;MAIN PRGM FREE BLOCKS ON TAPE
126 TAG UTERP:, BLOCK NUNITS ;LH ERROR CODE (CONI UTS,) RH # ERRORS
128 TAG UMNTR:, BLOCK NUNITS ;UNAME OF LAST JOB TO READ IN DIRECTORY
130 SUNIT: 0 ;SELECTED UNIT OR 0
131 IFE NEWDTP, SUNITL: 0 ;SAME _ 3
132 SMODE: -1 ;-1 POSIT 0 DATA
133 UIDLE: -1 ;-1 UTAPES COMPLETELY IDLE
135 IFN NEWDTP, CUINT: 0 ;-1 CLK HAS CAUSED BREAK
136 WRITE: 0 ;0 READ -1 WRITE
141 UTTM1: 0 ;UNIT COULD START IN SEARCH LOOP
142 UTTM2: 0 ;MOST PRESSING UNIT SO FAR
143 UTTM3: 0 ;TIME FOR ABOVE OR -1 IF NONEĆ®
144 UTTM4: 0 ;TAPE TO START FLAPPING (FLAG FLAP IN PROG IF NEWDTP=1)
146 UTTM5: 0 ;TAPE TO STOP FLAPPING
150 LUTOTM: 0 ;TIME OF LAST UT OPER
151 UTHERR: 0 ;UT HANGUP ERR
152 USTSW: 0 ;UT START SWITCH
153 UDCC: 0 ;-1 IF UTAPE HAVE DC FOR BLK CYCLE
154 UTCHE==.-1 ;END FOR GETSYS (UTAPE)
158 ;UTAPE CONTINUOUS NON-FILE IO
160 AUBL2: CONO PI,UTCON ;DIRECTORY LOCKED, MAYBE ITS BEING FLAPPED
162 AUBLAT: XCTR XRW,[SKIPLE I,(J)] ;GET TAPE NUM, C(AC), SKIP IF NEG OR ZERO
163 CAIG I,NUNITS ;SKIP IF TOO BIG
164 PUSHJ P,UTSNMK ;DON'T ALLOW UTAPE HACKERY UNLESS ASSIGNED
165 POPJ P, ;ERR EXIT, BAD TAPE NUM
168 AOJE B,AUBL1 ;DIR NOT IN
170 JRST UTCONJ ;NOT IN UBLAT MODE
177 ;.ASSIGN - ASSIGN A DECTAPE UNIT.
178 AASSIGN:XCTR XR,[MOVE I,(J)]
191 ADESIGN:XCTR XR,[MOVE I,(J)] ;DEASSIGN UTAPE
202 ;SET UTAPE NAME ;.UTNAM AC, ;LH(AC)=6BIT NAME, RH(AC)=TAPE #
204 AUTNAM: XCTR XR,[MOVE Q,(J)]
206 JUMPE I,CPOPJ ;TOO SMALL
207 CAIG I,NUNITS ;TOO LARGE?
208 PUSHJ P,UTSNMK ;ASSIGNED TO SOMEONE ELSE?
210 TLO D,1 ;SET FLAG TO EXIT FROM OPEN ROUTINE
211 PUSHJ P,UTO0 ;GET DIR IN CORE, LOCK, ETC.
212 TLNE TT,210000 ;CHECK FOR DIRECTORY NOT READ IN, UBLAT MODE
213 JRST LSWPOP ;JUMP ON LOSSAGE
214 HLRZ A,Q ;GET TAPE NAME
215 AOSN UDPWF(I) ;DIRECTORY PAWED OVER YET?
216 PUSHJ P,UDPW ;NO, GO DO IT
217 MOVE J,UDIRO(I) ;GET POINTER TO DIR
218 XOR A,177(J) ;GET DIFF BETWEEN OLD & NEW NAMES
219 TRNN A,-1 ;IS THERE ANY?
220 JRST AUTN2 ;NO, SKIP SOME CRUFT
221 TLZ A,-1 ;IGNORE DIFFERENCES IN LH
222 XORM A,177(J) ;MODIFY NAME TO NEW NAME
223 TLO J,100000 ;SET DIR CHANGED BIT
224 AUTN2: MOVEM J,UDIRO(I) ;STORE MODIFIED POINTER
227 UDPW: HRRZ J,UDIRO(I)
229 DPB TT,[370500,,177(J)]
240 ;INITIALIZE UTAPE DIRECTORY ;.UINIT AC, ;C(AC)=TAPE #
241 ;TAPE MUST BE ASSIGNED
243 AUINIT: XCTR XRW,[SKIPLE I,(J)] ;TAPE # TOO LOW?
244 CAILE I,NUNITS ;OR HIGH?
246 PUSHJ P,UTSNMK ;OR NOT ASSIGNED TO THIS USER
248 TLO D,1 ;SET EXIT FLAG FOR OPEN ROUTINE
249 PUSHJ P,UTO0 ;GET DIR, LOCK IT, ETC.
250 TLNE TT,210000 ;CHECK FOR UBLAT MODE, DIRECTORY NOT READ (TT=UDIRO(I))
252 SETZM (TT) ;CLEAR FIRST LOC
253 HRLI A,(TT) ;SET UP LH OF BLT POINTER
256 MOVE A,[757367573674] ;GET WORD OF 7 5-BIT BYTES VALUE 36
257 MOVEM A,56(TT) ;INDICATE FIRST 7 BLOCKS RESERVED
258 MOVSI A,660000 ;ONE 5-BIT BYTE, VALUE 33
259 MOVEM A,67(TT) ;MARK FILE DIRECTORY BLOCK
260 HRROS 177(TT) ;MARK END OF DIR
261 SETZM UDPWF(I) ;INDICATE DIR PAWED OVER
262 MOVEI A,559. ;# OF FREE BLOCKS IN EMPTY TAPE
263 MOVEM A,UMNFB(I) ;STORE FOR FUTURE REFERENCE
264 TLO TT,100000 ;INDICATE CHANGED
265 MOVEM TT,UDIRO(I) ;UPDATE POINTER
270 AUDISM: XCTR XRW,[MOVE A,(J)] ;OPER 22
271 NFLAP: JUMPLE A,CPOPJ
276 AUTDM1: SKIPGE UTUSR(C)
280 JRST UTCONJ ;SOME ONE USING TAPE
281 AUTDM2: AOBJN C,AUTDM1
287 ;ATTEMPTED DIRECTORY READ GOT FLUSHED
288 UTOLOS: TLNE D,1 ;CHECK EXIT FLAG
289 JRST NULSET ;NOT .OPEN, SEIZE NOTHING AND RETURN
290 JRST OPNL7 ;.OPEN, SIGNAL DEVICE NOT READY
292 UTOF1: MOVSI TT,200000
293 IORM TT,UFLAPF(I) ;RQEST ABORT OF FLAP
296 PUSHJ P,UFLS ;HOPE FOR BEST
297 UTO: PUSHJ P,UTSNMK ;MUST BE ASSIGNED
299 JUMPE I,OPNL1 ;UTAPE OPEN
304 JRST UTOF1 ;FLAPPING IN PROGRESS
307 JRST UTO4 ;FILE DIR IN OR ON THE WAY
311 MOVEM TT,UMNTR(I) ;TELL WHO FIRST CAUSED DIR TO BE READ IN
318 CAMLE T,UDIRO(I) ;WAIT FOR DIRECTORY TO COME IN OR GO OUT
319 IORB TT,UDIRO(I) ;IF IN THEN LOCK IT
322 JRST UTOLOS ;DIDN'T GET READ IN
323 PUSHJ P,SGNSET ;MAKE SUURE DIRECTORY GETS UNLOCKED ON PCLSR
325 TLNE D,1 ;CHECK SPECIAL EXIT FLAG
328 JRST UTOBL1 ;IN UBLAT MODE
332 JRST UTDEL1 ;DELETE OR RENAME
335 JRST UTO5B ;NORMAL FILE WANTED
336 MOVEI J,0 ;UTAPE DIRECTORY WANTED
338 JRST LISTFE ;JOIN DIRECTORY CODE FOR OTHER DEVICES
341 JRST OPNL4 ;DELETE ILLEGAL IN UBLAT MODE
345 UTO5B: PUSHJ P,UTLK3 ;MUST NOT CLOBBER TT
347 UTOW2:UTO8: CONO PI,UTCON
350 MOVE TT,[-NUTOC,,NUTIC]
353 JUMPG TT,UNCA ;NO CHANNEL AVAILABLE
357 MOVEI J,DCHNT-UTUL(I)
361 JUMPGE Q,UTO2 ;INSERT CHNL ONTO LIST FOR TAPE
371 MOVEM J,UTEOF(TT) ;STORE EOF CHR
373 DPB A,[300500,,UTDBC(TT)]
375 DPB A,[220500,,UTDBC(TT)]
376 UTOW4: HRLM A,UTTNO(TT)
393 PUSHJ P,LSWPOP ;RELEASE FILE DIR
397 DNUACII,,DNUACCO ;ASCII UNITS INPUT ;ASCII UNITS OUTPUT
398 DNUBKI,,DNUBKO ;BLOCK INPUT ;BLOCK OUTPUT
399 DNUDTI,,DNUDTO ;WORD INPUT ;WORD OUTPUT
400 DNUBKI,,DNUBKO ;BLOCK INPUT ;BLOCK OUTPUT
402 UTOW1: SKIPN UMNFB(I)
407 JRST UTWNA ;NOT ASSIGNED
410 JUMPE B,UFILDF ;FILE DIR FULL
413 UTSNMK: SKIPN T,UTASS(I) ;TAPE MUST BE ASSIGNED TO THIS LOSER
420 UTOW3: HRROM TT,1(B) ;RESERVE FILE NAME
421 POP P,UTN1(TT) ;STORE NAMES
424 IORM J,UDIRO(I) ;SET FILE DIR MODIFYED
425 MOVSI J,UTBKNP(TT) ;GET LIST PNTR PNTR
426 MOVEM J,UTBKNP(TT) ;MAKE LH SELF-REFERENT SO INIT LINK WILL GO IN RH
427 AOS NUWCA ;INCR # ACT UWRITE CHNLS
440 UDATAI: SKIPA E,[444400,,1]
441 UASCII: MOVE E,[440700,,5]
445 UBLKI: MOVE E,[444400,,1]
449 UTBGB ;4.9 = 0 UTAPE 1 DISK
454 ;INPUT BLK BUFFER-GET RTN
456 UTBGB: LDB Q,[IOLO,,UTBFP(A)]
458 JRST 4,. ;PNTRS OUT OF PHASE
460 JRST POPJ2 ;END OF FILE
465 LDB J,[IOLO,,IOBFT(Q)]
475 DPB J,[IOLO,,IOBFT(Q)]
476 LDB TT,[IOSA,,IOBFT(Q)]
486 UTBGB1: CONO PI,UTCON
489 PUSHJ P,UFLS ;REALLY?
492 UBLKO: MOVE E,[444400,,1]
501 UASCCO: SKIPA E,[440700,,5]
502 UDATAO: MOVE E,[444400,,1]
506 ;OUTPUT BLKT BUFFER-GET RTN
508 UTBWG: MOVE Q,UTBFS(A) ;GET # BUFS IN CHNL
509 IMUL Q,NUWCA ;SCALE TO # ACT UWRITE CHNLS
510 CAIL Q,LUTWBF ;IF BEING TOO GREEDY WITH BLOCK LIST SPACE
517 JRST UTBWG1 ;NO BUFS NOW RELOAD
519 JRST POPBAJ ;CHNL IN ERR
521 UTBWG2: HRRZ J,UTBFS(D)
531 UTBWG1: HRRZ Q,UTTNO(D)
536 PUSHJ P,LSWTL ;WAIT FOR
537 UDIRO(Q) ;DIR TO UNLOCK
547 MOVEI E,0 ;INDICATE ADVANCE TO UDIRAD
548 PUSHJ P,UDOUT2 ;ADV DIR PNTRS (SKIP LOCK CHECK IN UDIRAD)
549 JRST 4,. ;SHOULDN'T GET HERE
550 JRST UTPFUL ;NO ROOM FOR EXT
551 PUSHJ P,LSWPOP ;UNLOCK DIR
552 PUSHJ P,LSWDEL ;UNHACK UTFAOS
555 POP P,Q ;GET BACK BUF #
565 UTBWG6: PUSHJ P,LSWCLR ;UNLOCK DIR & ADJ BLK CNT
570 POP P,A ;GET BACK BUF #
571 PUSHJ P,BRTN ;RETURN BUF
572 JRST IOCER9 ;BARF ABOUT TAPE FULL
574 UTBWW: HLRE Q,UTMBN(A)
576 PUSHJ P,LWAIT ;WAIT FOR
577 SKIPN UTWBFS ;SPACE IN BLK LIST & GET PNTR
578 MOVE J,UTWBFS ;(DO NOT COMBINE WITH PRECEDING INST)
579 HRRZ H,(J) ;GET PNTR TO NEXT FREE WD
580 MOVEM H,UTWBFS ;UPDATE FS PNTR
581 CONO PI,UTCON ;TURN ON UTC NOW TO MINIMIZE OFF TIME EVEN THOUGH OFF AGAIN LATER
582 HRRZ D,UTDBC(A) ;GET NEXT BLK #
583 MOVSM D,(J) ;PUT IN NEW WD
584 HLRZ D,UTBKNP(A) ;GET PNTR TO LAST WD IN LIST
585 HRRM J,(D) ;STORE LINK IN END OF LIST
586 HRLM J,UTBKNP(A) ;UPDATE END PNTR
590 SOS IOBFT(Q) ;CHANGE TO EOF
594 DPB Q,[IOLO,,IOBFT(J)]
596 UTBWW2: HRLM Q,UTBFP(A)
601 UTBWW1: HRRM Q,UTBFP(A)
604 UTOCL: MOVSI Q,(SETZ)
606 LDB E,[300600,,MPRP(A)] ;NOW FILL OUT BLOCK WITH EOF CHARS
609 UTOCL1: HRROI C,[EOFWRD]
615 UTOCL6: HRROI C,UTEOF(A)
621 UTOCL2: SKIPG MPRC(A)
622 PUSHJ P,UTBWW ;MAKE SURE BUFFER WRITTEN OUT SINCE MAYBE GOT
623 ;PCLSRED FROM UTBWW DURING .IOT THAT JUST FILLED BUFFER
633 JRST UTOCL4 ;NORMAL CLOSE
634 MOVEI Q,%PIIOC ;ABORT WORKS
639 UTOCL5: PUSHJ P,LSWPOP
641 SOS NUWCA ;DECR # ACT UWRITE CHNLS
644 UTOCL4: MOVE A,UTN1(D)
647 LDB Q,[220500,,UTTNO(D)]
654 LDB Q,[220500,,UTTNO(D)]
661 UTDEL1: MOVE C,I ;DELETE
671 UTRN1: JUMPE A,UTRN3 ;RENAME OF OPEN FILE
672 PUSHJ P,UTSNMK ;ALLOW RENAME OF OPEN FILE
686 UTRN4: MOVSI A,100000
690 UTRN3: ADDI B,IOCHNM(U)
698 UDELETE: MOVEI TT,0 ;TT=0 IF NOTHING DELETED + OTHERWISE
699 UDELA: PUSHJ P,UTLOOK
700 JUMPE B,CPOPJ ;TAPE NO IN C,FILE NAME IN A,B
702 UDELE4: HRRZ J,UTTNO(E)
711 JRST UDELE3 ;THIS IS LOSER WHO IS CLOSING FILE
717 UDELE3: SOJGE E,UDELE4
726 UDELE6: HRRZ B,UDIRO(C)
744 IORM C,UTRAC(D) ;SET EOF
747 PUSHJ P,UFLS ;WAIT FOR ACTIVE BUFFER TO TRANSFER
748 PUSHJ P,UTBRB1 ;RETURN ACTIVE BUFFER MAIN PROG
752 PUSHJ P,UDELE5 ;FINISH FILE DELETE
754 UTOCL3: HRRZ A,UTBFP(D)
757 LDB C,[IOLO,,IOBFT(A)]
762 UTICL3: PUSHJ P,UCPAT0 ;UT CHANNEL PATCH OUT
770 UCPAT0: HRRZ B,UTTNO(D) ;PATCH OUT CHANNEL
771 MOVEI C,DCHNT-UTUL(B)
773 UCPAT2: HRRE E,UTUL(C)
780 UCPAT1: HRRZ E,UTUL(E)
785 UDELE5: HRRZ C,UTTNO(D)
805 UTRL1: JUMPE B,UTRLDR
809 UTRLDR: LDB R,[270100,,UTDBC(D)]
811 SKIPL R,UDIRO(C) ;SPECIAL KLUDGE TO RUN FAST
812 TLNE R,10000 ;SKIPN ON NOT IN UBLAT MODE
814 LDB TT,[220500,,UTDBC(D)]
819 UTRLD3: PUSHJ P,IUTCONS ;RTN BUFFER NO IN A
820 JRST UTRLR1 ;MEM LOCKED (OR SOMETHING)
822 HRRZ B,UTDBC(D) ;GET BLK # TO READ
828 UTRLD1: PUSHJ P,UDIRAD
829 JRST JDB6C2 ;DIR DOUBLE LOCKED
834 JDDTA: HLRZ D,ULDCH(C) ;FINISHED DATA TRANS TAPE IN C GET CHNL NO
837 IFE NEWDTP, CONSZ DC,7
838 IFN NEWDTP, CONSO DTS,100000
839 JRST UDATER ;DC STILL ENABLED => ERROR
842 JRST JDDT1 ;WRITE OR FILE DIRECTORY
849 DPB E,[IOLO,,IOBFT(B)]
850 JDDT6: HRLM E,UTBFP(D)
855 JRST JDDT3 ;SAME TAPE CAN RELOAD, DONT CHECK OTHERS
856 JDDT4: HRRZS ULDCH(C)
857 IFE NEWDTP, JRST JDB4A ;UNIT NOW IDLE STOP IT
863 JDDT1: CAIL D,NUTIC+NUTOC
864 JRST UDRDD3 ;FILE DIR IN OR OUT
872 JDDT5: HRRM E,UTBFP(D)
874 \fUTREOF: MOVSI E,200000
878 SOSA IOBFT(E) ;TURN END OF LIST TO END OF FILE
880 AOS UTBFS(D) ;TO START MAIN PROG
883 JDB6W: HRRE D,DCHNT(C)
884 JUMPL D,JDB6W1 ;NO CHANNELS ACTIVE
886 JRST UDRDD ;READ FILE DIR
887 JDB6C1: SKIPL E,UTRAC(D)
889 JRST JDB6C2 ;CHANNEL LOCKED
891 JRST JDB6A ;WRITE CHANNEL
893 CAILE B,MXUTBF ;READ CHANNEL; SHOULDN'T LET IT GET TOO MANY BUFFERS.
897 JRST JDB6E ;TRY TO GET MORE MEMORY
899 SOJLE B,UTRL1 ;RELOAD CHANNEL WITH ONE OR NO BUFFERS
903 JRST JDB6C2 ;NO RELOAD
904 JDB6F: HRRZ B,UTBFS(D) ;NUMBER BUFS THIS CHANNEL HAS
907 JDB6E: PUSHJ P,UIMRQ ;TRY TO GET MORE MEMORY (IO)
908 JRST JDB6C2 ;NOT AVAIL
909 PUSHJ P,UTMGB ;ADD TO MEM ALLOC UTAPE
912 UTRLR1: PUSHJ P,UDIRR ;BACK UP
916 JDB6C: HRRE D,UTUL(D)
920 JDB6W1: LDB D,[410300,,UDIRO(C)]
921 SOJN D,POPJ1 ;DIR CHANGED AND NOT LOCKED
923 LDB D,[370500,,177(D)]
925 JRST 4,. ;DIRECTORY CLOBBERED SINCE READ IN
926 MOVEI D,100 ;INITIATE FILE DIR WRITE
927 SKIPL ULDCH(C) ;SKIPN ON ALREADY LOW PRIORITY POSIT
928 PUSHJ P,ILLP ;INITIATE LOW PRIOR POSIT
931 ULLP1: SKIPGE UDIRO(C)
933 SETOM URDWR(C) ;SET FILE DIR WRITE CYCLE FROM LOW PRIORITY CYCLE
934 MOVSI D,400000 ;LOCK DIR
937 HRRZ A,ULDCH(C) ;BUFFER NO OF DIRECTORY
941 JDB6A: HRRZ A,UTBFP(D)
944 JRST JDB6C2 ;LOCKED OUT SNIFFLE
945 MOVE E,UTBKNP(D) ;GET BLK LIST PNTR
949 HLRZ B,J ;GET BLK # FROM HEAD OF LIST
950 HRR E,J ;SET LINK TO NEXT WD IN LIST
951 TRNN E,-1 ;IF LIST EMPTY
952 MOVSI E,UTBKNP(D) ;SET END PNTR TO PNTR SO NEXT LINK WILL GO HERE
953 MOVEM E,UTBKNP(D) ;UPDATE PNTR
956 LDB E,[IOLO,,IOBFT(A)]
962 UTRLD: HRRM A,UTRAC(D)
963 UDRR2: MOVEM B,UGOAL(C)
965 DPB B,[IOLO,,IOBFT(A)]
966 LDB B,[IOSA,,IOBFT(A)]
976 JRST JDBRK7 ;SUCCESFUL RELOAD
979 JRST JDBRK4 ;CAN NOT RELOAD
987 UDRDD: MOVE D,UDIRO(C) ;TAPE WANTS FILE DIRECTORY READ
988 TLO D,20000 ;OK FOR 4.5 CLEAR
989 AOSE D ;REST SHOULD BE -1
990 JRST 4,. ;FILE DIRECTORY READ REQUEST WHEN ALREAD IN
991 MOVEI D,NUTIC+NUTOC ;GET DIRECTORY CHANNEL NUMBER IN D
994 LDB B,[IOSA,,IOBFT(A)] ;GET ORIGIN _ -6
996 TLO B,600000 ;SET LOCK, DOUBLE LOCK BITS
997 MOVEM B,UDIRO(C) ;STORE ORIGIN
998 HLLOS DCHNT(C) ;NO CHANNEL ACTIVE THIS UNIT YET
999 CLEARM URDWR(C) ;SIGNAL WANT READ
1000 HRRM A,ULDCH(C) ;STORE BUFFER NUMBER
1001 JDB6W2: MOVEI B,100 ;DIRECTORY BLOCK NUMBER
1004 UDRDD3: HRRZ D,ULDCH(C) ;FILE DIR IN OR OUT
1005 HRRZS UDIRO(C) ;UNLOCK DIRECTORY
1006 DPB C,[IOLO,,IOBFT(D)]
1009 \fUDIRAD: TDZA E,E ;ADVANCE DIR PNTRS OF CHANNEL IN D
1010 UDIRR: MOVEI E,1 ;REV DIR PNTRS THIS WINS FOR READS ONLY HA HA
1013 UDOUT2: TLNE B,10000
1014 JRST UDBL1 ;UBLAT MODE
1015 UDOUT7: LDB R,[270100,,UTDBC(D)]
1020 LDB TT,[220500,,UTDBC(D)]
1022 UDIR1: PUSHJ P,UITAB(R)
1023 TRNE J,-1 ;BLK NO RTN IN RH J
1025 JRST UDOUT ;END OF EXTENSION
1029 LDB B,[300500,,UTDBC(D)]
1033 UDBL1: AOS A,UTDBC(D)
1038 UDOUT: JUMPN E,UDOUT5
1043 PUSHJ P,UTLOOK ;TAP NO IN C NAME IN A,B
1044 JUMPE B,POPJ1 ;EOF OR ADR OF FIRST WD
1045 UDOUT6: DPB A,[220500,,UTDBC(D)] ;FILE NO
1046 UDOUT4: DPB A,[300500,,UTDBC(D)]
1052 UDOUT3: TLNN B,200000 ;DIRECTORY DOUBLE LOCKED
1059 JUMPE B,UDOUT8 ; FILE DIR FULL
1060 LDB J,[300500,,UTDBC(D)]
1064 UDOUT8: XORI R,1 ;REVERSE DIR
1066 JRST UITAB(R) ;BACK UP PNTRS AND RETURN
1068 UDOUT5: LDB A,[220500,,UTDBC(D)]
1076 UTLK3: SKIPA Q,UDIRO(I)
1077 UTLOOK: MOVE Q,UDIRO(C) ;B=0 => NOT FOUND
1091 UITAB: AOSA J,UTDBC(D)
1094 UAF: ILDB B,UTDIRP(D)
1108 ; T S UTAPE ROUTINES PI SERV (NEW UTAPE CONTROL)
1111 UTP1: 0 ;JRST PIPOS OR DATAI DC, OR JRST UTP3
1119 UTP3: CONO DTS,770001
1140 PIPOSL: MOVEI A,40000+DCCHN_3
1141 DPB C,[110300,,A] ;SET SELECTED UNIT CONO DTC,FOO(A)
1157 PIPOS3: MOVE A,UDIR(C)
1163 JUMPG B,PIPOS4 ;GOING WRONG DIR
1168 PIPF2: MOVE B,UDIR(C)
1174 CONO DTS,770001 ;ENABLE ALL INTERUPTS AND SET FUNCTION STOP
1177 PIPF1: MOVEI A,40000
1182 \fPIPOS4: TRZ A,40000 ;TURN TAPE AROUND
1188 PIPOS2: HLRZ A,ULDCH(C)
1191 JRST PIPOS3 ;CHANNEL LOCKED
1192 SETOM UTLDD(A) ;CHANNEL ACTUALLY LOADED TRANSFER IMMINENT
1202 ADD B,[DATAI-BLKI 200]
1207 TAP4: CONO DTC,300+DCCHN_3+UTCCHN(A)
1216 TAPFOR: TRO A,200000
1229 UTER5: SKIPN C,SUNIT
1238 CONO DTC,400000 ;STOP DRIVE
1255 UDATER: CONO DTS,770001 ;ENABLE ALL INTERUPTS AND STOP FUNCTION
1260 \fUTCB0: MOVE C,SUNIT
1261 AOSE CUINT ;SKIP IF CLOCK CAUSED INTERUPT
1262 JRST JDBRK ;NOT TIME FLAG
1263 UTCB1: MOVE B,UDIR(C)
1264 AOSN UTHERR ;HANG UP ERROR SENT FOR SLOW CLOCK ROUTINE
1268 JDDT3: MOVE A,EUPOS(C) ;AFTER DATA XFER
1276 JRST JDB3 ;SOMETHING ELSE DUE
1279 SOJLE E,JDB7 ;RELOADING FOR NEXT BLOCK
1281 \fILLP: MOVEM D,UGOAL(C) ;LOW PRIORITY POSIT ENTRY
1285 UTDC: SKIPGE UGOAL(C)
1289 UTDC1: MOVE A,EUPOS(C) ;ESTIMATE UNIT TIME AND UPDATE EUPOS
1290 SKIPG DG2(C) ;SKIP ON EXACT POS KNOWN
1291 SKIPN UDIR(C) ;SKIP ON UNIT RUNNING
1297 ADD A,B ;ACTUAL ESTIMATED POSITION
1298 MOVEM A,EUPOS(C) ;UPDATE EUPOS
1299 UTDC4: SUB A,UGOAL(C)
1306 SETZB A,B ;GOING WRONG DIR
1308 MOVEI B,200. ;LIMIT LONGEST DEAD RECKON
1313 UTDC3: MOVEI B,0 ;NOT KNOWN EXACT POS REQUIRES IMMEDIATE ATTENTION
1324 JRST JDDTA ;DATA MODE
1331 SETOM UTTM3 ;UNIT MOST URGENT
1332 CLEARM UTTM1 ;UNIT COULD START
1334 \fJDBRK7: SKIPGE B,UFLAPF(C)
1335 JRST JDF1 ;FLAPPING OP
1336 JDF2: SKIPL ULDCH(C) ;SKIP ON LOW PRIOR POSIT
1338 JRST JDB6 ;UNIT FREE
1341 SKIPN UTTM1 ;UNIT TO START
1344 JDBRK4: MOVE B,DRTM(C)
1347 SUB E,UTTM2 ;TIME SOME OTHER UNIT NEEDS ATTN
1348 JUMPL B,JDCV1 ;ALREADY OVERDUE
1350 CAIG B,20. ;CONFLICT MORE THAN 20 BLKS AWAY
1351 CAIL D,20. ;THEY ARE SEPARETED BY 20 BLKS
1353 HRRZS C ;RELIEVE CONFLICT BY STOPPING UNIT DUE LATEST
1356 JDF5: PUSHJ P,JDSTP ;STOP UNIT
1359 JDCV1: JUMPGE E,ULLP
1360 MOVEM B,UTTM2 ;UNIT DUE SOONEST
1362 ULLP: SKIPL ULDCH(C)
1364 MOVE B,TIME ;LOW PRIORITY POSIT IN PROGRESS
1373 PUSHJ P,ULLP1 ;TERM LOW PRIORITY DIRECTORY POS (COMMIT TO ACTUAL WRITE)
1374 \fJDBRK6: AOBJN C,JDBRK7
1375 MOVE C,UTTM3 ;MOST PRESSING RUNNING UNIT
1378 JRST JDB7 ;STAY WITH PRESSING UNIT
1380 JRST JDB5 ;START UNIT IF POSSIBLE
1381 JDF6A: CAMG B,[10000000.]
1383 AOSE UTTM4 ;DON'T IF FLAP OP STILL IN PROGRESS
1388 JDF1: MOVE E,UDIRO(C)
1392 JDF1A: SKIPGE UGOAL(C) ;FLAPPING OP
1398 JRST JDF3A ;HAVE JUST READ IN TAPE POS
1400 JRST JDF3 ;UNIT TO START FLAPPING (I.E. READ IN TAPE POS, THEN FLAP)
1404 TLNN B,200000 ;ABORT FLAPPING
1406 JRST JDF4 ;UNIT TO STOP FLAPPING
1407 SETOM UTTM4 ;INDICATE FLAP OP STILL ACTIVE
1410 JDDS: CONO DTC,10000 ;DESELECT
1414 JDSTP: MOVEI A,430000
1418 CAME C,SUNIT ;DIR CONO IN A TO UNIT IN C
1422 JDSTP1: DPB C,[110300,,A]
1427 JDF3: MOVE A,UDIRO(C) ;WANT TO FLAP
1428 AOJE A,JDF3A1 ;DIR NOT IN
1430 JRST JDF3A2 ;TAPE IN UBLAT MODE (COMMENT USED TO SAY DIR ON WAY IN) (??)
1432 LDB Q,[IOCH,,IOBFT(A)]
1435 LDB Q,[IOLO,,IOBFT(A)]
1438 PUSHJ P,IBRTN ;RETURN DIR BUFFER
1439 JDF3A2: SETOM UDIRO(C)
1441 JDF3A1: SETOM UDPWF(C)
1444 JDF3A: SETOM DG2(C) ;FLAP UNIT INC(KNOWING WHERE IT IS)
1446 IMULI E,50. ;50 MS/BLOCK
1447 IDIVI E,33. ;33 MS/(1/2 SEC)
1448 ADDI E,30. ;15 SECS EXTRA
1449 ADD E,TIME ;NET TIME TO STOP FLAPPING
1451 DPB E,[4200,,UFLAPF(C)]
1453 CONO DTC,130000(C) ;GO REVERSE
1463 MOVEI A,230000 ;A SHOT OF FOWARD
1464 PUSHJ P,JDCNN ;REEL WILL STOP
1471 JDF4A: PUSHJ P,JDSTP
1476 \fJDB5: HRRZ C,UTTM1
1482 JDB7: SKIPN B,UDIR(C)
1483 JRST 4,. ;NOT TRYING TO GO
1490 TRO A,40000 ;INHIBIT START DELAY (SAME UNIT, SAME DIRECTION)
1491 DCGB1: MOVEM C,SUNIT
1508 CONO DTC,130200+UTCCHN+<DCCHN_3>(A)
1509 UTST: CONO DTC,430000+UTCCHN+<DCCHN_3>(A)
1510 CONO DTC,230200+UTCCHN+<DCCHN_3>(A)
1512 CONO DTC,130200+UTCCHN(A)
1513 UTST1: CONO DTC,430000+UTCCHN(A)
1514 CONO DTC,230200+UTCCHN(A)
1516 CONO DTC,100200+UTCCHN(A)
1517 UTST2: CONO DTC,400000+UTCCHN(A)
1518 CONO DTC,200200+UTCCHN(A)
1522 ; T S UTAPE ROUTINES PI SERV (OLD UTAPE CONTROL)
1524 JDENB==40000 ;ENABLE JOB DONE (CONO UTC,)
1525 20MSEN==5000 ;20MS, ENABLED (")
1528 UTP1: 0 ;DATAI DC, OR JRST UTP3
1539 CONO DC,400000 ;CLEAR PIA
1542 PIPOS: CONSO DC,1000
1545 JRST PIPOS8 ;NO UNIT SELECTED?
1546 DATAI DC,B ;UNIT SELECTED, GET BLOCK NUMBER
1547 TDZE B,[1777#-1] ;CLEAR OUT GARBAGE IN BLOCK NUMBER WORD
1548 JRST PIPOS7 ;GARBAGE THERE, BAD BLOCK NUMBER
1549 MOVEM B,EUPOS(C) ;STORE POSITION
1550 HRRZM C,DG2(C) ;SIGNAL EUPOS IS ACCURATE
1551 SKIPGE UGOAL(C) ;GOING SOMEWHERE?
1553 SUB B,UGOAL(C) ;GET CURRENT - DESIRED
1554 JUMPE B,PIPOS2 ;JUMP IF THERE
1560 PIPOSL: MOVE A,SUNITL ;HOLD DC
1575 PIPOS3: MOVE A,UDIR(C)
1580 JUMPG B,PIPOS4 ;GOING WRONG DIR
1581 PIPF2: TRO A,JDENB ;ENB JD SO NEXT BREAK TO UTC ON BLOCK
1593 PIPF1: MOVE A,SUNITL
1596 PIPOS4: CLEARM DG2(C)
1601 PIPOS2: HLRZ A,ULDCH(C) ;TAPE NOW POSITIONED
1604 JRST PIPOS3 ;CHANNEL LOCKED
1605 SETOM UTLDD(A) ;CHANNEL ACTUALLY LOADED TRANSFER IMMINENT
1615 ADD B,[DATAI-BLKI 200]
1621 TAP4: CONO UTC,360300+UTCCHN(A)
1624 CONO DC,400000+DCCHN ;GIVE CHN FOR READ
1630 TAPFOR: HRRM B,TAPCNT
1638 UTERR: CONSZ UTC,4000 ;CHECK TIME ENABLE
1639 CONSO UTS,20 ;CHECK TIME FLAG
1641 JRST UTCB1 ;ELIMINATE TIMING ERROR IF FLAG COMES ON
1644 JRST UDATER ;DATA ERROR
1647 JRST JDB3 ;NO UNIT SELECTED, IGNORE ERROR
1650 JRST UTER6 ;NOT FLAPPING
1651 CLEARM UFLAPF(C) ;ERROR WHILE FLAPPING, JUST FORGET ABOUT IT
1655 UTER6: AOS UTERP(C) ;INCREMENT ERROR COUNT
1656 HRLM E,UTERP(C) ;STORE UTS CONI
1658 TRZ E,7650 ;CLEAR RANDOMNESS, WRITE, PARITY ERROR
1659 JUMPE E,JDB3 ;JUMP ON ONLY PARITY ERROR (IF ANYTHING), TRY AGAIN NOW
1660 TRNN E,2 ;CHECK EOT FLAG
1662 MOVNS B,UDIR(C) ;EOT, WANT TO GO OTHER DIRECTION
1666 MOVEM A,EUPOS(C) ;STORE NEW ESTIMATED POSIION
1670 UTER1: JRST UTER3 ;GIVE MAX DELAY
1672 UDATER: SETOM SMODE ;DATA ERROR, TRY REPOSITIONING
1677 \fUTCB0: MOVE C,SUNIT
1680 JRST JDBRK ;NOT TIME FLAG
1681 UTCB1: MOVE A,SUNITL
1683 AOSN UTHERR ;HANG UP ERROR SENT FOR SLOW CLOCK ROUTINE
1697 JDDT3: MOVE A,EUPOS(C)
1705 JRST JDB3 ;SOMETHING ELSE DUE
1710 SOJLE E,DCGBL1 ;RELOADING FOR NEXT BLOCK
1714 ILLP: MOVEM D,UGOAL(C) ;LOW PRIORITY POSIT ENTRY
1718 UTDC: SKIPGE UGOAL(C)
1722 MOVE A,EUPOS(C) ;ESTIMATE UNIT TIME AND UPDATE EUPOS
1723 SKIPG DG2(C) ;SKIP ON EXACT POS KNOWN
1724 SKIPN UDIR(C) ;SKIP ON UNIT RUNNING
1730 ADD A,B ;ACTUAL ESTIMATED POSITION
1731 MOVEM A,EUPOS(C) ;UPDATE EUPOS
1732 UTDC4: SUB A,UGOAL(C)
1739 SETZB A,B ;GOING WRONG DIR
1741 MOVEI B,200. ;LIMIT LONGEST DEAD RECKON
1746 UTDC3: MOVEI B,0 ;NOT KNOWN EXACT POS REQUIRES IMMEDIATE ATTENTION
1749 JDBRK: CONSZ UTS,16 ;CHECK PARITY ERROR, ILLOP, EOT
1751 JDBK1: CONSZ UTS,1 ;SKIP ON NO JOB DONE
1753 JRST POPRET ;NO ERRS + HAS DC CHNL, GO AWAY
1755 JRST JDDTA ;DATA MODE
1756 JUMPE C,JDB3 ;POSITIONING, JUMP ON NO UNIT SELECTED
1761 PUSHJ P,UTDC ;COMPUTE DELAY
1766 SETOM UTTM3 ;UNIT MOST URGENT
1767 CLEARM UTTM1 ;UNIT COULD START
1768 SETOM UTTM4 ;TAPE TO START FLAPPING
1769 SETOM UTTM5 ;TAPE TO STOP FLAPPED
1771 JDBRK7: SKIPGE B,UFLAPF(C)
1772 JRST JDF1 ;FLAPPING OP
1773 JDF2: SKIPL ULDCH(C) ;SKIP ON LOW PRIOR POSIT
1775 JRST JDB6 ;UNIT FREE
1776 JDF2A: SKIPGE DG2(C)
1779 MOVEM C,UTTM1 ;UNIT IS RUNNING BLIND (OR NOT RUNNING)
1786 JDBRK4: SKIPN UDIR(C)
1787 JRST ULLP ;TAPE MAY NOT BE RUNNING IF IDLE
1792 JUMPL B,JDCV1 ;ALREADY OVERDUE
1794 CAIG B,20. ;CONFLICT MORE THAN 20 BLKS AWAY
1795 CAIL D,20. ;THEY ARE SEPARETED BY 20 BLKS
1797 HRRZS C ;RELIEVE CONFLICT BY STOPPING UNIT DUE LATEST
1802 JRST JDB4B ;STOP UNIT
1804 JRST JDB7D ;DESLECT FIRST
1805 JDCV1: JUMPGE E,ULLP
1808 ULLP: SKIPL ULDCH(C)
1819 PUSHJ P,ULLP1 ;TERM LOW PRIORITY DIRECTORY POS (COMMIT TO ACTUAL WRITE)
1823 JDBRK6: AOBJN C,JDBRK7
1824 MOVE C,UTTM3 ;MOST PRESSING RUNNING UNIT
1827 JRST JDB7 ;STAY WITH PRESSING UNIT
1829 JRST JDB5 ;START UNIT IF POSSIBLE
1832 JDF6A: SKIPL D,UTTM5
1834 CAMG B,[10000000.] ;SKIP ON ALL TAPES IDLE
1838 SETOM UIDLE ;NO UNIT SELECTED
1842 JDF1: MOVE E,UDIRO(C)
1845 JRST JDF2 ;DONT FLAP IF DIR NOT WRITTEN
1846 JDF1A: SKIPGE UGOAL(C)
1848 JRST JDF2 ;FILE DIR WRITE IN PROG
1852 JRST JDF3A ;JUST READ IN TAPE POS
1854 HRRZM C,UTTM4 ;UNIT TO START FLAPPING
1858 TLNN B,200000 ;ABORT FLAPPING
1860 HRRZM C,UTTM5 ;UNIT TO STOP FLAPPING
1870 LDB Q,[IOCH,,IOBFT(A)]
1873 LDB Q,[IOLO,,IOBFT(A)]
1877 JDF3A2: SETOM UDIRO(C)
1879 JDF3A1: SETOM UDPWF(C)
1888 DPB E,[4100,,UFLAPF(C)]
1898 CONO UTC,235000+UTCCHN(C)
1907 DPB C,[30300,,SUNITL]
1916 JDB7: EXCH C,SUNIT ;SELECT UNIT IN C
1917 JUMPE C,JDB7A ;NO UNIT SELECTED
1921 JUMPGE E,JDB7E ;OK TO LEAVE IT ALONE, CLEAR SELECTION CYCLE
1924 JDB4B: HRRZM C,SUNIT ;ENTER UNIT STOPPING CYCLE
1925 DPB C,[30300,,SUNITL]
1926 JDB4A: MOVE A,SUNITL
1929 CONO UTC,205000+UTCCHN(A) ;CLEAR GO BIT
1936 JDB4A1: CLEARM UDIR(C)
1940 JDF9: SETOM USTPF ;UNIT STOPPING CYCLE
1946 STPUNT: 0 ;UNIT TO STOP DUE TO CONFLICT
1955 JDB7D1: CLEARM SUNIT ;DESELECT CYCLE
1970 DPB C,[30300,,SUNITL]
1974 JRST JDS4 ;CHANGING DIR (OR STARTING), ALLOW RELAY DLYS
1975 JDBK3A: MOVE E,DRTM(C)
1977 JDDT8: MOVE A,SUNITL
1988 JUMPE D,JDB3B ;GETTING CLOSE READ BLOCK NO
2008 CONO UTC,330200+UTCCHN(A)
2009 UTST: CONO UTC,5000+UTCCHN(A)
2010 CONO UTC,320200+UTCCHN(A)
2016 JDF6B: SETOM USTSW ;STARTING OUT
2017 UTER3: MOVE A,SUNITL ;PICK UP UNIT SELECT FIELD OF CONO
2018 TRO A,6000 ;SET FOR MAXIMUM DELAY
2021 URLS: SKIPE E,UDIR(C) ;SKIPN ON UNIT NOT RUNNING
2022 SKIPG E,DG2(C) ;RELEASE UNIT IN C E HAS PREV STATE OF DG2