mirror of
https://github.com/irmen/prog8.git
synced 2025-02-27 03:29:22 +00:00
random number stuff
This commit is contained in:
parent
80c69d83c6
commit
662ba6460a
@ -141,7 +141,7 @@ asmsub GIVAYF (lo: ubyte @ Y, hi: ubyte @ A) -> clobbers(A,X,Y) -> () = $b391
|
|||||||
asmsub FREADUY (unsigned: ubyte @ Y) -> clobbers(A,X,Y) -> () = $b3a2 ; 8 bit unsigned Y -> float in fac1
|
asmsub FREADUY (unsigned: ubyte @ Y) -> clobbers(A,X,Y) -> () = $b3a2 ; 8 bit unsigned Y -> float in fac1
|
||||||
asmsub FREADSA (signed: ubyte @ A) -> clobbers(A,X,Y) -> () = $bc3c ; 8 bit signed A -> float in fac1
|
asmsub FREADSA (signed: ubyte @ A) -> clobbers(A,X,Y) -> () = $bc3c ; 8 bit signed A -> float in fac1
|
||||||
asmsub FREADSTR (length: ubyte @ A) -> clobbers(A,X,Y) -> () = $b7b5 ; str -> fac1, $22/23 must point to string, A=string length
|
asmsub FREADSTR (length: ubyte @ A) -> clobbers(A,X,Y) -> () = $b7b5 ; str -> fac1, $22/23 must point to string, A=string length
|
||||||
asmsub FPRINTLN () -> clobbers(A,X,Y) -> () = $aabc ; print string of fac1, on one line (= with newline)
|
asmsub FPRINTLN () -> clobbers(A,X,Y) -> () = $aabc ; print string of fac1, on one line (= with newline) (consider FOUT + STROUT as well)
|
||||||
asmsub FOUT () -> clobbers(X) -> (uword @ AY) = $bddd ; fac1 -> string, address returned in AY ($0100)
|
asmsub FOUT () -> clobbers(X) -> (uword @ AY) = $bddd ; fac1 -> string, address returned in AY ($0100)
|
||||||
|
|
||||||
asmsub FADDH () -> clobbers(A,X,Y) -> () = $b849 ; fac1 += 0.5, for rounding- call this before INT
|
asmsub FADDH () -> clobbers(A,X,Y) -> () = $b849 ; fac1 += 0.5, for rounding- call this before INT
|
||||||
@ -169,8 +169,8 @@ asmsub ABS () -> clobbers() -> () = $bc58 ; fac1 = ABS(fac1)
|
|||||||
asmsub SQR () -> clobbers(A,X,Y) -> () = $bf71 ; fac1 = SQRT(fac1)
|
asmsub SQR () -> clobbers(A,X,Y) -> () = $bf71 ; fac1 = SQRT(fac1)
|
||||||
asmsub EXP () -> clobbers(A,X,Y) -> () = $bfed ; fac1 = EXP(fac1) (e ** fac1)
|
asmsub EXP () -> clobbers(A,X,Y) -> () = $bfed ; fac1 = EXP(fac1) (e ** fac1)
|
||||||
asmsub NEGOP () -> clobbers(A) -> () = $bfb4 ; switch the sign of fac1
|
asmsub NEGOP () -> clobbers(A) -> () = $bfb4 ; switch the sign of fac1
|
||||||
asmsub RND () -> clobbers(A,X,Y) -> () = $e097 ; fac1 = RND() (tip: use RNDA instead)
|
asmsub RND () -> clobbers(A,X,Y) -> () = $e097 ; fac1 = RND() (tip: use RNDA instead) pseudo random number generator
|
||||||
asmsub RNDA (acc: ubyte @ A) -> clobbers(A,X,Y) -> () = $e09a ; fac1 = RND(A)
|
asmsub RNDA (acc: ubyte @ A) -> clobbers(A,X,Y) -> () = $e09a ; fac1 = RND(A) pseudo random number generator
|
||||||
asmsub COS () -> clobbers(A,X,Y) -> () = $e264 ; fac1 = COS(fac1)
|
asmsub COS () -> clobbers(A,X,Y) -> () = $e264 ; fac1 = COS(fac1)
|
||||||
asmsub SIN () -> clobbers(A,X,Y) -> () = $e26b ; fac1 = SIN(fac1)
|
asmsub SIN () -> clobbers(A,X,Y) -> () = $e26b ; fac1 = SIN(fac1)
|
||||||
asmsub TAN () -> clobbers(A,X,Y) -> () = $e2b4 ; fac1 = TAN(fac1)
|
asmsub TAN () -> clobbers(A,X,Y) -> () = $e2b4 ; fac1 = TAN(fac1)
|
||||||
@ -189,6 +189,7 @@ asmsub HOMECRSR () -> clobbers(A,X,Y) -> () = $E566 ; cursor to top left of sc
|
|||||||
|
|
||||||
; ---- C64 kernal routines ----
|
; ---- C64 kernal routines ----
|
||||||
|
|
||||||
|
asmsub STROUT (strptr: uword @ AY) -> clobbers(A, X, Y) -> () = $AB1E ; print null-terminated string (a bit slow, see if you can use c64scr.print_string instead)
|
||||||
asmsub IRQDFRT () -> clobbers(A,X,Y) -> () = $EA31 ; default IRQ routine
|
asmsub IRQDFRT () -> clobbers(A,X,Y) -> () = $EA31 ; default IRQ routine
|
||||||
asmsub IRQDFEND () -> clobbers(A,X,Y) -> () = $EA81 ; default IRQ end/cleanup
|
asmsub IRQDFEND () -> clobbers(A,X,Y) -> () = $EA81 ; default IRQ end/cleanup
|
||||||
asmsub CINT () -> clobbers(A,X,Y) -> () = $FF81 ; (alias: SCINIT) initialize screen editor and video chip
|
asmsub CINT () -> clobbers(A,X,Y) -> () = $FF81 ; (alias: SCINIT) initialize screen editor and video chip
|
||||||
|
@ -21,6 +21,7 @@ asmsub init_system () -> clobbers(A,X,Y) -> () {
|
|||||||
; All three registers set to 0, status flags cleared.
|
; All three registers set to 0, status flags cleared.
|
||||||
%asm {{
|
%asm {{
|
||||||
sei
|
sei
|
||||||
|
jsr determine_start_rnd_seed
|
||||||
cld
|
cld
|
||||||
lda #%00101111
|
lda #%00101111
|
||||||
sta $00
|
sta $00
|
||||||
@ -41,6 +42,18 @@ asmsub init_system () -> clobbers(A,X,Y) -> () {
|
|||||||
clv
|
clv
|
||||||
cli
|
cli
|
||||||
rts
|
rts
|
||||||
|
|
||||||
|
determine_start_rnd_seed
|
||||||
|
lda c64.TIME_HI
|
||||||
|
adc c64.TIME_MID
|
||||||
|
adc c64.TIME_LO
|
||||||
|
ldy c64.RASTER
|
||||||
|
sta start_rnd_seed
|
||||||
|
sty start_rnd_seed+1
|
||||||
|
rts
|
||||||
|
|
||||||
|
start_rnd_seed .word $2c9e
|
||||||
|
|
||||||
}}
|
}}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -356,6 +369,52 @@ asmsub float_sub_SW1_from_XY (mflt: uword @ XY) -> clobbers(A,X,Y) -> () {
|
|||||||
}}
|
}}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub print_float (value: float) {
|
||||||
|
; ---- prints the floating point value (without a newline) using basic rom routines.
|
||||||
|
; clobbers no registers.
|
||||||
|
%asm {{
|
||||||
|
pha
|
||||||
|
tya
|
||||||
|
pha
|
||||||
|
txa
|
||||||
|
pha
|
||||||
|
lda #<print_float_value
|
||||||
|
ldy #>print_float_value
|
||||||
|
jsr c64.MOVFM ; load float into fac1
|
||||||
|
jsr c64.FOUT ; fac1 to string in A/Y
|
||||||
|
jsr c64.STROUT ; print string in A/Y
|
||||||
|
pla
|
||||||
|
tax
|
||||||
|
pla
|
||||||
|
tay
|
||||||
|
pla
|
||||||
|
rts
|
||||||
|
}}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub print_float_ln (value: float) {
|
||||||
|
; ---- prints the floating point value (with a newline at the end) using basic rom routines
|
||||||
|
; clobbers no registers.
|
||||||
|
%asm {{
|
||||||
|
pha
|
||||||
|
tya
|
||||||
|
pha
|
||||||
|
txa
|
||||||
|
pha
|
||||||
|
lda #<print_float_ln_value
|
||||||
|
ldy #>print_float_ln_value
|
||||||
|
jsr c64.MOVFM ; load float into fac1
|
||||||
|
jsr c64.FPRINTLN ; print fac1 with newline
|
||||||
|
pla
|
||||||
|
tax
|
||||||
|
pla
|
||||||
|
tay
|
||||||
|
pla
|
||||||
|
rts
|
||||||
|
}}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
} ; ------ end of block c64flt
|
} ; ------ end of block c64flt
|
||||||
|
|
||||||
|
|
||||||
|
@ -171,6 +171,34 @@ remainder = SCRATCH_ZP1
|
|||||||
}}
|
}}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
asmsub randseed (seed: uword @ AY) -> clobbers() -> () {
|
||||||
|
; ---- reset the random seeds for the byte and word random generators
|
||||||
|
; default starting values are: A=$2c Y=$9e
|
||||||
|
%asm {{
|
||||||
|
sta randword._seed
|
||||||
|
sty randword._seed+1
|
||||||
|
tya
|
||||||
|
clc
|
||||||
|
sbc #100
|
||||||
|
sta randbyte._seed
|
||||||
|
rts
|
||||||
|
}}
|
||||||
|
}
|
||||||
|
|
||||||
|
asmsub randseedr () -> clobbers() -> () {
|
||||||
|
; ---- initializes the byte and word random generators with the 'random' seed
|
||||||
|
; that was stored when the program started. This can be used if you don't
|
||||||
|
; want your program to use the same random number sequence every time it is loaded or runs.
|
||||||
|
%asm {{
|
||||||
|
lda c64utils.start_rnd_seed
|
||||||
|
ldy c64utils.start_rnd_seed+1
|
||||||
|
jsr math.randseed
|
||||||
|
ora #$80 ; make negative
|
||||||
|
jsr c64.RNDA ; reseed the float rng using the (negative) number in A
|
||||||
|
rts
|
||||||
|
}}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
asmsub randbyte () -> clobbers() -> (ubyte @ A) {
|
asmsub randbyte () -> clobbers() -> (ubyte @ A) {
|
||||||
; ---- 8-bit pseudo random number generator into A
|
; ---- 8-bit pseudo random number generator into A
|
||||||
@ -185,7 +213,7 @@ asmsub randbyte () -> clobbers() -> (ubyte @ A) {
|
|||||||
+ sta _seed
|
+ sta _seed
|
||||||
rts
|
rts
|
||||||
|
|
||||||
_seed .byte $3a
|
_seed .byte $3a
|
||||||
_magic .byte $1d
|
_magic .byte $1d
|
||||||
_magiceors .byte $1d, $2b, $2d, $4d, $5f, $63, $65, $69
|
_magiceors .byte $1d, $2b, $2d, $4d, $5f, $63, $65, $69
|
||||||
.byte $71, $87, $8d, $a9, $c3, $cf, $e7, $f5
|
.byte $71, $87, $8d, $a9, $c3, $cf, $e7, $f5
|
||||||
|
@ -11,6 +11,8 @@
|
|||||||
memory ubyte SCRATCH_ZP2 = $03 ; scratch register #2 in ZP
|
memory ubyte SCRATCH_ZP2 = $03 ; scratch register #2 in ZP
|
||||||
memory uword SCRATCH_ZPWORD1 = $fb ; scratch word in ZP ($fb/$fc)
|
memory uword SCRATCH_ZPWORD1 = $fb ; scratch word in ZP ($fb/$fc)
|
||||||
memory uword SCRATCH_ZPWORD2 = $fd ; scratch word in ZP ($fd/$fe)
|
memory uword SCRATCH_ZPWORD2 = $fd ; scratch word in ZP ($fd/$fe)
|
||||||
|
const uword ESTACK_LO = $ce00
|
||||||
|
const uword ESTACK_HI = $cf00
|
||||||
|
|
||||||
|
|
||||||
%asm {{
|
%asm {{
|
||||||
@ -28,7 +30,7 @@ ror2_word
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
; @todo: stubs for now
|
; @todo: implement stubs!
|
||||||
; @todo: move float operations to their own library (only included when floats are enabled)
|
; @todo: move float operations to their own library (only included when floats are enabled)
|
||||||
|
|
||||||
ub2float
|
ub2float
|
||||||
@ -44,12 +46,57 @@ w2float
|
|||||||
rts
|
rts
|
||||||
|
|
||||||
push_float
|
push_float
|
||||||
|
; ---- push mflpt5 in A/Y onto stack
|
||||||
|
; (taking 3 stack positions = 6 bytes of which 1 is padding)
|
||||||
|
sta SCRATCH_ZPWORD1
|
||||||
|
sty SCRATCH_ZPWORD1+1
|
||||||
|
ldy #0
|
||||||
|
lda SCRATCH_ZPWORD1,y
|
||||||
|
sta ESTACK_LO,x
|
||||||
|
iny
|
||||||
|
lda SCRATCH_ZPWORD1,y
|
||||||
|
sta ESTACK_HI,x
|
||||||
|
dex
|
||||||
|
iny
|
||||||
|
lda SCRATCH_ZPWORD1,y
|
||||||
|
sta ESTACK_LO,x
|
||||||
|
iny
|
||||||
|
lda SCRATCH_ZPWORD1,y
|
||||||
|
sta ESTACK_HI,x
|
||||||
|
dex
|
||||||
|
iny
|
||||||
|
lda SCRATCH_ZPWORD1,y
|
||||||
|
sta ESTACK_LO,x
|
||||||
|
dex
|
||||||
rts
|
rts
|
||||||
|
|
||||||
|
|
||||||
push_float_from_indexed_var
|
push_float_from_indexed_var
|
||||||
rts
|
rts
|
||||||
|
|
||||||
pop_var_float
|
pop_float
|
||||||
|
; ---- pops mflpt5 from stack to memory A/Y @TODO CHECK ORDER OF POPS
|
||||||
|
; (frees 3 stack positions = 6 bytes of which 1 is padding)
|
||||||
|
sta SCRATCH_ZPWORD1
|
||||||
|
sty SCRATCH_ZPWORD1+1
|
||||||
|
ldy #4
|
||||||
|
inx
|
||||||
|
lda ESTACK_LO,x
|
||||||
|
sta SCRATCH_ZPWORD1,y
|
||||||
|
dey
|
||||||
|
inx
|
||||||
|
lda ESTACK_LO,x
|
||||||
|
sta SCRATCH_ZPWORD1,y
|
||||||
|
dey
|
||||||
|
lda ESTACK_HI,x
|
||||||
|
sta SCRATCH_ZPWORD1,y
|
||||||
|
dey
|
||||||
|
inx
|
||||||
|
lda ESTACK_LO,x
|
||||||
|
sta SCRATCH_ZPWORD1,y
|
||||||
|
lda ESTACK_HI,x
|
||||||
|
dey
|
||||||
|
sta SCRATCH_ZPWORD1,y
|
||||||
rts
|
rts
|
||||||
|
|
||||||
pop_float_to_indexed_var
|
pop_float_to_indexed_var
|
||||||
@ -59,6 +106,25 @@ pop_mem_float
|
|||||||
rts
|
rts
|
||||||
|
|
||||||
copy_float
|
copy_float
|
||||||
|
; -- copies the 5 bytes of the mflt value pointed to by SCRATCH_ZPWORD1,
|
||||||
|
; into the 5 bytes pointed to by A/Y. Clobbers Y.
|
||||||
|
sta SCRATCH_ZPWORD2
|
||||||
|
sty SCRATCH_ZPWORD2+1
|
||||||
|
ldy #0
|
||||||
|
lda SCRATCH_ZPWORD1,y
|
||||||
|
sta SCRATCH_ZPWORD2,y
|
||||||
|
iny
|
||||||
|
lda SCRATCH_ZPWORD1,y
|
||||||
|
sta SCRATCH_ZPWORD2,y
|
||||||
|
iny
|
||||||
|
lda SCRATCH_ZPWORD1,y
|
||||||
|
sta SCRATCH_ZPWORD2,y
|
||||||
|
iny
|
||||||
|
lda SCRATCH_ZPWORD1,y
|
||||||
|
sta SCRATCH_ZPWORD2,y
|
||||||
|
iny
|
||||||
|
lda SCRATCH_ZPWORD1,y
|
||||||
|
sta SCRATCH_ZPWORD2,y
|
||||||
rts
|
rts
|
||||||
|
|
||||||
inc_var_f
|
inc_var_f
|
||||||
@ -243,12 +309,38 @@ func_any
|
|||||||
rts
|
rts
|
||||||
func_all
|
func_all
|
||||||
rts
|
rts
|
||||||
|
|
||||||
func_rnd
|
func_rnd
|
||||||
|
; -- put a random ubyte on the estack
|
||||||
|
jsr math.randbyte
|
||||||
|
sta ESTACK_LO,x
|
||||||
|
dex
|
||||||
rts
|
rts
|
||||||
|
|
||||||
func_rndw
|
func_rndw
|
||||||
|
; -- put a random uword on the estack
|
||||||
|
jsr math.randword
|
||||||
|
sta ESTACK_LO,x
|
||||||
|
tya
|
||||||
|
sta ESTACK_HI,x
|
||||||
|
dex
|
||||||
rts
|
rts
|
||||||
|
|
||||||
func_rndf
|
func_rndf
|
||||||
rts
|
; -- put a random floating point value on the stack
|
||||||
|
stx SCRATCH_ZP1
|
||||||
|
lda #39
|
||||||
|
jsr c64.RNDA ; rng into fac1
|
||||||
|
ldx #<_rndf_rnum5
|
||||||
|
ldy #>_rndf_rnum5
|
||||||
|
jsr c64.FTOMEMXY ; fac1 to mem X/Y
|
||||||
|
ldx SCRATCH_ZP1
|
||||||
|
lda #<_rndf_rnum5
|
||||||
|
ldy #>_rndf_rnum5
|
||||||
|
jmp push_float
|
||||||
|
_rndf_rnum5 .fill 5
|
||||||
|
|
||||||
|
|
||||||
func_wrd
|
func_wrd
|
||||||
rts
|
rts
|
||||||
func_uwrd
|
func_uwrd
|
||||||
|
Loading…
x
Reference in New Issue
Block a user