.TITLE CCD .IDENT /1.1/ ; RSX-11M system program to spawn the tasks necessary to compile a C ; program. The call is ; CCD [/S] [] ; If /S is specified, the intermediate files created by the compilation ; process will be preserved. is the name of the file to be compiled. ; The extension of the file is assumed to be ".C". is any remaining ; text on the command line. It is passed to XCC as switches. NEWHD =0 ; NZ => Add header file to macro output ; RSX MACRO CALLS: .ENABLE LC,AMA .MCALL SPWN$S,EXST$S,GMCR$,STSE$S,ALUN$S,DIR$,QIOW$S,GLUN$S .IF NZ NEWHD .MCALL OPEN$W,WRITE$,WAIT$,CLOSE$S,FSRSZ$,FDBDF$ .MCALL FDAT$A,FDRC$A,FDBK$A,FDOP$A,NMBLK$ .ENDC ;DEFINITIONS TTY =1 ;TERMINAL LUN ASSIGNMENT SPWEVT =2 ;SPAWN EVENT NUMBER DLUN =3 ;DISK LUN NUMBER SG =%5 ;STRING REGISTER ;MACRO AND TASK BUILDING COMMANDS ; MAC CCD = CCD ; ; TKB ; CCD/-FP/CP,CCD=CCD ; / ; LIBR=FCSRES:RO ; TASK=...CCD ; // ;MACRO DEFINITIONS .MACRO SPAWN STRING ;SPAWN MCR COMMAND .IF NB STRING MOV STRING,R0 .ENDC CALL SPAWNER BCS FINI ; ERROR? .ENDM ;START OF MAIN CODE START:: CALL MCRIN ;READ IN MCR COMMAND LINE BCS HUH ; EMPTY MOV SG,FULNAM ; Save pointer to full file name DEC SG ; Look for disk, UIC, and switches 10$: INC SG ; File name follows disk or UIC specification MOV SG,FILNAM 20$: TSTB (SG) ; End of line without finding switches? BEQ 30$ ; Yes CMPB #':,(SG) ; End of disk specification? BEQ 10$ ; Yes CMPB #'],(SG) ; End of UIC specification? BEQ 10$ ; Yes CMPB #' ,(SG)+ ; Found switches? BNE 20$ ; No 30$: MOV SG,SWITCH ; Yes, remember where it is SPAWN #PIP0 ;DELETE OLD OBJECT AND LISTING FILES SPAWN #MPC ; Macro preprocessor SPAWN #XCC ; Compile the source SPAWN #XAS ; Assemble the compiler output .IF NZ NEWHD CALL MAKEHD ; CREATE MACRO HEADER FILE BCS FINI .ENDC TST NODEL ; Clean up the files? BNE FINI ; No MOV #PIPZ,R0 ; Yes CALL SPAWNER BR FINI HUH: MOV #CMD,R0 ; Print command syntax MOV #CMDL,R1 CALL OUTSTR FINI: EXST$S STATUS ;SUBROUTINE TO SPAWN COMMAND POINTED TO BY R0. ON EXIT C SET INDICATES ERROR SPAWNER::MOV #OUTBUF,R3 ;COPY STRING INTO HERE SUBSTITUTING FILE NAME 10$: CMPB #'%,(R0) ; Need to substitute file name for %? BNE 30$ ; No MOV FILNAM,R1 ; Yes 20$: CMP SWITCH,R1 ; End of file name? BEQ 80$ ; Yes MOVB (R1)+,(R3)+ ; No, copy BR 20$ 30$: CMPB #'#,(R0) ; Need to substitute full file spec for #? BNE 50$ ; No MOV FULNAM,R1 ; Yes 40$: CMP SWITCH,R1 ; End of full file spec? BEQ 80$ ; Yes MOVB (R1)+,(R3)+ ; No, copy BR 40$ 50$: CMPB #'&,(R0) ; Need to substitute switches for &? BNE 70$ ; No MOV SWITCH,R1 ; Yes 60$: MOVB (R1)+,(R3)+ BNE 60$ DEC R3 BR 80$ 70$: CMPB #'!,(R0) ; Need to substitute terminal number for !? BNE 90$ ; No MOV TTNUM,R1 ; Yes ASH #-3,R1 ; Convert to 1-2 octal ASCII digits BEQ 75$ ; One digit only ADD #'0,R1 MOVB R1,(R3)+ 75$: MOV TTNUM,R1 BIC #177770,R1 ADD #'0,R1 MOVB R1,(R3)+ 80$: INC R0 BR 10$ 90$: MOVB (R0)+,(R3)+ ; Copy this part of string straight over BNE 10$ ; Copy more MOV #OUTBUF,R2 ;COMPUTE STRING LENGTH SUB R2,R3 DEC R3 SPWN$S #MCR1,,,,,#SPWEVT,,#STATUS,R2,R3,, ;SEND OFF COMMAND STSE$S #SPWEVT CMP #1,STATUS ;NORMAL EXIT? BEQ 100$ ; Yes MOV #BOMB,R0 ; Print error message MOV #BOMBL,R1 CALL OUTSTR MOV R2,R0 ; Print the command string MOV R3,R1 CALL OUTSTR SEC 100$: RETURN ;END OF CCD .IF NZ NEWHD ;MAKEHD - CREATE TEMPORARY C HEADER FILE FOR MACROING ;SUBROUTINE TO CREATE A FILE CALLED "CHD.TMP". THE FILE CONTAINS A ;".TITLE" DECLARATION WHICH SPECIFIES THAT THE FILE TITLE IS TO BE ;EQUAL TO THE FILE NAME. THE ONLY OTHER CONTENTS OF THE TEMPORARY ;FILE IS A NULL MACRO WHICH FORCES FUTURE TITLE DECLARATIONS TO BE ;IGNORED. THIS ROUTINE REQUIRES NO ARGUMENTS. THE FILE NAME IS ;ASSUMED TO BE POINTED AT BY THE FILNAM VARIABLE. ; ;IF AN ERROR OCCURS DURING FILE PROCESSING, THE C BIT IS SET ON ;EXIT, OTHERWISE THE C BIT IS CLEARED. MAKEHD::CLR DSKERR ;SIGNAL NO ERROR OPEN$W #OUTFDB,,,,,,ERROR ;CREATE THE FILE TO WRITE DM DATA MOV #OUTBUF,R0 ;ADDRESS OF BUFFER MOV #256.*1,R1 ;NUMBER OF WORDS CLR (R0)+ ;CLEAR WHOLE BUFFER SOB R1,.-2 MOV #OUTBUF+2,R0 ;START PACKING THE SCREEN CONTENTS AWAY MOV #TITLE,R1 ;COPY ".TITLE " MOVB (R1)+,(R0)+ BNE .-2 DEC R0 MOV FILNAM,R1 ;FOLLOWED BY FILE NAME MOVB (R1)+,(R0)+ BNE .-2 MOV R0,R1 ;COMPUTE STRING LENGTH SUB #OUTBUF+3,R1 MOV R1,OUTBUF ; AND SAVE AS FIRST RECORD LENGTH BIC #1,R0 ;ROUND UP TO NEXT EVEN WORD BOUNDARY MOV #MACDEF,R1 ;NOW COPY IN THE MACRO DEFINITION STUFF MOV (R1)+,(R0)+ BNE .-2 WRITE$ #OUTFDB ;WRITE BUFFER WAIT$ #OUTFDB ;WAIT TILL DONE CLOSE$S #OUTFDB ;CLOSE THE FILE TST DSKERR ;ANY DISK ERROR? BEQ 100$ SEC ; YES, SIGNAL IT 100$: RETURN ;ERROR ROUTINE INVOKED IF ERROR DURING FILE OPEN ERROR:: MOV #ERRMSG,R0 ; Print error message MOV #ERRMSL,R1 CALL OUTSTR INC DSKERR ; Note error RETURN ;END OF MAKEHD .ENDC ; MCRIN and OUTSTR ;MCRIN - ATTACHES TERMINAL AND FORMATS MCR COMMAND LINE INPUT ;SUBR TO ATTACH USERS TERMINAL AS DEVICE "TTY" AND READ IN THE MCR COMMAND ;LINE. ON EXIT, SG IS LEFT POINTING TO THE COMMAND LINE AT THE CHARACTER ;IMMEDIATELY FOLLOWING THE MCR COMMAND NAME. THE END OF THE COMMAND LINE ;IS TERMINATED WITH A NULL CHARACTER. A SAMPLE CALLING SEQUENCE ;FOLLOWS: ; CALL MCRIN ; MOV SG,INPUT.PTR ; ;IF NO INPUT STRING IS FOUND, THE C BIT IS SET ON EXIT. ;REGISTERS USED: ONLY SG ALTERED MCRIN:: ALUN$S #TTY,#"TI ;ASSIGN LOGICAL UNIT TO INITIATING TERM GLUN$S #TTY,#LDATA ; Get LUN info on device connected to TTY MOVB LDATA+G.LUNU,TTNUM ; Save actual TT number for comparison DIR$ #GMCDPB ;READ IN MCR COMMAND LINE MOV $DSW,SG ;INPUT CHARACTER COUNT BMI 30$ ; Error CLRB GMCDPB+G.MCRB(SG) ;MARK END OF INPUT STRING MOV #GMCDPB+G.MCRB,SG ; Ptr to start of command line 10$: TSTB (SG) ; Null? BEQ 30$ ; Yes CMPB #' ,(SG)+ ; Scan until a space BNE 10$ CMPB #'/,(SG) ; /S switch given? BNE 20$ ; No INC SG CMPB #'S,(SG)+ BNE 30$ ; No, error INC NODEL ; Yes, note it CMPB #' ,(SG)+ ; Followed by a space? BEQ 20$ ; Yes DEC SG 20$: TSTB (SG) ; File name given? BNE 40$ ; Yes 30$: SEC ; Signal no string found 40$: RETURN ;END OF MCRIN ; OUTSTR - Output a string, followed by ; On entrance: ; R1 is output string length ; R0 is output string pointer OUTSTR::QIOW$S #IO.WLB,#TTY,#TTY,,,, RETURN ; End of OUTSTR ;LOCAL DATA AREA GMCDPB::GMCR$ ;COMMAND INPUT BUFFER STATUS::.BLKW 8. ;SPWN$'S EXIT STATUS FULNAM::.WORD 0 ; Ptr to start of full file name: DKx:[y,z]... FILNAM::.BLKW 1 ; Ptr to start of file name string, only SWITCH::.WORD 0 ; Pointer to switches in command line TTNUM: .WORD 0 ; Terminal number in ASCII NODEL:: .WORD 0 ; NZ => Don't delete intermediate files LDATA:: .BLKW 6 ; Buffer for GLUN$ calls OUTBUF::.BLKW 256. ;OUTPUT COMMAND AND DISK BUFFER .IF NZ NEWHD IOSTAT: .BLKW 2 ;DISK I/O STATUS BLOCK DSKERR: .BLKW 1 ;<>0 IF A DISK ERROR HAS OCCURRED FSRSZ$ 1 ;INITIALIZE FCS OUTFDB: FDBDF$ ;OUTPUT TASK FILE FDAT$A R.VAR,FD.CR,,-4,-1 FDRC$A FD.RWM FDBK$A OUTBUF,512.,,DLUN,IOSTAT FDOP$A DLUN,,PNMBK2,FO.WRT PNMBK2: NMBLK$ CHD,TMP,,SY,0 ;DEFAULT FILE NAME BLOCK .ENDC ;MCR COMMAND STRING AREA MCR1:: .RAD50 /MCR.../ ;TASK NAME ; String substitution in following spawned commands: full file spec for #, ; file name for %, switches for &, and terminal number for ! PIP0:: .ASCIZ \PIP %.MPC;*/DE/NM,%.TM1;*,%.S;*,%.OBJ;*\ MPC:: .ASCIZ \INS $MPC/RUN=REM/TASK=MPCT!/PRM="# %"\ XCC:: .ASCIZ \INS $XCC/RUN=REM/TASK=XCCT!/PRM="& %.MPC"\ XAS:: .ASCIZ \INS $XAS/RUN=REM/TASK=XAST!/PRM="%"\ PIPZ:: .ASCIZ \PIP %.MPC;*/DE/NM,%.S;*\ .IF NZ NEWHD ;STRINGS FOR DISK HEADER FILE TITLE:: .ASCIZ \.TITLE \ .EVEN MACDEF::.WORD 10$-.-2 .ASCII \.MACRO .TITLE DUMMY\ 10$: .EVEN .WORD 20$-.-2 .ASCII \.ENDM\ 20$: .EVEN .WORD -1,0 .ENDC ;OUTPUT STRINGS .IF NZ NEWHD ERRMSG::.ASCII <12><7>/Disk error while creating header file ***/ ERRMSL= .-ERRMSG .ENDC CMD:: .ASCII <15><12>/Command syntax: CCD[S] []/ CMDL =.-CMD BOMB:: .ASCII <15><12><7>/*** Bombed: / BOMBL= .-BOMB .EVEN .END START