6502汇编程序随机数问题

时间:2015-07-23 19:58:16

标签: assembly 6502

我在这里玩6502汇编程序:http://skilldrick.github.io/easy6502

我已经做到这一点,只是将随机颜色像素放在屏幕上的随机位置:

LDY #$00    ; Clear Y

loop:
 JSR genPos ; Put new position in memory
 LDA $fe    ; Get random number for color
 STA ($10), Y   ; Put pixel on screen
 JMP loop

genPos:
 STA $10    ; Store accumulator in low
 LDA $fe    ; Get new random number (WHY, oh why?)
 AND #$03   ; Mask out low two bits (=numbers 0-3)
 CLC        ; Clear carry flag
 ADC #2     ; Add 2 (= numbers 2-5)
 STA $11    ; Store number in high
 RTS

我正在尝试使用尽可能少的指令。我的问题是,如果我没有在LDA $fe子例程中添加额外的genPos,则会以非常奇怪的模式绘制像素,如果我有额外的LDA,则代码可以完美地工作。我无法理解为什么 - 有人能给我一个暗示吗?

此致 雅各布

2 个答案:

答案 0 :(得分:9)

它已经是一个很好的低字节!这一行:

LDA $fe    ; Get new random number (WHY, oh why?)

继续决定字节,如果您不生成新的随机数,y值将取决于最低两位<{1}}值{/ strong>,导致你看到的对角线:x的值总是等于绘制值的屏幕段,这意味着你会得到一个像

x & 3

答案 1 :(得分:5)

应用LDA的算法是:

[random 1] -> [11:10]
[random 1] -> [10]
[random 2]&3 + 2 -> [11]
(repeat)

如果您未能从$ fe重新加载a,那么您正在执行:

[random 1] -> [11:10]
[ramdom 1] -> [10]
[random 1]&3 + 2 -> [11]
(repeat)

因此,寻址像素的低字节和高字节都是相同随机数的函数。他们不是独立的。这在他们之间创造了相关性。这表现在你看到的模式中。如果您的假装屏幕宽度为256像素,则它是直接对角线;根据你看到8个条带的事实,我可以推断出你的输出实际上必须是256/8 = 32像素宽。

问题不在于你说“累加器中的随机数......应该为屏幕地址设置一个很好的低字节”。这就是你当时也将它用于高字节。你正在使用它。高字节是低字节的直接函数。所以有一堆高字节你永远不会打,因为它们不满足high=(low&3)+2的约束。那些像素仍未亮起。