// Sample asm
// this program displays all the printable ASCII values 32..126
.constant
one 1
start 32
stop 126
return 13
.end-constant
.main
LDC_W start // push start
LDC_W one // push 1
IADD // pop top two, add, push result
OUT // pop word and print
INVOKEVIRTUAL LINE_FEED
INVOKEVIRTUAL LINE_FEED
INVOKEVIRTUAL LINE_FEED
HALT
.end-main
.method LINE_FEED(count)
// count is unused
.var // delcare local variables here
.end-var
BIPUSH 11 // push 11
OUT
BIPUSH 65
INVOKEVIRTUAL print
ILOAD count // push count
IRETURN // return, top of stack hold return val
.end-method
// PRINT NUMBER
//
// Author
// Dan Stone
//
.method print( total ) // print converts a number into a string of
// characters and prints them. All of the characters
// are pushed onto the stack, least significant
// digit first, then popped off and printed.
.var
place
index
.end-var
print: BIPUSH 0x9 // there are 8 nibbles in each integer--setting
// this as nine pushes 10 characters onto the
// stack, thus a total of ten printed digits,
// but setting this less does not remove the
// two leading zeros, just removes significant
// digits
ISTORE index
BIPUSH 0x1 // comparison bit
ISTORE place
print1: BIPUSH 0x0
ILOAD index // index = index - 1
BIPUSH 0x1
ISUB
DUP
IFEQ pall // if index = 0 goto pall
ISTORE index
ILOAD total // else
ILOAD place //
IAND // if 1st bit of current nibble is zero (total & place)
IFEQ print2 // goto print2
BIPUSH 0x1 // else set first bit of character
IADD
print2: ILOAD place // place = place << 1
DUP
IADD
ISTORE place
ILOAD total
ILOAD place
IAND // if 2nd bit of current nibble is zero (total & place)
IFEQ print3 // goto print3
BIPUSH 0x2 // else set second bit of character
IADD
print3: ILOAD place // place = place << 1
DUP
IADD
ISTORE place
ILOAD total
ILOAD place
IAND // if 3rd bit of current nibble is zero (total & place)
IFEQ print4 // goto print4
BIPUSH 0x4 // else set second bit of character
IADD
print4: ILOAD place // place = place << 1
DUP
IADD
ISTORE place
ILOAD total
ILOAD place
IAND // if 4th bit of current nibble is zero (total & place)
IFEQ print5 // goto print5
BIPUSH 0x8 // else set second bit of character
IADD
print5: ILOAD place // place = place << 1
DUP
IADD
ISTORE place
GOTO print1
pall: POP // Pop off leading 0's
POP
BIPUSH 0x9
ISTORE index
pall1: ILOAD index // index = index - 1
BIPUSH 0x1
ISUB
DUP
IFEQ return // if index = 0 return
ISTORE index
DUP
BIPUSH 0xa // else if character < 0xa goto pall1
ISUB
IFLT pall2
BIPUSH 0x37 // else convert character to "A"-"F"
IADD
OUT // print character
GOTO pall1 // goto pall (prepare & print next character)
pall2: BIPUSH 0x30 // convert character to "0"-"9"
IADD
OUT // print character
GOTO pall1 // goto pall1 (prepare & print next character)
return: BIPUSH 0xa // print cr
OUT
IRETURN // no return value
.end-method