【问题标题】:6502 assembler random number problems6502 汇编程序随机数问题
【发布时间】:2015-07-23 19:58:16
【问题描述】:

我在这里玩 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

我正在尝试使用尽可能少的指令。我的问题是,如果我不在genPos 子例程中添加额外的LDA $fe,那么像素会以非常奇怪的模式绘制,如果我确实有额外的LDA,代码就会完美运行。我不明白为什么 - 谁能给我一个提示?

问候, 雅各布

【问题讨论】:

  • 是的 - 2 个字节。最低价为 10 美元,最高价为 11 美元。我不明白的是,累加器中的随机数(用于上一个循环中的颜色)应该为屏幕地址制作一个很好的低字节。
  • @i486:@jriff 链接了他正在使用的 JavaScript 模拟器。它在$fe 有随机数,在$ff 有键盘输入。

标签: assembly 6502


【解决方案1】:

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

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

继续决定字节,如果不生成新的随机数,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
   █   █   █   █   █   █   █   █  |
   █   █   █   █   █   █   █   █ /

【讨论】:

  • 非常感谢您的研究和解释。我现在明白了。
【解决方案2】:

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 的约束。这些像素保持不亮。

【讨论】:

  • 非常感谢您的解释。很抱歉,我不能分担你和 Mauris 之间的荣誉——你们都应得的。
  • 相反,有人决定对它投反对票。写的这么差吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多