Project 04, leider war Fill nicht meins

This commit is contained in:
Sven Riwoldt
2023-04-02 20:53:40 +02:00
parent 87fc2ea2d7
commit ede7e378ba
5 changed files with 197 additions and 68 deletions

View File

@@ -0,0 +1,78 @@
// 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 // 32*256 --> 32 16er pro Zeile
D=A
@ENDPOS // in @16
M=D
(LOOP)
@SCREEN //Screen-Einstiegsadresse
D=A
@ScreenStart //@SCREEN 16384 --> @17
M=D
@i //Zähler = 0 18
M=0
@KBD //24576
D=M //Tastatureingabe ?
@WEISS
D; JEQ //WEISS WENN D == 0
@SCHWARZ //SPRINGE ZU SCHWARZ
D; JNE //WENN NICHT 0
(SCHWARZ)
@ENDPOS
D=M
@i
D=D-M //ENDPOS -1 = 0 ? DANN ZU LOOP
@LOOP
D;JEQ
@ScreenStart
A=M
M=-1 //SETZE -1 == SCHWARZ
@i
M=M+1 //i++
@ScreenStart
M=M+1
@SCHWARZ
0;JMP
(WEISS)
@ENDPOS
D=M
@i
D=D-M //ENDPOS -1 = 0 ? DANN ZU LOOP
@LOOP
D;JEQ
@ScreenStart
A=M
M=0 //SETZE 0 == WEISS
@i
M=M+1 //i++
@ScreenStart
M=M+1
@WEISS
0;JMP

View File

@@ -0,0 +1,41 @@
// 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.
@R2 //Ergebnisspeicher
M=0 //init
@R1 //R1 dieser Wert dient als Schleifencounter
D=M //Inhalt nach M
@i //Zähler
M=D //i bekommt R1-Wert
@END
D;JEQ
(LOOP)
@R0 //R0 ansprechen
D=M //Wert aus R0 in Datenspeicher
@R2 //Ergebnisspeicher
M=D+M //Ergebnisspeicher = Datenspeicher + Ergebnisspeicher
@i //Zähler
D=M //D=Zähler
D=D-1 //D-1
M=D //Zurückschreiben in Zähler
@LOOP //LOOP
D;JGT //D GRÖSSER
(END) //END LOOP
@END
0;JMP

Binary file not shown.

BIN
projects/04/fill/Archiv.zip Normal file

Binary file not shown.

View File

@@ -1,68 +1,78 @@
// This file is part of www.nand2tetris.org // This file is part of www.nand2tetris.org
// and the book "The Elements of Computing Systems" // and the book "The Elements of Computing Systems"
// by Nisan and Schocken, MIT Press. // by Nisan and Schocken, MIT Press.
// File name: projects/04/Fill.asm // File name: projects/04/Fill.asm
// Runs an infinite loop that listens to the keyboard input. // Runs an infinite loop that listens to the keyboard input.
// When a key is pressed (any key), the program blackens the screen, // When a key is pressed (any key), the program blackens the screen,
// i.e. writes "black" in every pixel; // i.e. writes "black" in every pixel;
// the screen should remain fully black as long as the key is pressed. // 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 // When no key is pressed, the program clears the screen, i.e. writes
// "white" in every pixel; // "white" in every pixel;
// the screen should remain fully clear as long as no key is pressed. // the screen should remain fully clear as long as no key is pressed.
// Put your code here. // Put your code here.
(LOOP) // Abfrage des KBD-Speichers @8192 // 32*256 --> 32 16er pro Zeile
@KBD //Adresse Keyboardspeicher D=A
D=M //Datenregister = Speicheradresse @ENDPOS // in @16
M=D
@KPRESSED
D;JGT (LOOP)
@SCREEN //Screen-Einstiegsadresse
@NOKPRESSED D=A
0;JMP @ScreenStart // @SCREEN 16384 --> @17
M=D
(KPRESSED) // Taste wurde/wird gedrückt
@R0 @i // Zähler = 0 18
M=-1 // 11111111111111111 --> black Pixel M=0
@ONSCREEN
0;JMP @KBD //24576
D=M // Tastatureingabe ?
(NOKPRESSED) // keine Taste gedrückt
@R0 @WEISS
M=0 // wieder auf 0 gesetzt D; JEQ // WEISS WENN D == 0
@ONSCREEN @SCHWARZ // SPRINGE ZU SCHWARZ
0;JMP D; JNE // WENN NICHT 0
(ONSCREEN) (SCHWARZ)
// erste Zeile von 16384 bis 16415 => 32 @ENDPOS
// 31 * 256 D=M
// letztes Byte --> 8192 --> 16384 + 8192 somit 8191 @i
@8191 // Eingabe eines konstanten Wertes D=D-M // ENDPOS -1 = 0 ? DANN ZU LOOP
D=A // A= 8191, Übergabe an D @LOOP
@R1 D;JEQ
M=D // R1 = 8191
//https://github.com/Olical/nand2tetris/blob/master/asm/fill/Fill.asm @ScreenStart
(PRINT) A=M
M=-1 // SETZE -1 == SCHWARZ
@SCREEN
D=M @i
@counter M=M+1 // i++
D=M
@ScreenStart
M=D+1 M=M+1
@SCHWARZ
0;JMP
(WEISS)
@ENDPOS
//Schleife, setze ein Register auf 0, dann addiere das zum @SCREEN. Setze die entstandene Adresse auf -1. Nun vergleiche den Zähler mit R1, wenn ungleich dann erhöhe um 1 und durchlaufe die Schleife abermals. D=M
@i
@ONSCREEN D=D-M // ENDPOS -1 = 0 ? DANN ZU LOOP
@LOOP
D;JEQ
@LOOP @ScreenStart
0;JMP A=M
M=0 // SETZE 0 == WEISS
@i
M=M+1 // i++
@ScreenStart
M=M+1
@WEISS
0;JMP