From e85ff274251e123247038dbaa52a24980026d225 Mon Sep 17 00:00:00 2001 From: Nemo Date: Thu, 28 May 2020 16:45:38 +0530 Subject: [PATCH] [04/fill] Done with Automated screen fill Updated NOTES --- NOTES.md | 30 ++++ projects/04/fill/Fill.asm | 123 ++++++++++---- projects/04/fill/Fill.hack | 258 +++++++++-------------------- projects/04/fill/FillAutomatic.out | 3 +- 4 files changed, 204 insertions(+), 210 deletions(-) diff --git a/NOTES.md b/NOTES.md index cbcb8fc..c3d9eb6 100644 --- a/NOTES.md +++ b/NOTES.md @@ -8,3 +8,33 @@ RAM64 RAM512 : I used the premise of the previous note and decided to index the RAM64 moduls by the LSB instead of the customary MSB. It still works :metal: + +Fill.asm +: Figured out that my RAM16K implementation was wrong while working on this. The rough pseudocode would be: + ```c + int r0=*screen; + while(true) { + int color = 0; + if (*kbd > 0) { + color = -1; + } + + // This sets an entire row of pixels to color + // each row has 32 registers (512/16) that we set to color + *r0 = color; + *r0+1 = color; + *r0+2 = color; + *r0+3 = color; + *r0+4 = color; + // and so on + *r0+31 = color; + + // if we are on the last row + if (r0-24575 <=0) { + r0 = *screen; + } + } + + ``` + So every "cycle" of the loop, we are coloring an entire row. The row is decided by R0, which is set to @SCREEN at the start. So if you press a key while we are on the middle of the loop (say 120th row), everything from that row onwards would get painted in black, and then the loop resets r0=*screen once we cross the limits. The next iteration of the loop then starts filling the white pixels we'd left in the previous iteration. I kept the smallest paint unit as the row, but it doesn't really matter that much. The only difference is that I'm reading kbd a total of 256 times to paint the screen. Reading once per register also would work, and reading once per "screenfill" would also work. But that changes the 'delay' b/w your keyboard press and the screen fill start. I thought per row was a good compromise. + **assembly**: Since our assembly doesn't have any functions, writing Assembly is much tougher than I thought it would be. All state is global, there are no functions, and you can only jump using goto. diff --git a/projects/04/fill/Fill.asm b/projects/04/fill/Fill.asm index cdf24ce..bd94f39 100644 --- a/projects/04/fill/Fill.asm +++ b/projects/04/fill/Fill.asm @@ -11,10 +11,13 @@ // "white" in every pixel; // the screen should remain fully clear as long as no key is pressed. -// Set i to 255 -@255 +// See NOTES.md for details on how this works + +(PROGRAM_START) +// Set R0 to SCREEN +@SCREEN D=A -@i +@R0 M=D (KEYBOARD_LOOP) @@ -36,47 +39,107 @@ M=D // At this point @color = 0|-1 depending on whether a key is pressed -// This is adapted from manual-fill.asm - - // coloring code goes here +// Read color to D @color D=M -@SCREEN +// Load the value in R0 to A +@R0 +A=M +// And off we go hunting +M=D +A=A+1 +M=D +A=A+1 +M=D +A=A+1 +M=D +A=A+1 +M=D +A=A+1 +M=D +A=A+1 +M=D +A=A+1 +M=D +A=A+1 +M=D +A=A+1 +M=D +A=A+1 +M=D +A=A+1 +M=D +A=A+1 +M=D +A=A+1 +M=D +A=A+1 +M=D +A=A+1 +M=D +A=A+1 +M=D +A=A+1 +M=D +A=A+1 +M=D +A=A+1 +M=D +A=A+1 +M=D +A=A+1 +M=D +A=A+1 +M=D +A=A+1 +M=D +A=A+1 +M=D +A=A+1 +M=D +A=A+1 +M=D +A=A+1 +M=D +A=A+1 +M=D +A=A+1 +M=D +A=A+1 +M=D +A=A+1 M=D - // Keyboard Loop ending -// Reduce i by 1 -@i -M=M-1 - -// Jump to ENDIF if @i>0 -@i -D=M -@ENDIF -D;JGT - -// Here i==0, so we reset it to 255 -@255 +// Bump A by 1 and write it to R0 +A=A+1 D=A -@i +@R0 M=D +// If R0-24575 <= 0, then jump to program start +@24575 +D=A +@R0 +D=M-D // (D=R0-24575) +@ENDIF +D;JLE + +// Here, R1 is negative +// set R0=@SCREEN and let the loop continue +@SCREEN +D=A +@R0 +M=D + + (ENDIF) - +// OTHERWISE, we just restart the keyboard loop @KEYBOARD_LOOP 0;JMP - - -// @WRITE_COMPLETE_ROW -// 0;JMP - -(END) -@END -0;JMP diff --git a/projects/04/fill/Fill.hack b/projects/04/fill/Fill.hack index e4fe171..0bfc9d0 100644 --- a/projects/04/fill/Fill.hack +++ b/projects/04/fill/Fill.hack @@ -1,8 +1,8 @@ -0000000011111111 +0100000000000000 1110110000010000 -0000000000010000 +0000000000000000 1110001100001000 -0000000000010001 +0000000000010000 1110101010001000 0110000000000000 1111110000010000 @@ -11,188 +11,88 @@ 0000000000000000 1110110000010000 1110001110010000 -0000000000010001 -1110001100001000 -1110101010010000 0000000000010000 -1111000010010000 -1111000010010000 -1111000010010000 -1111000010010000 -1111000010010000 -1111000010010000 -1111000010010000 -1111000010010000 -1111000010010000 -1111000010010000 -1111000010010000 -1111000010010000 -1111000010010000 -1111000010010000 -1111000010010000 -1111000010010000 -1111000010010000 -1111000010010000 -1111000010010000 -1111000010010000 -1111000010010000 -1111000010010000 -1111000010010000 -1111000010010000 -1111000010010000 -1111000010010000 -1111000010010000 -1111000010010000 -1111000010010000 -1111000010010000 -1111000010010000 -1111000010010000 -0100000000000000 -1110000010110000 -0000000000010010 1110001100001000 0000000000010000 1111110000010000 -0000000000111101 -1110001100000001 -0000000011111111 +0000000000000000 +1111110000100000 +1110001100001000 +1110110111100000 +1110001100001000 +1110110111100000 +1110001100001000 +1110110111100000 +1110001100001000 +1110110111100000 +1110001100001000 +1110110111100000 +1110001100001000 +1110110111100000 +1110001100001000 +1110110111100000 +1110001100001000 +1110110111100000 +1110001100001000 +1110110111100000 +1110001100001000 +1110110111100000 +1110001100001000 +1110110111100000 +1110001100001000 +1110110111100000 +1110001100001000 +1110110111100000 +1110001100001000 +1110110111100000 +1110001100001000 +1110110111100000 +1110001100001000 +1110110111100000 +1110001100001000 +1110110111100000 +1110001100001000 +1110110111100000 +1110001100001000 +1110110111100000 +1110001100001000 +1110110111100000 +1110001100001000 +1110110111100000 +1110001100001000 +1110110111100000 +1110001100001000 +1110110111100000 +1110001100001000 +1110110111100000 +1110001100001000 +1110110111100000 +1110001100001000 +1110110111100000 +1110001100001000 +1110110111100000 +1110001100001000 +1110110111100000 +1110001100001000 +1110110111100000 +1110001100001000 +1110110111100000 +1110001100001000 +1110110111100000 +1110001100001000 +1110110111100000 1110110000010000 -0000000000010000 +0000000000000000 1110001100001000 -0000000000010001 -1111110000010000 -0000000000010010 -1111110000100000 +0101111111111111 +1110110000010000 +0000000000000000 +1111000111010000 +0000000001100000 +1110001100000110 +0100000000000000 +1110110000010000 +0000000000000000 1110001100001000 -0000000000010010 -1111110111100000 -1111110000100000 -1110001100001000 -0000000000010010 -1111110111100000 -1111110000100000 -1110001100001000 -0000000000010010 -1111110111100000 -1111110000100000 -1110001100001000 -0000000000010010 -1111110111100000 -1111110000100000 -1110001100001000 -0000000000010010 -1111110111100000 -1111110000100000 -1110001100001000 -0000000000010010 -1111110111100000 -1111110000100000 -1110001100001000 -0000000000010010 -1111110111100000 -1111110000100000 -1110001100001000 -0000000000010010 -1111110111100000 -1111110000100000 -1110001100001000 -0000000000010010 -1111110111100000 -1111110000100000 -1110001100001000 -0000000000010010 -1111110111100000 -1111110000100000 -1110001100001000 -0000000000010010 -1111110111100000 -1111110000100000 -1110001100001000 -0000000000010010 -1111110111100000 -1111110000100000 -1110001100001000 -0000000000010010 -1111110111100000 -1111110000100000 -1110001100001000 -0000000000010010 -1111110111100000 -1111110000100000 -1110001100001000 -0000000000010010 -1111110111100000 -1111110000100000 -1110001100001000 -0000000000010010 -1111110111100000 -1111110000100000 -1110001100001000 -0000000000010010 -1111110111100000 -1111110000100000 -1110001100001000 -0000000000010010 -1111110111100000 -1111110000100000 -1110001100001000 -0000000000010010 -1111110111100000 -1111110000100000 -1110001100001000 -0000000000010010 -1111110111100000 -1111110000100000 -1110001100001000 -0000000000010010 -1111110111100000 -1111110000100000 -1110001100001000 -0000000000010010 -1111110111100000 -1111110000100000 -1110001100001000 -0000000000010010 -1111110111100000 -1111110000100000 -1110001100001000 -0000000000010010 -1111110111100000 -1111110000100000 -1110001100001000 -0000000000010010 -1111110111100000 -1111110000100000 -1110001100001000 -0000000000010010 -1111110111100000 -1111110000100000 -1110001100001000 -0000000000010010 -1111110111100000 -1111110000100000 -1110001100001000 -0000000000010010 -1111110111100000 -1111110000100000 -1110001100001000 -0000000000010010 -1111110111100000 -1111110000100000 -1110001100001000 -0000000000010010 -1111110111100000 -1111110000100000 -1110001100001000 -0000000000010010 -1111110111100000 -1111110000100000 -1110001100001000 -0000000000010010 -1111110111100000 -1111110000100000 -1110001100001000 -0000000000010000 -1111110010001000 0000000000000100 1110101010000111 diff --git a/projects/04/fill/FillAutomatic.out b/projects/04/fill/FillAutomatic.out index b3828cf..a71db27 100644 --- a/projects/04/fill/FillAutomatic.out +++ b/projects/04/fill/FillAutomatic.out @@ -1,3 +1,4 @@ |RAM[16384]|RAM[17648]|RAM[18349]|RAM[19444]|RAM[20771]|RAM[21031]|RAM[22596]|RAM[23754]|RAM[24575]| | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| -1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | +| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |