.TITLE CC0RT .IDENT /X01/ .NLIST BEX .ENABL LC ; ; C COMPILER ; ROOT ; ; VERSION X01 ; ; DAVID G. CONROY 13-JAN-78 ; .GLOBL CCABRT .GLOBL CCERR .GLOBL CCTTY .GLOBL NERRS .GLOBL IFLAG .GLOBL VFLAG .GLOBL PFLAG .GLOBL SFLAG .GLOBL TFLAG .GLOBL EFDB .GLOBL SFDB .GLOBL IFDB .GLOBL AFDB .GLOBL $DENY .MCALL CALL .MCALL CALLR .MCALL RETURN .MCALL FSRSZ$ .MCALL FDBDF$ .MCALL PUT$S .MCALL FDOP$A .MCALL QIO$ .MCALL WTSE$S .MCALL DIR$ .MCALL EXIT$S .MCALL SVTK$S FSRSZ$ 4 ; ; GLOBAL DATA. ; EFDB: FDBDF$ ;ERROR STREAM FDOP$A 2 ; SFDB: FDBDF$ ;SOURCE STREAM FDOP$A 3 ; IFDB: FDBDF$ ;INTERMEDIATE STREAM FDOP$A 4 ; AFDB: FDBDF$ ;ASM OUTPUT STREAM FDOP$A 5 ; NERRS: .WORD 0 ;ERROR COUNTER IFLAG: .BYTE 0 ;-I TOGGLE VFLAG: .BYTE 0 ;-V TOGGLE PFLAG: .BYTE 0 ;-P TOGGLE SFLAG: .BYTE 0 ;-S TOGGLE TFLAG: .BYTE 0 ;-T TOGGLE .EVEN ; ; LOCAL DATA. ; SST: .WORD CCSST0 ;SST TRANSFER TABLE .WORD CCSST1 ; .WORD CCSST2 ; .WORD CCSST3 ; .WORD CCSST4 ; .WORD CCSST5 ; .WORD CCSST6 ; .WORD CCSST7 ; LD0: .BYTE 3,0 ;PREPROCESSOR .RAD50 /CC000 / ; LD1: .BYTE 3,0 ;PARSER .RAD50 /CC100 / ; LD2: .BYTE 3,0 ;CODE GENERATOR .RAD50 /CC200 / ; LD3: .BYTE 3,0 ;WRAPUP .RAD50 /CC300 / ; TT: QIO$ IO.WVB,1,1,,,,<0,0,40> ; ; MESSAGES. ; MSG01: .ASCIZ 'Abort in phase 0' MSG02: .ASCIZ 'Abort loading phase 0' MSG03: .ASCIZ 'Out of space' MSG04: .ASCIZ 'Trap type 0' .EVEN ;+ ; ** CCMAIN - MAINLINE ; ; THIS IS THE MAINLINE OF THE C COMPILER. IT READS IN EACH OVERLAY OF ; THE COMPILER AND PASSES CONTROL TO IT. ; CARE IS TAKEN TO ASSURE THAT THE LOAD FAILURE AND ABORT MESSAGES GO ; SOMEWHERE THAT THE USER WILL SEE THEM, EVEN IF HE/SHE/IT SEES THEM ; TWICE. ;- .ENABL LSB CCMAIN: SVTK$S #SST,#8. ;GRAB ALL SST VECTORS MOV #LD0,R0 ;LOAD PREPROCESSOR CALL $LOAD ; BCS 10$ ;BR ON LOAD FAILURE CALL CC000 ;PREPROCESS TST NERRS ;ANY ERRORS BNE 20$ ;IF YES, QUIT INCB MSG01+15. ;FIX PHASE NUMBERS INCB MSG02+20. ; MOV #LD1,R0 ;LOAD PARSER CALL $LOAD ; BCS 10$ ;BR ON LOAD FAILURE CALL CC100 ;PARSE TST NERRS ;ANY ERRORS BNE 20$ ;IF YES, QUIT INCB MSG01+15. ;FIX PHASE NUMBERS INCB MSG02+20. ; MOV #LD2,R0 ;LOAD CODE GENERATOR CALL $LOAD ; BCS 10$ ;BR ON LOAD FAILURE CALL CC200 ;CODE BR 20$ ;DONE 10$: MOV #MSG02,R0 ;ERROR LOADING A PHASE CALL CCERR ;TO ERROR FILE CALL CCTTY ;TO TTY BR 20$ ; ;+ ; ** CCSSTN - SST INTERCEPTOR ; ; THERE ROUTINES INTERCEPT ALL COMPILER TRAPS. THE NAME OF THE GAME IS ; TO GET YOUR FILES CLOSED. ; ; THE SST CATCH VECTORS POINT INTO THE ARRAY OF INCB INSTRUCTIONS; THE ; ERROR CODE IN THE MESSAGE GETS COUNTED UP BY THEM. ;- CCSST7: INCB MSG04+10. ;ADJUST THE MESSAGE CCSST6: INCB MSG04+10. ; CCSST5: INCB MSG04+10. ; CCSST4: INCB MSG04+10. ; CCSST3: INCB MSG04+10. ; CCSST2: INCB MSG04+10. ; CCSST1: INCB MSG04+10. ; CCSST0: MOV #MSG04,R0 ;PICK UP THE MESSAGE BR CCABRT ;THEN ABORT ;+ ; ** $DENY - $ALLOC DENIAL ; ; THIS ROUTINE IS INVOKED BY $ALLOC WHEN THERE IS NO CORE LEFT. THIS ; IS A FATAL ERROR. ; THE COMPILER IS ABORTED VIA THE USUAL ROUTE, WITH THE MESSAGE "OUT ; OF SPACE" GOING TO THE USER. ;- $DENY: MOV #MSG03,R0 ;OUT OF SPACE ;+ ; ** CCABRT - COMPILER ABORT ; ; THIS ENTRY IS CALLED VIA A JUMP TO FINISH OFF THE COMPILER. CCERR ; IS USED TO WRITE AN ABORT MESSAGE TO THE ERROR FILE (THE MESSAGE ; ALSO GOES TO THE TTY) AND WRAPUP IS INVOKED. ; THE OPTION FLAGS ARE DIDDLED SO THAT NONE OF THE TEMP. FILES ARE ; DELETED BY CC300. ; ; INPUTS: ; R0=PTR TO ABORT MESSAGE ;- CCABRT: CALL CCERR ;WRITE ABORT MESSAGE CALL CCTTY ; MOV #MSG01,R0 ;THEN ABORT IN PHASE X CALL CCERR ; CALL CCTTY ; CLR NERRS ;INSURE NOTHING IS DELETED INCB IFLAG ; INCB SFLAG ; 20$: MOVB #'3,MSG02+20. ;SET PHASE 3 IN MESSAGE MOV #LD3,R0 ;LOAD WRAPUP OVERLAY CALL $LOAD ; BCS 30$ ;BR ON LOAD FAILURE CALL CC300 ;WRAPUP BR 40$ ; 30$: MOV #MSG02,R0 ;CANNOT LOAD WRAPUP CALL CCTTY ; 40$: EXIT$S ;SO LONG .DSABL LSB ;+ ; ** CCERR - WRITE OUT ERROR COMMENTS ; ; THIS ROUTINE IS USED BY ALL COMPILER PHASES TO PUT OUT MESSAGES TO ; THE ERROR STREAM. ; ; INPUTS: ; R0=PTR TO MESSAGE STRING ;- CCERR: MOV R0,-(SP) ;SAVE THINGS MOV R1,-(SP) ; MOV R2,-(SP) ; MOV R0,R1 ;POINTER MOV R0,R2 ;COMPUTE LENGTH 10$: TSTB (R2)+ ; BNE 10$ ; DEC R2 ; SUB R1,R2 ; PUT$S #EFDB,R1,R2 ;PUT OUT THE MESSAGE MOV (SP)+,R2 ;RESTORE AND RETURN MOV (SP)+,R1 ; MOV (SP)+,R0 ; RETURN ; ;+ ; ** CCTTY - WRITE ERROR TO TI: ; ; THIS ROUTINE IS USED TO WRITE DISASTER MESSAGES TO THE TI:. THIS ; INCREASES THE CHANCES OF THE MESSAGE GETTING OUT. ; ; INPUTS: ; R0=PTR TO MESSAGE STRING ; ; USES: ; R0 ;- CCTTY: MOV R0,TT+Q.IOPL ;SET ADDRESS 10$: TSTB (R0)+ ;COMPUTE LENGTH OF MESSAGE BNE 10$ ; DEC R0 ; SUB TT+Q.IOPL,R0 ; MOV R0,TT+Q.IOPL+2 ;SET INTO DPB DIR$ #TT ;WRITE TO TI: WTSE$S #1 ; RETURN ;DONE .END CCMAIN