P2 Taqoz V2.8 TRACING of a Variable: Serial Output of Return Chain and Stack
Hi, this might perhaps be useful for others, groping because of mysterious trouble.
It uses absolute addresses of serial routines and cog, so they are fix here for the version! **So this will only work with the version _BOOT_P2.BIX in Taqoz.zip in https://sourceforge.net/projects/tachyon-forth/files/TAQOZ/binaries/ .
The assembler routines from TRACE are used here, so it should work, even, if the Forth system is defective.
It is meant for cog0.
What does it do?
While haunting some tricky bug, I tried to use TRACE! The problem was, that this can output very much text. So the question was, if this can be modified with a trigger to output text only, if something more specific has happened. Here a variable is monitored. If it's value is altered, an output is generated:
1. the Variable's Value
2. Instruction Pointer after the change and it contents
3. The chain in the return stack
4. The depth and contents of the parameter stack.
The new routine is patched into the code of the original TRACING routine (not instead), which starts at $440. This TRACING routine on the other hand is patched instead of doNext into the cog code by TRACE!. So we can control the modified TRACING routine with the same means as the original.
Other ideas for interesting triggers?
Have Fun, Christof
{ TriggerTrace.fth 19.04.23 Christof Eberspaecher } !polls \ clear multitasking IFDEF *Tests* oldorgT org FORGET *Tests* } pub *Tests* PRINT" P2 Test" ; 0 bytes oldorgT { ' TRACE 00420 ff000002 TRACE rdlong doNext,##TRACER ' Replace 1st instruction of doNEXt with a call to TRACING' 00424 fb046230 00428 f607de00 mov traceL,#0 0042c fd64002d ret ' !!! use discrete ret to delay before returning to doNEXT' 00430 fda00440 TRACER call #\TRACING 00434 ff000002 UNTRACE rdlong doNext,##TRACING 00438 fb046240 0043c fd64002d ret 00440 TRACING 00440 fae41f61 rdword x,PTRA++ ' read word code instruction 00444 f213f1ef cmp PTRA,traceL wc 00448 cd64002d if_c ret 0044c fdb00184 call #DBIP ' PRINT IP ' 00450 fdb000a4 call #DBNAME ' PRINT NAME' } \ Timer event and toggle pin P2 Docu Page 51 uses cog register deltaR 57 := ledPin $1c := deltaR $fdb00184 := call_DBIP \ original in $44c long aVariable aVariable := trAddr \ <<<<< set variable address here long oldVariable oldVariable := oldVar $0f := x $1ee := xreg $17 := retptr \ return stack pointer $15 := auxptr $5d4 := prtIP $4bc := prtHex $0a4 := prtName $5f8 = prtCrlf code trigTrace ' trace when variable changes rdlong r1,##trAddr rdlong xreg,##oldVar cmp r1,xreg wz ' if_z ret ' nothing happened mov xreg,r1 wrlong xreg,##oldVar ' update call #\$4bc ' print Variable value mov r1,retptr push x call #\$5d4 ' prt IP call #\$5f8 ' crlf .l1 ' from top of return stack mov xreg,retptr ' stack position call #\$4bc rdlut xreg,retptr ' address sub xreg,#2 call #\$4bc rdword xreg,xreg ' word code mov x,xreg call #\$4bc ' print word code call #\$4f8 ' print word name call #\$5f8 ' crlf cmp retptr,#$40 wz if_nz sub retptr,#1 if_nz jmp #l1 call #\$5f8 ' crlf call #\$454 ' print stack call #\$5f8 pop x mov retptr,r1 ret end ' trigTrace 2 + := tTraceAddr \ get asm start address : startTrig $FD80_0000 tTraceAddr + \ JMP absolute $44c ! \ patch into TRACING ; : stopTrig call_DBIP $44c ! \ patch into TRACING ; : trigTest nop %red %pen 0 aVariable ! KEY drop begin aVariable ++ 500 ms KEY until %white %pen ; startTrig ' trigTest TRACE!