diff --git a/games/peasant/random16.s b/games/peasant/random16.s index 44b45a79..b1162646 100644 --- a/games/peasant/random16.s +++ b/games/peasant/random16.s @@ -1,9 +1,9 @@ -; 16-bit 6502 Random Number Generator (cycle-invariant version) +; 16-bit 6502 Random Number Generator ; Linear feedback shift register PRNG by White Flame ; http://codebase64.org/doku.php?id=base:small_fast_16-bit_prng -; The Apple II KEYIN routine increments SEEDL:SEEDH +; The Apple II KEYIN routine increments this field ; while waiting for keypress ;SEEDL = $4E @@ -15,105 +15,47 @@ XOR_MAGIC = $7657 ; "vW" ; random16 ;============================= ; takes: - ; not 0, cs = 6(r16)+12(lnz)+5(nop)+ 19(deo) = 42 - ; not 0, cc = 6(r16)+14(lnz)+2(nop)+ 20(neo) = 42 - - ; $0000 = 6(r16)+ 6(loz)+11nops+ 19(deo) = 42 - ; $8000 = 6(r16)+ 6(loz)+ 4(ceo) + 6nops+ 20(neo) = 42 - - ; $XX00 cc = 6(r16)+ 6(loz)+4(ceo)+2(cep) +4nops+ 20(neo) = 42 - ; $XX00 cs = 6(r16)+ 6(loz)+4(ceo)+4(cep) +3nops+ 19(deo) = 42* + ; not 0, cc = 5+ = 27 + ; not 0, cs = 5+12+19 = 36 + ; $0000 = 5+7+19 = 31 + ; $8000 = 5+6+14 = 25 + ; $XX00 = 5+6+7+19 = 37 random16: lda SEEDL ; 3 - beq low_zero ; $0000 and $8000 are special values ; 3 - ;========== - ; 6 -lownz: - ; -1 + beq lowZero ; $0000 and $8000 are special values ; 2 + asl SEEDL ; Do a normal shift ; 5 lda SEEDH ; 3 rol ; 2 - bcs five_cycle_do_eor ; 3 - ;=========== - ; 12 + bcc noEor ; 2 - bcc two_cycle_no_eor ; 3 - ;========== - ; 12+3-1 = 14 - - -;=================================================================== - -eleven_cycle_do_eor: - nop ; 2 - nop ; 2 - nop ; 2 -five_cycle_do_eor: - nop ; 2 -three_cycle_do_eor: - sta SEEDH ; nop ; 3 - -do_eor: +doEor: ; high byte is in A + eor #>XOR_MAGIC ; 2 sta SEEDH ; 3 lda SEEDL ; 3 eor #