从6502汇编程序获取随机数

Ken*_*nny 7 random assembly c64 6502

尝试使用JSR $ E09A在我的C64上生成一系列随机数,并从$ 63和$ 64中检索该数字.(根据我所看到的所有文档,当你使用BASIC的RND(0)时都是相同的例程.但不能让它迭代.下面的代码将工作并在$ 63和$ 64中放置一个不同的数字本身.

. C000  A5 00    LDA $00
. C002  20 9A E0 JSR $E09A
. C005  00       BRK
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试使用以下代码迭代10次时,它永远不会返回.

. C000  A0 0A    LDY #$0A
. C002  A9 00    LDA #$00
. C004  20 9A E0 JSR $E09A
. C007  88       DEY
. C008  D0 F8    BNE $C002
. C00A  00       BRK
Run Code Online (Sandbox Code Playgroud)

我错过了一些我看不见的东西.我不担心它是多么"随机".此时我只想要一系列随机数.

Mik*_*ike 8

SID芯片实际上可以生成比BASIC的伪随机数更随机的数字.启动发电机:

LDA #$FF  ; maximum frequency value
STA $D40E ; voice 3 frequency low byte
STA $D40F ; voice 3 frequency high byte
LDA #$80  ; noise waveform, gate bit off
STA $D412 ; voice 3 control register
RTS
Run Code Online (Sandbox Code Playgroud)

然后,您可以随时获得随机数:

LDA $D41B ; get random value from 0-255
Run Code Online (Sandbox Code Playgroud)

  • 不...也许 您可以提取从缓存中预先生成的随机数,并且当不使用语音3时,请先关闭输出并重新填充缓存,然后再将语音3重置为下一个输出。它仅涉及更改音乐播放例程以在间隔期间使用它。 (2认同)

Ken*_*nny 6

感谢Ross Ridge建议被调用函数改变Y寄存器中的值.我知道它必须是明显的东西!

通过在之前存储Y JSR并在之后恢复,它现在将正确迭代.这是快速修复:

编辑:更新于7/10/17 - 显示完整代码并纳入JeremyP建议.这实际上是一个硬币翻转迭代器(50000次重复),用于随机试验

.C 033c  A9 00       LDA #$00
.C 033e  85 FB       STA $FB    ; set up register for counter
.C 0340  85 FC       STA $FC
.C 0342  A2 C8       LDX #$C8   ; outer loop= 200
.C 0344  86 FD       STX $FD
.C 0346  A0 FA       LDY #$FA   ; inner loop=250
.C 0348  84 FE       STY $FE
.C 034a  20 94 E0    JSR $E094  ; Get random# Vic20 Address (E09B for C64)
.C 034d  A5 63       LDA $64
.C 034f  C9 80       CMP #$80   ; >128 = HEADS
.C 0351  90 0D       BCC $0360  ; else continue loop
.C 0353  18          CLC        ; increment 2 byte number
.C 0354  A5 FB       LDA $FB
.C 0356  69 01       ADC #$01   ; LSB
.C 0358  85 FB       STA $FB
.C 035a  A5 FC       LDA $FC
.C 035c  69 00       ADC #$00   ; MSB
.C 035e  85 FC       STA $FC
.C 0360  C6 FE       DEC $FE
.C 0362  D0 E6       BNE $034A  ; end inner loop
.C 0364  C6 FD       DEC $FD
.C 0366  D0 DE       BNE $0346  ; end outer loop
.C 0368  60          RTS        ; return to basic
Run Code Online (Sandbox Code Playgroud)

我可以在循环中LDA $63LDA $64循环内获取随机数,并将其用于我的目的.

事实证明这比预期慢得多,只花了BASIC的一半时间.RND功能需要很多周期,但是,我发现了这个计算!文章它使用SID芯片作为随机数发生器.

LDA #$FF  ; maximum frequency value
STA $D40E ; voice 3 frequency low byte
STA $D40F ; voice 3 frequency high byte
LDA #$80  ; noise waveform, gate bit off
STA $D412 ; voice 3 control register  
Run Code Online (Sandbox Code Playgroud)

打开后,它会独立生成数字,而不必再次执行.重复调用的循环LDA $D41B将在每次迭代时为您提供一个新的随机数.在我的测试中,50,000次迭代耗时1.25秒,百万次耗时超过24秒.1MHz电脑令人印象深刻!