.MCALL .MODULE .MODULE BA,VERSION=14,COMMENT=,AUDIT=YES ; Copyright (c) 1998 by Mentec, Inc., Nashua, NH. ; All rights reserved ; ; This software is furnished under a license for use only on a ; single computer system and may be copied only with the ; inclusion of the above copyright notice. This software, or ; any other copies thereof, may not be provided or otherwise ; made available to any other person except for use on such ; system and to one who agrees to these license terms. Title ; to and ownership of the software shall at all times remain ; in Mentec, Inc. ; ; The information in this document is subject to change without ; notice and should not be construed as a commitment by Digital ; Equipment Corporation, or Mentec, Inc. ; ; Digital and Mentec assume no responsibility for the use or ; reliability of its software on equipment which is not supplied ; by Digital or Mentec, and listed in the Software Product ; Description. ; ; Edit Who Date Description of modification ; ---- --- ---- --------------------------- ; 001 WLD 02-JAN-1991 Removed references to FBMON$ ; and special code for the RT-11 ; v5.5 Single Job Monitor. ; 002 WFG 19-APR-1991 ACTION #7447 - BIC BEXIT at ; BAT00: to send all log msgs to CTY: ;-- .SBTTL CONDITIONAL ASSEMBLY SUMMARY ;+ ;COND ; BATSTK (=0) select stack to use ; 0 use user stack ; n use internal stack of size n ; ; MMG$T std conditional ; TIM$T std conditional (no code effects) ; ERL$G std conditional (no code effects) ;- .SBTTL CONTROL CHARACTER DEFINITIONS ;+ ; ; FILE GENERATED BY THE BATCH COMPILER (OR TECO IF YOU DESIRE) ; BATCH HAS SEVERAL CONTROLLING COMMANDS, THESE COMMANDS ARE NOT RELATED ; TO ANYTHING IN THE DEC BATCH STANDARD, ANY RESEMBLANCE IS PURELY ; COINCIDENTAL. THE BATCH COMPILER WILL TRANSLATE THE DEC BATCH STANDARD ; (LEVEL1) INTO RT-11 BATCH RUNTIME HANDLER FORMAT. ; ALL DIRECTIVES IN THE SPECIAL INPUT FORMAT ARE PRECEEDED BY A BACKSLASH. ; IF A BACKSLASH MUST BE PASSED TWO ADJACENT BACKSLASHES WILL PASS ONE. ; ; SINGLE CHARACTER DIRECTIVES: ; "\@" ROUTE THE FOLLOWING CHARACTERS TO THE CTY: ; "\A" CHANGE THE INPUT SOURCE TO THE CTY: ; "\B" CHANGE THE INPUT SOURCE TO THE BATCH STREAM ; "\C" ROUTE THE FOLLOWING CHARACTERS TO THE LOG ; "\D" THE FOLLOWING CHARACTERS ARE USER DATA ; "\E" THE FOLLOWING CHARACTERS ARE TO BE EXECUTED BY THE KMON. ; "\FN" N=0, FORCE THE JOB TO ABORT ; N=1, OUTPUT CURRENT LOG BUFFER AND EXIT ; "\G" GET FROM CTY EXCLUDING C.R. ; "\HN" HELP, N=0, LOG ONLY .TTYOUT, .PRINT ; N=1, LOG .TTYOUT, .PRINT, .TTYIN ; N=2, NO LOGGING OF .TTYOUT, .TTYIN, .PRINT ; N=3, LOG .TTYIN ; IN ALL CASES ABOVE ALL MESSAGES (\C) ARE NOT AFFECTED ; "\IVALEG" IF DIRECTIVE ; V=A-Z, VARIABLE FOR COMPARISON ; A=0-377, ARGUMENT FOR COMPARISON ; L,E,G=STRINGS OF SIX CHARACTERS PLUS A "0" OR "1" EACH ; TRANSFER WILL GO TO LABEL L IF THE EXPRESSION (R-V) IS <0 ; IF THE CHARACTER FOLLOWING L="0" THEN THIS INDICATES ; THAT THE LABEL IS A BACKWARD REFERENCE. IF THE CHARACTER FOLLOWING ; L="1" THEN THIS INDICATES THAT THE LABEL IS A FOREWARD REFERENCE. ; E,G ARE LABELS TO GOTO FOR THE EXPRESSION (R-V) =,>0. THEY ARE ALSO ; FOLLOWED BY A "0" OR "1" ; "\JL" UNCONDITIONAL JUMP TO LABEL L ; "\KVF(D)" 'KONSTANT' V = VARIABLE (A-Z), F = FUNCTION ; F = 0, INCRIMENT VARIABLE V ; F = 1, MOVE DATA BYTE D INTO VARIABLE V ; F = 2, RETURN VALUE OF VARIABLE V TO .TTYIN CALL ; "\L" LABEL, NEXT SIX BYTES ARE A LABEL ANY MORE CHARACTERS ARE IGNORED. ; ; The .TTYIN, .TTYOUT, .PRINT AND .EXIT EMTs will point to ; FB$TIN, FB$TOT, FB$PRN and FB$EXT. ; O$TIN, O$TOT, O$PRN AND O$EXT have the real pointers to the monitor EMTs ;- .SBTTL DEFINITIONS .MCALL .DRDEF .ASSUME .ADDR .DRDEF BA,4,0,0,0,0,DMA=NO .IF NE MMG$T .DRPTR FETCH=*NO*,LOAD=LOAD,UNLOAD=UNLOAD .IFF .DRPTR FETCH=*NO*,UNLOAD=UNLOAD .ENDC ;NE MMG$T .DREST CLASS=DVC.TT ;Really? ; System communications area JSW = 44 ;JOB STATUS WORD ERRWRD = 52 ;RT-11 ERROR WORD LOCATION USERRB = 53 ;USER PROGRAM ERROR STATUS BYTE SUCCS$ = 1 ;Success WARN$ = 2 ;Warning ERROR$ = 4 ;Error FATAL$ = 10 ;Fatal UNCON$ = 20 ;Unconditional SYSPTR = 54 ;POINTER TO SYSTEM ; RMON fixed offsets CONFIG = 300 ;DISPLACEMENT OFF OF 54 TO WORD WITH MONITOR TYPE EMT16 = 316 ;DISPLACEMENT OFF OF 54 TO DISPLACEMENT OFF OF ;54 TO THE EMT 16 TABLE. CONTXT = 320 ;POINTER IN FBMON TO JSTATE JOBNUM = 322 ;IF F/B IS RUNNING THIS IS THE DISPLACEMENT ;BC2+ ;FROM BEGINNING OF RMON OF THE LOCATION WITH ;THE JOB NUMBER. ;BC2- MONCOM = 356 ;MONITOR COMMUNICATION BYTE COMREG = 7 ;COMMUNICATION REGISTER INBSIZ = 400 ;INPUT BUFFER SIZE OUBSIZ = 400 ;OUTPUT BUFFER SIZE BATSTK = 0 ;SIZE OF BATCH STACK. IF ZERO USE USERS STACK. LABSIZ = 6 ;NUMBER OF CHARACTERS PER LABEL TCBIT$ = 100 EMTRTN = 400 ;MONITOR FIXED OFFSET FOR RTN FROM EMT ;BC1 STATWD = 366 ;MONITOR FIXED OFFSET FOR DCLS/@FILE STATE WORD ;BC3 IFBEXT = 40 ;BIT IN STATWD TO SAY BATCH IS FORCING AN EXIT ;BC3 ; AFTER ERROR IN JOB. ;BC3 $P1EXT = 432 ;RMON fixed offset to P1EXT pointer $CJVPT = -26. ;P1EXT offset to JOBREL entry point KISAR1 = 172342 ;002 PS = 177776 BADSIZ = 0 ;**-1 PNAME = ^RBA ;.RAD50 /BA / ;MG01 BASTS = 4 .SBTTL MACRO DEFINITIONS .MACRO ADDR ADDRESS,REG MOV PC,REG ADD #ADDRESS-.,REG .ENDM ADDR .MACRO LINK1 N,OLD ;LINK HANDLER TO MONITOR MOV N*2(R1),R2 ADD R1,R2 ADDR OLD,R3 SUB R3,R2 MOV R2,OLD .ENDM LINK1 .MACRO LINK2 N,LABLE ;LINK MONITOR TO HANDLER ADDR LABLE,R3 SUB R1,R3 MOV R3,N*2(R1) .ENDM LINK2 .IF NE BATSTK .MACRO SAVSTK MOV SP,SPSAVE ADDR SPSAVE,R4 MOV R4,SP ;DON'T "ADDR SPSAVE,SP" *** .ENDM SAVSTK .MACRO RESSTK MOV SPSAVE,SP .ENDM RESSTK .ENDC ;NE BATSTK .MACRO SAVE,A0,A1,A2,A3,A4,A5 .IRP X, .IIF NB ,MOV X,-(SP) .ENDR .ENDM SAVE .MACRO RESTOR,A0,A1,A2,A3,A4,A5 .IRP X, .IIF NB ,MOV (SP)+,X .ENDR .ENDM RESTOR .SBTTL LOAD/UNLOAD entry points .ASECT .=410 .ENABL LSB .IF NE MMG$T LOAD: MOV @R5,R5 ;R5 -> BALQE MOV @#SYSPTR,R1 ;R1 -> $RMON MOV $P1EXT(R1),R1 ;R1 -> P1EXT ADD #$CJVPT,R1 ;R1 -> JOBREL entry point MOV R1,(R5) ;Hook resident BA handler .ENDC ;NE MMG$T 1$: TST (PC)+ ;CLEAR CARRY, NO ERROR 2$: SEC ;ERROR INDICATION RETURN UNLOAD: ;CHECK TO SEE IF WE CAN BE UNLOADED MOV @#SYSPTR,R1 ;POINT TO RMON MOV EMT16(R1),R2 ;POINT TO POINTER TO EMT 16 TABLE ADD R1,R2 ;POINTER TO EMT 16 TABLE IN R2 MOV #FB$TIN-BABASE,R3 ;ASSUME WE'RE UNDER FB/XM/ZM ADD @R5,R3 ;R3 -> [F]B$TIN routine in BA ADD @R2,R2 ;R2 -> T$TIN routine from LST16 list CMP R2,R3 ;Are they the same? BNE 1$ ;Nope, BA not hooked to monitor... BISB #ERROR$,@#USERRB ;Yes, can't unload until unhooked ;+ ;ERROR .ADDR #NOUNLO,R0 ; so report an error BR 2$ NOUNLO: .NLCSI TYPE=I,PART=PREFIX .ASCIZ "E-Must 'R BATCH', type '/U'" ;- .EVEN .DSABL LSB .SBTTL Handler entry point .DRBEG BA,0,BADSIZ,BASTS BABASE=:BASTRT+6 BA: BR BA0 ;***** BATSW1 MUST BE HERE BATSW$ =:10 BATSW1: .WORD 0 ;BATCH HANDLER SWITCH 1 .ASSUME BATSW1 EQ BABASE+BATSW$ ;If this changes also change ;BATSW$ in EDTGBL and BATCH SOURCE = 4 ;IF 1 GET A CHARACTER THROUGH ;THE BATCH HANDLER. IF 0 LET ;THE EMT GO TO THE MONITER BSOURC = 40000 ;IF 1 INPUT COMES FROM THE ;BATCH STREAM. IF 0 INPUT COMES ;FROM THE CTY:. NOTTY = 400 ;DON'T ALLOW TELETYPE OUTPUT IN LOG ;******* NOTTY MUST BE 400 ******* DESTON = 2 ;IF 1 OUTPUT TO BATCH ;IF 0 OUTPUT TO RMON. BDESTN = 100 ;IF 1 BATCH LOG IS OUTPUT ;IF 0 CTY: IS OUTPUT. DATA = 40 ;IF 1 CHARACTERS FOLLOWING ARE ;USER DATA. IF 0 KMON. ACTIVE = 20 ;CTY IS ACTIVE. COMWAT = 10 ;A COMMAND IS WAITING BEXIT = 100000 ;AN EXIT WAS SEEN WHILE DATA MODE SET BGET = 200 ;"\G" MODE HELP = 1 ;HELP MODE ;******* HELP MUST BE 1 ******* BA0: MOV BACQE,R0 BRINIT: BR INIT INIT: BR INIT1 ;*** BECOMES ->BATSW1 AFTER INIT INIT2: ADDR CHAIN,R1 ;RETURN ARGUMENT POINTERS TO BATCH MOV Q.BUFF-Q.BLKN(R0),R2 ;BUFFER TO PASS ARGS .IF NE MMG$T MOV @#KISAR1,-(SP) ;SAVE KERNEL PAR1 MOV Q.MEM-Q.BLKN(R0),@#KISAR1 ;SET UP PAR1 .IFTF 1$: MOV (R1)+,(R2)+ BPL 1$ .IFT MOV (SP)+,@#KISAR1 ;RESTORE KERNEL PAR1 .ENDC ;NE MMG$T BATDON: .DRFIN BA ;GO TO I/O COMPLETION .IF NE BATSTK .BLKW BATSTK ;STACK SPACE SPSAVE: .WORD 0 ;OLD STACK POINTER .ENDC ;NE BATSTK INPBUF: ;INPUT BUFFER INIT1: MOV R0,-(SP) ;INITIALIZE **** ONCE ONLY CODE **** ADDR BATSW1,R0 MOV R0,INIT ;->BATSW1 IN A CONVENIENT PLACE INC BRINIT ;SO WE DON'T GET CALLED AGAIN ADDR INPBUF,R0 MOV R0,INBUFF ;POINTER TO INPUT BUFFER ADD #OUTBUF-INPBUF,R0 MOV R0,OBUFF ;POINTER TO OUTPUT BUFFER MOV @#SYSPTR,R0 MOV EMT16(R0),R1 ;POINT TO POINTER TO EMT 16 TABLE ADD R0,R1 ;POINTER TO EMT 16 TABLE IN R1 LINK1 0,O$TIN ;LINK HANDLER TO MONITOR (.TTYIN) LINK1 1,O$TOT ;(.TTYOUT) LINK1 10,O$EXT ;(.EXIT) LINK1 11,O$PRN ;(.PRINT) FGBGMN: MOV @#SYSPTR,R0 MOV CONTXT(R0),JSTATE ;SET UP STATE TO POINT TO WORD ; WITH ADDRESS CHECKING BITS LINK2 0,FB$TIN ;FGBG MON LINK2 1,FB$TOT LINK2 10,FB$EXT LINK2 11,FB$PRN MOV (SP)+,R0 JMP INIT2 OUTBUF = INBSIZ*2+INPBUF . = INPBUF+INBSIZ+INBSIZ+OUBSIZ+OUBSIZ .SBTTL BTTI BTTI: JSR PC,GETCHR ;GET A CHARACTER BTTIS: CMPB #'\,R0 ;IS IT A BACKSLASH? ;001 BEQ 2$ ;YES, BACKSLASH GETS SPECIAL TRE 1$: TST (R4) ;CHECK FOR "EXIT" MODE BMI 3$ RTS PC 3$: TST (SP)+ JMP BAT03B 2$: JSR PC,GETCHR ;CHECK THE CHAR AFTER THE "\" CMPB #'\,R0 ;001 BEQ 1$ ;FOR TWO BACKSLASHS YOU GET ONE. INC R0 ;***** KEEP BIC AND ASL TOGETHER **** BIC (PC),R0 ASL R0 ;*2+2 ;********** TST (SP)+ ;WIPE OUT THE JSR CMP #TABSIZ,R0 ;IS IT IN RANGE? BLT ABORT ;NO, SOMETHING IS WRONG VERY WRONG ADD PC,R0 ;POINT INTO TABLE ADD (R0),PC ;DO JUMP TO ADDRESS OF FUNCTION BATTBL: .WORD BAT00-BATTBL ;"\@" .WORD BAT01-BATTBL ;"\A" .WORD BAT02-BATTBL ;"\B" .WORD BAT03-BATTBL ;"\C" .WORD BAT04-BATTBL ;"\D" .WORD BAT05-BATTBL ;"\E" .WORD BAT06-BATTBL ;"\F" .WORD BAT07-BATTBL ;"\G" .WORD BAT08-BATTBL ;"\H" .WORD BAT09-BATTBL ;"\I" .WORD BAT10-BATTBL ;"\J" .WORD BAT11-BATTBL ;"\K" .WORD BAT12-BATTBL ;"\L" TABSIZ = .-BATTBL .SBTTL I,J,K, AND L DIRECTIVES ;+ ; ; GETREG POINTS R2 TO THE BATCH INTERNAL VARIABLE ; WHICH IS BEING REFERENCED BY A \K OR \I DIRECTIVE. THE 26 BATCH ; VARIABLES ARE RESIDENT IN THE HANDLER AT BATREG AND ARE REFERENCED ; BY THE LETTERS A - Z. NOTE THAT A PSEUDO-VARIABLE IS AVAILABLE ; THAT IS LOCATED AT THE FIXED OFFSET MONCOM INTO THE RT-11 RESIDENT. ; THIS VARIABLE CAN BE REFERENCED BY USING AN @ AS THE VARIABLE ; NAME. THE @ VARIABLE WILL BE SET BY FUTURE VERSIONS OF THE RT-11 CUSPS ; TO INDICATE WHETHER AN ERROR OCCURRED DURING EXECUTION. THIS WILL ; PERMIT PARTS OF A BATCH STREAM TO BE BY-PASSED IF ERRORS OCCURRED. ; ;- GETREG: JSR PC,GETCHR ;REGISTER NUMBER ;BC5 MOV @#SYSPTR,R2 ;INITIALIZE TO MONCOM ADD #MONCOM,R2 BIC #177740,R0 ;SELF PRESERVATION BEQ JGTBAT ;SAVE CODE AND FETCH NEXT CHAR 1$: ADDR BATREG-1,R2 ADD R0,R2 ;R2 POINTES TO BYTE REGISTER 2$: BR JGTBAT ;SAVE SOME CODE AND FETCH ; THE NEXT CHAR ; \I PROCESSING -- IF STATEMENT BAT09: JSR PC,GETREG ;GET REGISTER AND VALUE CMPB (R2),R0 ;COMPARE REG WITH VALUE BLT BAT10 ;REG'?BA-U-' PREFIX 1$: MOVB (R2)+,R0 ;GET A CHARACTER OF THE MESSAGE BEQ 2$ ;IF END...DO SUFFIX... JSR PC,PUTCTY ;OTHERWISE...PRINT THE CHARACTER BR 1$ ;AND DO ANOTHER 2$: MOV (SP)+,R2 ;RESTORE R2 BISB #,@#USERRB ;SET ERROR SEVERITY JSR PC,PUTCT2 BR J$EXT BAMSG: .NLCSI TYPE=I,PART=PREFIX .ASCIZ /U-/ .EVEN ;MG01 ;- .SBTTL \@ AND \E DIRECTIVES BAT05: BIC #DATA+BGET,(R4) ;"\E", THE FOLLOWING IS FOR KMON ; TST (R4) ;BEXIT? (NOTE BIC RETURNS ; CONDITIONS ON THE RESULT OF (R4) ) BPL BAT05B ;NO BR$EX0: MOV (SP)+,R0 ;RESTORE R0 BR$EX1: BIC #BEXIT,(R4) BR J$EXT BAT05B: BIT #ACTIVE,(R4) ;SECOND TIME THROUGH? BNE BR$EX1 ;YES, COMPLETE THE EXIT JSR PC,GETCTY ;FIRST CHECK TO SEE IF ANYTHING TYPED BCS J$EXT ;NO, GO DO THE EXIT BIC #BSOURC+BDESTN,(R4) ;OPERATOR MUST TYPE PROPER COMMAND BIS #ACTIVE,(R4) ;CTY: ACTIVE BIT JSR PC,BTTIS ;PASS UP THE GETCHR BAT00: BIC #BGET!BEXIT,(R4) 1$: JSR PC,BTTI ;ROUT ALL OUTPUT CHARACTERS TO THE CTY JSR PC,PUTCTY ;OUTPUT TO THE CTY: BR 1$ .SBTTL \A AND \G DIRECTIVES BAT07: BIS #BGET,(R4) ;"\G" GET FROM CTY: EXCLUDING C.R. BMI BAT00 ;SKIP IF BEXIT MODE BAT01: TST (R4) ;IF IN BEXIT MODE BMI BAT00 ;IGNORE THE \A BIC #BSOURC+BDESTN,(R4) ;GET INPUT FROM CTY:. BR B$TIN2 B$TIN: MOV INIT,R4 ;R4 POINTS TO BATSW1 B$TIN1: BIT #SOURCE,(R4) BEQ J$TIN ;PASS THIS ON TO THE RMON EMT .IF NE BATSTK SAVSTK ;SAVE THE STACK POINTER .ENDC ;NE BATSTK B$TIN2: JSR PC,BTTI ;GET A CHARACTER CMPB #15,R0 ;C.R.? ;001 BNE B$TIN3 ;NO TSTB (R4) ;"\G" MODE? BMI BAT02 ;YES, FORCE A "\B" B$TIN3: BIT #HELP,(R4) ;HELP MODE? BEQ BATRT0 ;NO, DON'T ECHO INPUT BIT #10000,@#JSW ;SPECIAL MODE? BNE BATRT0 ;YES, LET PROGRAM ECHO JSR PC,PUTCHR ;NO, PUT IT INTO THE LOG BATRT0: .IF EQ BATSTK MOV R0,(SP) .IFF MOV R0,@SPSAVE .ENDC ;EQ BATSTK BATRTI: .IF NE BATSTK RESSTK ;RESTORE THE STACK POINTER .ENDC ;NE BATSTK CLR R2 ;SO NO ARG"S POPPED FROM STACK ;BC2 ; AT POPREG ;BC2 MOV @#SYSPTR,R0 ;POINT TO RMON ;BC1 ADD EMTRTN(R0),R0 ;POINT TO EMT RTN ;BC1 JMP (R0) ;GO EXIT FROM EMT TO USER ;BC1 FB$EXT: JSR PC,JNUMCK ;CHECK WHICH JOB IS EXITING ;BC2 BEQ B$EXT ;IF EQ, ITS BG J$EXT: ADD (PC),PC O$EXT: .-. B$TOT: MOV INIT,R4 ;R4 POINTS TO BATSW1 BIT #DESTON,(R4) BEQ J$TOT .IF NE BATSTK SAVSTK ;SWITCH STACKS TO BATCH'S STACK .ENDC ;NE BATSTK B$TOT2: BIT #NOTTY,(R4) BNE BATRTI ;DON'T LET ANY CHARACTERS GET ; TO THE LOG JSR PC,PUTBAT BARTI1: BR BATRTI .SBTTL \B AND \C DIRECTIVES BAT02: TST (R4) ;IF IN BEXIT MODE BMI BAT03A ;SKIP THE \B JSR PC,GETCTY ;LETS PURGE THE INPUT BUFFER BCC BAT02 BIS #BSOURC+BDESTN,(R4) ;"\B", CHANGE INPUT TO BATCH BIC #ACTIVE+BGET,(R4) BR B$TIN2 B$EXT: MOV INIT,R4 ;R4 POINTS TO BATSW1 BIT #ACTIVE,(R4) BEQ 1$ ;?EXIT DURING .TTYIN? BIS #SOURCE+DESTON,(R4) ;YES, RESET FLAGS 1$: BIT #DATA,(R4) ;CLEAR ANY DATA THAT REMAINS BEQ J$EXT ;DO .EXIT .IF NE BATSTK SAVSTK .ENDC ;NE BATSTK MOV R0,-(SP) BIS #BEXIT,(R4) ;SET EXIT ON DATA MODE SWITCH MOV @#SYSPTR,R0 ;POINT TO RMON ;BC3 BIS #IFBEXT,STATWD(R0) ;SET FLAG, WE'RE FORCING AN EXIT;BC3 BAT03: BIS #BDESTN,(R4) ;"\C"...ROUTE FOLLOWING ; CHARACTERS TO LOG BAT03A: JSR PC,BTTI BAT03B: JSR PC,PUTCHR BR BAT03A ;THIS WILL ECHO THE CHARACTERS ; ON THE LOG .SBTTL \D DIRECTIVE BAT04: BIS #DATA,(R4) ;"\D", THE FOLLOWING IS USER DATA BR B$TIN2 FB$TIN: JSR PC,JNUMCK ;SEE IF FOREGROUND JOB CALLED US;BC2 BEQ B$TIN ;NO, LET BATCH TAKE IT J$TIN: ADD (PC),PC ;YES, JUMP TO RMON EMT O$TIN: .-. FB$TOT: JSR PC,JNUMCK ;SEE WHICH JOB CALLED US ;BC2 BEQ B$TOT ;IF EQ, BG J$TOT: ADD (PC),PC O$TOT: .-. FB$PRN: JSR PC,JNUMCK ;SEE WHICH JOB CALLED US ;BC2 BEQ B$PRN ;IF EQ, BG J$PRN: ADD (PC),PC O$PRN: .-. .SBTTL GETCTY - GET A CHARACTER FROM THE CTY GETCTY: SAVE (R4) ;SAVE BATSW1 CLR (R4) ;GO INTO INTERACTIVE MODE SAVE R1 ;SAVE REG ;BC5 MOV #JSW,R1 SAVE (R1) BIS #TCBIT$,(R1) ;MAKE SURE WE DON'T GO TO SLEEP EMT 16*20 ;.TTYIN WILL GOTO RMON RESTOR (R1) ;RESTOR JSW RESTOR R1 ;RESTOR REG ;BC5 RESSW1: RESTOR (R4) ;RESTOR BATSW1 BAINT: BAINTR: RTS PC ;RETURN CARRY TO CALLER .SBTTL PUTCTY (PUTCT2) - PUT CHARACTERS TO THE CTY PUTCT2: MOV PC,-(SP) ;DO THIS TWICE MOVB (R1)+,R0 PUTCTY: TST R0 BEQ PUTDON SAVE (R4) CLR (R4) 1$: EMT 16*20+1 ;.TTYOUT WILL GO TO RMON BCS 1$ BR RESSW1 ;NOW RESTORE THE SWITCH B$PRCR: .IF NE MMG$T ADDR CRLF,R1 ;CRLF to print, directly in R1 INC NOREL ;don't reloc krnl address .IFF ADDR CRLF,R0 ;CRLF to print .ENDC ;NE MMG$T B$PRN: MOV INIT,R4 ;R4 POINTS TO BATSW1 BIT #DESTON,(R4) BEQ J$PRN .IF NE BATSTK SAVSTK ;SWITCH STACKS .ENDC ;NE BATSTK BIT #NOTTY,(R4) ;LOG ANY OUTPUT? ;MG02 BNE BATRTI ;NOPE... ;MG02 .IF NE MMG$T ;BC4+ TST NOREL ;Is address from user? BNE 3$ ;No, don't relocate, already in R1 SAVE R2,R3 ;Save R2 and R3 BIT #30000,@#PS ;Was caller from kernel mode? BEQ 2$ ;Branch if so -- no relocation CLR R1 ;BG job -- assume U-D space BIT #20000,@#PS ;Was caller from user mode? BNE 1$ ;Branch if so -- R1 already set ADD #400,R1 ;Set supervisor mode bit 1$: CALL @#<.-.> ;Call JOBREL to relocate address JBRELP = .-2 BCS 2$ ;If error, just use kernel mode MOV R2,R0 ;Get PAR1 displacement addr to R0 MOV R1,@#KISAR1 ;Load KISAR1 with bias 2$: MOV R0,R1 ;Displacement to R1 RESTOR R2,R3 ;Restore R3 and R2 3$: CLR NOREL ;Init for next address through .IFF MOV R0,R1 .ENDC ;NE MMG$T ;BC4- 4$: MOVB (R1)+,R0 BEQ B$PRCR ;DONE, ECHO CRLF CMPB #200,R0 ;SPECIAL EOL? BEQ BARTI1 JSR PC,PUTBAT BR 4$ GETCHR: BIT #BSOURC,(R4) BNE GETBAT ;GET A CHARACTER FROM THE BATCH STREAM 1$: JSR PC,GETCTY ;GET A CHARACTER FROM THE CTY: BCS 1$ RTS PC .SBTTL JNUMCK - GET JOB NUMBER OF CALLING JOB ;+ ; ; JNUMCK - CHECK JOB NUMBER OF CALLING JOB( FOR EMT PROCESSING ) ; ; CALL JSR PC,JNUMCK ; ; RETURN CONDITION CODES SET ; EQ -> BACKGROUND JOB ; NE -> FOREGROUND JOB ; ; ALL REGS PRESERVED ; ;- JNUMCK: MOV @#SYSPTR,-(SP) ;POINT TO RMON ;BC2+ ADD #JOBNUM,(SP) ;ADD OFFSET TO JOBNUM TST @(SP)+ ;SET CONDITION CODES RTS PC ;AND RETURN ;BC2- READBA: JSR R5,RWBAT .WORD INDATA-.-2 BATIPT: .-. ;CHARACTER POINTER BATICT: .-. ;CHARACTER COUNTER GETBAT: DEC BATICT ;ANY MORE CHARACTERS IN THE BUFFER BMI READBA ;NO, GO GET ANOTHER BUFFER MOVB @BATIPT,R0 INC BATIPT RTS PC PUTBAT: BIT #BDESTN,(R4) BNE PUTCHR JSR PC,PUTCTY PUTCHR: MOVB R0,@BATOPT INC BATOPT DEC BATOCT BNE PUTDON JSR R5,RWBAT .WORD ODATA-.-2 BATOPT: .WORD .-. BATOCT: .WORD OUBSIZ*2 PUTDON: RTS PC ;********KEEP INDATA THRU OUTSAV TOGETHER IN THIS ORDER******** INDATA: .WORD 10*400+0 INBLOK: .-. INBUFF: .-. INWC: .WORD INBSIZ .WORD 0 ;READW .IIF NE INDATA-.+12,.ERROR ;CHANGE THE SAVE STATUS IN BATCH INSAV: .BLKW 5 ;5 WORD BLOCK FOR SAVE STATUS ODATA: .WORD 11*400+0 OBLOK: .-. OBUFF: .-. OWC: .WORD OUBSIZ .WORD 0 ;WRITEW .IIF NE ODATA-.+12,.ERROR ;CHANGE THE SAVE STATUS IN BATCH OUTSAV: .BLKW 5 ;SAVE STATUS BUFFER ;************************************************************** BLKW2: .BLKW 2 ;**** MUST PRECEED OLDSTA **** OLDSTA: .BLKW 5 ;FOR SAVING OLD CHANNEL STATUS CHAIN: BATSW1-BALQE ;ARGUMENTS TO PASS TO BATCH INDATA-BALQE ODATA-BALQE OUTBUF-BALQE BATOPT-BALQE BATOCT-BALQE BATICT-BALQE O$EXT-BALQE O$TIN-BALQE O$TOT-BALQE O$PRN-BALQE ;****NOTE THIS LIST IS TERMINATED BY A NEGATIVE NUMBER RWBAT: BISB #2,@JSTATE ;IF FB, THIS WILL INHIBIT ; ADDRESS CHECKING SAVE R0,R3,R4 ;###JBM MOV (R5)+,R4 ;GET OFFSET TO R/W PARAMETER BLOCK ADD R5,R4 ;MAKE IT ABSOLUTE MOVB #17,(R4) RWBAT1: DECB (R4) BPL RWBAT2 RESTOR R3,R4 ;###JBM ;+ ;ERROR JSR R1,BAT06B .ASCII "LU" ;- RWBAT2: ADDR BLKW2+2,R3 ;TEMPORARY POINTER CLR OLDSTA ;FLAG FOR SAVE STATUS BELOW CLR R0 BISB (R4),R0 ;PICK UP CHANNEL NUMBER EMT 374 ; .WAIT ON CHANNEL BCC 2$ ;OK TO SAVE STATUS TSTB @#ERRWRD BEQ 3$ ;CHANNEL NOT OPEN. DON'T SAVE STATUS BR RWBAT1 ;TRY ANOTHER CHANNEL 2$: ADDR OLDSTA,R0 ;POINTER TO OLDSTA MOV R0,(R3) ;BLKW2+2 GETS OLDSTA MOV #5*400,-(R3) ;SAVE STATUS FUNCTION NUMBER MOV R3,R0 ;POINT R0 AT BLKW2 MOVB (R4),(R3) ;AND THE CHANNEL NUMBER TST (R3)+ ;MAKE SURE THAT R3 POINTS TO BLKW2+2 EMT 375 ; SAVE STATUS BCS RWBAT1 3$: MOV R4,(R3) ;SET UP THE REOPEN ADD #12,(R3) ;POINT TO 5 WORD BLOCK MOV #6*400,-(R3) ;REOPEN FUNCTION MOVB (R4),(R3) ;+ CHANNEL NUMBER MOV R3,R0 EMT 375 ;REOPEN BCS RWBAT1 ;ERROR IN OPENING MOV R4,R0 EMT 375 ;DO THE READ OR WRITE BCC 4$ ;OK RESTOR R3,R4 ;###JBM ;+ ;ERROR JSR R1,BAT06B .ASCII "IO" ;- 4$: MOV R3,R0 MOVB #7,1(R0) ;.CLOSE EMT 375 ;THIS HAS TO BE GOOD TST OLDSTA BEQ 5$ ;DON'T REOPEN MOV R3,R0 MOVB #6,1(R0) MOV R0,2(R0) ADD #4,2(R0) ;POINT TO OLDSTA EMT 375 ;MUST SUCCEED 5$: TST (R4)+ ;POINT TO BLOCK NUMBER INC (R4)+ ;BUMP THE BLOCK NUMBER AND ; POINT TO BUFFER MOV (R4)+,(R5)+ MOV (R4),(R5) ;MOVE IN WC ASL (R5)+ ;CHANGE TO BYTE COUNT RESTOR R0,R3,R4 ;###JBM BIC #2,@(PC)+ JSTATE: .-. ;POINTS TO STATUS BIT IN FBMON ; OR FB$EXT IN BATHND RTS R5 BATREG: .BLKB 32 ;26 BYTE REGISTERS .BYTE '0,'0,'0 ;THREE '0'S FOR LISTING TEMPORARY'S .BYTE 0,0 CRLF: .BYTE 15 .BYTE 12 .BYTE 200 .IF NE MMG$T NOREL: .WORD 0 ;if =1, don't perform relocation ; of user to kernel address .ENDC LABEL: .BLKB LABSIZ .ASCII "L\" .EVEN PATCH: .REPT 25. ;PATCH AREA .WORD 0 .ENDR .DREND BA .PSECT BADVR .BLKB 5000-<.-BASTRT> BATEND=.-BASTRT ; BATCH STACK GOES HERE .WORD -1 .REPT 376 .WORD 0 .ENDR .END