From 9542deeb483a00b6fabed7574720926ce97d7511 Mon Sep 17 00:00:00 2001 From: Frederick Yin Date: Tue, 16 Aug 2022 11:54:23 +0800 Subject: Projects, 01-06 completed --- projects/04/fill/Fill.asm | 60 ++++++++++++++++++++++++ projects/04/fill/Fill.tst | 11 +++++ projects/04/fill/FillAutomatic.cmp | 4 ++ projects/04/fill/FillAutomatic.out | 4 ++ projects/04/fill/FillAutomatic.tst | 37 +++++++++++++++ projects/04/misc/arr.asm | 26 +++++++++++ projects/04/misc/iter.asm | 23 +++++++++ projects/04/misc/rect.asm | 95 ++++++++++++++++++++++++++++++++++++++ projects/04/mult/Mult.asm | 53 +++++++++++++++++++++ projects/04/mult/Mult.cmp | 7 +++ projects/04/mult/Mult.out | 7 +++ projects/04/mult/Mult.tst | 74 +++++++++++++++++++++++++++++ 12 files changed, 401 insertions(+) create mode 100644 projects/04/fill/Fill.asm create mode 100644 projects/04/fill/Fill.tst create mode 100644 projects/04/fill/FillAutomatic.cmp create mode 100644 projects/04/fill/FillAutomatic.out create mode 100644 projects/04/fill/FillAutomatic.tst create mode 100644 projects/04/misc/arr.asm create mode 100644 projects/04/misc/iter.asm create mode 100644 projects/04/misc/rect.asm create mode 100644 projects/04/mult/Mult.asm create mode 100644 projects/04/mult/Mult.cmp create mode 100644 projects/04/mult/Mult.out create mode 100644 projects/04/mult/Mult.tst (limited to 'projects/04') 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; -- cgit v1.2.3