Add solutions for part 1

This commit is contained in:
2020-11-15 13:57:48 -05:00
parent e4f9fd2682
commit 742db6d102
479 changed files with 202980 additions and 13 deletions

97
projects/04/fill/Fill.asm Normal file
View File

@@ -0,0 +1,97 @@
// This file is part of www.nand2tetris.org
// and the book "The Elements of Computing Systems"
// by Nisan and Schocken, MIT Press.
// File name: projects/04/Fill.asm
// Runs an infinite loop that listens to the keyboard input.
// When a key is pressed (any key), the program blackens the screen,
// i.e. writes "black" in every pixel;
// the screen should remain fully black as long as the key is pressed.
// When no key is pressed, the program clears the screen, i.e. writes
// "white" in every pixel;
// the screen should remain fully clear as long as no key is pressed.
// Put your code here.
// const_num_screen_words = 32 * 256 = 8192
@8192
D = A
@const_num_screen_words
M = D
// pixel_value = 0
@pixel_value
M = 0
(MAINLOOP)
// if RAM[KBD] == 0:
// pixel_value = 0
// else:
// pixel_value = -1
@KBD
D = M
@IF_TRUE
D;JEQ
@IF_FALSE
D;JMP
(IF_TRUE)
@pixel_value
M = 0
@END_IF
0;JMP
(IF_FALSE)
@pixel_value
M = -1
(END_IF)
@BLACKSCREEN
0;JMP
(BLACKSCREEN)
// i = 0
@i
M = 0
// current_word = 0
@current_word
M = 0
// while i < const_num_screen_words
(BLACKSCREEN_LOOP)
// if (i - const_num_screen_words >= 0) goto BLACKSCREEN_LOOP_END
@i
D = M
@const_num_screen_words
D = D - M
@BLACKSCREEN_LOOP_END
D;JGE
// current_word = SCREEN + 1
@i
D = M
@SCREEN
D = D + A
@current_word
M = D
// RAM[current_word] = pixel_value
@pixel_value
D = M
@current_word
A = M
M = D
// i++
@i
M = M + 1
// goto BLACKSCREEN_LOOP
@BLACKSCREEN_LOOP
0;JMP
(BLACKSCREEN_LOOP_END)
// goto MAINLOOP
@MAINLOOP
0;JMP

View File

@@ -0,0 +1,39 @@
0000000000010000
1110101010001000
0010000000000000
1110110000010000
0000000000010001
1110001100001000
0110000000000000
1111110000010000
0000000000010000
1110001100000101
0000000000001100
1110001100000010
0000000000010010
1110101010001000
0000000000010010
1110101010000111
0000000000010010
1110111010001000
0000000000010000
1111110000010000
0000000000010001
1111010011010000
0000000000000000
1110001100000010
0100000000000000
1110110000010000
0000000000010000
1111000010010000
0000000000010011
1110001100001000
0000000000010010
1111110000010000
0000000000010011
1111110000100000
1110001100001000
0000000000010000
1111110111001000
0000000000010010
1110101010000111

11
projects/04/fill/Fill.tst Normal file
View File

@@ -0,0 +1,11 @@
// This file is part of www.nand2tetris.org
// and the book "The Elements of Computing Systems"
// by Nisan and Schocken, MIT Press.
// File name: projects/04/fill/Fill.tst
load Fill.hack;
echo "Make sure that 'No Animation' is selected. Then, select the keyboard, press any key for some time, and inspect the screen.";
repeat {
ticktock;
}

View File

@@ -0,0 +1,4 @@
|RAM[16384]|RAM[17648]|RAM[18349]|RAM[19444]|RAM[20771]|RAM[21031]|RAM[22596]|RAM[23754]|RAM[24575]|
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |

View File

@@ -0,0 +1,4 @@
|RAM[16384]|RAM[17648]|RAM[18349]|RAM[19444]|RAM[20771]|RAM[21031]|RAM[22596]|RAM[23754]|RAM[24575]|
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |

View File

@@ -0,0 +1,37 @@
// This file is part of www.nand2tetris.org
// and the book "The Elements of Computing Systems"
// by Nisan and Schocken, MIT Press.
// File name: projects/04/fill/FillAutomatic
// This script can be used to test the Fill program automatically,
// rather than interactively. Specifically, the script sets the keyboard
// memory map (RAM[24576]) to 0, 1, and then again to 0. This simulates the
// acts of leaving the keyboard untouched, pressing some key, and then releasing
// the key. After each on of these simulated events, the script outputs the values
// of some selected registers from the screen memory map (RAM[16384]-RAM[24576]).
// This is done in order to test that these registers are set to 000...0 or 111....1,
// as mandated by how the Fill program should react to the keyboard events.
load Fill.hack,
output-file FillAutomatic.out,
compare-to FillAutomatic.cmp,
output-list RAM[16384]%D2.6.2 RAM[17648]%D2.6.2 RAM[18349]%D2.6.2 RAM[19444]%D2.6.2 RAM[20771]%D2.6.2 RAM[21031]%D2.6.2 RAM[22596]%D2.6.2 RAM[23754]%D2.6.2 RAM[24575]%D2.6.2;
set RAM[24576] 0, // the keyboard is untouched
repeat 1000000 {
ticktock;
}
output; // test that the screen is white
set RAM[24576] 1, // a keyboard key is pressed
repeat 1000000 {
ticktock;
}
output; // test that the screen is black
set RAM[24576] 0, // they keyboard in untouched
repeat 1000000 {
ticktock;
}
output; // test that the screen is white