projects/04/fill/Fill.asm
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 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.
// Fill: for length of screen, checks keypress. If keypress is nonzero, set
// current 16 pixels to black, otherwise set them to white. Point to next 16
// pixels and repeat to enf of screen, then restart at start of screen.
//
// R0 - current screen pointer (to-be incremented until end of screen is hit)
(SET_SCREEN_PTR)
// R0 = SCREEN pointer
@SCREEN
D=A
@R0
M=D
(IS_KEYPRESSED)
// end of screen: 0x5fff (dec 24575)
// 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
|