;******************************************************************************* ; F I L L I N . M A C ;******************************************************************************* .TITLE FILLIN .IDENT /FLIN01/ .ENABL LC .NLIST BEX ; PROGRAMMER: HENRY TUMBLIN ; THE JACKSON LABORATORY COMPUTER SERVICE ; DATE: MARCH 18,1978 ; VERSION: 1.0 ; RESIDENCE: DB1:[1,21]FILLIN.MAC ; MODULE NAME: FILLIN ; FOR: SYSTEMS/UTILITY SUBROUTINES ; MACHINE/SYSTEM: PDP11/45-IAS V2.0 ; TYPE/LANGUAGE: SUBROUTINE/ASSEMBLER ; ABSTRACT: THIS SUBROUTINE WILL TAKE A VARIABLE LENGTH RECORD ; (UP TO 80 BYTES IN LENGTH) AND MAKE IT A FIXED-LENGTH ; 80-BYTE RECORD. THIS ROUTINE WILL ALSO TAKE OUT ALL ; TAB STOPS, AND PLACE THE APPROPRIATE NUMBER OF ; BLANKS TO SIMULATE THE TAB STOPS IN THE OUTPUT RECORD. ; FORTRAN CALL: CALL FILLIN(BCOUNT,ASTRNG,BSTRNG) ; WHERE: ; BCOUNT IS THE LENGTH OF THE INPUT STRING, ; ASTRNG IS THE VARIABLE LENGTH INPUT STRING, ; BSTRNG IS THE FIXED-LENGTH 80 OUTPUT STRING. ; NOTE: THIS SUBROUTINE CLEARS THE OUTPUT STRING TO ; BLANKS INITIALLY BEFORE PERFORMING ANY SUBSTITUTION. ;******************************************************************************* .MCALL SAVE,UNSAVE,C$C C$C FILLIN:: SAVE ;SAVE ALL GP REGISTERS ; FROM HERE ON, THE FOLLOWING REGISTER ASSIGNMENTS ; ARE MADE: ; R0 = LENGTH IN BYTES OF THE INPUT STRING ; (THE OUTPUT STRING IS ASSUMED TO BE 80 BYTES) ; R1 = ADDRESS OF THE OUTPUT BUFFER ; R2 = ADDRESS OF THE INPUT BUFFER ; R3 = RECORD BYTE COUNT ; R4 = MULTIPLES OF 8 COUNT. ; REMEMBER THAT TAB STOPS ARE EVERY 8 SPACES ON THE LINE(UP TO 80) MOV @2(R5),R0 ;GET BYTE COUNT MOV 4(R5),R2 ;GET @ OF INPUT STRING MOV 6(R5),R1 ;GET @ OF OUTPUT STRING MOV #80.,R3 ;SET UP TO INITIALIZE THE OUTPUT STRING CLEAR: MOVB #40,(R1)+ ;SET TO BLANKS SOB R3,CLEAR ;DO FOR 80 BYTES MOV 6(R5),R1 ;AND RESET THE POINTER MOV #1,R3 ;INITIALIZE BUFFER BYTE COUNT MOV #8.,R4 ;INITIALIZE TAB STOP REGISTER AG2A: CMPB #HT,(R2) ;IS IT A TAB??? BNE NOTAB ;NO, DO STANDARD PROCESSING AG1A: CMP R3,R4 ;SEE IF WE'RE DONE FILLING OUT TO TAB STOP BHI ALMST ;YES, THEN WE'RE ALMOST READY TO GO BACK MOVB #40,(R1)+ ;BLANK FILL INC R3 ;INCREMENT BUFFER POINTER BR AG1A ;SEE IF THRU. ALMST: ADD #8.,R4 ;SET NEXT POSSIBLE TAB STOP INC R2 ;POINT TO NEXT AVAILABLE BYTE DEC R0 ;DECREMENT TOTAL BYTE COUNT BEQ DONE ;0, THEN WE'RE THRU WITH THIS STRING. BR AG2A ;AND CONTINUE PROCESSING THE RECORD. NOTAB: CMP R4,R3 ;SEE IF WE'VE MOVED BEYOND THIS TAB STOP BHI NOTYET ;NO, THEN WE HAVEN'T GOTTEN THERE YET ADD #8.,R4 ;ELSE, POINT TO NEXT TAB STOP. NOTYET: MOVB (R2)+,(R1)+ ;MOVE INTO OUTPUT BUFFER. INC R3 ;KEEP A RUNNING COUNT DEC R0 ;SEE IF AT END OF RECORD YET BEQ DONE ;YES, THEN RETURN TO CP BR AG2A ;ELSE GO CHECK FOR ANOTHER TAB. DONE: UNSAVE ;RESTORE THE GP REGISTERS RETURN ;AND RETURN TO THE CP .END