Add solutions for part 1
This commit is contained in:
97
projects/04/fill/Fill.asm
Normal file
97
projects/04/fill/Fill.asm
Normal 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
|
||||
39
projects/04/fill/Fill.hack
Normal file
39
projects/04/fill/Fill.hack
Normal 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
11
projects/04/fill/Fill.tst
Normal 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;
|
||||
}
|
||||
4
projects/04/fill/FillAutomatic.cmp
Normal file
4
projects/04/fill/FillAutomatic.cmp
Normal 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 |
|
||||
4
projects/04/fill/FillAutomatic.out
Normal file
4
projects/04/fill/FillAutomatic.out
Normal 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 |
|
||||
37
projects/04/fill/FillAutomatic.tst
Normal file
37
projects/04/fill/FillAutomatic.tst
Normal 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
|
||||
|
||||
Reference in New Issue
Block a user