这是来自NAND和俄罗斯方块的任务四,以及来自希伯来大学的OCW(我没有参加,我只是在踢球)。它的作用是,当按下任何键时,它会使每个像素变黑。释放钥匙后,“屏幕”将被清除。
这是ROM本身:
// Fill.asm
// Fills the 'screen' with black,
// one pixel at a time, when any
// key is pressed and held.
// When the key is released, the
// screen should clear.
// i = 0
@i
M=0
(LOOP)
// color = 0xFFFF (black) = !0
D=0
D=!D
@color
M=D
@KBD // Location of keypress code
// is RAM[24576] = RAM(0x600)
D=M // D != 0 if a key is pressed
@SKIP_WHITE
D;JNE
// if (key == 0 )
// {
// color = 0 (white)
@color
M=0
// }
(SKIP_WHITE)
// Ensure that the offset is
// within the screen's 8K
// memory area
@i
M=M+1
@8191
D=A
@i
M=M&D
@i
D=M
@SCREEN
D=D+A
@target
M=D
@color
D=M
@target
A=M // GOTO Pixel specified by target
M=D
@LOOP // infinite loop, baby
0;JMP
我真正好奇的是第二个到最后一个代码块,一个关于屏幕内存区域偏移的代码。我写了其他所有内容,但是直到有人向我提供了代码块,程序才能正常工作。任何人都可以向我解释它在做什么吗?
答案 0 :(得分:1)
我明白了!
8191是虚拟屏幕8K内存区域内的最大位数。通过将迭代器与最大值进行AND运算,我们确保不会尝试写入屏幕外的像素。