def test_sub_byte_1(self):
     source = c.block_of(s.push_byte(3), s.push_byte(2), s.sub_byte())
     sim = BfSim(source)
     while not sim.is_stopped():
         sim.run(10000)
     self.assertAlmostEqual(self.getByte(sim, 0), 1)
     self.assertEqual(sim.pointer, 4)
 def test_if_nz_decimal_3(self):
     source = c.block_of(
         s.push_decimal(0.0),
         s.if_nz_decimal(
             then_statement=s.push_byte(ord('N')) + s.put_char(),
             else_statement=s.push_byte(ord('Z')) + s.put_char()))
     out = io.StringIO()
     sim = BfSim(source, stdout=out)
     while not sim.is_stopped():
         sim.run(10000)
     self.assertEqual(out.getvalue(), "Z")
     self.assertAlmostEqual(self.getFloat(sim, 0), 0.0)
     self.assertAlmostEqual(self.getFloat(sim, 4), 0.0)
     self.assertEqual(sim.pointer, 0)
 def test_push_byte_1(self):
     source = s.push_byte(3)
     sim = BfSim(source)
     while not sim.is_stopped():
         sim.run(10000)
     self.assertEqual(self.getByte(sim, 0), 3)
     self.assertEqual(sim.pointer, 4)
def mandelbrot(columns: int, rows: int) -> str:
    # X軸の加算値
    x_step = (X_END - X_BEGIN) / (columns - 1)
    # Y軸の加算値
    y_step = (Y_END - Y_BEGIN) / (rows - 1)

    return c.program_of(

        # #0: y0 = y_begin
        s.push_decimal(Y_BEGIN),

        # #1: y = rows
        s.push_byte(rows),
        s.loop_of(  # for(y)

            # #2: x0 = x_begin
            s.push_decimal(X_BEGIN),

            # #3: x = columns
            s.push_byte(columns),
            s.loop_of(  # for(x)
                s.dup(1),  # #4: cx = x0
                s.dup(4),  # #5: cy = y0
                s.push_decimal(0),  # #6: zx = 0
                s.push_decimal(0),  # #7: zy = 0
                s.push_byte(ord(" ")),  # #8: ch = ' '
                s.push_byte(ord("A") - 1),  # #9: count = 'A'-1
                s.push_byte(C_MAX),  # #10: c = 26
                s.loop_of(  # for(c)

                    # #11: zx2 = zx * zx
                    s.dup(4),
                    s.dup(0),
                    s.multi_decimal(),

                    # #12: zy2 = zy * zy
                    s.dup(4),
                    s.dup(0),
                    s.multi_decimal(),

                    # #13: size2 = zx2 + zy2
                    s.dup(1),
                    s.dup(1),
                    s.add_decimal(),

                    # #14: THRESHOLD2
                    s.push_decimal(THRESHOLD2),
                    # if size2 > 4.0
                    s.if_gt_decimal(
                        then_statement=c.block_of(
                            # 発散

                            # ch = count
                            s.dup(5),  # #15
                            s.override(7),

                            # for_c break
                            s.loop_last(4)),
                        else_statement=c.block_of(
                            # #15: zx_next = zx2 - zy2 + cx
                            s.dup(3),
                            s.dup(3),
                            s.sub_decimal(),
                            s.dup(11),
                            s.add_decimal(),

                            # #16: zy_next = zx * zy * 2 + cy
                            s.dup(9),
                            s.dup(9),
                            s.multi_decimal(),
                            s.dup(0),
                            s.add_decimal(),
                            s.dup(11),
                            s.add_decimal(),

                            # #17: if zx_next == zx && zy_next == zy
                            s.dup(1),  # zx_next
                            s.dup(11),  # zx
                            s.sub_decimal(),
                            # #17: 0(zx_next == zx) or 1(zx_next != zx)
                            s.if_nz_decimal(
                                s.push_byte(1) + s.swap(1),
                                s.push_byte(0) + s.swap(1)),
                            s.dup(1),  # zy_next
                            s.dup(11),  # zy
                            s.sub_decimal(),
                            # #18: 0(zx_next == zx) or 1(zx_next != zx)
                            s.if_nz_decimal(
                                s.push_byte(1) + s.swap(1),
                                s.push_byte(0) + s.swap(1)),
                            # #17: 0(zx_next == zx && zy_next == zy) or other
                            s.add_byte(),
                            s.if_z(
                                then_statement=c.block_of(
                                    # 収束
                                    s.swap(1),
                                    s.drop(),  # drop zy_next
                                    s.swap(1),
                                    s.drop(),  # drop zx_next
                                    s.loop_last(5)  # last c
                                ),
                                else_statement=c.block_of(
                                    # zx = zx_next
                                    s.swap(1),
                                    s.override(10),

                                    # zy = zy_next
                                    s.swap(1),
                                    s.override(10),

                                    # count += 1
                                    s.dup(6),
                                    s.push_byte(1),
                                    s.add_byte(),
                                    s.override(7))))),
                    s.drop() * 2  # drop zy2, zx2
                ),
                s.drop(),  # drop count
                # 色対応
                s.dup(0),
                s.if_eq(ord('A'), s.put_str("\x1b[31m")),
                s.dup(0),
                s.if_eq(ord('B'), s.put_str("\x1b[32m")),
                s.dup(0),
                s.if_eq(ord('C'), s.put_str("\x1b[33m")),
                s.dup(0),
                s.if_eq(ord('D'), s.put_str("\x1b[34m")),
                s.dup(0),
                s.if_eq(ord('E'), s.put_str("\x1b[35m")),
                s.dup(0),
                s.if_eq(ord('F'), s.put_str("\x1b[36m")),
                # 色の対応ここまで
                s.put_char(),  # putchar(ch)
                # 色をリセット
                s.put_str("\x1b[0m"),
                s.drop() * 4,  # drop zy, zx, cy, cx

                # #4: x0 += x_step
                s.dup(1),
                s.push_decimal(x_step),
                s.add_decimal(),
                s.override(2)),
            # drop x0
            s.drop(),

            # #2: putchar("\n")
            s.push_byte(ord("\n")),
            s.put_char(),

            # #2: y0 += y_step
            s.dup(1),
            s.push_decimal(y_step),
            s.add_decimal(),
            s.override(2)))
def julia(columns: int, rows: int) -> str:
    # X軸の加算値
    x_step = (X_END - X_BEGIN) / (columns - 1)
    # Y軸の加算値
    y_step = (Y_END - Y_BEGIN) / (rows - 1)

    return c.program_of(

        # #0: y0 = y_begin
        s.push_decimal(Y_BEGIN),

        # #1: y = rows
        s.push_byte(rows),
        s.loop_of(  # for(y)

            # #2: x0 = x_begin
            s.push_decimal(X_BEGIN),

            # #3: x = columns
            s.push_byte(columns),
            s.loop_of(  # for(x)
                s.dup(1),  # #4: zx = x0
                s.dup(4),  # #5: zy = y0
                s.push_byte(ord(" ")),  # #6: ch = ' '
                s.push_byte(ord("A") - 1),  # #7: count = 'A'-1
                s.push_byte(C_MAX),  # #8: c = 26
                s.loop_of(  # for(c)

                    # #9: zx2 = zx * zx
                    s.dup(4),
                    s.dup(0),
                    s.multi_decimal(),

                    # #10: zy2 = zy * zy
                    s.dup(4),
                    s.dup(0),
                    s.multi_decimal(),

                    # #11: size2 = zx2 + zy2
                    s.dup(1),
                    s.dup(1),
                    s.add_decimal(),

                    # #12: THRESHOLD2
                    s.push_decimal(THRESHOLD2),
                    # if size2 > 4.0
                    s.if_gt_decimal(
                        then_statement=c.block_of(
                            # 発散

                            # ch = count
                            s.dup(5),  # #13
                            s.override(7),

                            # for_c break
                            s.loop_last(4)),
                        else_statement=c.block_of(
                            # #13: zx_next = zx2 - zy2 + cx
                            s.dup(3),
                            s.dup(3),
                            s.sub_decimal(),
                            s.push_decimal(C_X),
                            s.add_decimal(),

                            # #14: zy_next = zx * zy * 2 + cy
                            s.dup(9),
                            s.dup(9),
                            s.multi_decimal(),
                            s.dup(0),
                            s.add_decimal(),
                            s.push_decimal(C_Y),
                            s.add_decimal(),

                            # #15: if zx_next == zx && zy_next == zy
                            s.dup(1),  # zx_next
                            s.dup(11),  # zx
                            s.sub_decimal(),
                            # #15: 0(zx_next == zx) or 1(zx_next != zx)
                            s.if_nz_decimal(
                                s.push_byte(1) + s.swap(1),
                                s.push_byte(0) + s.swap(1)),
                            s.dup(1),  # zy_next
                            s.dup(11),  # zy
                            s.sub_decimal(),
                            # #16: 0(zx_next == zx) or 1(zx_next != zx)
                            s.if_nz_decimal(
                                s.push_byte(1) + s.swap(1),
                                s.push_byte(0) + s.swap(1)),
                            # #15: 0(zx_next == zx && zy_next == zy) or other
                            s.add_byte(),
                            s.if_z(
                                then_statement=c.block_of(
                                    # 収束
                                    s.swap(1),
                                    s.drop(),  # drop zy_next
                                    s.swap(1),
                                    s.drop(),  # drop zx_next
                                    s.loop_last(5)  # last c
                                ),
                                else_statement=c.block_of(
                                    # zx = zx_next
                                    s.swap(1),
                                    s.override(10),

                                    # zy = zy_next
                                    s.swap(1),
                                    s.override(10),

                                    # count += 1
                                    s.dup(6),
                                    s.push_byte(1),
                                    s.add_byte(),
                                    s.override(7))))),
                    s.drop() * 2  # drop zy2, zx2
                ),
                s.drop(),  # drop count
                s.put_char(),  # putchar(ch)
                s.drop() * 2,  # drop zy, zx

                # #4: x0 += x_step
                s.dup(1),
                s.push_decimal(x_step),
                s.add_decimal(),
                s.override(2)),
            # drop x0
            s.drop(),

            # #2: putchar("\n")
            s.push_byte(ord("\n")),
            s.put_char(),

            # #2: y0 += y_step
            s.dup(1),
            s.push_decimal(y_step),
            s.add_decimal(),
            s.override(2)))