1
0
mirror of https://github.com/PDP-10/its.git synced 2026-03-05 11:04:02 +00:00
Files
PDP-10.its/src/syseng/its.138
Lars Brinkhoff 61925004dd Add ITS 138 source code and assemble it with MIDAS 73.
This is a earliest known preserved version of ITS from 1967.  It ran
on the AI lab PDP-6, with five teletypes and four GE consoles.

The source code was reconstructed from Gerald Sussman's paper listing.
2023-12-20 20:17:50 +01:00

5202 lines
83 KiB
Plaintext
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.
TITLE ITS 1.0 3/19/67
MOBY==1
;AC DEFS
A=1
B=2
C=3
D=4
E=5
TT=6
I=7
Q=10
J=11
R=12
P=15 ;DO NOT CHANGE!
T=16 ;"
U=17 ;"
IOBIT==1 ;IOBIT IN MAP
TTYIF==1 ;RIGHT HALF BITS IN PIRQC
BCNTRZI==2 ;^Z TYPED
BPIPI==4 ;BAD LOC 42
AROIF==10 ;AROV
BILLOP==40 ;ILLEGAL INSTRUCTION
BIOADC==20000 ;MEMORY PROTECTION VIOLATION
BIOCER==400 ;CHANNEL ERROR
VALRTF==200 ;VALUE RETURN
ILLUAD==1000 ;USER DOES NOT HAVE THAT MUCH CORE
BRKF==2000 ;BREAKPOINT FLAG
BUTFUL==4000 ;UTAPE FULL
BILM==10000 ;NON-EX MEM
;10000 NON EX MEM
;200000 PDL OV
;20000 MPV
BADBTS=BIOADC+BCNTRZI+BPIPI+BIOCER+BILLOP+BILM+VALRTF+BRKF
TTYIMI==1 ;IMAGE INPUT ;BITS IN TTYSTS
TTYDDT==2 ;"DDT" MODE
TTYIMO==4 ;IMAGE OUTPUT
;BITS IN RH MSKST
BTINTE==1 ;ENABLE TTY INT
CLKON==2001 ;ABSOLUTE
CLKOFF==1001
APRCHN==7 ;DO NOT CHANGE
BADPC==5037
LSRMOD==10000
UUOMIN==40000,,
UUOMAX==46000,,
AUUO=UUOMAX ;USE TO SAVE CONDS ON ILLOP
IFE MOBY,MX1KB==12. ;MAX SYS 1K BLOCKS
IFN MOBY,MX1KB==250.
IFE MOBY,MXIOB==30. ;MAX DYN ALLOC ALLOC IO BUFFERS
IFN MOBY,MXIOB==400
SIOMT==30 ;MAX SIZE TRANSLATION TABLE
SIOML==8 ;LENGTH OF ENTRY IN TRANSLATION TABLE
LUPDL==30 ;LENGTH USER PDL
CPDLL==20 ;LENGTH CLOCK CHANNEL PDL
DCCHN==1 ;DC CHANNEL
DCCHNA==200_<-DCCHN>
UTCCHN==3 ;UTC CHANNEL
GETYOC==4 ;GE TYPOUT (DATAPHONE)
LPTCHN==5 ;LINE PRINTER CHANNEL
TTYCHN==5 ;TTY CHANNEL
DISCHN==6
SDCHN==5
GETYIC==5 ;GE TYPEIN DEV 70
UTCON==2001\200_<-UTCCHN>\200_<-TTYCHN>\200_<-GETYOC>\200_<-DISCHN>\200_<-SDCHN>
UTCOFF==1001\200_<-UTCCHN>\200_<-TTYCHN>\200_<-GETYOC>\200_<-DISCHN>\200_<-SDCHN>
CUINT==5000+UTCCHN
SCLKI==15. ;SLOW CLOCK PER REG CLOCK
MXOPT==8. ;SLOW CLOCK MAX UT OP CAN TAKE
NINFP==8. ;MAX. NO. OF INF. PROCED. / PROCED.
METOF=6 ;OFFSET BETWEEN CONTENTS OF MEMTOP AND HIGHEST ACT
GTYI=70 ;DEVICE FOR GE TYPEIN
GTYO=750 ;DEVICE FOR GE TYPOUT
VID=754 ;VIDISUCKER
DEFINE CONC A,B
A!B!TERMIN
DEFINE SUBTTL A/
TERMIN
GO:
LOC 41
JSR UUOH
LOC 40+2*APRCHN
JSR CLKBRK
LOC 40+2*TTYCHN
JSR TTYBRK
LOC 40+2*UTCCHN
JSR UTCBRK
LOC 40+2*DISCHN
BLKO DIS,DBLKOP
JSR DRECYC
LOC 40+2*GETYOC
JSR GTYOBK
JSR GTYOBK
LOC GO
SUBTTL TSS INITIALIZATION
CONO 633550
CONO PI,120000+11577
SETOM DISUSR
SETOM DISOFF
CONO DIS,100
MOVEI A,4
BAR: CONO TTY,@TTYLT(A)
DATAI TTY,
CONO TTY,3600+TTYCHN
SOJGE A,BAR
CLEARM USRHI
CLEARB U,USER
MOVE P,USRPDL(U)
PUSHJ P,GEKI ;INITIALIZE GE CONSOLES
MOVNI T,1
PUSHJ P,USTRA
JRST .-1
MOVEI B,SYSB-1
PUSHJ P,ACORE
JFCL
CLEARM USTP
CONO PI,UTCON+200
CONO 3000+APRCHN
JRST SCOR
PAT: BLOCK 200
SUBTTL PROCESSOR BREAK ROUTINES
CLKBRK: 0
CONSO 1000
JRST CLKB1 ;LOSSAGE
SKIPL CDSOFF
SKIPGE DISOFF
JRST DSTPD
AOSG DISON
JRST DSTRT
DSTPD: CONO 1000+APRCHN
AOSG CLKFL1
JRST 12,@CLKBRK ;EVERY 1/30 SEC
SETOM CLKFL1
AOS TIME
SOSLE CUQUAN ;CHECK QUANTUM
JRST 12,@CLKBRK
EXCH P,CPDLP
PUSH P,T
PUSH P,U
MOVE T,SLCLK
CAMGE T,TIME
JRST SSLCK ;SERVICE SLOW CLOCK
CLKSR1: MOVE U,USER
CLKSR: MOVE T,CLKBRK
SKIPL U
MOVEM T,UPC(U)
PUSHJ P,SEARCH ;SCHEDULE NEW USER
CLB1B: CAMN U,USER
JRST CLKB5A
SKIPGE U
CLKSC1: HRROI U,ECPDL-AC16S
POP P,AC17S(U)
POP P,AC16S(U)
EXCH P,CPDLP
JSR SWITCH ;SWAP USERS
MOVEM T,CLKBRK
MOVE T,AC16S(U)
MOVE U,AC17S(U)
JRST 12,@CLKBRK ;GO AWAY
DSTRT: MOVEM A,DISA
MOVE A,DISPTR
MOVEM A,DBLKOP
CONO DIS,100\SDCHN_3\DISCHN
MOVE A,DISA
JRST DSTPD
CLKB5A: SKIPE SCRFG1
JRST CLKSC1
MOVE T,UPC(U)
SKIPL U
MOVEM T,CLKBRK
CLKB5: POP P,U
POP P,T
CLKB3: EXCH P,CPDLP
JRST 12,@CLKBRK ;EXIT WHEN NO SWAP OCCURS
CLKB1: CONSZ PI,100000
JRST PARBRK
EXCH P,CPDLP ;NOT A CLOCK BREAK
PUSH P,T
PUSH P,U
MOVE U,USER
MOVE T,CLKBRK
CONSZ 20
CONSO 10
JRST CLB1A ;NOT AROV
TLZ T,400000
MOVEM T,CLKBRK
SKIPN PICLR(U)
JRST CLKB5
MOVEI T,AROIF
IORM T,PIRQC(U) ;SET USER AROV INT
JRST CLKSR
PARBRK: CONO PI,120000
AOS PARERR
JRST 12,@CLKBRK
PARERR: 0
CLB1A: CONSO 230000
JRST CLKB5 ;NOT PROCESSOR INT
TLNN T,LSRMOD
JRST 4,. ;ERROR IN EXEC MODE-SYSTEM DEAD!
MOVEM T,UPC(U)
CONI 1(P)
MOVEI T,230000
ANDM T,1(P)
CONO 430000+APRCHN
MOVEI T,BADBTS
IOR T,MSKST(U)
AND T,1(P)
JUMPE T,CLKB5
IORM T,PIRQC(U) ;BLAME IT ON THE USER
JRST CLKSR1
;SLOW CLOCK SERVICE ROUTINE
SSLCK: ADDI T,SCLKI
MOVEM T,SLCLK
CONSO UTC,4000 ;TIME FLG ENB
SKIPGE UIDLE
JRST SSLCK1
MOVE T,TIME
SUB T,LUTOTM
CAIGE T,MXOPT*SCLKI
JRST SSLCK1
SETOM UTHERR
CONO UTC,CUINT
SSLCK1: AOSN UIDLE
CONO UTC,CUINT
JRST CLKSR1
SUBTTL USER SCHEDULER
SEARCH: CLEARM SCRFG1
CLEARM SRCS
SETOM U0
SKIPL T,UTTYST
JRST USTART ;NEW USER START HIM UP
USTSCH: SKIPN USRHI
POPJ P,
SKIPGE U
MOVEI U,0
SEARL: ADDI U,LUBLK ;FIND NEXT USER COMING OUT OF I-O WAIT
CAML U,USRHI ;OR, IF NONE, NEXT USER
MOVEI U,0
SKIPE UNAME(U)
SKIPE USTP(U)
JRST SEARW
SEARLP: SKIPN PIRQC(U)
JRST SEAR2
MOVEI T,BADBTS ;INTERRUPT USER IF REQUESTED
SKIPE PICLR(U)
IOR T,MSKST(U)
AND T,PIRQC(U)
JUMPE T,SEAR2 ;NOT ENABLED & NOT BAD
CAMN U,USER
PUSHJ P,SBRK1 ;WANT TO INT CURRENT LOSER; STORE MACHINE CONDITIONS
PUSHJ P,PCLSR
JRST SEARC ;CAN'T INTERRUPT NOW
MOVE T,PIRQC(U)
ANDCM T,MSKST(U)
ANDI T,BADBTS
SKIPE PICLR(U)
JUMPE T,SBRK69
PUSHJ P,INTSUP ;USER LOSES TOO BADLY, INTERRUPT SUP. PROCEDURE
JRST SEARW
SBRK69: CLEARM PICLR(U) ;INTERRUPT LOSER
CONO PI,UTCOFF-<200_-<APRCHN>>
PUSH P,PIRQC(U)
CLEARM PIRQC(U)
CONO PI,UTCON-<200_-<APRCHN>>
MOVE T,UPR(U)
HRRZ T,42(T)
CAIL T,20
CAML T,MEMTOP(U)
JRST SERR
TLO T,LSRMOD
PUSH P,T
ADD T,UPR(U)
PUSH T,UPC(U)
AOS (P)
AOS (P)
POP P,UPC(U)
POP P,-1(T)
URUN:SEARE: AOSN SCRFLG ;RESTORE CURRENT USER TO ACTUAL MACHINE IF NECESSARY
PUSHJ P,SBRK2
SEARTN: JUMPGE U,SEARX1
AOSN SRCS
JRST SEARCH
SEARX1: SKIPL U
CLEARM FLSINS(U)
EXCH U,USER
POPJ P, ;RUN LOSER
SEAR2: SKIPN FLSINS(U)
JRST SEARC
MOVE T,EPDL2(U)
XCT FLSINS(U) ;TEST I-O WAIT INSTRUCTION
JRST SEARW ;NO SKIP UNRUNABLE 1 HIGH PRIOR 2 LOW
JRST SEARE
SEARC: SKIPGE U0 ;SKIPPED INTO FROM ABOVE
MOVEM U,U0
SEARW: CAMN U,USER
JRST SEARW1
SKIPGE USER
SKIPE U
JRST SEARL
SEARW1: MOVE U,U0
JRST SEARE
SERR: POP P,PIRQC(U) ;BAD INTERRUPT LOCATION
MOVEI T,BPIPI
IORM T,PIRQC(U)
JRST SEARLP
SBRK1: PUSH P,USER
SETOM USER
JSR SWITCH
POP P,U
MOVEM U,USER
SETOM SCRFLG
POPJ P,
SBRK2: PUSH P,U
MOVEM P,PSAVE
MOVNI U,1
JSR SWITCH
MOVE P,PSAVE
POP P,U
POPJ P,
;PUT PC IN LOSER MODE
PCLSR: MOVE T,SUEXIT(U)
SKIPE MEMTOP(U) ;NO CORE (IN CORE ASSIGN ROUTINE
CAME T,[JRST 2,@UUOH
POPJ P, ;WILL HAPPEN SOON
MOVE T,UPC(U)
TLNE T,LSRMOD
JRST POPJ1 ;HAPPY
SKIPE FLSINS(U)
JUMPN U,PCLSR1 ;BACK UP TO UUO
PCLSR4: MOVE T,[JRST ONEFLS ;MUNG EXIT OF UUO, COME BACK LATER
MOVEM T,SUEXIT(U)
POPJ P,
PCLSR1: HLRZ T,FLSINS(U)
CAIN T,(JRST)
JRST PCLSR4 ;EXEC FLUSH, RUN USER TO CLEAR, BUT MUNG EXIT
SOS T,SUUOH(U)
MOVEM T,UPC(U)
CLEARM FLSINS(U)
MOVEI T,AC0S(U)
HRL T,UPR(U)
PCLSR3: BLT T,AC17S(U)
SETOM SCRFG1
JRST POPJ1 ;BACK UP TO UUO, RESTORING ACS
INTSUP: PUSH P,U
SKIPGE U,SUPPRO(U)
JRST URSTRT
HLLZ T,U
IORM T,PIRQC(U)
POP P,U
MOVSI T,BUSRC
IORM T,USTP(U)
SETOM SRCS
POPJ P,
SUBTTL USER SWAP
SWITCH: 0
JUMPL U,SWT1
MOVEI T,AC0S(U)
BLT T,AC15S(U)
MOVSI T,UEXIT
HRRI T,UUO(U)
BLT T,AC17P-UEXIT+UUO(U)
MOVE T,40
MOVEM T,SV40(U)
SWT1: SKIPGE U,USER
JRST SWT2
MOVE T,SV40(U)
MOVEM T,40
MOVSI T,UUO(U)
HRRI T,UEXIT
BLT T,AC17P
DATAO UPR(U)
CONO @APRC(U)
MOVE T,UQUAN(U)
MOVEM T,CUQUAN
MOVSI T,AC0S(U)
BLT T,T-1
MOVE T,UPC(U)
JRST @SWITCH
SWT2: MOVEI T,NULJOB
JRST @SWITCH
;SUBTTL USER START ROUTINES
USTART: PUSH P,U
PUSHJ P,USTRA
JRST USTSC1
SUB P,[1,,1
MOVE T,[1,,(SIXBIT /HTN/)
MOVEM T,JNAME(U)
MOVEI T,USTCD
MOVEM T,UPC(U)
CLEARM USTP(U)
SETOM UTTYST
JRST SEARTN
USTSC1: POP P,U
JRST USTSCH
USTRA: MOVEI U,0 ;-1(P) MUST BE U
USTR3: CAML U,USRHI
JRST USTR1 ;ASSIGN MORE CORE TO USER STORAGE
SKIPN UNAME(U)
JRST USTR2
ADDI U,LUBLK
JRST USTR3
MORCOR: MOVE U,-2(P)
SUB P,[1,,1]
SETOM SUPCOR
POPJ P,
USTR1: MOVEI U,LUBLK
ADD U,USRHI
PUSH P,T
MOVE T,SYSL
CAIG T,USRSTG(U)
JRST MORCOR
POP P,T
EXCH U,USRHI
USTR2: PUSHJ P,USTR4
MOVEI T,SIOCHN(U)
MOVEM T,SIOCP(U)
CLEARM IOCHNM(U)
HRLI T,IOCHNM(U)
HRRI T,IOCHNM+1(U)
BLT T,IOCHNM+17(U)
JRST POPJ1
USTR4: SETOM USTP(U) ;TTY NO IN T
SETOM UNAME (U)
MOVEM T,TTYTBL(U)
SKIPL T
HRRZM U,TTYSTS(T)
MOVSI T,BUSRC
MOVEM T,USTP(U)
MOVSI T,LSRMOD
MOVEM T,UPC(U)
HRLI T,-LUPDL
HRRI T,UPDL-1(U)
MOVEM T,USRPDL(U)
CLEARM UPR(U)
CLEARM MSKST(U)
MOVE T,[JRST 2,@UUOH
MOVEM T,SUEXIT(U)
MOVEI T,APRCHN+40
MOVEM T,APRC(U)
CLEARM PIRQC(U)
SETOM SUPPRO(U)
SETOM PICLR(U)
CLEARM FLSINS(U)
CLEARM MEMTOP(U)
CLEARM RMEMT(U)
MOVSI T,(MOVEM U,)
MOVEM T,SAC17P(U)
POPJ P,
COREX: LSH TT,-10.
CORE 2(TT)
JRST .-1
LSH TT,10.
MOVEI J,2000-METOF-2(TT)
JRST (P)
UADRS2: LSH A,10.
UADRS1: HRRM A,UPR(U)
UADRS: MOVEI B,14(A) ;SET PNTRS FOR USER U USER MEM STARTING AT C(A)
MOVEM B,AC14P(U)
AOS B
MOVEM B,AC15P(U)
AOS B
MOVEM B,AC16P(U)
AOS B
CAMN U,USER
HRRM B,AC17P
HRRM B,SAC17P(U)
ADDI B,21
MOVEM B,40P(U)
AOS B
MOVEM B,41P(U)
CAME U,DISUSR
POPJ P,
PUSH P,A
SUB A,DRELOC
ADDM A,DBLKOP
ADDM A,DISPTR
ADDM A,DRELOC
POP P,A
POPJ P,
0 ;MAKE FLS INS ZERO
USTCD3: PUSHJ P,UFLS
USTCD: MOVE U,USER ;CODE TO LOAD USER HACKTRN
MOVE P,USRPDL(U)
MOVEI B,1
PUSHJ P,ACORE
JRST USTCD3
MOVEI J,2000-METOF-2
MOVE A,[(6+SIXBIT /UT2/
MOVSI B,(SIXBIT /@/
MOVE C,[SIXBIT /HACTRN/
OPEN 2,A
JRST 4,.
USTCD1: CAMN B,[JRST 1
TLZ C,400000 ;BIT SET FROM SIXBIT HACTRN
HRROI A,B
IOT 2,A
JUMPL C,USTCD1
JUMPGE B,USTCD2
MOVE D,B
HRRZ TT,B
HLRO I,B
SUB TT,I
CAML TT,J
JSP P,COREX ;PDL CLOBBERED BY UUO
IOT 2,B
HRRZ B,UPR(U)
ADD B,D
ROT D,1
ADD D,(B)
AOBJN B,.-2
HRROI A,B
IOT 2,A
CAME B,D
JRST USTCD
JRST USTCD1
USTCDR: MOVE U,USER
MOVE P,USRPDL(U)
PUSHJ P,IODCL
JRST USTCD
IODCL: PUSHJ P,ADFLUSH
MOVEI R,IOCHNM(U)
IODCL1: PUSH P,R
PUSHJ P,ACLOSE
POP P,R
CAIGE R,IOCHNM+17(U)
AOJA R,IODCL1
IODCL2: MOVEI R,IOCHNM+1(U)
PUSHJ P,ACLOSE
MOVE T,SIOCP(U)
TLNN T,-1
POPJ P,
POP T,(R)
MOVEM T,SIOCP(U)
JRST IODCL2
URSTRT: POP P,U
POP P,EPDL(U)
MOVE T,TTYTBL(U)
PUSH P,UPR(U)
PUSH P,MEMTOP(U)
PUSH P,SAC17P(U)
PUSH P,RMEMT(U)
PUSHJ P,USTR4
POP P,RMEMT(U)
POP P,SAC17P(U)
POP P,MEMTOP(U)
POP P,UPR(U)
MOVE T,[1,,(SIXBIT /HTN/)
MOVEM T,JNAME(U)
MOVEI T,USTCDR
MOVEM T,UPC(U)
CLEARM USTP(U)
JRST URUN
USTCD2: CLOSE 2,
JRST 1,(B)
;SUBTTL USER UUO WAIT ROUTINE
UFLS: CONO PI,CLKOFF ;DOES NOT WORK FOR XCT T
EXCH U,USER
MOVEM T,EPDL2(U) ;SAVE C(U)
MOVE T,USER ;AND C(T) FOR FLSINS
MOVEM T,EPDL1(U)
MOVEM U,USER
POP P,T ;WORK FOR INST (P)
MOVEM T,UPC(U)
SKIPA T,-2(T)
UFL3: MOVE T,(T)
HRRI T,@T ;CALCULATE E
TLZ T,37
MOVEM T,FLSINS(U)
TLC T,(XCT)
TLNN T,777740
JRST UFL3 ;WORK FOR XCT
PUSHJ P,SEARCH ;FIND NEW USER
CAMN U,USER
JRST UFL1 ;SAME USER
MOVE T,EPDL2(U)
MOVEM T,AC16S(U)
MOVE T,EPDL1(U)
MOVEM T,AC17S(U)
UFL2: JSR SWITCH ;SWAP USERS
JUMPL U,NULJOB
XORI T,UFL4
TDNN T,[LSRMOD,.-1]
JRST .+3 ;LOSE LOSE
XORI T,UFL4
MOVEM T,URSTR
MOVE T,AC16S(U)
MOVE U,AC17S(U)
UFL4A: CONO PI,CLKON ;CAUSE OF LOSE LOSE
UFL4: JRST 2,@URSTR
NULJOB: AOSN UIDLE
CONO UTC,CUINT
CONO PI,CLKON
MOVEI
MOVSI 1,(AOJA)
AOJA 1,1
UFL1: SKIPE SCRFG1
JRST UFL6
MOVE T,UPC(U)
MOVEM T,URSTR
MOVE T,EPDL2(U)
JRST UFL4A
UFL6: MOVNI U,1
JRST UFL2
LWAIT1: CONO PI,UTCON ;WAIT FOR INS W UTCCHN OFF
LWAIT: XCT @(P)
PUSHJ P,UFLS
CONO PI,UTCOFF
XCT @(P)
JRST LWAIT1
JRST POPJ1
SWAIT: MOVEI T,(@) ;WAIT FOR @ NEXT LOC TO BE NEG
HRLM T,(P)
SKIPL @(P)
PUSHJ P,UFLS
AOSE @(P)
JRST SWAIT 2
JRST POPJ1
SUBTTL UUO PROCESSOR
IOT=UUOMIN
OPEN=UUOMIN+1_27.
OPER=UUOMIN+2_27.
CALL=UUOMIN+3_27.
USET=UUOMIN+4_27.
BREAK=UUOMIN+5_27.
DISMIS=CALL 1,
TRAND=CALL 2,
TRANAD=CALL 3,
VALRET=CALL 4,
UTRAN=CALL 5,
CORE=CALL 6,
TRNDL=CALL 7,
DSTART=CALL 10,
FDELE=CALL 11,
ITYI=OPER 1
LISTEN=OPER 2
SLEEP=OPER 3
SETMSK=OPER 4
GETMSK=OPER 5
LOGIN=OPER 6
CLOSE=OPER 7
UFLUSH=OPER 10
ATTY=OPER 11
GBLTTY=OPER 12
IPUSH=OPER 13
IPOP=OPER 14
DFLUSH=OPER 15
DSTOP=OPER 16
RDTIME=OPER 17
RDSW=OPER 20
LPEN=OPER 21
UDISMT=OPER 22
.RUPC==0
.RVAL==1
.RILOOK==2
.ROLOOK==3
.RUNAME==4
.RJNAME==5
.RMSK==6
.RUSTP==7
.RPIRQC==10
.RINTB==11
.RMEMT==12
.RSV40==13
.SUPC==400000
.SVAL==400001
.SILOOK==400002
.SOLOOK==400003
.SMSK==400006
.SUSTP==400007
.SPIRQC==400010
USRUUO: MOVEM T,@40P(U) ;USER INTERPRETED UUO
HRRZ T,@41P(U)
CAIL T,20
CAML T,MEMTOP(U)
JRST ILLOP
HRLI U,1(T)
ADD T,UPR(U)
HRLI T,UUOH
BLT T,0
HLRM U,UUOH
UUOEX: MOVE T,@AC16P(U)
MOVE U,@AC17P
UEXIT: JRST 2,@UUOH
URSTR: 0
UUOH: 0
AC17P: MOVEM U,.
MOVE U,USER
MOVEM T,@AC16P(U)
SKIPL T,40
CAML T,[100000,,
JRST ILLOP
CAML T,[UUOMIN
CAML T,[UUOMAX
JRST USRUUO
ILLOP1: MOVEM P,@AC15P(U)
HRRZ P,UPR(U)
BLT P,@AC14P(U)
MOVE P,USRPDL(U)
LSH T,-27.
XCT UUODSP-UUOMIN_-27.(T)
URET: HRLZ U,UPR(U)
BLT U,U
JRST UEXIT
ONEFLS: CONO PI,CLKOFF
MOVE U,USER
HRRZ T,UPR(U)
BLT T,@AC15P(U)
MOVE T,[JRST 2,@UUOH
MOVEM T,UEXIT
MOVE P,USRPDL(U)
ILLOP3: AOS UUOH
UUOE1: CONO PI,CLKOFF
SOS T,UUOH
MOVEM T,UPC(U)
PUSHJ P,SEARCH
CAMN U,USER
JRST UFL7
UFL8: HRLZ P,UPR(U)
BLT P,P
MOVE T,@AC16P(U)
MOVEM T,AC16S(U)
MOVE T,@AC17P
MOVEM T,AC17S(U)
JRST UFL2
UFL7: SKIPN SCRFG1
JRST UFL8
MOVNI U,1
JRST UFL2
ILUUO: MOVEI T,BILLOP
UUOERR: IORM T,PIRQC(U)
MOVE T,40
MOVEM T,@40P(U)
JRST UUOE1
IOADC: MOVEI T,BIOADC
JRST UUOERR
;CODE TO BE FLUSHED
NSD: JRST URET
LCDIY: JRST URET
IOCERR: MOVEI T,BIOCER
IORM T,PIRQC(U)
JRST UUOE1
NCA: JRST URET
FILDF: JRST URET
UTPFUL: JRST 4,.
;UUO DISPATCH
UUODSP: PUSHJ P,AIOT
PUSHJ P,AOPEN
PUSHJ P,AOPER
PUSHJ P,ACALL
PUSHJ P,AUSET ;INSERT ADDED UUO'S HERE
PUSHJ P,ABREAK
PUSHJ P,ILLOP2
ILLOP: MOVE T,UUOH
TLNN T,LSRMOD
JRST 4,.
MOVSI T,(AUUO)
JRST ILLOP1
ILLOP2: MOVEI T,BILLOP
ILLOP4: IORM T,PIRQC(U)
JRST ILLOP3
; IOT DISPATCH
AIOT: LDB R,[270400,,40
ADDI R,IOCHNM(U)
HLRZ A,(R)
HRRZ B,(R)
HRRZ C,40
CAML C,RMEMT(U)
JRST IOADC
ADDI C,@UPR(U)
JRST @IOTTB(B)
;USET DISPATCH
AUSET: HRRZ C,40
CAML C,RMEMT(U)
JRST IOADC
ADDI C,@UPR(U)
LDB R,[270400,,40
ADDI R,IOCHNM(U)
HLRZ A,(R)
HRRZ B,(R)
SKIPL CLSTB(B)
JRST IOCERR ;NO USER IS OPENED ON THIS CHANNEL
HRRZ B,(C)
CAML B,RMEMT(U)
JRST IOADC
ADDI B,@UPR(U)
HLRZ Q,(C)
TRZE Q,400000
JRST OUTLOC
CAIL Q,MXVAL
JRST ILUUO
XCT USETL(Q)
MOVEM D,(B)
POPJ P,
USETL: MOVE D,UPC(A)
MOVE D,VALUE(A)
MOVE D,UILOOK(A)
MOVE D,UOLOOK(A)
MOVE D,UNAME(A)
MOVE D,JNAME(A)
MOVE D,MSKST(A)
MOVE D,USTP(A)
MOVE D,PIRQC(A)
HLLZ D,SUPPRO(A)
MOVE D,RMEMT(A)
MOVE D,SV40(A)
MXVAL==.-USETL
OUTLOC: CAIL Q,MXVAL
JRST ILUUO
MOVE D,(B)
XCT USETL1(Q)
POPJ P,
USETL1: PUSHJ P,UPCSET
MOVEM D,VALUE(A)
MOVEM D,UILOOK(A)
MOVEM D,UOLOOK(A)
JRST ILUUO
JRST ILUUO
MOVEM D,MSKST(A)
PUSHJ P,USTOP
MOVEM D,PIRQC(A)
JRST ILUUO
JRST ILUUO
JRST ILUUO
USTOP: EXCH U,A
CONO PI,CLKOFF
SKIPN USTP(U)
PUSHJ P,PCCK
DPB D,[410100,,USTP(U) ;BUSRC
CONO PI,CLKON
EXCH U,A
POPJ P,
UPCSET: EXCH U,A
PUSHJ P,PCCK
TLO D,LSRMOD
TLZ D,BADPC
MOVEM D,UPC(U)
CONO PI,CLKON
EXCH U,A
POPJ P,
AFDELE: CAML B,MEMTOP(U)
JRST IOADC
PUSH P,(C)
MOVSI T,(SETZ)
IORM T,(P)
JRST AFDEL1
;SUBTTL OPEN SET UP AND DISPATCH
;3.1 = 0 => INPUT =1 OUTPUT
;3.2=0 => UNITS =1 BLOCK
;3.3=0 => ASCII =1 IMAGE
;4.9 = DELETE OR RENAME
AOPEN: LDB R,[2700400,,40 ;OPEN UUO
HRRZ C,40
CAML C,MEMTOP(U)
JRST IOADC
ADDI C,@UPR(U)
ADDI R,IOCHNM(U) ;C E(40) T AC(40)
HLRZ A,(R) ;OPEN FORMAT RH = DEV NAME
HRRZ B,(R) ;2ND IN 3RD WDS FILE NAME
PUSH P,R
PUSH P,C
PUSHJ P,@CLSTB(B) ;CLOSE PREV
POP P,C
POP P,R
CLEARM (R)
PUSH P,(C) ;GET DEV AND FILE NAMES
AFDEL1: PUSH P,1(C)
PUSH P,2(C)
PUSHJ P,TRAN ;IO MAP
JRST URET
MOVE A,-2(P)
MOVSI B,-NDEVS
HRRZ C,DEVTAB(B)
CAIE C,(A)
AOBJN B,.-2
JUMPG B,OPEN1
MOVSI C,400000
TLNE A,1
MOVSI C,200000
TDNN C,DEVTAB(B)
JRST LCDIY ;IO DEVICE DOSN'T GO THAT WAY
HLRZ C,DEVTAB(B)
OPEN2: ANDI C,177777
POP P,B
POP P,A
EXCH C,(P)
HLRZ D,C
ROT D,-1 ;A,B FILE NAME C MAPPED DEV +OPTION SEL
TRNE D,200000
TDZ D,[400000,,7] ;MAKE DELETE OR RENAME LOOK LIKE OPEN FOR READ
POPJ P, ;IF DELE OR RENAME, 4.8 OF D =1
OPEN1: LDB E,[61400,,A ;CHECK FOR NUMBERED DEV
LDB I,[600,,A
CAIL I,'0
CAILE I,'9
JRST NSD ;NO SUCH DEVICE
SUBI I,'0
MOVSI C,-NDV1
HRRZ B,DVT1(C)
CAIE B,(E)
AOBJN C,.-2
JUMPG C,NSD
HLRZ C,DVT1(C)
JRST OPEN2
CLSTB: CPOPJ ;SYS CLOSETAB
LPTCLS
TYICLS
TYOCLS
REPEAT 4,CPOPJ
REPEAT 4,SETZ CPOPJ
UTICL
UTOCLR
UTICL
UTOCL
UTICL
UTOCL
VIDCLS
IOTTB: IOCERR
LPTDN==.-IOTTB
PILPT1
TYIDN==.-IOTTB
TYI
TYODN==.-IOTTB
TYO
NLIDN==.-IOTTB
NULI
NLBIDN==.-IOTTB
NULBI
NLODN==.-IOTTB
NULOD
NLBDN==.-IOTTB
NULBOD
UWIDN==.-IOTTB
UWI
UWODN==.-IOTTB
UWO
UBODN==.-IOTTB
UBO
UBIDN==.-IOTTB
UBI
DNUACII==.-IOTTB
UASCII
DNUACCO==.-IOTTB
UASCCO
DNUBKI==.-IOTTB
UBLKI
DNUBKO==.-IOTTB
UBLKO
DNUDTI==.-IOTTB
UDATAI
DNUDTO==.-IOTTB
UDATAO
VIDOPN==.-IOTTB
VIDIOT
;SUBTTL IO TRANSLATOR
;TRAN1: UNAME
;TRAN2: JNAME
;TRAN3: 4.9 0 RETRANSLATE 1 ATOM 3.1 0 INPUT 1 OUTPUT,,DEV
;TRAN4: NAME1
;TRAN5: NAME2
;TRAN6: DEV
;TRAN7: NAME 1
;TRAN8: NAME 2
TRAN: MOVEI C,10
TRAN0: MOVE I,SIOMTU
ITRN3: SKIPN A,TRAN1
JRST ITRN1
CAME A,[SIXBIT /*/]
CAMN A,UNAME(U)
SKIPN A,TRAN2(I)
JRST ITRN1
CAME A,JNAME(U)
CAMN A,[SIXBIT /*/]
JRST ITRN2
ITRN1: AOBJN I,ITRN3
JRST POPJ1
ITRN2: MOVE B,TRAN4(I)
CAME B,[SIXBIT /*/]
CAMN B,-2(P)
SKIPN B,TRAN5(I)
JRST ITRN1
CAME A,[SIXBIT /*/]
CAMN A,-1(P)
SKIPN A,TRAN3(I)
JRST ITRN1
HRRZ B,A
XOR A,-3(P)
CAIN B,(SIXBIT /*/)
JRST ITRN5
TDNE A,[IOBIT,,-1]
JRST ITRN1
ITRN4: HRRZ A,TRAN6(I)
CAIE A,(SIXBIT /*/)
HRRM A,-3(P)
MOVE A,TRAN7(I)
CAME A,[SIXBIT /*/]
MOVEM A,-2(P)
MOVE A,TRAN8(I)
CAME A,[SIXBIT /*/]
MOVEM A,-1(P)
SKIPGE TRAN3(I)
JRST POPJ1
SOJG C,TRAN0
POPJ P,
ITRN5: TLNE A,IOBIT
JRST ITRN1
JRST ITRN4
DEVTAB: 200000+LPTO,,(SIXBIT /LPT/) ;4.8 OUTPUT 4.9 INPUT
600000+TTYO1,,(SIXBIT /TTY/)
600000+NULO,,(SIXBIT /NUL/)
600000+USRO,,(SIXBIT /USR/)
400000+VIDI,,(SIXBIT /VID/)
NDEVS==.-DEVTAB
DVT1: TTYO,,<SIXBIT /TY/>_-24.
UTO,,<SIXBIT /UT/>_-24.
NDV1==.-DVT1
GET40: LDB R,[270400,,40
GET40A: HRRZ C,40
CAML C,MEMTOP(U)
JRST IOADC
ADDI C,@UPR(U)
POPJ P,
;SUBTTL OPER DISPATCH
AOPER: LDB R,[270400,,40
MOVE J,R
ADDI J,@UPR(U)
ADDI R,IOCHNM(U)
HRRZ C,40
CAIL C,MXOPR
JRST ILUUO
PUSHJ P,@OPRDSP(C)
POPJ P,
AOS UUOH
POPJ P,
OPRDSP: ILUUO
AITYI
ALISTEN
ASLEEP
ASETMSK
AGETMSK
ALOGIN
ACLOSE
AUFLUSH
AATTY
AGBLTTY
AIPUSH
AIPOP
ADFLUSH
ADSTOP
AREDTIM
AREDDTS
ALTPOP
AUTDM
MXOPR==.-OPRDSP
;SUBTTL CALL DISPATCH
ACALL: LDB T,[270400,,40
HRRZ B,40
MOVE C,B
ADDI C,@UPR(U)
PUSHJ P,@CALDIS(T)
POPJ P,
JRST RSKP
CALDIS: ILUUO
ADISMIS
ATRAND
ATRANAD
AVALRET
AUTRAN
UACORE
ATRNDL
ADSTART
AFDELE
REPEAT 20-.+CALDIS,ILUUO
ACLOSE: HLRZ A,(R) ;OPER 7
HRRZ B,(R)
PUSH P,R
PUSHJ P, @CLSTB(B)
POP P,R
CLEARM (R)
POPJ P,
AVALRET: MOVE C,(C)
MOVEM C,VALUE(U)
MOVEI T,VALRTF
JRST ILLOP4
ABREAK: MOVEI T,BRKF
JRST ILLOP4
AUTRAN: CAML C,RMEMT(U)
JRST IOCERR
MOVEI A,0 ;CALL 5,
MOVE B,(C)
HRR B,U
UTRNL: SKIPN UNAME(A)
JRST UTRNA
CAMN B,SUPPRO(A)
JRST UTFND
UTRNA: CAML A,USRHI
POPJ P,
ADDI A,LUBLK
JRST UTRNL
UTFND: MOVE B,UNAME(A)
MOVEM B,1(C)
MOVE B,JNAME(A)
MOVEM B,2(C)
JRST POPJ1
PCCK1: CONO PI,CLKON
PUSHJ P,UDELAY
PCCK: CONO PI,CLKOFF
SKIPN MEMTOP(U)
POPJ P,
PUSHJ P,PCLSR
JRST PCCK1
POPJ P,
AUFLUSH: HRRZ B,(R) ;OPER 10
HLRZ A,(R)
SKIPL CLSTB(B)
JRST IOCERR
MOVNI D,1
PUSHJ P,USTOP
CLEARM (R)
MOVEI R,IOCHNM(U)
AUFLS1: HRRZ B,(R)
HLRZ C,(R)
SKIPL CLSTB(B)
JRST AUFLS2
CAMN C,A
CLEARM (R)
AUFLS2: CAIG R,IOCHNM+16(U)
AOJA R,AUFLS1
MOVE T,SIOCP(U)
AUFLS3: TLNN T,-1
JRST AUFLS4
POP T,R
HRRZ C,(R)
HLRZ D,(R)
SKIPL CLSTB(C)
JRST AUFLS3
CAMN C,A
CLEARM (T)
JRST AUFLS3
AUFLS4: EXCH U,A
PUSH P,A
PUSHJ P,IODCL
MOVEI B,0
PUSHJ P,ACORE
JRST .-2
AUFLS5: POP P,A
EXCH U,A
CLEARM UNAME(A)
JRST UDELAY
ADISMIS: ;CALL 1,
MOVE B,(C)
TLO B,LSRMOD
TLZ B,BADPC
MOVEM B,UUOH
MOVE B,TTYTBL(U)
JUMPL B,ADISM1
MOVEI C,TTYIF
SKIPN TINTC(B)
JRST ADISM1
IORM C,PIRQC(U)
MOVE C,[JRST ONEFLS
MOVEM C,UEXIT
ADISM1: MOVEI C,AROIF
ANDCAM C,PIRQC(U)
SETOM PICLR(U)
POPJ P,
ASLEEP: SOSL (J) ;OPER 3
PUSHJ P,UFLS
POPJ P,
ALOGIN: MOVE A,UNAME(U) ;OPER 6
AOJN A,ALOG1 ;JUMP ON ALREADY LOGGED IN
MOVE A,(J)
JUMPE A,ALOG1 ;READ JNAME EVEN THOUGH NOT LOGGED IN
MOVEM A,UNAME(U)
AOS (P)
ALOG1: MOVE A,UNAME(U)
MOVE B,JNAME(U)
MOVEM A,(J)
MOVEM B,1(J)
POPJ P,
AGETMSK: MOVE A,MSKST(U) ;OPER 5
MOVEM A,(J)
POPJ P,
ASETMSK: MOVE A,(J) ;OPER 4
TRZ A,BPIPI+VALRTF+BRKF+BCNTRZI ;MAKE SURE THESE GO TO SUP. PRO.
MOVEM A,MSKST(U)
MOVEI B,40+APRCHN
TRNE A,AROIF
MOVEI B,20+APRCHN
MOVEM B,APRC(U)
CONO @APRC(U)
POPJ P,
AREDTIM: SKIPA A,TIME
AREDDTS: DATAI A
MOVEM A,(J)
POPJ P,
ATRAND: CAML B,MEMTOP(U)
JRST IOADC
PUSH P,(C) ;CALL 2,
PUSH P,1(C)
PUSH P,2(C)
PUSHJ P,TRAN
JRST URET
POP P,2(C)
POP P,1(C)
POP P,(C)
JRST POPJ1
ATRANAD: CAML B,MEMTOP(U)
JRST IOADC
MOVE A,SIOMTU
SKIPN TRAN1(A)
JRST ADDTRN
AOBJN A,.-2
CONO PI,CLKOFF ;CALL 3,
MOVE A,SIOMTU
SUB A,[1,,1]
HRRE B,A
JUMPLE B,CLKONJ
ADDTRN: MOVE B,(C)
CAME B,UNAME(U)
POPJ P,
MOVEM B,TRAN1(A)
MOVE B,1(C)
MOVEM B,TRAN2(A)
MOVEM A,SIOMTU
CONO PI,CLKON
IRPC N,,345678
MOVE B,N-1(C)
MOVEM B,TRAN!N(A)
TERMIN
JRST POPJ1
CLKONJ: CONO PI,CLKON
POPJ P,
ATRNDL: ;CALL 7,
MOVE A,SIOMTU
MOVE B,(C)
CAME B,UNAME(U)
POPJ P,
TRND: IRPC N,,12345678
MOVE B,TRAN!N(A)
CAME B,N-1(C)
JRST TRND2
TERMIN
CLEARM TRAN1(A)
JRST POPJ1
TRND2: AOBJN A,TRND
POPJ P,
AATT5: CONO PI,CLKON
PUSHJ P,UDELAY
AATTY: HLRZ A,(R) ;OPER 11
HRRZ B,(R)
SKIPL CLSTB(B)
POPJ P,
CONO PI,CLKOFF
MOVE B,TTYTBL(U)
JUMPL B,AATT1 ;DOESNT HAVE TTY NOW
HLL A,TTYSTS(B)
TLO A,400000
MOVEM A,TTYTBL(U)
AATT4: MOVE D,TTYTBL(A)
TLNE D,100000
JRST AATT2
HRRZM A,TTYSTS(B)
MOVEM B,TTYTBL(A)
CONO PI,CLKON
JRST POPJ1
AATT2: TRNE D,400000
JRST AATT3
TLZ D,100000
MOVEM D,TTYTBL(A)
HRRZ A,TTYTBL(A)
JRST AATT4
AATT3: HLL A,TTYTBL(A)
TLZ A,700000
MOVEM A,TTYSTS(B)
HRRZM B,TTYTBL(A)
CLKOJ1: CONO PI,CLKON
JRST POPJ1
AATT1: TLNN B,100000
JRST CLKONJ
JRST AATT5
AGBLT1: CONO PI,CLKON
PUSHJ P,UDELAY
AGBLTTY: HLRZ A,(R) ;OPER 12
HRRZ B,(R)
SKIPL CLSTB(B)
POPJ P,
CONO PI,CLKOFF
MOVE A,TTYTBL(U)
JUMPGE A,POPJ1 ;ALREADY HAS IT
TLNE A,200000
JRST CLKONJ ;NEVER HAD IT
TLNE A,100000
JRST AGBLT1 ;TAKEN AWAY WAIT FOR IT TO COME BACK
TRNE A,400000
JRST CLKONJ ;NEVER GAVE IT AWAY
AGBLT3: MOVE E,TTYTBL(A)
JUMPL E,AGBLT2
HLLZ D,TTYSTS(E)
IOR D,[500000,,400000
MOVEM D,TTYTBL(A)
LDB D,[220300,,TTYTBL(U)
HRL D,U
MOVSM D,TTYSTS(E)
HRRZM E,TTYTBL(U)
JRST CLKOJ1
AGBLT2: MOVSI D,100000
IORM D,TTYTBL(A)
HRRZ A,TTYTBL(A)
JRST AGBLT3
AIPUSH: MOVE T,SIOCP(U) ;OPER 13
HLRZ A,T
CAIL A,20
JRST IOCERR
PUSH T,(R)
MOVEM T,SIOCP(U)
CLEARM (R)
POPJ P,
AIPOP: PUSHJ P,ACLOSE ;OPER 14
MOVE T,SIOCP(U)
TLNN T,-1
JRST IOCERR
POP T,(R)
MOVEM T,SIOCP(U)
POPJ P,
SUBTTL CORE ALLOCATOR
UACORE:
ACORE: CAILE B,MXC ;U HAS USER THAT WANTS CORE
POPJ P, ;IF U=USER,THIS GUY IS IN CORE
CAMN U,USER
JUMPE B,ACRF
ACRF1: PUSH P,A ;MAY CLOBBER ALL ACS EX A,C,E,D,U
PUSH P,C
PUSH P,E
PUSH P,D
CAMN U,USER
JRST ACR1A
PUSHJ P,PCCK
MOVSI A,BUCSTP
IORM A,USTP(U)
CONO PI,CLKON
ACR1A: MOVEM B,EPDL(U)
ACORE1: PUSHJ P,SWAIT
CRACF
CAMN U,DISUSR
PUSHJ P,DCRSTP
MOVEM U,CUSER
SETOM MEMFRZ
JUMPN B,ACR1B
SKIPN MEMTOP(U)
JRST ACORE9 ;HAS NO MEMORY WANTS NO MEMORY
ACR1B: SKIPN A,MEMTOP(U)
JRST ACORE2 ;NO CORE NOW
LDB A,[341000,,UPR(U)
CAIN B,1(A)
JRST ACORE9 ;SAME AS NOW
CAIG B,1(A)
JRST ACORE3 ;LESS THAN NOW
ACORE2: MOVEI C,1(A)
SUBM B,C
CAMLE C,MEMFR
JRST ACORE4 ;SCROUNGING REQD
SKIPN MEMTOP(U)
JRST ACORE5 ;NO MEM NOW
LDB D,[121000,,UPR(U)
ADDI D,1(A)
LDB E,[MUR,,MEMBLT(D)
CAIN E,75 ;BLOCK ABOVE CURRENT FREE
JRST ACORE6
ACORE5: PUSHJ P,MXCCA ;GET MAX CORE AVAIL IN BLOCK
CAMG B,D ;RETURN RESULT IN D
JUMPN U,ACORE7 ;BLT GUY IN -- DONT BLT SYS IN HA HA
SKIPN MEMTOP(U)
JUMPE U,ACORE7 ;EXECPT SOMETIMES HA HA
MOVSI D,-MX1KB ;INITITIATE MOBY SHUFFLE
MOVEI I,0
JRST ACMS2
ACRF: PUSHJ P,IODCL
MOVEI B,0
PUSHJ P,ACRF1
JFCL
SKIPGE C,TTYTBL(U)
JRST ACRF5
SKIPGE A,SUPPRO(U)
JRST ACRF3
HLL A,TTYTBL(A)
TLZ A,777770
MOVEM A,TTYSTS(C)
HRRZM C,TTYTBL(A)
ACRF4: SETOM TTYTBL(U)
ACRF2: CLEARM UNAME(U)
SETOM USTP(U)
CONO PI,CLKOFF
JRST UDELAY
ACRF3: SETOM TTYSTS(C)
JRST ACRF4
ACRF5: CAMN C,[-1
JRST ACRF2
SKIPL D,SUPPRO(U)
HRRM C,TTYTBL(D)
LSH C,-33.
SKIPL D
DPB C,[410300,,TTYTBL(D)
JRST ACRF2
DCRSTP: CAMN U,VIDUSR
POPJ P,
SETOM CDSOFF
CONO DIS,0
POPJ P,
DCRRST: CAMN U,VIDUSR
POPJ P,
SKIPL DISOFF
SKIPGE DISON
JRST .+2
CONO DIS,DISCHN+SDCHN_3
CLEARM CDSOFF
POPJ P,
ACORE4: JRST ACR9A ;TEMP
CONO PI,UTCOFF
MOVE D,UTTBF
CAIGE D,8
JRST ACR9B ;CANNOT GET ANOTHER BLOCK BY RECAIMING FREE IO BUFFER
MOVSI I,-MX1KB
LDB D,[MUR,,MEMBLT(I)
CAIN D,76
AOBJN I,.-2
JUMPGE I,[JRST 4,.] ;MEMBLT FOULED UP
MOVSI D,200000
IORM D,MEMBLT(I) ;ALLOCATION INHIBIT
ACORE6: MOVE A,D
PUSHJ P,CCFRE
DPB A,[MLO,,MEMBLT-1(A)
MOVEI C,377
DPB C,[MLO,,MEMBLT(A)
SOS A
DPB A,[MLU,,MEMBLT+1(A)
HRRZ A,D
PUSHJ P,CZRR ;ZERO BLOCK ADDED
MOVEI A,2000
ACORTN: HLRZ C,UPR(U)
SKIPN MEMTOP(U)
MOVNI C,2000
ADD A,C
JRST ACORT1
ACMS2: MOVE J,D ;D HAS FIRST FREE BLOCK BELOW
ACMS7: LDB E,[MUR,,MEMBLT(J)
CAMN J,D
JRST ACMS4F ;;NO FREE MEM SO FAR
CAIGE E,74
JRST ACMS4 ;USER
ORCMI E,77
AOJE E,ACMS5 ;EXEC
AOJE E,ACMS6 ;IO
AOJE E,ACMS8 ;FREE
PUSHJ P,UDELAY ;IN PROCESS
JRST ACMS7
ACMS4F: CAIN E,75
JRST ACMS8 ;FREE NOW
IMULI E,LUBLK
CAME E,U
JRST ACMS5
XORI I,1
MOVE D,ACMDT1(I)
JRST ACMS2
ACR9B: CONO PI,UTCON
ACR9A: SOS -4(P)
ACORE9: CAMN U,DISUSR
PUSHJ P,DCRRST
MOVSI A,BUCSTP
CAME U,USER
ANDCAM A,USTP(U)
CLEARM MEMFRZ
SETOM CRACF
POP P,D
POP P,E
POP P,C
POP P,A
JRST POPJ1
ACMS4A: CONO PI,CLKON
ACS4A: PUSHJ P,UDELAY
ACMS4: MOVEI U,LUBLK
IMUL U,E
CAMN U,USER
JRST ACMS4D
LDB Q,[400100,,USTP(U) ;BEXC
JUMPN Q,ACS4A
CONO PI,CLKOFF
PUSHJ P,PCLSR
JRST ACMS4A
MOVSI Q,BCSTOP
IORM Q,USTP(U)
CAMN U,DISUSR
PUSHJ P,DCRSTP
CONO PI,CLKON
ACMS4D: JUMPN I,ACMS4G ;JUMP ON MOVEING DOWN
HRRZ A,D ;MOVE USER
PUSHJ P,UADRS2 ;MOVE USER VARIABLES
ACMS4G: JSP Q,ACMS4B ;WRITING POINTER
ACMS5: ADD D,ACMDT2(I)
ACMS8: XCT ACMDT3(I)
JRST ACMS7
ACMDT1: -MX1KB,,
-MX1KB,,MX1KB-1
ACMDT2: 1,,1
,-1
ACMDT3: AOBJP J,ACMS4H
JSR ACMD1
ACMD1: 0
ADDI J,-1
JUMPG J,ACMS4H
JRST @ACMD1
ACMDT4: ACMS4L
ACMS4M
ACMS4L: DPB T,[MLU,,MEMBLT(A)
AOS A
DPB A,[MLO,,MEMBLT-1(A)
JRST ACMS4K
ACMS4M: DPB T,[MLO,,MEMBLT(A)
SOS A
DPB A,[MLU,,MEMBLT+1(A)
JRST ACMS4K
ACMDT5: MLO,,MEMBLT-1(D)
MLU,,MEMBLT+1(D)
ACMS4B: MOVEI T,377 ;LINK UP IN GOING UP LINK DOWN IF DOWN
ACMS4I: HRRZ A,D ;MOVE CORE FOR USER
PUSHJ P,TCALL
JRST MPOUT ;PATCH OUT NEW BLOCK OF FREE STG LIST
JRST @ACMDT4(I) ;PATCH MEM LINKS
ACMS4K: PUSHJ P,CMOVE ;MOVE CORE
HRRZ T,D
LDB E,[MUR,,MEMBLT(J)
DPB E,[MUR,,MEMBLT(D)
HRRZ A,J
PUSHJ P,MEMR ;RETURN OLD BLOCK
ADD D,ACMDT2(I) ;INCREMENT POINTERS
ADD J,ACMDT2(I)
JUMPGE J,ACMS4N
LDB A,[MUR,,MEMBLT(J)
CAMN A,E
JRST ACMS4I ;SAME USER, KEEP GOING
ACMS4N: MOVEI T,377
DPB T,ACMDT5(I)
JUMPE I,ACMS4J
MOVEI A,1(D)
PUSHJ P,UADRS2
ACMS4J: CAME U,CUSER
JRST ACMS4C
ACMS4H: MOVE U,CUSER ;MOVED GUY WE ARE MAKING CORE FOR, HE MAY BE HAPPY NOW
JRST ACORER
ACMS4C: MOVSI Q,BCSTOP ;RANDOM GUY, START HIM BACK UP
ANDCAM Q,USTP(U)
CAMN U,DISUSR
PUSHJ P,DCRRST
MOVE U,CUSER
JRST ACMS7
CMOVE: HRRZ A,D ;MOVE BLOCK IN J TO BLOCK IN D
HRL A,J
LSH A,10.
MOVE C,A
BLT A,1777(C)
POPJ P,
JUMPA SEARC
UDELAY: PUSHJ P,UFLS
POPJ P,
ACMS6: HRRZ A,D
PUSHJ P,TCALL
JRST MPOUT
PUSHJ P,AIOBT ;MOVE C(J) TO C(D)
LDB E,[MUR,,MEMBLT(J)
DPB E,[MUR,,MEMBLT(D)
HRRZ A,J
PUSHJ P,MEMR
JRST ACMS5
AIOBT: LDB R,[MLO,,MEMBLT(J)
AIOBTL: MOVSI E,400000 ;LOCK ALL BUFFERS IN BLOCK BEING VACATED
IORM E,IOBFT(R)
LDB R,[IOLC,,IOBFT(R)
CAIE R,377
JRST AIOBTL
; MOVNI R,8
; ADDM R,UTTBF
; ADDM R,UTTLB
; HRRZ A,D
; PUSHJ P,TCALL
; JRST UTMGB
AIOBT1: PUSH P,[0
LDB R,[MLO,,MEMBLT(J)
AIOBT2: SKIPL IOBFT(R)
JRST AIOB5A
LDB Q,[IOCH,,IOBFT(R)
CAIE Q,77 ;FREE
JRST AIOBT3
AIOBT4: DPB D,[141000,,IOBFT(R) ;RELOCATE IOSA
ANDCAM E,IOBFT(R)
AIOBT5: SKIPGE IOBFT(R)
SETOM (P)
AIOB5A: LDB R,[IOLC,,IOBFT(R)
CAIE R,377
JRST AIOBT2
POP P,A
JUMPE A,CPOPJ
PUSHJ P,UDELAY
JRST AIOBT1
AIOBT3: CAIL Q,NUTIC+NUTOC
JRST AIOBT6
IORM E,UTRAC(Q) ;UT DATA
LDB C,[IOLO,,IOBFT(R)
CAIN C,-4&1777
JRST AIOBT7 ;ACTIVE AT PI
CAIN C,-3&1777
JRST AIOBT8 ;ACTIVE AT MN PROG
PUSHJ P,ACMBM
AIOB8B: ANDCAM E,UTRAC(Q)
JRST AIOBT4
AIOBT7: ANDCAM E,UTRAC(Q)
JRST AIOBT5
AIOBT6: CAIE Q,NUTIC+NUTOC
JRST 4,. ;UNKNOWN CHNL
CONO PI,UTCOFF
LDB A,[IOLO,,IOBFT(R) ;UT DIR
SKIPGE UFLAPF(A)
JRST AIOB5B
LDB C,[420200,,UDIRO(A)
JUMPN C,AIOB5B
MOVSI C,600000
IORM C,UDIRO(A)
CONO PI,UTCON
DPB D,[121000,,UDIRO(A) ;RELOCATE UDIRO
HRRE T,DCHNT(A) ;RELOCATE CHANNEL DIR PNTRS
AIOB6B: JUMPL T,AIOB6C
DPB D,[121000,,UTDIRP(T)
HRRE T,UTUL(T)
JRST AIOB6B
AIOB6C: PUSHJ P,ACMBM
ANDCAM C,UDIRO(A)
JRST AIOBT4
ACMBM: LDB TT,[IOSA,,IOBFT(R)
LSH TT,6
HRLS TT
DPB D,[121000,,TT
MOVEI T,177(TT)
BLT TT,(T)
POPJ P,
AIOBT8: CONO PI,CLKOFF
HLRZ U,UTUSR(Q)
PUSHJ P,PCLSR
JRST AIOB8A
MOVSI TT,BCSTOP
IORM TT,USTP(U)
CONO PI,CLKON
DPB D,[121000,,MPRP(Q)
PUSHJ P,ACMBM
MOVSI TT,BCSTOP
ANDCAM TT,USTP(U)
MOVE U,CUSER
JRST AIOB8B
AIOB5B: CONO PI,UTCON
JRST AIOBT5
AIOB8A: CONO PI,CLKON
MOVE U,CUSER
JRST AIOBT5
MXCCA: MOVEI D,0
MOVSI I,-MX1KB
MXCC1: LDB Q,[MUR,,MEMBLT(I)
CAIN Q,75
JRST MXCC2
MXCC5: AOBJN I,MXCC1
POPJ P,
MXCC2: MOVEI J,1
MOVE T,I
AOBJP I,MXCC4
MXCC6: LDB Q,[MUR,,MEMBLT(I)]
CAIN Q,75
AOJA J,MXCC3
MXCC4: CAMGE D,J
MOVE E,T
CAMGE D,J
MOVE D,J
JRST MXCC5
MXCC3: AOBJN I,MXCC6
JRST MXCC4
ACORE7: MOVE TT,B
HRRZ A,E
MOVEI D,377
ACR7L: PUSHJ P,CCFRE
DPB D,[MLU,,MEMBLT(A)
AOS A
DPB A,[MLO,,MEMBLT-1(A)
MOVEI D,-1(A)
SOJG TT,ACR7L
MOVEI D,377
DPB D,[MLO,,MEMBLT-1(A)
SKIPN MEMTOP(U)
JRST ACORE8 ;NO MEM NOW
HRRZ I,E ;E HAS LOWEST BLOCK NEW CORE
LSH I,10.
MOVE A,I
HRL I,UPR(U)
HRRZ D,I
ADD D,MEMTOP(U)
BLT I,METOF-1(D)
HRRZ A,UPR(U)
LSH A,-10.
HLRZ I,UPR(U)
LSH I,-10.
PUSHJ P,MEMR
AOS A
SOJGE I,.-2
ACORE8: HRRZ A,E ;INSERT CODE TO ZERO NEW CORE
PUSHJ P,UADRS2
SKIPN MEMTOP(U)
JUMPE U,ACR8A
MOVE A,EPDL(U)
SOS A
HLRZ B,UPR(U)
LSH B,-10.
SKIPN MEMTOP(U)
SOS B
MOVE C,B
SUB B,A
HRLZ A,B
HRRZ B,UPR(U)
LSH B,-10.
ADDI B,1(C)
HRR A,B
ACRZR: PUSH P,A
PUSHJ P,CZRR
POP P,A
AOBJN A,ACRZR
ACR8A:
ACORR1: MOVE B,EPDL(U)
MOVEI A,-1(B)
LSH A,10.
ACORT1: HRLM A,UPR(U)
ADDI A,2000-METOF
HRRZM A,MEMTOP(U)
ADDI A,METOF
HRRZM A,RMEMT(U)
ACORER: CAMN U,USER
DATAO UPR(U)
CAMN U,DISUSR
PUSHJ P,DCRRST
ACORR2: SETOM CRACF
MOVE B,EPDL(U)
CLEARM MEMFRZ
JRST ACORE1
ACORE3: CAMN U,DISUSR
JSR DISACR
SUBI A,-1(B)
HRRZ E,A
HLRZ A,UPR(U)
ADD A,UPR(U)
LSH A,-10.
ACR2L: PUSHJ P,MEMR
MOVEI D,377
LDB C,[MUR,,MEMBLT-1(A)
IMULI C,LUBLK
CAMN C,U
DPB D,[MLO,,MEMBLT-1(A)
SOS A
SOJG E,ACR2L
LSH A,10.
SUB A,UPR(U)
JUMPGE A,ACORT1
CLEARM MEMTOP(U)
CLEARM RMEMT(U)
HRRZS UPR(U)
JRST ACORR2
CCFRE: PUSHJ P,TCALL
JRST MPOUT
CCRTN: MOVE I,U
IDIVI I,LUBLK
DPB I,[MUR,,MEMBLT(A)
POPJ P,
CZRR: LSH A,10.
CLEARM (A)
HRLS A
AOS A
MOVE C,A
BLT A,1776(C)
POPJ P,
DISACR: 0
PUSH P,A
MOVEI A,1(B)
LSH A,10.
CAML A,DISPRT
JRST DISAC1
SETOM DISUSR
SETOM DISOFF
CLEARM CDSOFF
DISAC1: POP P,A
JRST @DISACR
ADSTART: CONO PI,CLKOFF
SKIPL VIDUSR
JRST CLKONJ
SKIPE TTYTBL(U) ;ALWAYS LET CONSOLE TTY USER OPEN DISPLAY
CAMN U,DISUSR
JRST DSTRT1
SKIPL DISUSR
JRST CLKONJ
DSTRT1: CONO DIS,100
CLEARM CDSOFF
MOVEM U,DISUSR
MOVE A,(C)
HLRO B,A
MOVNS B
ADDI B,(A)
CAML B,RMEMT(U)
JRST DISBRF
MOVEM B,DISPRT
ADDI A,@UPR(U)
MOVEM A,DISPTR
MOVEM A,DBLKOP
MOVE A,UPR(U)
HRRZM A,DRELOC
CLEARM DISOFF
CONO DIS,100\DISCHN\SDCHN_3
CLKNJ1: CONO PI,CLKON
AOS (P)
POPJ P,
DISBRF: SETOM DISUSR
JRST CLKONJ
DRELOC: 0 ;RELOC OF DIS USER
DISPRT: 0 ;LARGEST LOC USED BY DISLIST
DISPTR: 0 ;PERM DIS BLKO PTR
DBLKOP: 0 ;TEMP DIS BLKO PTR
DISON: 0 ;-1 IF DIS STOPPED AFTER SPECIAL INT OR BLKO OVERFLOW
;WILL BE RESTARTED IN CLKBRK ROUTNE.
SRECYC: MOVEM A,DISAS
CONSZ DIS,2000
JRST DSLTPB
SETOM DISON
CONO DIS,0
SRCYCX: MOVE A,DISAS
JRST 12,@TTYBRK
DSLTPB: SKIPE LTPOPO
JRST SRCYCX ;IN LIGHT PEN UUO
DATAI DIS,LLTPSN
AOS LTPCNT
HRRZ A,LLTPSN
ADDM A,LTPCY
HLRZ A,LLTPSN
ADDM A,LTPCX
CONO DIS,10000\SDCHN_3\DISCHN
JRST SRCYCX
DRECYC: 0
SETOM DISON
CONO DIS,0
JRST 12,@DRECYC
LLTPSN: 0 ;. TO .+3 BLTED TO USER
LTPCNT: 0
LTPCY: 0
LTPCX: 0
LTPOPO: 0
DISA: 0
DISAS: 0
DISOFF: 0 ;-1 IF DIS NOT IN USE
CDSOFF: 0 ;-1 IF DIS STOPPED BY CORE ALLOCATOR
ADSTOP: CAME U,DISUSR ;OPER 16
POPJ P,
CONO DIS,100
SETOM DISOFF
POPJ P,
ADFLUSH: CAME U,DISUSR ;OPER 15
POPJ P,
SETOM DISOFF
SETOM DISUSR
CLEARM CDSOFF
CONO DIS,100
POPJ P,
ALTPOP: SETOM LTPOPO ;OPER 21
MOVEI B,(J)
HRLI B,LLTPSN
BLT B,3(J)
CAME U,DISUSR
JRST ALTPP2
SETZB A,LTPCNT
MOVEM A,LTPCY
MOVEM A,LTPCX
ALTPP2: SETZM LTPOPO
POPJ P,
VIDCLS: SETOM VIDUSR
SETOM DISUSR
POPJ P,
VIDI: CONO PI,CLKOFF
CAMN U,VIDUSR
JRST VID1A
SKIPL DISUSR
JRST CLKONJ
VID1A: CLEARM DISUSR
MOVEM U,VIDUSR
SETOM DISOFF
CONO PI,CLKON
CONO DIS,100
DATAO DIS,[20117]
MOVEI A,VIDOPN
MOVEM A,(R)
JRST POPJ1
VIDIOT: CONO VID,10
DATAO DIS,(C)
MOVEI A,1000.
CONSO VID,10
SOJG A,.-1
JUMPE A,VIDIB
DATAI VID,(C)
POPJ P,
VIDIB: SETOM (C)
POPJ P,
VIDUSR: -1
UIMRQ: MOVE A,IOBFC
CAIGE A,8
POPJ P, ;NOT ENOUGH ROOM IM IOBFT
IOMQ:
IMEMRQ: SKIPGE MEMFRZ
POPJ P, ;MEMORY FROZE
MOVEI A,0
PUSH P,B
PUSH P,E
IMRQ2: LDB A,[MLO,,MEMBLT(A)
CAIE A,377
JRST IMRQ3
CLEARM MEMDSP
MPOUT1:
IMRQR: POP P,E
POPBJ: POP P,B
POPJ P,
IMRQ3: LDB B,[420200,,MEMBLT(A)
JUMPN B,IMRQ2
AOS -2(P)
JRST IMRQ4
IMEMR: PUSH P,B
LDB B,[MLO,,MEMFP
DPB B,[MLO,,MEMBLT(A)
DPB A,[MLU,,MEMBLT(B)
MOVEI B,0
DPB B,[MLU,,MEMBLT(A)
MOVEI B,75
DPB B,[MUR,,MEMBLT(A)
DPB A,[MLO,,MEMFP
AOS MEMFR
JRST POPBJ
MEMR: CONO PI,UTCOFF
PUSHJ P,IMEMR
CONO PI,UTCON
POPJ P,
MPOUT: PUSH P,B
PUSH P,E
IMRQ4: LDB B,[MLU,,MEMBLT(A)
LDB E,[MLO,,MEMBLT(A)
CAIE B,377
DPB E,[MLO,,MEMBLT(B)
CAIE E,377
DPB B,[MLU,,MEMBLT(E)
SOS MEMFR
MOVEI B,74 ;IN PROCESS
DPB B,[MUR,,MEMBLT(A)
JRST MPOUT1
TCALL: CONO PI,UTCOFF
PUSHJ P,@(P)
SKIPA
AOS (P)
CONO PI,UTCON
JRST POPJ1
;MEMORY ALLOCATION TABLES
IOBFT: REPEAT MXIOB-1,176000,,.RPCNT+1 ;MAX DYN ALLOC IO BUFFERS
176000,,377 ;4.9 FREEZE
;4.8 ALLOC INHIBIT
IOCH=340600 ;4.7-4.2 SYS CHN NO 77 => FREE
IOLC=241000 ;4.1 3.3 LINK TO NEXT SEQ BUF IN CORE (W/IN 1K BLK)
IOLO==1000 ; LINK TO FOLLOWING BUFFER OR
;SPECIAL STATES LINK OUT
;-1 LAST BUFFER CURRENTLY FILLED
;-2 END OF FILE
;-3 BUFFER ACTIVE AT MAIN PROG LEVEL
;-4 BUFFER ACTIVE AT PI LEVEL
;IF CHN IS NUTIC+NUTOC (UTAPE FILE DIR) THEN IOLO IS TAPE NO
IOSA=101400 ; BUFFER SA _-6
IOBFP: 0 ;FREE STG TO IOBFT ENT
IOBFC: MXIOB-8 ;CNT OF AVAIL
;LEAVE 8 AVAIL SO CORE HACKER CAN NOT RUN OUT
IOBCNS: MOVEI A,IOBFP-IOBFT
IOBC1: MOVE E,A
LDB A,[IOLO,,IOBFT(A)
CAIN A,377
JRST 4,. ;IOBFT POINTERS FOULED UP
IOBC2: LDB B,[420200,,IOBFT(A)
JUMPN B,IOBC1
LDB B,[IOLO,,IOBFT(A)
DPB B,[IOLO,,IOBFT(E)
SOS IOBFC
POPJ P,
MEMFP:
MEMBLT: 37400,,377_8+1 ;POINTER ONLY BLK DOES NOT EXIST
REPEAT MX1KB-1-1,36400,,<.RPCNT>_8.+.RPCNT+2
36400,,<MX1KB-2>_8+377
;4.9 FREEZE
;4.8 ALLOC INHIBIT
MUR=320600 ;USER OR 77 EXEC, 76 IOBUF, 75 FREE, 74 IN PROCESS
MLO==1000 ;LINK DOWN
;IOBFT LINK FIRST BUFFER IN AREA (MUR=76)
MLU=101000 ;LINK UP
;SYS MEM ALLOC VARIABLES
MEMFR: MX1KB-1
MEMDSP: 0 ;-1 TRY HARD TO GET MEMORY 0 LOOK AROUND
UMEMT: 0 ;TOTAL MEMORY FOR USER PROGS (IN CORE)
MEMFRZ: 0 ;-1 MEMORY FROZE
;SYS CHANNEL ASSIGN
; 77=>FREE
; 0 - NUTIC+NUTOC-1 => UTAPE CHNL
;NUTIC+NUTOC =>UTAPE FILE DIR
SUBTTL NULL DEVICE
NULO: JUMPL D,NULOO
MOVEI A,NLBIDN
TLNN D,1
MOVEI A,NLIDN
BCHR: MOVEM A,(R)
JRST RSKP
NULOO: MOVEI A,NLODN
TLNE D,1
MOVEI A,NLBDN
JRST BCHR
NULI: CLEARM (C)
POPJ P,
NULOD: POPJ P,
NULBI: MOVE A,RMEMT(U)
MOVE D,(C)
CAIL A,(D)
CLEARM (D)
AOBJN D,.-2
POPJ P,
NULBOD: HLRE A,(C)
MOVNS A
ADD A,(C)
HRRZM A,(C)
POPJ P,
SUBTTL USER DEVICE ROUTINES
USRO: MOVEI TT,0
HRRZ E,SUPPRO(TT)
CAIN E,(U)
CAME A,UNAME(TT)
JRST AGIN
CAMN B,JNAME(TT)
JRST UFN1
AGIN: ADDI TT,LUBLK
CAMGE TT,USRHI
JRST USRO+1
USTRTO: PUSH P,U
TCORS: CAME A,UNAME(U) ;INFERIOR PROCEDURE MUST HAVE
JRST POPAJ
CONO PI,CLKOFF
MOVSI T,600000 ;DOESN'T HAVE TTY
PUSHJ P,USTRA ;MUST HAVE U IN -1(P)
JRST TCORS1
MOVEM A,UNAME(U)
MOVEM B,JNAME(U)
CONO PI,CLKON
MOVE TT,U
POP P,U
CLEARB A,T
ULUP: HRRZ E,SUPPRO(T)
CAIN E,(U)
IOR A,SUPPRO(T)
ADDI T,LUBLK
CAMGE T,USRHI
JRST ULUP
UFIN: MOVEI B,1
TLON A,(B)
JRST SETBIT
LSH B,1
CAIG B,1_<NINFP>
JRST UFIN+1
NOGO1: CLEARM UNAME(TT)
POPJ P,
UFN1: MOVE U,TT
JRST UFOUND
TCORS1: SKIPE SUPCOR
PUSHJ P,UFLS
JRST TCORS
NOGO: EXCH TT,U
JRST NOGO1
SETBIT: HRLZ B,B
HRR B,U
MOVEM B,SUPPRO(TT)
EXCH TT,U
MOVEI B,1
PUSHJ P,ACORE
JRST NOGO
;FALLS THRU
UFOUND: HLRZS C
TRNE C,777774
JRST ILUUO
HRLZ D,U
MOVE U,USER
XCT INFINT(C)
MOVEM D,(R)
JRST RSKP
INFINT: HRRI D,UWIDN
HRRI D,UWODN
HRRI D,UBIDN
HRRI D,UBODN
ULOSE: MOVE U,A
UWIERR: MOVEI T,ILLUAD
JRST UUOERR
UMEMEX: PUSH P,B
PUSH P,Q
MOVE U,A
HLRZ B,UPR(U)
LSH B,-10.
ADDI B,2
TRYOVR: PUSHJ P,ACORE
JRST ULOSE
CAML D,MEMTOP(U)
AOJA B,TRYOVR
MOVE U,USER
POP P,Q
JRST POPBJ
UWO: HRRO Q,(C)
MOVEI C,Q
UBO: PUSHJ P,SUSTPR
HLRO D,(C)
MOVNS B,D
ADD D,UOLOOK(A)
MOVE R,D
CAMLE D,RMEMT(A)
PUSHJ P,UMEMEX
ADDI D,@UPR(A)
MOVE E,(C)
ADDI B,(E)
MOVEM B,(C)
CAMLE B,RMEMT(U)
JRST IOADC
ADDI E,@UPR(U)
MOVE C,UOLOOK(A)
ADDI C,@UPR(A)
HRL C,E
MOVEM R,UOLOOK(A)
UBO2: HRRZ Q,C
SUBI Q,@UPR(A)
CAIGE Q,20
JRST UBO3
BLT C,-1(D)
JRST UBO1
UWI: HRRO Q,(C)
MOVEI C,Q
UBI: PUSHJ P,SUSTPR
HLRO D,(C)
MOVNS B,D
ADD B,(C)
CAMLE B,RMEMT(U)
JRST IOADC
HRRZM B,(C)
ADDI B,@UPR(U)
HRRZ C,UILOOK(A)
ADDI C,(D)
CAMLE C,RMEMT(A)
JRST UWIERR
HRRZM C,UILOOK(A)
SUBI C,(D)
ADDI C,@UPR(A)
SUBM B,D
HRL C,D
MOVSS C
UBI2: HLRZ Q,C
SUBI Q,@UPR(A)
CAIGE Q,20
JRST UBI3
BLT C,-1(B)
UBO1: MOVSI B,BEXC
ANDCAM B,USTP(A)
POPJ P,
SUSTP2: EXCH U,A
SUSTP1: CONO PI,CLKON
PUSHJ P,UDELAY
SUSTPR: CONO PI,CLKOFF
SKIPGE USTP(A)
JRST SUSTP1
EXCH U,A
PUSHJ P,PCLSR
JRST SUSTP2
EXCH U,A
MOVSI B,BEXC
IORM B,USTP(A)
CONO PI,CLKON
POPJ P,
UBI3: ADDI Q,AC0S(A)
MOVE J,(Q)
MOVEM J,(C)
ADD C,[1,,1
HRRZS B
CAIE B,(C)
JRST UBI2
JRST UBO1
UBO3: ADDI Q,AC0S(A)
HLRZ E,C
MOVE J,(E)
MOVEM J,(Q)
ADD C,[1,,1
HRRZS D
CAIE D,(C)
JRST UBO2
JRST UBO1
LPTCLS: SETOM LPTUSR
SETOM LPTUSE
POPJ P,
LPTO: CAMN U,LPTUSR
JRST LPTO1
AOSE LPTUSE
POPJ P,
MOVEM U,LPTUSR
LPTO1: MOVEI A,LPTDN
MOVEM A,(R)
JRST RSKP
PILPT1: SKIPA A,(C)
LPTS: MOVEI A,40
PUSHJ P,LPTCHK
PUSHJ P,UFLS
JFCL
PILPT: PUSH P,A
CAIN A,11
JRST LPTTAB
CAIE A,12
CAIN A,14
JRST LPC
SETOM PCL
CAIE A,15
AOSA LINEPOS
CLEARM LINEPOS
LPC1: SUBI A,40
SKIPG LPTCC
JRST .-1
IDPB A,LPTIP
HRRZ A,LPTIP
CAIN A,LPTBE-1
MOVEI A,LPTBO
HRRM A,LPTIP
SOS LPTCC
CONSO LPT,7
CONO LPT,LPTCHN
LPTRET: POP P,A
POPJ P,
LPTCHK: MOVE T,LPTCC
CAIG T,130.
POPJ P,
CAIG T,300.
AOS (P)
JRST POPJ1
LPTTAB: PUSHJ P,LPTS
LDB A,[300,,LINEPOS
JUMPN A,.-2
JRST LPTRET
LPC: PUSH P,LINEPOS
MOVEI A,15
AOSN PCL
SKIPE LINEPOS
PUSHJ P,PILPT
SOSGE (P)
JRST LPC2
PUSHJ P,LPTS
JRST .-3
LPC2: POP P,A
MOVE A,(P)
JRST LPC1
LPTCC: <LPTBE-LPTBO>*5-5
LINEPOS: 0
PCL: 0
LPTIP: 700,,LPTBO-1
LPTOP: 700,,LPTBO-1
LPTCN: CAIN A,<15-40>&177
JRST LPTCR
CAIN A,<12-40>&177
MOVEI A,400
CAIN A,<14-40>&177
MOVEI A,401
JRST LPTCN1
LPTCR: CONO LPT,10+LPTCHN
JRST LPTCR1
LPENT1: MOVEM A,LPTA
MOVEI A,<LPTBE-LPTBO>*5-5
CAMG A,LPTCC
JRST LPTSTP
ILDB A,LPTOP
TRNE A,100
JRST LPTCN
LPTCN1: DATAO LPT,A
LPTCR1: HRRZ A,LPTOP
CAIN A,LPTBE-1
MOVEI A,LPTBO
HRRM A,LPTOP
AOSA LPTCC
LPTSTP: CONO LPT,0
MOVE A,LPTA
JRST LPENT
LPTBSZ=1000
LPTBO: BLOCK LPTBSZ
LPTBE:
LPTUSR: -1
LPTUSE: -1
LPTA: 0
SUBTTL TELETYPE ROUTINES
TTYO1: SKIPGE I,TTYTBL(U)
JRST UDELAY
HRRZS I
CAIL I,NTTYS+NGEC
JRST UDELAY
TLOA I,400000
TTYO: CAIGE I,NTTYS+NGEC
TRNE D,1
JRST UDELAY ;NO BLOCK MODE
DPB I,[222100,,A]
SKIPGE I
TLO A,400000
JUMPL D,TTYOO
HRRI A,TYIDN
MOVE B,[220200,,TTYSTS(I)
TTYO2: MOVEM A,(R)
LSH D,-1
DPB D,B
JRST RSKP
TTYOO: MOVE B,[240100,,TTYSTS(I)
HRRI A,TYODN
JRST TTYO2
TIBL==20
TOBL==20
NTTYS==5
NGEC==4
TYI: TRZN A,400000
JRST .+3
SKIPGE TTYTBL(U)
PUSHJ P,UFLS ;LOSER DOESNT HAVE TTY
MOVE T,TICC(A)
CAMGE T,TINTC(A)
PUSHJ P,UFLS
SKIPG TICC (A)
PUSHJ P,UFLS
MOVE B,TIOP(A)
CAMN B,TIBEP(A)
SUBI B,TIBL
HRRM B,TIOP(A)
ILDB B,TIOP(A)
SOS TICC(A)
CAIN B,^Z
JRST TYI
TYI1: MOVEM B,(C)
MOVE B,TTYSTS(A)
TLNE B,TTYDDT
CAIGE A,NTTYS
POPJ P,
TYO: TRZN A,400000
JRST .+3
SKIPGE TTYTBL(U)
PUSHJ P,UFLS
CAIL A,NTTYS
JRST MGTYO
MOVEI T,TORM(A)
PUSHJ P,TYOF
PUSHJ P,UFLS
JFCL
MOVE B,(C)
IDPB B,TOIP(A)
SOS TORM(A)
EXCH B,TOIP(A)
CAMN B,TOBEP(A)
SUBI B,TOBL
EXCH B,TOIP(A)
AOSN TTYON(A)
CONO TTY,@TTYST(A)
POPJ P,
TYOF: SKIPG (T) ;DO NOT CHANGE TO T,
POPJ P,
MOVE T,(T)
CAIL T,TOBL*2
AOS (P)
JRST POPJ1
TYICLS: ANDI A,377777
CONO PI,UTCOFF
MOVE B,TIIP(A)
MOVEM B,TIOP(A)
CAIL A,NTTYS
JRST TYICL1
CLEARM ECHOCC(A)
MOVEM B,ECHOP(A)
TYICL1: MOVEM B,TINTP(A)
CLEARM TICC(A)
CLEARM TINTC(A)
CONO PI,UTCON
POPJ P,
TYOCLS:
TYOW: ANDI A,377777
CAIL A,NTTYS
JRST GTYOW1
MOVEI T,TOBS
CAME T,TORM(A)
PUSHJ P,UFLS
POPJ P,
GTYOW1: SKIPE GDFRSC-NTTYS(A)
PUSHJ P,UFLS
POPJ P,
AITYI: SKIPL A,TTYTBL(U)
SKIPG TINTC(A)
POPJ P,
MOVE B,TINTP(A)
CAMN B,TIBEP(A)
SUBI B,TIBL
HRRM B,TINTP(A)
ILDB B,TINTP(A)
SOS TINTC(A)
AOPVS: AOS (P)
AOPERV: MOVEM B,(J)
POPJ P,
ALISTEN: SKIPGE A,TTYTBL(U)
JRST ALIS1
PUSHJ P,TYOW
MOVEI B,0
CAIL A,NTTYS
JRST ALIS2
SKIPA B,ECHOCC(A)
ALIS1: TDZA B,B
ALIS2: ADD B,TICC(A)
JRST AOPERV
MGTYO: SKIPGE BPGFW-NTTYS(A)
PUSHJ P,GTYOW1
CLEARM BPGFW-NTTYS(A) ;PAGE WAIT
LDB B,[700,,(C)
CAIN B,14
JRST MGTF
CAIN B,12
POPJ P,
CAIN B,15
JRST MGTYCR
CAIN B,11
JRST MGTYT1
CAIG B,176
CAIGE B,175
CAIN B,33
MOVEI B,"$
CAILE B,"_
POPJ P,
CAIGE B,40
JRST MGG1
MGTCR1: AOS D,MGCC-NTTYS(A)
CAIL D,MCPL-1
JRST MGTYO1
PUSHJ P,MGTYOE
MGTYOR: CONSO GTYO,7
CONO GTYO,200+GETYOC
POPJ P,
MGTYOE: ORCBI B,177
ROT B,-1
TLNN B,400000
TRZ B,100
ILDB D,MGBP-NTTYS(A)
XOR D,B
TRNN D,177
POPJ P,
DPB B,MGBP-NTTYS(A)
AOS @MGCDP-NTTYS(A)
AOS GDFRSC-NTTYS(A)
POPJ P,
MGTYCR: MOVEI B,40
PUSHJ P,MGTCR1
JRST .-2
MGTYO1: LDB B,[700,,(C)
CAIN B,15
JRST MGTCR2
MOVEI B,"]
MGTCR3: PUSHJ P,MGTYOE
MOVE D,MGCDP-NTTYS(A)
ADDI D,GSTGL+1
CAMN D,GECBL-NTTYS+1(A)
JRST MGCR2 ;END OF PAGE
MOVE TT,TTYSTS(A)
TLNE TT,TTYIMI+TTYDDT ;SKIP ON NOT ECHOING. USE BOTTOM THREE LINES
JRST MGCR3
CAMN D,GECBLE-NTTYS(A)
JRST MGCR2
MGCR3: MOVEM D,MGCDP-NTTYS(A)
HRLI D,1000
MOVEM D,MGBP-NTTYS(A)
CLEARM MGCC-NTTYS(A)
LDB B,[700,,(C)
CAIE B,15
JRST MGTYO
PUSH P,MGBP-NTTYS(A)
PUSH P,MGCDP-NTTYS(A)
MOVE D,MGCDP-NTTYS(A)
ADDI D,GSTGL+1
CAMN D,GECBL-NTTYS+1(A)
JRST MGCR4
MOVE TT,TTYSTS(A)
TLNE TT,TTYIMI+TTYDDT ;NOT ECHOING
JRST .+3
CAML D,GECBLE-NTTYS(A)
MGCR4: MOVE D,GECBL-NTTYS(A)
MOVEM D,MGCDP-NTTYS(A)
HRLI D,1000
MOVEM D,MGBP-NTTYS(A)
MOVEI R,MCPL
MOVEI B,40
PUSHJ P,MGTYOE
SOJG R,.-2
POP P,MGCDP-NTTYS(A)
POP P,MGBP-NTTYS(A)
JRST MGTYOR
MGCR2: SETOM BPGFW-NTTYS(A)
MGTF2: MOVE D,GECBL-NTTYS(A)
JRST MGCR3
MGTCR2: SUB P,[1,,1
MOVEI B,40
JRST MGTCR3
MGTF: SETOM GFFF-NTTYS(A)
MOVSI D,-NLV
MOVE TT,GECBL-NTTYS(A)
MGTF1: CLEARM (TT)
MOVE Q,[336675573360
MOVEM Q,1(TT)
HRLI J,1(TT)
HRRI J,2(TT)
BLT J,GSTGL(TT)
ADDI TT,GSTGL+1
AOBJN D,MGTF1
CLEARM GDFRSC-NTTYS(A)
MOVEI C,[15
JRST MGTF2
MGG1: MOVEI B,"_
PUSHJ P,MGTCR1
LDB B,[700,,(C)
ADDI B,100
JRST MGTCR1
MGTYT1: MOVEI B,40
PUSHJ P,MGTCR1
LDB B,[300,,MGCC-NTTYS(A)
JUMPN B,MGTYT1
POPJ P,
HGCBT: CONO 635550 ;DEBUGGING ONLY
MOVE P,USRPDL
CONO TTY,400000
HGCBTL: PUSHJ P,HTYI
CAIN A,"D
JRST 174000
MOVEI T,-"0(A)
MOVE B,GECBL(T)
MOVEI C,0
GCBTL1: ILDB A,B
JUMPE A,GCBTL2
LSH A,1
TRZE A,200
TRO A,1
XORI A,177
CAIN A,40
AOJA C,[AOJA C,GCBTL1
GCBTL4: JUMPE C,GCBTL3
PUSH P,A
MOVEI A,40
PUSHJ P,HTYO
POP P,A
SOJA C,GCBTL4
GCBTL3: PUSHJ P,HTYO
MOVE D,A
MOVEI A,"*
TRZN D,400
MOVEI A,40
PUSHJ P,HTYO
JRST GCBTL1
HTYI: CONSO TTY,40
JRST .-1
DATAI TTY,A
ANDI A,177
HTYO: CONSZ TTY,20
JRST .-1
DATAO TTY,A
CONSO TTY,40
POPJ P,
JRST HGCBTL
GCBTL2: HRRZS B
CAMN B,GECBL+1(T)
JRST HGCBTL
MOVEI C,0
HRLI B,1000
MOVEI A,15
PUSHJ P,HTYO
MOVEI A,12
PUSHJ P,HTYO
JRST GCBTL1
TTYBRK: 0
CONSO DIS,77
JRST LPENT
CONSZ DIS,7400
JRST SRECYC
LPENT: CONSZ LPT,7
CONSZ LPT,10
SKIPA
JRST LPENT1
MOVEM I,TTYI
MOVEM A,TTYA
MOVEM B,TTYB
CONSZ GTYI,10
JRST GTYI1 ;FROM GE KLUDGE
MOVSI I,-NTTYS
TTYRET: CONO TTY,@TTYLT(I)
CONSO TTY,50
AOBJN I,.-2
JUMPL I,GOTTY
TTYRT1: MOVE I,TTYI
MOVE A,TTYA
MOVE B,TTYB
JRST 12,@TTYBRK
GOTTY: CONSZ TTY,10
JRST TYP11
CONSO TTY,40
JRST TTYRET
DATAI TTY,A
ANDI A,177
CAIN A,^Z
JSR ZFLAG
ZFLAG1: MOVE B,ECHOCC(I)
ADD B,TICC(I)
CAIL B,TIBS
JRST DING
IDPB A,TIIP(I)
PITEL2: MOVE A,TIIP(I)
CAMN A,TIBEP(I)
SUBI A,TIBL
HRRM A,TIIP(I)
MOVE B,TTYSTS(I)
AOJE B,PITEL4 ;NO USER HAS TTY
HRL B,MSKST-1(B)
TLNE B,BTINTE
JRST INTTY
PITEL4: CLEARM TINTC(I)
MOVEM A,TINTP(I)
PITEL3: AOSA ECHOCC(I)
DING: SETOM DINGF(I)
AOSN TTYON(I)
CONO TTY,10+TTYCHN
JRST TTYRET
INTTY: AOS TINTC(I)
MOVEI A,TTYIF
IORM A,PIRQC-1(B)
JRST PITEL3
ZFLAG2: MOVEI A,BCNTRZI
IORM A,PIRQC-1(B)
SKIPGE SUPPRO-1(B)
JRST ZFLAG4
ZFLAG3: MOVEI A,^Z
JRST @ZFLAG
ZFLAG: 0
MOVE B,TTYSTS(I)
AOJN B,ZFLAG2 ;NO USER HAS THIS TTY
FINDU4: SKIPL UTTYST
JRST TTYRET
HRRZM I,UTTYST
JRST ZFLAG3
ZFLAG4: MOVSI A,BUSRC
ANDCAM A,USTP-1(B)
JRST ZFLAG3
TYP11: AOSE TYOBFC(I)
JRST TYP1
MOVEI A,TOBS
MOVEM A,TORM(I)
MOVE A,TIOP(I)
MOVEM A,TOOP(I)
TYP1: HRRZ A,LCHAR(I)
AOSN LIF(I)
JRST TYP3
MOVEI A,12
HRRM A,LCHAR(I)
MOVEI A,7
AOSN DINGF(I)
JRST TYP3
MOVEI A,40
AOSG SPCCC(I)
JRST TYP3
MOVE A,TORM(I)
CAIL A,TOBS
JRST TYP4
MOVE A,TOOP(I)
CAMN A,TOBEP(I)
SUBI A,TOBL
HRRM A,TOOP(I)
ILDB A,TOOP(I)
AOS TORM(I)
MOVE B,TTYSTS(I)
TYP7: TLNE B,TTYIMO
JRST TYPI
TYPCOM: CAIN A,177
JRST TTYRET
CAIN A,175
MOVEI A,"$
CAIN A,15
TYP6: SETOM LIF(I)
CAIN A,10
JRST TYO1
CAILE A,6
CAIL A,16
JRST TYO1
TYP3: CAIE A,11
JRST TYP31
MOVE A,TICHRC(I)
IDIVI A,TABSPC
SUBI B,TABSPC
TYPCM2: MOVEM B,SPCCC(I)
JRST TTYRET
TYPCM1: CAIE A,11
JRST TYPCOM
MOVNI B,3
JRST TYPCM2
TYP31: HLRZ B,LCHAR(I)
CAIN A,12
CAME A,B
JRST .+2
SOSE LIF(I)
TYPI: DATAO TTY,A
HRLM A,LCHAR(I)
CAIL A,140
JRST TTYRET
CAIL A,40
AOS TICHRC(I)
CAIN A,15
CLEARM TICHRC(I)
JRST TTYRET
TYP4: SKIPLE ECHOCC(I)
JRST TYP4A
TYP5: CONO TTY,200+TTYCHN
SETOM TTYON(I)
JRST TTYRET
TYP4A: MOVE A,ECHOP(I)
CAMN A,TIBEP(I)
SUBI A,TIBL
HRRM A,ECHOP(I)
ILDB A,ECHOP(I)
SOS ECHOCC(I)
AOS TICC(I)
MOVE B,TTYSTS(I)
CAIG A,12
CAIGE A,11
CAIN A,15
TLNN B,TTYDDT
TLNE B,TTYIMI
CAIN A,^Z
JRST TYPCM1
JRST TTYRET
TYO1: CAIL A,40
JRST TYP3
ADDI A,100
HRRM A,LCHAR(I)
MOVEI A,"^
JRST TYP6
NCT==NTTYS+NGEC
TABSPC==8
DEFINE TBP NAM,IO,N
NAM: REPEAT N,(10700)T!IO!BO-1+.RPCNT*T!IO!BL
TERMIN
IRPS IO,,O O I I I I,NAM,,TOIP TOOP TIIP TIOP ECHOP TINTP,N,,NTTYS NTTYS NCT NCT NTTYS NCT
TBP NAM,IO,N
TERMIN
IRPS NAM,,LIF DINGF TICC SPCCC TICHRC ECHOCC LCHAR TINTC
NAM: REPEAT NCT,0
TERMIN
IRPS IO,,I O,N,,NCT NTTYS
T!IO!BS=5*T!IO!BL
T!IO!BO: BLOCK T!IO!BL*N
T!IO!BEP: REPEAT N,(10700)T!IO!BO-1+T!IO!BL*<.RPCNT+1>
TERMIN
TTYON: REPEAT NTTYS,-1
TORM: REPEAT NTTYS,TOBS
TYOBFC: REPEAT NTTYS,0
TTYST: REPEAT NTTYS,.RPCNT_12.+500010+TTYCHN
TTYLT: REPEAT 5,.RPCNT_12.+500000+TTYCHN
TERMIN
IRPS AC,,A B I
TTY!AC: 0
TERMIN
TTYSTS: REPEAT NCT,-1
;-1 NO USER
;RH USER NO
;LH 3.1 (IMAGE) 3.2 (DDT) TYPEING MODE 3.3 (IMAGE) TYPOUT MODE
MCPL==46. ;MAX CHAR/LINE
NLV==26. ;NO VERTICAL LINES
NCML==3 ;NO COMMAND LINES
NNCML==NLV-NCML ;NO NON COMMAND LINES
GSTGL==MCPL/4+1 ;REG STORAGE /LINE
GTYI1: DATAI GTYI,A
HLRZ I,A
MOVE I,GTYIT1(I) ;UNSCRAMBLE OFFSET
ANDI A,177
CAIN A,^Z
JSR ZFLAG
EXCH P,GTYIPP
MOVE B,TICC(I)
CAIL B,TIBS
JRST GDING
IDPB A,TIIP(I)
MOVEM A,GTYIT2
MOVE A,TIIP(I)
CAMN A,TIBEP(I)
SUBI A,TIBL
HRRM A,TIIP(I)
AOS TICC(I)
MOVE B,TTYSTS(I)
AOJE B,GTYI4 ;NO USER
HRL B,MSKST-1(B)
TLNE B,BTINTE
JRST GINTTY
GTYI4: CLEARM TINTC(I)
MOVEM A,TINTP(I)
GTYI7: MOVE B,TTYSTS(I)
TLNE B,TTYIMI+TTYDDT
JRST GTYI6C ;NO ECHO
MOVE A,GTYIT2
CAIN A,175
MOVEI A,"$
CAIN A,12
JRST GTYI6C
CAIN A,15
JRST GTYI6
GTYI6B: CAILE A,"_
JRST GTYI6C
CAIN A,11
JRST GTYT1
CAIGE A,40
JRST GTYIG1
PUSHJ P,GTYIS
JRST GTYI6 ;SWITCH LINES
GTYI6C: EXCH P,GTYIPP
JRST TTYRT1
GTYIPP: -10,,GTYIPD-1
GTYIPD: BLOCK 10
GTYIS: AOS B,CEHOP-NTTYS(I)
CAIGE B,MCPL
AOSA (P)
MOVEI A,"]
GTYIS1: ORCBI A,177
ROT A,-1
TLNN A,400000
TRZ A,100
ILDB B,GCMPR-NTTYS(I)
XOR B,A
TRNN B,177
POPJ P,
DPB A,GCMPR-NTTYS(I)
AOS @GTYILD-NTTYS(I)
AOS GDFRSC-NTTYS(I)
CONSO GTYO,7
CONO GTYO,200+GETYOC
POPJ P,
GTYIG1: MOVEI A,"_
PUSHJ P,GTYIS
JRST GTYI6
MOVE A,GTYIT2
ADDI A,100
PUSHJ P,GTYIS
JRST GTYI6
JRST GTYI6C
GTYT1: MOVEI A,40
PUSHJ P,GTYIS
JRST GTYI6
LDB A,[300,,CEHOP-NTTYS(I)
JUMPN A,GTYT1
JRST GTYI6C
GINTTY: AOS TINTC(I)
MOVEI A,TTYIF
IORM A,PIRQC-1(B)
JRST GTYI7
GTYI6: MOVEI A,40 ;CR OR LINE OVERFLOW
AOS B,CEHOP-NTTYS(I)
CAILE B,MCPL
JRST GTYI6A
PUSHJ P,GTYIS1
JRST GTYI6
GTYI6A: AOS B,GCMLC-NTTYS(I)
CAIL B,NCML
CLEARB B,GCMLC-NTTYS(I)
IMULI B,GSTGL+1
ADD B,GECBL-NTTYS(I)
ADDI B,<GSTGL+1>*NNCML
CLEARM CEHOP-NTTYS(I)
MOVEM B,GTYILD-NTTYS(I)
ADD B,[441000,,]
MOVEM B,GCMPR-NTTYS(I)
MOVE A,GTYIT2
CAIE A,15
JRST GTYI6B
PUSH P,GCMPR-NTTYS(I)
PUSH P,[MCPL]
MOVEI A,40
PUSHJ P,GTYIS1
SOSLE (P)
JRST .-3
SUB P,[1,,1
POP P,GCMPR-NTTYS(I)
JRST GTYI6C
GDING: MOVEI A,"?
MOVEM A,GTYIT2
JRST GTYI7
MXML==100.
GRLF==67
GLR==71
GFS==166
GRS==173
GPR==165
GLF==172
GETX==76
GFF==171
IGCK==2 ;GE CKSM FOR SOM AND STX
GTYOBK: 0
MOVEM I,GTYOI
MOVEM A,GTYOA
MOVEM B,GTYOB
AOS I,GTYOCN ;CONSOLE SERVICE ROUND ROBIN
CAIL I,NGEC
CLEARB I,GTYOCN
GTYOBR: AOSE B,GFFF(I)
SKIPE GDFRSC(I)
JRST GTYO1
AOS I
CAIL I,NGEC
MOVEI I,0
CAME I,GTYOCN
JRST GTYOBR
CONO GTYO,200 ;ALL CONSOLES CURRENT
MOVE A,40+2*GETYOC+1
MOVEM A,40+2*GETYOC
GTYOR1: MOVEM I,GTYOCN
MOVE B,GTYOB
MOVE A,GTYOA
MOVE I,GTYOI
JRST 12,@GTYOBK
GTYO1: JUMPE B,GTYO3A ;FF
MOVE A,TTYSTS+NTTYS(I)
TLNE A,TTYIMO
JRST GTYO4A ;NOT IN COMMAND MODE NO PRIORITY TO CAMMAND LINES
MOVE B,GECBL(I)
SKIPN NNCML*<GSTGL+1>(B)
SKIPE <NNCML+1>*<GSTGL+1>(B)
JRST GTYO2
SKIPE <NNCML+2>*<GSTGL+1>(B)
JRST GTYO2
GTYO4A: MOVE B,CPLNO(I) ;NO COMMAND LINES DIFFER CHECK REG LINES
GTYO4: SKIPE(B)
JRST GTYO3
ADDI B,GSTGL+1
CAMN B,GECBL+1(I)
MOVE B,GECBL(I)
CAME B,CPLNO(I)
JRST GTYO4
CLEARM GDFRSC(I)
JRST GTYOBR ;UNABLE TO FIND CHRS WHICH DIFFER
GTYO3: MOVEM B,CPLNO(I)
HRLI B,1000
MOVEM B,GTYOT5
CLEARM GTYOT1 ;LINE POSITION
GTYO3A: MOVNI A,MXML ;MAX LENGTH MESSAGE
MOVEM A,MECC ;COUNT
MOVEI A,GTYOBF+1
MOVEM A,GTYOBP
CLEARM GTYOCK
MOVE A,GTYOST(I)
JSR GTYOBE ;SET UP SELECTION
MOVEI A,177
JSR GTYOBE
MOVEI A,176
JSR GTYOBE
SKIPN GFFF(I)
JRST GTYOFF
GTYO5: AOS A,GTYOT1
CAILE A,MCPL
JRST GTYO6A ;CANT FIND CHR THAT DIFFERS
MOVEM B,GTYOT2
ILDB A,B
TRZN A,200
JRST GTYO5
SOS GTYOT1
HRRZ A,B ;FOUND DIRRERENCE POSITION POINTER TO LINE
SUB A,GECBL(I)
IDIVI A,GSTGL+1
MOVEM A,GTYOT3
GTYO6: MOVE A,GTYOT3
SUB A,CENPLV(I)
JUMPE A,GTYO7
JUMPG A,GTYO8 ;ONLY ALTERNATIVE IS TO LF DOWN
MOVNS A
CAMG A,GTYOT3 ;CHRS IF RFL UP
JRST GTYO8A
MOVEI A,GPR ;USE PAGE RET
CLEARM CENPLV(I)
CLEARM CENPLH(I)
JSR GTYOBE
JRST GTYO6
GTYO2: ADDI B,NNCML*<GSTGL+1>
MOVEM B,CPLNO(I)
JRST GTYO4
GTYO8A: MOVEM A,GTYOT4
GTYO8B: MOVEI A,GRLF
SOS CENPLV(I)
JSR GTYOBE
SOSLE GTYOT4
JRST GTYO8B
GTYO7: MOVE A,GTYOT1
SUB A,CENPLH(I) ;THERE VERTICALLY GET IT THERE HORIZ
JUMPE A,GTYO7F ;ITS THERE
JUMPG A,GTYO7A ;MUST SPACE OVER
MOVNS A
CAMG A,GTYOT1
JRST GTYO7B ;BS BACK
MOVEI A,GLR
CLEARM CENPLH(I)
JSR GTYOBE
JRST GTYO7
GTYO7A: MOVEM A,GTYOT4
GTYO7C: MOVEI A,GFS
AOS CENPLH(I)
JSR GTYOBE
SOSLE GTYOT4
JRST GTYO7C
JRST GTYO7F
GTYO8: MOVEM A,GTYOT4
GTYO8C: MOVEI A,GLF
AOS CENPLV(I)
JSR GTYOBE
SOSLE GTYOT4
JRST GTYO8C
JRST GTYO7
GTYO7B: MOVEM A,GTYOT4
GTYO7D: MOVEI A,GRS
SOS CENPLH(I)
JSR GTYOBE
SOSLE GTYOT4
JRST GTYO7D
GTYO7F: MOVE A,GTYOT2
MOVEM A,GTYOT7
GTYO7H: ILDB A,GTYOT7
TRZN A,200
JRST GTYO5A
SOS @GTYOT5 ;REDUCE DIFFERES COUNT FOR LINE
SOS GDFRSC(I) ;REDUCE COUNT FOR CONSOLE
DPB A,GTYOT7
AOS CENPLH(I)
JSR GTYOBE
MOVE A,CENPLH(I)
CAIGE A,MCPL
JRST GTYO7H
CLEARM CENPLH(I)
AOS A,CENPLV(I)
MOVEI B,GSTGL+1
ADDB B,GTYOT5
GTYO7G: HRLI B,1000
MOVEM B,GTYOT2
MOVEM B,GTYOT7
CLEARM GTYOT1
CAIGE A,NLV
JRST GTYO7H
CLEARB A,CENPLV(I)
MOVE B,GECBL(I)
MOVEM B,GTYOT5
JRST GTYO7G
GTYOFF: MOVEI A,GFF
JSR GTYOBE
CLEARM CENPLV(I)
CLEARM CENPLH(I)
JRST GTYO1A
GTYO5A: MOVE B,GTYOT2 ;END OF DIFFERENCE
JRST GTYO5
GTYO6A: MOVEI A,GTYOBF+4
CAME A,GTYOBP
JRST GTYO1A
CLEARM @GTYOT5 ;CANT FIND CAR POS WHERE THEY DIFFER
MOVE B,GTYOT5
JRST GTYO4A
GTYOBE: 0
MOVEM A,@GTYOBP
AOS GTYOBP
EQVM A,GTYOCK
AOSG MECC
JRST @GTYOBE
GTYO1A: SETOM MECC
MOVEI A,GETX
JSR GTYOBE
SETCM A,GTYOCK
MOVEM A,@GTYOBP
MOVE A,GTYOBP
SUBI A,GTYOBF-1
MOVNS A
HRLS A
HRRI A,GTYOBF-1
MOVEM A,GTOBLP
MOVE A,[BLKO GTYO,GTOBLP
MOVEM A,40+2*GETYOC
JRST GTYOR1
;GE TYPOUT DATA STORAGE
REPEAT NGEC,[
CONC GED,\.RPCNT,: REPEAT NLV,[
0 ;NO CHRS THAT DIFFER IN THIS LINE
BLOCK GSTGL
]
]
GECBL: REPEAT NGEC, CONC GED,\.RPCNT,
GECBL ;END CHECK FOR LAST CONSOLE
GECBLE: REPEAT NGEC,[CONC NNCML*<GSTGL+1>+GED,\.RPCNT
]
GCMPR: BLOCK NGEC ;BYTE POINTER FOR COMMAND ECHOING
GTYIT1: NTTYS
NTTYS+1
NTTYS+3
NTTYS+2
GTYILD: BLOCK NGEC ;DIFFERS COUNT POINTER FOR CURRENT TYPIN LINE
BPGFW: BLOCK NGEC ;PAGE WAIT FLAG FOR MAIN PRGM
CEHOP: BLOCK NGEC ;CHARACTER POSITION FOR COMMAND ECHOING
GLNDP: BLOCK NGEC ;POINTER TO DIFFERS COUNT FOR CURRENT COMMAND LINE
GDFRSC: BLOCK NGEC ;COUNT TOTAL CHRS DIFFERING FOR CONSOLE
GTYIT2: 0 ;TEMP FOR LAST CHR JUST RECD
GCMLC: BLOCK NGEC ;COMMAND LINE ON
CPLNO: BLOCK NGEC ;POINTER TO DIFFERS COUNT FOR LINE SENDER LAST LOOKED ON
CENPLV: BLOCK NGEC ;ENTRY MARKER POS VERTICAL
CENPLH: BLOCK NGEC ;ENTRY MARKER POS HORIZ
GTYOCK: 0 ;CHECKSOR
GTOBLP: 0 ;BLKO POINTER
MGBP: BLOCK NGEC ;MAIN PRGM TYO BYTE POINTER
MGCDP: BLOCK NGEC ;POINTER TO DIFFERS COUNT FOR OUTPUT LINE
MGCC: BLOCK NGEC ;MAN PROG LINE POS
GFFF: BLOCK NGEC ;FORM FEED FLAG
GTYOI: 0
GTYOA: 0
GTYOB: 0
GTYOCN: 0 ;CONSOLE NEXT IN LINE
GTYOT1: 0 ;LINE POSITION
MECC: 0 ;CHRS REMAINING IN MESS ALLOWABLE
GTYOBP: 0 ;OUTPUT BUFFER POINTER
GTYOBF: 77 ;SOH
0 ;SELCT CODE
177 ;SOM
176 ;STX
BLOCK MXML+10
GTYOT2: 0 ;BUFFER POINTER WHERE THEY DIFFER
GTYOT3: 0 ;DESIRED LINE NO
GTYOT4: 0
GTYOT5: 0 ;BUFFER POINTER TO BEG OF CURRENT LINE ALSO
GTYOT7: 0
;ADR POINTS TO DIFFERS COUNT
GTYOST: 117 ;CONSOLE SELECTION TABLE CONVERSION
113
107
103
GEKI: MOVSI I,-NGEC
CONO GTYO,200
GEK1: MOVEI A,1 ;GET CONSOLES INTO HAPPY MODE
PUSHJ P,GEKO
CLEARM GEKICK
MOVEI A,140
DPB I,[30200,,A
PUSHJ P,GEKO
MOVEI A,0
PUSHJ P,GEKO
MOVEI A,2
PUSHJ P,GEKO
MOVEI A,14
PUSHJ P,GEKO
MOVEI A,3
PUSHJ P,GEKO
MOVE A,GEKICK
PUSHJ P,GEKO
MOVE A,GECBL(I)
MOVEM A,CPLNO(I)
MOVEM A,MGCDP(I)
HRLI A,1000
MOVEM A,MGBP(I)
ADDI A,NNCML*<GSTGL+1>
MOVEM A,GTYILD(I)
MOVEM A,GCMPR(I)
CLEARM CEHOP(I)
HRRZM A,GLNDP(I)
CLEARM GDFRSC(I)
CLEARM GCMLC(I)
CLEARM CENPLV(I)
CLEARM CENPLH(I)
CLEARM BPGFW(I)
CLEARM MGCC(I)
MOVE B,GECBL(I)
GEKI2: CLEARM (B)
MOVE C,[336675573360
MOVEM C,1(B)
HRLI J,1(B)
HRRI J,2(B)
BLT J,GSTGL(B)
ADDI B,GSTGL+1
CAME B,GECBL+1(I)
JRST GEKI2
AOBJN I,GEK1
DATAI GTYI,A
CONO GTYO,200+GETYOC
CONO GTYI,GETYIC
POPJ P,
GEKO: ORCBI A,177
EQVM A,GEKICK
ROT A,-1
TLNN A,400000
TRZ A,100
CONSO GTYO,100
JRST .-1
DATAO GTYO,A
POPJ P,
GEKICK: 0
BLKTNB: SKIPE 5(B)
XCT 5(B) ;BLOCK IO HANDLER
BLKTF: PUSHJ P,UFLS ; CALL JSP B,BLKT ;ADR OF PTR IN C
PUSHJ P,@2(B) ; UPPA(A) ;ADR OF AC BUF PTR 4.9 OUT
JRST BLKTF ;UTPPC(A) ;CNT REM IN CUR BF
;UTRBUF NO SKIP NO MEMORY SKIP
;OTHERWISE TT BUF ORG ;ADR TO GET NEXT BUF
HRRM TT,@(B) ;UTRLBF ;PUT BUF ON FREE STG
SKIPA TT,4(B) ;BUFSIZ ;SIZE OF BUFFER
BLKT: SKIPA E,(C)
MOVEM TT,@1(B) ;BFLIS(A) ;ADDR TO WAIT FOR BUF
BLKT1: SKIPL TT,(C)
POPJ P,
SKIPG D,@1(B)
JRST BLKTNB ;NEW BUFFER
HLRES TT
MOVNS TT
CAMLE TT,D
MOVE TT,D
HRRZ D,(C)
ADD D,TT
CAML D,RMEMT(U) ;PROTECTION ERR
JRST IOADC
HRRZ D,(C)
ADDI D,@UPR(U)
HRL D,@(B)
SKIPGE (B)
MOVSS D
ADDM TT,@(B)
MOVN J,TT
ADDM J,@1(B)
HRLS TT
ADDM TT,(C)
ADDI TT,(D)
BLT D,-1(TT)
SKIPN @1(B)
PUSHJ P,@3(B)
JRST BLKT1
SUBTTL UTAPE SERVICE ROUTINE
NUTIC==6 ;NUM UT IN CHNLS
NUTOC==6 ;NUM UT OUTPUT CHAN
UTBLKS==4
;UT CHANNEL STORAGE
;INPUT CHANNELS
UTCHNT:
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(RH)
; 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
UTN1=.-NUTIC+1
BLOCK NUTOC
UTN2=.-NUTIC+1
BLOCK NUTOC ;NAME OF FILE BEING WRITTEN
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
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
;UTBFP RH OUTPUT LINK (PI)
; LH INPUT
;UTDBC BLOCK CNT
UTFS: 377 ;FREE STG PNTR TO 200 WD BUFFERS
UTTLB: -NUTIC-NUTOC ;TOTAL BUFFERS ALLOCATED TO UTAPES
UTTBF: 0 ;TOTAL UT BUFFERS FREE
NUTCA: 0 ;NUMBER UTAPE CHANNELS ACTIVE
UPCHFS: 0 ;FAIR SHARE BFS PER CHNL
AUTDM: SKIPE B,(J) ;UT DISMT
CAILE B,NUNITS
POPJ P,
MOVSI C,-NUTIC-NUTOC
CONO PI,UTCOFF
AUTDM1: SKIPGE UTUSR(C)
JRST AUTDM2
HRRZ D,UTTNO(C)
CAMN B,D
JRST UTCONJ ;SOME ON USING TAPE
AUTDM2: AOBJN C,AUTDM1
CONO PI,UTCON
MOVSI C,(SETZ)
IORM C,UFLAPF(B)
JRST POPJ1
UTCONJ: CONO PI,UTCON
POPJ P,
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: JUMPE I,CPOPJ
CAILE I,NUNITS
POPJ P,
CONO PI,UTCOFF
SKIPGE UFLAPF(I)
JRST UTOF1 ;FLAPPING IN PROGRESS
SKIPGE TT,UDIRO(I)
TLNN TT,177777
JRST UTO4 ;FILE DIR IN OR ON THE WAY
MOVEI TT,200000
MOVEM TT,DCHNT(I)
UTO4: CONO PI,UTCON
UTO6: PUSHJ P,LWAIT
SKIPGE UDIRO(I)
UTO5: MOVSI TT,400000
IORM TT,UDIRO(I) ;LOCK DIRECTORY
CONO PI,UTCON
TRNE D,200000
JRST UTDEL1 ;DELETE OR RENAME
JUMPL D,UTOW1 ;WRITE
PUSHJ P,UTLK3 ;MUST NOT CLOBBER TT
JUMPE B,UTO5A
UTOW2:UTO8: CONO PI,UTCON
MOVSI TT,-NUTIC
TLNE C,1
MOVE TT,[-NUTOC,,NUTIC
SKIPL UTUSR(TT)
AOBJN TT,.-1
JUMPG TT,NCA ;NO CHANNEL AVAILABLE
CONO PI,UTCOFF
SKIPL UTUSR(TT)
JRST UTO8
UTO7: MOVEI J,DCHNT-UTUL(I)
JRST .+2
UTO2: MOVE J,Q
HRRE Q,UTUL(J)
JUMPGE Q,UTO2
UTO1: HRLOM U,UTUSR(TT)
HRRM TT,UTUL(J)
HRRZM I,UTTNO(TT)
CLEARM UTDBC(TT)
DPB A,[300500,,UTDBC(TT)
JUMPL D,UTOW3
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
HRROM J,UTLSTM(TT)
HLLOS UTRAC(TT)
HRRZS UTRAC(TT)
CONO PI,UTCON
CLEARM MPRC(TT)
LDB Q,[220300,,C
MOVE Q,UTOT(Q)
AOS NUTCA
PUSHJ P,FSCMP
UTO9: MOVSI E,400000
ANDCAM E,UDIRO(I) ;RELEASE FILE DIR
HRRZS UTRAC(TT)
HRL Q,TT
MOVEM Q,(R) ;STORE CHANNEL WD
RSKP: AOS UUOH
POPJ P,
UTO5A: ANDCAM TT,UDIRO(I)
POPJ P,
UTOW1: PUSH P,B
PUSH P,A
CLEARB A,B
PUSHJ P,UTLK3
JUMPE B,FILDF ;FILE DIR FULL
JRST UTOW2
UTOW3: HRROM TT,1(B) ;RESERVE FILE NAME
POP P,UTN1(TT)
POP P,UTN2(TT)
MOVSI J,100000
IORM J,UDIRO(I) ;SET FILE DIR MODIFYED
JRST UTOW4
UTOT: DNUACII ;ASCII UNITS INPUT
DNUACCO ;ASCII UNITS OUTPUT
DNUBKI ; " BLOCK INPUT
DNUBKO ; " BLOCK OUTPUT
DNUDTI ; WD INPUT
DNUDTO ; WD OUTPUT
DNUBKI ; BLOCK IN
DNUBKO ;BLOCK OUT
UDATAI: HRROM C,I
MOVEI C,I
UBLKI: JSP B,BLKT
MPRP(A)
MPRC(A)
UTBGB
UTBRB
200
SKIPG UTBFS(A)
UASCII: MOVEI B,UBLKI+1
JRST CHRKT
UASCCO: MOVEI B,UBLKO+1
CHRKT: SOSGE @1(B)
JRST CHRKT1 ;GET NEW BUFFER
SKIPGE (B)
JRST CHRKT2
ILDB D,@(B)
CAIN D,141
JRST CHRKT3
MOVEM D,(C)
POPJ P,
CHRKT2: MOVE D,(C)
IDPB D,@(B)
POPJ P,
CHRKT1: PUSHJ P,@3(B)
SKIPE 5(B)
XCT 5(B)
PUSHJ P,UFLS
PUSHJ P,@2(B)
CHRKT4: JRST .-2
HRRM TT,@(B)
MOVEI E,440700
HRLM E,@(B)
MOVE E,4(B)
IMULI E,5
MOVEM E,@1(B)
JRST CHRKT
CHRKT3: HRROI D,141
MOVEM D,(C)
JRST UTICL
UTOCLR: MOVSI Q,(SETZ)
IORM Q,UTTNO(A)
MOVEI C,[141
UTOCR2: SKIPG MPRC(A)
JRST UTOCR3
PUSHJ P,UASCCO
JRST UTOCR2
UTOCR3: PUSHJ P,UTBWW
JRST UTOCL2
UTBGB: LDB Q,[IOLO,,UTBFP(A)
CAIN Q,377
JRST 4,. ;PNTRS OUT OF PHASE
CAIN Q,376
JRST UTBG1 ;END OF FILE
SKIPGE IOBFT(Q)
POPJ P,
CONO PI,UTCOFF
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
HRRM J,UTLSTM(A)
MOVEI J,-3
DPB J,[IOLO,,IOBFT(Q)
LDB TT,[IOSA,,IOBFT(Q)
LSH TT,6
HRLM Q,UTLSTM(A)
JRST POPJ1
UDATAO: HRROM C,I
MOVEI C,I
UBLKO: JSP B,BLKT
SETZ MPRP(A)
MPRC(A)
UTBWG
UTBWW
200
0
UTBWG: 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
UTBWG3: PUSHJ P,TCALL
JRST UIMRQ
JRST POPBAJ
PUSHJ P,TCALL
JRST UTMGB
JRST UTBWG2
UTBWG1: PUSHJ P,TCALL
JRST IUTCONS
JRST UTBWG3
MOVE Q,A
POP P,B
POP P,A
AOS UTBFS(A)
JRST UTBWG4
POPBAJ: POP P,B
JRST POPAJ
UTBWW: HLRE Q,UTLSTM(A)
JUMPL Q,CPOPJ
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 UTLSTM(A)
POPJ P,
UTBWW1: HRRM Q,UTBFP(A)
JRST UTBWW2
UDLOCK: HRRZ C,UTTNO(D)
PUSHJ P,LWAIT
SKIPGE UDIRO(C)
MOVSI A,(SETZ)
IORM A,UDIRO(C)
CONO PI,UTCON
POPJ P,
UTOCL: MOVSI Q,(SETZ)
IORM Q,UTTNO(A)
UTOCL1: HRROI I,0
SKIPG MPRC(A)
JRST UTOCL2
PUSHJ P,UDATAO+1
JRST UTOCL1
UTOCL2: MOVE D,A
SKIPE UTBFS(D)
PUSHJ P,UFLS
PUSHJ P,UDLOCK
HRRZ C,UTTNO(D)
HRRZ Q,UTBFP(D)
CAIL Q,376
JRST UTOCL4 ;NORMAL CLOSE
MOVEI Q,IOCERR ;ABORT WORKS
IORM Q,PIRQC(U)
MOVEI A,0
HRROI B,(D)
PUSHJ P,UDELETE
PUSHJ P,UDULK
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)
PUSHJ P,UDULK
JRST UTOCL3
UTDEL1: MOVE C,I ;DELETE
HRRZ R,40
ADDI R,@UPR(U)
SKIPE 3(R)
JRST UTRN1 ;RENAME
PUSHJ P,UDELETE
PUSHJ P,UDULK
JUMPN B,CPOPJ
JRST POPJ1
UTRN1: PUSHJ P,UTLOOK
JUMPE B,CPOPJ
PUSH P,Q
MOVE A,3(R)
MOVE B,4(R)
PUSHJ P,UTLOOK
POP P,Q
JUMPE B,UDULK
MOVE A,3(R)
MOVE B,4(R)
MOVEM A,1(Q)
MOVEM B,2(Q)
MOVSI A,100000
IORM A,UDIRO(C)
UTRN2: PUSHJ P,UDULK
JRST POPJ1
UDELETE: 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
LDB J,[360100,,UTDBC(E)
JUMPN J,UDELE3
MOVSI J,10000
IORM J,UTDBC(E)
CLEARM (Q)
SETOM 1(Q)
POPJ P,
UDELE3: SOJGE E,UDELE4
UDELE1: CLEARM (Q)
CLEARM 1(Q)
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
DPB J,B
CAIE E,37
JRST UDELE2
MOVE B,A
MOVEI A,0
JRST UDELETE
UTBG1: POP P,D
HRRZS D
CAIN D,CHRKT4
JRST CHRKT3
CAME E,(C)
POPJ P,
CLEARM (R)
UTICL:
UTICL1: 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
MOVSI C,200000
IORM C,UTRAC(D)
MOVEI T,400000
TDNN T,UTRAC(D)
PUSHJ P,UFLS
PUSHJ P,UTBRB1 ;RETURN ACTIVE BUFFER MAIN PROG
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)
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: CONO PI,UTCON
POPJ P,
UDELE5: PUSHJ P,UDLOCK
HLRZ Q,UTTNO(D)
LSH Q,1
ADD Q,UDIRO(C)
SUBI Q,2
PUSHJ P,UDELE1
UDULK: MOVSI A,(SETZ)
ANDCAM A,UDIRO(C)
POPJ P,
UTBRB1: MOVE A,D
UTBRB: PUSH P,A
HLRE A,UTLSTM(A)
JUMPL A,POPAJ
PUSHJ P,BRTN
POP P,A
HRROS UTLSTM(A)
POPJ P,
IUTCONS:
IUTCO1: SKIPG UTTBF
JRST IUTC1
MOVEI E,UTFS-IOBFT
MOVE A,UTFS ;CHNL NO IN D
IUTC3: CAIN A,377
JRST IUTC1
LDB B,[420200,,IOBFT(A)
JUMPN B,IUTC2
LDB B,[IOLO,,IOBFT(A)
DPB B,[IOLO,,IOBFT(E)
DPB D,[IOCH,,IOBFT(A)
SOS UTTBF
AOS (P)
POPJ P,
IUTC2: MOVE E,A
LDB A,[IOLO,,IOBFT(A)
JRST IUTC3
IUTC1: PUSHJ P,UIMRQ
POPJ P,
PUSHJ P,UTMGB
JRST IUTCO1
IBRTN: PUSH P,B
MOVE B,UTFS
DPB B,[IOLO,,IOBFT(A)
MOVEM A,UTFS
MOVEI B,77
DPB B,[IOCH,,IOBFT(A)
AOS UTTBF
JRST POPBJ
UTMGB: MOVEI B,76 ;GOBBLE MEM BLK IN A FOR UTAPE BUFFER
DPB B,[MUR,,MEMBLT(A)
MOVE J,A
LSH A,10.-6. ;CONV TO BUF SA
MOVE TT,A ;INCR TO NEXT BUF ADR
MOVEI R,8
ADDM R,UTTLB ;UTTBF AOSED AT IBRTN
MOVNI Q,1
UTMG1: PUSHJ P,IOBCNS
DPB TT,[IOSA,,IOBFT(A)
JUMPL Q,UTMG2
DPB A,[IOLC,,IOBFT(Q)
UTMG3: MOVE Q,A
PUSHJ P,IBRTN
ADDI TT,2
SOJG R,UTMG1
MOVEI TT,377
DPB TT,[IOLC,,IOBFT(A)
FSCMP: MOVE A,UTTLB
IDIV A,NUTCA
MOVEM A,UPCHFS
POPJ P,
BRTN: CONO PI,UTCOFF
PUSHJ P,IBRTN
CONO PI,UTCON
POPJ P,
UTMG2: DPB A,[MLO,,MEMBLT(J)
JRST UTMG3
UTRL1: JUMPE B,UTRLDR
HRRZ B,UTBFP(D)
CAIE B,377
JRST JDB6C
UTRLDR: LDB R,[270100,,UTDBC(D)
JUMPN R,UTRLD1
SKIPGE UDIRO(C) ;SPECIAL KLUDGE TO RUN FAST
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)
JRST UTRLD
UTRLD2: CAIN B,37
PUSHJ P,UAR
UTRLD1: PUSHJ P,UDIRAD
JRST JDB6C2 ;DIR DOUBLE LOCKED
JRST UTREOF
JRST UTRLD3
JDDTA: SETOM DCFREE
HLRZ D,ULDCH(C) ;FINISHED DATA TRANS TAPE IN C GET CHNL NO
CLEARM UTLDD(D)
SETOM SMODE
CONSZ PI,DCCHNA
JRST UDATER
SETOM UGOAL(C)
CAIL D,NUTIC
JRST JDDT1 ;WRITE
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: HLRM E,UTBFP(D)
AOS UTBFS(D)
JDDT2: PUSHJ P,JDB6W
JRST JDDT3 ;SAME TAPE CAN RELOAD, DONT CHECK OTHERS
JDDT4: HRRZS ULDCH(C)
JRST JDB4A ;UNIT NOW IDLE STOP IT
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,200000
JRST JDB6C2 ;CHANNEL LOCKED
CAIL D,NUTIC
JRST JDB6A ;WRITE CHANNEL
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
HRRZ 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 CHNAGED AND NOT LOCKED
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: 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
PUSHJ P,UDIRAD ;ADVANCE DIRECTORY POINTERS
JRST JDB6C2 ;DIRECTORY LOCKED
JRST UTPFUL ;TAPE FULL
SETOM URDWR(C)
HRRZ A,UTBFP(D)
LDB B,[IOLO,,IOBFT(A)
HRRM B,UTBFP(D)
MOVEI J,(SETZ)
CAIL B,376
HRLM J,UTBFP(D)
UTRLD: HRRZ B,UTDBC(D) ;BUFFER IN A
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)
CPOPJ: POPJ P,
JDB6: PUSHJ P,JDB6W
JRST JDBRK7 ;SUCCESFUL RELOAD
JRST JDBRK4 ;CAN NOT RELOAD
UDRDD: MOVEI D,NUTIC+NUTOC
PUSHJ P,IUTCONS
JRST UDRDD1 ;NO MEM
LDB B,[IOSA,,IOBFT(A)
LSH B,6
TLO B,600000
MOVEM B,UDIRO(C)
HLLOS DCHNT(C)
CLEARM URDWR(C)
HRRM A,ULDCH(C)
JDB6W2: MOVEI B,100
JRST UDRR2
UDRDD1: SETOM MEMDSP ;SCROUNGE SOME MEM
JRST POPJ1
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 {cropped} CHANNEL IN D
UDIRR: MOVEI E,1 ;REV DIR PNTRS THIS WINS FOR READS ONLY HA HA
SKIPGE B,UDIRO(C)
JRST UDOUT3
UDOUT2: 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,ITAB(R)
TRNE J,-1 ;BLK NO RTN IN RH E
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:
POPJ2: AOS (P)
POPJ1: AOS(P)
POPJ P,
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 UDOUT2
UDOUT3: TLNN B,200000 ;DIRECTORY DOUBLE LOCKED
CAIL D,NUTIC
POPJ P,
JRST UDOUT2
UDOUT1: CLEARB A,B
PUSHJ P,UTLOOK
JUMPE B,POPJ1 ; FILE DIR FULL
LDB J,[300500,,UTDBC(D)
MOVEM J,1(B)
JRST UDOUT4
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)
HRLI Q,-23.
PUSH P,[1
UTLK2: CAMN A,(Q)
CAME B,1(Q)
AOJA Q,UTLK1
MOVE B,Q
POPAJ: POP P,A
POPJ P,
UTLK1: AOS(P)
AOBJN Q,UTLK2
MOVEI B,0
JRST POPAJ
ITAB: 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,
; T S UTAPE ROUTINES PI SERV
LUTCP=20 ;LENGTH UTC PDL
NUNITS==4
JDENB=40000
20MSEN=5000
;TABLE AREAS
DEFINE TAG A
IRPS B,,A
B=.-1
TERMIN
TERMIN
TAG ULCTM:, REPEAT NUNITS,-1 ;LAST TIME EUPOS RECOMPUTED
;IF DG2=0 OR -1 AND UDIR .NE. 0 THEN ACT POS =EUPOS+<TIME-ULCTM>*UDIR
TAG DRTM:, REPEAT NUNITS,SETZ-1 ; SETZ-1 => NO TIMING OP
;N => DEAD RECKON UNTIL T=N
TAG UDIR:, BLOCK NUNITS ;0=>STOP -1=>BACK 1=>FORW
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:, REPEAT NUNITS, BLKO DC, ;GOAL MEMADR-1
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 UDIRO:, REPEAT NUNITS,-1;ORIGIN 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
TAG ULDCH:, BLOCK NUNITS ;NUMBER OF LOADED CHANNEL LH,BUFFER NO OF DIR RH
;LH SIGN SET = LOW PRIORITY POSIT
TAG UFLAPF:, BLOCK NUNITS ;4.9 FLAPPING RQSTED OR IN PROGRESS
;4.8 RQ TO ABORT FLAPPING OPERATION
;4.7 DRIVE ACTUALLY ON THE WAY
;RH TIME TO STOP AFTER FLAP SHOULD HAVE TAKEN PLACE
SUNIT: 0 ;SELECTED UNIT OR 0
SUNITL: 0 ;SAME _ 3
SMODE: -1 ;-1 POSIT 0 DATA
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
UTTM5: 0 ;TAPE TO STOP FLAPPING
FLPUNT: 0
DCFREE: -1 ;-1 => DC FREE
UIDLE: -1 ;-1 UTAPES COMPLETELY IDLE
UTCPDP: -LUTCP,,UTCP-1
UTCP: BLOCK LUTCP
UTACS: BLOCK P-A+1
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
TAPE: 0
UTP1: 0 ;JRST PIPOS OR DATAI DC, OR JRST UTP3
SOS .-1
AOSGE TAPCNT
JRST 12,@TAPE
UTP3: CONO PI,1000+DCCHNA
SKIPN WRITE
CONO DC,DCCHN
JRST 12,@TAPE
PIPOS: MOVEM A,TAP1
MOVEM B,TAP2
MOVEM C,TAP3
MOVE C,SUNIT
DATAI DC,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: MOVE A,SUNITL ;HOLD DC
MOVE B,UDIR(C)
XCT UTST(B)
CONO DC,4010+DCCHN
PIPOS5: MOVE C,TAP3
MOVE B,TAP2
MOVE A,TAP1
JRST 12,@TAPE
PIPOS7: AOS BDBLKC
JRST PIPOSL
BDBLKC: 0
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)
CONO PI,1000+DCCHNA
CLEARM UDCC
SETOM DCFREE
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)
SKIPL ULDCH(C)
SKIPGE UTRAC(A)
JRST PIPOS3 ;CHANNEL LOCKED
SETOM UTLDD(A) ;CHANNEL ACTUALLY LOADED TRANSFERR IMMINENT
AOS SMODE
CLEARM UDCC
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)
SKIPGE B,URDWR(C)
CONO DC,3410+DCCHN
MOVEM B,WRITE
MOVE C,TAP3
MOVE B,TAP2
MOVE A,TAP1
JRST 12,@TAPE
TAPFOR: HRRM B,TAPCNT
HRRI B,TAPCNT
MOVEM B,40+DCCHN*2
MOVE B,[-200,,UTP3
HRRM B,UTP1
HLLM B,TAPCNT
JRST TAP4
UTERR: CONI UTS,E
SKIPL SMODE
JRST UDATER
SKIPGE UDCC
JRST UTER4
UTER5: SKIPN C,SUNIT
JRST 4,.
SETOM DG2(C)
MOVE B,UDIR(C)
TRZ E,7650
JUMPE E,JDB3
TRNN E,2
JRST UTER1
UTER2: 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)
UTER1: JRST UTER3 ;GIVE MAX DELAY
UDATER: SKIPGE DCFREE
JRST UDATE1
CONO PI,1000+DCCHNA
SETOM DCFREE
UDATE1: SETOM SMODE
HLRZ D,ULDCH(C)
CLEARM UTLDD(C)
JRST JDB3
UTER4: SETOM UDCC
SETOM DCFREE
JRST UTER5
UTCBRK: 0
MOVEM P,UTACS+P-A
MOVE P,[A,,UTACS
BLT P,UTACS+P-1-A
MOVE P,UTCPDP
MOVE C,SUNIT
CONSZ UTC,4000
CONSO UTS,20
JRST JDBRK
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
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
CLEARB A,B ;GOING WRONG DIR
UTDC2: ADD B,TIME
MOVEM B,DRTM(C)
POPJ P,
UTDC3: MOVEI B,0 ;NOT KNOWN EXACT POS REQUIRES IMMEDIATE ATTENTION
JRST UTDC2
JDBRK: CONSZ UTC,7
CONSO UTS,17
JRST POPRET ;NOT UTC
CONSZ UTS,16
JRST UTERR
JDBK1: SKIPL SMODE
JRST JDDTA ;DATA MODE
JUMPE C,JDB3
MOVE A,UDIR(C)
ADDM A,EUPOS(C)
MOVE A,TIME
MOVEM A,ULCTM(C)
PUSHJ P,UTDC ;COMPUTE DELAY
JDB3: 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
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: SKIPGE ULDCH(C)
CAIL B,10
JRST JDBRK6
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 IDLE
JRST JDB7
SKIPE SUNIT
JRST JDB7D
SETOM UIDLE
CONO UTC,0
JRST POPRET
JDF1: MOVE E,UDIRO(C)
AOJE E,JDF1A
TLNE E,100000
JRST JDF2
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
HRRZ D,B
TLNN B,100000
JRST .+3
CAMG D,TIME
HRRZM C,UTTM5 ;UNIT TO STOP FLAPPING
JRST JDBRK6
JDF3: MOVE C,D
HRRZ A,ULDCH(C)
AOSE UDIRO(C)
PUSHJ P,IBRTN
SETOM UDIRO(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
HRRM E,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: SKIPL DCFREE
JRST JDF6A
SKIPE SUNIT
CAMN C,SUNIT
JRST .+2
JRST JDB7D
SETOM UDIR(C)
MOVEM C,SUNIT
DPB C,[30300,,SUNITL
JRST JDF6B
JDF4: MOVE C,D
CLEARM UFLAPF(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,JDB7C ;OK TO LEAVE IT ALONG, CLEAR SELECTION CYCLE
JDB4: SKIPN UDIR(C)
JRST JDB7D
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
CLEARM UDIR(C)
HRLOI B,377777
MOVEM B,DRTM(C)
SETOM DG2(C)
JDF9: SETOM USTPF ;UNIT STOPPING CYCLE
JRST POPRET
USTPF: 0
STPUNT: 0 ;UNIT TO STOP DUE TO CONFLICT
JDB7C:
JDB7D: 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
SKIPL D,DG2(C)
CAIG E,3
JRST JDB3B
CAIGE E,20
JUMPE D,JDB3B ;GETTING CLOSE READ BLOCK NO
JDB3A: TRO A,JDENB
JDB8A: XCT UTST(B)
JRST POPRET
JDB3B:
DCGBL1: AOSE DCFREE
JRST JDB3A
DCGBL: XCT UTST(B)
CONO DC,4010+DCCHN
MOVE C,[JSR TAPE
MOVEM C,40+2*DCCHN
MOVEM C,40+2*DCCHN+1
MOVE C,[JRST PIPOS
MOVEM C,UTP1
SETOM UDCC
CONO PI,2000+DCCHNA
POPRET: MOVE A,TIME
MOVEM A,LUTOTM
MOVS P,[A,,UTACS
BLT P,P
JRST 12,@UTCBRK
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
TRO A,6000
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
;"SYSTEM" JOBS
SCOR: SKIPL SUPCOR
PUSHJ P,UFLS
PUSHJ P,SCOREX
CLEARM @SYSL
HRLZ A,SYSL
HRR A,SYSL
AOS A
MOVEI B,2000
ADD B,SYSL
BLT A,(B)
MOVEM B,SYSL
NMCU: CLEARM SUPCOR
JRST SCOR
SCOREX: MOVE B,SYSL
MOVEI U,0
LSH B,-10.
AOS B
PUSHJ P,ACORE
JRST NMCU
POPJ P,
SUBTTL RANDOM STORAGE
RADIX 10.
REPEAT SIOML,[CONC TRAN,\.RPCNT+1,: BLOCK SIOMT
] RADIX 8
U0: 0 ;TEMP STORAGE FOR FIRST LOW PRIORITY LOSER
PSAVE: 0
USER: -1 ;USER # OF CURRENT LOSER
CUSER: 0 ;USER OF CORE ALLOCATOR
DISUSR: -1 ;340 USER
USRHI: 0 ;HIGHEST LOC USED OF USER VARIABLE STORAGE
SYSL: SYSB*2000
SUPCOR: 0
SEAT1: 0
TIME: 0
CLKFL1: 0
CUQUAN: 0 ;CURRENT USER QUANTUM
CPDLP: -CPDLL,,LCPDL-1 ;CLOCK PDL POINTER
LCPDL: BLOCK CPDLL
ECPDL==.-5
SCRFLG: 0 ;CURRENT USER MUST BE INTERRUPTED, SAVE VARIABLES, MUNG AND RESTORE
SCRFG1: 0 ;LOSE LOSE LOSE LOSE LOSE LOSE LOSE LOSE LOSE LOSE LOSE LOSE
UTTYST: -1 ;-1 OR TTY THAT WANTS TO BE STARTED
CRACF: -1 ;CORE ALLOCATOR FLAG (ONLY 1 AT A TIME)
SIOMTU: SIOMT ;AMOUNT USED OF I-O MAPPING TABLE
SLCLK: 0 ;SLOW CLOCK
SRCS: 0 ;RECYCLE FLAG FOR SEARCH
CONSTANTS
VARIABLES
SYSB==1+._-10.+IFN .&1777,1
MXC==MX1KB-SYSB
USRSTG==.
IOCHNM: REPEAT 20,0 ;IO CHANNEL ASSIGN
;RH INDEX INTO IOTTB AND CLSTB
;LH DEV CHNL AND/OR OTHER
SIOCHN: BLOCK 21
SIOCP: SIOCHN
UPC: 0 ;USER PC STORAGE
AC0S: BLOCK 15 ;SWAP OUT AC S
AC15S: 0
AC16S: 0
AC17S: 0
UUO:
SUEXIT: JRST 2,@UUOH ;USER UUO EXIT INS
SURSTR: 0 ;LOC FOR NEW USER PC STORAGE AFTER UFLS
SUUOH: 0 ;C(@41)
SAC17P: MOVEM U,0 ;AC17 IN SHAD MEM
AC14P: 0 ;PNTS TO AC 14 IN SHAD MEM
AC15P: 0 ;" "" 15
AC16P: 0 ; " " "" 16
40P: 0
41P: 0
UPR: 0 ;USER PROTECTION AND RELOCATION REGISTERS
APRC: APRCHN ;CONO TO APR
UQUAN: 0 ;USER QUANTUM
USTP: 0 ;0 RUNNABLE
BCSTOP=400000 ;BIT IN USTP FOR CORE MOVAGE
BUCSTP=200000 ;CORE STOPPING LOSER TO GIVE MORE CORE RQSTED BY ANOTHER LOSER
BUSRC=100000 ;USER CONTROL INTERUPT TO SUPERIOR PROCEDURE
BEXC=40000 ;SET BY UBO AND FRIENDS INHIBITS RELOCATION BY CORE ALLOCATOR
;MUST BE SET WITH CLKOFF MUST NOT BE SET IF CSTOP IS SET
PIRQC: 0 ; PI REQ AWAITING SERVICE
SUPPRO: 0 ;SUPERIOR PROCEDURE RH,INT BIT LH
PICLR: 1 ;PI IN PROGRESS FLAG
MSKST: 0 ;PI MASK REGISTER FOR USER
FLSINS: 0 ;USER I-O WAIT INS
; STATES => 0 => RUNABLE
;= JRST =EXEC FLUSH
; OTHERWISE IN IO WAIT IF NO SKIP SAFE TO RESTART AT "UUO"
MEMTOP: 0 ;TOP OF USER MEM (UNREL) (-METOV)
RMEMT: 0 ;AFIRST USER LOC NOT AVAILABLE 2000 IF LOSER HAS 1 BLOCK
SV40: 0 ;C(40) WHEN USER SWAPPED
UNAME: 0 ;USER NAME
JNAME: 0 ;JOB NAME
TTYTBL: 0 ;TTY ASSIGNED THIS USER
;4.9 DOES NOT HAVE TTY NOW
;4.8 NEVER HAD IT
;4.7 TAKEN AWAY
;3.4 3.1 SAVED TTYSTS IF TAKEN AWAY OR GIVEN AWAY
;RH USER NO GAVE TTY AWAY TO OR TTY NO IF HAS IT OR
;TTY TAKEN FROM ME IF 400000
UILOOK: 0 ;POINTER TO USER CORE FROM SUPERIOR PROCEDURE (INPUT)
UOLOOK: 0 ;" (OUTPUT)
VALUE: 0 ;PROCEDURE "VALUE" RETURN
USRPDL: -LUPDL,,UPDL-1 ;USER PDL
UPDL: BLOCK LUPDL-3
EPDL: 0
EPDL1: 0
EPDL2: 0
LUBLK=.-USRSTG
L=LUBLK
END 69