diff options
Diffstat (limited to 'projects/09/K/Board.vm')
-rw-r--r-- | projects/09/K/Board.vm | 728 |
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 |