需要帮助在Hack ASM ROM中修改代码片段

时间:2010-06-29 23:11:52

标签: assembly

这是来自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

我真正好奇的是第二个到最后一个代码块,一个关于屏幕内存区域偏移的代码。我写了其他所有内容,但是直到有人向我提供了代码块,程序才能正常工作。任何人都可以向我解释它在做什么吗?

1 个答案:

答案 0 :(得分:1)

我明白了!

8191是虚拟屏幕8K内存区域内的最大位数。通过将迭代器与最大值进行AND运算,我们确保不会尝试写入屏幕外的像素。