.TITLE AS1 .IDENT /X01/ .NLIST BEX .ENABL LC ; ; AS ; GET AND PARSE COMMAND LINE ; ; VERSION X01 ; ; DAVID G. CONROY 24-MAY-78 ; .GLOBL GCML .MCALL CALL .MCALL RETURN .MCALL DIR$ .MCALL FINIT$ ; ; EQUIVALENCES ; CR = 15 ;ASCII CARRIAGE RETURN ALT = 33 ;ASCII ALTMODE BLANK = 40 ;ASCII BLANK DOLLAR = 44 ;ASCII DOLLAR SIGN ; ; LOCAL DATA ; DIAGNOSTICS ; MSG01: .ASCIZ "Usage: as [-bdgln] file [file ...]" MSG02: .ASCIZ "Too many files!" MSG03: .ASCIZ "x: ignored" MSG04: .ASCIZ "No command line!" .EVEN ;+ ; ** GCML - GET COMMAND LINE ; ; GET A COMMAND LINE FROM MCR AND PARSE IT INTO ITS ARGUMENTS. ; THE POINTERS TO THE ARGUMENTS ARE PUT IN THE GLOBAL VECTOR ; 'ARGV' WITH A 0 WORD AT THE END. IF THE GMCR$ FAILS (NO LINE ; COULD BE OBTAINED) BITCH. ; ; THIS ROUTINE ALSO SEARCHES FOR FLAG OPTIONS (THINGS OF THE ; FORM -???) AND PERFORMS THE REQUIRED ACTION; USUALLY THIS IS ; SETTING FLAG BYTES IN THE ROOT. ; ; USES: ; ALL ;- GCML: FINIT$ ;INITIALIZE THE FSR DIR$ #GMCR ;GET A COMMAND LINE FROM MCR BCC 20$ ;GOT ONE MOV #MSG04,R5 ;ERROR IF GMCR FAILS BR 150$ ; 20$: MOV #GMCR+G.MCRB,R0 ;POINT AT COMMAND LINE MOV #ARGV,R1 ;THIS IS WHERE WE SAVE ARGS 30$: MOVB (R0)+,R2 ;SKIP OVER COMMAND NAME CMPB R2,#CR ; BEQ 130$ ; CMPB R2,#ALT ; BEQ 130$ ; CMPB R2,#BLANK ; BNE 30$ ; 40$: MOVB (R0)+,R2 ;SKIP BLANKS BETWEEN ARGS. CMPB R2,#BLANK ; BEQ 40$ ; CMPB R2,#CR ;CHECK FOR TRICKS BEQ 130$ ; CMPB R2,#ALT ; BEQ 130$ ; CMPB R2,#'- ;OPTIONS BNE 60$ ;NO 50$: MOVB (R0)+,R2 ;YES, GET OPTION CHARACTER CMPB R2,#CR ;TEST FOR THE END BEQ 130$ ; CMPB R2,#ALT ; BEQ 130$ ; CMPB R2,#BLANK ; BEQ 40$ ; CALL OPT ;PROCESS THE OPTION BR 50$ ;GO FOR MORE 60$: CLR R3 ;CLEAR QUOTED ARGUMENT FLAG CMPB R2,#'" ;CHECK FOR QUOTES (BOTH KINDS) BEQ 70$ ; CMPB R2,#'' ; BNE 80$ ; 70$: MOV R2,R3 ;SET FLAG, SAVE DELIMITER CMP R1,#ARGVND ;ROOM? BHIS 140$ ;NO MOV R0,(R1)+ ;SAVE ARGUMENT POINTER BR 90$ ; 80$: CMPB R2,#'< ;THROW REDIRECTION AWAY BEQ 90$ ; CMPB R2,#'> ; BEQ 90$ ; CMP R1,#ARGVND ;NORMAL ARGUMENT BHIS 140$ ;NO ROOM MOV R0,(R1) ;SAVE THE POINTER DEC (R1)+ ; 90$: MOVB (R0)+,R2 ;GATHER UP AN ARGUMENT CMPB R2,#CR ;LOOK FOR THE END BEQ 110$ ; CMPB R2,#ALT ; BEQ 110$ ; TST R3 ;IN QUOTED FIELD BNE 100$ ;BR IF YES CMPB R2,#BLANK ;IF NOT, BLANK IS A DELIMITER BEQ 110$ ; BR 90$ ; 100$: CMPB R2,R3 ;LOOK FOR MATCHING QUOTE BNE 90$ ; 110$: CLRB -1(R0) ;MAKE THE ARGUMENT STRING ASCIZ CMPB R2,#CR ;SEE IF GAME OVER BEQ 120$ ; CMPB R2,#ALT ; BNE 40$ ; 120$: TST R3 ;CHECK FOR HANGING QUOTE BNE 140$ ;ERROR 130$: CMP R1,#ARGV ;DID WE GET ANY ARGUMENTS BNE 160$ ;YES MOV #MSG01,R5 ;NO, GIVE USAGE MESSAGE BR 150$ ; 140$: MOV #MSG02,R5 ;TOO MANY ARGUMENTS 150$: CALL MSG ; SEC ;ERROR RETURN BR 170$ ; 160$: CLR (R1) ;MARK THE END OF THE ARGV CLC ; 170$: RETURN ; ;+ ; ** OPT - PROCESS OPTIONS ; ; INPUTS: ; R2=OPTION CHARACTER ; ; OUTPUTS: ; R2=OPTION CHARACTER MAPPED TO UPPER CASE ; ; USES: ; R5 ;- OPT: CMPB R2,#141 ;CASE MAPPING BLO 10$ CMPB R2,#172 BHI 10$ SUB #BLANK,R2 10$: CMPB R2,#'G ;-G GLOBAL BNE 20$ INCB GFLAG BR 50$ 20$: CMPB R2,#'B ;-B BRANCHES BNE 25$ INCB BFLAG BR 50$ 25$: CMPB R2,#'L ;-L LISTING BNE 30$ ; INCB LFLAG ; BR 50$ ; 30$: CMPB R2,#'N ;-N NO OBJECT BNE 35$ INCB NFLAG BR 50$ 35$: CMPB R2,#'D ;-D DELETE SOURCE BNE 40$ INCB DFLAG BR 50$ 40$: MOVB R2,MSG03 ;ILLEGAL OPTION MOV #MSG03,R5 CALL MSG 50$: RETURN .END