From 047fae252a63f68e802f575bac9bd8ae05987f28 Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Tue, 24 Jun 2014 23:03:59 -0700 Subject: [PATCH] Add profiling support for plvm02 --- src/inc/stdlib.plh | 2 +- src/makefile | 7 +- src/samplesrc/profile.pla | 91 +++++++++++ src/vmsrc/plvm02.s | 317 +++++++++++++++++++++++++++++++++++++- 4 files changed, 409 insertions(+), 8 deletions(-) create mode 100755 src/samplesrc/profile.pla diff --git a/src/inc/stdlib.plh b/src/inc/stdlib.plh index 0df7852..efbb7d1 100644 --- a/src/inc/stdlib.plh +++ b/src/inc/stdlib.plh @@ -4,7 +4,7 @@ import stdlib predef heapmark, heapallocallign, heapalloc, heaprelease, heapavail predef memset, memcpy predef isugt, isuge, isult, isule - predef load, exec + predef modload, modexec, modaddr word MACHID, sysvars ; ; System flags: memory allocator screen holes. diff --git a/src/makefile b/src/makefile index e7f9b66..3ed283f 100644 --- a/src/makefile +++ b/src/makefile @@ -11,6 +11,7 @@ HGR1 = HGR1\#FE1000 HGR1TEST= HGR1TEST\#FE1000 TEST = TEST\#FE1000 TESTLIB = TESTLIB\#FE1000 +PROFILE = PROFILE\#FE1000 PLASM = plasm INCS = toolsrc/tokens.h toolsrc/symbols.h toolsrc/lex.h toolsrc/parse.h toolsrc/codegen.h OBJS = toolsrc/plasm.c toolsrc/parse.o toolsrc/lex.o toolsrc/codegen.o @@ -30,7 +31,7 @@ TXTTYPE = .TXT #SYSTYPE = \#FF2000 #TXTTYPE = \#040000 -all: $(PLASM) $(PLVM) $(PLVM01) $(PLVM02) $(PLVM03) $(CMD) $(ROD) $(HGR1) +all: $(PLASM) $(PLVM) $(PLVM01) $(PLVM02) $(PLVM03) $(CMD) $(PROFILE) $(ROD) $(HGR1) clean: -rm *FE1000 *FF2000 $(PLASM) $(PLVM) $(PLVM01) $(PLVM02) $(PLVM03) @@ -83,6 +84,10 @@ $(ROD): samplesrc/rod.pla $(PLVM02) $(PLASM) ./$(PLASM) -AM < samplesrc/rod.pla > samplesrc/rod.a acme --setpc 4094 -o $(ROD) samplesrc/rod.a +$(PROFILE): samplesrc/profile.pla $(PLVM02) $(PLASM) + m4 -I inc < samplesrc/profile.pla | ./$(PLASM) -AM > samplesrc/profile.a + acme --setpc 4094 -o $(PROFILE) samplesrc/profile.a + $(HGR1): samplesrc/hgr1.pla samplesrc/hgr1test.pla $(PLVM02) $(PLASM) ./$(PLASM) -AM < samplesrc/hgr1test.pla > samplesrc/hgr1test.a acme --setpc 4094 -o $(HGR1TEST) samplesrc/hgr1test.a diff --git a/src/samplesrc/profile.pla b/src/samplesrc/profile.pla new file mode 100755 index 0000000..8e280cf --- /dev/null +++ b/src/samplesrc/profile.pla @@ -0,0 +1,91 @@ +; +; Include all imported modules and their data/functions. +; +include(stdlib.plh) +; +; Profile commands. +; +const stop = 0 +const start = 1 +const dump = 2 +; +; Declare all global variables for this module. +; +byte profstr[] = "PLASMA Profiler\n" +byte optstr[] = "Module to profile" +byte ttlstr[] = "Total executed opcodes: $" +byte hdrstr[] = " OP COUNT\n" +byte valstr[] = '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' +word cmdstr +byte opstats[260] +; +; Define functions. +; +asm equate + !SOURCE "vmsrc/plvmzp.inc" +end +asm profiler + LDA ESTKL,X + CMP #$02 + BNE + + INX + LDY ESTKL,X + STY DSTL + LDY ESTKH,X + STY DSTH ++ STX ESP + JSR $03E2 + LDX ESP + RTS +end +def printb(b) + putc(valstr[(b >> 4) & $0F]) + putc(valstr[ b & $0F]) +end +def printw(h) + putc(valstr[(h >> 12) & $0F]) + putc(valstr[(h >> 8) & $0F]) + putc(valstr[(h >> 4) & $0F]) + putc(valstr[ h & $0F]) +end +def printl(lo, hi) + printw(hi) + printw(lo) +end +def dumpstats + byte opcnt, linecnt + word longptr + profiler(@opstats, 2) + puts(@ttlstr) + printl(opstats:0, opstats:2) + putln + puts(@hdrstr) + longptr = @opstats:4 + linecnt = 0 + for opcnt = 0 to 63 + if (longptr):0 | (longptr):2 + putc('$') + printb(opcnt << 1) + putc(' ') + putc('$') + printl((longptr):0, (longptr):2) + linecnt = linecnt + 1 + if linecnt % 20 == 0 + getc + fin + putln + fin + longptr = longptr + 4 + next +end + +puts(@profstr) +puts(@optstr) +cmdstr = gets($BA) +if ^cmdstr + profiler(1) + modexec(cmdstr) + profiler(0) + dumpstats +fin +done diff --git a/src/vmsrc/plvm02.s b/src/vmsrc/plvm02.s index 5264e99..686c311 100644 --- a/src/vmsrc/plvm02.s +++ b/src/vmsrc/plvm02.s @@ -179,7 +179,7 @@ OPTBL !WORD ZERO,ADD,SUB,MUL,DIV,MOD,INCR,DECR ; 00 02 04 06 08 0A 0C 0E ;* ;* ENTER INTO BYTECODE INTERPRETER ;* -DINTERP PLA +DINTRP PLA STA IPL PLA STA IPH @@ -255,7 +255,7 @@ CMDEXEC = * ; ; INSTALL PAGE 3 VECTORS ; - LDY #$11 + LDY #$17 - LDA PAGE3,Y STA INTERP,Y DEY @@ -331,16 +331,18 @@ PAGE3 = * ;* !PSEUDOPC $03D0 { BIT LCRDEN+LCBNK2 ; $03D0 - DIRECT INTERP ENTRY - JMP DINTERP + JMP DINTRP BIT LCRDEN+LCBNK2 ; $03D6 - INDIRECT INTERP ENTRY JMP IINTRP BIT LCRDEN+LCBNK2 ; $03DC - INDIRECT INTERPX ENTRY JMP IINTRPX + BIT LCRDEN+LCBNK2 ; $03E2 - PROFILER ENTRY + JMP PROFILER } -DEFCMD !FILL 33 +DEFCMD !FILL 27 ENDBYE = * } -LCDEFCMD = *-33 ; DEFCMD IN LC MEMORY +LCDEFCMD = *-27 ; DEFCMD IN LC MEMORY ;***************** ;* * ;* OPXCODE TABLE * @@ -351,7 +353,7 @@ OPXTBL !WORD ZERO,ADD,SUB,MUL,DIV,MOD,INCR,DECR ; 00 02 04 06 08 0A 0C 0E !WORD NEG,COMP,BAND,IOR,XOR,SHL,SHR,IDXW ; 10 12 14 16 18 1A 1C 1E !WORD LNOT,LOR,LAND,LA,LLA,CB,CW,SWAP ; 20 22 24 26 28 2A 2C 2E !WORD DROP,DUP,PUSH,PULL,BRGT,BRLT,BREQ,BRNE ; 30 32 34 36 38 3A 3C 3E - !WORD ISEQ,ISNE,ISGT,ISLT,ISGE,ISLE,BRFLS,BRTRU; 40 42 44 46 48 4A 4C 4E + !WORD ISEQ,ISNE,ISGT,ISLT,ISGE,ISLE,BRFLS,BRTRU ; 40 42 44 46 48 4A 4C 4E !WORD BRNCH,IBRNCH,CALLX,ICALX,ENTERX,LEAVEX,RETX,NEXTOP; 50 52 54 56 58 5A 5C 5E !WORD LBX,LWX,LLBX,LLWX,LABX,LAWX,DLBX,DLWX ; 60 62 64 66 68 6A 6C 6E !WORD SBX,SWX,SLBX,SLWX,SABX,SAWX,DABX,DAWX ; 70 72 74 76 78 7A 7C 7E @@ -1545,5 +1547,308 @@ LEAVEX STA ALTRDOFF RETX STA ALTRDOFF CLI RTS +;********************* +;* * +;* BYTECODE PROFILER * +;* * +;********************* +STATS = $DF00 +;* +;* PROFILER CONTROL +;* +;* A = 0 : DISABLE +;* A = 1 : ENABLE SYS+USER OPS +;* A = 2 : ENABLE USER OPS +;* A = 3 : WRITE STATS TO (DST), 260 BYTES +;* +PROFILER CMP #$00 + BNE + +; +; DISABLE PROFILER, RESTORE INTERP ENTRYPOINTS +; + LDA #IINTRP + STA $03DB + LDA #IINTRPX + STA $03E1 + RTS +; +; ENABLE PROFILER, SET PROFILING INTERP ENTRYPOINTS, CLEAR STATS +; ++ CMP #$01 + BNE + + LDA #PIINTRP + STA $03DB + LDA #PIINTRPX + STA $03E1 + BIT LCRWEN+LCBNK2 + BIT LCRWEN+LCBNK2 + LDA #$00 + STA TTLOPS + STA TTLOPS+1 + STA TTLOPS+2 + STA TTLOPS+3 + TAY +- STA STATS,Y + INY + BNE - + RTS +; +; COPY STATS TO MAIN MEMORY +; ++ CMP #$02 + BNE ++ + LDX #$00 + LDA TTLOPS + STA (DST,X) + INC DSTL + BNE + + INC DSTH ++ LDA TTLOPS+1 + STA (DST,X) + INC DSTL + BNE + + INC DSTH ++ LDA TTLOPS+2 + STA (DST,X) + INC DSTL + BNE + + INC DSTH ++ LDA TTLOPS+3 + STA (DST,X) + INC DSTL + BNE + + INC DSTH ++ LDY #$00 +- LDA STATS,Y + STA (DST,X) + INC DSTL + BNE + + INC DSTH ++ LDA STATS+64,Y + STA (DST,X) + INC DSTL + BNE + + INC DSTH ++ LDA STATS+128,Y + STA (DST,X) + INC DSTL + BNE + + INC DSTH ++ LDA STATS+192,Y + STA (DST,X) + INC DSTL + BNE + + INC DSTH ++ INY + CPY #64 + BNE - +++ RTS +;* +;* ENTER INTO BYTECODE INTERPRETER +;* +PIINTRP PLA + STA TMPL + PLA + STA TMPH + LDY #$02 + LDA (TMP),Y + STA IPH + DEY + LDA (TMP),Y + STA IPL + DEY + LDA #>PROTBL + STA OPPAGE + BIT LCRWEN+LCBNK2 + BIT LCRWEN+LCBNK2 + JMP FETCHOP +PIINTRPX PLA + STA TMPL + PLA + STA TMPH + LDY #$02 + LDA (TMP),Y + STA IPH + DEY + LDA (TMP),Y + STA IPL + DEY + LDA #>PROXTBL + STA OPPAGE + SEI + STA ALTRDON + BIT LCRWEN+LCBNK2 + BIT LCRWEN+LCBNK2 + JMP FETCHOP +;* +;* PROFILE OPS +;* +PROP ORA #$80 + STA PROPJMP+1 + AND #$7F + JSR UPDTSTATS +PROPJMP JMP (OPTBL) +PROPX STA PROPXJMP+1 + JSR UPDTSTATS +PROPXJMP JMP (OPXTBL) +UPDTSTATS STX ESP + LSR + TAX + INC STATS,X + BNE + + INC STATS+64,X + BNE + + INC STATS+128,X + BNE + + INC STATS+192,X ++ LDX ESP + INC TTLOPS + BNE + + INC TTLOPS+1 + BNE + + INC TTLOPS+2 + BNE + + INC TTLOPS+3 ++ RTS +PROCALL JSR UPDTSTATS + +INC_IP + LDA (IP),Y + STA TMPL + +INC_IP + LDA (IP),Y + STA TMPH + LDA IPH + PHA + LDA IPL + PHA + TYA + PHA + JSR JMPTMP + PLA + TAY + PLA + STA IPL + PLA + STA IPH + LDA #>PROTBL ; MAKE SURE WE'RE INDEXING THE RIGHT TABLE + STA OPPAGE + BIT LCRWEN+LCBNK2 + BIT LCRWEN+LCBNK2 + JMP NEXTOP +; +PROCALLX JSR UPDTSTATS + +INC_IP + LDA (IP),Y + STA TMPL + +INC_IP + LDA (IP),Y + STA TMPH + LDA IPH + PHA + LDA IPL + PHA + TYA + PHA + STA ALTRDOFF + CLI + JSR JMPTMP + SEI + STA ALTRDON + PLA + TAY + PLA + STA IPL + PLA + STA IPH + LDA #>PROXTBL ; MAKE SURE WE'RE INDEXING THE RIGHT TABLE + STA OPPAGE + BIT LCRWEN+LCBNK2 + BIT LCRWEN+LCBNK2 + JMP NEXTOP +;* +;* INDIRECT CALL TO ADDRESS (NATIVE CODE) +;* +PROICAL JSR UPDTSTATS + LDA ESTKL,X + STA TMPL + LDA ESTKH,X + STA TMPH + INX + LDA IPH + PHA + LDA IPL + PHA + TYA + PHA + JSR JMPTMP + PLA + TAY + PLA + STA IPL + PLA + STA IPH + LDA #>PROTBL ; MAKE SURE WE'RE INDEXING THE RIGHT TABLE + STA OPPAGE + BIT LCRWEN+LCBNK2 + BIT LCRWEN+LCBNK2 + JMP NEXTOP +; +PROICALX JSR UPDTSTATS + LDA ESTKL,X + STA TMPL + LDA ESTKH,X + STA TMPH + INX + LDA IPH + PHA + LDA IPL + PHA + TYA + PHA + STA ALTRDOFF + CLI + JSR JMPTMP + SEI + STA ALTRDON + PLA + TAY + PLA + STA IPL + PLA + STA IPH + LDA #>PROXTBL ; MAKE SURE WE'RE INDEXING THE RIGHT TABLE + STA OPPAGE + BIT LCRWEN+LCBNK2 + BIT LCRWEN+LCBNK2 + JMP NEXTOP +TTLOPS !WORD 0, 0 +;* +;* PROFILING OP TABLE +;* + !ALIGN 255,0 +PROXTBL !WORD PROPX,PROPX,PROPX,PROPX,PROPX,PROPX,PROPX,PROPX + !WORD PROPX,PROPX,PROPX,PROPX,PROPX,PROPX,PROPX,PROPX + !WORD PROPX,PROPX,PROPX,PROPX,PROPX,PROPX,PROPX,PROPX + !WORD PROPX,PROPX,PROPX,PROPX,PROPX,PROPX,PROPX,PROPX + !WORD PROPX,PROPX,PROPX,PROPX,PROPX,PROPX,PROPX,PROPX + !WORD PROPX,PROPX,PROCALLX,PROICALX,PROPX,PROPX,PROPX,PROPX + !WORD PROPX,PROPX,PROPX,PROPX,PROPX,PROPX,PROPX,PROPX + !WORD PROPX,PROPX,PROPX,PROPX,PROPX,PROPX,PROPX,PROPX +PROTBL !WORD PROP,PROP,PROP,PROP,PROP,PROP,PROP,PROP + !WORD PROP,PROP,PROP,PROP,PROP,PROP,PROP,PROP + !WORD PROP,PROP,PROP,PROP,PROP,PROP,PROP,PROP + !WORD PROP,PROP,PROP,PROP,PROP,PROP,PROP,PROP + !WORD PROP,PROP,PROP,PROP,PROP,PROP,PROP,PROP + !WORD PROP,PROP,PROCALL,PROICAL,PROP,PROP,PROP,PROP + !WORD PROP,PROP,PROP,PROP,PROP,PROP,PROP,PROP + !WORD PROP,PROP,PROP,PROP,PROP,PROP,PROP,PROP VMEND = * } \ No newline at end of file