.TITLE CRUSPC .IDENT /X01.00/ ; ; AUTHOR: GILBERT J. DELEEUW ; DATE: MAY 3, 1984 ; NAME: CRUSPC - REPLACE TABS WITH SPACES ; FUNCTION: CONVERT TABS TO SPACES ; ; ; PARAMETERS: ; ; R2 - SIZE OF INPUT RECORD ; R3 - ADDRESS OF INPUT RECORD ; R4 - SIZE OF OUTPUT RECORD ; R5 - ADDRESS OF OUTPUT RECORD ; ; ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = CRUSPC:: TST R2 ;TEST LENGTH OF STRING BEQ 80$ ;ZERO LENGTH RECORD ; ; INITIALIZE REGISTERS CLR R0 ;CLEAR VIRTUAL LOCATION MOV R5,-(SP) ;STORE BUFFER ADDRESS MOV R4,-(SP) ;SAVE OUTPUT BUFFER SIZE CLR R4 ;ZERO OUTPUT COUNT ; ; GET NEXT INPUT CHARACTER 10$: MOVB (R3)+,R1 ;GET CHARACTER ; ; Normal character? CMPB R1,#' ;COMPARE TO SPACE BGE 50$ ;YES ; ; IS CHARACTER A TAB? CMPB #11,R1 ;TAB? BNE 20$ ; ; REPLACE TAB WITH SPACE(S) 15$: CMP (SP),R4 ;ROOM IN OUTPUT BUFFER? BLT ERR ;NO MOVB #' ,(R5)+ ;INSERT SPACE CHARACTER INC R0 ;INCREMENT VIRTUAL LOC INC R4 ;INCREMENT OUTPUT COUNT BIT #7,R0 ;TAB STOP? BNE 15$ ;NO BR 70$ ;FINISHED TAB ; ; IS CHARACTER A FORM FEED? 20$: CMPB #15,R1 ;FORM FEED? BEQ 40$ ; ; IS CHARACTER A CARRIAGE RETURN? CMPB #15,R1 ;CARRIAGE RETURN? BEQ 40$ ; ; IS CHARACTER A BACK SPACE? 30$: CMPB #10,R1 ;BACK SPACE? BNE 60$ DEC R0 ;BACK UP LINE LOCATION BGE 60$ ;MOVE CHARACTER ; ; RESET LINE POSITION 40$: CLR R0 ;CAN'T BE LESS THAN ZERO BR 60$ ;MOVE CHARACTER ; ; NORMAL CHARACTER 50$: INC R0 ;INCREMENT LINE POSITION 60$: CMP (SP),R4 ;ROOM IN OUTPUT BUFFER? BLT ERR ;NO INC R4 ;INCREMENT OUTPUT COUNT MOVB R1,(R5)+ ;MOVE CHARACTER ; ; LOOP COUNTER 70$: SOB R2,10$ ;LOOP TST (SP)+ ;POP BUF SIZE FROM STACK MOV R4,R2 ;OUTPUT STRING SIZE MOV (SP)+,R3 ;ADDRESS OF STRING ; ; FINISHED 80$: RTS PC ;RETURN TO CALLER ; ; ERROR - OUTPUT BUFFER TOO SMALL ERR: ADD #4,SP ;POP PARAMETERS FROM STACK SEC ;SET CARRY RTS PC ;RETURN TO CALLER .END