import java.io.PrintWriter;
import pal.*;

public class SumPAL
{
  public static void main(String[] args)
    throws Exception
  {
    PrintWriter out = new PrintWriter(System.out,true);
    Computer hal = new Computer(6);
    Container top = new MemLoc(new IConstant(0));
    Container input = new MemLoc(new IConstant(1));
    Container sum = new MemLoc(new IConstant(2));
    Container temp = new Temporary();
    Label readLabel = new Label("READ");
    Label computeLabel = new Label("COMPUTE");
    Label writeLabel = new Label("WRITE");
    Label endLabel = new Label("END");

    InstructionSequence code = new InstructionSequence();

    code.add(new Label("START"));
    code.add(new Comment("Remember top of stack."));
    code.add(new Move(Register.sp, top));
    code.add(new Comment("Initialize sum to 0."));
    code.add(new Move(new IConstant(0), sum));

    code.add(readLabel);
    code.add(new Comment("Read values until 0.  Push each on stack."));
    code.add(new IRead(input));
    code.add(new JumpZero(input, computeLabel));
    code.add(new Push(input));
    code.add(new Jump(readLabel));

    code.add(computeLabel);
    code.add(new Comment("Sum values"));
    code.add(new JumpLessEqual(top,Register.sp, writeLabel));
    code.add(new Pop(temp));
    code.add(new IAdd(sum, temp, sum));
    code.add(new Jump(computeLabel));

    code.add(writeLabel);
    code.add(new IWrite(sum));

    code.add(endLabel);
    code.add(new Halt());

    hal.setCode(code);
    out.println("----- DUMP -----");
    hal.dump(out);
    out.println("----- RUN ------");
    hal.run(true);
  } // main(String[])
} // class SumPAL
