.TITLE CALL ; ; MCR TASK TO PROCESS A FILE OF MCR COMMANDS. THE MCR COMMAND ; ; MCR>CALL FILENAME.DAT/TR ; ; WILL READ THE FILE FILENAME.DAT AND EXECUTE EACH LINE AS AN MCR ; COMMAND. THE DEFAULT FILE TYPE IS .CAL. THE OPTIONAL SWITCH ; /TR WILL CAUSE EACH COMMAND TO BE PRINTED AT THE TERMINAL PRIOR ; TO EXECUTION. ANY LINES STARTING WITH A SEMI-COLON WILL BE TREATED ; AS COMMENTS. ; ; WRITTEN MARCH 1975 R B FRENCH THE BOEING COMPANY ;+01 MODIFIED TO ACCEPT COMMENT CARDS JUNE 1977 R B FRENCH ; MODIFIED NOVEMBER 1975 R B FRENCH CONVERTED TO VERSION 6A ; MODIFIED JUNE 1977 R B FRENCH +01 - CODE ADDED TO ALLOW ; COMMENT CARDS AND THE MCR ; LOG COMMAND ; ; TASK BUILD FILE ; ; CALL/-FP/MU=CALL,MCR,DSW ; / ; UNITS=2 ; ASG=TI:1 ; TASK=...CAL ; STACK=64 ; LIBR=SYSRES:RO ; / ; .MCALL DIR$,GMCR$,QIOW$,OPEN$R,GET$,RQST$,EXIT$S,CLOSE$ .MCALL FSRSZ$,FDBDF$,FDAT$A,FDRC$A,FDOP$A,NMBLK$ .MCALL CSI$,CSI$1,CSI$2,CSI$SW BUF=GMCR+G.MCRB CALL: DIR$ #GMCR ;GET MCR LINE SUB #4,0 ;SUBTRACT 4 FROM MCR LINE COUNT CSI$1 #CSIBLK,#BUF+4,0 ;CHECK SYNTAX BCC 20$ ;BRANCH IF OK 10$: MOV #SYN,QIOW+Q.IOPL ;OTHERWISE PUT SYNTAX ERROR MSG IN QIO DPB MOV #18.,QIOW+Q.IOPL+2 ;AND IT'S LENGTH DIR$ #QIOW ;PRINT IT BR DONE ;AND GO AWAY 20$: CSI$2 #CSIBLK,OUTPUT,#SWITCH ;PROCESS THE FILENAME BCS 10$ ;BRANCH IF NOT OK OPEN$R #FDB ;OPEN THE FILE BCC READ ;BRANCH IF OK MOV FDB+F.ERR,0 ;MAKE ERROR LOOK LIKE DSW BIS #177400,0 JSR PC,DSW ;CONVERT IT TO ASCII MOV R0,OPNERR+14 ;AND PUT IN ERROR MESSAGE DPB MOV #OPNERR,QIOW+Q.IOPL MOV #14.,QIOW+Q.IOPL+2 DIR$ #QIOW ;PRINT IT BR DONE ;AND GO AWAY READ: GET$ #FDB ;READ A LINE BCC 10$ ;BRANCH IF NO EOF TSTB COUNT ;CHECK COUNTER BNE DONE ;IF NON-ZERO, WE'RE DONE MOV #EMP,QIOW+Q.IOPL ;IF NOT, PUT EMPTY FILE MSG IN QIO DPB MOV #16.,QIOW+Q.IOPL+2 ;AND IT'S LENGTH DIR$ #QIOW ;PRINT IT BR DONE ;AND GO AWAY 10$: INCB COUNT ;STEP COUNTER MOV #BUF,R0 ;POINT TO START CURRENT COMMAND ADD FDB+F.NRBD,R0 ;STEP TO END OF COMMAND CLRB (R0) ;AND ADD ZERO TERMINATOR TSTB SWFLAG ;TRACE REQUESTED? BEQ GO ;BRANCH IF NOT MOV FDB+F.NRBD,QIOW+Q.IOPL+2 ;MOVE BYTE COUNT TO QIO DPB DIR$ #QIOW ;AND PRINT THE LINE GO: MOV #BUF,R0 ;+01 BUFFER ADDRESS IN R0 CMPB (R0),#'; ;+01 FIRST CHARACTER A SEMI-COLON? BEQ READ ;+01 THEN IT'S A COMMENT CMP #"LO,(R0)+ ;+01 CHECK FOR LOG COMMAND BNE 20$ ;+01 BRANCH IF NOT LOG CMPB #'G,(R0)+ ;+01 BNE 20$ ;+01 INC R0 ;+01 STEP OVER BLANK MOV FDB+F.NRBD,QIOW+Q.IOPL+2 ;+01 NUMBER OF BYTES IN DPB SUB #4,QIOW+Q.IOPL+2 ;+01 LESS 4 BGT 10$ ;+01 ZERO LENGTH MESSAGE? MOV #1,QIOW+Q.IOPL+2 ;+01 THEN PRINT A BLANK MOVB #' ,(R0) ;+01 10$: MOV R0,QIOW+Q.IOPL ;+01 DIR$ #QIOW ;+01 PRINT THE MESSAGE MOV #BUF,QIOW+Q.IOPL ;+01 RESET THE QIO DPB BUFFER BR READ ;+01 20$: MOV #LIST,R5 ;PUT ARGUMENT LIST IN R5 JSR PC,MCR ;EXECUTE MCR COMMAND LIST: BR .+4 .WORD BUF TST R0 ;ANY ERRORS? BEQ READ ;IF NOT, GO READ ANOTHER LINE MOV #ERR,QIOW+Q.IOPL ;OTHERWISE PUT ERROR MESSAGE IN QIO DPB MOV #10.,QIOW+Q.IOPL+2 ;AND IT'S LENGTH DIR$ #QIOW ;AND PRINT IT DONE: CLOSE$ #FDB ;CLOSE THE FILE EXIT$S ; ; CSI BLOCK CSIBLK: .BLKB C.SIZE SWITCH: CSI$SW TR,1,SWFLAG ; ; FILE DESCRIPTOR BLOCK FSRSZ$ 1 FDB: FDBDF$ FDAT$A R.VAR FDRC$A ,BUF,160. FDOP$A 2,CSIBLK+C.DSDS,NMBLK NMBLK: NMBLK$ CALL,CAL ; GMCR: GMCR$ ;GET MCR LINE DPB SWFLAG: .BYTE 0 ;FLAG FOR /TR SWITCH COUNT: .BYTE 0 ;COUNT OF MCR LINES READ FROM FILE QIOW: QIOW$ IO.WLB,1,1,,,, ;QIO DPB FOR ERROR MESSAGES SYN: .ASCII /CALL SYNTAX ERROR / ERR: .ASCII /CALL ERROR/ EMP: .ASCII /CALL FILE EMPTY / OPNERR: .ASCII /OPEN ERROR -/ .END CALL