.SBTTL BREAKPOINT FUNCTIONS, 1-JULY-75 ;BP ;PRINTS ACTIVE BREAKPOINTS ;BP ADR ;INSERT BP ;BC ;BP CONTINUE ;BC COUNT ;BP CONTINUE FOR COUNT ;RB ;REMOVE CURRENT BP ;RB 0 ;REMOVE ALL BP'S ;RB ADR ;REMOVE BP AT ADR ;BREAK POINT INSERTION .BP: TTISDL BCC 4$ ;NUMBER, INSERT BP 1$: MOV #$BT+2,R1 ;PRINT ACTIVE BP'S 2$: MOV (R1),R0 ;GET BP ADDRESS BEQ 3$ ;EMPTY PNTOCT ;PRINT BP ADDRESS 3$: ADD #6,R1 CMP R1,#$BT+<6*$NB> ;FINISHED ? BLT 2$ ;NO BR $BPEX1 4$: TTOCTE ;INPUT EVEN ADDRESS MOV R0,R2 JSR PC,$BTS ;SEARCH BP TABLE BCC $BPERR ;ALREADY THERE BEQ $BPERR ;TABLE FULL ALREADY MOV R2,(R1) ;PUT INST ADR IN BP TABLE MOV (R2),-(R1) ;PUT INST IN BP TABLE CLR 4(R1) ;CLEAR CONTINUE COUNT MOV #IOT,(R2) ;PUT BP IN PLACE OF INST BR $BPEXT ;BREAK POINT TRAP $BRKPT: CLR .HCFLG MOV R0,$R0SAV ;SAVE ALL REGS R0 - R5 MOV #$R1SAV,R0 MOV R1,(R0)+ MOV R2,(R0)+ MOV R3,(R0)+ MOV R4,(R0)+ MOV R5,(R0)+ MOV SP,(R0) ;FOR REG PRINT ONLY, NOT RESTORED ADD #4,(R0) ;MAKE IT AS IT WAS BEFORE BP MOV (SP),R2 ;GET AFTER TRAP PC TST -(R2) ;MAKE IT BEFORE TRAP PC JSR PC,$BTS ;FIND BP IN TABLE 1$: MOV R2,(SP) ;PUT ADR ON STACK FOR "RTI" LATER MOV R2,$BCA ;SAVE BP CONTINUE ADDRESS PUSH -(R1) ;SAVE PROGRAM INST ON STACK DEC 4(R1) ;DECREMENT CONTINUE COUNT BGT .ABC ;COUNT GT 0, AUTO CONTINUE 2$: CLR TENRUN PFORCE PMSG <\BP AT > MOV R2,R0 PNTOCT PMSG MOV 4(SP),R0 PNTOCT $BPEX1: PCRLF $BPEXT: JMP $CONSL ;RETURN TO MONITOR $BPERR: PMSG BR .BPERR ;BREAKPOINT CONTINUE .BC: TTISDL BCC .BCCNT ;CONTINUE COUNT .ABC: CMP $BCA,2(SP) ;IS STACK OK, IF SO CONTINUE BEQ 1$ ;OTHERWISE SP BAD OR NOT IN BP .BCERR=. PMSG .BPERR=. JMP $CNTLC 1$: MOV @$BCA,$BTIS ;SAVE WHATS AT BP ADDRESS POP @$BCA ;RESTORE PROGRAM INST JSR PC,.BCHC2 ;RESTORE REGISTERS BIS #TBIT,2(SP) ;SET FOR T-BIT TRAP RTT ;RESTART FOR ONE INSTRUCTION ;T-BIT TRAP COMES TO HERE .BCCT: BIC #TBIT,2(SP) ;CLEAR T-BIT MOV $BTIS,@$BCA ;PUT BP/INST BACK IN PROGRAM RTI ;RESUME .BCCNT: TTIDEC ;INPUT CONTINUE COUNT BCS $BPERR MOV R0,R5 MOV $BCA,R2 JSR PC,$BTS ;FIND ENTRY IN TABLE BCS .BCERR ;NOT THERE 1$: MOV R5,2(R1) ;PUT COUNT IN TABLE BR .ABC ;REMOVE BREAKPOINTS .RB: TTISDL BCS 2$ ;REMOVE CURRENT BP TTOCTE ;INPUT BP ADDRESS TST R0 BEQ 4$ ;IF 0, REMOVE ALL BP'S MOV R0,R2 3$: JSR PC,$BTS ;FIND ADDRESS IN TABLE BCC 1$ PMSG BR .BPERR 1$: JSR PC,$RB ;REMOVE BP 11$: BR $BPEXT 2$: MOV $BCA,R2 ;REMOVE CURRENT BP BR 3$ 4$: JSR PC,.CB ;CLEAR ALL BP'S BR $BPEXT ;CLEAR ALL BREAKPOINTS .CB: MOV #$BT+2,R1 1$: MOV (R1),R2 ;GET TABLE ENTRY BEQ 2$ ;EMPTY JSR PC,$RB ;REMOVE BP 2$: ADD #6,R1 CMP R1,#$BT+<6*$NB> BLT 1$ RTS PC $RB: CLR (R1) ;CLEAR ADDRESS FIELD CMP (R2),#IOT ;BP IN MEMORY ? BNE 1$ ;NO MOV -2(R1),(R2) ;YES, RESTORE INSTRUCTION 1$: RTS PC ;REGISTER RESTORE .BCHC: TTITRM .BCHC2: MOV #$R0SAV,R5 MOV (R5)+,R0 MOV (R5)+,R1 MOV (R5)+,R2 MOV (R5)+,R3 MOV (R5)+,R4 MOV (R5),R5 RTS PC ;BREAKPOINT REGISTER PRINTOUT .RG: PFORCE CLR R2 ;REGISTER NUMBER MOV #$R0SAV,R1 ;REG SAVE TABLE POINTER 1$: PNTCI 'R MOV R2,R0 PNTNBR ;PRINT REGISTER NUMBER 4$: PSLASH 2$: MOV (R1)+,R0 PNTOCT ;PRINT CONTENTS INC R2 CMP R2,#6 BLT 1$ BGT 3$ PNTCI "SP BR 4$ 3$: BR $BPEX1 ;SEARCH BP TABLE FOR ADDRESS IN R2 ;C-BIT SET SEARCH FAILURE ;C-BIT & Z-BIT SET SEARCH FAILURE & TABLE FULL ; R1 = ADDRESS OF EMPTY SLOT IF TABLE NOT FULL ;C-BIT CLEAR, FOUND & R1 = ADDRESS OF ENTRY $BTS: MOV #$BT+2,R1 ;INIT BP TABLE POINTER CLR R0 1$: TST (R1) ;IS IT EMPTY ? BNE 2$ ;NO MOV R1,R0 ;YES, SAVE ADDRESS OF EMPTY SLOT BR 3$ 2$: CMP (R1),R2 ;IS THIS THE ENTRY ? BNE 3$ ;NO CCC ;YES, INDICATE WITH C-BIT CLEAR RTS PC 3$: ADD #6,R1 ;STEP TO NEXT ENTRY CMP #$BT+<6*$NB>,R1 BGT 1$ MOV R0,R1 ;COUNDN'T FIND, Z-BIT SET = FULL SEC ;INDICATE WITH C-BIT SET RTS PC