.TITLE FNMASC .IDENT /V01/ .ENABLE LC ; ; This module converts a filename in an RSX filename block into an ASCII string ; ; Author: V01 25-Jan-80 Phil Stephensen-Payne ; ; Calling Sequence: ; ; This subroutine is called via the standard FORTRAN callingg sequence as: ; ; CALL FNMASC(BLOCK,UIC,STRING [,ERROR]) ; or ; STATUS = FNMASC(BLOCK,UIC,STRING) ; ; Where:- ; BLOCK = THE RSX FILENAME BLOCK ; UIC = THE FILE UIC ; STRING = THE ADDRESS OF THE OUTPUT STRING ; ERROR = AN OPTIONAL ERROR RETURN ; Errors Returned: ; ; STATUS = 0 if the operation was successful ; = -1 if there was a parameter error ; ; External References: ; ; This module calls the subroutines BINASC, RADASC & PRMCHK. .MCALL $CALLG ;FORTRAN COMPATIBLE CALL MACRO .MCALL $BASTS ;BINASC STATUS WORD SET-UP MACRO ; ; NUMBER: .BLKW 2 ;TEMPORARY STORE FOR NUMBER CONVERSIONS NUMCHR: .WORD ;NUMBER OF CHARACTERS TO CONVERT RADIX: .WORD 8. ;RADIX FOR CONVERSIONS RESULT: .WORD ;STATUS/ERROR RETURN ; ; FIRST WE COPY OVER THE DEVICE IF THE DEVICE NAME IS NON-ZERO ; FNMASC:: MOV #4,R0 ;FOUR PARAMETERS CALL PRMCHK ;CHECK THEM BCC 10$ ;If CC parameters OK - carry on ; 5$: JMP FNMEND ;TERMINATE ; 10$: TST (R5)+ ;IGNORE NUMBER OF PARAMETERS BIT #1,(R5) ;BLOCK MUST BE WORD-ALIGNED BEQ 20$ ;IF EQ OK - CARRY ON MOV #-1,R0 ;ELSE FLAG ERROR JMP FNMEND ;AND EXIT ; 20$: MOV (R5)+,R1 ;GET ADDRESS OF FILENAME BLOCK MOV (R5)+,R2 ;AND ADDRESS OF UIC MOV (R5),R3 ;AND ADDRESS OF OUTPUT MOV #38.,R4 ;GET LENGTH TO INITIALISE ; 25$: MOVB #' ,(R3)+ ;SET FIELD TO BLANKS SOB R4,25$ ; MOV (R5),R3 ;GET ADDRESS BACK ; ; NOW WE COPY/CONVERT THE DEVICE-NAME IF ONE IS GIVEN ; TST N.DVNM(R1) ;ANY DEVICE-NAME? BEQ 40$ ;IF EQ NO - DON'T CONVERT IT MOVB N.DVNM(R1),(R3)+ ;YES - COPY THE NAME MOVB N.DVNM+1(R1),(R3)+ ; MOV #6,NUMCHR ;CONVERT UNIT AS UP TO SIX CHARS $BASTS RESULT,LEFT,NOSIGN ;LEFT-ADJUSTED UNSIGNED MOV N.UNIT(R1),NUMBER ;GET UNIT NUMBER $CALLG BINASC,#NUMBER,#NUMCHR,#RADIX,R3,#RESULT ;CONVERT IT ; 30$: CMPB (R3)+,#' ;A BLANK? BNE 30$ ;IF NE NO - CHECK NEXT ONE MOVB #':,-1(R3) ;INSERT TRAILING COLON ; 40$: CMP R2,#-1 ;ANY UIC SPECIFIED? BEQ 50$ ;IF EQ NO - OMIT IT MOVB #'[,(R3)+ ;INSERT LEADING BRACKET MOV #3,NUMCHR ;CONVERT TO THREE CHARS $BASTS RESULT,LEFT,NOSIGN ;WITH LEADING ZEROS CLR NUMBER ;INSERT GROUP NUMBER MOVB 1(R2),NUMBER ; $CALLG BINASC,#NUMBER,#NUMCHR,#RADIX,R3,#RESULT ;CONVERT GROUP ; 45$: CMPB #' ,(R3)+ ;BLANK? BNE 45$ ;IF NE NO - CHECK NEXT ONE MOVB #',,-1(R3) ;INSERT SEPERATOR MOVB (R2),NUMBER ;GET MEMBER NUMBER $BASTS RESULT,LEFT,NOSIGN ;LEFT-ADJUSTED UNSIGNED $CALLG BINASC,#NUMBER,#NUMCHR,#RADIX,R3,#RESULT ;CONVERT THAT ; 47$: CMPB #' ,(R3)+ ;BLANK? BNE 47$ ;IF NE NO - CHECK NEXT ONE MOVB #'],-1(R3) ;INSERT TRAILING BRACKET ; 50$: MOV #3,NUMCHR ;CONVERT THREE RAD50 WORDS MOV R1,R2 ;GET ADDRESS OF FILENAME ADD #N.FNAM,R2 ; $CALLG RADASC,#NUMCHR,R2,R3,#RESULT ;CONVERT FILENAME ; 60$: CMPB (R3)+,#' ;A SPACE? BNE 60$ ;NO - TRY NEXT ONE MOVB #'.,-1(R3) ;YES - INSERT TRAILING DOT MOV #1,NUMCHR ;CONVERT ONE RAD50 WORD MOV R1,R2 ;GET ADDRESS OF FILE EXTENSION ADD #N.FTYP,R2 ; $CALLG RADASC,#NUMCHR,R2,R3,#RESULT ;CONVERT FILETYPE ; 70$: CMPB (R3)+,#' ;A SPACE? BNE 70$ ;IF NE NO - TRY NEXT ONE MOVB #';,-1(R3) ;YES - INSERT TRAILING SEMI-COLON MOV N.FVER(R1),NUMBER ;GET FILE VERSION $BASTS RESULT,LEFT,NOSIGN ;SET UP CONVERSION TYPE MOV #6,NUMCHR ;ALLOW UP TO SIX CHARS $CALLG BINASC,#NUMBER,#NUMCHR,#RADIX,R3,#RESULT ;CONVERT IT CLR R0 ;THAT'S IT - SET SUCCESS ; FNMEND: RETURN .END