1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2024-09-16 09:56:58 +00:00

Add profiling support for plvm02

This commit is contained in:
David Schmenk 2014-06-24 23:03:59 -07:00
parent 77edb1bce9
commit 047fae252a
4 changed files with 409 additions and 8 deletions

View File

@ -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.

View File

@ -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

91
src/samplesrc/profile.pla Executable file
View File

@ -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

View File

@ -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 $03DA
LDA #>IINTRP
STA $03DB
LDA #<IINTRPX
STA $03E0
LDA #>IINTRPX
STA $03E1
RTS
;
; ENABLE PROFILER, SET PROFILING INTERP ENTRYPOINTS, CLEAR STATS
;
+ CMP #$01
BNE +
LDA #<PIINTRP
STA $03DA
LDA #>PIINTRP
STA $03DB
LDA #<PIINTRPX
STA $03E0
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 = *
}