;MACRO COMMAND PROCESSOR FOR PCP-LIKE FUNCTIONS. ; .TITLE MAPRO ;FOR PCP-LIKE COMMAND REPLACEMENT. ; ;G. EVERHART 8/16/76 ; ;USSE: ; ; CALL WITH ADDRESS OF LINE TO USE IN R1 AND FLAG IN R2. ; ;AND PUT LINE SIZE IN R3. ALL REGISTERS WILL BE PRESERVED ACROSS ;THE CALL. ARGUMENTS WILL BE STORED INTERNALLY AND REPLACED IN CORE. ; ;FLAG IN R2 IS 0 IF READING TTY AND NONZERO OTHERWISE. IF READING ;TTY, WILL SEEK FIRST "$" AND THEREAFTER WILL LOOK FOR ARGUMENTS ;OF FIXED LENGTH POSITIONALLY. ARGUMENTS WILL BE 9 CHARACTERS ;LONG SEPARATED BY "^" (WHICH IS LOWER-CASE ON AN LA30 AND IS ;OTHERWISE INFREQUENTLY USED. ; ;COMMAND SYNTAX WILL RESEMBLE DOS PCP EXCEPT THAT INSTEAD OF ;CONTROL CHARACTERS, ? FOLLOWED BY CHARACTER WILL REPLACE CHARACTER ;AND ARGUMENTS WILL BE 9 CHARACTERS LONG INSTEAD OF 6. ;THERE WILL STILL BE 16 ARGUMENTS, POSITIONALLY PASSED AND GLOBAL ;AS WITH PCP. ; ;?WN (N SPECIFIED AS DOS PCP) MAKES 9 CHARACTERS GET REPLACED ;BY ARGUMENT N, NULL FILLED. ; ;?QN FILLS IN ARG N IF IT WAS 9 NULLS ; ;?YN FILLS IN UNCONDITIONALLY ; ;?VN NULLS ARG N ; ;?RN PUTS SEMICOLON AHEAD OF LINE (EFFECTIVE NULL) UNLESS ARG ;N WAS 9 NULLS ;OTHERWISE MOVES LINE DOWN OVER THE ?RN ; ;?SNMMMMMMMMM SUBTRACTS MASK "MMMMMMMMM" FROM ARG N ; ;?TNMMMMMMMMM NULLS CHAR IN ARG N CORRESPONDING TO POSITION IN MASK ;M IF MASK CHAR WAS @, LEAVES ALONE IF MASK WAS ?, AND COPIES ;CHARACTER IN MASK TO ARGUMENT IFF CHAR IN ARGUMENT WAS NULL FOR ;ALL OTHER TYPES OF MASK CHARACTER ; ;ARGS STORED HERE INTERNALLY .PSECT ARGSAV,RW ARGS: .BLKB 9.*16. ;STORAGE FOR 16 ARGS 9 CHARS LONG .PSECT MACS,RO ;PURE CODE SECTION MACDO:: MOV R0,-(SP) ;PRESERVE ALL REGS ACROSS CALL MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) MOV R5,-(SP) ; ;ON CALL ; R1 POINTS TO LINE ; R2 IS NON-0 IF IN PROCEDURE ; R3 HAS LINE LENGTH ; LNOFST=10;STACK OFFSET TO LINE ADDR FLGOFS=6 ;STACK OFFSET TO FLAG SIZOFS=4 ;STACK OFFSET TO LINE LENGTH ; ;A LINE BEGINNING WITH / WILL BE USED TO GET ARGUMENTS A32: CMPB @R1,#'/ BNE 1$ JSR PC,PGT. 1$: JSR PC,RP. ;REPLACE ARGS IF NEEDED ; CLR R5 BISB @R1,R5 ;PUT POSSIBLE "?" IN R5 SWAB R5 BISB 1(R1),R5 ;BISB AVOIDS SIGN EXTEND ;R5 NOW HAS REVERSED CHARS SWAB R5 ;MAKE THIS PGM EASIER TO READ CMP R5,#"?Y BNE CTL.Z ;?Y COMMAND JSR PC,PARAMM ;GET PARAM ADDR ; CTL.DO: MOVB (R1)+,(R0)+ ;COPY ARG DEC R3 BNE CTL.DO JMP CTL.CM CTL.Z: CMP R5,#"?Q ;CONDITIONAL REPLACEMENT BNE CTL.VE JSR PC,PARAMM MOV R0,R2 MOV R3,R4 ;R4 OTHERWISE UNUSED 1$: TSTB (R2)+ ;CHECK ARG FOR NULL BEQ 14$ JMP CTL.CM ;NO ACTION IF NOT NULL 14$: ;IF NULL KEEP TESTING DEC R4 BNE 1$ BR CTL.DO CTL.VE: CMP R5,#"?V ;NULL CELL? BNE CTL.RN ;NO JSR PC,PARAMM 1$: CLRB (R0)+ ;CLEAR CELL DEC R3 BNE 1$ JMP CTL.CM ; ; CTL.RN: CMP R5,#"?R ;CONDITIONAL EXECUTION OF LINE BNE CTL.SN ;NO (WHEW!) JSR PC,PARAMM ;OK, FIND OUT IF NULL 1$: TSTB (R0)+ ;CHECK ALL CHARACTERS BNE CTL.CC DEC R3 BNE 1$ BR ZPTHR CTL.CC: MOVB #';,@R1 ;NON-NULL. COMMENT LINE AND EXIT JMP CTL.CM ZPTHR: ;OK, A NULL ARG. MOVE LINE DOWN SUB #3,R1 ;BACK OVER ?RN MOV SIZOFS(SP),R3 ;RESTORE SIZE FROM STACK JSR R5,S.RSAV ;SAVE REGS DURING THIS MOV R1,R2 ADD #3,R2 ;POINT PAST "?RN" SUB #3,R3 ;MOVE DOWN 1$: MOVB (R2)+,(R1)+ ;MOVE DOWN BUFFER DEC R3 BGT 1$ CLRB (R1)+ CLRB (R1)+ ;NULL LAST 3 CHARS CLRB (R1)+ JSR R5,S.RRES ;PUT REGS BACK MOV FLGOFS(SP),R2 ;PUT TTY FLAG BACK JMP A32 ;REPROCESS LINE IF POSSIBLE CTL.SN: CMP R5,#"?S BNE CTL.XT ;NOT SUBTRACT ARG JSR PC,PARAMM ;YES, SUBTRACT MASK FROM ARG N (7BIT) 1$: MOVB @R0,R4 ;R4=AC HERE MOVB (R1)+,-(SP) SUB (SP)+,R4 BIC #177600,R4 ;7 BIT RESULT MOVB R4,(R0)+ ;PUT INTO ARG DEC R3 BNE 1$ ;DO ALL CHARACTERS BR CTL.CM ;THEN GO CTL.XT: CMP R5,#"?T ;?T MASKING OPERATIONS? BNE CTL.GT ;NO, TRY ".GE" CONDITIONAL EXECUTE ;COMMANDS TO PROCESS ;HERE JSR PC,PARAMM 1$: CMPB (R1)+,#77 ;? BEQ 2$ ;YES, LEAVE ARG POSITION ALONE CMPB -1(R1),#'@ ;@ (NULL) BEQ 4$ ;YES, DO IT TSTB (R0)+ ;ANYTHING THERE NOW? BNE 3$ ;YES, LEAVE IT ALONE MOVB -1(R1),-1(R0) ;NO, PUT MASK POSITION IN BR 3$ 4$: CLRB (R0)+ BR 3$ 2$: TSTB (R0)+ ;SKIP ; 3$: DEC R3 BNE 1$ BR CTL.CM CTL.GT: CMP R5,#"?G ;DO LINE IF ARG N GT ZERO? BNE CTL.LE ;NO, TRY LE CONDITION JSR PC,PARAMM ;FIND OUT IF NULL ;TEST IF ARG FIRST CHARACTER GE MASK CHARACTER ;IF SO, MOVE STUFF DOWN LINE AND DO IT. CMPB @R1,@R0 ;LINE >= ARG? BLT CTL.CM ;IF NOT, NO-OP LINE ZPFOU: ;COMMON ENTRY FOR CTL.LE TOO SUB #3,R1 ;BACK OVER ?GN MOV SIZOFS(SP),R3 ;GET LINE SIZE JSR R5,S.RSAV MOV R1,R2 ADD #4,R2 ;PASS TEST CHARACTER TOO SUB #4,R3 ;ALLOW FOR IT 1$: MOVB (R2)+,(R1)+ ;MOVE DATA DOWN DEC R3 BGT 1$ CLRB (R1)+ ;NULL LAST 4 BYTES CLRB (R1)+ CLRB (R1)+ CLRB (R1)+ ;FOR LACK OF BETTER WAY TO TREAT THEM JSR R5,S.RRES MOV FLGOFS(SP),R2 JMP A32 ;REPROCESS LINE CTL.LE: ;LIKEWISE FOR 1ST CHAR LE ARG 1ST CHAR CMP R5,#"?L BNE CTL.MV ;TRY CHAR CIRCULAR MOVE JSR PC,PARAMM ;OK, GET ARG CMPB @R1,@R0 ;LINE =< ARG? BGT CTL.CM ;IF NOT, NO OP LINE BR ZPFOU ;ELSE MOVE IT DOWN + TRY AGAIN CTL.MV: CMP R5,#"?M ;MOVE ARGS AROUND? BNE CTL.NP ;NO MEANS LEAVE LINE ALONE JSR PC,PARAMM ;YES--FIND ARG ;R0 POINTS TO ARG, 9 CHARACTERS LONG DEC R3 ;ROTATE LEFT MOV R5,-(SP) MOVB @R0,R5 ;SAVE HIGH CHARACTER MOV R0,R2 INC R2 ;CHAR+1 POINTER 1$: MOVB (R2)+,(R0)+ ;MOVE UP BUFFER DEC R3 BGT 1$ ;DO 8 MOVB R5,@R0 ;STASH LAST MOV (SP)+,R5 ;RESTORE R5 ;FALL THROUGH TO CTL.CM EXIT POINT ; CTL.CM: ;EXIT HERE ; ;COMMON PROCESSORS PUT IN ; AT LINE START SO RSX COMMAND PROCESSORS ;WILL IGNORE THE LINE MOV LNOFST(SP),R1 MOVB #';,@R1 ;PUT IN THE SEMI CTL.NP: ;NO OP ENTRY HERE WHERE NOTHING WAS FOUND. ;LEAVES LINE ALONE FOR PROCESSORS. ; MOV (SP)+,R5 MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 RTS PC ;GO WHEREVER WE ARE WANTED ; ;RP.--REPLACE PARAMETERS WHEREVER ?W IS FOUND ; RP.: JSR R5,S.RSAV ;SAVE REGS ;ON ENTRY EXPECT R1 TO HAVE LINE ADDR,R3=SIZE TST R2 ;INPUT OFF TERMINAL? BEQ RP.XIT ;YES, LET HIM ENTER ?W MOV R1,R4 ADD R3,R4 ;END ADDR RP.LOP: CMP R1,R4 BHIS RP.XIT ;CHECK END CMPB (R1)+,#'? ;COULD IT BE ?W ?? BNE RP.LOP ;NO CMPB (R1)+,#'W ;TEST 2ND CHAR BNE RP.LOP ;BRANCH IF NO MATCH JSR PC,PARAMN ;MATCH. POINT R0 AT ARG AND ... SUB #3,R1 ;BACK R1 OVER ?W. PUT 9. IN R3 11$: MOVB (R0)+,(R1)+ ;COPY ARG DEC R3 BNE 11$ ;FINISH COPY BR RP.LOP ;CHECK FOR MORE RP.XIT: JSR R5,S.RRES ;PUT ALL REGS BACK RTS PC ; ;S.RSAV/S.RRES ;REGISTER SAVE/RESTORE ; S.RSAV: MOV R4,-(SP) MOV R3,-(SP) MOV R2,-(SP) MOV R1,-(SP) MOV R0,-(SP) MOV 12(SP),-(SP) ;COPY R5 RTS R5 ;GET BACK OLD R5 AND RETURN S.RRES: TST (SP)+ ;JUNK OLD R5 MOV (SP)+,R0 MOV (SP)+,R1 MOV (SP)+,R2 MOV (SP)+,R3 MOV (SP)+,R4 RTS R5 ;POP BACK INTO R5 ; ; ;PARAMM/PARAMN ;ON CALL R1 POINTS AT LINE WHERE NUMBER SHOULD BE ;(OR 1 BEFORE). GET PARAMETER # ADDR AND ;PUT IN R0, PUT 9. IN R3, RETURN. PARAMM: INC R1 INC R1 ;PASS ? PARAMN: MOVB (R1)+,R3 ;WORK IN R3 BIC #-20,R3 ;CLEAR ALL BUT 0-16 BITS MUL #9.,R3 ;GET ARG OFFSET ADD #ARGS,R3 ;POINT TO ARGS MOV R3,R0 ;PUT INTO R0 (NOT USED EARLIER BECAUSE EVEN) MOV #9.,R3 ;LOOP COUNTER RTS PC ; ; ;PGT.--GET PARAMETERS FROM CALL TO FILL IN ARGS WITH PGT.: JSR R5,S.RSAV ;SAVE REGS IN HERE MOV R1,R2 MOV R1,R0 ADD R3,R2 ;END ADDR MOV #ARGS,R1 PA.NPA: INC R0 PA.N6: MOV #9.,R3 PA.NCH: CMP R0,R2 BHIS PA.TRM CMPB @R0,#'^ ;UPARROW DELIMITS ARGS BEQ PA.TRM CMPB @R0,#'& ;& GETS REPLACED BY UPARROW BNE 1$ MOVB #':,@R0 1$: MOVB (R0)+,(R1)+ ;COPY POSITIONALLY DEC R3 BNE PA.NCH ;9 PER ARG CMPB @R0,#'^ ;ALLOW CONCATINATED ARGS BEQ PA.NPA ;OR SEPARATED BR PA.N6 PA.TRM: CLRB (R1)+ ;GOT TERMINATOR DEC R3 BNE PA.TRM ;NULL FILL INC R0 CMP R0,R2 ;PAST END? BLOS PA.N6 ;NOT YET--KEEP IT UP JSR R5,S.RRES ;RESTORE REGS RTS PC ; ; .END