We assume that GETCHR is a subroutine we can call which reads a character of input and returns it in A.
GETSIX: MOVEI B,0
MOVE C,[440600,,B] ;Byte pointer for storing into B.
GETSX1: PUSHJ P,GETCHR ;Read next character into A.
CAIN A,40
JRST [ JUMPE B,GETSX1 ;Flush leading blanks
POPJ P,] ;but trailing blanks are terminators.
CAIL A,"A+40
CAILE A,"Z+40
JRST .+2 ;Not lower case
TRZ A,40 ;Make lower case into upper case
CAIL A,"A
CAILE A,"Z
JRST .+2
JRST GETSX2 ;Letters are ok in sixbit
CAIN A,^Q ;^Q means "quote": use the next char
JRST [ PUSHJ P,GETCHR ;even if it is usually a delimiter.
JRST GETSX2]
CAIL A,"0
CAILE A,"9
POPJ P, ;Not a letter, not a digit. This is delim.
GETSX2: SUBI A,40 ;Convert to sixbit
TLNE C,770000 ;Skip if already got 6 characters.
IDPB A,C ;Otherwise we would clobber C here.
JRST GETSX1
You don't need to write a filename parsing routine, because you can
use the library SYSENG;RFN >. However, RFN is a good example to read.