Files
RustIJVM/files/advanced/Diamond.jas

122 lines
1.5 KiB
Plaintext

// Recursive diamond by George Karlos
//
// print a pyramid of characters starting from input char and
// going down to ascii 0x31 (1) using nested recursions
//
.constant
NEWLINE 0xA
OBJREF 0xDEAD
ZERO 0x30
ONE 0x31
SPACE 0x20
.end-constant
.main
LDC_W OBJREF
prompt:
IN
DUP
LDC_W ZERO
ISUB
IFLT prompt
LDC_W ONE
INVOKEVIRTUAL diamond
done:
HALT
.end-main
.method diamond(n,i)
.var
backupn
backupi
.end-var
ILOAD n
LDC_W ZERO
SWAP
ISUB
IFEQ return
//print empty spaces
LDC_W OBJREF
LDC_W SPACE
ILOAD n
INVOKEVIRTUAL printntimes
//print char
LDC_W OBJREF
ILOAD n
ILOAD i
INVOKEVIRTUAL printntimes
LDC_W NEWLINE
OUT
ILOAD n
ISTORE backupn
IINC n -1
ILOAD i
ISTORE backupi
IINC i 2
LDC_W OBJREF
ILOAD n
ILOAD i
INVOKEVIRTUAL diamond
//dont print 1's again
ILOAD backupn
LDC_W ONE
ISUB
IFEQ return
//print empty spaces
LDC_W OBJREF
LDC_W SPACE
ILOAD backupn
INVOKEVIRTUAL printntimes
//print char
LDC_W OBJREF
ILOAD backupn
ILOAD backupi
INVOKEVIRTUAL printntimes
LDC_W NEWLINE
OUT
return:
BIPUSH 0x1 //Just a return value
IRETURN
.end-method
.method printntimes(c,n)
ILOAD n
LDC_W ZERO
SWAP
ISUB
IFEQ return
ILOAD c
OUT
IINC n -1
LDC_W OBJREF
ILOAD c
ILOAD n
INVOKEVIRTUAL printntimes
return:
BIPUSH 0x2 //Just a return value
IRETURN
.end-method