parent
25e828ec9d
commit
e85ff27425
30
NOTES.md
30
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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 |
|
||||
|
|
Loading…
Reference in New Issue