// This program contains code Copyright 2000 Tom Rothamel.
// It is provided without warranty, and may be redistributed
// and used in modified or unmodified form, provided this
// copyright notice is retained in the source code.

.constant
objref 0x14a11
.end-constant

.main
.var
i
.end-var
	/// {

	/// for ((i = 99); i > 0; i
	// for: initalization expression
	BIPUSH 0x63
	ISTORE i
cond0loop:
	// for: loop condition
	BIPUSH 0x0
	ILOAD i
	ISUB
	IFLT cond0true
	GOTO cond0false
	// for: loop body
cond0true:
	/// {

	/// printbottlesob(i);
	LDC_W OBJREF
	ILOAD i
	INVOKEVIRTUAL printbottlesob
	POP

	/// out " on the wall,\n";
	BIPUSH 0x20
	OUT
	BIPUSH 0x6F
	OUT
	BIPUSH 0x6E
	OUT
	BIPUSH 0x20
	OUT
	BIPUSH 0x74
	OUT
	BIPUSH 0x68
	OUT
	BIPUSH 0x65
	OUT
	BIPUSH 0x20
	OUT
	BIPUSH 0x77
	OUT
	BIPUSH 0x61
	OUT
	BIPUSH 0x6C
	OUT
	BIPUSH 0x6C
	OUT
	BIPUSH 0x2C
	OUT
	BIPUSH 0xA
	OUT

	/// printbottlesob(i);
	LDC_W OBJREF
	ILOAD i
	INVOKEVIRTUAL printbottlesob
	POP

	/// out ".\n";
	BIPUSH 0x2E
	OUT
	BIPUSH 0xA
	OUT

	/// (i = (i - 1));
	ILOAD i
	BIPUSH 0x1
	ISUB
	ISTORE i

	/// out "Take one down, pass it around,\n";
	BIPUSH 0x54
	OUT
	BIPUSH 0x61
	OUT
	BIPUSH 0x6B
	OUT
	BIPUSH 0x65
	OUT
	BIPUSH 0x20
	OUT
	BIPUSH 0x6F
	OUT
	BIPUSH 0x6E
	OUT
	BIPUSH 0x65
	OUT
	BIPUSH 0x20
	OUT
	BIPUSH 0x64
	OUT
	BIPUSH 0x6F
	OUT
	BIPUSH 0x77
	OUT
	BIPUSH 0x6E
	OUT
	BIPUSH 0x2C
	OUT
	BIPUSH 0x20
	OUT
	BIPUSH 0x70
	OUT
	BIPUSH 0x61
	OUT
	BIPUSH 0x73
	OUT
	BIPUSH 0x73
	OUT
	BIPUSH 0x20
	OUT
	BIPUSH 0x69
	OUT
	BIPUSH 0x74
	OUT
	BIPUSH 0x20
	OUT
	BIPUSH 0x61
	OUT
	BIPUSH 0x72
	OUT
	BIPUSH 0x6F
	OUT
	BIPUSH 0x75
	OUT
	BIPUSH 0x6E
	OUT
	BIPUSH 0x64
	OUT
	BIPUSH 0x2C
	OUT
	BIPUSH 0xA
	OUT

	/// printbottlesob(i);
	LDC_W OBJREF
	ILOAD i
	INVOKEVIRTUAL printbottlesob
	POP

	/// out " on the wall.\n\n";
	BIPUSH 0x20
	OUT
	BIPUSH 0x6F
	OUT
	BIPUSH 0x6E
	OUT
	BIPUSH 0x20
	OUT
	BIPUSH 0x74
	OUT
	BIPUSH 0x68
	OUT
	BIPUSH 0x65
	OUT
	BIPUSH 0x20
	OUT
	BIPUSH 0x77
	OUT
	BIPUSH 0x61
	OUT
	BIPUSH 0x6C
	OUT
	BIPUSH 0x6C
	OUT
	BIPUSH 0x2E
	OUT
	BIPUSH 0xA
	OUT
	BIPUSH 0xA
	OUT
	/// }

cond0continue:
	// for: repetition expression
	GOTO cond0loop
cond0break:
cond0false:

	HALT
	/// }
.end-main

.method printbottlesob(n)
.var
q
oldn
.end-var
	/// {

	/// (oldn = n);
	ILOAD n
	ISTORE oldn

	/// if (n > 0)
	BIPUSH 0x0
	ILOAD n
	ISUB
	IFLT cond1true
	GOTO cond1false
cond1true:
	/// {

	/// (q = 0);
	BIPUSH 0x0
	ISTORE q

	/// while (!(n < 10))
cond2continue:
	ILOAD n
	BIPUSH 0xA
	ISUB
	IFLT cond2false
	GOTO cond2true
cond2true:
	/// {

	/// (n = (n - 10));
	ILOAD n
	BIPUSH 0xA
	ISUB
	ISTORE n

	/// (q = (q + 1));
	ILOAD q
	BIPUSH 0x1
	IADD
	ISTORE q
	/// }
	GOTO cond2continue
cond2break:
cond2false:

	/// if (q)
	ILOAD q
	IFEQ cond3false
	GOTO cond3true
cond3true:

	/// out (48 + q);
	BIPUSH 0x30
	ILOAD q
	IADD
	OUT
cond3false:

	/// out (n + 48);
	ILOAD n
	BIPUSH 0x30
	IADD
	OUT
	/// }

	GOTO cond1done
	/// else
cond1false:
	/// {

	/// out "No";
	BIPUSH 0x4E
	OUT
	BIPUSH 0x6F
	OUT
	// }
cond1done:

	/// out " bottle";
	BIPUSH 0x20
	OUT
	BIPUSH 0x62
	OUT
	BIPUSH 0x6F
	OUT
	BIPUSH 0x74
	OUT
	BIPUSH 0x74
	OUT
	BIPUSH 0x6C
	OUT
	BIPUSH 0x65
	OUT

	/// if (!(oldn == 1))
	BIPUSH 0x1
	ILOAD oldn
	IF_ICMPEQ cond4false
	GOTO cond4true
cond4true:

	/// out "s";
	BIPUSH 0x73
	OUT
cond4false:

	/// out " of beer";
	BIPUSH 0x20
	OUT
	BIPUSH 0x6F
	OUT
	BIPUSH 0x66
	OUT
	BIPUSH 0x20
	OUT
	BIPUSH 0x62
	OUT
	BIPUSH 0x65
	OUT
	BIPUSH 0x65
	OUT
	BIPUSH 0x72
	OUT

	/// return 0;
	BIPUSH 0x0
	IRETURN
	/// }
.end-method
