mirror of
https://github.com/jeremysrand/BuGS.git
synced 2024-09-23 11:55:16 +00:00
139 lines
2.3 KiB
ArmAsm
139 lines
2.3 KiB
ArmAsm
;
|
|
; random.s
|
|
; BuGS
|
|
;
|
|
; Created by Jeremy Rand on 2020-07-19.
|
|
;Copyright © 2020 Jeremy Rand. All rights reserved.
|
|
;
|
|
;
|
|
; This code was suggested by John Brooks
|
|
;
|
|
; If you need a random range less than 16 bits, here the smaller EOR constants:
|
|
; BITS EOR_CONST
|
|
; 2 $0003
|
|
; 3 $0006
|
|
; 4 $000C
|
|
; 5 $0014
|
|
; 6 $0030
|
|
; 7 $0060
|
|
; 8 $00B8
|
|
; 9 $0110
|
|
; 10 $0240
|
|
; 11 $0500
|
|
; 12 $0CA0
|
|
; 13 $1B00
|
|
; 14 $3500
|
|
; 15 $6000
|
|
; 16 $B400
|
|
;
|
|
|
|
case on
|
|
mcopy random.macros
|
|
keep random
|
|
|
|
random start
|
|
|
|
randInit entry
|
|
lda randomSeed
|
|
sta seed65535
|
|
|
|
and #$1f
|
|
bne randInit_store32
|
|
lda #$1f
|
|
randInit_store32 anop
|
|
sta seed32
|
|
|
|
and #$f
|
|
bne randInit_store16
|
|
lda #$f
|
|
randInit_store16 anop
|
|
sta seed16
|
|
|
|
rtl
|
|
|
|
|
|
; Returns a number from 0 to 14
|
|
rand0_to_14 entry
|
|
lda seed16
|
|
lsr a
|
|
bcc skipEor16
|
|
eor #$000c
|
|
skipEor16 anop
|
|
sta seed16
|
|
dec a
|
|
rtl
|
|
|
|
; Returns a number from 0 to N-1 where N is <= 15, arrives in the accumulator
|
|
randN entry
|
|
cmp #2
|
|
blt randN_ret0
|
|
cmp #2
|
|
beq randN_power2
|
|
cmp #4
|
|
beq randN_power2
|
|
cmp #8
|
|
beq randN_power2
|
|
bra randN_doit
|
|
|
|
randN_power2 anop
|
|
dec a
|
|
sta upperLimit
|
|
jsl rand0_to_65534
|
|
and upperLimit
|
|
rtl
|
|
|
|
randN_ret0 anop
|
|
lda #0
|
|
rtl
|
|
|
|
randN_doit anop
|
|
sta upperLimit
|
|
jsl rand0_to_14
|
|
randN_loop anop
|
|
cmp upperLimit
|
|
blt randN_done
|
|
sec
|
|
sbc upperLimit
|
|
bra randN_loop
|
|
randN_done anop
|
|
rtl
|
|
|
|
|
|
; Returns a number from 0 to 30
|
|
rand0_to_30 entry
|
|
lda seed32
|
|
lsr a
|
|
bcc skipEor32
|
|
eor #$0014
|
|
skipEor32 anop
|
|
sta seed32
|
|
dec a
|
|
rtl
|
|
|
|
; returns a number from 0 to 24
|
|
rand25 entry
|
|
jsl rand0_to_30
|
|
cmp #25
|
|
bge rand25
|
|
rtl
|
|
|
|
|
|
; Returns a number from 0 to 65534
|
|
rand0_to_65534 entry
|
|
lda seed65535
|
|
lsr a
|
|
bcc skipEor65535
|
|
eor #$b400
|
|
skipEor65535 anop
|
|
sta seed65535
|
|
dec a
|
|
rtl
|
|
|
|
|
|
seed65535 dc i2'0'
|
|
seed32 dc i2'0'
|
|
seed16 dc i2'0'
|
|
|
|
upperLimit dc i2'0'
|
|
end
|