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)
我错过了一些我看不见的东西.我不担心它是多么"随机".此时我只想要一系列随机数.
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)
感谢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 $63
或LDA $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电脑令人印象深刻!