Optimized rand16

This commit is contained in:
Martin Haye 2019-04-24 09:22:44 -07:00
parent 32021f42fa
commit 49ade7b345

View File

@ -1037,37 +1037,37 @@ end
asm internal_rand16()#1 asm internal_rand16()#1
!zone { !zone {
+asmPlasmRet 0 +asmPlasmRet 0
ldx #6 ldx #6 ; start check = 1, plus 5 loops to mul by 32 = 6 total
ldy seed
lda seed+1 lda seed+1
and #$7F ; in case kbd routine has advanced past MAGIC and #$7F ; in case kbd routine has advanced past MAGIC
beq .hiZero
sta seed+1 sta seed+1
bne .chk ; always taken bne .chk ; zero check - hi byte
tya
bne .chk ; zero check - lo byte
lda #1 ; force 0 seed to go to 1
bne .ret ; always taken
.shift .shift
asl seed asl
tay
rol seed+1 rol seed+1
.chk .chk
lda seed cpy #<MAGIC
sec
sbc #<MAGIC
tay
lda seed+1 lda seed+1
sbc #>MAGIC sbc #>MAGIC
bcc .next bcc .next
sty seed
sta seed+1 sta seed+1
tya
sbc #<MAGIC
!byte $C9 ; CMP imm - to skip next opcode
.next .next
tya
dex dex
bne .shift bne .shift ; 32 / 25
.ret .ret
lda seed sta seed
ldy seed+1 ldy seed+1
rts rts
.hiZero
lda seed ; zero-check
bne .next
inc seed ; force 0 seed to go to 1
bne .ret ; always taken
} }
end end
@ -1345,8 +1345,10 @@ export def rand16()#1
word result word result
if recordMode if recordMode
*seed = recordSeed *seed = recordSeed
//printf1("%x:", recordSeed)
result = internal_rand16() result = internal_rand16()
recordSeed = *seed recordSeed = *seed
//printf1("%x ", recordSeed)
return result return result
fin fin
return internal_rand16() return internal_rand16()