# New Ticket Created by Jerome Quelin # Please include the string: [perl #18622] # in the subject line of all future correspondence about this issue. # <URL: http://rt.perl.org/rt2/Ticket/Display.html?id=18622 >
Well, the topic says it pretty much: befunge now supports the push and pop instructions builtin in PerlArray PMC, and I can get rid of my own crafted version of push and pop in Parrot Assembly. Fear, cause now I'll be able to find even more bugs! :-) Jerome -- [EMAIL PROTECTED] -- attachment 1 ------------------------------------------------------ url: http://rt.perl.org/rt2/attach/42194/33997/461ca0/befunge_use_pop_push.patch
? .timestamp ? languages/Befunge-93/befunge.pbc Index: languages/Befunge-93/Changes =================================================================== RCS file: /cvs/public/parrot/languages/Befunge-93/Changes,v retrieving revision 1.1 diff -u -d -r1.1 Changes --- languages/Befunge-93/Changes 14 Sep 2002 13:56:44 -0000 1.1 +++ languages/Befunge-93/Changes 23 Nov 2002 09:27:40 -0000 @@ -1,5 +1,10 @@ Revision history for Befunge-93 interpreter written for Parrot. +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 + empty PerlArray. + 0.03 Mon Sep 9 21:26:11 CEST 2002 - taking advantage of Parrot's 'chr' instruction, getting rid of Clinton Pierce's hack. Index: languages/Befunge-93/README =================================================================== RCS file: /cvs/public/parrot/languages/Befunge-93/README,v retrieving revision 1.3 diff -u -d -r1.3 README --- languages/Befunge-93/README 14 Sep 2002 13:56:44 -0000 1.3 +++ languages/Befunge-93/README 23 Nov 2002 09:27:41 -0000 @@ -1,19 +1,19 @@ DESCRIPTION ----------- -This is a Befunge interpreter written in Parrot assembler, version 0.03 +This is a Befunge interpreter written in Parrot assembler, version 0.04 This interpreter should be Befunge-93 compliant. This means the playfield is limited to 80x25 and can hold *only bytes*. This means that you can't fetch/store numbers greater than 255 or less than 0 in the torus (even if I do not check for over/underflow - for now). -You should compile the files with: +You should compile and test the files with: $ make test Then you can run your Befunge program with: - $ ../../parrot befunge.pbc [-v] foo.bef + $ ../../parrot befunge.pbc [-v] foo.bef The -v flag makes the befunge interpreter more verbose. @@ -26,8 +26,7 @@ flow.pasm handles the flow-control instructions io.pasm handles the io related instructions maths.pasm handles all the maths instructions - stack.pasm handles the stack operations as well as stack - instructions + stack.pasm handles the stack instructions Makefile a tiny, little Makefile to help (me) during developement test.bef a befunge script that test almost all the Index: languages/Befunge-93/flow.pasm =================================================================== RCS file: /cvs/public/parrot/languages/Befunge-93/flow.pasm,v retrieving revision 1.1 diff -u -d -r1.1 flow.pasm --- languages/Befunge-93/flow.pasm 17 Aug 2002 00:18:34 -0000 1.1 +++ languages/Befunge-93/flow.pasm 23 Nov 2002 09:27:41 -0000 @@ -43,8 +43,10 @@ # after: ... # delta <- if (b) (-1,0) else (1,0) FLOW_EW_IF: - bsr POP - restore I10 + set I10, P2 + unless I10, FLOW_EW_IF_POP_1 + pop I10, P2 +FLOW_EW_IF_POP_1: eq I10, 0, FLOW_GO_EAST branch FLOW_GO_WEST @@ -54,8 +56,10 @@ # after: ... # delta <- if (b) (0,-1) else (0,1) FLOW_NS_IF: - bsr POP - restore I10 + set I10, P2 + unless I10, FLOW_NS_IF_POP_1 + pop I10, P2 +FLOW_NS_IF_POP_1: eq I10, 0, FLOW_GO_SOUTH branch FLOW_GO_NORTH @@ -67,16 +71,19 @@ # Result is either 1 or 0. FLOW_COMPARE: pushi - bsr POP - restore I10 - bsr POP - restore I11 + set I10, P2 + unless I10, FLOW_COMPARE_POP_1 + pop I10, P2 +FLOW_COMPARE_POP_1: + set I11, P2 + unless I11, FLOW_COMPARE_POP_2 + pop I11, P2 +FLOW_COMPARE_POP_2: set I12, 1 gt I11, I10, FLOW_COMPARE_TRUE set I12, 0 FLOW_COMPARE_TRUE: - save I12 - bsr PUSH + push P2, I12 popi branch MOVE_PC Index: languages/Befunge-93/io.pasm =================================================================== RCS file: /cvs/public/parrot/languages/Befunge-93/io.pasm,v retrieving revision 1.2 diff -u -d -r1.2 io.pasm --- languages/Befunge-93/io.pasm 14 Sep 2002 13:56:44 -0000 1.2 +++ languages/Befunge-93/io.pasm 23 Nov 2002 09:27:41 -0000 @@ -6,8 +6,7 @@ IO_PUSH_CHAR: pushi ord I10, S0 - save I10 - bsr PUSH + push P2, I10 popi branch MOVE_PC @@ -39,8 +38,7 @@ set I11, 0 IO_INPUT_INT_NAN: substr S2, S2, I11, I10 - save I10 - bsr PUSH + push P2, I10 pops popi branch MOVE_PC @@ -63,8 +61,7 @@ length I10, S2 substr S2, S2, 1, I10 ord I10, S10 - save I10 - bsr PUSH + push P2, I10 save S2 pops restore S2 @@ -78,8 +75,10 @@ # writeint(i) IO_OUTPUT_INT: pushi - bsr POP - restore I10 + set I10, P2 + unless I10, IO_OUTPUT_INT_POP_1 + pop I10, P2 +IO_OUTPUT_INT_POP_1: print I10 popi branch MOVE_PC @@ -92,8 +91,10 @@ IO_OUTPUT_CHAR: pushi pushs - bsr POP - restore I10 + set I10, P2 + unless I10, IO_OUTPUT_CHAR_POP_1 + pop I10, P2 +IO_OUTPUT_CHAR_POP_1: chr S10, I10 print S10 popi @@ -108,14 +109,17 @@ IO_GET_VALUE: pushi pushs - bsr POP - restore I11 - bsr POP - restore I10 + set I11, P2 + unless I11, IO_GET_VALUE_POP_1 + pop I11, P2 +IO_GET_VALUE_POP_1: + set I10, P2 + unless I10, IO_GET_VALUE_POP_2 + pop I10, P2 +IO_GET_VALUE_POP_2: set S10, P1[I11] ord I12, S10, I10 - save I12 - bsr PUSH + push P2, I12 pops popi branch MOVE_PC @@ -128,13 +132,19 @@ IO_PUT_VALUE: pushi pushs - bsr POP - restore I11 + set I11, P2 + unless I11, IO_PUT_VALUE_POP_1 + pop I11, P2 +IO_PUT_VALUE_POP_1: set S10, P1[I11] # original line - bsr POP - restore I10 # offset - bsr POP - restore I20 + set I10, P2 # offset + unless I10, IO_PUT_VALUE_POP_2 + pop I10, P2 +IO_PUT_VALUE_POP_2: + set I20, P2 + unless I20, IO_PUT_VALUE_POP_3 + pop I20, P2 +IO_PUT_VALUE_POP_3: chr S11, I20 # char to store length I12, S10 set S13, "" # First part Index: languages/Befunge-93/maths.pasm =================================================================== RCS file: /cvs/public/parrot/languages/Befunge-93/maths.pasm,v retrieving revision 1.1 diff -u -d -r1.1 maths.pasm --- languages/Befunge-93/maths.pasm 17 Aug 2002 00:18:34 -0000 1.1 +++ languages/Befunge-93/maths.pasm 23 Nov 2002 09:27:41 -0000 @@ -29,8 +29,7 @@ MATHS_PUSH_NUMBER: pushi set I10, S0 - save I10 - bsr PUSH + push P2, I10 popi branch MOVE_PC @@ -40,13 +39,16 @@ # after: ... a+b MATHS_ADD: pushi - bsr POP - restore I11 - bsr POP - restore I10 + set I11, P2 + unless I11, MATHS_ADD_POP_1 + pop I11, P2 +MATHS_ADD_POP_1: + set I10, P2 + unless I10, MATHS_ADD_POP_2 + pop I10, P2 +MATHS_ADD_POP_2: add I12, I10, I11 - save I12 - bsr PUSH + push P2, I12 popi branch MOVE_PC @@ -56,13 +58,16 @@ # after: ... a-b MATHS_SUB: pushi - bsr POP - restore I11 - bsr POP - restore I10 + set I11, P2 + unless I11, MATHS_SUB_POP_1 + pop I11, P2 +MATHS_SUB_POP_1: + set I10, P2 + unless I10, MATHS_SUB_POP_2 + pop I10, P2 +MATHS_SUB_POP_2: sub I12, I10, I11 - save I12 - bsr PUSH + push P2, I12 popi branch MOVE_PC @@ -72,13 +77,16 @@ # after: ... a*b MATHS_MUL: pushi - bsr POP - restore I11 - bsr POP - restore I10 + set I11, P2 + unless I11, MATHS_MUL_POP_1 + pop I11, P2 +MATHS_MUL_POP_1: + set I10, P2 + unless I10, MATHS_MUL_POP_2 + pop I10, P2 +MATHS_MUL_POP_2: mul I12, I10, I11 - save I12 - bsr PUSH + push P2, I12 popi branch MOVE_PC @@ -88,13 +96,16 @@ # after: ... a/b MATHS_DIV: pushi - bsr POP - restore I11 - bsr POP - restore I10 + set I11, P2 + unless I11, MATHS_DIV_POP_1 + pop I11, P2 +MATHS_DIV_POP_1: + set I10, P2 + unless I10, MATHS_DIV_POP_2 + pop I10, P2 +MATHS_DIV_POP_2: div I12, I10, I11 - save I12 - bsr PUSH + push P2, I12 popi branch MOVE_PC @@ -104,13 +115,16 @@ # after: ... a mod b MATHS_MOD: pushi - bsr POP - restore I11 - bsr POP - restore I10 + set I11, P2 + unless I11, MATHS_MOD_POP_1 + pop I11, P2 +MATHS_MOD_POP_1: + set I10, P2 + unless I10, MATHS_MOD_POP_2 + pop I10, P2 +MATHS_MOD_POP_2: mod I12, I10, I11 - save I12 - bsr PUSH + push P2, I12 popi branch MOVE_PC @@ -120,10 +134,11 @@ # after: ... not(a) MATHS_NOT: pushi - bsr POP - restore I10 + set I10, P2 + unless I10, MATHS_NOT_POP_1 + pop I10, P2 +MATHS_NOT_POP_1: not I10, I10 - save I10 - bsr PUSH + push P2, I10 popi branch MOVE_PC Index: languages/Befunge-93/stack.pasm =================================================================== RCS file: /cvs/public/parrot/languages/Befunge-93/stack.pasm,v retrieving revision 1.1 diff -u -d -r1.1 stack.pasm --- languages/Befunge-93/stack.pasm 17 Aug 2002 00:18:34 -0000 1.1 +++ languages/Befunge-93/stack.pasm 23 Nov 2002 09:27:41 -0000 @@ -1,46 +1,15 @@ -# Push an integer in Befunge's stack. -# The integer is popped from Parrot's stack. -# Generic method. -PUSH: - pushi - restore I6 - set I7, P2 - set P2[I7], I6 - popi - ret - -# Pop an integer from Befunge's stack. -# the integer is pushed on Parrot's stack. -# Generic method. -POP: - pushi - set I7, P2 - eq I7, 0, POP_EMPTY - dec I7 - set I6, P2[I7] - save I6 - set P2, I7 - popi - ret - -POP_EMPTY: - set I10, 0 - save I10 - popi - ret - # Duplicate. # Befunge stack: # before: ... v # after: ... v STACK_DUP: pushi - bsr POP - restore I10 - save I10 - bsr PUSH - save I10 - bsr PUSH + set I10, P2 + unless I10, STACK_DUP_POP_1 + pop I10, P2 +STACK_DUP_POP_1: + push P2, I10 + push P2, I10 popi branch MOVE_PC @@ -51,8 +20,10 @@ # Element is just discarded. STACK_POP: pushi - bsr POP - restore I10 + set I10, P2 + unless I10, STACK_POP_POP_1 + pop I10, P2 +STACK_POP_POP_1: popi branch MOVE_PC @@ -62,13 +33,15 @@ # after: ... b a STACK_SWAP: pushi - bsr POP - restore I10 - bsr POP - restore I11 - save I10 - bsr PUSH - save I11 - bsr PUSH + set I10, P2 + unless I10, STACK_SWAP_POP_1 + pop I10, P2 +STACK_SWAP_POP_1: + set I11, P2 + unless I11, STACK_SWAP_POP_2 + pop I11, P2 +STACK_SWAP_POP_2: + push P2, I10 + push P2, I11 popi branch MOVE_PC