.TITLE EDI01 .IDENT /X01/ .NLIST BEX ; ; EDITOR (TEMP FILE VERSION) ; ; VERSION X01 ; ; DAVID G. CONROY 10-APR-78 ; LAST UPDATED: 13-AUG-79 ; REMOVE THE "^" FOSSIL. ; 21-AUG-79 ; CORRECT STRANGE BEHAVIOR FOR 1/A/, ETC. ; .GLOBL ADDRES .GLOBL GETNUM .MCALL CALL .MCALL CALLR .MCALL RETURN ; ; LOCAL EQUIVALENCES ; BLANK = 40 ;ASCII BLANK TAB = 11 ;ASCII TAB ;+ ; ** ADDRES - GET A LINE ADDRESS ; ; OUTPUTS: ; R0=DELIMITER ; R2=ADDRESS ; ; USES: ; R1, R3 ;- ADDRES: CLR R2 ;NO ADDRESS CLR R3 ;NO '+' OR '-' SIGNS 10$: CALL GETC ;GET A CHARACTER CMP R0,#BLANK ;DELETE WHITESPACE BEQ 10$ ; CMP R0,#TAB ; BEQ 10$ ; CMP R0,#'0 ;TEST FOR NUMBERS BLO 40$ ; CMP R0,#'9 ; BHI 40$ ; CALL GETNUM ;GET THE NUMBER VALUE TST R2 ;IF NO ADDRESS BNE 20$ ;THEN MOV ZERO,R2 ;START AT LINE 0 20$: TST R3 ;GO IN THE CORRECT DIRECTION BPL 30$ ; NEG R1 ; 30$: ASL R1 ;FIX THE LINE ADD R1,R2 ;ADDRESS CLR R3 ;RESET '+' AND '-' SIGNS BR 10$ ;AND GO FOR MORE 40$: CMP R0,#'+ ;PLUS SIGN BNE 50$ ;NO INC R3 ;ADD IN A PLUS SIGN TST R2 ;IF NO ADDR YET BNE 10$ ; MOV DOT,R2 ;START AT CURRENT LINE BR 10$ ; 50$: CMP R0,#'- ;MINUS SIGN BNE 60$ ;NO DEC R3 ;ADD IN A MINUS SIGN TST R2 ;IF NO ADDR YET BNE 10$ ; MOV DOT,R2 ;START AT CURRENT LINE BR 10$ ; 60$: CMP R0,#'. ;DOT BNE 70$ ;NO TST R3 ;+. IS AN ERROR BNE ERR4 ; MOV DOT,R2 ;SET DOT BR 10$ ; 70$: CMP R0,#'$ ;DOLLAR BNE 80$ ;NO TST R3 ;+$ IS AN ERROR BNE ERR4 ; MOV DOL,R2 ;SET DOLLAR BR 10$ ; 80$: CMP R0,#'/ ;FORWARD SEARCH BNE 90$ ;NO TST R3 ;ERROR IF ANY SIGNS BNE ERR4 ; CALL COMPIL ;COMPILE THE PATTERN TST R2 ;ANY ADDRESS? BEQ 82$ ;NO. MOV R2,DOT ;YES, RESET DOT. 82$: MOV DOT,-(SP) ;GET WHERE TO BEGIN. 84$: ADD #2,(SP) ;MORE FORWARD A LINE CMP (SP),DOL ;WRAP AROUND THE END BLOS 86$ ; MOV ZERO,(SP) ; 86$: CMP (SP),ZERO ;AT THE START BEQ 88$ ;YES MOV (SP),R0 ;LOOK FOR A MATCH IN THE LINE MOV (R0),R0 ; CALL GETLIN ; MOV #LBUF1,R0 ; CALL AMATCH ; BCC 99$ ;YES 88$: CMP (SP),DOT ;ALL THE WAY AROUND YET BNE 84$ ;NO BR ERR1 ;YES, ERROR 90$: CMP R0,#'? ;BACKWARD SEARCH BNE 100$ ;NO TST R3 ;NO SIGNS ALLOWED BNE ERR4 ; CALL COMPIL ;COMPILE THE PATTERN TST R2 ;ANY ADDRESS? BEQ 92$ ;NO. MOV R2,DOT ;YES, RESET DOT. 92$: MOV DOT,-(SP) ;GET WHERE TO START. 94$: SUB #2,(SP) ;BACKUP A LINE CMP (SP),ZERO ;AT THE START BHI 96$ ;NO BEQ 98$ ;EXACTLY MOV DOL,(SP) ;IF BELOW, WRAP AROUND 96$: MOV (SP),R0 ;CHECK FOR A MATCH MOV (R0),R0 ; CALL GETLIN ; MOV #LBUF1,R0 ; CALL AMATCH ; BCC 99$ ;YES 98$: CMP (SP),DOT ;ALL THE WAY AROUND BNE 94$ ;NO BR ERR1 ;YES, ?1 99$: MOV (SP)+,R2 ;USE THE ADDRESS JMP 10$ ; 100$: ASL R3 ;APPLY TRAILING SIGN FIX ADD R3,R2 ; BEQ 110$ ;BR IF NO ADDRESS AT ALL CMP R2,ZERO ;TEST IF IN THE BUFFER BLO ERR6 ;NO CMP R2,DOL ;MAYBE BHI ERR6 ;NO 110$: RETURN ;THIS IS THE ONLY RETURN ERR1: MOV #1,R1 ;SEARCH FAILED JMP ERROR ; ERR4: MOV #4,R1 ;ADDRESS SYNTAX ERROR JMP ERROR ; ERR6: MOV #6,R1 ;ADDRESS OUT OF RANGE JMP ERROR ; ;+ ; ** GETNUM - GET A DECIMAL NUMBER ; ; INPUTS: ; R0=FIRST CHARACTER OF NUMBER ; ; OUTPUTS: ; R1=NUMBER ; ; USES: ; R0 ;- GETNUM: MOV R0,R1 ;USE FIRST CHARACTER 10$: SUB #'0,R1 ;REMOVE ASCII BIAS CALL GETC ;GET CHARACTER CMP R0,#'0 ;CHECK FOR VALID DIGITS BLO 20$ ;NO CMP R0,#'9 ; BHI 20$ ;NO ASL R1 ;R1 = 10*R1 MOV R1,-(SP) ; ASL R1 ; ASL R1 ; ADD (SP)+,R1 ; ADD R0,R1 ;UP BR 10$ ;DIGIT 20$: MOV R0,PEEK ;PUT TERMINATOR BACK RETURN ;FINIS .END