TITLE BOJ JOB VERSIO==.FNAM2 A=1 B=2 C=3 D=4 E=5 TT=6 INT=7 ;FLAG FOR INTERRUPT, -1 INT HAPPENED Q=10 J=11 R=12 W=13 H=14 P=15 T=16 U=17 BOJIC==1 BOJOC==2 LSOC==3 NTIC==4 NTOC==5 OPTDDT==10000 ;.OPTION - SUPERIOR CLAIMS TO BE DDT (AND ALSO IS THERE AS A SUPERIOR) OPTOJB==2000 ;.OPTION - THIS JOB CLAIMS TO BE A DEBUGGING VERSION OF A "JOB" DEVICE LOC 42 JSR TSINT LOC 100 PAT: PATCH: BLOCK 100 GO: .SUSET [.ROPTION,,A] TLO A,OPTOJB TLNE A,OPTDDT .SUSET [.SOPTION,,A] ;IF SUPERIOR DDT, THEN SET "OJB" OPTION MOVE P,[-LPDLL-1,,PDL-1] .SUSET [.SMASK,,[200000,,20440]] ;IOCER, MPV, REALT AND ILLOP .SUSET [.SMSK2,,[1_LSOC+1_NTIC+1_NTOC]] .OPEN BOJOC,BOJO2 JSR LOSE .CALL JBGT ;GET INFO FOR ICP JSR LOSE MOVS A,WD6 ;GET "DEVICE" MOVEI B,0 ;FLAG IRP X,,[DM,AI,ML]Y,,[106,206,306] CAIN A,(SIXBIT /X/) MOVEI B,Y TERMIN JUMPE B,[JSR LOSE] IRPC A,,145 MOVEM B,NET!A+3 TERMIN SETOM JBGTN' ;FLAG INITIAL JOBGET DONE ICP: .OPEN LSOC,NET1 JRST NOGO SKIPL LSCINT .HANG SETZM LSCINT MOVE A,[LSOC,,RCH] .RCHST A, HRRE A,RCH+4 JUMPL A,ICP CAIN A,10 JRST ICP1 CAIE A,11 CAIN A,5 JRST ICP1 JRST NOGO ICPNTO: SKIPL NTOCIN JRST ICPWT SETZM NTOCIN SKIPN ICPDNE JRST NOGO MOVEI A,1 ANDCAM A,ICPDNE MOVE A,[NTOC,,RCH] JRST ICPIN1 ICP1: .SUSET [.SMSK2,,[1_NTIC+1_NTOC]] SETZM INT SETZM NTICIN SETZM NTOCIN MOVEI B,3 MOVEM B,ICPDNE MOVE B,RCH+1 ADDI B,2 MOVEM B,NET4+1 ADDI B,1 MOVEM B,NET5+1 .IOT LSOC,C MOVEM C,NET5+2 ADDI C,1 MOVEM C,NET4+2 .OPEN NTIC,NET4 JRST NOGO .OPEN NTOC,NET5 JRST NOGO .CLOSE LSOC, ICPWT: SKIPL INT .HANG SETZM INT ICPLP: SKIPL NTICIN JRST ICPNTO SETZM NTICIN SKIPN ICPDNE JRST NOGO MOVEI A,2 ANDCAM A,ICPDNE MOVE A,[NTIC,,RCH] ICPIN1: .RCHST A, HRRE A,RCH+4 JUMPL A,NOGO CAIE A,5 JRST NOGO SKIPE ICPDNE JRST ICPLP .SUSET [.SMSK2,,[1_BOJOC+1_NTIC+1_NTOC]] .SUSET [.SIFPIR,,[1_BOJOC]] ;COMMAND FORMAT: TO SLAVE ;AOBJN POINTER (RH = COMMAND CODE) ;BLOCK OF ARGUMENTS ;COMMAND CODES: ; 1 OPEN FOR INPUT ; ARG1: FN1 ; ARG2: FN2 ; ARG3: SNAME ; ARG4: OPEN MODE (IGNORED) ; ; 2 OPEN FOR OUTPUT ; ARG1: FN1 ; ARG2: FN2 ; ARG3: SNAME ; ARG4: OPEN MODE ; ; 3 WRITE DATA ; DATA ; ; 4 READ ALLOCATE ; ARG: ALLOCATION ; ; 5 INPUT CLOSE ; ARG: IGNORED ; ; 6 OUTPUT CLOSE ; ARG: IGNORED ; ; 7 .FDELE (DELETE OR RENAME) ; ARG1: FN1 ; ARG2: FN2 ; ARG3: 0 OR NEW FN1 ; ARG4: 0 OR NEW FN2 ; ARG5: SNAME ; ; 10 .FDELE (RENAME WHILE OPEN) ; ARG1: NEW FN1 ; ARG2: NEW FN2 NTCLTS==10 ;NUMBER OF LAST COMMAND TO SLAVE ;FROM SLAVE ;AOBJN POINTER (RH = COMMAND CODE) ;BLOCK OF ARGUMENTS ;COMMAND CODES: ; 1 DATA FOLLOWS ; DATA ; ; 2 INPUT OPEN STATUS ; -1 => SUCCEEDED ; >0 => OPEN LOSS NUMBER ; ; 3 OUTPUT OPEN STATUS ; -1 => SUCCEEDED ; >0 => OPEN LOSS NUMBER ; ; 4 EOF ON INPUT ; ARG: IGNORED ; ; 5 .FDELE STATUS ; RH: -1 => SUCCEEDED ; 0 => FAILED ; LH: -1 => DELETE OR RENAME ; 0 => RENAME WHILE OPEN NLCFS==5 ;NUMBER OF LAST COMMAND FROM SENDER GOL: .NETS NTOC, ;FORCE OUT NET OUTPUT SKIPL INT .HANG SETZM INT CAIA ;SKIP OVER .NETS GOLOOP: .NETS NTOC, SKIPL JBINT JRST NTINT SETZM JBINT TRYOV: SETZM RETOIN AOSG JBGTN ;-1 IF INITIAL, DONT DO AGAIN JRST .+3 .CALL JBGT JRST JBGTF LDB A,[370200,,WD1] JUMPN A,JCLS LDB A,[000400,,WD1] CAILE A,7 JRST JGNRL ; HANDLE A .CALL JRST @DISP(A) DISP: JOPEN JIOT JSTS JRESET JRCH JACC JFDEL1 JFDEL2 JBGTF: SKIPE INIT JRST GOLOOP JSR LOGOUT ;INITIAL JOBGET FAILED NOGO: MOVEI 30. .SLEEP ;SOMETIME LONG LOOP HERE .CALL JBGT JSR LOGOUT .CALL JBRTL JRST NOGO JSR LOGOUT JGNRL: JFCL JRESET: JFCL JRCH: JFCL JACC: JFCL JSTS: .CALL JBRTL JFCL JRST GOLOOP JCLS: TRZE A,1 JRST JOUCL JCLS1: TRZE A,2 JRST JINCL SKIPGE JINOP SKIPL JOUOP JRST GOLOOP JSR LOGOUT ;BOTH CLOSED JINCL: SETOM JINOP HRROI B,5 JRST JCLS2 JOUCL: SETOM JOUOP HRROI B,6 JCLS2: MOVE C,[-2,,B] .IOT NTOC,C JRST JCLS1 JOPEN: LDB A,[410100,,WD1] ;0 => INPUT 1 => OUTPUT SKIPGE D,JINOP(A) JRST JOPNC1 MOVE B,WD3 MOVE C,WD4 CAMN B,IFN1(A) CAME C,IFN2(A) JRST JOPNCL MOVE B,WD5 HRRZ TT,A CAMN B,ISYSN(A) JRST @JOPNDT(D) JOPNCL: HRROI B,5(A) MOVE D,[-2,,B] .IOT NTOC,D SETOM JINOP(A) JOPNC1: JUMPN A,JOPNC2 SETZM EOFI LDB B,[410300,,WD1] TRNE B,6 ;SKIP IF UNIT ASCII MODE TRO B,2 ;UNIT IMAGE OR BLOCK MOVE C,BUFIP MOVEM C,BUFP TRO B,11 HRLM B,BOJO2 .OPEN BOJOC,BOJO2 JSR LOSE JOPNC3: SETZM JINOP(A) MOVE B,WD3 MOVE C,WD4 MOVE D,WD5 LDB E,[410300,,WD1] MOVEM B,IFN1(A) MOVEM C,IFN2(A) MOVEM D,ISYSN(A) MOVE R,[-5,,A] ADDI A,1 HRLI A,-4 .IOT NTOC,R JRST GOLOOP JOPNC2: LDB B,[410300,,WD1] TRZ B,1 TRO B,10 HRLM B,BOJO1 .OPEN BOJIC,BOJO1 JSR LOSE JRST JOPNC3 JOPNDT: GOLOOP JOPJRT LOSE4 JIOT: MOVE A,WD1 TLNN A,100000 ;SKIP IF OUTPUT IOT JRST JIOTI TLNN A,200000 ;SKIP IF BLOCK IOT JRST JIOTO1 MOVE B,WD2 ;USER'S BLOCK IOT POINTER HLROS B MOVNS D,B ;# WORDS USER WANTS TO SEND JIOTO2: CAILE B,200 MOVEI B,200 ;SEND AT MOST 200 MOVNS C,B ;B,C => - # WORDS TO SEND THIS TIME ADD D,C ;D => REMAINING WORDS TO SEND HRLZS B HRRI B,IBUF .IOT BOJIC,B JUMPL B,JIOTOC ;USER PCLSRED AND DID AN OUTPUT CLOSE HRLZ A,C HRRI A,3 MOVEM A,HDR SUB A,[1,,] HRRI A,HDR .IOT NTOC,A JUMPE D,GOLOOP MOVE B,D JRST JIOTO2 JIOTOC: HLRO D,B SUB C,D ;C => - # WORDS ACTUALLY SEND JUMPE C,GOLOOP HRRI C,3 MOVEM C,HDR SUB C,[1,,] HRRI C,HDR .IOT NTOC,C JRST GOLOOP ;SHOULD DISCOVER THE CLOSE JIOTO1: .IOT BOJIC,B HRROI A,3 HRLZI C,-2 HRRI C,A .IOT NTOC,C JRST GOLOOP JIOTI: TLNN A,200000 ;SKIP IF BLOCK IOT JRST JIOTI3 MOVE B,WD2 ;USER'S BLOCK IOT POINTER HLRO C,B ;C => - # WORDS USER WANTS JIOTI1: MOVE D,INPALL ADD D,INREAL SUBI D,BUFL ;D => - # WORDS AVAILABLE JUMPE D,JIOTIS ;NO MORE INPUT AVAILABLE CAMGE D,C MOVE D,C MOVE E,BUFO SUBI E,EBUF ;E => - # WORDS TILL END OF BUFFER CAMGE D,E MOVE D,E ;TRANSFER MIN (IN ABS VAL) OF D,C AND E SUB C,D ;C => - # LEFT TO SEND MOVN E,D JUMPE D,LOSE5 HRLZS D HRR D,BUFO .IOT BOJOC,D JUMPL D,GOLOOP ;USER PCLSRED AND DID AN INPUT CLOSE (WILL FIND OUT LATER) CAIN D,EBUF MOVEI D,BUF MOVEM D,BUFO JIOTI5: ADDB E,INREAL JUMPL E,LOSE6 CAIGE E,BUFL/3 JRST JIOTI2 SETZM INREAL ADDM E,INPALL SKIPGE A,INPALL JSR LOSE CAILE A,BUFL JSR LOSE HRROI D,4 ;READ ALLOCATE MOVE A,[-2,,D] .IOT NTOC,A ;REALLOCATE JIOTI2: JUMPL C,JIOTI1 JRST GOLOOP JIOTIS: SKIPGE EOFI JRST JIOTIE SETOM RETOIN JRST GOLOOP JIOTIE: .CALL JBRTL JRST TRYOV JRST GOLOOP JIOTI3: TLNN A,400000 ;SKIP IF IMAGE INPUT JRST JIOTI4 MOVNI C,1 JRST JIOTI1 JIOTI4: MOVE D,INPALL ADD D,INREAL ;ROOM IN BUFFER CAIL D,BUFL JRST JIOTIS ;BUF EMPTY, WAIT FOR MORE STUFF ILDB D,BUFP .IOT BOJOC,D MOVE D,BUFP CAMN D,BUFEP SUBI D,BUFL MOVEM D,BUFP TLNE D,760000 JRST GOLOOP MOVEI E,1 MOVEI C,0 JRST JIOTI5 JFDEL1: SKIPL FDEL1S JRST GOLOOP MOVE A,WD2 MOVEM A,FSNAM MOVEM A,DELBLK+3 SKIPE A MOVE A,WD7 MOVEM A,DELBLK+4 MOVE A,WD5 MOVEM A,DELBLK+5 MOVE A,WD3 MOVEM A,DELBLK+1 MOVE A,WD4 MOVEM A,DELBLK+2 MOVE A,[-6,,DELBLK] .IOT NTOC,A SETZM FDEL1S JRST GOLOOP JFDEL2: SKIPL FDEL2S JRST GOLOOP MOVE A,WD2 MOVEM A,DELBL2+1 MOVE A,WD7 MOVEM A,DELBL2+2 MOVE A,[-3,,DELBL2] .IOT NTOC,A SETZM FDEL2S JRST GOLOOP NTINT: MOVE A,[NTIC,,RCH] .RCHST A, HRRE A,RCH+4 JUMPL A,NTIOC CAIE A,11 CAIN A,10 JRST NTINT1 CAIN A,5 JRST NTOINT NTIOC: .CALL JBIOC ;GIVE USER IO CHANNEL ERROR JFCL JSR LOGOUT ;AND FLUSH NTINT1: HRROI A,B .IOT NTIC,A HRRZ A,B ;COMMAND CAILE A,NLCFS JSR LOSE JRST @CMDTB(A) CMDTB: LOSE1 NTDI OPNSI OPNSO EOF FDELST NTDI: HLRO A,B ;A => - # WORDS TO BE READ MOVN C,A ;C => NUMBER OF WORDS TO BE READ IN JUMPGE A,LOSE8 ADDB A,INPALL ;DECREASE ALLOCATION JUMPL A,LOSE2 CAILE A,BUFL JSR LOSE NTDI2: MOVEI A,EBUF SUB A,BUFI ;A => ROOM TILL END OF BUFFER CAMLE A,C MOVE A,C ;TRANSFER MIN OF A AND C SUB C,A ;C => REMAINING # WORDS TO READ MOVNS A HRLZS A HRR A,BUFI .IOT NTIC,A JUMPL A,LOSE3 CAIN A,EBUF MOVEI A,BUF MOVEM A,BUFI JUMPG C,NTDI2 JUMPL C,LOSE7 SKIPL RETOIN JRST GOLOOP SETZM RETOIN JRST JIOT NTOINT: SKIPL NTOCIN JRST GOL JSR LOSE OPNSI: TDZA TT,TT OPNSO: MOVEI TT,1 HRRI B,A .IOT NTIC,B JUMPG A,OPNIL SKIPE JINOP(TT) JSR LOSE AOS JINOP(TT) JOPJRT: .CALL JBRT1 JRST JBRTF AOS JINOP(TT) SETOM INIT MOVSI B,(SETZ) .REALT B, JFCL JUMPG TT,GOLOOP MOVEI B,BUFL MOVEM B,INPALL HRROI A,4 ;READ ALLOCATE MOVE C,[-2,,A] .IOT NTOC,C JRST GOLOOP OPNIL: SETOM JINOP(TT) HRLZS A .CALL JBRT3 JRST TRYOV SKIPL INIT JSR LOGOUT JRST GOLOOP JBRTF: SKIPGE INIT JRST TRYOV MOVE A,[600000,,[5*60.]] .REALT A, ;INITIAL JOBRET FAILED JFCL JRST TRYOV EOF: SETOM EOFI HRROI A,B .IOT NTIC,A SKIPL RETOIN JRST GOLOOP SETZM RETOIN JRST JIOTIE FDELST: HRROI A,B .IOT NTIC,A MOVEI C,0 SKIPL B MOVEI C,1 ;RENAME WHILE OPEN TRNN B,-1 JRST FDLST1 ;FAILED SKIPE FDEL1S(C) JSR LOSE AOS FDEL1S(C) .CALL JBRT1 JRST TRYOV SKIPL INIT JSR LOGOUT SETOM FDEL1S(C) JRST GOLOOP FDLST1: SETOM FDEL1S(C) .CALL JBRTL JRST TRYOV SKIPL INIT JSR LOGOUT JRST GOLOOP TSINT: 0 0 SKIPL U,TSINT JRST TSFW TRNN U,1_BOJOC+1_LSOC+1_NTIC+1_NTOC JSR LOSE SETOM INT TRZE U,1_BOJOC SETOM JBINT TRZE U,1_LSOC SETOM LSCINT TRZE U,1_NTIC SETOM NTICIN TRZE U,1_NTOC SETOM NTOCIN TRZ U,1_BOJIC CAME U,[SETZ] JSR LOSE .DISMISS TSINT+1 TSFW: TLNE U,200000 JSR LOGOUT TRNN U,400 ;IOCER JSR LOSE .SUSET [.RBCHN,,U] CAIE U,LSOC JSR LOSE JRST NOGO LOSE: 0 .VALUE ; DIE FOR DEBUGGING LOSE1: JSR LOSE LOSE2: JSR LOSE LOSE3: JSR LOSE LOSE4: JSR LOSE LOSE5: JSR LOSE LOSE6: JSR LOSE LOSE7: JSR LOSE LOSE8: JSR LOSE LOGOUT: 0 .LOGOUT .VALUE BUFL==2000 BUF: BLOCK BUFL EBUF==. BUFI: BUF BUFO: BUF BUFP: 010700,,BUF-1 BUFIP: 010700,,BUF-1 BUFEP: 010700,,BUF+BUFL-1 HDR: 0 IBUF: BLOCK 200 BOJO1: 16,,(SIXBIT /BOJ/) BOJO2: 17,,(SIXBIT /BOJ/) NET1: 40054,,(SIXBIT /NET/) -1 197. 0 ;FILLED IN HOST NUMBER NET4: 44046,,(SIXBIT /NET/) -1 -1 0 ;FILLED IN NET5: 44047,,(SIXBIT /NET/) -1 -1 0 ;FILLED IN JBGT: SETZ SIXBIT /JOBGET/ [BOJOC] 2000,,WD1 2000,,WD2 2000,,WD3 2000,,WD4 2000,,WD5 2000,,WD6 402000,,WD7 JBRT1: SETZ SIXBIT /JOBRET/ [BOJOC] SETZ [1] JBRTL: SETZ SIXBIT /JOBRET/ [BOJOC] SETZ [0] JBRT3: SETZ SIXBIT /JOBRET/ [BOJOC] SETZ A JBIOC: SETZ SIXBIT /SETIOC/ 1000,,BOJOC 401000,,1 WD1: 0 WD2: 0 WD3: 0 WD4: 0 WD5: 0 WD6: 0 WD7: 0 FSNAM: 0 DELBLK: -5,,7 ; BLOCK USED FOR SENDING FDELES BLOCK 5 DELBL2: -2,,10 BLOCK 2 JINOP: -1 ;-1 => INPUT CLOSED 0 => HAVE BEGUN OPEN 1 => HAS SUCCEEDED 2 => HAS DONE JOBRET JOUOP: -1 FDEL1S: -1 ;-1 => INIT STATE OR JOBRET DONE 0 => SENT FDELE 1 => HAS SUCCEEDED FDEL2S: -1 IFN1: 0 OFN1: 0 IFN2: 0 OFN2: 0 ISYSN: 0 OSYSN: 0 IDEV: 0 ODEV: 0 RCH: BLOCK 10 INIT: 0 ;-1 => HAVE DONE SUCCESSFUL JOBRET INPALL: 0 ;INPUT ALLOCATION INREAL: 0 ;AMOUNT TO REALLOCATE ICPDNE: 3 ;0 => ICP DONE EOFI: 0 ;-1 => HAVE REACHED EOF ON INPUT RETOIN: 0 ;-1 => RETURN TO USER INPUT SERVICER JBINT: 0 ;-1 => BOJ CHNL INT LSCINT: 0 ;-1 => LOGGER SOCKET INT NTICIN: 0 ;-1 => NTIC INT NTOCIN: 0 ;-1 => NTOC INT LPDLL==20 PDL: BLOCK LPDLL END GO