summaryrefslogtreecommitdiff
path: root/projects/09/K/Board.vm
diff options
context:
space:
mode:
Diffstat (limited to 'projects/09/K/Board.vm')
-rw-r--r--projects/09/K/Board.vm728
1 files changed, 457 insertions, 271 deletions
diff --git a/projects/09/K/Board.vm b/projects/09/K/Board.vm
index 3b5983c..ba236e1 100644
--- a/projects/09/K/Board.vm
+++ b/projects/09/K/Board.vm
@@ -1,5 +1,5 @@
-function Board.new 3
-push constant 3
+function Board.new 1
+push constant 4
call Memory.alloc 1
pop pointer 0
push constant 4
@@ -13,8 +13,6 @@ push constant 4
lt
not
if-goto WHILE_END0
-push constant 0
-pop local 1
push local 0
push this 0
add
@@ -25,6 +23,166 @@ pop pointer 1
push temp 0
pop that 0
push local 0
+push constant 1
+add
+pop local 0
+goto WHILE_EXP0
+label WHILE_END0
+push pointer 0
+call Board.initBoard 1
+pop temp 0
+push constant 0
+pop this 2
+push pointer 0
+return
+function Board.init 0
+push constant 6
+call String.new 1
+push constant 43
+call String.appendChar 2
+push constant 45
+call String.appendChar 2
+push constant 45
+call String.appendChar 2
+push constant 45
+call String.appendChar 2
+push constant 45
+call String.appendChar 2
+push constant 43
+call String.appendChar 2
+pop static 0
+push constant 9
+call String.new 1
+push constant 89
+call String.appendChar 2
+push constant 111
+call String.appendChar 2
+push constant 117
+call String.appendChar 2
+push constant 32
+call String.appendChar 2
+push constant 108
+call String.appendChar 2
+push constant 111
+call String.appendChar 2
+push constant 115
+call String.appendChar 2
+push constant 116
+call String.appendChar 2
+push constant 33
+call String.appendChar 2
+pop static 1
+push constant 8
+call String.new 1
+push constant 89
+call String.appendChar 2
+push constant 111
+call String.appendChar 2
+push constant 117
+call String.appendChar 2
+push constant 32
+call String.appendChar 2
+push constant 119
+call String.appendChar 2
+push constant 111
+call String.appendChar 2
+push constant 110
+call String.appendChar 2
+push constant 33
+call String.appendChar 2
+pop static 4
+push constant 25
+call String.new 1
+push constant 80
+call String.appendChar 2
+push constant 114
+call String.appendChar 2
+push constant 101
+call String.appendChar 2
+push constant 115
+call String.appendChar 2
+push constant 115
+call String.appendChar 2
+push constant 32
+call String.appendChar 2
+push constant 97
+call String.appendChar 2
+push constant 110
+call String.appendChar 2
+push constant 121
+call String.appendChar 2
+push constant 32
+call String.appendChar 2
+push constant 107
+call String.appendChar 2
+push constant 101
+call String.appendChar 2
+push constant 121
+call String.appendChar 2
+push constant 32
+call String.appendChar 2
+push constant 116
+call String.appendChar 2
+push constant 111
+call String.appendChar 2
+push constant 32
+call String.appendChar 2
+push constant 99
+call String.appendChar 2
+push constant 111
+call String.appendChar 2
+push constant 110
+call String.appendChar 2
+push constant 116
+call String.appendChar 2
+push constant 105
+call String.appendChar 2
+push constant 110
+call String.appendChar 2
+push constant 117
+call String.appendChar 2
+push constant 101
+call String.appendChar 2
+pop static 2
+push constant 10
+call String.new 1
+push constant 71
+call String.appendChar 2
+push constant 97
+call String.appendChar 2
+push constant 109
+call String.appendChar 2
+push constant 101
+call String.appendChar 2
+push constant 32
+call String.appendChar 2
+push constant 111
+call String.appendChar 2
+push constant 118
+call String.appendChar 2
+push constant 101
+call String.appendChar 2
+push constant 114
+call String.appendChar 2
+push constant 33
+call String.appendChar 2
+pop static 3
+push constant 0
+return
+function Board.initBoard 3
+push argument 0
+pop pointer 0
+push constant 0
+pop local 0
+label WHILE_EXP0
+push local 0
+push constant 4
+lt
+not
+if-goto WHILE_END0
+push constant 0
+pop local 1
+push local 0
push this 0
add
pop pointer 1
@@ -73,134 +231,70 @@ pop that 0
push constant 0
pop this 1
push constant 0
-pop this 2
-push pointer 0
+pop this 3
+push constant 0
return
-function Board.arrange 0
+function Board.transpose 0
push argument 0
pop pointer 0
-push argument 2
-if-goto IF_TRUE0
-goto IF_FALSE0
-label IF_TRUE0
push pointer 0
-push argument 1
-push this 0
-call Board.deepcopy 3
+push constant 0
+push constant 1
+call Board.exch 3
pop temp 0
-goto IF_END0
-label IF_FALSE0
push pointer 0
-push argument 1
-push this 0
-call Board.transpose 3
+push constant 0
+push constant 2
+call Board.exch 3
pop temp 0
-label IF_END0
push pointer 0
-push argument 1
-call Board.dispose4 2
-pop temp 0
-push constant 0
-return
-function Board.copy 1
-push argument 0
-pop pointer 0
push constant 0
-pop local 0
-label WHILE_EXP0
-push local 0
-push constant 4
-lt
-not
-if-goto WHILE_END0
-push local 0
-push argument 2
-add
-push local 0
-push argument 1
-add
-pop pointer 1
-push that 0
+push constant 3
+call Board.exch 3
pop temp 0
-pop pointer 1
-push temp 0
-pop that 0
-push local 0
+push pointer 0
push constant 1
-add
-pop local 0
-goto WHILE_EXP0
-label WHILE_END0
+push constant 2
+call Board.exch 3
+pop temp 0
+push pointer 0
+push constant 1
+push constant 3
+call Board.exch 3
+pop temp 0
+push pointer 0
+push constant 2
+push constant 3
+call Board.exch 3
+pop temp 0
push constant 0
return
-function Board.deepcopy 1
+function Board.exch 3
push argument 0
pop pointer 0
-push constant 0
-pop local 0
-label WHILE_EXP0
-push local 0
-push constant 4
-lt
-not
-if-goto WHILE_END0
-push pointer 0
-push local 0
push argument 1
+push this 0
add
pop pointer 1
push that 0
-push local 0
-push argument 2
-add
-pop pointer 1
-push that 0
-call Board.copy 3
-pop temp 0
-push local 0
-push constant 1
-add
-pop local 0
-goto WHILE_EXP0
-label WHILE_END0
-push constant 0
-return
-function Board.transpose 4
-push argument 0
-pop pointer 0
-push constant 0
-pop local 0
-label WHILE_EXP0
-push local 0
-push constant 4
-lt
-not
-if-goto WHILE_END0
-push constant 0
pop local 1
-push local 0
push argument 2
+push this 0
add
pop pointer 1
push that 0
pop local 2
-label WHILE_EXP1
-push local 1
-push constant 4
-lt
-not
-if-goto WHILE_END1
+push argument 2
push local 1
-push argument 1
add
pop pointer 1
push that 0
-pop local 3
+pop local 0
+push argument 2
push local 1
-push local 2
add
-push local 0
-push local 3
+push argument 1
+push local 2
add
pop pointer 1
push that 0
@@ -208,106 +302,15 @@ pop temp 0
pop pointer 1
push temp 0
pop that 0
-push local 1
-push constant 1
-add
-pop local 1
-goto WHILE_EXP1
-label WHILE_END1
-push local 0
-push constant 1
-add
-pop local 0
-goto WHILE_EXP0
-label WHILE_END0
-push constant 0
-return
-function Board.dispose4 2
-push argument 0
-pop pointer 0
-push constant 0
-pop local 0
-label WHILE_EXP0
-push local 0
-push constant 4
-lt
-not
-if-goto WHILE_END0
-push local 0
push argument 1
+push local 2
add
-pop pointer 1
-push that 0
-pop local 1
-push local 1
-call Array.dispose 1
-pop temp 0
push local 0
-push constant 1
-add
-pop local 0
-goto WHILE_EXP0
-label WHILE_END0
-push argument 1
-call Array.dispose 1
-pop temp 0
-push constant 0
-return
-function Board.new4 2
-push argument 0
-pop pointer 0
-push constant 4
-call Array.new 1
-pop local 0
-push constant 0
-pop local 1
-label WHILE_EXP0
-push local 1
-push constant 4
-lt
-not
-if-goto WHILE_END0
-push local 1
-push local 0
-add
-push constant 4
-call Array.new 1
pop temp 0
pop pointer 1
push temp 0
pop that 0
-push local 1
-push constant 1
-add
-pop local 1
-goto WHILE_EXP0
-label WHILE_END0
-push local 0
-return
-function Board.getStrips 1
-push argument 0
-pop pointer 0
-push pointer 0
-call Board.new4 1
-pop local 0
-push argument 1
-if-goto IF_TRUE0
-goto IF_FALSE0
-label IF_TRUE0
-push pointer 0
-push this 0
-push local 0
-call Board.deepcopy 3
-pop temp 0
-goto IF_END0
-label IF_FALSE0
-push pointer 0
-push this 0
-push local 0
-call Board.transpose 3
-pop temp 0
-label IF_END0
-push local 0
+push constant 0
return
function Board.align 2
push argument 0
@@ -449,7 +452,7 @@ pop local 1
goto WHILE_EXP3
label WHILE_END3
label IF_END0
-push argument 1
+push constant 0
return
function Board.reduce 0
push argument 0
@@ -591,7 +594,7 @@ pop pointer 1
push temp 0
pop that 0
label IF_END1
-push argument 1
+push constant 0
return
label IF_FALSE0
push constant 0
@@ -691,7 +694,7 @@ pop pointer 1
push temp 0
pop that 0
label IF_END3
-push argument 1
+push constant 0
return
label IF_FALSE2
push constant 2
@@ -791,7 +794,7 @@ pop pointer 1
push temp 0
pop that 0
label IF_END5
-push argument 1
+push constant 0
return
label IF_FALSE4
push constant 1
@@ -891,14 +894,24 @@ pop pointer 1
push temp 0
pop that 0
label IF_END7
-push argument 1
+push constant 0
return
label IF_FALSE6
-push argument 1
+push constant 0
return
function Board.addTile 5
push argument 0
pop pointer 0
+push this 3
+push constant 1
+eq
+not
+if-goto IF_TRUE0
+goto IF_FALSE0
+label IF_TRUE0
+push constant 0
+return
+label IF_FALSE0
push this 2
push constant 25173
call Math.multiply 2
@@ -908,13 +921,13 @@ pop this 2
push this 2
push constant 0
lt
-if-goto IF_TRUE0
-goto IF_FALSE0
-label IF_TRUE0
+if-goto IF_TRUE1
+goto IF_FALSE1
+label IF_TRUE1
push this 2
neg
pop this 2
-label IF_FALSE0
+label IF_FALSE1
push this 2
push this 2
push constant 2
@@ -924,17 +937,17 @@ call Math.multiply 2
sub
push constant 0
eq
-if-goto IF_TRUE1
-goto IF_FALSE1
-label IF_TRUE1
+if-goto IF_TRUE2
+goto IF_FALSE2
+label IF_TRUE2
push constant 1
pop local 3
-goto IF_END1
-label IF_FALSE1
+goto IF_END2
+label IF_FALSE2
push constant 1
neg
pop local 3
-label IF_END1
+label IF_END2
push this 2
push this 2
push constant 16
@@ -978,12 +991,12 @@ pop this 2
push this 2
push constant 0
lt
-if-goto IF_TRUE2
-goto IF_FALSE2
-label IF_TRUE2
+if-goto IF_TRUE3
+goto IF_FALSE3
+label IF_TRUE3
push constant 15
pop this 2
-label IF_FALSE2
+label IF_FALSE3
push this 2
push this 2
push constant 16
@@ -1024,7 +1037,7 @@ push temp 0
pop that 0
push constant 0
return
-function Board.transform 4
+function Board.transform 3
push argument 0
pop pointer 0
push argument 1
@@ -1056,54 +1069,61 @@ if-goto IF_TRUE1
goto IF_FALSE1
label IF_TRUE1
push constant 0
-not
pop local 0
goto IF_END1
label IF_FALSE1
push constant 0
+not
pop local 0
label IF_END1
-push pointer 0
push local 0
-call Board.getStrips 2
-pop local 2
+if-goto IF_TRUE2
+goto IF_FALSE2
+label IF_TRUE2
+push pointer 0
+call Board.transpose 1
+pop temp 0
+label IF_FALSE2
push constant 0
-pop local 3
+pop local 2
label WHILE_EXP0
-push local 3
+push local 2
push constant 4
lt
not
if-goto WHILE_END0
-push local 3
-push local 2
-add
-push pointer 0
push pointer 0
-push local 3
push local 2
+push this 0
add
pop pointer 1
push that 0
push local 1
call Board.align 3
+pop temp 0
+push pointer 0
+push local 2
+push this 0
+add
+pop pointer 1
+push that 0
push local 1
call Board.reduce 3
pop temp 0
-pop pointer 1
-push temp 0
-pop that 0
-push local 3
+push local 2
push constant 1
add
-pop local 3
+pop local 2
goto WHILE_EXP0
label WHILE_END0
-push pointer 0
-push local 2
push local 0
-call Board.arrange 3
+if-goto IF_TRUE3
+goto IF_FALSE3
+label IF_TRUE3
+push pointer 0
+call Board.transpose 1
pop temp 0
+label IF_FALSE3
push constant 0
return
function Board.next 0
@@ -1118,10 +1138,93 @@ push argument 1
call Board.transform 2
pop temp 0
push pointer 0
-call Board.addTile 1
+call Board.updateStatus 1
pop temp 0
push constant 0
return
+function Board.getStatus 0
+push argument 0
+pop pointer 0
+push this 3
+return
+function Board.setStatus 0
+push argument 0
+pop pointer 0
+push argument 1
+pop this 3
+push constant 0
+return
+function Board.updateStatus 3
+push argument 0
+pop pointer 0
+push constant 0
+pop local 0
+label WHILE_EXP0
+push local 0
+push constant 4
+lt
+not
+if-goto WHILE_END0
+push local 0
+push this 0
+add
+pop pointer 1
+push that 0
+pop local 2
+push constant 0
+pop local 1
+label WHILE_EXP1
+push local 1
+push constant 4
+lt
+not
+if-goto WHILE_END1
+push local 1
+push local 2
+add
+pop pointer 1
+push that 0
+push constant 75
+eq
+if-goto IF_TRUE0
+goto IF_FALSE0
+label IF_TRUE0
+push constant 3
+pop this 3
+push constant 0
+return
+label IF_FALSE0
+push local 1
+push local 2
+add
+pop pointer 1
+push that 0
+push constant 32
+eq
+if-goto IF_TRUE1
+goto IF_FALSE1
+label IF_TRUE1
+push constant 1
+pop this 3
+push constant 0
+return
+label IF_FALSE1
+push local 1
+push constant 1
+add
+pop local 1
+goto WHILE_EXP1
+label WHILE_END1
+push local 0
+push constant 1
+add
+pop local 0
+goto WHILE_EXP0
+label WHILE_END0
+push constant 2
+pop this 3
+push constant 0
+return
function Board.draw 5
push argument 0
pop pointer 0
@@ -1129,6 +1232,12 @@ push constant 9
pop local 0
push constant 30
pop local 1
+push this 3
+push constant 0
+eq
+if-goto IF_TRUE0
+goto IF_FALSE0
+label IF_TRUE0
push local 0
push constant 1
sub
@@ -1137,20 +1246,113 @@ push constant 1
sub
call Output.moveCursor 2
pop temp 0
-push constant 6
-call String.new 1
-push constant 43
-call String.appendChar 2
-push constant 45
-call String.appendChar 2
-push constant 45
-call String.appendChar 2
-push constant 45
-call String.appendChar 2
-push constant 45
-call String.appendChar 2
-push constant 43
-call String.appendChar 2
+push constant 75
+call Output.printChar 1
+pop temp 0
+push local 0
+push constant 1
+add
+push local 1
+push constant 1
+sub
+call Output.moveCursor 2
+pop temp 0
+push static 2
+call Output.printString 1
+pop temp 0
+goto IF_END0
+label IF_FALSE0
+push this 3
+push constant 2
+eq
+if-goto IF_TRUE1
+goto IF_FALSE1
+label IF_TRUE1
+push local 0
+push constant 1
+sub
+push local 1
+push constant 1
+sub
+call Output.moveCursor 2
+pop temp 0
+push static 3
+call Output.printString 1
+pop temp 0
+push local 0
+push constant 1
+add
+push local 1
+push constant 1
+sub
+call Output.moveCursor 2
+pop temp 0
+push static 1
+call Output.printString 1
+pop temp 0
+push local 0
+push constant 3
+add
+push local 1
+push constant 1
+sub
+call Output.moveCursor 2
+pop temp 0
+push static 2
+call Output.printString 1
+pop temp 0
+goto IF_END1
+label IF_FALSE1
+push this 3
+push constant 3
+eq
+if-goto IF_TRUE2
+goto IF_FALSE2
+label IF_TRUE2
+push local 0
+push constant 1
+sub
+push local 1
+push constant 1
+sub
+call Output.moveCursor 2
+pop temp 0
+push static 3
+call Output.printString 1
+pop temp 0
+push local 0
+push constant 1
+add
+push local 1
+push constant 1
+sub
+call Output.moveCursor 2
+pop temp 0
+push static 4
+call Output.printString 1
+pop temp 0
+push local 0
+push constant 3
+add
+push local 1
+push constant 1
+sub
+call Output.moveCursor 2
+pop temp 0
+push static 2
+call Output.printString 1
+pop temp 0
+goto IF_END2
+label IF_FALSE2
+push local 0
+push constant 1
+sub
+push local 1
+push constant 1
+sub
+call Output.moveCursor 2
+pop temp 0
+push static 0
call Output.printString 1
pop temp 0
push local 0
@@ -1161,20 +1363,7 @@ push constant 1
sub
call Output.moveCursor 2
pop temp 0
-push constant 6
-call String.new 1
-push constant 43
-call String.appendChar 2
-push constant 45
-call String.appendChar 2
-push constant 45
-call String.appendChar 2
-push constant 45
-call String.appendChar 2
-push constant 45
-call String.appendChar 2
-push constant 43
-call String.appendChar 2
+push static 0
call Output.printString 1
pop temp 0
push constant 0
@@ -1195,11 +1384,8 @@ push constant 1
sub
call Output.moveCursor 2
pop temp 0
-push constant 1
-call String.new 1
push constant 124
-call String.appendChar 2
-call Output.printString 1
+call Output.printChar 1
pop temp 0
push local 2
push this 0
@@ -1226,11 +1412,8 @@ add
pop local 3
goto WHILE_EXP1
label WHILE_END1
-push constant 1
-call String.new 1
push constant 124
-call String.appendChar 2
-call Output.printString 1
+call Output.printChar 1
pop temp 0
push local 2
push constant 1
@@ -1265,6 +1448,9 @@ pop temp 0
push this 1
call Output.printInt 1
pop temp 0
+label IF_END2
+label IF_END1
+label IF_END0
push constant 0
return
function Board.dispose 0