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

@@ -1,68 +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.
(LOOP) // Abfrage des KBD-Speichers
@KBD //Adresse Keyboardspeicher
D=M //Datenregister = Speicheradresse
@KPRESSED
D;JGT
@NOKPRESSED
0;JMP
(KPRESSED) // Taste wurde/wird gedrückt
@R0
M=-1 // 11111111111111111 --> black Pixel
@ONSCREEN
0;JMP
(NOKPRESSED) // keine Taste gedrückt
@R0
M=0 // wieder auf 0 gesetzt
@ONSCREEN
0;JMP
(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
D=M
@counter
D=M
M=D+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
// 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