# New Ticket Created by Jerome Quelin # Please include the string: [perl #19603] # in the subject line of all future correspondence about this issue. # <URL: http://rt.perl.org/rt2/Ticket/Display.html?id=19603 >
Upon general (ahem) request, the befunge interpreter now supports breakpoints inside the debugger. One can now: - break upon a given instruction (a character) - break at a specified location (x,y) - break when reaching a given row - break when reaching a given column Jerome -- [EMAIL PROTECTED] -- attachment 1 ------------------------------------------------------ url: http://rt.perl.org/rt2/attach/46581/36580/15fced/befunge_debugger_has_breakpoints.patch
? befunge.pbc Index: Changes =================================================================== RCS file: /cvs/public/parrot/languages/befunge/Changes,v retrieving revision 1.5 diff -u -d -r1.5 Changes --- Changes 21 Dec 2002 16:56:09 -0000 1.5 +++ Changes 30 Dec 2002 17:23:25 -0000 @@ -1,5 +1,10 @@ Revision history for a Befunge interpreter written for Parrot. +0.1.1 Mon Dec 30 18:12:34 CET 2002 + - debugger now accepts breakpoints: either on instructions + (characters), or on a specified location (x,y), or on a + given row, or on a given column. + 0.1.0 Sat Dec 21 14:58:24 CET 2002 - playfield now is an array of array (of integers) instead of an array of strings. Index: README =================================================================== RCS file: /cvs/public/parrot/languages/befunge/README,v retrieving revision 1.7 diff -u -d -r1.7 README --- README 21 Dec 2002 16:56:09 -0000 1.7 +++ README 30 Dec 2002 17:23:25 -0000 @@ -1,6 +1,6 @@ DESCRIPTION ----------- -This is a Befunge interpreter written in Parrot assembler, version 0.1.0 +This is a Befunge interpreter written in Parrot assembler, version 0.1.1 This interpreter should be Befunge-93 compliant. This means the playfield is limited to 80x25. This should also mean that the torus @@ -17,7 +17,8 @@ $ ../../parrot befunge.pbc [-d] foo.bef The -d flag enables debugging within the befunge interpreter (not yet -fully implemented, this is a work in progress). +fully implemented, this is a work in progress). Type 'help' in the +debugger to see the commands supported. FILES Index: debug.pasm =================================================================== RCS file: /cvs/public/parrot/languages/befunge/debug.pasm,v retrieving revision 1.3 diff -u -d -r1.3 debug.pasm --- debug.pasm 21 Dec 2002 16:56:09 -0000 1.3 +++ debug.pasm 30 Dec 2002 17:23:25 -0000 @@ -1,24 +1,17 @@ # Initialize the debug structure. -# P3 = [ 1, "000 ... 000", [x1, x2, ...], [y1, y2, ...], [x1,y1, x2,y2, ...] ] +# P3 = [ 1, { "<" => 1, "10,10" => 1, "r:6" => 1, "c:3" => 1, ... } ] # 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. +# P3[1] = a PerlHash which keys are either the char to break upon +# when reaching it, or a location "y,x", or a column "c:nn" +# or a row "r:nn" 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 + new P4, .PerlHash + set P3[1], P4 # The breakpoints. pops popi ret @@ -29,12 +22,45 @@ DEBUG_CHECK_BREAKPOINT: pushi pushs + pushp 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: + set P4, P3[1] + exists I10, P4[S0] + eq 0, I10, DEBUG_CHECK_BREAKPOINT_COORD + bsr DEBUG_INTERACT + branch DEBUG_CHECK_BREAKPOINT_END +DEBUG_CHECK_BREAKPOINT_COORD: + set S10, I0 + concat S10, "," + set S11, I1 + concat S10, S11 + exists I10, P4[S10] + eq 0, I10, DEBUG_CHECK_BREAKPOINT_ROW + bsr DEBUG_INTERACT + branch DEBUG_CHECK_BREAKPOINT_END +DEBUG_CHECK_BREAKPOINT_ROW: + set S10, "r:" + set S11, I1 + concat S10, S11 + exists I10, P4[S10] + eq 0, I10, DEBUG_CHECK_BREAKPOINT_COL + bsr DEBUG_INTERACT + branch DEBUG_CHECK_BREAKPOINT_END +DEBUG_CHECK_BREAKPOINT_COL: + set S10, "c:" + set S11, I0 + concat S10, S11 + exists I10, P4[S10] + eq 0, I10, DEBUG_CHECK_BREAKPOINT_END + bsr DEBUG_INTERACT + # Fallback + # branch DEBUG_CHECK_BREAKPOINT_END +DEBUG_CHECK_BREAKPOINT_END: + popp pops popi ret @@ -66,7 +92,11 @@ print "Unknown instruction. Type help for help.\n" branch DEBUG_INTERACT DEBUG_INTERACT_BREAK: - print "Not yet implemented...\n" + substr S11, S10, 0, 6, "" + pushp + set P4, P3[1] + set P4[S10], 1 # stop at specified breakpoint + popp branch DEBUG_INTERACT DEBUG_INTERACT_CONTINUE: set P3[0], 0 # do not stop at next instruction @@ -78,8 +108,10 @@ print "Available commands are:\n" print " status - print state of current IP\n" print " dump - dump playfield\n" - print " break char c - set a breakpoint on character c\n" - print " break at x,y - set a breakpoint at coords (x,y)\n" + print " break c - set a breakpoint on character c\n" + print " break x,y - set a breakpoint at coords (x,y)\n" + print " break c:x - set a breakpoint on column x\n" + print " break r:y - set a breakpoint on row y\n" print " list - list breakpoints\n" print " next - step one befunge instruction\n" print " continue - resume execution\n"