summaryrefslogtreecommitdiff
path: root/projects/05/Memory.tst
diff options
context:
space:
mode:
Diffstat (limited to 'projects/05/Memory.tst')
-rw-r--r--projects/05/Memory.tst191
1 files changed, 191 insertions, 0 deletions
diff --git a/projects/05/Memory.tst b/projects/05/Memory.tst
new file mode 100644
index 0000000..e88a704
--- /dev/null
+++ b/projects/05/Memory.tst
@@ -0,0 +1,191 @@
+// 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/05/Memory.tst
+
+load Memory.hdl,
+output-file Memory.out,
+compare-to Memory.cmp,
+output-list in%D1.6.1 load%B2.1.2 address%B1.15.1 out%D1.6.1;
+
+echo "Before you run this script, select the 'Screen' option from the 'View' menu";
+
+
+// There is an interesting design error that has shown up in several students'
+// Memory.hdl files that causes zeros to be written in the corresponding offset
+// in the inactive memory segments to the actual write. To detect this, the
+// test must not only look for writes into the wrong segment, but changes.
+// The following initialization writes a signal number into the memory where
+// the bad writes may occur.
+
+//// Set RAM[2000], RAM[4000] = 12345 (for following overwrite test)
+set in 12345, set load 1, set address %X2000, tick, output; tock, output;
+set address %X4000, tick, output; tock, output;
+
+
+set in -1, // Set RAM[0] = -1
+set load 1,
+set address 0,
+tick,
+output;
+tock,
+output;
+
+set in 9999, // RAM[0] holds value
+set load 0,
+tick,
+output;
+tock,
+output;
+
+set address %X2000, // Did not also write to upper RAM or Screen
+eval,
+output;
+set address %X4000,
+eval,
+output;
+
+
+//// Set RAM[0], RAM[4000] = 12345 (for following overwrite test)
+set in 12345, set load 1, set address %X0000, tick, output; tock, output;
+set address %X4000, tick, output; tock, output;
+
+
+set in 2222, // Set RAM[2000] = 2222
+set load 1,
+set address %X2000,
+tick,
+output;
+tock,
+output;
+
+set in 9999, // RAM[2000] holds value
+set load 0,
+tick,
+output;
+tock,
+output;
+
+set address 0, // Did not also write to lower RAM or Screen
+eval,
+output;
+set address %X4000,
+eval,
+output;
+
+set load 0, // Low order address bits connected
+set address %X0001, eval, output;
+set address %X0002, eval, output;
+set address %X0004, eval, output;
+set address %X0008, eval, output;
+set address %X0010, eval, output;
+set address %X0020, eval, output;
+set address %X0040, eval, output;
+set address %X0080, eval, output;
+set address %X0100, eval, output;
+set address %X0200, eval, output;
+set address %X0400, eval, output;
+set address %X0800, eval, output;
+set address %X1000, eval, output;
+set address %X2000, eval, output;
+
+set address %X1234, // RAM[1234] = 1234
+set in 1234,
+set load 1,
+tick,
+output;
+tock,
+output;
+
+set load 0,
+set address %X2234, // Did not also write to upper RAM or Screen
+eval, output;
+set address %X6234,
+eval, output;
+
+set address %X2345, // RAM[2345] = 2345
+set in 2345,
+set load 1,
+tick,
+output;
+tock,
+output;
+
+set load 0,
+set address %X0345, // Did not also write to lower RAM or Screen
+eval, output;
+set address %X4345,
+eval, output;
+
+
+//// Clear the overwrite detection value from the screen
+set in 0, set load 1, set address %X4000, tick, output; tock, output;
+
+
+// Keyboard test
+
+set address 24576,
+echo "Click the Keyboard icon and hold down the 'K' key (uppercase) until you see the next message (it should appear shortly after that) ...",
+// It's important to keep holding the key down since if the system is busy,
+// the memory will zero itself before being outputted.
+
+while out <> 75 {
+ tick, tock, // tick, tock prevents hang if sync. parts used in KB path.
+}
+
+clear-echo,
+output;
+
+// Screen test
+
+//// Set RAM[0FCF], RAM[2FCF] = 12345 (for following overwrite test)
+set in 12345, set load 1, set address %X0FCF, tick, output; tock, output;
+set address %X2FCF, tick, output; tock, output;
+
+set load 1,
+set in -1,
+set address %X4FCF,
+tick,
+tock,
+output,
+
+set address %X504F,
+tick,
+tock,
+output;
+
+set address %X0FCF, // Did not also write to lower or upper RAM
+eval,
+output;
+set address %X2FCF,
+eval,
+output;
+
+set load 0, // Low order address bits connected
+set address %X4FCE, eval, output;
+set address %X4FCD, eval, output;
+set address %X4FCB, eval, output;
+set address %X4FC7, eval, output;
+set address %X4FDF, eval, output;
+set address %X4FEF, eval, output;
+set address %X4F8F, eval, output;
+set address %X4F4F, eval, output;
+set address %X4ECF, eval, output;
+set address %X4DCF, eval, output;
+set address %X4BCF, eval, output;
+set address %X47CF, eval, output;
+set address %X5FCF, eval, output;
+
+
+set load 0,
+set address 24576,
+echo "Make sure you see ONLY two horizontal lines in the middle of the screen. Hold down 'Y' (uppercase) until you see the next message ...",
+// It's important to keep holding the key down since if the system is busy,
+// the memory will zero itself before being outputted.
+
+while out <> 89 {
+ tick, tock, // tick, tock prevents hang if sync. parts used in KB path.
+}
+
+clear-echo,
+output;