Remove 2 instructions in BLACK_SCREEN
x1phosura x1phosura@x1phosura.zone
Fri, 17 Dec 2021 15:18:30 -0800
1 files changed,
72 insertions(+),
74 deletions(-)
jump to
M
projects/04/fill/Fill.asm
→
projects/04/fill/Fill.asm
@@ -1,74 +1,72 @@
-// 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. - -// TODO: optimize better in the future - -(SET_SCREEN_PTR) - // R0 = SCREEN pointer - @SCREEN - D=A - @R0 - M=D - -// TODO: fix infinitely incrementing screen pointer bug -// end of screen: 0x5fff (dec 24575) - -(IS_KEYPRESSED) - // if R0 == 24575; goto SET_SCREEN_PTR - @R0 - D=M - @24575 - D=D-A - @SET_SCREEN_PTR - D;JEQ - - // D=KBD, goto WHITE_SCREEN if D == 0 - @KBD - D=M - @WHITE_SCREEN - D;JEQ - -(BLACK_SCREEN) - // *R0 = -1 - @R0 - A=M - M=-1 - - // ++R0 - @R0 - M=M+1 - - @IS_KEYPRESSED - 0;JMP - // TODO: replace with D;JLT or something - -(WHITE_SCREEN) - // *R0 = 0 - @R0 - A=M - M=0 - - // ++R0 - @R0 - M=M+1 - - @IS_KEYPRESSED - 0;JMP - // TODO: replace with D;JLT or something - -(END) - @END - 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. + +// TODO: optimize better in the future + +// have separate branch _only_ for drawing black/white pixels + +(SET_SCREEN_PTR) + // R0 = SCREEN pointer + @SCREEN + D=A + @R0 + M=D + +// TODO: fix infinitely incrementing screen pointer bug +// end of screen: 0x5fff (dec 24575) + +(IS_KEYPRESSED) + // if R0 == 24575; goto SET_SCREEN_PTR + @R0 + D=M + @24575 + D=D-A + @SET_SCREEN_PTR + D;JEQ + + // D=KBD, goto WHITE_SCREEN if D == 0 + @KBD + D=M + @WHITE_SCREEN + D;JEQ + +(BLACK_SCREEN) + // *R0 = -1 + @R0 + A=M + M=-1 + + @INC_SCR_PTR_AND_LOOP + 0;JMP + +(WHITE_SCREEN) + // *R0 = 0 + @R0 + A=M + M=0 + +(INC_SCR_PTR_AND_LOOP) + // ++R0 + @R0 + M=M+1 + + @IS_KEYPRESSED + 0;JMP + +// should never reach here, but just in case... +(END) + @END + 0;JMP +