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

@@ -13,56 +13,66 @@
// Put your code here.
(LOOP) // Abfrage des KBD-Speichers
@KBD //Adresse Keyboardspeicher
D=M //Datenregister = Speicheradresse
@8192 // 32*256 --> 32 16er pro Zeile
D=A
@ENDPOS // in @16
M=D
@KPRESSED
D;JGT
(LOOP)
@SCREEN //Screen-Einstiegsadresse
D=A
@ScreenStart // @SCREEN 16384 --> @17
M=D
@NOKPRESSED
0;JMP
@i // Zähler = 0 18
M=0
(KPRESSED) // Taste wurde/wird gedrückt
@R0
M=-1 // 11111111111111111 --> black Pixel
@ONSCREEN
0;JMP
@KBD //24576
D=M // Tastatureingabe ?
(NOKPRESSED) // keine Taste gedrückt
@R0
M=0 // wieder auf 0 gesetzt
@ONSCREEN
0;JMP
@WEISS
D; JEQ // WEISS WENN D == 0
@SCHWARZ // SPRINGE ZU SCHWARZ
D; JNE // WENN NICHT 0
(ONSCREEN)
// erste Zeile von 16384 bis 16415 => 32
// 31 * 256
// letztes Byte --> 8192 --> 16384 + 8192 somit 8191
@8191 // Eingabe eines konstanten Wertes
D=A // A= 8191, Übergabe an D
@R1
M=D // R1 = 8191
//https://github.com/Olical/nand2tetris/blob/master/asm/fill/Fill.asm
(PRINT)
@SCREEN
(SCHWARZ)
@ENDPOS
D=M
@counter
@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
M=D+1
@ScreenStart
A=M
M=0 // SETZE 0 == WEISS
@i
M=M+1 // i++
@ScreenStart
M=M+1
//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.
@ONSCREEN
@LOOP
0;JMP
@WEISS
0;JMP