.TITLE TABS ;J.MILLS ELECT ENG UNIVERSITY OF WESTERN AUSTRALIA. ;PROGRAM TO REPLACE TABS WITH CORRECT NUMBER OF BLANKS ; *****VERSION 02******* ; THIS IS A SPECIAL VERSION FOR DECUS ;THIS PROGRAM RUNS UNDER RT11 MONITOR, V02. ;FILENAMES ARE ENTERED IN STANDARD FORMAT AS FOR PIP,ETC. ;DEFAULT FILE EXTENSIONS - ; .FRE FOR SOURCE ; .DAT FOR DESTINATION .SBTTL MAIN PROGRAM .GLOBL TABS .MCALL ..V2..,.REGDEF,.CSIGEN,.READW,.WRITW,.EXIT .MCALL .PRINT,.CLOSE ERRWD=52 JSW = 44 ..V2.. .REGDEF ;GET FILENAMES,OPEN FILES TABS: BR START ;RE-ENTRY HERE START: BIS #20000, @#JSW ;ENABLE RE-ENTRY .CSIGEN #DSPACE,#DEXT ;GET FILENAMES CLR INBLK ;INPUT BLOCK NO CLR OBLK ;OUTPUT BLOCK NO CLR CCHAR CLR NIBUF CLR NOBUF MOV OBUF,R4 ;OUTPUT BUFFER POINTER MOV #256.,OWCNT ;OUTPUT WORD COUNT NEXA: JSR PC,GETC ;GET CHAR FROM INPUT CMP R0,#' ;IS IT TAB ? BEQ TAB CMP R0,#15 ;NO,IS IT CR ? BEQ CR JSR PC,PUTC ;NO,OUTPUT THE CHAR BR NEXA ;RETURN FOR NEXT TAB: MOV CCHAR,R1 ;TAB:- CALC NO. OF BLANKS MOV #8.,R0 ;TAB SPACING 1$: SUB R0,R1 ;SUB. FROM CHAR COUNT BGE 1$ ;TILL -VE 2$: MOV #' ,R0 JSR PC,PUTC ;OUTPUT BLANKS INC R1 ;COUNTER BLT 2$ ;TILL COUNT SATISFIED BR NEXA CR: JSR PC,PUTC CLR CCHAR ;RESET COUNT FOR NEW LINE BR NEXA .SBTTL DATA BLOCK ;DEFAULT EXTENSIONS DEXT: .RAD50 'FRE' .RAD50 'DAT' .WORD 0,0 CCHAR: 0 ;CHAR COUNT NIBUF: 0 ;INPUT BUFFER COUNT NOBUF: 0 ;OUTPUT ILIST: .BYTE 3,10 ;EMT ARG LIST FOR INPUT INBLK: 0 IBUF: BUF1 .WORD 256.,0 OLIST: .BYTE 0,11 ;EMT ARG LIST FOR OUTPUT OBLK: 0 OBUF: BUF2 OWCNT: .WORD 256.,0 .SBTTL SUBROUTINES TO GET AND READ CHARS ;GET A CHAR FROM INPUT FILE GETC: TST NIBUF ;ANY IN BUFFER ? BGT 3$ MOV #ILIST,R0 ;NONE IN BUFFER,READ A BLOCK .READW BCC 2$ ;IF NO ERRORS TSTB @#ERRWD ;END OF FILE ? BEQ EOF ;YES .PRINT #MES3 ;ERROR MESSAGE .EXIT 2$: INC INBLK ;INPUT BLOCK NO. ASL R0 ;WORDS TO BYTES MOV R0,NIBUF ;SET NO. CHARS IN BUFFER MOV IBUF,R3 ;IBUF POINTER BR GETC 3$: MOVB (R3)+,R0 ;GET NEXT CHAR FROM BUFFER BIC #177600,R0 ;MASK TO 7 BITS DEC NIBUF TST R0 ;TEST FOR NULL BEQ GETC ;IGNORE NULLS RTS PC ;OUTPUT CHAR PUTC: MOVB R0,(R4)+ ;CHAR TO BUFFER CMP R0,#12 ;WAS IT LF? BEQ 1$ ;YES,DONT INC CCHAR INC CCHAR 1$: INC NOBUF ;INCR COUNTER CMP NOBUF,#512. ;FULL ? BEQ 2$ RTS PC ;NO,RETURN 2$: MOV #OLIST,R0 .WRITW ;YES,WRITE BLOCK TO FILE BCC 3$ .PRINT #MES4 ;ERROR CONDITION .EXIT 3$: INC OBLK CLR NOBUF MOV OBUF,R4 ;POINTER RTS PC ;END OF INPUT FILE EOF: TST NOBUF ;ANY CHARS IN OUTPUT ? BEQ 2$ MOVB #0,(R4)+ ;NULL BYTE AT END INC NOBUF ASR NOBUF ;BYTES TO WORDS MOV NOBUF,OWCNT ;YES,OUTPUT THEM MOV #OLIST,R0 .WRITW BCC 2$ .PRINT #MES4 ;ERROR MESSAGE .EXIT 2$: .CLOSE #0 .CLOSE #3 TST (SP)+ ;DONT RETURN FROM SUB JMP TABS ;START AGAIN .SBTTL MESSAGES MES3: .ASCIZ/READ ERROR/ MES4: .ASCIZ/WRITE ERROR/ .EVEN BUF1: .BLKW 256. BUF2: .BLKW 256. DSPACE: .BLKW 200 ;SPACE FOR DRIVER .END START ~