# 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

Reply via email to