1
0
mirror of https://github.com/PDP-10/its.git synced 2026-02-01 22:42:26 +00:00
Files
PDP-10.its/src/system/utape.952

2013 lines
40 KiB
Plaintext
Executable File
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
;;; Copyright (c) 1999 Massachusetts Institute of Technology
;;; See the COPYING file at the top-level directory of this project.
; I T S UTAPE SERVICE ROUTINE
UTBLKS==3
;UT CHANNEL STORAGE
EBLK
UTCHNT: ;BEG FOR GETSYS (UTAPE)
UTBFP: REPEAT NUTIC+NUTOC,400000,,377 ;L H BUFFER LINK PTR (INPUT PI)
;RH " " OUTPUT MAIN PROG
UTUSR: ;USER OR -1 IF FREE (LH)
UTUL: REPEAT NUTIC+NUTOC,-1 ;LINK TO CHANNEL ON SAME UTAPE OR -1(RH)
UTDIRP: BLOCK NUTIC+NUTOC ;BYTE POINTER TO UTDIR
UTDBC: BLOCK NUTIC+NUTOC ;RH BLCK COUNT CORRESP WITH UTDIRP
;L H 3.1 3.5 READ FILE NO 4.9 ERROR 4.5 4.8 ERROR CNT
;3.6 =0 FORD EXT =1 BACK EXT 3.7 4.2 PUT FILE NO
;4.4 DELETE ON READ CLOSE
UTBFS: BLOCK NUTIC+NUTOC ;BUFFERS IN USE
UTLSTM: BLOCK NUTIC+NUTOC ; TIME LAST BUF TAKEN BY PROG
UTMBN: BLOCK NUTIC+NUTOC ; MN PROG ACTIVE BFFR NO OR -1,IF NO BUFFER ACIVE (LH)
UTRAC: BLOCK NUTIC+NUTOC+1 ;ACTIVE BUFFER NO PI RH
;FLAG TO MAIN PROG TP FULL (WRITE) RH
;SIGN SET =>CHANNEL LOCKED
;4.8 READ EOF REACHED AT PILEVEL OR CHNL CLOSED
;EXTRA WORD FOR FILE DIR CHNL
;4.7 DONT RELOAD AT PI
UTN1=.-NUTIC+1
BLOCK NUTOC
UTN2=.-NUTIC+1
BLOCK NUTOC ;NAME OF FILE BEING WRITTEN
UTBKNP=.-NUTIC+1
BLOCK NUTOC
MPRP: BLOCK NUTIC+NUTOC ;MAIN PRGM BUFFER PNTR
MPRC: BLOCK NUTIC+NUTOC ;CNT REMAINING
UTTNO: BLOCK NUTOC+NUTIC ;TAPE NO (RH)
;LH CLOSE FLAG WRITE ORG FILE NO READ
UTEOF: BLOCK NUTIC ;END OF FILE CHR
UTLDD: BLOCK NUTIC+NUTOC+1 ;IF -1, DC IS ACTUALLY SET UP AND TRANSFER CAN
;BE EXPECTED IN LESS TAH 100 MS.
;IF D CHANNEL LOCKED FLAG(4.9 UTRAC) WELL BE CHECKED
;BEFORE GOING TO THE -1 STATE
;EXTRA WORD FOR DIR CHNL
UTDERR: BLOCK NUTIC+NUTOC+1 ;4.9 ERROR 4.8 ABORT 4.7 UTAPE FULL
NUTCA: 0 ;NUMBER UTAPE CHANNELS ACTIVE
NUWCA: 0 ;# WRITE CHNLS ACT
UPCHFS: 0 ;FAIR SHARE BFS PER CHNL
LUTWBF==40 ;LENGTH OF BLK # PASSING LIST
UTWBF: REPEAT LUTWBF,.+1 ;LIST FOR PASSING BLK NOS FROM M.P. TO PI ON WRITE (INIT FS)
0 ;TERMINATOR FOR FS LIST
UTWBFS: UTWBF ;FS PNTR
IFNDEF MXUTBF,MXUTBF==40 ;MAX BUFFERS FOR AN INPUT CHANNEL.
;TABLE AREAS
DEFINE TAG A
IRPS TAGX,,A
BBLK
TAGX: 0
EBLK
TERMIN
TERMIN
UTCH: ;BEG FOR GETSYS (UTAPE)
TAG ULCTM:, REPEAT NUNITS,-1 ;LAST TIME EUPOS RECOMPUTED
;IF DG2=0.E. 0 THEN ACT POS =EUPOS+<TIME-ULCTM>*UDIR
TAG DRTM:, REPEAT NUNITS,177777,,-1 ;177777,,-1 => NO TIMING OP
;N => DEAD RECKON UNTIL T=N
TAG UDIR:, BLOCK NUNITS ;0=>STOP -1=>BACK 1=>FORW
IFN NEWDTP, TAG OUDIR:, BLOCK NUNITS ;DIR OF LAST OP
TAG UGOAL:, REPEAT NUNITS,-1;POSIT GOAL OR -1 IF UNIT FREE
TAG EUPOS:, BLOCK NUNITS ;ESTIMATED UNIT POSITION
;SEE ULCTM IF DGW .NE. 1
TAG DCHNT:, REPEAT NUNITS,-1;HEAD CHANNEL LIST OF UT OR -1 IF NO CHN ACT
TAG UMEMAD:, IFE NEWDTP,REPEAT NUNITS, BLKO DC, ;GOAL MEMADR-1
IFN NEWDTP,REPEAT NUNITS,BLKO DTC,
TAG URDWR:, BLOCK NUNITS ;0 READ -1 WRITE(LOADED OPERATION)
TAG DG2:, REPEAT NUNITS,-1;+ => ACCURATE
;0 => EUPOS FAIRLY ACCURATE
;-1 => DO NOT DEAD RECKON WITHOUT UTC
TAG UTASS:, REPEAT NUNITS,0 ;0 IF NOT ASSIGNED, SYSTEM NAME IF ASSIGNED
TAG UDIRO:, REPEAT NUNITS,-1;ORGIN OF DIRECTORY
;OR -1 DIR NOT LOADED OR 4.9 DIR LOCKED OR 4.8+4.9 DIR DOUB LOCKED
;4.7 DIR CHANGED
;IF DIR LOCKED, IT MAY BE REFERENCED BUT NOT CHANGED
;4.5=0 => DIR AT LEAST ON WAY IN
;4.4=1 => TAPE IN UBLAT MODE
TAG UFLAPF:, BLOCK NUNITS ;4.9 FLAPPING RQSTED OR IN PROGRESS
;4.8 RQ TO ABORT FLAPPING
;4.7 DRIVE ACTUALLY ON THE WAY
;4.6 (TD10 ONLY) 0 PHASE 1 STOP 1 PHASE 1 STOP DONE
;RH TIME TO STOP AFTER FLAPPED
TAG ULDCH:, BLOCK NUNITS ;NUMBER OF LOADED CHANNEL IN LH
;BUFFER NO OF DIR (INDEX INTO IOBFT) IN RH
;LH 4.9 = LOW PRIORITY POSIT
TAG UDPWF:, REPEAT NUNITS,-1 ;DIRECTORY PAWED OVER FLAG
TAG UMNFB:, BLOCK NUNITS ;MAIN PRGM FREE BLOCKS ON TAPE
TAG UTERP:, BLOCK NUNITS ;LH ERROR CODE (CONI UTS,) RH # ERRORS
TAG UMNTR:, BLOCK NUNITS ;UNAME OF LAST JOB TO READ IN DIRECTORY
SUNIT: 0 ;SELECTED UNIT OR 0
IFE NEWDTP, SUNITL: 0 ;SAME _ 3
SMODE: -1 ;-1 POSIT 0 DATA
UIDLE: -1 ;-1 UTAPES COMPLETELY IDLE
IFN NEWDTP, CUINT: 0 ;-1 CLK HAS CAUSED BREAK
WRITE: 0 ;0 READ -1 WRITE
TAPCNT: 0
TAP1: 0
TAP2: 0
TAP3: 0
UTTM1: 0 ;UNIT COULD START IN SEARCH LOOP
UTTM2: 0 ;MOST PRESSING UNIT SO FAR
UTTM3: 0 ;TIME FOR ABOVE OR -1 IF NONEî
UTTM4: 0 ;TAPE TO START FLAPPING (FLAG FLAP IN PROG IF NEWDTP=1)
IFE NEWDTP,[
UTTM5: 0 ;TAPE TO STOP FLAPPING
FLPUNT: 0
]
UTENB: 0
LUTOTM: 0 ;TIME OF LAST UT OPER
UTHERR: 0 ;UT HANGUP ERR
USTSW: 0 ;UT START SWITCH
UDCC: 0 ;-1 IF UTAPE HAVE DC FOR BLK CYCLE
UTCHE==.-1 ;END FOR GETSYS (UTAPE)
BBLK
;UTAPE CONTINUOUS NON-FILE IO
AUBL2: CONO PI,UTCON ;DIRECTORY LOCKED, MAYBE ITS BEING FLAPPED
PUSHJ P,UDELAY
AUBLAT: XCTR XRW,[SKIPLE I,(J)] ;GET TAPE NUM, C(AC), SKIP IF NEG OR ZERO
CAIG I,NUNITS ;SKIP IF TOO BIG
PUSHJ P,UTSNMK ;DON'T ALLOW UTAPE HACKERY UNLESS ASSIGNED
POPJ P, ;ERR EXIT, BAD TAPE NUM
CONO PI,UTCOFF
MOVE B,UDIRO(I)
AOJE B,AUBL1 ;DIR NOT IN
TLNN B,10000
JRST UTCONJ ;NOT IN UBLAT MODE
JUMPL B,AUBL2
AUBL1: MOVSI B,10000
MOVEM B,UDIRO(I)
CONO PI,UTCON
JRST POPJ1
;.ASSIGN - ASSIGN A DECTAPE UNIT.
AASSIGN:XCTR XR,[MOVE I,(J)]
CAILE I,NUNITS
POPJ P,
JUMPLE I,CPOPJ
MOVE A,UNAME(U)
CONO PI,CLKOFF
CAMN A,UTASS(I)
JRST CLKOJ1
SKIPE UTASS(I)
JRST CLKONJ
MOVEM A,UTASS(I)
JRST CLKOJ1
ADESIGN:XCTR XR,[MOVE I,(J)] ;DEASSIGN UTAPE
CAILE I,NUNITS
POPJ P,
JUMPLE I,CPOPJ
SKIPN A,UTASS(I)
JRST POPJ1
CAME A,UNAME(U)
POPJ P,
SETZM UTASS(I)
JRST POPJ1
;SET UTAPE NAME ;.UTNAM AC, ;LH(AC)=6BIT NAME, RH(AC)=TAPE #
AUTNAM: XCTR XR,[MOVE Q,(J)]
HRRZ I,Q ;GET TAPE #
JUMPE I,CPOPJ ;TOO SMALL
CAIG I,NUNITS ;TOO LARGE?
PUSHJ P,UTSNMK ;ASSIGNED TO SOMEONE ELSE?
POPJ P, ;YES, LOSE
TLO D,1 ;SET FLAG TO EXIT FROM OPEN ROUTINE
PUSHJ P,UTO0 ;GET DIR IN CORE, LOCK, ETC.
TLNE TT,210000 ;CHECK FOR DIRECTORY NOT READ IN, UBLAT MODE
JRST LSWPOP ;JUMP ON LOSSAGE
HLRZ A,Q ;GET TAPE NAME
AOSN UDPWF(I) ;DIRECTORY PAWED OVER YET?
PUSHJ P,UDPW ;NO, GO DO IT
MOVE J,UDIRO(I) ;GET POINTER TO DIR
XOR A,177(J) ;GET DIFF BETWEEN OLD & NEW NAMES
TRNN A,-1 ;IS THERE ANY?
JRST AUTN2 ;NO, SKIP SOME CRUFT
TLZ A,-1 ;IGNORE DIFFERENCES IN LH
XORM A,177(J) ;MODIFY NAME TO NEW NAME
TLO J,100000 ;SET DIR CHANGED BIT
AUTN2: MOVEM J,UDIRO(I) ;STORE MODIFIED POINTER
JRST LSWPJ1
UDPW: HRRZ J,UDIRO(I)
MOVEI TT,37
DPB TT,[370500,,177(J)]
ADD J,[500,,23.*2-1]
MOVEI TT,0
UDPW2: ILDB Q,J
SKIPN Q
AOS TT
CAIE Q,37
JRST UDPW2
MOVEM TT,UMNFB(I)
POPJ P,
;INITIALIZE UTAPE DIRECTORY ;.UINIT AC, ;C(AC)=TAPE #
;TAPE MUST BE ASSIGNED
AUINIT: XCTR XRW,[SKIPLE I,(J)] ;TAPE # TOO LOW?
CAILE I,NUNITS ;OR HIGH?
POPJ P, ;YES
PUSHJ P,UTSNMK ;OR NOT ASSIGNED TO THIS USER
POPJ P,
TLO D,1 ;SET EXIT FLAG FOR OPEN ROUTINE
PUSHJ P,UTO0 ;GET DIR, LOCK IT, ETC.
TLNE TT,210000 ;CHECK FOR UBLAT MODE, DIRECTORY NOT READ (TT=UDIRO(I))
JRST LSWPOP
SETZM (TT) ;CLEAR FIRST LOC
HRLI A,(TT) ;SET UP LH OF BLT POINTER
HRRI A,1(TT) ;& RH
BLT A,177(TT) ;ZAP
MOVE A,[757367573674] ;GET WORD OF 7 5-BIT BYTES VALUE 36
MOVEM A,56(TT) ;INDICATE FIRST 7 BLOCKS RESERVED
MOVSI A,660000 ;ONE 5-BIT BYTE, VALUE 33
MOVEM A,67(TT) ;MARK FILE DIRECTORY BLOCK
HRROS 177(TT) ;MARK END OF DIR
SETZM UDPWF(I) ;INDICATE DIR PAWED OVER
MOVEI A,559. ;# OF FREE BLOCKS IN EMPTY TAPE
MOVEM A,UMNFB(I) ;STORE FOR FUTURE REFERENCE
TLO TT,100000 ;INDICATE CHANGED
MOVEM TT,UDIRO(I) ;UPDATE POINTER
JRST LSWPJ1
;UTAPE DISMOUNT
AUDISM: XCTR XRW,[MOVE A,(J)] ;OPER 22
NFLAP: JUMPLE A,CPOPJ
CAILE A,NUNITS
POPJ P,
MOVSI C,-NUTIC-NUTOC
CONO PI,UTCOFF
AUTDM1: SKIPGE UTUSR(C)
JRST AUTDM2
HRRZ D,UTTNO(C)
CAMN A,D
JRST UTCONJ ;SOME ONE USING TAPE
AUTDM2: AOBJN C,AUTDM1
CONO PI,UTCON
MOVSI C,(SETZ)
IORM C,UFLAPF(A)
JRST POPJ1
;ATTEMPTED DIRECTORY READ GOT FLUSHED
UTOLOS: TLNE D,1 ;CHECK EXIT FLAG
JRST NULSET ;NOT .OPEN, SEIZE NOTHING AND RETURN
JRST OPNL7 ;.OPEN, SIGNAL DEVICE NOT READY
UTOF1: MOVSI TT,200000
IORM TT,UFLAPF(I) ;RQEST ABORT OF FLAP
CONO PI,UTCON
SKIPGE UFLAPF(I)
PUSHJ P,UFLS ;HOPE FOR BEST
UTO: PUSHJ P,UTSNMK ;MUST BE ASSIGNED
JRST NCA
JUMPE I,OPNL1 ;UTAPE OPEN
CAILE I,NUNITS
JRST OPNL1
UTO0: CONO PI,UTCOFF
SKIPGE UFLAPF(I)
JRST UTOF1 ;FLAPPING IN PROGRESS
SKIPGE TT,UDIRO(I)
AOSE TT
JRST UTO4 ;FILE DIR IN OR ON THE WAY
MOVEI TT,200000
MOVEM TT,DCHNT(I)
MOVE TT,UNAME(U)
MOVEM TT,UMNTR(I) ;TELL WHO FIRST CAUSED DIR TO BE READ IN
MOVSI TT,20000
ANDCAM TT,UDIRO(I)
UTO4: CONO PI,UTCON
MOVSI TT,400000
MOVNI T,1
PUSHJ P,LWAIT
CAMLE T,UDIRO(I) ;WAIT FOR DIRECTORY TO COME IN OR GO OUT
IORB TT,UDIRO(I) ;IF IN THEN LOCK IT
CONO PI,UTCON
CAMN TT,[-1]
JRST UTOLOS ;DIDN'T GET READ IN
PUSHJ P,SGNSET ;MAKE SUURE DIRECTORY GETS UNLOCKED ON PCLSR
UDIRO(I)
TLNE D,1 ;CHECK SPECIAL EXIT FLAG
POPJ P, ;EXIT
TLNE TT,10000
JRST UTOBL1 ;IN UBLAT MODE
AOSN UDPWF(I)
PUSHJ P,UDPW
UDPW1: TRNE D,200000
JRST UTDEL1 ;DELETE OR RENAME
JUMPL D,UTOW1 ;WRITE
PUSHJ P,FLDRCK
JRST UTO5B ;NORMAL FILE WANTED
MOVEI J,0 ;UTAPE DIRECTORY WANTED
PUSHJ P,LSWPOP
JRST LISTFE ;JOIN DIRECTORY CODE FOR OTHER DEVICES
UTOBL1: CAIN W,4
JRST OPNL4 ;DELETE ILLEGAL IN UBLAT MODE
CLEARB A,B
JRST UTO8
UTO5B: PUSHJ P,UTLK3 ;MUST NOT CLOBBER TT
JUMPE B,OPNL4
UTOW2:UTO8: CONO PI,UTCON
MOVSI TT,-NUTIC
TLNE C,1
MOVE TT,[-NUTOC,,NUTIC]
SKIPL UTUSR(TT)
AOBJN TT,.-1
JUMPG TT,UNCA ;NO CHANNEL AVAILABLE
CONO PI,UTCOFF
SKIPL UTUSR(TT)
JRST UTO8
MOVEI J,DCHNT-UTUL(I)
JRST .+2
UTO2: MOVE J,Q
HRRE Q,UTUL(J)
JUMPGE Q,UTO2 ;INSERT CHNL ONTO LIST FOR TAPE
HRLOM U,UTUSR(TT)
HRRM TT,UTUL(J)
HRRZM I,UTTNO(TT)
HRRZ J,UDIRO(I)
ADD J,A
MOVE Q,133(J)
MOVEI J,EOFCH
TRNN Q,1
MOVEI J,141
MOVEM J,UTEOF(TT) ;STORE EOF CHR
SETZM UTDBC(TT)
DPB A,[300500,,UTDBC(TT)]
JUMPL D,UTOW3 ;WRITE
DPB A,[220500,,UTDBC(TT)]
UTOW4: HRLM A,UTTNO(TT)
HRRZ J,UDIRO(I)
ADD J,[500,,23.*2-1]
MOVEM J,UTDIRP(TT)
MOVE J,[SETZ 377]
MOVEM J,UTBFP(TT)
CLEARM UTBFS(TT)
MOVE J,TIME
MOVEM J,UTLSTM(TT)
HRROS UTMBN(TT)
HLLOS UTRAC(TT)
HRRZS UTRAC(TT)
CONO PI,UTCON
CLEARM MPRC(TT)
AOS NUTCA
PUSHJ P,FSCMP
HRRZS UTRAC(TT)
PUSHJ P,LSWPOP ;RELEASE FILE DIR
MOVSS C
HRL A,TT
JSP Q,OPSLC7
DNUACII,,DNUACCO ;ASCII UNITS INPUT ;ASCII UNITS OUTPUT
DNUBKI,,DNUBKO ;BLOCK INPUT ;BLOCK OUTPUT
DNUDTI,,DNUDTO ;WORD INPUT ;WORD OUTPUT
DNUBKI,,DNUBKO ;BLOCK INPUT ;BLOCK OUTPUT
UTOW1: SKIPN UMNFB(I)
JRST OPNL6 ;FULL
PUSH P,B
PUSH P,A
PUSHJ P,UTSNMK
JRST UTWNA ;NOT ASSIGNED
SETZB A,B
PUSHJ P,UTLK3
JUMPE B,UFILDF ;FILE DIR FULL
JRST UTOW2
UTSNMK: SKIPN T,UTASS(I) ;TAPE MUST BE ASSIGNED TO THIS LOSER
POPJ P,
CAME T,UNAME(U)
CAMN T,USYSN1(U)
AOS (P)
POPJ P,
UTOW3: HRROM TT,1(B) ;RESERVE FILE NAME
POP P,UTN1(TT) ;STORE NAMES
POP P,UTN2(TT)
MOVSI J,100000
IORM J,UDIRO(I) ;SET FILE DIR MODIFYED
MOVSI J,UTBKNP(TT) ;GET LIST PNTR PNTR
MOVEM J,UTBKNP(TT) ;MAKE LH SELF-REFERENT SO INIT LINK WILL GO IN RH
AOS NUWCA ;INCR # ACT UWRITE CHNLS
JRST UTOW4
UNCA: JUMPGE D,NCA
UTWNA: SUB P,[2,,2]
NCA: JRST OPNL10
UFILDF: SUB P,[2,,2]
FILDF: JRST OPNL5
S1NL14: SUB P,[1,,1]
JRST OPNL14
UDATAI: SKIPA E,[444400,,1]
UASCII: MOVE E,[440700,,5]
MOVEI B,UBLKI2
JRST CHRKTI
UBLKI: MOVE E,[444400,,1]
JSP B,BLKT
UBLKI2: MPRP(A)
MPRC(A)
UTBGB ;4.9 = 0 UTAPE 1 DISK
UTBRB
JRST 4,.
SKIPG UTBFS(A)
;INPUT BLK BUFFER-GET RTN
UTBGB: LDB Q,[IOLO,,UTBFP(A)]
CAIN Q,377
JRST 4,. ;PNTRS OUT OF PHASE
CAIN Q,376
JRST POPJ2 ;END OF FILE
CONO PI,UTCOFF
SKIPL UTRAC(A)
SKIPGE IOBFT(Q)
JRST UTBGB1
LDB J,[IOLO,,IOBFT(Q)]
HRRM J,UTBFP(A)
MOVEI TT,(SETZ)
CAIL J,376
HRLM TT,UTBFP(A)
CONO PI,UTCON
SOS UTBFS(A)
UTBWG4: MOVE J,TIME
MOVEM J,UTLSTM(A)
MOVEI J,-3
DPB J,[IOLO,,IOBFT(Q)]
LDB TT,[IOSA,,IOBFT(Q)]
LSH TT,6
HLL TT,E
MOVEM TT,MPRP(A)
MOVEI TT,200
IMULI TT,(E)
MOVEM TT,MPRC(A)
HRLM Q,UTMBN(A)
JRST POPJ1
UTBGB1: CONO PI,UTCON
SKIPL IOBFT(Q)
SKIPGE UTRAC(A)
PUSHJ P,UFLS ;REALLY?
JRST UTBGB
UBLKO: MOVE E,[444400,,1]
JSP B,BLKT
UBLKO2: SETZ MPRP(A)
MPRC(A)
UTBWG
UTBWW
JRST 4,.
TRNA
UASCCO: SKIPA E,[440700,,5]
UDATAO: MOVE E,[444400,,1]
MOVEI B,UBLKO2
JRST CHRKTO
;OUTPUT BLKT BUFFER-GET RTN
UTBWG: MOVE Q,UTBFS(A) ;GET # BUFS IN CHNL
IMUL Q,NUWCA ;SCALE TO # ACT UWRITE CHNLS
CAIL Q,LUTWBF ;IF BEING TOO GREEDY WITH BLOCK LIST SPACE
POPJ P, ;LOSE
PUSH P,A
PUSH P,B
MOVE D,A
HRRZ Q,UTBFP(D)
CAIL Q,376
JRST UTBWG1 ;NO BUFS NOW RELOAD
SKIPGE UTDBC(D)
JRST POPBAJ ;CHNL IN ERR
UTBWG2: HRRZ J,UTBFS(D)
CAMG J,UPCHFS
JRST UTBWG1
PUSHJ P,TCALL
JRST UIMRQ
JRST POPBAJ
PUSHJ P,TCALL
JRST UTMGB
JRST UTBWG2
UTBWG1: HRRZ Q,UTTNO(D)
SOSGE UMNFB(Q)
JRST UTBWG5
PUSHJ P,AOSSET
UMNFB(Q)
PUSHJ P,LSWTL ;WAIT FOR
UDIRO(Q) ;DIR TO UNLOCK
PUSH P,E ;SAVE E
PUSHJ P,TCALL
JRST IUTCONS
JRST UTBWG6
PUSH P,A ;SAVE A
PUSH P,B
PUSH P,C
MOVE C,Q
MOVE B,UDIRO(C)
MOVEI E,0 ;INDICATE ADVANCE TO UDIRAD
PUSHJ P,UDOUT2 ;ADV DIR PNTRS (SKIP LOCK CHECK IN UDIRAD)
JRST 4,. ;SHOULDN'T GET HERE
JRST UTPFUL ;NO ROOM FOR EXT
PUSHJ P,LSWPOP ;UNLOCK DIR
PUSHJ P,LSWDEL ;UNHACK UTFAOS
POP P,C
POP P,B
POP P,Q ;GET BACK BUF #
POP P,E ;RESTORE E
POP P,B
POP P,A
AOS UTBFS(A)
JRST UTBWG4
UTBWG5: AOS UMNFB(Q)
JRST IOCER9
UTBWG6: PUSHJ P,LSWCLR ;UNLOCK DIR & ADJ BLK CNT
POP P,E
JRST POPBAJ
UTPFUL: SUB P,[2,,2]
POP P,A ;GET BACK BUF #
PUSHJ P,BRTN ;RETURN BUF
JRST IOCER9 ;BARF ABOUT TAPE FULL
UTBWW: HLRE Q,UTMBN(A)
JUMPL Q,CPOPJ
PUSHJ P,LWAIT ;WAIT FOR
SKIPN UTWBFS ;SPACE IN BLK LIST & GET PNTR
MOVE J,UTWBFS ;(DO NOT COMBINE WITH PRECEDING INST)
HRRZ H,(J) ;GET PNTR TO NEXT FREE WD
MOVEM H,UTWBFS ;UPDATE FS PNTR
CONO PI,UTCON ;TURN ON UTC NOW TO MINIMIZE OFF TIME EVEN THOUGH OFF AGAIN LATER
HRRZ D,UTDBC(A) ;GET NEXT BLK #
MOVSM D,(J) ;PUT IN NEW WD
HLRZ D,UTBKNP(A) ;GET PNTR TO LAST WD IN LIST
HRRM J,(D) ;STORE LINK IN END OF LIST
HRLM J,UTBKNP(A) ;UPDATE END PNTR
MOVEI J,377
IORM J,IOBFT(Q)
SKIPGE UTTNO(A)
SOS IOBFT(Q) ;CHANGE TO EOF
CONO PI,UTCOFF
HLRE J,UTBFP(A)
JUMPL J,UTBWW1
DPB Q,[IOLO,,IOBFT(J)]
UTBWW2: HRLM Q,UTBFP(A)
CONO PI,UTCON
HRROS UTMBN(A)
POPJ P,
UTBWW1: HRRM Q,UTBFP(A)
JRST UTBWW2
UTOCL: MOVSI Q,(SETZ)
IORM Q,UTTNO(A)
LDB E,[300600,,MPRP(A)] ;NOW FILL OUT BLOCK WITH EOF CHARS
CAIN E,7
JRST UTOCL6
UTOCL1: HRROI C,[EOFWRD]
SKIPG MPRC(A)
JRST UTOCL2
PUSHJ P,UDATAO
JRST UTOCL1
UTOCL6: HRROI C,UTEOF(A)
SKIPG MPRC(A)
JRST UTOCL2
PUSHJ P,UASCCO
JRST UTOCL6
UTOCL2: SKIPG MPRC(A)
PUSHJ P,UTBWW ;MAKE SURE BUFFER WRITTEN OUT SINCE MAYBE GOT
;PCLSRED FROM UTBWW DURING .IOT THAT JUST FILLED BUFFER
PUSH P,R
MOVE D,A
SKIPE UTBFS(D)
PUSHJ P,UFLS
HRRZ C,UTTNO(D)
PUSHJ P,LSWTL
UDIRO(C)
HRRZ Q,UTBFP(D)
CAIL Q,376
JRST UTOCL4 ;NORMAL CLOSE
MOVEI Q,%PIIOC ;ABORT WORKS
IORM Q,PIRQC(U)
MOVEI A,0
HRROI B,(D)
PUSHJ P,UDELETE
UTOCL5: PUSHJ P,LSWPOP
POP P,R
SOS NUWCA ;DECR # ACT UWRITE CHNLS
JRST UTOCL3
UTOCL4: MOVE A,UTN1(D)
MOVE B,UTN2(D)
PUSHJ P,UDELETE
LDB Q,[220500,,UTTNO(D)]
LSH Q,1
ADD Q,UDIRO(C)
MOVE A,UTN1(D)
MOVE B,UTN2(D)
MOVEM A,-2(Q)
MOVEM B,-1(Q)
LDB Q,[220500,,UTTNO(D)]
ADD Q,UDIRO(C)
MOVEI A,1
IORM A,133(Q)
JRST UTOCL5
UTDEL1: MOVE C,I ;DELETE
SKIPE SRN3(U)
JRST UTRN1 ;RENAME
PUSHJ P,UTSNMK
JRST NCA
PUSHJ P,UDELETE
JUMPE TT,OPNL4
JRST LSWPJ1
UTRN1: JUMPE A,UTRN3 ;RENAME OF OPEN FILE
PUSHJ P,UTSNMK ;ALLOW RENAME OF OPEN FILE
JRST NCA
PUSHJ P,UTLOOK
JUMPE B,OPNL14
PUSH P,Q
MOVE A,SRN3(U)
MOVE B,SRN4(U)
PUSHJ P,UTLOOK
POP P,Q
JUMPN B,OPNL13
MOVE A,SRN3(U)
MOVE B,SRN4(U)
MOVEM A,0(Q)
MOVEM B,1(Q)
UTRN4: MOVSI A,100000
IORM A,UDIRO(C)
JRST LSWPJ1
UTRN3: ADDI B,IOCHNM(U)
HLRZ TT,(B)
MOVE A,SRN3(U)
MOVE B,SRN4(U)
MOVEM A,UTN1(TT)
MOVEM B,UTN2(TT)
JRST UTRN4
UDELETE: MOVEI TT,0 ;TT=0 IF NOTHING DELETED + OTHERWISE
UDELA: PUSHJ P,UTLOOK
JUMPE B,CPOPJ ;TAPE NO IN C,FILE NAME IN A,B
MOVEI E,NUTIC-1
UDELE4: HRRZ J,UTTNO(E)
SKIPL UTUSR(E)
CAME J,C
JRST UDELE3
HLRZ J,UTTNO(E)
CAME J,A
JRST UDELE3
MOVSI J,10000
TDNE J,UTDBC(E)
JRST UDELE3 ;THIS IS LOSER WHO IS CLOSING FILE
IORM J,UTDBC(E)
CLEARM (Q)
SETOM 1(Q)
AOJA TT,CPOPJ
UDELE3: SOJGE E,UDELE4
UDELE1: CLEARM (Q)
CLEARM 1(Q)
MOVE J,A
ADD J,UDIRO(C)
MOVEI B,1
ANDCAM B,133(J)
MOVSI J,100000
IORM J,UDIRO(C)
UDELE6: HRRZ B,UDIRO(C)
ADD B,[500,,23.*2-1]
MOVEI J,0
UDELE2: ILDB E,B
CAMN E,A
AOS UMNFB(C)
CAMN E,A
DPB J,B
CAIE E,37
JRST UDELE2
MOVE B,A
MOVEI A,0
AOJA TT,UDELA
UTICL: PUSH P,R
MOVE D,A
MOVSI C,200000
IORM C,UTRAC(D) ;SET EOF
MOVEI T,400000
TDNN T,UTRAC(D)
PUSHJ P,UFLS ;WAIT FOR ACTIVE BUFFER TO TRANSFER
PUSHJ P,UTBRB1 ;RETURN ACTIVE BUFFER MAIN PROG
HLRZ A,UTTNO(D)
MOVE B,UTDBC(D)
TLNE B,10000
PUSHJ P,UDELE5 ;FINISH FILE DELETE
POP P,R
UTOCL3: HRRZ A,UTBFP(D)
UTICL2: CAIL A,376
JRST UTICL3
LDB C,[IOLO,,IOBFT(A)]
PUSHJ P,BRTN
MOVE A,C
JRST UTICL2
UTICL3: PUSHJ P,UCPAT0 ;UT CHANNEL PATCH OUT
CLEARM UTDIRP(D)
SETOM UTUSR(D)
CLEARM (R)
POPJ P,
UCPAT0: HRRZ B,UTTNO(D) ;PATCH OUT CHANNEL
MOVEI C,DCHNT-UTUL(B)
CONO PI,UTCOFF
UCPAT2: HRRE E,UTUL(C)
JUMPL E,UTCOP
CAMN E,D
JRST UCPAT1
MOVE C,E
JRST UCPAT2
UCPAT1: HRRZ E,UTUL(E)
HRRM E,UTUL(C)
SOS NUTCA
UTCOP: JRST UTCONJ
UDELE5: HRRZ C,UTTNO(D)
PUSHJ P,LSWTL
UDIRO(C)
HLRZ Q,UTTNO(D)
MOVE A,Q
LSH Q,1
ADD Q,UDIRO(C)
SUBI Q,2
PUSHJ P,UDELE1
JRST LSWPOP
UTBRB1: MOVE A,D
UTBRB: PUSH P,A
HLRE A,UTMBN(A)
JUMPL A,POPAJ
PUSHJ P,BRTN
POP P,A
HRROS UTMBN(A)
POPJ P,
UTRL1: JUMPE B,UTRLDR
HRRZ B,UTBFP(D)
CAIE B,377
JRST JDB6C
UTRLDR: LDB R,[270100,,UTDBC(D)]
JUMPN R,UTRLD1
SKIPL R,UDIRO(C) ;SPECIAL KLUDGE TO RUN FAST
TLNE R,10000 ;SKIPN ON NOT IN UBLAT MODE
JRST UTRLD1
LDB TT,[220500,,UTDBC(D)]
ILDB B,UTDIRP(D)
AOS UTDBC(D)
CAME B,TT
JRST UTRLD2
UTRLD3: PUSHJ P,IUTCONS ;RTN BUFFER NO IN A
JRST UTRLR1 ;MEM LOCKED (OR SOMETHING)
CLEARM URDWR(C)
HRRZ B,UTDBC(D) ;GET BLK # TO READ
JRST UTRLD
UTRLD2: CAIN B,37
PUSHJ P,UAR
UTRLD1: PUSHJ P,UDIRAD
JRST JDB6C2 ;DIR DOUBLE LOCKED
JRST UTREOF
JRST UTRLD3
JDDTA: HLRZ D,ULDCH(C) ;FINISHED DATA TRANS TAPE IN C GET CHNL NO
CLEARM UTLDD(D)
SETOM SMODE
IFE NEWDTP, CONSZ DC,7
IFN NEWDTP, CONSO DTS,100000
JRST UDATER ;DC STILL ENABLED => ERROR
SETOM UGOAL(C)
CAIL D,NUTIC
JRST JDDT1 ;WRITE OR FILE DIRECTORY
MOVE E,UTRAC(D)
HLLOS UTRAC(D)
MOVEI B,377
IORM B,IOBFT(E)
HLRE B,UTBFP(D)
JUMPL B,JDDT5
DPB E,[IOLO,,IOBFT(B)]
JDDT6: HRLM E,UTBFP(D)
AOS UTBFS(D)
JDDT2: PUSHJ P,JDB6W
JRST JDDT3 ;SAME TAPE CAN RELOAD, DONT CHECK OTHERS
JDDT4: HRRZS ULDCH(C)
IFE NEWDTP, JRST JDB4A ;UNIT NOW IDLE STOP IT
IFN NEWDTP,[
PUSHJ P,JDSTP
JRST JDB3
]
JDDT1: CAIL D,NUTIC+NUTOC
JRST UDRDD3 ;FILE DIR IN OR OUT
HRRZ A,UTRAC(D)
PUSHJ P,IBRTN
HLLOS UTRAC(D)
SOS UTBFS(D)
JRST JDDT2
JDDT5: HRRM E,UTBFP(D)
JRST JDDT6
UTREOF: MOVSI E,200000
IORM E,UTRAC(D)
HLRE E,UTBFP(D)
SKIPL E
SOSA IOBFT(E) ;TURN END OF LIST TO END OF FILE
SOS UTBFP(D)
AOS UTBFS(D) ;TO START MAIN PROG
JRST JDB6C
JDB6W: HRRE D,DCHNT(C)
JUMPL D,JDB6W1 ;NO CHANNELS ACTIVE
CAIN D,200000
JRST UDRDD ;READ FILE DIR
JDB6C1: SKIPL E,UTRAC(D)
TLNE E,300000
JRST JDB6C2 ;CHANNEL LOCKED
CAIL D,NUTIC
JRST JDB6A ;WRITE CHANNEL
HRRZ B,UTBFS(D)
CAILE B,MXUTBF ;READ CHANNEL; SHOULDN'T LET IT GET TOO MANY BUFFERS.
JRST JDB6C
HRRZ B,UTFS
CAIN B,377
JRST JDB6E ;TRY TO GET MORE MEMORY
MOVE B,UTBFS(D)
SOJLE B,UTRL1 ;RELOAD CHANNEL WITH ONE OR NO BUFFERS
MOVE B,UTLSTM(D)
SUB B,TIME
CAMG B,[-300.]
JRST JDB6C2 ;NO RELOAD
JDB6F: HRRZ B,UTBFS(D) ;NUMBER BUFS THIS CHANNEL HAS
CAMGE B,UPCHFS
JRST UTRLDR
JDB6E: PUSHJ P,UIMRQ ;TRY TO GET MORE MEMORY (IO)
JRST JDB6C2 ;NOT AVAIL
PUSHJ P,UTMGB ;ADD TO MEM ALLOC UTAPE
JRST JDB6F
UTRLR1: PUSHJ P,UDIRR ;BACK UP
JRST 4,.
JRST 4,. ;LOSSAGE
JDB6C2:
JDB6C: HRRE D,UTUL(D)
JUMPGE D,JDB6C1
JRST POPJ1
JDB6W1: LDB D,[410300,,UDIRO(C)]
SOJN D,POPJ1 ;DIR CHANGED AND NOT LOCKED
HRRZ D,UDIRO(C)
LDB D,[370500,,177(D)]
CAIE D,37
JRST 4,. ;DIRECTORY CLOBBERED SINCE READ IN
MOVEI D,100 ;INITIATE FILE DIR WRITE
SKIPL ULDCH(C) ;SKIPN ON ALREADY LOW PRIORITY POSIT
PUSHJ P,ILLP ;INITIATE LOW PRIOR POSIT
JRST POPJ1
ULLP1: SKIPGE UDIRO(C)
POPJ P,
SETOM URDWR(C) ;SET FILE DIR WRITE CYCLE FROM LOW PRIORITY CYCLE
MOVSI D,400000 ;LOCK DIR
IORM D,UDIRO(C)
MOVEI D,NUTIC+NUTOC
HRRZ A,ULDCH(C) ;BUFFER NO OF DIRECTORY
JRST JDB6W2
JDB6A: HRRZ A,UTBFP(D)
CAIGE A,376
SKIPGE IOBFT(A)
JRST JDB6C2 ;LOCKED OUT SNIFFLE
MOVE E,UTBKNP(D) ;GET BLK LIST PNTR
MOVE J,UTWBFS
EXCH J,(E)
HRRZM E,UTWBFS
HLRZ B,J ;GET BLK # FROM HEAD OF LIST
HRR E,J ;SET LINK TO NEXT WD IN LIST
TRNN E,-1 ;IF LIST EMPTY
MOVSI E,UTBKNP(D) ;SET END PNTR TO PNTR SO NEXT LINK WILL GO HERE
MOVEM E,UTBKNP(D) ;UPDATE PNTR
SETOM URDWR(C)
HRRZ A,UTBFP(D)
LDB E,[IOLO,,IOBFT(A)]
HRRM E,UTBFP(D)
MOVEI J,(SETZ)
CAIL E,376
HRLM J,UTBFP(D)
UTRLD: HRRM A,UTRAC(D)
UDRR2: MOVEM B,UGOAL(C)
MOVEI B,-4
DPB B,[IOLO,,IOBFT(A)]
LDB B,[IOSA,,IOBFT(A)]
LSH B,6
SOS B
HRRM B,UMEMAD(C)
HRLM D,ULDCH(C)
MOVE B,TIME
MOVEM B,DRTM(C)
POPJ P,
JDB6: PUSHJ P,JDB6W
JRST JDBRK7 ;SUCCESFUL RELOAD
SKIPL ULDCH(C)
IFE NEWDTP,[
JRST JDBRK4 ;CAN NOT RELOAD
JRST JDF2A
]
IFN NEWDTP,[
JRST JDBRK6
JRST JDS1
]
UDRDD: MOVE D,UDIRO(C) ;TAPE WANTS FILE DIRECTORY READ
TLO D,20000 ;OK FOR 4.5 CLEAR
AOSE D ;REST SHOULD BE -1
JRST 4,. ;FILE DIRECTORY READ REQUEST WHEN ALREAD IN
MOVEI D,NUTIC+NUTOC ;GET DIRECTORY CHANNEL NUMBER IN D
PUSHJ P,IUTCONS
JRST POPJ1 ;NO MEM
LDB B,[IOSA,,IOBFT(A)] ;GET ORIGIN _ -6
LSH B,6
TLO B,600000 ;SET LOCK, DOUBLE LOCK BITS
MOVEM B,UDIRO(C) ;STORE ORIGIN
HLLOS DCHNT(C) ;NO CHANNEL ACTIVE THIS UNIT YET
CLEARM URDWR(C) ;SIGNAL WANT READ
HRRM A,ULDCH(C) ;STORE BUFFER NUMBER
JDB6W2: MOVEI B,100 ;DIRECTORY BLOCK NUMBER
JRST UDRR2
UDRDD3: HRRZ D,ULDCH(C) ;FILE DIR IN OR OUT
HRRZS UDIRO(C) ;UNLOCK DIRECTORY
DPB C,[IOLO,,IOBFT(D)]
HRRZS ULDCH(C)
JRST JDDT2
UDIRAD: TDZA E,E ;ADVANCE DIR PNTRS OF CHANNEL IN D
UDIRR: MOVEI E,1 ;REV DIR PNTRS THIS WINS FOR READS ONLY HA HA
SKIPGE B,UDIRO(C)
JRST UDOUT3
UDOUT2: TLNE B,10000
JRST UDBL1 ;UBLAT MODE
UDOUT7: LDB R,[270100,,UTDBC(D)]
XOR R,E
MOVEI Q,0
CAIL D,NUTIC
MOVEI Q,UTBLKS
LDB TT,[220500,,UTDBC(D)]
UDIR1: PUSHJ P,UITAB(R)
TRNE J,-1 ;BLK NO RTN IN RH J
CAIN B,37
JRST UDOUT ;END OF EXTENSION
CAME B,TT
SOJA Q,UDIR1
SOJG Q,.-1
LDB B,[300500,,UTDBC(D)]
DPB B,UTDIRP(D)
UDARET: JRST POPJ2
UDBL1: AOS A,UTDBC(D)
CAILE A,1101
JRST POPJ1 ;EOF
JRST POPJ2
UDOUT: JUMPN E,UDOUT5
CAIL D,NUTIC
JRST UDOUT1
MOVEI A,0 ;READ
MOVE B,TT
PUSHJ P,UTLOOK ;TAP NO IN C NAME IN A,B
JUMPE B,POPJ1 ;EOF OR ADR OF FIRST WD
UDOUT6: DPB A,[220500,,UTDBC(D)] ;FILE NO
UDOUT4: DPB A,[300500,,UTDBC(D)]
MOVSI A,1_5
XORM A,UTDBC(D)
JRST UDOUT7
UDOUT3: TLNN B,200000 ;DIRECTORY DOUBLE LOCKED
CAIL D,NUTIC
POPJ P,
JRST UDOUT2
UDOUT1: SETZB A,B
PUSHJ P,UTLOOK
JUMPE B,UDOUT8 ; FILE DIR FULL
LDB J,[300500,,UTDBC(D)]
MOVEM J,1(B)
JRST UDOUT4
UDOUT8: XORI R,1 ;REVERSE DIR
AOS (P) ;SKIPN ONCE
JRST UITAB(R) ;BACK UP PNTRS AND RETURN
UDOUT5: LDB A,[220500,,UTDBC(D)]
LSH A,1
ADD A,UDIRO(C)
SKIPE -2(A)
JRST UDARET
MOVE A,-1(A)
JRST UDOUT6
UTLK3: SKIPA Q,UDIRO(I)
UTLOOK: MOVE Q,UDIRO(C) ;B=0 => NOT FOUND
HRLI Q,-23.
PUSH P,[1]
UTLK2: CAMN A,(Q)
CAME B,1(Q)
AOJA Q,UTLK1
MOVE B,Q
JRST POPAJ
UTLK1: AOS(P)
AOBJN Q,UTLK2
MOVEI B,0
JRST POPAJ
UITAB: AOSA J,UTDBC(D)
JRST UAR
UAF: ILDB B,UTDIRP(D)
POPJ P,
UAR: MOVSI B,50000
ADD B,UTDIRP(D)
SKIPGE B
SUB B,[430000,,1]
MOVEM B,UTDIRP(D)
LDB B,B
SOS J,UTDBC(D)
POPJ P,
EBLK
IFN NEWDTP,{
; T S UTAPE ROUTINES PI SERV (NEW UTAPE CONTROL)
TAPE: 0
UTP1: 0 ;JRST PIPOS OR DATAI DC, OR JRST UTP3
BBLK
SOS .-1
AOSGE TAPCNT
JRST 12,@TAPE
UTP3: CONO DTS,770001
JRST 12,@TAPE
PIPOS: MOVEM A,TAP1
MOVEM B,TAP2
MOVEM C,TAP3
MOVE C,SUNIT
DATAI DTC,B
TDZE B,[1777#-1]
JRST PIPOS7
MOVEM B, EUPOS(C)
HRRZM C, DG2(C)
SKIPGE UGOAL(C)
JRST PIPF1
SUB B,UGOAL(C)
JUMPE B,PIPOS2
ADD B,UDIR(C)
MOVMM B,UTENB
SKIPGE ULDCH(C)
JRST PIPOS3
JUMPN B,PIPOS3
PIPOSL: MOVEI A,40000+DCCHN_3
DPB C,[110300,,A] ;SET SELECTED UNIT CONO DTC,FOO(A)
MOVE B,UDIR(C)
XCT UTST2(B)
PIPOS5: MOVE C,TAP3
MOVE B,TAP2
MOVE A,TAP1
JRST 12,@TAPE
PIPOS7: AOS BDBLKC
JRST PIPOSL
EBLK
BDBLKC: 0
BBLK
PIPOS3: MOVE A,UDIR(C)
LSH A,2
SUB B,A
XOR B,UDIR(C)
MOVEI A,40000
DPB C,[110300,,A]
JUMPG B,PIPOS4 ;GOING WRONG DIR
PIPOS6: MOVE B,TIME
MOVEM B,ULCTM(C)
ADD B,UTENB
MOVEM B,DRTM(C)
PIPF2: MOVE B,UDIR(C)
TRNN A,40000
TRO A,30000
XCT UTST2(B)
; CLEARM UDCC
; SETOM DCFREE
CONO DTS,770001 ;ENABLE ALL INTERUPTS AND SET FUNCTION STOP
JRST PIPOS5
PIPF1: MOVEI A,40000
DPB C,[110300,,A]
MOVE B,TIME
MOVEM B,ULCTM(C)
JRST PIPF2
PIPOS4: TRZ A,40000 ;TURN TAPE AROUND
CLEARM DG2(C)
MOVNS B,UDIR(C)
MOVEM B,OUDIR(C)
JRST PIPOS6
PIPOS2: HLRZ A,ULDCH(C)
SKIPL ULDCH(C)
SKIPGE UTRAC(A)
JRST PIPOS3 ;CHANNEL LOCKED
SETOM UTLDD(A) ;CHANNEL ACTUALLY LOADED TRANSFER IMMINENT
AOS SMODE
MOVEI A,0
MOVE B,UMEMAD(C)
SKIPGE URDWR(C)
TROA A,400 ;WRITE
TLZ B,(BLKO-BLKI)
SKIPL UDIR(C)
JRST TAPFOR
TRO A,100000
ADD B,[DATAI-BLKI 200]
MOVEM B,UTP1
MOVNI B,200
MOVEM B,TAPCNT
TAP4: CONO DTC,300+DCCHN_3+UTCCHN(A)
CONO DTS,770000
MOVE B,URDWR(C)
MOVEM B,WRITE
MOVE C,TAP3
MOVE B,TAP2
MOVE A,TAP1
JRST 12,@TAPE
TAPFOR: TRO A,200000
HRRM B,TAPCNT
HRRI B,TAPCNT
MOVEM B,DCMLOC
MOVE B,[-200,,UTP3]
HRRM B,UTP1
HLLM B,TAPCNT
JRST TAP4
UTERR: CONI DTS,E
SKIPL SMODE
JRST UDATER
; SKIPGE UDCC
; SETOM DCFREE
UTER5: SKIPN C,SUNIT
JRST JDB3
SETOM DG2(C)
SKIPL UFLAPF(C)
JRST UTER6
CLEARM UFLAPF(C)
CLEARM EUPOS(C)
CLEARM UDIR(C)
CLEARM OUDIR(C)
CONO DTC,400000 ;STOP DRIVE
JRST JDB3
UTER6: AOS UTERP(C)
HRLM E,UTERP(C)
TRNN E,20000
JRST JDB3 ;END ZONE
MOVNS B,UDIR(C)
MOVEI A,0
SKIPGE B
MOVEI A,1103
MOVEM A,EUPOS(C)
MOVE A,TIME
MOVEM A,ULCTM(C)
MOVEM A,DRTM(C)
JRST JDB7
UDATER: CONO DTS,770001 ;ENABLE ALL INTERUPTS AND STOP FUNCTION
SETOM SMODE
HLRZ D,ULDCH(C)
CLEARM UTLDD(D)
JRST JDB3
UTCB0: MOVE C,SUNIT
AOSE CUINT ;SKIP IF CLOCK CAUSED INTERUPT
JRST JDBRK ;NOT TIME FLAG
UTCB1: MOVE B,UDIR(C)
AOSN UTHERR ;HANG UP ERROR SENT FOR SLOW CLOCK ROUTINE
JRST UTERR
JRST JDB3
JDDT3: MOVE A,EUPOS(C) ;AFTER DATA XFER
SUB A,UGOAL(C)
MOVMS E,A
ADD A,TIME
MOVEM A,DRTM(C)
MOVE C,[-NUNITS,,1]
MOVM B,DRTM(C)
CAMGE B,TIME
JRST JDB3 ;SOMETHING ELSE DUE
AOBJN C,.-3
MOVE C,SUNIT
SOJLE E,JDB7 ;RELOADING FOR NEXT BLOCK
JRST JDB3
ILLP: MOVEM D,UGOAL(C) ;LOW PRIORITY POSIT ENTRY
MOVSI A,(SETZ)
IORM A,ULDCH(C)
UTDC: SKIPGE UGOAL(C)
POPJ P, ;UNIT IDLE
SKIPGE DG2(C)
JRST UTDC3
UTDC1: MOVE A,EUPOS(C) ;ESTIMATE UNIT TIME AND UPDATE EUPOS
SKIPG DG2(C) ;SKIP ON EXACT POS KNOWN
SKIPN UDIR(C) ;SKIP ON UNIT RUNNING
JRST UTDC4
MOVE B,TIME
SUBM B,ULCTM(C)
EXCH B,ULCTM(C)
IMUL B,UDIR(C)
ADD A,B ;ACTUAL ESTIMATED POSITION
MOVEM A,EUPOS(C) ;UPDATE EUPOS
UTDC4: SUB A,UGOAL(C)
MOVM B,A
CAIG B,2
JRST UTDC2
ADD A,UDIR(C)
MOVMS Aî
CAMLE A,B
SETZB A,B ;GOING WRONG DIR
UTDC2: CAILE B,200.
MOVEI B,200. ;LIMIT LONGEST DEAD RECKON
ADD B,TIME
MOVEM B,DRTM(C)
POPJ P,
UTDC3: MOVEI B,0 ;NOT KNOWN EXACT POS REQUIRES IMMEDIATE ATTENTION
JRST UTDC2
JDBRK: CONSZ DTC,7
CONSO DTS,2
JRST POPRET
CONSZ DTS,670300
JRST UTERR
CONSO DTS,100000
JRST POPRET
SKIPL SMODE
JRST JDDTA ;DATA MODE
JDB3:
; SKIPGE UDCC
; SETOM DCFREE
HRLOI B,177777
MOVEM B,UTTM2
SETZM UTTM4
SETOM UTTM3 ;UNIT MOST URGENT
CLEARM UTTM1 ;UNIT COULD START
MOVE C,[-NUNITS,,1]
JDBRK7: SKIPGE B,UFLAPF(C)
JRST JDF1 ;FLAPPING OP
JDF2: SKIPL ULDCH(C) ;SKIP ON LOW PRIOR POSIT
SKIPGE UGOAL(C)
JRST JDB6 ;UNIT FREE
JDS1: SKIPE UDIR(C)
JRST JDBRK4
SKIPN UTTM1 ;UNIT TO START
HRRZM C,UTTM1
JRST JDBRK6
JDBRK4: MOVE B,DRTM(C)
SUB B,TIME
MOVE E,B
SUB E,UTTM2 ;TIME SOME OTHER UNIT NEEDS ATTN
JUMPL B,JDCV1 ;ALREADY OVERDUE
MOVM D,E
CAIG B,20. ;CONFLICT MORE THAN 20 BLKS AWAY
CAIL D,20. ;THEY ARE SEPARETED BY 20 BLKS
JRST JDCV1
HRRZS C ;RELIEVE CONFLICT BY STOPPING UNIT DUE LATEST
CAMG B,UTTM2
HRRZ C,UTTM3
JDF5: PUSHJ P,JDSTP ;STOP UNIT
JRST JDB3
JDCV1: JUMPGE E,ULLP
MOVEM B,UTTM2 ;UNIT DUE SOONEST
HRRZM C,UTTM3
ULLP: SKIPL ULDCH(C)
JRST JDBRK6
MOVE B,TIME ;LOW PRIORITY POSIT IN PROGRESS
SUB B,ULCTM(C)
IMUL B,UDIR(C)
SKIPE DG2(C)
MOVEI B,0
ADD B,EUPOS(C)
SUB B,UGOAL(C)
MOVMS B
CAIGE B,10.
PUSHJ P,ULLP1 ;TERM LOW PRIORITY DIRECTORY POS (COMMIT TO ACTUAL WRITE)
JDBRK6: AOBJN C,JDBRK7
MOVE C,UTTM3 ;MOST PRESSING RUNNING UNIT
MOVE B,UTTM2
CAIGE B,30.
JRST JDB7 ;STAY WITH PRESSING UNIT
SKIPE UTTM1
JRST JDB5 ;START UNIT IF POSSIBLE
JDF6A: CAMG B,[10000000.]
JRST JDB7
AOSE UTTM4 ;DON'T IF FLAP OP STILL IN PROGRESS
PUSHJ P,JDDS
SETOM UIDLE
JRST POPRET
JDF1: MOVE E,UDIRO(C)
AOJE E,JDF1A
TLNE E,100000
JRST JDF2
JDF1A: SKIPGE UGOAL(C) ;FLAPPING OP
SKIPGE ULDCH(C)
JRST JDF2
SKIPE UDIR(C)
SKIPG DG2(C)
JRST .+2
JRST JDF3A ;HAVE JUST READ IN TAPE POS
TLNN B,100000
JRST JDF3 ;UNIT TO START FLAPPING (I.E. READ IN TAPE POS, THEN FLAP)
LDB D,[4000,,B]
TLNN B,100000
JRST JDBRK6
TLNN B,200000 ;ABORT FLAPPING
CAMG D,TIME
JRST JDF4 ;UNIT TO STOP FLAPPING
SETOM UTTM4 ;INDICATE FLAP OP STILL ACTIVE
JRST JDBRK6
JDDS: CONO DTC,10000 ;DESELECT
CLEARM SUNIT
POPJ P,
JDSTP: MOVEI A,430000
SETZM UDIR(C)
SETZM OUDIR(C)
JDCNN: HRRZS C
CAME C,SUNIT ;DIR CONO IN A TO UNIT IN C
SKIPN SUNIT
JRST JDSTP1
PUSHJ P,JDDS
JDSTP1: DPB C,[110300,,A]
CONO DTC,(A)
MOVEM C,SUNIT
POPJ P,
JDF3: MOVE A,UDIRO(C) ;WANT TO FLAP
AOJE A,JDF3A1 ;DIR NOT IN
TLNE A,10000
JRST JDF3A2 ;TAPE IN UBLAT MODE (COMMENT USED TO SAY DIR ON WAY IN) (??)
HRRZ A,ULDCH(C)
LDB Q,[IOCH,,IOBFT(A)]
CAIE Q,NUTIC+NUTOC
JRST 4,.
LDB Q,[IOLO,,IOBFT(A)]
CAIE Q,(C)
JRST 4,.
PUSHJ P,IBRTN ;RETURN DIR BUFFER
JDF3A2: SETOM UDIRO(C)
SETZM UTASS(C)
JDF3A1: SETOM UDPWF(C)
SKIPGE DG2(C)
JRST JDF6
JDF3A: SETOM DG2(C) ;FLAP UNIT INC(KNOWING WHERE IT IS)
MOVE E,EUPOS(C)
IMULI E,50. ;50 MS/BLOCK
IDIVI E,33. ;33 MS/(1/2 SEC)
ADDI E,30. ;15 SECS EXTRA
ADD E,TIME ;NET TIME TO STOP FLAPPING
TLO E,100000
DPB E,[4200,,UFLAPF(C)]
LSH C,9.
CONO DTC,130000(C) ;GO REVERSE
PUSHJ P,JDDS
JRST JDB3
JDF6: HRRZS C
SETOM UDIR(C)
JRST JDB7
JDF4: TLNE B,40000
JRST JDF4A
MOVEI A,230000 ;A SHOT OF FOWARD
PUSHJ P,JDCNN ;REEL WILL STOP
AND B,[700000,,]
ADD B,[40000,,2]
ADD B,TIME
MOVEM B,UFLAPF(C)
JRST JDB3
JDF4A: PUSHJ P,JDSTP
CLEARM UFLAPF(C)
CLEARM EUPOS(C)
SETOM DG2(C)
JRST JDF5
JDB5: HRRZ C,UTTM1
MOVE E,UGOAL(C)
CAML E,EUPOS(C)
SKIPA B,[1]
MOVNI B,1
MOVEM B,UDIR(C)
JDB7: SKIPN B,UDIR(C)
JRST 4,. ;NOT TRYING TO GO
MOVEI A,DCCHN_3
SKIPN SUNIT
JRST DCGB1
CAME C,SUNIT
JRST DCGB2
CAMN B,OUDIR(C)
TRO A,40000 ;INHIBIT START DELAY (SAME UNIT, SAME DIRECTION)
DCGB1: MOVEM C,SUNIT
MOVEM B,OUDIR(C)
TRNN A,40000
TRO A,30000
DPB C,[110300,,A]
XCT UTST2(B)
CONO DTS,770000
MOVE C,[JSR TAPE]
MOVEM C,DCMLOC
MOVEM C,DCMLOC+1
MOVE C,[JRST PIPOS]
MOVEM C,UTP1
JRST POPRET
DCGB2: PUSHJ P,JDDS
JRST DCGB1
CONO DTC,130200+UTCCHN+<DCCHN_3>(A)
UTST: CONO DTC,430000+UTCCHN+<DCCHN_3>(A)
CONO DTC,230200+UTCCHN+<DCCHN_3>(A)
CONO DTC,130200+UTCCHN(A)
UTST1: CONO DTC,430000+UTCCHN(A)
CONO DTC,230200+UTCCHN(A)
CONO DTC,100200+UTCCHN(A)
UTST2: CONO DTC,400000+UTCCHN(A)
CONO DTC,200200+UTCCHN(A)
};IFN NEWDTP
IFE NEWDTP,{
; T S UTAPE ROUTINES PI SERV (OLD UTAPE CONTROL)
JDENB==40000 ;ENABLE JOB DONE (CONO UTC,)
20MSEN==5000 ;20MS, ENABLED (")
TAPE: 0
UTP1: 0 ;DATAI DC, OR JRST UTP3
BBLK
SOS .-1
AOSGE TAPCNT
JRST 12,@TAPE
UTP3: SKIPN WRITE
CONO DC,0
CONO DC,400000 ;CLEAR PIA
JRST 12,@TAPE
PIPOS: CONSO DC,1000
JRST PIPX
SKIPN C,SUNIT
JRST PIPOS8 ;NO UNIT SELECTED?
DATAI DC,B ;UNIT SELECTED, GET BLOCK NUMBER
TDZE B,[1777#-1] ;CLEAR OUT GARBAGE IN BLOCK NUMBER WORD
JRST PIPOS7 ;GARBAGE THERE, BAD BLOCK NUMBER
MOVEM B,EUPOS(C) ;STORE POSITION
HRRZM C,DG2(C) ;SIGNAL EUPOS IS ACCURATE
SKIPGE UGOAL(C) ;GOING SOMEWHERE?
JRST PIPF1 ;NO
SUB B,UGOAL(C) ;GET CURRENT - DESIRED
JUMPE B,PIPOS2 ;JUMP IF THERE
ADD B,UDIR(C)
MOVMM B,UTENB
SKIPGE ULDCH(C)
JRST PIPOS3
JUMPN B,PIPOS3
PIPOSL: MOVE A,SUNITL ;HOLD DC
MOVE B,UDIR(C)
XCT UTST(B)
CONO DC,4010+UTCCHN
PIPOS5: JRST PIPX
PIPOS7: AOS BDBLKC
JRST PIPOSL
EBLK
BDBLKC: 0
BBLK
PIPOS3: MOVE A,UDIR(C)
LSH A,2
SUB B,A
XOR B,UDIR(C)
MOVE A,SUNITL
JUMPG B,PIPOS4 ;GOING WRONG DIR
PIPF2: TRO A,JDENB ;ENB JD SO NEXT BREAK TO UTC ON BLOCK
PIPOS6: MOVE B,TIME
MOVEM B,ULCTM(C)
ADD B,UTENB
MOVEM B,DRTM(C)
MOVE B,UDIR(C)
XCT UTST(B)
PIPOS8: CONO DC,0
JRST PIPOS5
PIPF1: MOVE A,SUNITL
JRST PIPF2
PIPOS4: CLEARM DG2(C)
MOVNS UDIR(C)
TRO A,6000
JRST PIPOS6
PIPOS2: HLRZ A,ULDCH(C) ;TAPE NOW POSITIONED
SKIPL ULDCH(C)
SKIPGE UTRAC(A)
JRST PIPOS3 ;CHANNEL LOCKED
SETOM UTLDD(A) ;CHANNEL ACTUALLY LOADED TRANSFER IMMINENT
AOS SMODE
MOVE A,SUNITL
MOVE B,UMEMAD(C)
SKIPGE URDWR(C)
TROA A,400
TLZ B,(BLKO-BLKI)
SKIPL UDIR(C)
JRST TAPFOR
TRO A,10000
ADD B,[DATAI-BLKI 200]
MOVEM B,UTP1
MOVNI B,200
MOVEM B,TAPCNT
TAP4: CONO UTC,360300+UTCCHN(A)
MOVE B,URDWR(C)
MOVEM B,WRITE
CONO DC,400000+DCCHN ;GIVE CHN FOR READ
SKIPGE B
CONO DC,3410+DCCHN
JRST PIPX
TAPFOR: HRRM B,TAPCNT
HRRI B,TAPCNT
MOVEM B,DCMLOC
MOVE B,[-200,,UTP3]
HRRM B,UTP1
HLLM B,TAPCNT
JRST TAP4
UTERR: CONSZ UTC,4000 ;CHECK TIME ENABLE
CONSO UTS,20 ;CHECK TIME FLAG
JRST .+2
JRST UTCB1 ;ELIMINATE TIMING ERROR IF FLAG COMES ON
CONI UTS,E
SKIPL SMODE
JRST UDATER ;DATA ERROR
CONO DC,0
SKIPN C,SUNIT
JRST JDB3 ;NO UNIT SELECTED, IGNORE ERROR
SETOM DG2(C)
SKIPL UFLAPF(C)
JRST UTER6 ;NOT FLAPPING
CLEARM UFLAPF(C) ;ERROR WHILE FLAPPING, JUST FORGET ABOUT IT
CLEARM EUPOS(C)
CLEARM UDIR(C)
JRST JDB3
UTER6: AOS UTERP(C) ;INCREMENT ERROR COUNT
HRLM E,UTERP(C) ;STORE UTS CONI
MOVE B,UDIR(C)
TRZ E,7650 ;CLEAR RANDOMNESS, WRITE, PARITY ERROR
JUMPE E,JDB3 ;JUMP ON ONLY PARITY ERROR (IF ANYTHING), TRY AGAIN NOW
TRNN E,2 ;CHECK EOT FLAG
JRST UTER1 ;NOT SET
MOVNS B,UDIR(C) ;EOT, WANT TO GO OTHER DIRECTION
MOVEI A,0
SKIPGE B
MOVEI A,1103
MOVEM A,EUPOS(C) ;STORE NEW ESTIMATED POSIION
MOVE A,TIME
MOVEM A,ULCTM(C)
MOVEM A,DRTM(C)
UTER1: JRST UTER3 ;GIVE MAX DELAY
UDATER: SETOM SMODE ;DATA ERROR, TRY REPOSITIONING
HLRZ D,ULDCH(C)
CLEARM UTLDD(D)
JRST JDB3
UTCB0: MOVE C,SUNIT
CONSZ UTC,4000
CONSO UTS,20
JRST JDBRK ;NOT TIME FLAG
UTCB1: MOVE A,SUNITL
MOVE B,UDIR(C)
AOSN UTHERR ;HANG UP ERROR SENT FOR SLOW CLOCK ROUTINE
JRST UTERR
AOSN USTSW
JRST DCGBL1
AOSN USTPF
JRST JDB7D
MOVEI C,0
EXCH C,FLPUNT
JUMPN C,JDF8
EXCH C,STPUNT
JUMPN C,JDB4B
JRST JDB3
JDDT3: MOVE A,EUPOS(C)
SUB A,UGOAL(C)
MOVMS E,A
ADD A,TIME
MOVEM A,DRTM(C)
MOVE C,[-NUNITS,,1]
MOVM B,DRTM(C)
CAMGE B,TIME
JRST JDB3 ;SOMETHING ELSE DUE
AOBJN C,.-3
MOVE C,SUNIT
MOVE B,UDIR(C)
MOVE A,SUNITL
SOJLE E,DCGBL1 ;RELOADING FOR NEXT BLOCK
JRST JDB3
ILLP: MOVEM D,UGOAL(C) ;LOW PRIORITY POSIT ENTRY
MOVSI A,(SETZ)
IORM A,ULDCH(C)
UTDC: SKIPGE UGOAL(C)
POPJ P, ;UNIT IDLE
SKIPGE DG2(C)
JRST UTDC3
MOVE A,EUPOS(C) ;ESTIMATE UNIT TIME AND UPDATE EUPOS
SKIPG DG2(C) ;SKIP ON EXACT POS KNOWN
SKIPN UDIR(C) ;SKIP ON UNIT RUNNING
JRST UTDC4
MOVE B,TIME
SUBM B,ULCTM(C)
EXCH B,ULCTM(C)
IMUL B,UDIR(C)
ADD A,B ;ACTUAL ESTIMATED POSITION
MOVEM A,EUPOS(C) ;UPDATE EUPOS
UTDC4: SUB A,UGOAL(C)
MOVM B,A
CAIG B,2
JRST UTDC2
ADD A,UDIR(C)
MOVMS Aî
CAMLE A,B
SETZB A,B ;GOING WRONG DIR
UTDC2: CAILE B,200.
MOVEI B,200. ;LIMIT LONGEST DEAD RECKON
ADD B,TIME
MOVEM B,DRTM(C)
POPJ P,
UTDC3: MOVEI B,0 ;NOT KNOWN EXACT POS REQUIRES IMMEDIATE ATTENTION
JRST UTDC2
JDBRK: CONSZ UTS,16 ;CHECK PARITY ERROR, ILLOP, EOT
JRST UTERR
JDBK1: CONSZ UTS,1 ;SKIP ON NO JOB DONE
CONSZ DC,7
JRST POPRET ;NO ERRS + HAS DC CHNL, GO AWAY
SKIPL SMODE
JRST JDDTA ;DATA MODE
JUMPE C,JDB3 ;POSITIONING, JUMP ON NO UNIT SELECTED
MOVE A,UDIR(C)
ADDM A,EUPOS(C)
MOVE A,TIME
MOVEM A,ULCTM(C)
PUSHJ P,UTDC ;COMPUTE DELAY
JDB3: CONO DC,0
HRLOI B,177777
MOVEM B,UTTM2
SETOM UTTM3 ;UNIT MOST URGENT
CLEARM UTTM1 ;UNIT COULD START
SETOM UTTM4 ;TAPE TO START FLAPPING
SETOM UTTM5 ;TAPE TO STOP FLAPPED
MOVE C,[-NUNITS,,1]
JDBRK7: SKIPGE B,UFLAPF(C)
JRST JDF1 ;FLAPPING OP
JDF2: SKIPL ULDCH(C) ;SKIP ON LOW PRIOR POSIT
SKIPGE UGOAL(C)
JRST JDB6 ;UNIT FREE
JDF2A: SKIPGE DG2(C)
SKIPN UDIR(C)
JRST JDS1
MOVEM C,UTTM1 ;UNIT IS RUNNING BLIND (OR NOT RUNNING)
JRST JDBRK6
JDS1: SKIPE UDIR(C)
JRST JDBRK4
SKIPN UTTM1
HRRZM C,UTTM1
JRST JDBRK6
JDBRK4: SKIPN UDIR(C)
JRST ULLP ;TAPE MAY NOT BE RUNNING IF IDLE
MOVE B,DRTM(C)
SUB B,TIME
MOVE E,B
SUB E,UTTM2
JUMPL B,JDCV1 ;ALREADY OVERDUE
MOVM D,E
CAIG B,20. ;CONFLICT MORE THAN 20 BLKS AWAY
CAIL D,20. ;THEY ARE SEPARETED BY 20 BLKS
JRST JDCV1
HRRZS C ;RELIEVE CONFLICT BY STOPPING UNIT DUE LATEST
CAMG B,UTTM2
HRRZ C,UTTM3
JDF5: CAME C,SUNIT
SKIPN SUNIT
JRST JDB4B ;STOP UNIT
MOVEM C,STPUNT
JRST JDB7D ;DESLECT FIRST
JDCV1: JUMPGE E,ULLP
MOVEM B,UTTM2
HRRZM C,UTTM3
ULLP: SKIPL ULDCH(C)
JRST JDBRK6
MOVE B,TIME
SUB B,ULCTM(C)
IMUL B,UDIR(C)
SKIPE DG2(C)
MOVEI B,0
ADD B,EUPOS(C)
SUB B,UGOAL(C)
MOVMS B
CAIGE B,10.
PUSHJ P,ULLP1 ;TERM LOW PRIORITY DIRECTORY POS (COMMIT TO ACTUAL WRITE)
JDBRK6: AOBJN C,JDBRK7
MOVE C,UTTM3 ;MOST PRESSING RUNNING UNIT
MOVE B,UTTM2
CAIGE B,30.
JRST JDB7 ;STAY WITH PRESSING UNIT
SKIPE UTTM1
JRST JDB5 ;START UNIT IF POSSIBLE
SKIPL D,UTTM4
JRST JDF3
JDF6A: SKIPL D,UTTM5
JRST JDF4
CAMG B,[10000000.] ;SKIP ON ALL TAPES IDLE
JRST JDB7
SKIPE SUNIT
JRST JDB7D
SETOM UIDLE ;NO UNIT SELECTED
CONO UTC,0
JRST POPRET
JDF1: MOVE E,UDIRO(C)
AOJE E,JDF1A
TLNE E,100000
JRST JDF2 ;DONT FLAP IF DIR NOT WRITTEN
JDF1A: SKIPGE UGOAL(C)
SKIPGE ULDCH(C)
JRST JDF2 ;FILE DIR WRITE IN PROG
SKIPE UDIR(C)
SKIPG DG2(C)
JRST .+2
JRST JDF3A ;JUST READ IN TAPE POS
TLNN B,100000
HRRZM C,UTTM4 ;UNIT TO START FLAPPING
LDB D,[4100,,B]
TLNN B,100000
JRST JDBRK6
TLNN B,200000 ;ABORT FLAPPING
CAMG D,TIME
HRRZM C,UTTM5 ;UNIT TO STOP FLAPPING
JRST JDBRK6
JDF3: MOVE C,D
MOVE A,UDIRO(C)
AOJE A,JDF3A1
TLNE A,10000
JRST JDF3A2
HRRZ A,ULDCH(C)
LDB Q,[IOCH,,IOBFT(A)]
CAIE Q,NUTIC+NUTOC
JRST 4,.
LDB Q,[IOLO,,IOBFT(A)]
CAIE Q,(C)
JRST 4,.
PUSHJ P,IBRTN
JDF3A2: SETOM UDIRO(C)
SETZM UTASS(C)
JDF3A1: SETOM UDPWF(C)
SKIPGE DG2(C)
JRST JDF6
JDF3A: SETOM DG2(C)
MOVE E,EUPOS(C)
IMULI E,50.
IDIVI E,33.
ADDI E,30.
ADD E,TIME
DPB E,[4100,,UFLAPF(C)]
MOVSI E,100000
IORM E,UFLAPF(C)
SKIPE SUNIT
CAMN C,SUNIT
JRST JDF8
MOVEM C,FLPUNT
JRST JDB7D
JDF8: LSH C,3
CONO UTC,235000+UTCCHN(C)
JRST JDF9
JDF6: SKIPE SUNIT
CAMN C,SUNIT
JRST .+2
JRST JDB7D
SETOB B,UDIR(C)
MOVEM C,SUNIT
DPB C,[30300,,SUNITL]
JRST JDF6B
JDF4: MOVE C,D
CLEARM UFLAPF(C)
CLEARM EUPOS(C)
JRST JDF5
JDB5: HRRZ C,UTTM1
JDB7: EXCH C,SUNIT ;SELECT UNIT IN C
JUMPE C,JDB7A ;NO UNIT SELECTED
CAMN C,SUNIT
JRST JDB7A
PUSHJ P,URLS
JUMPGE E,JDB7E ;OK TO LEAVE IT ALONE, CLEAR SELECTION CYCLE
SKIPN UDIR(C)
JRST JDB7E
JDB4B: HRRZM C,SUNIT ;ENTER UNIT STOPPING CYCLE
DPB C,[30300,,SUNITL]
JDB4A: MOVE A,SUNITL
SKIPG UDIR(C)
TRO A,10000
CONO UTC,205000+UTCCHN(A) ;CLEAR GO BIT
SKIPE DG2(C)
JRST JDB4A1
MOVE B,TIME
SUB B,ULCTM(C)
IMUL B,UDIR(C)
ADDM B,EUPOS(C)
JDB4A1: CLEARM UDIR(C)
HRLOI B,177777
MOVEM B,DRTM(C)
SETOM DG2(C)
JDF9: SETOM USTPF ;UNIT STOPPING CYCLE
JRST POPRET
EBLK
USTPF: 0
STPUNT: 0 ;UNIT TO STOP DUE TO CONFLICT
BBLK
JDB7E: SKIPA A,C
JDB7D: MOVE A,SUNIT
JUMPE A,JDB7D1
SKIPLE DG2(A)
CLEARM DG2(A)
JDB7D1: CLEARM SUNIT ;DESELECT CYCLE
CONI UTC,A
TRZ A,200070
TRO A,5000
CONO UTC,(A)
JRST POPRET
JDB7A: MOVE C,SUNIT
MOVE A,EUPOS(C)
SUB A,UDIR(C)
SUB A,UDIR(C)
MOVEI B,1
CAML A,UGOAL(C)
MOVNI B,1
DPB C,[30300,,SUNITL]
MOVE D,UDIR(C)
MOVEM B,UDIR(C)
CAME D,B
JRST JDS4 ;CHANGING DIR (OR STARTING), ALLOW RELAY DLYS
JDBK3A: MOVE E,DRTM(C)
SUB E,TIME
JDDT8: MOVE A,SUNITL
IFN IMXP,[
SKIPL IMPXF
SUBI E,2
]
SKIPGE E
MOVEI E,0
SKIPL D,DG2(C)
CAIG E,2
JRST JDB3B
CAIGE E,20
JUMPE D,JDB3B ;GETTING CLOSE READ BLOCK NO
JDB3A:
DCGBL2: TRO A,JDENB
JDB8A: XCT UTST(B)
JRST POPRET
JDB3B:
DCGBL1: XCT UTST(B)
MOVE C,[JSR TAPE]
MOVEM C,DCMLOC
MOVEM C,DCMLOC+1
MOVE C,[JRST UTP1]
MOVEM C,UTP1
CONO DC,4010+UTCCHN
JRST POPRET
CONO UTC,330200+UTCCHN(A)
UTST: CONO UTC,5000+UTCCHN(A)
CONO UTC,320200+UTCCHN(A)
JDS4: JUMPN D,UTER3
MOVE D,TIME
MOVEM D,ULCTM(C)
JDF6B: SETOM USTSW ;STARTING OUT
UTER3: MOVE A,SUNITL ;PICK UP UNIT SELECT FIELD OF CONO
TRO A,6000 ;SET FOR MAXIMUM DELAY
JRST JDB8A
URLS: SKIPE E,UDIR(C) ;SKIPN ON UNIT NOT RUNNING
SKIPG E,DG2(C) ;RELEASE UNIT IN C E HAS PREV STATE OF DG2
POPJ P,
JRST UTDC
};IFE NEWDTP