diff options
Diffstat (limited to 'projects/04')
-rw-r--r-- | projects/04/fill/Fill.asm | 60 | ||||
-rw-r--r-- | projects/04/fill/Fill.tst | 11 | ||||
-rw-r--r-- | projects/04/fill/FillAutomatic.cmp | 4 | ||||
-rw-r--r-- | projects/04/fill/FillAutomatic.out | 4 | ||||
-rw-r--r-- | projects/04/fill/FillAutomatic.tst | 37 | ||||
-rw-r--r-- | projects/04/misc/arr.asm | 26 | ||||
-rw-r--r-- | projects/04/misc/iter.asm | 23 | ||||
-rw-r--r-- | projects/04/misc/rect.asm | 95 | ||||
-rw-r--r-- | projects/04/mult/Mult.asm | 53 | ||||
-rw-r--r-- | projects/04/mult/Mult.cmp | 7 | ||||
-rw-r--r-- | projects/04/mult/Mult.out | 7 | ||||
-rw-r--r-- | projects/04/mult/Mult.tst | 74 |
12 files changed, 401 insertions, 0 deletions
diff --git a/projects/04/fill/Fill.asm b/projects/04/fill/Fill.asm new file mode 100644 index 0000000..1b69de1 --- /dev/null +++ b/projects/04/fill/Fill.asm @@ -0,0 +1,60 @@ +// 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.
+
+@8192
+D=A
+@words
+M=D // words = 8192
+
+(KBD_LOOP)
+ @KBD
+ D=M
+ @FILL_WHITE
+ D;JEQ // if (KBD == 0) goto FILL_WHITE
+ @color
+ M=-1 // color = 0xffff (black)
+ @FILL
+ 0;JMP
+
+(FILL_WHITE)
+ @color
+ M=0 // color = 0x0000 (white)
+ @FILL
+ 0;JMP
+
+(FILL)
+ @i
+ M=0 // i = 0
+ @SCREEN
+ D=A
+ @pos
+ M=D // pos = &SCREEN
+ (DRAW)
+ @color
+ D=M
+ @pos
+ A=M
+ M=D // *pos = color
+ @pos
+ M=M+1 // pos++
+ @i
+ M=M+1 // i++
+ D=M // D = i
+ @words
+ D=D-M // D = i - words
+ @KBD_LOOP
+ D;JEQ // if (i - words == 0) break
+ @DRAW
+ 0;JMP
diff --git a/projects/04/fill/Fill.tst b/projects/04/fill/Fill.tst new file mode 100644 index 0000000..e8bb385 --- /dev/null +++ b/projects/04/fill/Fill.tst @@ -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.asm;
+echo "Make sure that 'No Animation' is selected. Then, select the keyboard, press any key for some time, and inspect the screen.";
+
+repeat {
+ ticktock;
+}
diff --git a/projects/04/fill/FillAutomatic.cmp b/projects/04/fill/FillAutomatic.cmp new file mode 100644 index 0000000..a71db27 --- /dev/null +++ b/projects/04/fill/FillAutomatic.cmp @@ -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 | diff --git a/projects/04/fill/FillAutomatic.out b/projects/04/fill/FillAutomatic.out new file mode 100644 index 0000000..a71db27 --- /dev/null +++ b/projects/04/fill/FillAutomatic.out @@ -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 | diff --git a/projects/04/fill/FillAutomatic.tst b/projects/04/fill/FillAutomatic.tst new file mode 100644 index 0000000..fbc29a0 --- /dev/null +++ b/projects/04/fill/FillAutomatic.tst @@ -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.asm, +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 + diff --git a/projects/04/misc/arr.asm b/projects/04/misc/arr.asm new file mode 100644 index 0000000..2766fa7 --- /dev/null +++ b/projects/04/misc/arr.asm @@ -0,0 +1,26 @@ +@100 +D=A +@arr +M=D +@10 +D=A +@n +M=D + +(LOOP) + @arr + A=M + M=-1 + @arr + M=M+1 + @n + M=M-1 + D=M + @END + D;JEQ + @LOOP + 0;JMP + +(END) + @END + 0;JMP diff --git a/projects/04/misc/iter.asm b/projects/04/misc/iter.asm new file mode 100644 index 0000000..c5b11a5 --- /dev/null +++ b/projects/04/misc/iter.asm @@ -0,0 +1,23 @@ +@R1 +M=0 // reset R1 +@i +M=1 // reset i + +(LOOP) + @i + D=M + @R1 + M=M+D // R1 += i + @i + M=M+1 // i++ + @R0 + M=M-1 + D=M + @END + D;JEQ + @LOOP + 0;JMP + +(END) + @END + 0;JMP diff --git a/projects/04/misc/rect.asm b/projects/04/misc/rect.asm new file mode 100644 index 0000000..3106f04 --- /dev/null +++ b/projects/04/misc/rect.asm @@ -0,0 +1,95 @@ +@R0 +D=M +@width +M=D // width (max 32) = RAM[0] words = 16 * RAM[0] px + +@32 +D=A +@width +D=D-M // D = 32 - width +@WIDTH_PASS +D;JGE // if (D >= 0, i.e. width <= 32) goto WIDTH_PASS + +@32 +D=A +@width +M=D // width = 32 + +(WIDTH_PASS) + +@R1 +D=M +@height +M=D // height (max 256) = RAM[1] px + +@256 +D=A +@height +D=D-M // D = 256 - height +@HEIGHT_PASS +D;JGE // if (D >= 0, i.e. height <= 256) goto HEIGHT_PASS + +@256 +D=A +@height +M=D + +(HEIGHT_PASS) + +@32 +D=A +@offset +M=D // offset = 32 +@width +D=M +@offset +M=M-D // offset -= width + +@x +M=0 // x = 0 + +@y +M=0 // y = 0 + +@SCREEN +D=A +@pos +M=D // pos = &SCREEN + +(DRAW_Y) + (DRAW_X) + @pos + A=M + M=-1 // *pos = 0xffff + @pos + M=M+1 // pos++ + @x + M=M+1 // x++ + D=M // D = x + @width + D=D-M // D = x - width + @EXIT_X + D;JEQ // if (x - width == 0) break + @DRAW_X + 0;JMP + (EXIT_X) + @x + M=0; + @offset + D=M + @pos + M=M+D // pos += offset + @y + M=M+1 // y++ + D=M // D = y + @height + D=D-M // D = y - height + @END + D;JEQ // if (y - height == 0) break + @DRAW_Y + 0;JMP + +(END) + @END + 0;JMP + diff --git a/projects/04/mult/Mult.asm b/projects/04/mult/Mult.asm new file mode 100644 index 0000000..f84ce79 --- /dev/null +++ b/projects/04/mult/Mult.asm @@ -0,0 +1,53 @@ +// 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/Mult.asm
+
+// Multiplies R0 and R1 and stores the result in R2.
+// (R0, R1, R2 refer to RAM[0], RAM[1], and RAM[2], respectively.)
+//
+// This program only needs to handle arguments that satisfy
+// R0 >= 0, R1 >= 0, and R0*R1 < 32768.
+
+// Put your code here.
+@acc
+M=0 // acc = 0
+
+@R0
+D=M
+@a
+M=D // a = RAM[0]
+@WRITE
+D;JEQ // if (a == 0) goto WRITE
+
+@R1
+D=M
+@b
+M=D // b = RAM[1]
+@WRITE
+D;JEQ // if (b == 0) goto WRITE
+
+(LOOP)
+ @b
+ D=M
+ @acc
+ M=M+D // acc += b
+ @a
+ M=M-1 // a--
+ D=M
+ @WRITE
+ D;JEQ // if (a == 0) goto WRITE
+ @LOOP
+ 0;JMP // goto LOOP
+
+(WRITE)
+ @acc
+ D=M
+ @R2
+ M=D // RAM[2] = acc
+ @END
+ 0;JMP // goto END
+
+(END)
+ @END
+ 0;JMP
diff --git a/projects/04/mult/Mult.cmp b/projects/04/mult/Mult.cmp new file mode 100644 index 0000000..296b5fb --- /dev/null +++ b/projects/04/mult/Mult.cmp @@ -0,0 +1,7 @@ +| RAM[0] | RAM[1] | RAM[2] |
+| 0 | 0 | 0 |
+| 1 | 0 | 0 |
+| 0 | 2 | 0 |
+| 3 | 1 | 3 |
+| 2 | 4 | 8 |
+| 6 | 7 | 42 |
\ No newline at end of file diff --git a/projects/04/mult/Mult.out b/projects/04/mult/Mult.out new file mode 100644 index 0000000..e31b5df --- /dev/null +++ b/projects/04/mult/Mult.out @@ -0,0 +1,7 @@ +| RAM[0] | RAM[1] | RAM[2] | +| 0 | 0 | 0 | +| 1 | 0 | 0 | +| 0 | 2 | 0 | +| 3 | 1 | 3 | +| 2 | 4 | 8 | +| 6 | 7 | 42 | diff --git a/projects/04/mult/Mult.tst b/projects/04/mult/Mult.tst new file mode 100644 index 0000000..9bf4fa8 --- /dev/null +++ b/projects/04/mult/Mult.tst @@ -0,0 +1,74 @@ +// 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/mult/Mult.tst
+
+load Mult.asm,
+output-file Mult.out,
+compare-to Mult.cmp,
+output-list RAM[0]%D2.6.2 RAM[1]%D2.6.2 RAM[2]%D2.6.2;
+
+set RAM[0] 0, // Set test arguments
+set RAM[1] 0,
+set RAM[2] -1; // Test that program initialized product to 0
+repeat 20 {
+ ticktock;
+}
+set RAM[0] 0, // Restore arguments in case program used them as loop counter
+set RAM[1] 0,
+output;
+
+set PC 0,
+set RAM[0] 1, // Set test arguments
+set RAM[1] 0,
+set RAM[2] -1; // Ensure that program initialized product to 0
+repeat 50 {
+ ticktock;
+}
+set RAM[0] 1, // Restore arguments in case program used them as loop counter
+set RAM[1] 0,
+output;
+
+set PC 0,
+set RAM[0] 0, // Set test arguments
+set RAM[1] 2,
+set RAM[2] -1; // Ensure that program initialized product to 0
+repeat 80 {
+ ticktock;
+}
+set RAM[0] 0, // Restore arguments in case program used them as loop counter
+set RAM[1] 2,
+output;
+
+set PC 0,
+set RAM[0] 3, // Set test arguments
+set RAM[1] 1,
+set RAM[2] -1; // Ensure that program initialized product to 0
+repeat 120 {
+ ticktock;
+}
+set RAM[0] 3, // Restore arguments in case program used them as loop counter
+set RAM[1] 1,
+output;
+
+set PC 0,
+set RAM[0] 2, // Set test arguments
+set RAM[1] 4,
+set RAM[2] -1; // Ensure that program initialized product to 0
+repeat 150 {
+ ticktock;
+}
+set RAM[0] 2, // Restore arguments in case program used them as loop counter
+set RAM[1] 4,
+output;
+
+set PC 0,
+set RAM[0] 6, // Set test arguments
+set RAM[1] 7,
+set RAM[2] -1; // Ensure that program initialized product to 0
+repeat 210 {
+ ticktock;
+}
+set RAM[0] 6, // Restore arguments in case program used them as loop counter
+set RAM[1] 7,
+output;
|