我在这里玩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 $fe在genPos子例程中添加额外的像素,则会以非常奇怪的模式绘制像素,如果我有额外的LDA,则代码可以完美地工作.我无法理解为什么 - 有人能给我一个暗示吗?
此致,雅各布
它已经是一个很好的低字节!这一行:
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)
应用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.这些像素仍未亮起.
| 归档时间: |
|
| 查看次数: |
598 次 |
| 最近记录: |