.TITLE PROGRAM EXECUTION MEASUREMENT .SBTTL SET UP .MCALL FDBDF$,FDAT$A,FDRC$A,FDOP$A,OPEN$W,CLOSE$,OPEN$U .MCALL SVDB$S,FDBK$A,WAIT$,READ$,WRITE$,FDBF$A,FSRSZ$ .MCALL GTIM$S,GTSK$S,QIOW$S INSLUN=1 LOCLUN=2 EVNFLG=20. .PAGE .SBTTL ASSEMBLE TIME FCS SETUP FSRSZ$ 2,2*512. RUNFIL: FDBDF$ FDAT$A R.FIX,,20.,1 FDRC$A FD.RWM FDBK$A ITAB1,512.,,EVNFLG,IOSTAT FDOP$A INSLUN,RUNDES,,FO.WRT,FA.DLK!FA.ENB FDBF$A EVNFLG RUNDES: .WORD 0,0,0,0,RUNSIZ,RUNAD RUNAD: .ASCII /MEASURE.DAT/ RUNSIZ=.-RUNAD .EVEN INSFIL: FDBDF$ FDAT$A R.FIX,,4,512. FDRC$A FD.RWM FDBK$A ITAB1,512.,,EVNFLG,IOSTAT FDOP$A INSLUN,INSDES,,FO.WRT,FA.DLK!FA.ENB FDBF$A EVNFLG INSDES: .WORD 0,0,0,0,INSIZ,INSAD INSAD: .ASCII /INSTCTR.DAT/ INSIZ=.-INSAD .EVEN LOCFIL: FDBDF$ FDAT$A R.FIX,,4,256. FDRC$A FD.RWM FDBK$A LTAB1,512.,,EVNFLG,IOSTAT FDOP$A LOCLUN,LOCDES,,FO.WRT,FA.ENB!FA.DLK FDBF$A EVNFLG LOCDES: .WORD 0,0,0,0,LOCIZ,LOCAD LOCAD: .ASCII /LOCTCTR.DAT/ LOCIZ=.-LOCAD .EVEN .SBTTL SST TABLE FOR DEBUGGING AID SST TRAP CATCHER CALL SSTTAB: .WORD 0,0,TBIT .PAGE .SBTTL LIST OF PAGES IN ORDER OOF USE FOR LOC AND INSTR ; USE LIST-IN ORDER OF LAST USE-MOST CURRENT AT TOP LUSED: .WORD LTAB1,LTAB2,LTAB3,LTAB4 ; LISTED OF TABLES USED IN ORDER OF LAST USE IUSED: .WORD ITAB1,ITAB2,ITAB3,ITAB4,ITAB5,ITAB6,ITAB7,ITAB8 .PAGE .SBTTL LOCATION COUNTER PAGES ; CONTENTS WORD-STARTINGADDRESS OF CONTENTS OF BLOCK ; SINCE THE PAGE IS A SET OF DOUBLE WORDS COUNTERS AND ; THE ADDRESS ARE ALL ON WORD BOUNDRIES-THE CONTENTS ARE THE ; HIGH ORDER 9 BITS OF THE LOCATION. THE VIRTUAL BLOCK NUMBER ; IS THIS NUMBER +1 ; THE CONTENTS WORD IS THE WORD PRECEEDING THE PAGE BLOCK ; WORKING TABLE OF LOCATIONN COUNTERS .WORD 0 LTAB1: .BLKW 256. .WORD 1 LTAB2: .BLKW 256. .WORD 2 LTAB3: .BLKW 256. .WORD 3 LTAB4: .BLKW 256. .PAGE .SBTTL INSTRUCTION COUNTER PAGEING AREA ; STARTING INSTRUCTION NUMBER -HIGH ORDER 10 BITS ; THIS IS THE VBN-1 OF THE PAGE ; WORKINGTABLE OF INSTRUCTION COUNTERS .WORD 0 ITAB1: .BLKW 256. .WORD 1 ITAB2: .BLKW 256. .WORD 2 ITAB3: .BLKW 256. .WORD 3 ITAB4: .BLKW 256. .WORD 4 ITAB5: .BLKW 256. .WORD 5 ITAB6: .BLKW 256. .WORD 6 ITAB7: .BLKW 256. .WORD 7 ITAB8: .BLKW 256. .PAGE .SBTTL IMPURE WORKING AREA IOSTAT: .WORD 0,0 ;IOSTATUS BLOCK VBN: .WORD 0,1 TFLAG: .WORD 0 ;TRACE TRAP ACTIVE FLAG TSTOP: .WORD 0 ;STOP TRACE FLAG .PAGE .SBTTL RUN TIME INITALIZATION INIEXE::OPEN$W #RUNFIL ;OPEN DATE RUN FILE GTSK$S #ITAB1 ;GET TASK NAME IN RAD 50 GTIM$S #ITAB1+4 ;GET TIME OF RUN CLR VBN MOV #1,VBN+2 WRITE$ #RUNFIL,#ITAB1,#512.,#VBN WAIT$ #RUNFIL ; QIOW$S #IO.WVB,#INSLUN,#EVNFLG,,,,<#ITAB1,#512.,,VBN,VBN+2> CLOSE$ #RUNFIL OPEN$W #INSFIL ;OPEN NEW FILE FOR INSTRUCTION COUNTERS OPEN$W #LOCFIL ;OPEN NEW FILE FOR LOCATION COUNTERS MOV #LTAB1-2,R0 ;ZERO ALL PAGE TABLES MOV #<257.*12.>,R1 ;256 WORDS EACH-12 TABLESD 1$: CLR (R0)+ ;WORD SOB R1,1$ ;BY WORD CLR R2 ;SET UP VBN TO MOV #1,R1 ;ZERO DISK FILE 2$: MOV R2,VBN ;COUNTERS MOV R1,VBN+2 ;FOR LOC COUNTER FILE WRITE$ #LOCFIL,#LTAB1,#<512.*8.>,#VBN ;WRITE 8 ZEROED BLOCKS WAIT$ #LOCFIL ;WAIT FOR OUTPUT TO COMPLETE ; QIOW$S #IO.WVB,#LOCLUN,#EVNFLG,,,,<#LTAB1,#<512.*8.>,,VBN,VBN+2> ADD #8.,R1 ;BUMP COUNTER CMP #256.,R1 ;IF NOT COMPLETE-REPEAT UNTILL DONE BGT 2$ ;REPEAT CLOSE$ #LOCFIL OPEN$U #LOCFIL CLR R2 ;THE LOC FILE IS ZEROED MOV #1,R1 ;NOW DOTHE SAME FOR 3$: MOV R2,VBN ; THE INSTRUCTION COUNTER FILE MOV R1,VBN+2 ;SET UP THE VBN WRITE$ #INSFIL,#LTAB1,#<512.*8.>,#VBN ;WRITE 8 BLOCKS WAIT$ #INSFIL ;WAIT TILL TRANSFER COMPLETE ; QIOW$S #IO.WVB,#INSLUN,#EVNFLG,,,,<#LAB1,#<8.*512.>,,VBN,VBN+2> ADD #8.,R1 ;BUMP VBN COUNTER CMP #512.,R1 ;SEE IF DONE BGT 3$ ;REPEAT IF NOT CLOSE$ #INSFIL OPEN$U #INSFIL MOV #0,LTAB1-2 ;SET UP LAST USE MOV #1,LTAB2-2 ;AND ALLOCATION MOV #2,LTAB3-2 ;POINTERS MOV #3,LTAB4-2 ;FOR BOTH ;LOCATION AND INSTRUCTION ;COUNTER FILES MOV #0,ITAB1-2 MOV #1,ITAB2-2 MOV #2,ITAB3-2 MOV #3,ITAB4-2 MOV #4,ITAB5-2 MOV #5,ITAB6-2 MOV #6,ITAB7-2 MOV #7,ITAB8-2 MOV #LTAB1,LUSED MOV #LTAB2,LUSED+2 MOV #LTAB3,LUSED+4 MOV #LTAB4,LUSED+6 MOV #ITAB1,IUSED MOV #ITAB2,IUSED+2 MOV #ITAB3,IUSED+4 MOV #ITAB4,IUSED+6 MOV #ITAB5,IUSED+8. MOV #ITAB6,IUSED+10. MOV #ITAB7,IUSED+12. MOV #ITAB8,IUSED+14. CLR TFLAG ;SET T BIT FLAG-NOT ACTIVE CLR TSTOP ;CLEAR STOP FLAG SVDB$S #SSTTAB,#3 ;DEBUGGING AID-CATCH ATT BPT/T-BIT TRAPS BPT ;START THE TRACE RETURN .PAGE .SBTTL RUN TIME-CLOSE DOWN SUBROUTINE TRMEXE::TST TFLAG ;IS TRACE STILL ACTIVE BEQ 1$ ;NO-SKIP NEXT INC TSTOP ;SET STOP FLAG NOP ;STOP 1$: SVDB$S ;DISABLE BPT INTERCEPTION MOV #LTAB1,R1 ;SET UP FOR WRITEING OUT ALL PAGES MOV #4,R2 2$: MOV -2(R1),VBN+2 ;GET VBN INC VBN+2 ; WRITE$ #LOCFIL,R1,#512.,#VBN ;OUTPUT PAGE TO DISK ; WAIT$ #LOCFIL QIOW$S #IO.WVB,#LOCLUN,#EVNFLG,,#IOSTAT,, BCC 100$ 101$: MOV $DSW,R0 MOV IOSTAT,R1 IOT 100$: TSTB IOSTAT BLT 101$ ADD #514.,R1 ;NEXT PAGE SOB R2,2$ ;REPEAT UNTILL ALLPAGES ARE OUT CLOSE$ #LOCFIL ;CLOSE THE LOC CTR FILE MOV #ITAB1,R1 ;NOW TO CLOSE OUT THE INS CTR FILE MOV #8.,R2 ;6 PAGES 3$: MOV -2(R1),VBN+2 ;GET VBN INC VBN+2 ; WRITE$ #INSFIL,R1,#512.,#VBN ;OUTPUT PAGE TO DISK ; WAIT$ #INSFIL QIOW$S #IO.WVB,#INSLUN,#EVNFLG,,#IOSTAT,, BCC 200$ 201$: MOV $DSW,R0 MOV IOSTAT,R1 IOT 200$: TSTB IOSTAT BLT 201$ ADD #514.,R1 SOB R2,3$ ;REPEAT UNTILL DONE CLOSE$ #INSFIL ;CLOSE FILE RETURN .PAGE .SBTTL INTERMEDIATE START/STOP TRACE ROUTINES TRON:: CLR TSTOP ;TURN ON TRACE TST TFLAG ;SEE IF ALREADY ON BNE 1$ ;IF SO-SKIP NEXT BPT ;START 1$: RETURN ;COMPLETED TROFF:: TST TFLAG ;TURN OFF TRACE-SEE IF TRACE ALREADY OFF BEQ 1$ ;IF YESS-SKIP NEXT INC TSTOP ;SET STOP FLAG NOP ;STOP 1$: RETURN ;FINI .PAGE .SBTTL T-BIT SST SERVICE ROUTINE .SBTTL SEE CAUSE OF TRAP AND HANDLE AS CONDITONS DICTATE TBIT: TST TFLAG ;IS TRACE ACTIVE BNE 1$ ;YES BIS #20,2(SP) ;T BIT NOT ACTIVE-SET IT ACTIVE INC TFLAG ;ALSO SET THE FLAG CLR TSTOP ;CLEAR STOP FLAG BR 2$ ;GO HANDLE THE NEXT INSTRUCTION 1$: BIS #20,2(SP) ;ENSURE THAT T-BIT IS SET-JUST IN CASE TST TSTOP ;WAS STOP FLAG SET BEQ 2$ ;NO-DO TRACE CLR TFLAG ;CLEAR TRACE FLAG BIC #20,2(SP) ;AND THE BIT ITSELF RTT ;HOME JAMES 2$: MOV R0,-(SP) ;SAVE REGESTERS MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) MOV R5,-(SP) .PAGE .SBTTL HANDLE LOCATION COUNTER INCREMENT-SEE IF PAGE IN MEMORY MOV 14(SP),R1 ;GET PC OF NEXT INS TO BE EXECUTED CLR R0 ;NEED TO GET AT THE VBN OF THAT INS IN ;LOC COUNTER FILE ASHC #8.,R0 ;HIGH ORDER 9 BITS ARE VBN-1 MOV #LTAB1,R1 ;ADDRESS OF STARTING POINT MOV #4,R2 ;AND SEE IF IN TABLE 11$: CMP R0,-2(R1) ;IS WANTED ADDRESS IN THIS PAGE BNE 10$ ;YES FOUND IT JMP LPGINM ;GO INC COUNTER IN PROPER LOC 10$: ADD #514.,R1 ;BUMP POINTER TO NEXT PAGE SOB R2,11$ ;REPEAT UNTILL FOUND OR NOT IN TABLE .SBTTL LOC COUNTER PAGE NOT IN MEMORY ; IF THIS POINT IS REACHED-THE WANTED ADDRESS IS NOT IN THE ; TABLE OF 6 PAGES-AN OLD PAGE MUST BE WRITTEN OUT AND A NEW ; ONE WRITTEN IN ; ; WRITE OUT THE LAST PAGE IN THE LUSED TABLE-AS IT IS THE ONE ; THAT HAS GONE THE LONGEST WITHOUT BEING UPDATED MOV R0,-(SP) ;SAVE WANTED VBN OF NEW PAGE MOV LUSED+6.,R1 ;GET THE ADDR OF THE OLD PAGE MOV -2(R1),VBN+2 ;GET THE VIRTUAL BLOCK NUMBER INC VBN+2 ; WRITE$ #LOCFIL,R1,#512.,#VBN;OUTPUT OLD PAGE ; WAIT$ #LOCFIL ;WAIT TILL XFER COMPLETE QIOW$S #IO.WVB,#LOCLUN,#EVNFLG,,#IOSTAT,, BCC 100$ 101$: MOV $DSW,R0 MOV IOSTAT,R1 IOT 100$: TSTB IOSTAT BLT 101$ MOV (SP)+,-2(R1) ;GET NEW VBN MOV -2(R1),VBN+2 INC VBN+2 ; READ$ #LOCFIL,R1,#512.,#VBN ;INPUT NEW PAGE ; WAIT$ #LOCFIL ;WAIT FOR INPUT XFER TO COMPLETE QIOW$S #IO.RVB,#LOCLUN,#EVNFLG,,#IOSTAT,, BCC 200$ 201$: MOV $DSW,R0 MOV IOSTAT,R1 IOT 200$: TSTB IOSTAT BLT 201$ ; NEW PAGE IS IN-NOW TO UPDATE THE USED LIST MOV LUSED+4.,LUSED+6. ;ONE PLACE MOV LUSED+2.,LUSED+4 ;IN THE USED TABLE MOV LUSED,LUSED+2 MOV R1,LUSED ;PUTTING NEW PAGE AT TOP OF LIST JMP LPGINC ;GO INCREMENT PROPER COUNTER .SBTTL PAGE WAS IN MEMORY-UPDATE LUSED TABLE ; THE WANTED PAGE WAS ALREADY IN MEMORY-UPDATE THE LUSED LIST ; R1 CONTIANS THE ADDRESS OF THE PAGE LPGINM: CMP R1,LUSED ;SEE IF ALREADY TOP PAGE BEQ LPGINC ;GO INCREMENT COUNTER MOV LUSED,R2 ;TAKE CURRENT TOP AND SAVE MOV R1,LUSED ;PUT IN NEW TOP MOV LUSED+2,R3 ;GET OLD #2 MOV R2,LUSED+2 ;PUT IN OLD #1 CMP R1,R3 ;WAS OLD #2 THE NEW #1 BEQ LPGINC ;IF YES DONE MOV LUSED+4,R2 ;GET OLD #3 MOV R3,LUSED+4 ;NEW #3 IS OLD #2 CMP R1,R2 ;WAS OLD #3 THE NEW #1 BEQ LPGINC ;IF YES-DONE MOV R2,LUSED+6 ;NEW #4 IS OLD #3 .SBTTL INCREMENT LOC COUNTER ; INC COUNTER-R1 CONTAINS THE ADDRESS OF THE PAGE CONTAING THE ; THE WANTED COUNTER LPGINC: MOV 14(SP),R3 ;GET ADDRESS ASL R3 ;*4/2 TO GET THE DOUBLE WORD ADDRESS BIC #177000,R3;NEED ONLY THE LOWER BYTE AS OFFSET ADD R1,R3 ;GET ADDR IN PAGE ADD #1,2(R3);INC COUNTER ADC (R3) ;AS D.P. INTEGER .PAGE .SBTTL GET INSTRUCTION AND INCREMENT COUNTER ; NOW GET THE INSTRUCTION TO BE EXECUTED- AND BUMP ITS COUNTER ; IN THE INSTRUCTION FILE MOV @14(SP),R1 ;GET THE INSTRUCTION TO BE EXECUTED CLR R0 ;SET UP TO BREAK OUT VBN ASHC #9.,R0 ;GET OUT HIGH ORDER 10 BITS (VBN-1) MOV #ITAB1,R1 ;SET UP CHECK FOR INS PAGE IN MEMORY MOV #8.,R2 ;CHECK THE SIX PAGES IN MEMORY 1$: CMP R0,-2(R1) ;IS INS WANTED IN THIS PAGE BNE 2$ ;NO-CHECK NEXT JMP IPGINM ;YES-GO ADJUST IUSED AND INC COUNTER 2$: ADD #514.,R1 ;BUMP TO NEXT PAGE SOB R2,1$ ;REPEAT UNTILL END OF TABBLE .SBTTL INSTRUCTION COUNTER PAGE NOT IN MEMORY ; IF THIS POINT IS REACHED,THE INSTRUCTION COUNTER PAGE IS ; NOT IN MEORY. WRITE OUT THE OLDEST PAGE AND INPUT THE ; WANTED ONE. MOV R0,-(SP) ;SAVE VBN-1 OF WANTED NS MOV IUSED+14.,R1 ;GETT ADDR OF OLDEST PAGE MOV -2(R1),VBN+2 ;GET OLD PAGES VBN INC VBN+2 ;ADJUST +1 ; WRITE$ #INSFIL,R1,#512.,#VBN ;OUPUT OLD PAGE ; WAIT$ #INSFIL ;WHEN COMPLETED QIOW$S #IO.WVB,#INSLUN,#EVNFLG,,#IOSTAT,, BCC 300$ 301$: MOV $DSW,R0 MOV IOSTAT,R1 IOT 300$: TSTB IOSTAT BLT 301$ MOV (SP)+,-2(R1) ;UPDATE OLD PAGE TO NEW VBN MOV -2(R1),VBN+2 ;FOR READ IN INC VBN+2 ; READ$ #INSFIL,R1,#512.,#VBN ;INPUT NEW PAGE ; WAIT$ #INSFIL ;WHEN INPUT DONE QIOW$S #IO.RVB,#INSLUN,#EVNFLG,,#IOSTAT,, BCC 400$ 401$: MOV $DSW,R0 MOV IOSTAT,R1 IOT 400$: TSTB IOSTAT BLT 401$ ; UPDATE LIST OF USED I PAGES WITH NEW ONE ON TOP MOV IUSED+12.,IUSED+14. MOV IUSED+10.,IUSED+12. MOV IUSED+8.,IUSED+10. MOV IUSED+6.,IUSED+8. MOV IUSED+4.,IUSED+6. MOV IUSED+2.,IUSED+4. MOV IUSED,IUSED+2 MOV R1,IUSED JMP IPGINC ;GO INCREMENT THE LOC COUNTER .SBTTL PAGE WAS IN MEMNORY-UPDATE IUSED TABLE ; THE WANTED INSTRUCTION COUNTER PAGE WAS ALREADY IN MEMORY. ; UPDATE THE IUSED LIST,SOTHAT IT IS NOW AT THE TOP IPGINM: CMP R1,IUSED ;SEE IF ALREADY TOP PAGE BEQ IPGINC ;GO INCREMENT COUNTER MOV IUSED,R2 ;TAKE CURRENT TOP AND SAVE MOV R1,IUSED ;PUT IN NEW TOP MOV IUSED+2,R3 ;GET OLD #2 MOV R2,IUSED+2 ;PUT IN OLD #1 CMP R1,R3 ;WAS OLD #2 THE NEW #1 BEQ IPGINC ;IF YES DONE MOV IUSED+4,R2 ;GET OLD #3 MOV R3,IUSED+4 ;NEW #3 IS OLD #2 CMP R1,R2 ;WAS OLD #3 THE NEW #1 BEQ IPGINC ;IF YES-DONE MOV IUSED+6,R3 ;GET OLD #4 MOV R2,IUSED+6 ;NEW #4 IS OLD #3 CMP R1,R3 ;WAS OLD #4 TNE NEW #1 BEQ IPGINC ;ID YES-DONE MOV IUSED+8.,R2 ;GET OLD #5 MOV R3,IUSED+8. ;NEW #5 IS OLD #4 CMP R1,R2 ;IS OLD #5 THE NEW #1 BEQ IPGINC ;YES-DONE MOV IUSED+10.,R3 ;GET OLD 6 MOV R2,IUSED+10. ;NEW 6 IS OLD 5 CMP R1,R3 ;IS OLD #6 THE NEW #1 BEQ IPGINC ;YES-DONE MOV IUSED+12.,R2 ;GET OLD #7 MOV R3,IUSED+12. ;NEW #7 IS OLD #6 CMP R1,R2 ;WAS OLD #7 THE NEW #1 BEQ IPGINC ;YES-DONE MOV R2,IUSED+14. ;OLD #8 WAS NEW #1-NOW OLD #7 .SBTTL INCREMENT INSTRUCTION COUNTER ; IN PROPER INSTRUCTION COUNTER-R1 CONTAINS ADDR OF PAGE IPGINC: MOV @14(SP),R3 ;GET INSTRUCTION (AGAIN) ASH #2,R3 ;*4 BIC #177000,R3 ;NEED ONLY THE OFFSET ADD R1,R3 ;GET ADDR IN PAGE ADD #1,2(R3) ;IN COUNTER ADC (R3) ;D.P. INTEGER .PAGE .SBTTL UPDATE COMPLETE-CLEAN UP AND EXIT MOV (SP)+,R5 ;RESTORE CPU REGESTERS MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 RTT ;AND TAKE A QUICK ONE BEFORE THE NEXT ;INSTRUCTION T-BIT TRAPS HERE AGAIN .END