diff options
Diffstat (limited to 'projects/05')
-rw-r--r-- | projects/05/Add.hack | 6 | ||||
-rw-r--r-- | projects/05/CPU-external.cmp | 93 | ||||
-rw-r--r-- | projects/05/CPU-external.tst | 150 | ||||
-rw-r--r-- | projects/05/CPU.cmp | 93 | ||||
-rw-r--r-- | projects/05/CPU.hdl | 43 | ||||
-rw-r--r-- | projects/05/CPU.tst | 150 | ||||
-rw-r--r-- | projects/05/Computer.hdl | 23 | ||||
-rw-r--r-- | projects/05/ComputerAdd-external.cmp | 15 | ||||
-rw-r--r-- | projects/05/ComputerAdd-external.tst | 32 | ||||
-rw-r--r-- | projects/05/ComputerAdd.cmp | 15 | ||||
-rw-r--r-- | projects/05/ComputerAdd.tst | 32 | ||||
-rw-r--r-- | projects/05/ComputerMax-external.cmp | 28 | ||||
-rw-r--r-- | projects/05/ComputerMax-external.tst | 38 | ||||
-rw-r--r-- | projects/05/ComputerMax.cmp | 28 | ||||
-rw-r--r-- | projects/05/ComputerMax.tst | 39 | ||||
-rw-r--r-- | projects/05/ComputerRect-external.cmp | 65 | ||||
-rw-r--r-- | projects/05/ComputerRect-external.tst | 26 | ||||
-rw-r--r-- | projects/05/ComputerRect.cmp | 65 | ||||
-rw-r--r-- | projects/05/ComputerRect.tst | 26 | ||||
-rw-r--r-- | projects/05/Max.hack | 16 | ||||
-rw-r--r-- | projects/05/Memory.cmp | 54 | ||||
-rw-r--r-- | projects/05/Memory.hdl | 31 | ||||
-rw-r--r-- | projects/05/Memory.tst | 163 | ||||
-rw-r--r-- | projects/05/Rect.hack | 25 |
24 files changed, 1256 insertions, 0 deletions
diff --git a/projects/05/Add.hack b/projects/05/Add.hack new file mode 100644 index 0000000..fe5969d --- /dev/null +++ b/projects/05/Add.hack @@ -0,0 +1,6 @@ +0000000000000010
+1110110000010000
+0000000000000011
+1110000010010000
+0000000000000000
+1110001100001000
diff --git a/projects/05/CPU-external.cmp b/projects/05/CPU-external.cmp new file mode 100644 index 0000000..58f43bd --- /dev/null +++ b/projects/05/CPU-external.cmp @@ -0,0 +1,93 @@ +|time| inM | instruction |reset| outM |writeM |addre| pc |
+|0+ | 0|0011000000111001| 0 |*******| 0 | 0| 0|
+|1 | 0|0011000000111001| 0 |*******| 0 |12345| 1|
+|1+ | 0|1110110000010000| 0 |*******| 0 |12345| 1|
+|2 | 0|1110110000010000| 0 |*******| 0 |12345| 2|
+|2+ | 0|0101101110100000| 0 |*******| 0 |12345| 2|
+|3 | 0|0101101110100000| 0 |*******| 0 |23456| 3|
+|3+ | 0|1110000111010000| 0 |*******| 0 |23456| 3|
+|4 | 0|1110000111010000| 0 |*******| 0 |23456| 4|
+|4+ | 0|0000001111101000| 0 |*******| 0 |23456| 4|
+|5 | 0|0000001111101000| 0 |*******| 0 | 1000| 5|
+|5+ | 0|1110001100001000| 0 | 11111| 1 | 1000| 5|
+|6 | 0|1110001100001000| 0 | 11111| 1 | 1000| 6|
+|6+ | 0|0000001111101001| 0 |*******| 0 | 1000| 6|
+|7 | 0|0000001111101001| 0 |*******| 0 | 1001| 7|
+|7+ | 0|1110001110011000| 0 | 11110| 1 | 1001| 7|
+|8 | 0|1110001110011000| 0 | 11109| 1 | 1001| 8|
+|8+ | 0|0000001111101000| 0 |*******| 0 | 1001| 8|
+|9 | 0|0000001111101000| 0 |*******| 0 | 1000| 9|
+|9+ | 11111|1111010011010000| 0 |*******| 0 | 1000| 9|
+|10 | 11111|1111010011010000| 0 |*******| 0 | 1000| 10|
+|10+ | 11111|0000000000001110| 0 |*******| 0 | 1000| 10|
+|11 | 11111|0000000000001110| 0 |*******| 0 | 14| 11|
+|11+ | 11111|1110001100000100| 0 |*******| 0 | 14| 11|
+|12 | 11111|1110001100000100| 0 |*******| 0 | 14| 14|
+|12+ | 11111|0000001111100111| 0 |*******| 0 | 14| 14|
+|13 | 11111|0000001111100111| 0 |*******| 0 | 999| 15|
+|13+ | 11111|1110110111100000| 0 |*******| 0 | 999| 15|
+|14 | 11111|1110110111100000| 0 |*******| 0 | 1000| 16|
+|14+ | 11111|1110001100001000| 0 | -1| 1 | 1000| 16|
+|15 | 11111|1110001100001000| 0 | -1| 1 | 1000| 17|
+|15+ | 11111|0000000000010101| 0 |*******| 0 | 1000| 17|
+|16 | 11111|0000000000010101| 0 |*******| 0 | 21| 18|
+|16+ | 11111|1110011111000010| 0 |*******| 0 | 21| 18|
+|17 | 11111|1110011111000010| 0 |*******| 0 | 21| 21|
+|17+ | 11111|0000000000000010| 0 |*******| 0 | 21| 21|
+|18 | 11111|0000000000000010| 0 |*******| 0 | 2| 22|
+|18+ | 11111|1110000010010000| 0 |*******| 0 | 2| 22|
+|19 | 11111|1110000010010000| 0 |*******| 0 | 2| 23|
+|19+ | 11111|0000001111101000| 0 |*******| 0 | 2| 23|
+|20 | 11111|0000001111101000| 0 |*******| 0 | 1000| 24|
+|20+ | 11111|1110111010010000| 0 |*******| 0 | 1000| 24|
+|21 | 11111|1110111010010000| 0 |*******| 0 | 1000| 25|
+|21+ | 11111|1110001100000001| 0 |*******| 0 | 1000| 25|
+|22 | 11111|1110001100000001| 0 |*******| 0 | 1000| 26|
+|22+ | 11111|1110001100000010| 0 |*******| 0 | 1000| 26|
+|23 | 11111|1110001100000010| 0 |*******| 0 | 1000| 27|
+|23+ | 11111|1110001100000011| 0 |*******| 0 | 1000| 27|
+|24 | 11111|1110001100000011| 0 |*******| 0 | 1000| 28|
+|24+ | 11111|1110001100000100| 0 |*******| 0 | 1000| 28|
+|25 | 11111|1110001100000100| 0 |*******| 0 | 1000| 1000|
+|25+ | 11111|1110001100000101| 0 |*******| 0 | 1000| 1000|
+|26 | 11111|1110001100000101| 0 |*******| 0 | 1000| 1000|
+|26+ | 11111|1110001100000110| 0 |*******| 0 | 1000| 1000|
+|27 | 11111|1110001100000110| 0 |*******| 0 | 1000| 1000|
+|27+ | 11111|1110001100000111| 0 |*******| 0 | 1000| 1000|
+|28 | 11111|1110001100000111| 0 |*******| 0 | 1000| 1000|
+|28+ | 11111|1110101010010000| 0 |*******| 0 | 1000| 1000|
+|29 | 11111|1110101010010000| 0 |*******| 0 | 1000| 1001|
+|29+ | 11111|1110001100000001| 0 |*******| 0 | 1000| 1001|
+|30 | 11111|1110001100000001| 0 |*******| 0 | 1000| 1002|
+|30+ | 11111|1110001100000010| 0 |*******| 0 | 1000| 1002|
+|31 | 11111|1110001100000010| 0 |*******| 0 | 1000| 1000|
+|31+ | 11111|1110001100000011| 0 |*******| 0 | 1000| 1000|
+|32 | 11111|1110001100000011| 0 |*******| 0 | 1000| 1000|
+|32+ | 11111|1110001100000100| 0 |*******| 0 | 1000| 1000|
+|33 | 11111|1110001100000100| 0 |*******| 0 | 1000| 1001|
+|33+ | 11111|1110001100000101| 0 |*******| 0 | 1000| 1001|
+|34 | 11111|1110001100000101| 0 |*******| 0 | 1000| 1002|
+|34+ | 11111|1110001100000110| 0 |*******| 0 | 1000| 1002|
+|35 | 11111|1110001100000110| 0 |*******| 0 | 1000| 1000|
+|35+ | 11111|1110001100000111| 0 |*******| 0 | 1000| 1000|
+|36 | 11111|1110001100000111| 0 |*******| 0 | 1000| 1000|
+|36+ | 11111|1110111111010000| 0 |*******| 0 | 1000| 1000|
+|37 | 11111|1110111111010000| 0 |*******| 0 | 1000| 1001|
+|37+ | 11111|1110001100000001| 0 |*******| 0 | 1000| 1001|
+|38 | 11111|1110001100000001| 0 |*******| 0 | 1000| 1000|
+|38+ | 11111|1110001100000010| 0 |*******| 0 | 1000| 1000|
+|39 | 11111|1110001100000010| 0 |*******| 0 | 1000| 1001|
+|39+ | 11111|1110001100000011| 0 |*******| 0 | 1000| 1001|
+|40 | 11111|1110001100000011| 0 |*******| 0 | 1000| 1000|
+|40+ | 11111|1110001100000100| 0 |*******| 0 | 1000| 1000|
+|41 | 11111|1110001100000100| 0 |*******| 0 | 1000| 1001|
+|41+ | 11111|1110001100000101| 0 |*******| 0 | 1000| 1001|
+|42 | 11111|1110001100000101| 0 |*******| 0 | 1000| 1000|
+|42+ | 11111|1110001100000110| 0 |*******| 0 | 1000| 1000|
+|43 | 11111|1110001100000110| 0 |*******| 0 | 1000| 1001|
+|43+ | 11111|1110001100000111| 0 |*******| 0 | 1000| 1001|
+|44 | 11111|1110001100000111| 0 |*******| 0 | 1000| 1000|
+|44+ | 11111|1110001100000111| 1 |*******| 0 | 1000| 1000|
+|45 | 11111|1110001100000111| 1 |*******| 0 | 1000| 0|
+|45+ | 11111|0111111111111111| 0 |*******| 0 | 1000| 0|
+|46 | 11111|0111111111111111| 0 |*******| 0 |32767| 1|
diff --git a/projects/05/CPU-external.tst b/projects/05/CPU-external.tst new file mode 100644 index 0000000..5aa0295 --- /dev/null +++ b/projects/05/CPU-external.tst @@ -0,0 +1,150 @@ +// 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/CPU-external.tst
+
+load CPU.hdl,
+output-file CPU-external.out,
+compare-to CPU-external.cmp,
+output-list time%S0.4.0 inM%D0.6.0 instruction%B0.16.0 reset%B2.1.2 outM%D1.6.0 writeM%B3.1.3 addressM%D0.5.0 pc%D0.5.0;
+
+
+set instruction %B0011000000111001, // @12345
+tick, output, tock, output;
+
+set instruction %B1110110000010000, // D=A
+tick, output, tock, output;
+
+set instruction %B0101101110100000, // @23456
+tick, output, tock, output;
+
+set instruction %B1110000111010000, // D=A-D
+tick, output, tock, output;
+
+set instruction %B0000001111101000, // @1000
+tick, output, tock, output;
+
+set instruction %B1110001100001000, // M=D
+tick, output, tock, output;
+
+set instruction %B0000001111101001, // @1001
+tick, output, tock, output;
+
+set instruction %B1110001110011000, // MD=D-1
+tick, output, tock, output;
+
+set instruction %B0000001111101000, // @1000
+tick, output, tock, output;
+
+set instruction %B1111010011010000, // D=D-M
+set inM 11111,
+tick, output, tock, output;
+
+set instruction %B0000000000001110, // @14
+tick, output, tock, output;
+
+set instruction %B1110001100000100, // D;jlt
+tick, output, tock, output;
+
+set instruction %B0000001111100111, // @999
+tick, output, tock, output;
+
+set instruction %B1110110111100000, // A=A+1
+tick, output, tock, output;
+
+set instruction %B1110001100001000, // M=D
+tick, output, tock, output;
+
+set instruction %B0000000000010101, // @21
+tick, output, tock, output;
+
+set instruction %B1110011111000010, // D+1;jeq
+tick, output, tock, output;
+
+set instruction %B0000000000000010, // @2
+tick, output, tock, output;
+
+set instruction %B1110000010010000, // D=D+A
+tick, output, tock, output;
+
+set instruction %B0000001111101000, // @1000
+tick, output, tock, output;
+
+set instruction %B1110111010010000, // D=-1
+tick, output, tock, output;
+
+set instruction %B1110001100000001, // D;JGT
+tick, output, tock, output;
+
+set instruction %B1110001100000010, // D;JEQ
+tick, output, tock, output;
+
+set instruction %B1110001100000011, // D;JGE
+tick, output, tock, output;
+
+set instruction %B1110001100000100, // D;JLT
+tick, output, tock, output;
+
+set instruction %B1110001100000101, // D;JNE
+tick, output, tock, output;
+
+set instruction %B1110001100000110, // D;JLE
+tick, output, tock, output;
+
+set instruction %B1110001100000111, // D;JMP
+tick, output, tock, output;
+
+set instruction %B1110101010010000, // D=0
+tick, output, tock, output;
+
+set instruction %B1110001100000001, // D;JGT
+tick, output, tock, output;
+
+set instruction %B1110001100000010, // D;JEQ
+tick, output, tock, output;
+
+set instruction %B1110001100000011, // D;JGE
+tick, output, tock, output;
+
+set instruction %B1110001100000100, // D;JLT
+tick, output, tock, output;
+
+set instruction %B1110001100000101, // D;JNE
+tick, output, tock, output;
+
+set instruction %B1110001100000110, // D;JLE
+tick, output, tock, output;
+
+set instruction %B1110001100000111, // D;JMP
+tick, output, tock, output;
+
+set instruction %B1110111111010000, // D=1
+tick, output, tock, output;
+
+set instruction %B1110001100000001, // D;JGT
+tick, output, tock, output;
+
+set instruction %B1110001100000010, // D;JEQ
+tick, output, tock, output;
+
+set instruction %B1110001100000011, // D;JGE
+tick, output, tock, output;
+
+set instruction %B1110001100000100, // D;JLT
+tick, output, tock, output;
+
+set instruction %B1110001100000101, // D;JNE
+tick, output, tock, output;
+
+set instruction %B1110001100000110, // D;JLE
+tick, output, tock, output;
+
+set instruction %B1110001100000111, // D;JMP
+tick, output, tock, output;
+
+set reset 1;
+tick, output, tock, output;
+
+set instruction %B0111111111111111, // @32767
+set reset 0;
+tick, output, tock, output;
diff --git a/projects/05/CPU.cmp b/projects/05/CPU.cmp new file mode 100644 index 0000000..345674c --- /dev/null +++ b/projects/05/CPU.cmp @@ -0,0 +1,93 @@ +|time| inM | instruction |reset| outM |writeM |addre| pc |DRegiste|
+|0+ | 0|0011000000111001| 0 |*******| 0 | 0| 0| 0 |
+|1 | 0|0011000000111001| 0 |*******| 0 |12345| 1| 0 |
+|1+ | 0|1110110000010000| 0 |*******| 0 |12345| 1| 12345 |
+|2 | 0|1110110000010000| 0 |*******| 0 |12345| 2| 12345 |
+|2+ | 0|0101101110100000| 0 |*******| 0 |12345| 2| 12345 |
+|3 | 0|0101101110100000| 0 |*******| 0 |23456| 3| 12345 |
+|3+ | 0|1110000111010000| 0 |*******| 0 |23456| 3| 11111 |
+|4 | 0|1110000111010000| 0 |*******| 0 |23456| 4| 11111 |
+|4+ | 0|0000001111101000| 0 |*******| 0 |23456| 4| 11111 |
+|5 | 0|0000001111101000| 0 |*******| 0 | 1000| 5| 11111 |
+|5+ | 0|1110001100001000| 0 | 11111| 1 | 1000| 5| 11111 |
+|6 | 0|1110001100001000| 0 | 11111| 1 | 1000| 6| 11111 |
+|6+ | 0|0000001111101001| 0 |*******| 0 | 1000| 6| 11111 |
+|7 | 0|0000001111101001| 0 |*******| 0 | 1001| 7| 11111 |
+|7+ | 0|1110001110011000| 0 | 11110| 1 | 1001| 7| 11110 |
+|8 | 0|1110001110011000| 0 | 11109| 1 | 1001| 8| 11110 |
+|8+ | 0|0000001111101000| 0 |*******| 0 | 1001| 8| 11110 |
+|9 | 0|0000001111101000| 0 |*******| 0 | 1000| 9| 11110 |
+|9+ | 11111|1111010011010000| 0 |*******| 0 | 1000| 9| -1 |
+|10 | 11111|1111010011010000| 0 |*******| 0 | 1000| 10| -1 |
+|10+ | 11111|0000000000001110| 0 |*******| 0 | 1000| 10| -1 |
+|11 | 11111|0000000000001110| 0 |*******| 0 | 14| 11| -1 |
+|11+ | 11111|1110001100000100| 0 |*******| 0 | 14| 11| -1 |
+|12 | 11111|1110001100000100| 0 |*******| 0 | 14| 14| -1 |
+|12+ | 11111|0000001111100111| 0 |*******| 0 | 14| 14| -1 |
+|13 | 11111|0000001111100111| 0 |*******| 0 | 999| 15| -1 |
+|13+ | 11111|1110110111100000| 0 |*******| 0 | 999| 15| -1 |
+|14 | 11111|1110110111100000| 0 |*******| 0 | 1000| 16| -1 |
+|14+ | 11111|1110001100001000| 0 | -1| 1 | 1000| 16| -1 |
+|15 | 11111|1110001100001000| 0 | -1| 1 | 1000| 17| -1 |
+|15+ | 11111|0000000000010101| 0 |*******| 0 | 1000| 17| -1 |
+|16 | 11111|0000000000010101| 0 |*******| 0 | 21| 18| -1 |
+|16+ | 11111|1110011111000010| 0 |*******| 0 | 21| 18| -1 |
+|17 | 11111|1110011111000010| 0 |*******| 0 | 21| 21| -1 |
+|17+ | 11111|0000000000000010| 0 |*******| 0 | 21| 21| -1 |
+|18 | 11111|0000000000000010| 0 |*******| 0 | 2| 22| -1 |
+|18+ | 11111|1110000010010000| 0 |*******| 0 | 2| 22| 1 |
+|19 | 11111|1110000010010000| 0 |*******| 0 | 2| 23| 1 |
+|19+ | 11111|0000001111101000| 0 |*******| 0 | 2| 23| 1 |
+|20 | 11111|0000001111101000| 0 |*******| 0 | 1000| 24| 1 |
+|20+ | 11111|1110111010010000| 0 |*******| 0 | 1000| 24| -1 |
+|21 | 11111|1110111010010000| 0 |*******| 0 | 1000| 25| -1 |
+|21+ | 11111|1110001100000001| 0 |*******| 0 | 1000| 25| -1 |
+|22 | 11111|1110001100000001| 0 |*******| 0 | 1000| 26| -1 |
+|22+ | 11111|1110001100000010| 0 |*******| 0 | 1000| 26| -1 |
+|23 | 11111|1110001100000010| 0 |*******| 0 | 1000| 27| -1 |
+|23+ | 11111|1110001100000011| 0 |*******| 0 | 1000| 27| -1 |
+|24 | 11111|1110001100000011| 0 |*******| 0 | 1000| 28| -1 |
+|24+ | 11111|1110001100000100| 0 |*******| 0 | 1000| 28| -1 |
+|25 | 11111|1110001100000100| 0 |*******| 0 | 1000| 1000| -1 |
+|25+ | 11111|1110001100000101| 0 |*******| 0 | 1000| 1000| -1 |
+|26 | 11111|1110001100000101| 0 |*******| 0 | 1000| 1000| -1 |
+|26+ | 11111|1110001100000110| 0 |*******| 0 | 1000| 1000| -1 |
+|27 | 11111|1110001100000110| 0 |*******| 0 | 1000| 1000| -1 |
+|27+ | 11111|1110001100000111| 0 |*******| 0 | 1000| 1000| -1 |
+|28 | 11111|1110001100000111| 0 |*******| 0 | 1000| 1000| -1 |
+|28+ | 11111|1110101010010000| 0 |*******| 0 | 1000| 1000| 0 |
+|29 | 11111|1110101010010000| 0 |*******| 0 | 1000| 1001| 0 |
+|29+ | 11111|1110001100000001| 0 |*******| 0 | 1000| 1001| 0 |
+|30 | 11111|1110001100000001| 0 |*******| 0 | 1000| 1002| 0 |
+|30+ | 11111|1110001100000010| 0 |*******| 0 | 1000| 1002| 0 |
+|31 | 11111|1110001100000010| 0 |*******| 0 | 1000| 1000| 0 |
+|31+ | 11111|1110001100000011| 0 |*******| 0 | 1000| 1000| 0 |
+|32 | 11111|1110001100000011| 0 |*******| 0 | 1000| 1000| 0 |
+|32+ | 11111|1110001100000100| 0 |*******| 0 | 1000| 1000| 0 |
+|33 | 11111|1110001100000100| 0 |*******| 0 | 1000| 1001| 0 |
+|33+ | 11111|1110001100000101| 0 |*******| 0 | 1000| 1001| 0 |
+|34 | 11111|1110001100000101| 0 |*******| 0 | 1000| 1002| 0 |
+|34+ | 11111|1110001100000110| 0 |*******| 0 | 1000| 1002| 0 |
+|35 | 11111|1110001100000110| 0 |*******| 0 | 1000| 1000| 0 |
+|35+ | 11111|1110001100000111| 0 |*******| 0 | 1000| 1000| 0 |
+|36 | 11111|1110001100000111| 0 |*******| 0 | 1000| 1000| 0 |
+|36+ | 11111|1110111111010000| 0 |*******| 0 | 1000| 1000| 1 |
+|37 | 11111|1110111111010000| 0 |*******| 0 | 1000| 1001| 1 |
+|37+ | 11111|1110001100000001| 0 |*******| 0 | 1000| 1001| 1 |
+|38 | 11111|1110001100000001| 0 |*******| 0 | 1000| 1000| 1 |
+|38+ | 11111|1110001100000010| 0 |*******| 0 | 1000| 1000| 1 |
+|39 | 11111|1110001100000010| 0 |*******| 0 | 1000| 1001| 1 |
+|39+ | 11111|1110001100000011| 0 |*******| 0 | 1000| 1001| 1 |
+|40 | 11111|1110001100000011| 0 |*******| 0 | 1000| 1000| 1 |
+|40+ | 11111|1110001100000100| 0 |*******| 0 | 1000| 1000| 1 |
+|41 | 11111|1110001100000100| 0 |*******| 0 | 1000| 1001| 1 |
+|41+ | 11111|1110001100000101| 0 |*******| 0 | 1000| 1001| 1 |
+|42 | 11111|1110001100000101| 0 |*******| 0 | 1000| 1000| 1 |
+|42+ | 11111|1110001100000110| 0 |*******| 0 | 1000| 1000| 1 |
+|43 | 11111|1110001100000110| 0 |*******| 0 | 1000| 1001| 1 |
+|43+ | 11111|1110001100000111| 0 |*******| 0 | 1000| 1001| 1 |
+|44 | 11111|1110001100000111| 0 |*******| 0 | 1000| 1000| 1 |
+|44+ | 11111|1110001100000111| 1 |*******| 0 | 1000| 1000| 1 |
+|45 | 11111|1110001100000111| 1 |*******| 0 | 1000| 0| 1 |
+|45+ | 11111|0111111111111111| 0 |*******| 0 | 1000| 0| 1 |
+|46 | 11111|0111111111111111| 0 |*******| 0 |32767| 1| 1 |
diff --git a/projects/05/CPU.hdl b/projects/05/CPU.hdl new file mode 100644 index 0000000..7b73ca0 --- /dev/null +++ b/projects/05/CPU.hdl @@ -0,0 +1,43 @@ +// 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/CPU.hdl
+
+/**
+ * The Hack CPU (Central Processing unit), consisting of an ALU,
+ * two registers named A and D, and a program counter named PC.
+ * The CPU is designed to fetch and execute instructions written in
+ * the Hack machine language. In particular, functions as follows:
+ * Executes the inputted instruction according to the Hack machine
+ * language specification. The D and A in the language specification
+ * refer to CPU-resident registers, while M refers to the external
+ * memory location addressed by A, i.e. to Memory[A]. The inM input
+ * holds the value of this location. If the current instruction needs
+ * to write a value to M, the value is placed in outM, the address
+ * of the target location is placed in the addressM output, and the
+ * writeM control bit is asserted. (When writeM==0, any value may
+ * appear in outM). The outM and writeM outputs are combinational:
+ * they are affected instantaneously by the execution of the current
+ * instruction. The addressM and pc outputs are clocked: although they
+ * are affected by the execution of the current instruction, they commit
+ * to their new values only in the next time step. If reset==1 then the
+ * CPU jumps to address 0 (i.e. pc is set to 0 in next time step) rather
+ * than to the address resulting from executing the current instruction.
+ */
+
+CHIP CPU {
+
+ IN inM[16], // M value input (M = contents of RAM[A])
+ instruction[16], // Instruction for execution
+ reset; // Signals whether to re-start the current
+ // program (reset==1) or continue executing
+ // the current program (reset==0).
+
+ OUT outM[16], // M value output
+ writeM, // Write to M?
+ addressM[15], // Address in data memory (of M)
+ pc[15]; // address of next instruction
+
+ PARTS:
+ // Put your code here:
+}
\ No newline at end of file diff --git a/projects/05/CPU.tst b/projects/05/CPU.tst new file mode 100644 index 0000000..98eee1c --- /dev/null +++ b/projects/05/CPU.tst @@ -0,0 +1,150 @@ +// 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/CPU.tst
+
+load CPU.hdl,
+output-file CPU.out,
+compare-to CPU.cmp,
+output-list time%S0.4.0 inM%D0.6.0 instruction%B0.16.0 reset%B2.1.2 outM%D1.6.0 writeM%B3.1.3 addressM%D0.5.0 pc%D0.5.0 DRegister[]%D1.6.1;
+
+
+set instruction %B0011000000111001, // @12345
+tick, output, tock, output;
+
+set instruction %B1110110000010000, // D=A
+tick, output, tock, output;
+
+set instruction %B0101101110100000, // @23456
+tick, output, tock, output;
+
+set instruction %B1110000111010000, // D=A-D
+tick, output, tock, output;
+
+set instruction %B0000001111101000, // @1000
+tick, output, tock, output;
+
+set instruction %B1110001100001000, // M=D
+tick, output, tock, output;
+
+set instruction %B0000001111101001, // @1001
+tick, output, tock, output;
+
+set instruction %B1110001110011000, // MD=D-1
+tick, output, tock, output;
+
+set instruction %B0000001111101000, // @1000
+tick, output, tock, output;
+
+set instruction %B1111010011010000, // D=D-M
+set inM 11111,
+tick, output, tock, output;
+
+set instruction %B0000000000001110, // @14
+tick, output, tock, output;
+
+set instruction %B1110001100000100, // D;jlt
+tick, output, tock, output;
+
+set instruction %B0000001111100111, // @999
+tick, output, tock, output;
+
+set instruction %B1110110111100000, // A=A+1
+tick, output, tock, output;
+
+set instruction %B1110001100001000, // M=D
+tick, output, tock, output;
+
+set instruction %B0000000000010101, // @21
+tick, output, tock, output;
+
+set instruction %B1110011111000010, // D+1;jeq
+tick, output, tock, output;
+
+set instruction %B0000000000000010, // @2
+tick, output, tock, output;
+
+set instruction %B1110000010010000, // D=D+A
+tick, output, tock, output;
+
+set instruction %B0000001111101000, // @1000
+tick, output, tock, output;
+
+set instruction %B1110111010010000, // D=-1
+tick, output, tock, output;
+
+set instruction %B1110001100000001, // D;JGT
+tick, output, tock, output;
+
+set instruction %B1110001100000010, // D;JEQ
+tick, output, tock, output;
+
+set instruction %B1110001100000011, // D;JGE
+tick, output, tock, output;
+
+set instruction %B1110001100000100, // D;JLT
+tick, output, tock, output;
+
+set instruction %B1110001100000101, // D;JNE
+tick, output, tock, output;
+
+set instruction %B1110001100000110, // D;JLE
+tick, output, tock, output;
+
+set instruction %B1110001100000111, // D;JMP
+tick, output, tock, output;
+
+set instruction %B1110101010010000, // D=0
+tick, output, tock, output;
+
+set instruction %B1110001100000001, // D;JGT
+tick, output, tock, output;
+
+set instruction %B1110001100000010, // D;JEQ
+tick, output, tock, output;
+
+set instruction %B1110001100000011, // D;JGE
+tick, output, tock, output;
+
+set instruction %B1110001100000100, // D;JLT
+tick, output, tock, output;
+
+set instruction %B1110001100000101, // D;JNE
+tick, output, tock, output;
+
+set instruction %B1110001100000110, // D;JLE
+tick, output, tock, output;
+
+set instruction %B1110001100000111, // D;JMP
+tick, output, tock, output;
+
+set instruction %B1110111111010000, // D=1
+tick, output, tock, output;
+
+set instruction %B1110001100000001, // D;JGT
+tick, output, tock, output;
+
+set instruction %B1110001100000010, // D;JEQ
+tick, output, tock, output;
+
+set instruction %B1110001100000011, // D;JGE
+tick, output, tock, output;
+
+set instruction %B1110001100000100, // D;JLT
+tick, output, tock, output;
+
+set instruction %B1110001100000101, // D;JNE
+tick, output, tock, output;
+
+set instruction %B1110001100000110, // D;JLE
+tick, output, tock, output;
+
+set instruction %B1110001100000111, // D;JMP
+tick, output, tock, output;
+
+set reset 1;
+tick, output, tock, output;
+
+set instruction %B0111111111111111, // @32767
+set reset 0;
+tick, output, tock, output;
diff --git a/projects/05/Computer.hdl b/projects/05/Computer.hdl new file mode 100644 index 0000000..22f9b48 --- /dev/null +++ b/projects/05/Computer.hdl @@ -0,0 +1,23 @@ +// 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/Computer.hdl
+
+/**
+ * The HACK computer, including CPU, ROM and RAM.
+ * When reset is 0, the program stored in the computer's ROM executes.
+ * When reset is 1, the execution of the program restarts.
+ * Thus, to start a program's execution, reset must be pushed "up" (1)
+ * and "down" (0). From this point onward the user is at the mercy of
+ * the software. In particular, depending on the program's code, the
+ * screen may show some output and the user may be able to interact
+ * with the computer via the keyboard.
+ */
+
+CHIP Computer {
+
+ IN reset;
+
+ PARTS:
+ // Put your code here:
+}
diff --git a/projects/05/ComputerAdd-external.cmp b/projects/05/ComputerAdd-external.cmp new file mode 100644 index 0000000..a3a8eaf --- /dev/null +++ b/projects/05/ComputerAdd-external.cmp @@ -0,0 +1,15 @@ +| time |reset|RAM16K[0]|RAM16K[1]|RAM16K[2]|
+| 0 | 0 | 0 | 0 | 0 |
+| 1 | 0 | 0 | 0 | 0 |
+| 2 | 0 | 0 | 0 | 0 |
+| 3 | 0 | 0 | 0 | 0 |
+| 4 | 0 | 0 | 0 | 0 |
+| 5 | 0 | 0 | 0 | 0 |
+| 6 | 0 | 5 | 0 | 0 |
+| 7 | 1 | 0 | 0 | 0 |
+| 8 | 0 | 0 | 0 | 0 |
+| 9 | 0 | 0 | 0 | 0 |
+| 10 | 0 | 0 | 0 | 0 |
+| 11 | 0 | 0 | 0 | 0 |
+| 12 | 0 | 0 | 0 | 0 |
+| 13 | 0 | 5 | 0 | 0 |
diff --git a/projects/05/ComputerAdd-external.tst b/projects/05/ComputerAdd-external.tst new file mode 100644 index 0000000..09cc1a7 --- /dev/null +++ b/projects/05/ComputerAdd-external.tst @@ -0,0 +1,32 @@ +// 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/ComputerAdd-external.tst
+
+load Computer.hdl,
+output-file ComputerAdd-external.out,
+compare-to ComputerAdd-external.cmp,
+output-list time%S1.4.1 reset%B2.1.2 RAM16K[0]%D1.7.1 RAM16K[1]%D1.7.1 RAM16K[2]%D1.7.1;
+
+// Load a program written in the Hack machine language.
+// The program adds the two constants 2 and 3 and writes the result in RAM[0].
+ROM32K load Add.hack,
+output;
+
+// First run (at the beginning PC=0)
+repeat 6 {
+ tick, tock, output;
+}
+
+// Reset the PC
+set reset 1,
+set RAM16K[0] 0,
+tick, tock, output;
+
+
+// Second run, to check that the PC was reset correctly.
+set reset 0,
+
+repeat 6 {
+ tick, tock, output;
+}
diff --git a/projects/05/ComputerAdd.cmp b/projects/05/ComputerAdd.cmp new file mode 100644 index 0000000..f295464 --- /dev/null +++ b/projects/05/ComputerAdd.cmp @@ -0,0 +1,15 @@ +| time |reset|ARegister|DRegister|PC[]|RAM16K[0]|RAM16K[1]|RAM16K[2]|
+| 0 | 0 | 0 | 0 | 0| 0 | 0 | 0 |
+| 1 | 0 | 2 | 0 | 1| 0 | 0 | 0 |
+| 2 | 0 | 2 | 2 | 2| 0 | 0 | 0 |
+| 3 | 0 | 3 | 2 | 3| 0 | 0 | 0 |
+| 4 | 0 | 3 | 5 | 4| 0 | 0 | 0 |
+| 5 | 0 | 0 | 5 | 5| 0 | 0 | 0 |
+| 6 | 0 | 0 | 5 | 6| 5 | 0 | 0 |
+| 7 | 1 | 0 | 5 | 0| 0 | 0 | 0 |
+| 8 | 0 | 2 | 5 | 1| 0 | 0 | 0 |
+| 9 | 0 | 2 | 2 | 2| 0 | 0 | 0 |
+| 10 | 0 | 3 | 2 | 3| 0 | 0 | 0 |
+| 11 | 0 | 3 | 5 | 4| 0 | 0 | 0 |
+| 12 | 0 | 0 | 5 | 5| 0 | 0 | 0 |
+| 13 | 0 | 0 | 5 | 6| 5 | 0 | 0 |
diff --git a/projects/05/ComputerAdd.tst b/projects/05/ComputerAdd.tst new file mode 100644 index 0000000..27f4411 --- /dev/null +++ b/projects/05/ComputerAdd.tst @@ -0,0 +1,32 @@ +// 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/ComputerAdd.tst
+
+load Computer.hdl,
+output-file ComputerAdd.out,
+compare-to ComputerAdd.cmp,
+output-list time%S1.4.1 reset%B2.1.2 ARegister[0]%D1.7.1 DRegister[0]%D1.7.1 PC[]%D0.4.0 RAM16K[0]%D1.7.1 RAM16K[1]%D1.7.1 RAM16K[2]%D1.7.1;
+
+// Load a program written in the Hack machine language.
+// The program adds the two constants 2 and 3 and writes the result in RAM[0].
+ROM32K load Add.hack,
+output;
+
+// First run (at the beginning PC=0)
+repeat 6 {
+ tick, tock, output;
+}
+
+// Reset the PC
+set reset 1,
+set RAM16K[0] 0,
+tick, tock, output;
+
+
+// Second run, to check that the PC was reset correctly.
+set reset 0,
+
+repeat 6 {
+ tick, tock, output;
+}
diff --git a/projects/05/ComputerMax-external.cmp b/projects/05/ComputerMax-external.cmp new file mode 100644 index 0000000..f864733 --- /dev/null +++ b/projects/05/ComputerMax-external.cmp @@ -0,0 +1,28 @@ +| time |reset|RAM16K[0]|RAM16K[1]|RAM16K[2]|
+| 0 | 0 | 3 | 5 | 0 |
+| 1 | 0 | 3 | 5 | 0 |
+| 2 | 0 | 3 | 5 | 0 |
+| 3 | 0 | 3 | 5 | 0 |
+| 4 | 0 | 3 | 5 | 0 |
+| 5 | 0 | 3 | 5 | 0 |
+| 6 | 0 | 3 | 5 | 0 |
+| 7 | 0 | 3 | 5 | 0 |
+| 8 | 0 | 3 | 5 | 0 |
+| 9 | 0 | 3 | 5 | 0 |
+| 10 | 0 | 3 | 5 | 0 |
+| 11 | 0 | 3 | 5 | 0 |
+| 12 | 0 | 3 | 5 | 5 |
+| 13 | 0 | 3 | 5 | 5 |
+| 14 | 0 | 3 | 5 | 5 |
+| 15 | 1 | 3 | 5 | 5 |
+| 15 | 0 | 23456 | 12345 | 5 |
+| 16 | 0 | 23456 | 12345 | 5 |
+| 17 | 0 | 23456 | 12345 | 5 |
+| 18 | 0 | 23456 | 12345 | 5 |
+| 19 | 0 | 23456 | 12345 | 5 |
+| 20 | 0 | 23456 | 12345 | 5 |
+| 21 | 0 | 23456 | 12345 | 5 |
+| 22 | 0 | 23456 | 12345 | 5 |
+| 23 | 0 | 23456 | 12345 | 5 |
+| 24 | 0 | 23456 | 12345 | 5 |
+| 25 | 0 | 23456 | 12345 | 23456 |
diff --git a/projects/05/ComputerMax-external.tst b/projects/05/ComputerMax-external.tst new file mode 100644 index 0000000..52b6bef --- /dev/null +++ b/projects/05/ComputerMax-external.tst @@ -0,0 +1,38 @@ +// 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/ComputerMax-external.tst
+
+load Computer.hdl,
+output-file ComputerMax-external.out,
+compare-to ComputerMax-external.cmp,
+output-list time%S1.4.1 reset%B2.1.2 RAM16K[0]%D1.7.1 RAM16K[1]%D1.7.1 RAM16K[2]%D1.7.1;
+
+// Load a program written in the Hack machine language.
+// The program computes the maximum of RAM[0] and RAM[1]
+// and writes the result in RAM[2].
+ROM32K load Max.hack,
+
+// first run: compute max(3,5)
+set RAM16K[0] 3,
+set RAM16K[1] 5,
+output;
+
+repeat 14 {
+ tick, tock, output;
+}
+
+// reset the PC
+set reset 1,
+tick, tock, output;
+
+// second run: compute max(23456,12345)
+set reset 0,
+set RAM16K[0] 23456,
+set RAM16K[1] 12345,
+output;
+
+// The run on these inputs needs less cycles (different branching)
+repeat 10 {
+ tick, tock, output;
+}
diff --git a/projects/05/ComputerMax.cmp b/projects/05/ComputerMax.cmp new file mode 100644 index 0000000..42276cd --- /dev/null +++ b/projects/05/ComputerMax.cmp @@ -0,0 +1,28 @@ +| time |reset|ARegister|DRegister|PC[]|RAM16K[0]|RAM16K[1]|RAM16K[2]|
+| 0 | 0 | 0 | 0 | 0| 3 | 5 | 0 |
+| 1 | 0 | 0 | 0 | 1| 3 | 5 | 0 |
+| 2 | 0 | 0 | 3 | 2| 3 | 5 | 0 |
+| 3 | 0 | 1 | 3 | 3| 3 | 5 | 0 |
+| 4 | 0 | 1 | -2 | 4| 3 | 5 | 0 |
+| 5 | 0 | 10 | -2 | 5| 3 | 5 | 0 |
+| 6 | 0 | 10 | -2 | 6| 3 | 5 | 0 |
+| 7 | 0 | 1 | -2 | 7| 3 | 5 | 0 |
+| 8 | 0 | 1 | 5 | 8| 3 | 5 | 0 |
+| 9 | 0 | 12 | 5 | 9| 3 | 5 | 0 |
+| 10 | 0 | 12 | 5 | 12| 3 | 5 | 0 |
+| 11 | 0 | 2 | 5 | 13| 3 | 5 | 0 |
+| 12 | 0 | 2 | 5 | 14| 3 | 5 | 5 |
+| 13 | 0 | 14 | 5 | 15| 3 | 5 | 5 |
+| 14 | 0 | 14 | 5 | 14| 3 | 5 | 5 |
+| 15 | 1 | 14 | 5 | 0| 3 | 5 | 5 |
+| 15 | 0 | 14 | 5 | 0| 23456 | 12345 | 5 |
+| 16 | 0 | 0 | 5 | 1| 23456 | 12345 | 5 |
+| 17 | 0 | 0 | 23456 | 2| 23456 | 12345 | 5 |
+| 18 | 0 | 1 | 23456 | 3| 23456 | 12345 | 5 |
+| 19 | 0 | 1 | 11111 | 4| 23456 | 12345 | 5 |
+| 20 | 0 | 10 | 11111 | 5| 23456 | 12345 | 5 |
+| 21 | 0 | 10 | 11111 | 10| 23456 | 12345 | 5 |
+| 22 | 0 | 0 | 11111 | 11| 23456 | 12345 | 5 |
+| 23 | 0 | 0 | 23456 | 12| 23456 | 12345 | 5 |
+| 24 | 0 | 2 | 23456 | 13| 23456 | 12345 | 5 |
+| 25 | 0 | 2 | 23456 | 14| 23456 | 12345 | 23456 |
diff --git a/projects/05/ComputerMax.tst b/projects/05/ComputerMax.tst new file mode 100644 index 0000000..e090754 --- /dev/null +++ b/projects/05/ComputerMax.tst @@ -0,0 +1,39 @@ +// 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/ComputerMax.tst
+
+load Computer.hdl,
+output-file ComputerMax.out,
+compare-to ComputerMax.cmp,
+output-list time%S1.4.1 reset%B2.1.2 ARegister[]%D1.7.1 DRegister[]%D1.7.1 PC[]%D0.4.0 RAM16K[0]%D1.7.1 RAM16K[1]%D1.7.1 RAM16K[2]%D1.7.1;
+
+// Load a program written in the Hack machine language.
+// The program computes the maximum of RAM[0] and RAM[1]
+// and writes the result in RAM[2].
+
+ROM32K load Max.hack,
+
+// first run: compute max(3,5)
+set RAM16K[0] 3,
+set RAM16K[1] 5,
+output;
+
+repeat 14 {
+ tick, tock, output;
+}
+
+// reset the PC
+set reset 1,
+tick, tock, output;
+
+// second run: compute max(23456,12345)
+set reset 0,
+set RAM16K[0] 23456,
+set RAM16K[1] 12345,
+output;
+
+// The run on these inputs needs less cycles (different branching)
+repeat 10 {
+ tick, tock, output;
+}
diff --git a/projects/05/ComputerRect-external.cmp b/projects/05/ComputerRect-external.cmp new file mode 100644 index 0000000..f276922 --- /dev/null +++ b/projects/05/ComputerRect-external.cmp @@ -0,0 +1,65 @@ +| time |
+| 0 |
+| 1 |
+| 2 |
+| 3 |
+| 4 |
+| 5 |
+| 6 |
+| 7 |
+| 8 |
+| 9 |
+| 10 |
+| 11 |
+| 12 |
+| 13 |
+| 14 |
+| 15 |
+| 16 |
+| 17 |
+| 18 |
+| 19 |
+| 20 |
+| 21 |
+| 22 |
+| 23 |
+| 24 |
+| 25 |
+| 26 |
+| 27 |
+| 28 |
+| 29 |
+| 30 |
+| 31 |
+| 32 |
+| 33 |
+| 34 |
+| 35 |
+| 36 |
+| 37 |
+| 38 |
+| 39 |
+| 40 |
+| 41 |
+| 42 |
+| 43 |
+| 44 |
+| 45 |
+| 46 |
+| 47 |
+| 48 |
+| 49 |
+| 50 |
+| 51 |
+| 52 |
+| 53 |
+| 54 |
+| 55 |
+| 56 |
+| 57 |
+| 58 |
+| 59 |
+| 60 |
+| 61 |
+| 62 |
+| 63 |
diff --git a/projects/05/ComputerRect-external.tst b/projects/05/ComputerRect-external.tst new file mode 100644 index 0000000..f9102f7 --- /dev/null +++ b/projects/05/ComputerRect-external.tst @@ -0,0 +1,26 @@ +// 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/ComputerRect-external.tst
+
+load Computer.hdl,
+output-file ComputerRect-external.out,
+compare-to ComputerRect-external.cmp,
+output-list time%S1.4.1;
+
+// Load a program written in the Hack machine language.
+// The program draws a rectangle of width 16 pixels and
+// length RAM[0] at the top left of the screen.
+ROM32K load Rect.hack,
+
+echo "Before you run this script, select the 'Screen' option from the 'View' menu";
+
+echo "A small rectangle should be drawn at the top left of the screen (the 'Screen' option of the 'View' menu should be selected.)";
+
+// draw a rectangle 16 pixels wide and 4 pixels long
+set RAM16K[0] 4,
+output;
+
+repeat 63 {
+ tick, tock, output;
+}
diff --git a/projects/05/ComputerRect.cmp b/projects/05/ComputerRect.cmp new file mode 100644 index 0000000..a6b5cc9 --- /dev/null +++ b/projects/05/ComputerRect.cmp @@ -0,0 +1,65 @@ +| time |ARegister|DRegister|PC[]|RAM16K[0]|RAM16K[1]|RAM16K[2]|
+| 0 | 0 | 0 | 0| 4 | 0 | 0 |
+| 1 | 0 | 0 | 1| 4 | 0 | 0 |
+| 2 | 0 | 4 | 2| 4 | 0 | 0 |
+| 3 | 23 | 4 | 3| 4 | 0 | 0 |
+| 4 | 23 | 4 | 4| 4 | 0 | 0 |
+| 5 | 16 | 4 | 5| 4 | 0 | 0 |
+| 6 | 16 | 4 | 6| 4 | 0 | 0 |
+| 7 | 16384 | 4 | 7| 4 | 0 | 0 |
+| 8 | 16384 | 16384 | 8| 4 | 0 | 0 |
+| 9 | 17 | 16384 | 9| 4 | 0 | 0 |
+| 10 | 17 | 16384 | 10| 4 | 0 | 0 |
+| 11 | 17 | 16384 | 11| 4 | 0 | 0 |
+| 12 | 16384 | 16384 | 12| 4 | 0 | 0 |
+| 13 | 16384 | 16384 | 13| 4 | 0 | 0 |
+| 14 | 17 | 16384 | 14| 4 | 0 | 0 |
+| 15 | 17 | 16384 | 15| 4 | 0 | 0 |
+| 16 | 32 | 16384 | 16| 4 | 0 | 0 |
+| 17 | 32 | 16416 | 17| 4 | 0 | 0 |
+| 18 | 17 | 16416 | 18| 4 | 0 | 0 |
+| 19 | 17 | 16416 | 19| 4 | 0 | 0 |
+| 20 | 16 | 16416 | 20| 4 | 0 | 0 |
+| 21 | 16 | 3 | 21| 4 | 0 | 0 |
+| 22 | 10 | 3 | 22| 4 | 0 | 0 |
+| 23 | 10 | 3 | 10| 4 | 0 | 0 |
+| 24 | 17 | 3 | 11| 4 | 0 | 0 |
+| 25 | 16416 | 3 | 12| 4 | 0 | 0 |
+| 26 | 16416 | 3 | 13| 4 | 0 | 0 |
+| 27 | 17 | 3 | 14| 4 | 0 | 0 |
+| 28 | 17 | 16416 | 15| 4 | 0 | 0 |
+| 29 | 32 | 16416 | 16| 4 | 0 | 0 |
+| 30 | 32 | 16448 | 17| 4 | 0 | 0 |
+| 31 | 17 | 16448 | 18| 4 | 0 | 0 |
+| 32 | 17 | 16448 | 19| 4 | 0 | 0 |
+| 33 | 16 | 16448 | 20| 4 | 0 | 0 |
+| 34 | 16 | 2 | 21| 4 | 0 | 0 |
+| 35 | 10 | 2 | 22| 4 | 0 | 0 |
+| 36 | 10 | 2 | 10| 4 | 0 | 0 |
+| 37 | 17 | 2 | 11| 4 | 0 | 0 |
+| 38 | 16448 | 2 | 12| 4 | 0 | 0 |
+| 39 | 16448 | 2 | 13| 4 | 0 | 0 |
+| 40 | 17 | 2 | 14| 4 | 0 | 0 |
+| 41 | 17 | 16448 | 15| 4 | 0 | 0 |
+| 42 | 32 | 16448 | 16| 4 | 0 | 0 |
+| 43 | 32 | 16480 | 17| 4 | 0 | 0 |
+| 44 | 17 | 16480 | 18| 4 | 0 | 0 |
+| 45 | 17 | 16480 | 19| 4 | 0 | 0 |
+| 46 | 16 | 16480 | 20| 4 | 0 | 0 |
+| 47 | 16 | 1 | 21| 4 | 0 | 0 |
+| 48 | 10 | 1 | 22| 4 | 0 | 0 |
+| 49 | 10 | 1 | 10| 4 | 0 | 0 |
+| 50 | 17 | 1 | 11| 4 | 0 | 0 |
+| 51 | 16480 | 1 | 12| 4 | 0 | 0 |
+| 52 | 16480 | 1 | 13| 4 | 0 | 0 |
+| 53 | 17 | 1 | 14| 4 | 0 | 0 |
+| 54 | 17 | 16480 | 15| 4 | 0 | 0 |
+| 55 | 32 | 16480 | 16| 4 | 0 | 0 |
+| 56 | 32 | 16512 | 17| 4 | 0 | 0 |
+| 57 | 17 | 16512 | 18| 4 | 0 | 0 |
+| 58 | 17 | 16512 | 19| 4 | 0 | 0 |
+| 59 | 16 | 16512 | 20| 4 | 0 | 0 |
+| 60 | 16 | 0 | 21| 4 | 0 | 0 |
+| 61 | 10 | 0 | 22| 4 | 0 | 0 |
+| 62 | 10 | 0 | 23| 4 | 0 | 0 |
+| 63 | 23 | 0 | 24| 4 | 0 | 0 |
diff --git a/projects/05/ComputerRect.tst b/projects/05/ComputerRect.tst new file mode 100644 index 0000000..b1e2126 --- /dev/null +++ b/projects/05/ComputerRect.tst @@ -0,0 +1,26 @@ +// 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/ComputerRect.tst
+
+load Computer.hdl,
+output-file ComputerRect.out,
+compare-to ComputerRect.cmp,
+output-list time%S1.4.1 ARegister[]%D1.7.1 DRegister[]%D1.7.1 PC[]%D0.4.0 RAM16K[0]%D1.7.1 RAM16K[1]%D1.7.1 RAM16K[2]%D1.7.1;
+
+// Load a program written in the Hack machine language.
+// The program draws a rectangle of width 16 pixels and
+// length RAM[0] at the top left of the screen.
+ROM32K load Rect.hack,
+
+echo "Before you run this script, select the 'Screen' option from the 'View' menu";
+
+echo "A small rectangle should be drawn at the top left of the screen (the 'Screen' option of the 'View' menu should be selected.)";
+
+// Draws a rectangle 16 pixels wide and 4 pixels long
+set RAM16K[0] 4,
+output;
+
+repeat 63 {
+ tick, tock, output;
+}
diff --git a/projects/05/Max.hack b/projects/05/Max.hack new file mode 100644 index 0000000..2e04a8d --- /dev/null +++ b/projects/05/Max.hack @@ -0,0 +1,16 @@ +0000000000000000
+1111110000010000
+0000000000000001
+1111010011010000
+0000000000001010
+1110001100000001
+0000000000000001
+1111110000010000
+0000000000001100
+1110101010000111
+0000000000000000
+1111110000010000
+0000000000000010
+1110001100001000
+0000000000001110
+1110101010000111
diff --git a/projects/05/Memory.cmp b/projects/05/Memory.cmp new file mode 100644 index 0000000..613d171 --- /dev/null +++ b/projects/05/Memory.cmp @@ -0,0 +1,54 @@ +| in |load | address | out |
+| -1 | 1 | 000000000000000 | 0 |
+| -1 | 1 | 000000000000000 | -1 |
+| 9999 | 0 | 000000000000000 | -1 |
+| 9999 | 0 | 000000000000000 | -1 |
+| 9999 | 0 | 010000000000000 | 0 |
+| 9999 | 0 | 100000000000000 | 0 |
+| 2222 | 1 | 010000000000000 | 0 |
+| 2222 | 1 | 010000000000000 | 2222 |
+| 9999 | 0 | 010000000000000 | 2222 |
+| 9999 | 0 | 010000000000000 | 2222 |
+| 9999 | 0 | 000000000000000 | -1 |
+| 9999 | 0 | 100000000000000 | 0 |
+| 9999 | 0 | 000000000000001 | 0 |
+| 9999 | 0 | 000000000000010 | 0 |
+| 9999 | 0 | 000000000000100 | 0 |
+| 9999 | 0 | 000000000001000 | 0 |
+| 9999 | 0 | 000000000010000 | 0 |
+| 9999 | 0 | 000000000100000 | 0 |
+| 9999 | 0 | 000000001000000 | 0 |
+| 9999 | 0 | 000000010000000 | 0 |
+| 9999 | 0 | 000000100000000 | 0 |
+| 9999 | 0 | 000001000000000 | 0 |
+| 9999 | 0 | 000010000000000 | 0 |
+| 9999 | 0 | 000100000000000 | 0 |
+| 9999 | 0 | 001000000000000 | 0 |
+| 9999 | 0 | 010000000000000 | 2222 |
+| 1234 | 1 | 001001000110100 | 0 |
+| 1234 | 1 | 001001000110100 | 1234 |
+| 1234 | 0 | 010001000110100 | 0 |
+| 1234 | 0 | 110001000110100 | 0 |
+| 2345 | 1 | 010001101000101 | 0 |
+| 2345 | 1 | 010001101000101 | 2345 |
+| 2345 | 0 | 000001101000101 | 0 |
+| 2345 | 0 | 100001101000101 | 0 |
+| 2345 | 0 | 110000000000000 | 75 |
+| -1 | 1 | 100111111001111 | -1 |
+| -1 | 1 | 101000001001111 | -1 |
+| -1 | 1 | 000111111001111 | 0 |
+| -1 | 1 | 010111111001111 | 0 |
+| -1 | 0 | 100111111001110 | 0 |
+| -1 | 0 | 100111111001101 | 0 |
+| -1 | 0 | 100111111001011 | 0 |
+| -1 | 0 | 100111111000111 | 0 |
+| -1 | 0 | 100111111011111 | 0 |
+| -1 | 0 | 100111111101111 | 0 |
+| -1 | 0 | 100111110001111 | 0 |
+| -1 | 0 | 100111101001111 | 0 |
+| -1 | 0 | 100111011001111 | 0 |
+| -1 | 0 | 100110111001111 | 0 |
+| -1 | 0 | 100101111001111 | 0 |
+| -1 | 0 | 100011111001111 | 0 |
+| -1 | 0 | 101111111001111 | 0 |
+| -1 | 0 | 110000000000000 | 89 |
diff --git a/projects/05/Memory.hdl b/projects/05/Memory.hdl new file mode 100644 index 0000000..62a4fd2 --- /dev/null +++ b/projects/05/Memory.hdl @@ -0,0 +1,31 @@ +// 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.hdl
+
+/**
+ * The complete address space of the Hack computer's memory,
+ * including RAM and memory-mapped I/O.
+ * The chip facilitates read and write operations, as follows:
+ * Read: out(t) = Memory[address(t)](t)
+ * Write: if load(t-1) then Memory[address(t-1)](t) = in(t-1)
+ * In words: the chip always outputs the value stored at the memory
+ * location specified by address. If load==1, the in value is loaded
+ * into the memory location specified by address. This value becomes
+ * available through the out output from the next time step onward.
+ * Address space rules:
+ * Only the upper 16K+8K+1 words of the Memory chip are used.
+ * Access to address>0x6000 is invalid. Access to any address in
+ * the range 0x4000-0x5FFF results in accessing the screen memory
+ * map. Access to address 0x6000 results in accessing the keyboard
+ * memory map. The behavior in these addresses is described in the
+ * Screen and Keyboard chip specifications given in the book.
+ */
+
+CHIP Memory {
+ IN in[16], load, address[15];
+ OUT out[16];
+
+ PARTS:
+ // Put your code here:
+}
\ No newline at end of file diff --git a/projects/05/Memory.tst b/projects/05/Memory.tst new file mode 100644 index 0000000..f712a48 --- /dev/null +++ b/projects/05/Memory.tst @@ -0,0 +1,163 @@ +// 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";
+
+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 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;
+
+// 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 {
+ eval,
+}
+
+clear-echo,
+output;
+
+// Screen test
+
+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 {
+ eval,
+}
+
+clear-echo,
+output;
diff --git a/projects/05/Rect.hack b/projects/05/Rect.hack new file mode 100644 index 0000000..ee017ab --- /dev/null +++ b/projects/05/Rect.hack @@ -0,0 +1,25 @@ +0000000000000000
+1111110000010000
+0000000000010111
+1110001100000110
+0000000000010000
+1110001100001000
+0100000000000000
+1110110000010000
+0000000000010001
+1110001100001000
+0000000000010001
+1111110000100000
+1110111010001000
+0000000000010001
+1111110000010000
+0000000000100000
+1110000010010000
+0000000000010001
+1110001100001000
+0000000000010000
+1111110010011000
+0000000000001010
+1110001100000001
+0000000000010111
+1110101010000111
|