mirror of
https://github.com/dschmenk/PLASMA.git
synced 2025-02-02 16:34:26 +00:00
Add profiling support for plvm02
This commit is contained in:
parent
77edb1bce9
commit
047fae252a
@ -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.
|
||||
|
@ -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
91
src/samplesrc/profile.pla
Executable 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
|
@ -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 = *
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user