summaryrefslogtreecommitdiff
path: root/projects/04
diff options
context:
space:
mode:
authorFrederick Yin <fkfd@fkfd.me>2022-08-16 11:54:23 +0800
committerFrederick Yin <fkfd@fkfd.me>2022-08-16 11:54:23 +0800
commit9542deeb483a00b6fabed7574720926ce97d7511 (patch)
tree0f2c1f72c03dd4693fd59df67544d2a4dddc5494 /projects/04
parent9c0cb1d1c32724fc95ac9548e4f8d873d3adaccc (diff)
Projects, 01-06 completed
Diffstat (limited to 'projects/04')
-rw-r--r--projects/04/fill/Fill.asm60
-rw-r--r--projects/04/fill/Fill.tst11
-rw-r--r--projects/04/fill/FillAutomatic.cmp4
-rw-r--r--projects/04/fill/FillAutomatic.out4
-rw-r--r--projects/04/fill/FillAutomatic.tst37
-rw-r--r--projects/04/misc/arr.asm26
-rw-r--r--projects/04/misc/iter.asm23
-rw-r--r--projects/04/misc/rect.asm95
-rw-r--r--projects/04/mult/Mult.asm53
-rw-r--r--projects/04/mult/Mult.cmp7
-rw-r--r--projects/04/mult/Mult.out7
-rw-r--r--projects/04/mult/Mult.tst74
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;