.TITLE .RFILN - READ FILE NAME ; ; INPUTS: R0 = FDB OF FILE WHOSE NAME IS TO BE RETURNED. ; R1 = STRING WHERE NAME IS TO BE RETURNED. ; R2 = A UNIT # WHICH CAN BE PLAYED WITH FREELY. ; .MCALL NMBLK$,QIOW$,ALUN$S .MCALL NBOFF$,FDOFF$,FHDOF$ NBOFF$ DEF$L FDOFF$ DEF$L FHDOF$ DEF$L .RFILN:: MOV R5,-(SP) ;SAVE REGISTERS. MOV R3,-(SP) ; MOV R2,-(SP) ; MOV R0,R5 ;POINT TO FDB FROM R5 MOV F.FNB+N.DID(R5),DIRFNB+N.FID MOV F.FNB+N.DID+2(R5),DIRFNB+N.FID+2 MOV F.FNB+N.DID+4(R5),DIRFNB+N.FID+4 MOV F.FNB+N.DVNM(R5),DIRFNB+N.DVNM MOV F.FNB+N.UNIT(R5),DIRFNB+N.UNIT ; ALUN$S R2,DIRFNB+N.DVNM,DIRFNB+N.UNIT ;ASSIGN DEVICE. MOVB R2,$REDDR+Q.IOLU ;AND ASSIGN UNIT # MOV #$REDDR,-(SP) CALL .DIRDL ;READ THE HEADER OF THE DIRECTORY. BCS 90$ ;GET OUT ON ERROR. MOV R1,R0 ;GET THE POINTER TO THE STRING. MOVB F.FNB+N.DVNM(R5),(R0)+ ;OUTPUT FILE DEVICE NAME. MOVB F.FNB+N.DVNM+1(R5),(R0)+ ; CLR R2 ;CONVERT TO MAGNITUDE. MOV F.FNB+N.UNIT(R5),R1 ;GET THE UNIT # CALL $CBOMG ;CONVERT THE UNIT NUMBER. MOVB #':,(R0)+ ;MOVE IN A : FOR THE DEVICE. MOVB #'[,(R0)+ ;AND UIC MOVB HEADER+H.IDOF,R3 ;GET ID OFFSET. ASL R3 ;MAKE INTO WORDS. MOV HEADER+I.FNAM(R3),R1 ;GET FIRST PART OF FILE NAME. CALL $C5TA ;CONVERT TO ASCII CALL UICPRT ;PRETTY UP UIC MOVB #',,(R0)+ ;MOVE IN A , MOV HEADER+I.FNAM+2(R3),R1 ;GET SECOND PART OF FILE NAME. CALL $C5TA ;CONVERT TO ASCII. CALL UICPRT ;PRETTY UP UIC MOVB #'],(R0)+ ;COMPLETE UIC. MOV F.FNB+N.FNAM(R5),R1 ;GET FILE NAME. CALL $C5TA ;FIRST 3 CHARS MOV F.FNB+N.FNAM+2(R5),R1 ; CALL $C5TA ;SECOND 3 CHARS. MOV F.FNB+N.FNAM+4(R5),R1 CALL $C5TA ;AND LAST 3 CHARS. 20$: CMPB #' ,-(R0) ;LOOK FOR LAST NON-BLANK BEQ 20$ ; INC R0 ;SKIP PAST FIRST NON-BLANK. MOVB #'.,(R0)+ ;MOVE IN A . MOV F.FNB+N.FTYP(R5),R1 ;GET FILE TYPE. CALL $C5TA ;CONVERT TO ASCII 30$: CMPB #' ,-(R0) ;LOOK FOR LAST NON-BLANK. BEQ 30$ ; INC R0 ;SKIP PAST IT. MOVB #';,(R0)+ ;OUTPUT A ; MOV F.FNB+N.FVER(R5),R1 ;GET VERSION NUMBER. CLR R2 ;TO UNSIGNED OCTAL. CALL $CBOMG ; CLC ;CLEAR ERROR. 80$: MOV R0,R1 ;RECOVER CORRECT R1 MOV R5,R0 ;RECOVER CORRECT R0 MOV (SP)+,R2 ;RECOVER REGISTERS. MOV (SP)+,R3 ; MOV (SP)+,R5 ; RETURN ;AND RETURN. 90$: SEC ;SET ERROR RETURN. BR 80$ ;AND RETURN. UICPRT: CMPB -3(R0),#'0 ;IS THE FIRST CHARACTER A 0? BNE 80$ ;NO MOVB -2(R0),-3(R0) ;YES, FIX IT UP. MOVB -1(R0),-2(R0) DEC R0 ;DEC R0 TO FIX UP UIC. CMPB -2(R0),#'0 ;IS THE SECOND CHARACTER A 0 TOO? BNE 80$ ;NO MOVB -1(R0),-2(R0) ;YES, FIX IT UP TOO. DEC R0 ;POINT PAST UIC. 80$: RETURN ;AND RETURN. $REDDR: QIOW$ IO.RAT,,1,,IOST,, IOST: .WORD 0,0 DIRFNB: NMBLK$ 000000,DIR,,SY,0 RDHDR: .BYTE -12,0 ;BLOCK TO READ FILE HEADER. .WORD HEADER ; .WORD 0 HEADER: .BLKB 1000 .END