.TITLE DIR - SCL 'DIRECTORY' COMMAND .IDENT /V01/ .MCALL DIR$,EXIT$S,GMCR$,RQST$,.ENB,.INH ;+ ; VERSION 01 ; ; REID L BROWN 31-JAN-77 ; ; MODIFIED BY: ; ; NO MODIFICATIONS ; ; ; **-DIRECTORY- SCL 'DIRECTORY' COMMAND FOR RSX11D MCR INTERFACE ; ; THIS PROGRAM ACCEPTS AN IAS-FORMAT 'DIR' COMMAND, WHICH IT CONVERTS ; INTO THE APPROPRIATE INVOCATION OF ...PIP, THROUGH USE OF A NEW MCR ; COMMAND LINE. 'FULL' AND 'BRIEF' SWITCHES MAY MODIFY THE COMMAND ON ; EITHER THE COMMAND OR THE FILESPEC. ; ; THE COMMAND FORMAT IS: ; ; DIR[RECTORY][/SWITCHES] [FILESPEC][/SWITCHES] ; ; SWITCHES:= /FULL[:132.] - FULL LISTING ; /BRIEF - ABBREVIATED LISTING ; ;- ; ; LOCAL DATA, DPB'S ; RQSPIP: RQST$ ...PIP ;REQUEST DIRECTIVE FOR PIP MCR: GMCR$ ;42 WORD DPB FOR THE GET MCR DIRECTIVE CMDLIN: .WORD CMDLEN ;LENGTH OF COMMAND (BYTES) .ASCII /PIP TI:=/ ;TRANSLATION COMMAND CMDLEN= .-CMDLIN-2 .EVEN DEFSW: .WORD DEFLEN ;LENGTH OF THE DEFAULT SWITCH .ASCII ^/LI^ ;DEFAULT PROMPT = /LI DEFLEN= .-DEFSW-2 ;LENGTH OF THE PROMPT .EVEN FLAGS: .WORD 0 ;PARSING FLAG WORD SWONCM = 1 ;SWITCH FOUND ON COMMAND BIT SWONFN = 2 ;SWITCH FOUND ON FILENAME INFILE = 4 ;PARSING FILENAME ( .NOT. COMMAND) FILELN: .WORD 0 ;LENGTH & ADDRESS OF FILENM: .WORD 0 ; FILESPEC STRING SWITLN: .WORD 0 ;LENGTH & ADDRESS OF SWITCH: .WORD 0 ; OF THE SWITCH STRING ; ; GET THE COMMAND LINE ; DIR:: DIR$ #MCR,ERROR ;TRY TO GET AN MCR COMMAND LINE MOV $DSW,R5 ;GET THE NUMBER OF BYTES ENTERED ; ; PARSE THE COMMAND & FILENAME STRING ; MOV #MCR+5,R0 ;POINT PAST 'DIR' IN THE COMMAND LINE SUB #3,R5 ;AND ADJUST THE LINE LENGTH 10$: MOVB (R0)+,R1 ;GET THE NEXT CHAR IN THE COMMAND DEC R5 ;COUNTDOWN THE REMAINING NO. OF CHARS BLE 40$ ;COMMAND STRING DONE - CLEAN UP & EXIT CMPB R1,#'/ ;FOUND START OF SWITCH? BNE 20$ ;NO - CONTINUE MOV R0,SWITCH ;YES - SAVE START ADDRESS DEC SWITCH ;(ADJUST THE ADDR FOR THE '/') BIS #SWONCM,FLAGS ;AND FLAG THAT IT WAS FOUND BIT #INFILE,FLAGS ;ARE WE PARSING THE FILENAME? BEQ 10$ ;NO - CONTINUE BIS #SWONFN,FLAGS ;YES - INDICATE IT IS A FILESPEC SWITCH BR 10$ ;& CONTINUE ; ; NOTE: THE FOLLOWING TEST DEPENDS UPON ...MCR MASSAGING THE INPUT ; LINE TO REMOVE MULTIPLE BLANKS AND 'S. ; 20$: CMPB R1,#40 ;BLANK? BNE 10$ ;NO - CONTINUE BIT #INFILE,FLAGS ;ARE WE ALREADY IN THE FILENAME? BNE 10$ ;YES - FORGET ABOUT BLANKS CMPB (R0),#'/ ;IS THE NEXT STRING A SWITCH? BEQ 10$ ;YES - IGNORE THE IMBEDDED SPACE BIT #SWONCM,FLAGS ;WE ARE AT COMMAND'S END - END THE SWITCH? BEQ 30$ ;NO SWITCH TO TERMINATE - CONTINUE MOV R0,SWITLN ;SAVE THE ENDING ADDRESS+1 SUB SWITCH,SWITLN ;COMPUTE THE LENGTH +1 DEC SWITLN ;AND ADJUST IT. 30$: MOV R0,FILENM ;SAVE THE START OF THE FILESPEC BIS #INFILE,FLAGS ;FLAG THAT WE ARE IN THE FILESPEC BR 10$ ;& CONTINUE ; ; EXIT PARSE ; 40$: BIT #INFILE,FLAGS ;DOES FILENAME REQUIRE A LENGTH? BEQ 43$ ;NO - CONTINUE MOV R0,FILELN ;YES - GET END ADDRESS SUB FILENM,FILELN ;COMPUTE THE LENGTH BR 45$ ;GO ON 43$: BIT #SWONCM,FLAGS ;NO FILESPEC - UNTERMINATED COMMAND SW? BEQ 45$ ;NO - CONTINUE MOV R0,SWITLN ;SET THE SWITCH END ADDR SUB SWITCH,SWITLN ;CALCULATE LENGTH 45$: MOV #CMDLEN,R5 ;GET LENGTH OF NEW COMMAND ADD FILELN,R5 ;ADD THE MAX FILE LENGTH ADD SWITLN,R5 ;AND THE MAXIMUM SWITCH LENGTH CMP R5,#70. ;SEE IF WILL FIT - GIVE PLENTY OF EXTRA SPACE BGT ERROR ;EXIT IF TOO BIG ; ; PICK AN MCR BUFFER, LOAD IT AND QUEUE IT ; MOV #6,R3 ;SETUP TO PICK 6 NODES (96 BYTES) CALL ..PICV ;AND TRY TO GET THEM BCS ERROR ;NO NODES - EXIT MOV R4,R1 ;SAVE THE MCR BUFFER ADDRESS MOV .CRTSK,R3 ;GET MY ATL ADDRESS MOV A.TI(R3),M.TI(R4) ;AND USE IT TO GET MY TI ADDRESS MOV RQSPIP+R.QSTN+2,M.TN(R4) ;MOVE TASK NAME TO MCR BUFFER MOV #CMDLIN,R2 ;POINT TO THE NEW COMMAND MOV (R2),R3 ;GET THE COMMAND LENGTH ADD #M.BF,R4 ;POINT TO THE 1ST DATA BYTE ; ; XFER IN THE COMMAND LINE & FILESPEC ; MOV (R2)+,R3 ;GET THE COMMAND LINE LENGTH 50$: MOVB (R2)+,(R4)+ ;TRANSFER THE COMMAND TO THE MCR BUFFER SOB R3,50$ ;... ; ; ADD APPROPRIATE FILESPEC & SWITCHES FROM PARSE ; TST FILELN ;ANY FILESPEC TO COPY? BEQ 70$ ;NO - GO SEE ABOUT SWITCHES MOV FILELN,R3 ;GET THE LENGTH MOV FILENM,R2 ;AND THE START ADDRESS 60$: MOVB (R2)+,(R4)+ ;COPY THE FILESPEC SOB R3,60$ ;... 70$: BIT #SWONFN,FLAGS ;WAS SWITCH ON FILESPEC? BNE 90$ ;YES - ALL DONE BIT #SWONCM,FLAGS ;IF NOT, WAS IT ON THE COMMAND? BEQ 80$ ;NO - DEFAULT TO '/LI' MOV SWITLN,R3 ;GET THE SWITCH LENGTH MOV SWITCH,R2 ;AND ITS ADDRESS 75$: MOVB (R2)+,(R4)+ ;COPY TO THE COMMAND STRING SOB R3,75$ ;... BR 90$ ;CONTINUE... 80$: MOV #DEFSW,R2 ;POINT TO THE DEFAULT SWITCH MOV (R2)+,R3 ;SETUP THE LENGTH 85$: MOVB (R2)+,(R4)+ ;COPY THE DEFAULT SWITCH SOB R3,85$ ;... 90$: MOV R4,R3 ;COPY THE CURRENT ENDING ADDRESS SUB R1,R3 ;CALCULATE THE BUFFER LENGTH SUB #M.BF,R3 ;AND ADJUST FOR THE HEADER. MOV R3,M.BC(R1) ;SET UP THE COMMAND LENGTH ; ; SETUP HEADER & BUFFER FOR CORRECT MCR PROMPT SEQUENCE ; MOV .CRTSK,R3 ;GET MY ATL ADDRESS MOV #77406,-(SP) ;STACK UP A PDR TO ALLOW FULL MEMORY ACCESS MOV A.HA(R3),-(SP) ;AND SET UP MY HEADER ADDR AS THE APR CALL ..SPD3 ;AND MAP APR #3 ONTO MY OWN TASK HEADER CMP (SP)+,(SP)+ ;THROW AWAY THE OLD PDR,PAR PAIR .INH ;DON'T ALLOW TASK SWITCHING MOVB #33,(R4) ;LOAD AN ESCAPE - ASSUME NO PROMPT BIT #HF.RMC,60000+H.EAF ;IS MY MCR PROMPT BIT SET? BEQ 99$ ;NO - EVERYTHING IS OK MOVB #15,(R4) ;YES - SET THE MCR BUFFER TO REPROMPT TOO 99$: BIC #HF.RMC,60000+H.EAF ;AND CLEAR MY REPROMPT IN ANY CASE .ENB ;RE-ENABLE INTERRUPTS ; ; QUEUE THE BUFFER & REQUEST ...PIP ; MOV #.MCRLH,R4 ;POINT TO MCR BUFFER LISTHEAD CALL ..NADD ;AND ADD IT TO THE QUEUE (R1 HAS THE ADDR) DIR$ #RQSPIP,ERROR ;REQUEST ...PIP ERROR: EXIT$S ;DONE .END DIR