.TITLE ZEROES END OF FILES .ENABL LC ;Written by D. H. Walesby MSc T63D ; J.S.R.U. Benhall Cheltenham ;Date 14/08/79 Version 2 ;Date 24/09/79 Version 2B - Improved (GTLIN, messages) ; 31/01/80 Version 2C - Opens & clears new files .IDENT /VER02C/ .NLIST TTM,BEX .MCALL .PRINT,.CSISPC,.WRITE,.TTYIN,.FETCH,.LOOKUP,.SRESET .MCALL .SETTOP,.DSTATUS,.GTLIN,.ENTER JSW = 44 ;MONITORS JOB STATUS WORD REFLG = 20000 ;BIT TO SAY JOB RE-ENTERABLE ERRWRD = 52 ;MONITOR ERROR WORD MXCHAR = 80. ;MAXIMUM NUMBER OF CHARS ON TT LINE CR = 13. LF = 10. NOP ;REENTRY POINT ZERO:: BIS #REFLG,@#JSW .PRINT #TTLE ;PRINT TITLE MOV SP,SPST ;SAVE STACK POINTER AGAIN: .SETTOP #FREE .SRESET ;SOFT RESET TO GET RID OF ANY DRIVERS MOV #FREE+2,FREE ;SET START OF FREE SPACE MOV SPST,SP ;RESTORE STACK POINTER MOV #1,R4 ;SET DEFAULT NUMBER OF BLOCK TO 0 .CSISPC #AREA,#DEFLT,#0 ;GET FILE NAME BCC 1$ ;JUMP IF NO ERROR .PRINT #ILLCOM ;ILLEGAL COMMAND ERROR BR AGAIN 1$: TST (SP)+ ;WAS THERE A SWITCH BEQ 4$ ;NO SO JUMP CMPB #'H,(SP) BNE 2$ .PRINT #HLPTXT BR AGAIN 2$: TST (SP)+ ;HAD IT A VALUE BMI 3$ ;YES SO JUMP .PRINT #NOVAL ;COMPLAIN BR AGAIN 3$: MOV (SP),R4 ;TRANSFER NUMBER 4$: TST AREA BNE 21$ ;OUTPUT FILENAME SO JUMP .FETCH FREE,#AREA+36 ;GET DRIVER BCC 5$ ;JUMP IF NO ERRORS .PRINT #NODEV BR AGAIN 5$: MOV R0,FREE ;NEW START OF FREE SPACE .LOOKUP #EMTBUF,#0,#AREA+36 ;OPEN FILE BCC 6$ ;JUMP IF NO ERRORS .PRINT #NOFILE BR AGAIN 6$: TST AREA+40 ;IS THERE FILE NAME BNE 7$ ;JUMP IF THERE IS .DSTAT #EMTBUF,#AREA+36;GET SIZE OF DEVICE (BEFORE NAME DESTR) .GTLIN #AREA,#ALLDEV ;ASK FOR CONFIRMATION CMPB #'Y,AREA ;WAS REPLY YES BNE AGAIN MOV EMTBUF+6,R0 ;DEVICE SIZE IN BLOCKS TO R0 7$: MOV R0,R5 ;FILE LENGTH TO R5 BR DUMMY 21$: .FETCH FREE,#AREA ;GET DRIVER BCC 22$ ;JUMP IF NO ERRORS .PRINT #NODEV BR AGAIN 22$: MOV R0,FREE ;NEW START OF FREE SPACE .ENTER #EMTBUF,#0,#AREA,AREA+10 ;OPEN FILE BCC 23$ ;JUMP IF NO ERRORS .PRINT #NOROOM BR AGAIN 23$: MOV R0,R4 MOV R0,R5 DUMMY: .SETTOP #-2 ;GET ALL AVAILABLE CORE MOV FREE,R1 ;START OF FREE MEMORY SUB R1,R0 ;AMOUNT OF FREE SPACE ROR R0 ;IN WORDS BIC #377,R0 ;UNITS OF 256 WORDS MOV R0,MAXWRD ;STORE 1$: CLR (R1)+ ;CLEAR ALL FREE LOCATIONS DEC R0 BNE 1$ TST AREA ;IS IT NEW FILE BNE 5$ CMP R4,#^RALL ;WAS ALL REQUESTED BNE 2$ ;JUMP IF NOT MOV R5,R4 ;REPLACE "ALL" BY LENGTH OF FILE 2$: .PRINT #LNMSS MOV R5,R1 JSR PC,VALR1 ;PUT OUT FILE LENGTH .PRINT #LEN2 CMP R5,R4 BEQ 3$ .PRINT #LEN3 MOV R4,R1 JSR PC,VALR1 BR 4$ 3$: .PRINT #LEN5 4$: .GTLIN #AREA,#LEN4 ;PRINT FILE LENGTH MESSAGE & GET INFO CMPB #'Y,AREA BNE RETRN ;JUMP IF NOT Y CMP R5,R4 ;CALCULATE FIRST BLOCK TO BE ZEROED BCC 5$ .PRINT #NEGAT ;TOO MANY BLOCKS HERE BR RETRN 5$: MOVB MAXWRD+1,R1 ;NUMBER OF BLOCKS EACH TIME LOOP: CMP R1,R4 BLT 1$ MOV R4,R1 1$: SUB R1,R5 ;NEXT BLOCK NUMBER TO START AT MOV R1,R2 ;NUMBER OF BLOCKS TO R2 SWAB R2 ;NUMBER OF WORDS IN R2 .WRITE #EMTBUF,#0,FREE,R2,R5 ;CLEAR BLOCK BCS WERR SUB R1,R4 ;COUNT BNE LOOP BR RETRN WERR: .PRINT #WMESS ;WRITE ERRORS HERE RETRN: JMP AGAIN ;THIS ROUTINE CONVERTS TO ASCII A NUMBER CONTAINED IN R1 AND PRINTS IT ;VALR1 GIVES SIGNED NUMBER, NUMBR1 GIVES UNSIGNED ;R0 AND R1 ARE USED VALR1: TST R1 BGE NUMBR1 .PRINT #ASCMIN ;PRINT MINUS SIGN NEG R1 NUMBR1: MOV R5,-(SP) MOV R4,-(SP) MOV #NUMTXT,R5 JSR R3,COUNT .WORD 10000. ;SUBROUTINE PARAMETER JSR R3,COUNT .WORD 1000. ;SUBROUTINE PARAMETER JSR R3,COUNT .WORD 100. ;SUBROUTINE PARAMETER JSR R3,COUNT .WORD 10. ;SUBROUTINE PARAMETER ADD #'0,R1 ;REMAINDER TO ASCII MOVB R1,(R5) ;STORE IT MOV #NUMTXT,R0 ;REMOVE LEADING ZEROES 1$: CMPB #'0,(R0)+ ;KEEP GOING WHILE 0 BEQ 1$ CMPB #200,-(R0) ;WAS THIS LAST DIGIT BNE 2$ ;NO SO JUMP DEC R0 ;YES SO MAKE SURE IT IS PRINTED 2$: .PRINT ;PRINT NUMBER MOV (SP)+,R4 MOV (SP)+,R5 RTS PC ;THIS ROUTINE IS USED TO WORK OUT INDIVIDUAL DIGITS FOR PRINTING NUMBER COUNT: MOV (R3)+,R4 ;SUBROUTINE PARAMETER CLR R0 ;CLEAR COUNT 1$: INC R0 ;INCREMENT COUNT SUB R4,R1 ;SUBTRACT OFF DIVISOR BPL 1$ ;KEEP GOING IF POSITIVE ADD R4,R1 ;ADD BACK LAST ONE WHEN NEGATIVE ADD #'0-1,R0 ;ANSWER TO ASCII MOVB R0,(R5)+ ;STORE FOR PRINTING RTS R3 ASCMIN: .ASCII /-/<200> ;NEGATIVE SIGN FOR NUMBER NUMTXT: .ASCII /00000/<200> ;SPACE FOR CONSTRUCTING ASCII NUMBER .EVEN TTLE: .ASCIZ ;Zeroes from ends of files(/H for help); HLPTXT: .ASCII ;dev:filename Zeroes last block;<15><12> .ASCII ;dev:filename/N:n Zeroes last n blocks;<15><12> .ASCII ;dev:filename/N:ALL Zeroes whole file;<15><12> .ASCII ;dev:/N:ALL Zeroes whole of device;<15><12> .ASCII ;dev:filename[n]= Creates,zeroes,deletes file length n; .BYTE 15,12,12 .ASCIZ ;Reply Y or N to questions as appropriate; LNMSS: .ASCII /File length /<200> LEN2: .ASCII / blocks, zero /<200> LEN3: .ASCII /last /<200> LEN4: .ASCII / blocks - Okay ? /<200> LEN5: .ASCII /ALL/<200> WMESS: .ASCIZ /Write hardware error/ NEGAT: .ASCIZ /More blocks specified than in file, reenter/ NOVAL: .ASCIZ /Switch value absent, reenter/ ILLCOM: .ASCIZ /Illegal command/ NODEV: .ASCIZ /Device not found/ ALLDEV: .ASCII /Zero the DEVICE ???? /<7><200> NOFILE: .ASCIZ /File not found/ NOROOM: .ASCIZ /Insufficent space for file/ .EVEN EMTBUF: .BLKW 10 ;FOR EMT CALLS DEFLT: .RAD50 "DAT" ;DEFAULT EXTENSIONS .RAD50 "DAT" .WORD 0 SPST: .WORD 0 ;FOR STACK POINTER AREA: .BLKB 80. ;FOR TT INPUT AND CSISPC MAXWRD: .WORD 0 ;NUMBER OF MEMORY BLOCKS AVAILABLE ;MUST BE END OF PROGRAM HERE FREE: .WORD .+2 ;FREE SPACE FOR DRIVERS ETC .END ZERO