首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >6502汇编程序随机数问题

6502汇编程序随机数问题
EN

Stack Overflow用户
提问于 2015-07-23 19:58:16
回答 3查看 893关注 0票数 5

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

我所做的只是在屏幕上一个随机的地方放置一个随机的颜色像素:

代码语言:javascript
复制
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,代码就会工作得非常完美。我不明白为什么-有人能给我个提示吗?

你好,雅各布

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-24 11:55:41

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

代码语言:javascript
复制
LDA $fe    ; Get new random number (WHY, oh why?)

继续决定高字节,如果不生成一个新的随机数,y值将依赖于x值的最低的两位,从而导致您正在看到的对角线:x & 3的值总是等于正在绘制该值的屏幕的哪个部分,这意味着您得到了如下模式

代码语言:javascript
复制
█   █   █   █   █   █   █   █    \
█   █   █   █   █   █   █   █     |
█   █   █   █   █   █   █   █     |  x & 3 == 0  in $200-$2FF
█   █   █   █   █   █   █   █     |
█   █   █   █   █   █   █   █    /
 █   █   █   █   █   █   █   █   \
 █   █   █   █   █   █   █   █    |
 █   █   █   █   █   █   █   █    |  x & 3 == 1  in $300-$3FF
 █   █   █   █   █   █   █   █    |
 █   █   █   █   █   █   █   █   /
  █   █   █   █   █   █   █   █  \
  █   █   █   █   █   █   █   █   |
  █   █   █   █   █   █   █   █   |  x & 3 == 2  in $400-$4FF
  █   █   █   █   █   █   █   █   |
  █   █   █   █   █   █   █   █  /
   █   █   █   █   █   █   █   █ \
   █   █   █   █   █   █   █   █  |
   █   █   █   █   █   █   █   █  |  x & 3 == 3  in $500-$5FF
   █   █   █   █   █   █   █   █  |
   █   █   █   █   █   █   █   █ /
票数 10
EN

Stack Overflow用户

发布于 2015-07-24 11:42:05

与LDA一起使用的算法是:

代码语言:javascript
复制
[random 1] -> [11:10]
[random 1] -> [10]
[random 2]&3 + 2 -> [11]
(repeat)

如果无法从a中重新加载$fe,则需要执行以下操作:

代码语言:javascript
复制
[random 1] -> [11:10]
[ramdom 1] -> [10]
[random 1]&3 + 2 -> [11]
(repeat)

因此,寻址像素的低字节和高字节都是同一随机数的函数。他们不是独立的。这在它们之间形成了一种关联。在你所看到的模式中表现出来。如果你的假屏幕宽256个像素,那将是一个直接对角线;基于你看到8条条的事实,我可以推断出你的输出必须是256/8 = 32像素宽。

问题不是说“累加器中的随机数.应该为屏幕地址做一个很好的低字节”,这并不是错误的。那就是你也在用它来做高字节。你两个人都用了。高字节是低字节的直接函数。所以有一堆高字节是你永远不会碰到的,因为它们不满足high=(low&3)+2的约束。这些像素仍然没有亮着。

票数 6
EN

Stack Overflow用户

发布于 2022-07-22 13:41:14

原因其实很简单。当您将任何内容加载到累加器中时,累加器只不过是当时存在的任何东西的副本。寄存器的一个基本规则是,如果不更改它们,它们的值将无限期地保持不变。

尽管存储在$fe上的值每个周期都会发生变化,但是在从$fe加载之后,累加器中的任何内容都不会更改,除非您使用另一条指令来更改累加器的内容。这和这个没什么不同:

代码语言:javascript
复制
LDA $0200
INC $0200 ;the value at $0200 is now 1 higher than the accumulator.

因此,如果您从未用新的随机值重新加载累加器,则存储为高字节的值基于用于低字节的值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31596933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档