Files
nand2tetris/projects/09/New folder/Tetris/Tetris.vm
T
QkoSad 7894b48931 .
2025-07-16 13:00:37 +03:00

1000 lines
16 KiB
Plaintext
Executable File

function Tetris.tetris 25
call Piece.init 0
pop temp 0
call Tetris.border 0
pop temp 0
push constant 0
pop static 0
push constant 25
call Array.new 1
pop local 23
push constant 0
push local 23
add
push constant 16
push constant 0
push constant 31
push constant 15
push constant 0
push constant 16
push constant 47
push constant 31
push constant 0
call Tetris.newPiece 9
pop temp 0
pop pointer 1
push temp 0
pop that 0
push constant 1
push local 23
add
push constant 0
push constant 0
push constant 15
push constant 15
push constant 0
push constant 16
push constant 47
push constant 31
push constant 1
call Tetris.newPiece 9
pop temp 0
pop pointer 1
push temp 0
pop that 0
push constant 2
push local 23
add
push constant 32
push constant 16
push constant 47
push constant 31
push constant 0
push constant 32
push constant 47
push constant 47
push constant 2
call Tetris.newPiece 9
pop temp 0
pop pointer 1
push temp 0
pop that 0
push constant 3
push local 23
add
push constant 0
push constant 0
push constant 31
push constant 15
push constant 16
push constant 16
push constant 47
push constant 31
push constant 3
call Tetris.newPiece 9
pop temp 0
pop pointer 1
push temp 0
pop that 0
push constant 4
push local 23
add
push constant 16
push constant 0
push constant 47
push constant 15
push constant 0
push constant 16
push constant 31
push constant 31
push constant 4
call Tetris.newPiece 9
pop temp 0
pop pointer 1
push temp 0
pop that 0
push constant 5
push local 23
add
push constant 0
push constant 0
push constant 31
push constant 15
push constant 32
push constant 0
push constant 63
push constant 15
push constant 5
call Tetris.newPiece 9
pop temp 0
pop pointer 1
push temp 0
pop that 0
push constant 6
push local 23
add
push constant 0
push constant 0
push constant 15
push constant 31
push constant 16
push constant 0
push constant 31
push constant 31
push constant 6
call Tetris.newPiece 9
pop temp 0
pop pointer 1
push temp 0
pop that 0
push argument 0
push constant 3
call Math.multiply 2
pop static 1
call Tetris.randomNumber 0
pop static 2
push constant 0
push constant 0
call Output.moveCursor 2
pop temp 0
push constant 7
call String.new 1
push constant 80
call String.appendChar 2
push constant 111
call String.appendChar 2
push constant 105
call String.appendChar 2
push constant 110
call String.appendChar 2
push constant 116
call String.appendChar 2
push constant 58
call String.appendChar 2
push constant 32
call String.appendChar 2
call Output.printString 1
pop temp 0
push static 0
call Output.printInt 1
pop temp 0
call Output.println 0
pop temp 0
push constant 12
call String.new 1
push constant 78
call String.appendChar 2
push constant 101
call String.appendChar 2
push constant 120
call String.appendChar 2
push constant 116
call String.appendChar 2
push constant 32
call String.appendChar 2
push constant 80
call String.appendChar 2
push constant 105
call String.appendChar 2
push constant 101
call String.appendChar 2
push constant 99
call String.appendChar 2
push constant 101
call String.appendChar 2
push constant 58
call String.appendChar 2
push constant 32
call String.appendChar 2
call Output.printString 1
pop temp 0
label WHILE_EXP0
push constant 0
not
not
if-goto WHILE_END0
push static 2
pop local 12
call Tetris.randomNumber 0
pop static 2
push local 12
push local 23
add
pop pointer 1
push that 0
pop local 24
push constant 0
push local 24
add
pop pointer 1
push that 0
pop local 3
push constant 1
push local 24
add
pop pointer 1
push that 0
pop local 4
push constant 2
push local 24
add
pop pointer 1
push that 0
pop local 5
push constant 3
push local 24
add
pop pointer 1
push that 0
pop local 6
push constant 4
push local 24
add
pop pointer 1
push that 0
pop local 7
push constant 5
push local 24
add
pop pointer 1
push that 0
pop local 8
push constant 6
push local 24
add
pop pointer 1
push that 0
pop local 9
push constant 7
push local 24
add
pop pointer 1
push that 0
pop local 10
push constant 8
push local 24
add
pop pointer 1
push that 0
pop local 14
push local 3
push constant 240
add
push local 4
push local 5
push constant 240
add
push local 6
push local 7
push constant 240
add
push local 8
push local 9
push constant 240
add
push local 10
push local 14
call Piece.new 9
pop local 0
push local 0
call Piece.draw 1
not
if-goto IF_TRUE0
goto IF_FALSE0
label IF_TRUE0
call Tetris.finish 0
not
if-goto IF_TRUE1
goto IF_FALSE1
label IF_TRUE1
push constant 0
return
label IF_FALSE1
label IF_FALSE0
push static 2
push local 23
add
pop pointer 1
push that 0
pop local 24
push constant 0
push local 24
add
pop pointer 1
push that 0
pop local 3
push constant 1
push local 24
add
pop pointer 1
push that 0
pop local 4
push constant 2
push local 24
add
pop pointer 1
push that 0
pop local 5
push constant 3
push local 24
add
pop pointer 1
push that 0
pop local 6
push constant 4
push local 24
add
pop pointer 1
push that 0
pop local 7
push constant 5
push local 24
add
pop pointer 1
push that 0
pop local 8
push constant 6
push local 24
add
pop pointer 1
push that 0
pop local 9
push constant 7
push local 24
add
pop pointer 1
push that 0
pop local 10
push constant 8
push local 24
add
pop pointer 1
push that 0
pop local 14
push local 3
push constant 16
add
push local 4
push constant 32
add
push local 5
push constant 16
add
push local 6
push constant 32
add
push local 7
push constant 16
add
push local 8
push constant 32
add
push local 9
push constant 16
add
push local 10
push constant 32
add
push local 14
call Piece.new 9
pop local 1
push local 1
call Piece.draw 1
pop temp 0
label WHILE_EXP1
push local 0
call Piece.getMove 1
not
if-goto WHILE_END1
push constant 0
pop local 15
label WHILE_EXP2
push local 15
push constant 3
lt
not
if-goto WHILE_END2
call Keyboard.keyPressed 0
pop local 11
push local 11
push constant 130
eq
if-goto IF_TRUE2
goto IF_FALSE2
label IF_TRUE2
push local 0
call Piece.moveLeft 1
pop temp 0
push constant 80
call Sys.wait 1
pop temp 0
label IF_FALSE2
push local 11
push constant 132
eq
if-goto IF_TRUE3
goto IF_FALSE3
label IF_TRUE3
push local 0
call Piece.moveRight 1
pop temp 0
push constant 80
call Sys.wait 1
pop temp 0
label IF_FALSE3
push local 11
push constant 131
eq
if-goto IF_TRUE4
goto IF_FALSE4
label IF_TRUE4
push local 0
call Piece.rotate 1
pop temp 0
label IF_FALSE4
push local 11
push constant 133
eq
if-goto IF_TRUE5
goto IF_FALSE5
label IF_TRUE5
push local 0
call Piece.moveDown 1
pop temp 0
push local 0
call Piece.moveDown 1
pop temp 0
label IF_FALSE5
push local 15
push constant 1
add
pop local 15
goto WHILE_EXP2
label WHILE_END2
push local 0
call Piece.moveDown 1
pop temp 0
push local 2
push constant 1
add
pop local 2
push constant 80
call Sys.wait 1
pop temp 0
goto WHILE_EXP1
label WHILE_END1
push constant 0
pop local 2
push local 0
call Piece.dispose 1
pop temp 0
call Tetris.completeRow 0
pop temp 0
push constant 0
push constant 7
call Output.moveCursor 2
pop temp 0
push static 0
call Output.printInt 1
pop temp 0
push constant 0
call Screen.setColor 1
pop temp 0
push constant 16
push constant 32
push constant 80
push constant 96
call Screen.drawRectangle 4
pop temp 0
push constant 0
not
call Screen.setColor 1
pop temp 0
push local 1
call Piece.dispose 1
pop temp 0
goto WHILE_EXP0
label WHILE_END0
push constant 0
return
function Tetris.completeRow 4
push constant 16384
push constant 11
add
pop local 0
push constant 15
pop local 1
label WHILE_EXP0
push local 1
push constant 0
gt
not
if-goto WHILE_END0
push constant 0
not
pop local 3
push constant 0
pop local 2
label WHILE_EXP1
push local 2
push constant 10
lt
push local 3
and
not
if-goto WHILE_END1
push local 0
push local 2
add
push local 1
push constant 512
call Math.multiply 2
add
call Memory.peek 1
push local 3
and
pop local 3
push local 2
push constant 1
add
pop local 2
goto WHILE_EXP1
label WHILE_END1
push local 3
if-goto IF_TRUE0
goto IF_FALSE0
label IF_TRUE0
push constant 0
call Screen.setColor 1
pop temp 0
push constant 176
push local 1
push constant 16
call Math.multiply 2
push constant 335
push local 1
push constant 16
call Math.multiply 2
push constant 15
add
call Screen.drawRectangle 4
pop temp 0
push static 0
push constant 1
add
pop static 0
push local 1
call Tetris.shift 1
pop temp 0
label IF_FALSE0
push local 1
push constant 1
sub
pop local 1
goto WHILE_EXP0
label WHILE_END0
push constant 0
return
function Tetris.shift 5
push constant 16384
push constant 11
add
pop local 2
label WHILE_EXP0
push argument 0
push constant 1
gt
not
if-goto WHILE_END0
push constant 0
pop local 0
label WHILE_EXP1
push local 0
push constant 10
lt
not
if-goto WHILE_END1
push constant 0
pop local 4
label WHILE_EXP2
push local 4
push constant 16
lt
not
if-goto WHILE_END2
push local 2
push local 0
add
push argument 0
push constant 1
sub
push constant 512
call Math.multiply 2
push local 4
push constant 32
call Math.multiply 2
add
add
pop local 3
push local 3
call Memory.peek 1
pop local 1
push local 2
push local 0
add
push argument 0
push constant 512
call Math.multiply 2
push local 4
push constant 32
call Math.multiply 2
add
add
push local 1
call Memory.poke 2
pop temp 0
push local 3
push constant 0
call Memory.poke 2
pop temp 0
push local 4
push constant 1
add
pop local 4
goto WHILE_EXP2
label WHILE_END2
push local 0
push constant 1
add
pop local 0
goto WHILE_EXP1
label WHILE_END1
push argument 0
push constant 1
sub
pop argument 0
goto WHILE_EXP0
label WHILE_END0
push constant 0
return
function Tetris.border 0
push constant 175
push constant 0
push constant 175
push constant 255
call Screen.drawLine 4
pop temp 0
push constant 336
push constant 0
push constant 336
push constant 255
call Screen.drawLine 4
pop temp 0
push constant 0
return
function Tetris.newPiece 1
push constant 9
call Array.new 1
pop local 0
push constant 0
push local 0
add
push argument 0
pop temp 0
pop pointer 1
push temp 0
pop that 0
push constant 1
push local 0
add
push argument 1
pop temp 0
pop pointer 1
push temp 0
pop that 0
push constant 2
push local 0
add
push argument 2
pop temp 0
pop pointer 1
push temp 0
pop that 0
push constant 3
push local 0
add
push argument 3
pop temp 0
pop pointer 1
push temp 0
pop that 0
push constant 4
push local 0
add
push argument 4
pop temp 0
pop pointer 1
push temp 0
pop that 0
push constant 5
push local 0
add
push argument 5
pop temp 0
pop pointer 1
push temp 0
pop that 0
push constant 6
push local 0
add
push argument 6
pop temp 0
pop pointer 1
push temp 0
pop that 0
push constant 7
push local 0
add
push argument 7
pop temp 0
pop pointer 1
push temp 0
pop that 0
push constant 8
push local 0
add
push argument 8
pop temp 0
pop pointer 1
push temp 0
pop that 0
push local 0
return
function Tetris.randomNumber 4
push constant 7
pop local 0
push constant 13
pop local 1
push constant 1133
pop local 2
push local 0
push static 1
call Math.multiply 2
push local 1
add
pop local 3
push local 3
push local 2
call Tetris.mod 2
pop static 1
push static 1
push constant 7
call Tetris.mod 2
return
function Tetris.finish 1
call Screen.clearScreen 0
pop temp 0
push constant 10
push constant 24
call Output.moveCursor 2
pop temp 0
push constant 12
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 114
call String.appendChar 2
push constant 32
call String.appendChar 2
push constant 115
call String.appendChar 2
push constant 99
call String.appendChar 2
push constant 111
call String.appendChar 2
push constant 114
call String.appendChar 2
push constant 101
call String.appendChar 2
push constant 58
call String.appendChar 2
push constant 32
call String.appendChar 2
call Output.printString 1
pop temp 0
push static 0
call Output.printInt 1
pop temp 0
push constant 10000
call Sys.wait 1
pop temp 0
call Screen.clearScreen 0
pop temp 0
push constant 10
push constant 0
call Output.moveCursor 2
pop temp 0
push constant 63
call String.new 1
push constant 87
call String.appendChar 2
push constant 111
call String.appendChar 2
push constant 117
call String.appendChar 2
push constant 108
call String.appendChar 2
push constant 100
call String.appendChar 2
push constant 32
call String.appendChar 2
push constant 121
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 105
call String.appendChar 2
push constant 107
call String.appendChar 2
push constant 101
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 112
call String.appendChar 2
push constant 108
call String.appendChar 2
push constant 97
call String.appendChar 2
push constant 121
call String.appendChar 2
push constant 32
call String.appendChar 2
push constant 97
call String.appendChar 2
push constant 103
call String.appendChar 2
push constant 97
call String.appendChar 2
push constant 105
call String.appendChar 2
push constant 110
call String.appendChar 2
push constant 44
call String.appendChar 2
push constant 32
call String.appendChar 2
push constant 102
call String.appendChar 2
push constant 111
call String.appendChar 2
push constant 114
call String.appendChar 2
push constant 32
call String.appendChar 2
push constant 121
call String.appendChar 2
push constant 101
call String.appendChar 2
push constant 115
call String.appendChar 2
push constant 32
call String.appendChar 2
push constant 99
call String.appendChar 2
push constant 108
call String.appendChar 2
push constant 105
call String.appendChar 2
push constant 99
call String.appendChar 2
push constant 107
call String.appendChar 2
push constant 32
call String.appendChar 2
push constant 39
call String.appendChar 2
push constant 89
call String.appendChar 2
push constant 39
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 100
call String.appendChar 2
push constant 32
call String.appendChar 2
push constant 102
call String.appendChar 2
push constant 111
call String.appendChar 2
push constant 114
call String.appendChar 2
push constant 32
call String.appendChar 2
push constant 110
call String.appendChar 2
push constant 111
call String.appendChar 2
push constant 32
call String.appendChar 2
push constant 39
call String.appendChar 2
push constant 78
call String.appendChar 2
push constant 39
call String.appendChar 2
push constant 58
call String.appendChar 2
call Output.printString 1
pop temp 0
call Keyboard.readChar 0
pop local 0
push local 0
push constant 89
eq
if-goto IF_TRUE0
goto IF_FALSE0
label IF_TRUE0
call Screen.clearScreen 0
pop temp 0
push constant 0
return
label IF_FALSE0
push local 0
push constant 78
eq
if-goto IF_TRUE1
goto IF_FALSE1
label IF_TRUE1
call Screen.clearScreen 0
pop temp 0
call Sys.halt 0
pop temp 0
label IF_FALSE1
push constant 0
not
return
function Tetris.mod 2
push argument 0
push argument 1
lt
if-goto IF_TRUE0
goto IF_FALSE0
label IF_TRUE0
push argument 0
return
label IF_FALSE0
push argument 0
push argument 1
call Math.divide 2
push argument 1
call Math.multiply 2
pop local 1
push argument 0
push local 1
sub
pop local 0
push local 0
return