# New Ticket Created by Jerome Quelin # Please include the string: [perl #18773] # in the subject line of all future correspondence about this issue. # <URL: http://rt.perl.org/rt2/Ticket/Display.html?id=18773 >
Hi, The following patch introduces a new file in the befunge interpreter that will hold all the debug-related material. Soon, we'll have a fully-functionnal debugger within the befunge interpreter with breakpoints, dumping the playfield, status line, and even more... How exciting! Jerome -- [EMAIL PROTECTED] -- attachment 1 ------------------------------------------------------ url: http://rt.perl.org/rt2/attach/43497/34636/99218c/befunge_introduce_debug.patch
diff -urbN parrot.old/languages/befunge/befunge.pasm parrot/languages/befunge/befunge.pasm --- parrot.old/languages/befunge/befunge.pasm 2002-11-30 10:48:14.000000000 +0100 +++ parrot/languages/befunge/befunge.pasm 2002-11-30 11:26:29.000000000 +0100 @@ -1,5 +1,6 @@ branch MAIN +.include "debug.pasm" .include "flow.pasm" .include "io.pasm" .include "load.pasm" @@ -8,16 +9,17 @@ MAIN: set I0, 0 - set I4, 0 # verbose mode + set I5, 0 # debug mode ARGV_NEXT: inc I0 set S10, P0[I0] substr S11, S10, 0, 1 ne S11, "-", ARGV_DONE - eq S10, "-v", ARGV_VERBOSE + eq S10, "-d", ARGV_DEBUG branch ARGV_NEXT -ARGV_VERBOSE: - inc I4 +ARGV_DEBUG: + inc I5 + bsr DEBUG_INITIALIZE # initialize P3 branch ARGV_NEXT ARGV_DONE: set S10, P0[I0] @@ -28,7 +30,7 @@ set I0, 0 # x coord of the PC set I1, 0 # y coord of the PC set I2, 1 # direction of the PC - set I5, 0 # flag (1=string-mode,2=bridge,3=end) + set I4, 0 # flag (1=string-mode,2=bridge,3=end) time N0 # random seed mod N0, N0, .RANDMAX set S0, " " # current instruction @@ -37,13 +39,13 @@ TICK: substr S0, S1, I0, 1 - eq I4, 0, TICK_NOVERBOSE - bsr VERBOSE -TICK_NOVERBOSE: + eq I5, 0, TICK_NODEBUG + bsr DEBUG_CHECK_BREAKPOINT +TICK_NODEBUG: eq S0, "\"", FLOW_TOGGLE_STRING_MODE - eq I5, 1, IO_PUSH_CHAR - eq I5, 2, MAIN_TRAMPOLINE - eq I5, 3, MAIN_END + eq I4, 1, IO_PUSH_CHAR + eq I4, 2, MAIN_TRAMPOLINE + eq I4, 3, MAIN_END # Sole number. lt S0, "0", NOT_NUM @@ -89,7 +91,7 @@ branch MOVE_PC MAIN_TRAMPOLINE: - set I5, 0 # no more trampoline + set I4, 0 # no more trampoline MOVE_PC: eq I2, 1, MOVE_EAST eq I2, 2, MOVE_SOUTH @@ -117,64 +119,3 @@ MAIN_END: end -VERBOSE: - # Coordinates. - print "(" - print I0 - print "," - print I1 - print ")" - # Current char. - print " - '" - print S0 - print "' (ord=" - ord I10, S0 - print I10 - print ")" - # Direction. - print " dir=" - print I2 - # Flags: - set S10, " \"" - eq I5, 1, VERBOSE_PRINT_FLAG - set S10, " #" - eq I5, 2, VERBOSE_PRINT_FLAG - set S10, " @" - eq I5, 3, VERBOSE_PRINT_FLAG - set S10, " " -VERBOSE_PRINT_FLAG: - print S10 - # Stack. - print " stack=" - set I11, P2 - set I10, 0 - ge I10, I11, VERBOSE_STACK_END -VERBOSE_STACK_LOOP: - set I12, P2[I10] - print I12 - inc I10 - ge I10, I11, VERBOSE_STACK_END - print "," - branch VERBOSE_STACK_LOOP -VERBOSE_STACK_END: - print "\n" - ret - -DUMP_PLAYFIELD: - pushi - pushs - repeat S10, "-", 82 - concat S10, "\n" - print S10 - set I10, 0 -DUMP_NEXT_LINE: - set S11, P1[I10] - print "|" - print S11 - print "|\n" - inc I10 - lt I10, 25, DUMP_NEXT_LINE - print S10 - pops - popi - ret \ No newline at end of file Binary files parrot.old/languages/befunge/befunge.pbc and parrot/languages/befunge/befunge.pbc differ diff -urbN parrot.old/languages/befunge/Changes parrot/languages/befunge/Changes --- parrot.old/languages/befunge/Changes 2002-11-30 10:48:14.000000000 +0100 +++ parrot/languages/befunge/Changes 2002-11-30 11:33:47.000000000 +0100 @@ -1,5 +1,11 @@ Revision history for Befunge-93 interpreter written for Parrot. +0.05 Sat Nov 30 11:31:25 CET 2002 + - new file debug.pasm that will handle all the debugging + capabilities of the interpreter. + - the verbose flag (-v) is replaced with a debug flag (-d) to + activate the integrated debugger. + 0.04 Sat Nov 23 10:22:51 CET 2002 - now using the push and pop instructions of the PerlArray PMC, and thanks go to Steve Fink for his hack to pop an diff -urbN parrot.old/languages/befunge/debug.pasm parrot/languages/befunge/debug.pasm --- parrot.old/languages/befunge/debug.pasm 1970-01-01 01:00:00.000000000 +0100 +++ parrot/languages/befunge/debug.pasm 2002-11-30 11:42:34.000000000 +0100 @@ -0,0 +1,114 @@ +# Initialize the debug structure. +# P3 = [ 1, "000 ... 000", [x1, x2, ...], [y1, y2, ...], [x1,y1, x2,y2, ...] ] +# P3[0] = stop at each step +# P3[1] = a 128 chars length string, 0 or 1 depending wether the +# interpreter should stop at the corresponding character. +# P3[2] = a PerlArray of column index that should stop the interpreter. +# P3[3] = a PerlArray of row index that should stop the interpreter. +# P3[4] = a PerlArray of 2d coord that should stop the interpreter. +DEBUG_INITIALIZE: + pushi + pushs + new P3, .PerlArray + set P3[0], 1 # Stop at first step. + repeat S10, "0", 128 # No char to break on. + set P3[1], S10 + new P4, .PerlArray # No col to break on. + set P3[2], P4 + new P4, .PerlArray # No row to break on. + set P3[3], P4 + new P4, .PerlArray # No coord to break on. + set P3[4], P4 + pops + popi + ret + + +# Check wether we should stop the interpreter at the current +# moment, allowing user to play with the debugger. +DEBUG_CHECK_BREAKPOINT: + pushi + pushs + set I10, P3[0] + eq 0, I10, DEBUG_CHECK_BREAKPOINT_CHAR + bsr DEBUG_INTERACT + branch DEBUG_CHECK_BREAKPOINT_END +DEBUG_CHECK_BREAKPOINT_CHAR: +DEBUG_CHECK_BREAKPOINT_END: + pops + popi + ret + + +# The interpreter has reached a breakpoint. Let's +# stop and interact with user. +DEBUG_INTERACT: + bsr DEBUG_PRINT_STATUS + ret + + +# Print the status of the instruction pointer: +# coordinates, current char, direction, flags and stack. +DEBUG_PRINT_STATUS: + # Coordinates. + print "(" + print I0 + print "," + print I1 + print ")" + # Current char. + print " - '" + print S0 + print "' (ord=" + ord I10, S0 + print I10 + print ")" + # Direction. + print " dir=" + print I2 + # Flags: + set S10, " \"" + eq I4, 1, DEBUG_PRINT_STATUS_FLAG + set S10, " #" + eq I4, 2, DEBUG_PRINT_STATUS_FLAG + set S10, " @" + eq I4, 3, DEBUG_PRINT_STATUS_FLAG + set S10, " " +DEBUG_PRINT_STATUS_FLAG: + print S10 + # Stack. + print " stack=" + set I11, P2 + set I10, 0 + ge I10, I11, DEBUG_PRINT_STATUS_STACK_END +DEBUG_PRINT_STATUS_STACK_LOOP: + set I12, P2[I10] + print I12 + inc I10 + ge I10, I11, DEBUG_PRINT_STATUS_STACK_END + print "," + branch DEBUG_PRINT_STATUS_STACK_LOOP +DEBUG_PRINT_STATUS_STACK_END: + print "\n" + ret + + +# Dump the playfield on stdout. +DEBUG_DUMP_PLAYFIELD: + pushi + pushs + repeat S10, "-", 82 + concat S10, "\n" + print S10 + set I10, 0 +DEBUG_DUMP_PLAYFIELD_NEXT_LINE: + set S11, P1[I10] + print "|" + print S11 + print "|\n" + inc I10 + lt I10, 25, DEBUG_DUMP_PLAYFIELD_NEXT_LINE + print S10 + pops + popi + ret diff -urbN parrot.old/languages/befunge/flow.pasm parrot/languages/befunge/flow.pasm --- parrot.old/languages/befunge/flow.pasm 2002-11-30 10:48:14.000000000 +0100 +++ parrot/languages/befunge/flow.pasm 2002-11-30 11:44:39.000000000 +0100 @@ -90,24 +90,23 @@ # Toggle string mode. # Befunge stack unchanged. FLOW_TOGGLE_STRING_MODE: - eq I5, 1, FLOW_TOGGLE_STRING_MODE_OFF - set I5, 1 + eq I4, 1, FLOW_TOGGLE_STRING_MODE_OFF + set I4, 1 branch MOVE_PC FLOW_TOGGLE_STRING_MODE_OFF: - set I5, 0 + set I4, 0 branch MOVE_PC # Trampoline. # Befunge stack unchanged. # Skip next instruction (pos < pos + delta) FLOW_BRIDGE: - set I5, 2 + set I4, 2 branch MOVE_PC # Stop. # Befunge stack unchanged. # End program. FLOW_END: - set I5, 3 + set I4, 3 branch MOVE_PC - \ No newline at end of file diff -urbN parrot.old/languages/befunge/README parrot/languages/befunge/README --- parrot.old/languages/befunge/README 2002-11-30 10:48:14.000000000 +0100 +++ parrot/languages/befunge/README 2002-11-30 11:35:24.000000000 +0100 @@ -1,6 +1,6 @@ DESCRIPTION ----------- -This is a Befunge interpreter written in Parrot assembler, version 0.04 +This is a Befunge interpreter written in Parrot assembler, version 0.05 This interpreter should be Befunge-93 compliant. This means the playfield is limited to 80x25 and can hold *only bytes*. This means @@ -13,18 +13,20 @@ Then you can run your Befunge program with: - $ ../../parrot befunge.pbc [-v] foo.bef + $ ../../parrot befunge.pbc [-d] foo.bef -The -v flag makes the befunge interpreter more verbose. +The -d flag enables debugging within the befunge interpreter (not yet +fully implemented, this is a work in progress). FILES ----- The files are the following: befunge.pasm the main loop - load.pasm function to load the code from source file + debug.pasm routines for the debugger flow.pasm handles the flow-control instructions io.pasm handles the io related instructions + load.pasm function to load the code from source file maths.pasm handles all the maths instructions stack.pasm handles the stack instructions Makefile a tiny, little Makefile to help (me) during @@ -44,7 +46,7 @@ * more error checking * better rand() methods * more tests (with Perl and Test::Harness) -* debugging options +* debugging options (work in progress) * use an array of arrays instead of an array of strings * implement Befunge 98 diff -urbN parrot.old/MANIFEST parrot/MANIFEST --- parrot.old/MANIFEST 2002-11-30 10:47:55.000000000 +0100 +++ parrot/MANIFEST 2002-11-30 11:36:55.000000000 +0100 @@ -1288,6 +1288,7 @@ languages/befunge/Makefile languages/befunge/README languages/befunge/befunge.pasm +languages/befunge/debug.pasm languages/befunge/flow.pasm languages/befunge/io.pasm languages/befunge/load.pasm