Skip to content

Commit

Permalink
Completed the Familiarization with Hack Computer assembly language by…
Browse files Browse the repository at this point in the history
… writing two program i.e. multiplier program and a program to show screen black when key is pressed on keyboard(white screen otherwise)
  • Loading branch information
acharyaSabin11 committed Jun 9, 2023
1 parent 35cb5c8 commit 6f875f6
Show file tree
Hide file tree
Showing 9 changed files with 274 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
// 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.

//NOTE: For this program to work, we need to access the R1 register in ram that must store the value 8192


//Defining an infinite loop that looks for keyboard input throughout the program
(INFINITE)
//Initializing counter to zero
@R1
D=M
@R0
M=D
@counter
M=0
@KBD
D=M;
@LOOPINITBLACK
D;JGT
@LOOPINITWHITE
0;JMP

(LOOPINITBLACK)
@SCREEN //loading screen address
D=A;
@counter //setting counter to screen address
M=D;

(LOOPBLACK)
@counter
D=M; //loading address of current memory location of screen
A=D; //loading that address into address register
M=-1 //putting content of that memory to -1 which corresponds to 1111111111111111
@counter
M=M+1
@R0
D=M-1
M=D
@LOOPBLACK
D;JGT
@INFINITE
0;JMP

(LOOPINITWHITE)
@SCREEN //loading screen address
D=A;
@counter //setting counter to screen address
M=D;

(LOOPWHITE)
@counter
D=M; //loading address of current memory location of screen
A=D; //loading that address into address register
M=0 //putting content of that memory to -1 which corresponds to 1111111111111111
@counter
M=M+1
@R0
D=M-1
M=D
@LOOPWHITE
D;JGT
@INFINITE
0;JMP

Original file line number Diff line number Diff line change
@@ -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;
}
Original file line number Diff line number Diff line change
@@ -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 |
Original file line number Diff line number Diff line change
@@ -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 |
Original file line number Diff line number Diff line change
@@ -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

Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
// 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.

//Initializing sum variable to zero.(Initialization to zero may be optional but i prefer to add it)
@sum
M=0

//Jumping to end if the difference of the register R1 and counter is less than or equal to zero.
//looping for addition
(LOOP)
@R1
D=M
//if Decremented counter = 0;
@END
D;JEQ


//loading register R0 From RAM
@R0
D=M
//summing
@sum
M=D + M
//decrementing counter
@R1
M=M-1
//unconditional jump
@LOOP
0;JMP


//End: infinite loop after saving data to R2 in RAM

(END)
//putting the sum to register R2 in RAM
@sum
D=M
@R2
M=D
//Ending the process via infinite loop
(INFINITE)
@INFINITE
0;JMP

Original file line number Diff line number Diff line change
@@ -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 |
Original file line number Diff line number Diff line change
@@ -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 |
Original file line number Diff line number Diff line change
@@ -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;

0 comments on commit 6f875f6

Please sign in to comment.