6502汇编程序随机数问题

jri*_*iff 5 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
Run Code Online (Sandbox Code Playgroud)

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

此致,雅各布

Lyn*_*ynn 9

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

LDA $fe    ; Get new random number (WHY, oh why?)
Run Code Online (Sandbox Code Playgroud)

接着决定字节,如果你不产生一个新的随机数,该y值将取决于最低两位的中x值,导致你所看到的对角线:值x & 3总是等于该段屏幕上正在绘制值,这意味着你会得到一个类似的模式

?   ?   ?   ?   ?   ?   ?   ?    \
?   ?   ?   ?   ?   ?   ?   ?     |
?   ?   ?   ?   ?   ?   ?   ?     |  x & 3 == 0  in $200-$2FF
?   ?   ?   ?   ?   ?   ?   ?     |
?   ?   ?   ?   ?   ?   ?   ?    /
 ?   ?   ?   ?   ?   ?   ?   ?   \
 ?   ?   ?   ?   ?   ?   ?   ?    |
 ?   ?   ?   ?   ?   ?   ?   ?    |  x & 3 == 1  in $300-$3FF
 ?   ?   ?   ?   ?   ?   ?   ?    |
 ?   ?   ?   ?   ?   ?   ?   ?   /
  ?   ?   ?   ?   ?   ?   ?   ?  \
  ?   ?   ?   ?   ?   ?   ?   ?   |
  ?   ?   ?   ?   ?   ?   ?   ?   |  x & 3 == 2  in $400-$4FF
  ?   ?   ?   ?   ?   ?   ?   ?   |
  ?   ?   ?   ?   ?   ?   ?   ?  /
   ?   ?   ?   ?   ?   ?   ?   ? \
   ?   ?   ?   ?   ?   ?   ?   ?  |
   ?   ?   ?   ?   ?   ?   ?   ?  |  x & 3 == 3  in $500-$5FF
   ?   ?   ?   ?   ?   ?   ?   ?  |
   ?   ?   ?   ?   ?   ?   ?   ? /
Run Code Online (Sandbox Code Playgroud)


Tom*_*mmy 5

应用LDA的算法是:

[random 1] -> [11:10]
[random 1] -> [10]
[random 2]&3 + 2 -> [11]
(repeat)
Run Code Online (Sandbox Code Playgroud)

如果你没有a从$ fe 重装,那么你正在做:

[random 1] -> [11:10]
[ramdom 1] -> [10]
[random 1]&3 + 2 -> [11]
(repeat)
Run Code Online (Sandbox Code Playgroud)

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

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