.TITLE CC105 .IDENT /X01/ .NLIST BEX .ENABL LC ; ; C COMPILER. ; I/O CODE. ; ; VERSION X01 ; ; DAVID G. CONROY 04-JAN-78 ; .GLOBL CODSTR .GLOBL CODNL .GLOBL CODC .GLOBL CODNUM .GLOBL GETC .GLOBL UNGETC .GLOBL DOECHO .MCALL CALL .MCALL CALLR .MCALL RETURN .MCALL GET$S .MCALL PUT$S ; ; EQUIVALENCES ; NL = 12 ;ASCII NL BLANK = 40 ;ASCII BLANK ; ; LOCAL DATA. ; OP: .WORD OB ;OUTPUT POINTER IP: .BLKW 1 ;INPUT POINTER IC: .WORD 0 ;INPUT COUNT IB: .BLKB 128. ;INPUT BUFFER OB: .BLKB 128. ;OUTPUT BUFFER ; ; MESSAGES. ; ERR01: .ASCIZ "I/O error on INT file" ERR02: .ASCIZ "I/O error on ERR file" ERR03: .ASCIZ "I/O error on SRC file" .EVEN .PAGE ;+ ; ** GETC - GET CHARACTER FROM SOURCE FILE ; ** UNGETC - PUT CHARACTER BACK ; ; OUTPUTS: (GETC) ; R0=CHAR ; C BIT SET ON EOF ;- UNGETC: DEC IP ;UNGET JUST BACKS UP THE POINTER INC IC ;AND FIXES THE COUNT RETURN ; GETC: DEC IC ;ANYTHING BPL 10$ ;YES GET$S #SFDB,#IB,#127. ;GET NEW RECORD BCS 20$ ;ERROR MOV F.NRBD(R0),R0 ;PUT NEWLINE MOVB #NL,IB(R0) ;ON THE END MOV #IB,IP ;WIND BACK POINTER MOV R0,IC ;RESET COUNT 10$: MOVB @IP,R0 ;PICK UP CHARACTER BIC #177600,R0 ;(7 BIT ASCII) INC IP ;UPDATE BUFFER POINTER CLC ;GOOD RETURN RETURN ; 20$: CMPB F.ERR(R0),#IE.EOF ;IS THE ERROR EOF BEQ 30$ ;YES MOV #ERR03,R0 ;DIE JMP CCABRT ; 30$: SEC ;C BIT SET ON EOF RETURN ; ;+ ; ** DOECHO - ECHO SOURCE LINE (FOR -V) ; ; THIS ROUTINE IS CALLED TO ECHO THE CURRENT SOURCE RECORD ONTO THE ; ERROR STREAM. ; ; USES: ; R0 ;- DOECHO: PUT$S #EFDB,#IB,SFDB+F.NRBD ;PUT OUT THE LINE BCS 10$ ;ERROR RETURN ; 10$: MOV #ERR02,R0 ;ERROR JMP CCABRT ; ;+ ; ** CODC - PUT OUT A CHARACTER ; ; OUTPUT 1 CHARACTER TO THE INTERMEDIATE FILE. THE CHARACTERS ARE BUF- ; FERED UNTIL NEWLINE, WHEN THE ACTUAL WRITE IS DONE. ; ; INPUTS: ; R0=CHARACTER ; ; USES: ; R0 ;- CODC: CMPB R0,#NL ;NEWLINE? BEQ 10$ ;YES MOVB R0,@OP ;NO, JUST STORE IN THE BUFFER INC OP ;UPDATE THE POINTER BR 20$ ;AND RETURN 10$: SUB #OB,OP ;COMPUTE RECORD SIZE PUT$S #IFDB,#OB,OP ;AND WRITE IT IFDB BCS 30$ ;ERROR MOV #OB,OP ;BACK UP POINTER 20$: RETURN ;DONE 30$: MOV #ERR01,R0 ;ABORT JMP CCABRT ; ;+ ; ** CODSTR - PUT OUT A STRING ; ; THIS ROUTINE PUTS OUT AN ASCIZ STRING TO THE CODE FILE USING MANY ; CALLS TO CODC. ; ; INPUTS: ; R0=POINTER TO STRING ; ; USES: ; R0 ;- CODSTR: MOV R1,-(SP) ;GET WORKING COPY OF POINTER MOV R0,R1 ; 10$: MOVB (R1)+,R0 ;GET CHARACTER BEQ 20$ ;BR IF NULL CALL CODC ;PUT IT OUT BR 10$ ; 20$: MOV (SP)+,R1 ;RETURN RETURN ; ;+ ; ** CODNL - PUT OUT A NEWLINE ; ; USES: ; NO REGISTERS ;- CODNL: MOV R0,-(SP) ;SAVE MOVB #NL,R0 ;PUT OUT NEWLINE VIA CODC CALL CODC ; MOV (SP)+,R0 ;RETURN RETURN ; ;+ ; ** CODNUM - PUT OUT AN OCTAL NUMBER ; ; THE NUMBER IS CONVERTED INTO OCTAL ASCII WITH SUPRESSED LEADING ; ZEROS AND IS WRITTEN TO THE OUTPUT FILE VIA CODC. ; ; INPUTS: ; R0=THE NUMBER ;- CODNUM: MOV R0,-(SP) ;GET SOME REGISTERS MOV R1,-(SP) ; MOV R2,-(SP) ; MOV #4,R2 ;DIGIT COUNT MOV R0,R1 ;COPY THE NUMBER ASL R1 ;TOP DIGIT BCC 20$ ;ZERO, SUPRESS MOVB #'1,R0 ;PUT OUT THE '1' CALL CODC ; BR 30$ ;AND KILL SUPRESSION 20$: MOV #6,R0 ;MAX 4 DIGITS, WITH SUPRESSION ASL R1 ;MAKE DIGIT ROL R0 ; ASL R1 ; ROL R0 ; ASL R1 ; ROL R0 ; CMPB R0,#'0 ;IF A '0', DON'T PRINT BNE 40$ ; DEC R2 ; BNE 20$ ; 30$: MOV #6,R0 ;PUT OUT THE REST ASL R1 ;MAKE DIGIT ROL R0 ; ASL R1 ; ROL R0 ; ASL R1 ; ROL R0 ; 40$: CALL CODC ;OUTPUT DEC R2 ;LOOP TIL DONE BGE 30$ ; MOV (SP)+,R2 ;RETURN MOV (SP)+,R1 ; MOV (SP)+,R0 ; RETURN ; .END