mirror of
https://github.com/irmen/prog8.git
synced 2024-12-24 01:29:28 +00:00
removed fastrnd8() because it was hilariously bad, just use rnd()
This commit is contained in:
parent
306a1b7bc2
commit
8b84f87217
@ -573,6 +573,7 @@ _done
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
; TODO mode 2,3
|
||||||
4 -> {
|
4 -> {
|
||||||
; lores 256c
|
; lores 256c
|
||||||
void addr_mul_24_for_lores_256c(y, x) ; 24 bits result is in r0 and r1L (highest byte)
|
void addr_mul_24_for_lores_256c(y, x) ; 24 bits result is in r0 and r1L (highest byte)
|
||||||
|
@ -244,25 +244,6 @@ randseed .proc
|
|||||||
.pend
|
.pend
|
||||||
|
|
||||||
|
|
||||||
fast_randbyte .proc
|
|
||||||
; -- fast but bad 8-bit pseudo random number generator into A
|
|
||||||
lda _seed
|
|
||||||
beq _eor
|
|
||||||
asl a
|
|
||||||
beq _done ; if the input was $80, skip the EOR
|
|
||||||
bcc _done
|
|
||||||
_eor eor #$1d ; xor with magic value see below for possible values
|
|
||||||
_done sta _seed
|
|
||||||
rts
|
|
||||||
|
|
||||||
_seed .byte $3a
|
|
||||||
|
|
||||||
; possible 'magic' eor bytes are:
|
|
||||||
; $1d, $2b, $2d, $4d, $5f, $63, $65, $69
|
|
||||||
; $71, $87, $8d, $a9, $c3, $cf, $e7, $f5
|
|
||||||
|
|
||||||
.pend
|
|
||||||
|
|
||||||
randbyte .proc
|
randbyte .proc
|
||||||
; -- 8 bit pseudo random number generator into A (by just reusing randword)
|
; -- 8 bit pseudo random number generator into A (by just reusing randword)
|
||||||
jmp randword
|
jmp randword
|
||||||
@ -271,45 +252,37 @@ randbyte .proc
|
|||||||
randword .proc
|
randword .proc
|
||||||
; -- 16 bit pseudo random number generator into AY
|
; -- 16 bit pseudo random number generator into AY
|
||||||
|
|
||||||
magic_eor = $3f1d
|
; rand64k ;Factors of 65535: 3 5 17 257
|
||||||
; possible magic eor words are:
|
lda sr1+1
|
||||||
; $3f1d, $3f81, $3fa5, $3fc5, $4075, $409d, $40cd, $4109
|
asl a
|
||||||
; $413f, $414b, $4153, $4159, $4193, $4199, $41af, $41bb
|
asl a
|
||||||
|
eor sr1+1
|
||||||
|
asl a
|
||||||
|
eor sr1+1
|
||||||
|
asl a
|
||||||
|
asl a
|
||||||
|
eor sr1+1
|
||||||
|
asl a
|
||||||
|
rol sr1 ;shift this left, "random" bit comes from low
|
||||||
|
rol sr1+1
|
||||||
|
; rand32k ;Factors of 32767: 7 31 151 are independent and can be combined
|
||||||
|
lda sr2+1
|
||||||
|
asl a
|
||||||
|
eor sr2+1
|
||||||
|
asl a
|
||||||
|
asl a
|
||||||
|
ror sr2 ;shift this right, random bit comes from high - nicer when eor with sr1
|
||||||
|
rol sr2+1
|
||||||
|
lda sr1+1 ;can be left out
|
||||||
|
eor sr2+1 ;if you dont use
|
||||||
|
tay ;y as suggested
|
||||||
|
lda sr1 ;mix up lowbytes of SR1
|
||||||
|
eor sr2 ;and SR2 to combine both
|
||||||
|
rts
|
||||||
|
|
||||||
lda _seed
|
sr1 .word $a55a
|
||||||
beq _lowZero ; $0000 and $8000 are special values to test for
|
sr2 .word $7653
|
||||||
|
|
||||||
; Do a normal shift
|
|
||||||
asl _seed
|
|
||||||
lda _seed+1
|
|
||||||
rol a
|
|
||||||
bcc _noEor
|
|
||||||
|
|
||||||
_doEor ; high byte is in A
|
|
||||||
eor #>magic_eor
|
|
||||||
sta _seed+1
|
|
||||||
lda _seed
|
|
||||||
eor #<magic_eor
|
|
||||||
sta _seed
|
|
||||||
ldy _seed+1
|
|
||||||
rts
|
|
||||||
|
|
||||||
_lowZero lda _seed+1
|
|
||||||
beq _doEor ; High byte is also zero, so apply the EOR
|
|
||||||
; For speed, you could store 'magic' into 'seed' directly
|
|
||||||
; instead of running the EORs
|
|
||||||
|
|
||||||
; wasn't zero, check for $8000
|
|
||||||
asl a
|
|
||||||
beq _noEor ; if $00 is left after the shift, then it was $80
|
|
||||||
bcs _doEor ; else, do the EOR based on the carry bit as usual
|
|
||||||
|
|
||||||
_noEor sta _seed+1
|
|
||||||
tay
|
|
||||||
lda _seed
|
|
||||||
rts
|
|
||||||
|
|
||||||
_seed .word $2c9e
|
|
||||||
.pend
|
.pend
|
||||||
|
|
||||||
|
|
||||||
|
@ -387,14 +387,6 @@ func_sqrt16_into_A .proc
|
|||||||
rts
|
rts
|
||||||
.pend
|
.pend
|
||||||
|
|
||||||
func_fastrnd8_stack .proc
|
|
||||||
; -- put a random ubyte on the estack (using fast but bad RNG)
|
|
||||||
jsr math.fast_randbyte
|
|
||||||
sta P8ESTACK_LO,x
|
|
||||||
dex
|
|
||||||
rts
|
|
||||||
.pend
|
|
||||||
|
|
||||||
func_rnd_stack .proc
|
func_rnd_stack .proc
|
||||||
; -- put a random ubyte on the estack
|
; -- put a random ubyte on the estack
|
||||||
jsr math.randbyte
|
jsr math.randbyte
|
||||||
|
@ -138,7 +138,6 @@ private val functionSignatures: List<FSignature> = listOf(
|
|||||||
FSignature("peekw" , true, listOf(FParam("address", setOf(DataType.UWORD))), DataType.UWORD),
|
FSignature("peekw" , true, listOf(FParam("address", setOf(DataType.UWORD))), DataType.UWORD),
|
||||||
FSignature("poke" , false, listOf(FParam("address", setOf(DataType.UWORD)), FParam("value", setOf(DataType.UBYTE))), null),
|
FSignature("poke" , false, listOf(FParam("address", setOf(DataType.UWORD)), FParam("value", setOf(DataType.UBYTE))), null),
|
||||||
FSignature("pokew" , false, listOf(FParam("address", setOf(DataType.UWORD)), FParam("value", setOf(DataType.UWORD))), null),
|
FSignature("pokew" , false, listOf(FParam("address", setOf(DataType.UWORD)), FParam("value", setOf(DataType.UWORD))), null),
|
||||||
FSignature("fastrnd8" , false, emptyList(), DataType.UBYTE),
|
|
||||||
FSignature("rnd" , false, emptyList(), DataType.UBYTE),
|
FSignature("rnd" , false, emptyList(), DataType.UBYTE),
|
||||||
FSignature("rndw" , false, emptyList(), DataType.UWORD),
|
FSignature("rndw" , false, emptyList(), DataType.UWORD),
|
||||||
FSignature("rndf" , false, emptyList(), DataType.FLOAT),
|
FSignature("rndf" , false, emptyList(), DataType.FLOAT),
|
||||||
|
@ -52,7 +52,7 @@ internal class BuiltinFunctionsAsmGen(private val program: Program, private val
|
|||||||
"ln", "log2", "sqrt", "rad",
|
"ln", "log2", "sqrt", "rad",
|
||||||
"deg", "round", "floor", "ceil",
|
"deg", "round", "floor", "ceil",
|
||||||
"rndf" -> funcVariousFloatFuncs(fcall, func, resultToStack, resultRegister, sscope)
|
"rndf" -> funcVariousFloatFuncs(fcall, func, resultToStack, resultRegister, sscope)
|
||||||
"fastrnd8", "rnd", "rndw" -> funcRnd(func, resultToStack, resultRegister, sscope)
|
"rnd", "rndw" -> funcRnd(func, resultToStack, resultRegister, sscope)
|
||||||
"sqrt16" -> funcSqrt16(fcall, func, resultToStack, resultRegister, sscope)
|
"sqrt16" -> funcSqrt16(fcall, func, resultToStack, resultRegister, sscope)
|
||||||
"rol" -> funcRol(fcall)
|
"rol" -> funcRol(fcall)
|
||||||
"rol2" -> funcRol2(fcall)
|
"rol2" -> funcRol2(fcall)
|
||||||
@ -1115,14 +1115,6 @@ internal class BuiltinFunctionsAsmGen(private val program: Program, private val
|
|||||||
|
|
||||||
private fun funcRnd(func: FSignature, resultToStack: Boolean, resultRegister: RegisterOrPair?, scope: Subroutine?) {
|
private fun funcRnd(func: FSignature, resultToStack: Boolean, resultRegister: RegisterOrPair?, scope: Subroutine?) {
|
||||||
when(func.name) {
|
when(func.name) {
|
||||||
"fastrnd8" -> {
|
|
||||||
if(resultToStack)
|
|
||||||
asmgen.out(" jsr prog8_lib.func_fastrnd8_stack")
|
|
||||||
else {
|
|
||||||
asmgen.out(" jsr math.fast_randbyte")
|
|
||||||
assignAsmGen.assignRegisterByte(AsmAssignTarget.fromRegisters(resultRegister ?: RegisterOrPair.A, scope, program, asmgen), CpuRegister.A)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"rnd" -> {
|
"rnd" -> {
|
||||||
if(resultToStack)
|
if(resultToStack)
|
||||||
asmgen.out(" jsr prog8_lib.func_rnd_stack")
|
asmgen.out(" jsr prog8_lib.func_rnd_stack")
|
||||||
|
@ -845,9 +845,6 @@ rndw()
|
|||||||
rndf()
|
rndf()
|
||||||
returns a pseudo-random float between 0.0 and 1.0
|
returns a pseudo-random float between 0.0 and 1.0
|
||||||
|
|
||||||
fastrnd8()
|
|
||||||
returns a pseudo-random byte from 0..255 (using a fast but not very good rng)
|
|
||||||
|
|
||||||
rol(x)
|
rol(x)
|
||||||
Rotate the bits in x (byte or word) one position to the left.
|
Rotate the bits in x (byte or word) one position to the left.
|
||||||
This uses the CPU's rotate semantics: bit 0 will be set to the current value of the Carry flag,
|
This uses the CPU's rotate semantics: bit 0 will be set to the current value of the Carry flag,
|
||||||
|
@ -42,7 +42,7 @@ main {
|
|||||||
active_height--
|
active_height--
|
||||||
upwards = false
|
upwards = false
|
||||||
} else {
|
} else {
|
||||||
target_height = 8 + fastrnd8() % 16
|
target_height = 8 + rnd() % 16
|
||||||
if upwards
|
if upwards
|
||||||
mountain = 233
|
mountain = 233
|
||||||
else
|
else
|
||||||
@ -57,7 +57,7 @@ main {
|
|||||||
txt.scroll_left(true)
|
txt.scroll_left(true)
|
||||||
|
|
||||||
; float the balloon
|
; float the balloon
|
||||||
if fastrnd8() & %10000
|
if rnd() & %10000
|
||||||
c64.SPXY[1] ++
|
c64.SPXY[1] ++
|
||||||
else
|
else
|
||||||
c64.SPXY[1] --
|
c64.SPXY[1] --
|
||||||
@ -71,10 +71,10 @@ main {
|
|||||||
txt.setcc(39, yy, 160, 8) ; draw mountain
|
txt.setcc(39, yy, 160, 8) ; draw mountain
|
||||||
}
|
}
|
||||||
|
|
||||||
yy = fastrnd8()
|
yy = rnd()
|
||||||
if yy > 100 {
|
if yy > 100 {
|
||||||
; draw a star
|
; draw a star
|
||||||
txt.setcc(39, yy % (active_height-1), '.', fastrnd8())
|
txt.setcc(39, yy % (active_height-1), '.', rnd())
|
||||||
}
|
}
|
||||||
|
|
||||||
if yy > 200 {
|
if yy > 200 {
|
||||||
@ -85,7 +85,7 @@ main {
|
|||||||
tree = 88
|
tree = 88
|
||||||
else if yy & %00100000 != 0
|
else if yy & %00100000 != 0
|
||||||
tree = 65
|
tree = 65
|
||||||
if fastrnd8() > 130
|
if rnd() > 130
|
||||||
treecolor = 13
|
treecolor = 13
|
||||||
txt.setcc(39, active_height, tree, treecolor)
|
txt.setcc(39, active_height, tree, treecolor)
|
||||||
}
|
}
|
||||||
|
@ -24,12 +24,11 @@ main {
|
|||||||
; Setup Starting Ball Positions
|
; Setup Starting Ball Positions
|
||||||
ubyte lp
|
ubyte lp
|
||||||
for lp in 0 to ballCount-1 {
|
for lp in 0 to ballCount-1 {
|
||||||
BX[lp] = fastrnd8() % txt.DEFAULT_WIDTH
|
BX[lp] = rnd() % txt.DEFAULT_WIDTH
|
||||||
BY[lp] = fastrnd8() % txt.DEFAULT_HEIGHT
|
BY[lp] = rnd() % txt.DEFAULT_HEIGHT
|
||||||
BC[lp] = fastrnd8() & 15
|
BC[lp] = rnd() & 15
|
||||||
DX[lp] = fastrnd8() & 1
|
DX[lp] = rnd() & 1
|
||||||
DY[lp] = fastrnd8() & 1
|
DY[lp] = rnd() & 1
|
||||||
void fastrnd8()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
; start clock
|
; start clock
|
||||||
|
@ -42,7 +42,7 @@ main {
|
|||||||
for i in 0 to 7 {
|
for i in 0 to 7 {
|
||||||
c64.SPRPTR[i] = $0a00 / 64
|
c64.SPRPTR[i] = $0a00 / 64
|
||||||
c64.SPXY[i*2] = 50+25*i
|
c64.SPXY[i*2] = 50+25*i
|
||||||
c64.SPXY[i*2+1] = fastrnd8()
|
c64.SPXY[i*2+1] = rnd()
|
||||||
}
|
}
|
||||||
|
|
||||||
c64.SPENA = 255 ; enable all sprites
|
c64.SPENA = 255 ; enable all sprites
|
||||||
@ -60,7 +60,7 @@ irq {
|
|||||||
ubyte @zp i
|
ubyte @zp i
|
||||||
for i in 0 to 14 step 2 {
|
for i in 0 to 14 step 2 {
|
||||||
c64.SPXY[i+1]--
|
c64.SPXY[i+1]--
|
||||||
ubyte @zp r = fastrnd8()
|
ubyte @zp r = rnd()
|
||||||
if r>200
|
if r>200
|
||||||
c64.SPXY[i]++
|
c64.SPXY[i]++
|
||||||
else if r<40
|
else if r<40
|
||||||
|
@ -1,29 +1,29 @@
|
|||||||
%import conv
|
%import conv
|
||||||
%import gfx2
|
%import gfx2
|
||||||
|
%import textio
|
||||||
|
|
||||||
main {
|
main {
|
||||||
|
|
||||||
sub start() {
|
sub start() {
|
||||||
gfx2.screen_mode(1) ; high res 4c
|
gfx2.screen_mode(1) ; lo res
|
||||||
gfx2.text_charset(3)
|
gfx2.text_charset(3)
|
||||||
gfx2.text(10, 10, 1, @"Hello!")
|
gfx2.text(10, 10, 1, @"Hello!")
|
||||||
|
|
||||||
c64.SETTIM(0,0,0)
|
c64.SETTIM(0,0,0)
|
||||||
|
|
||||||
|
ubyte yy
|
||||||
|
uword rw
|
||||||
|
|
||||||
repeat 2 {
|
;413 jiffies (lores mono) / 480 jiffies (highres mono) / 368 jiffies (lores 256c) / 442 jiffies (lores 4c)
|
||||||
uword xx
|
repeat 50000 {
|
||||||
gfx2.monochrome_stipple(true)
|
rw = rndw()
|
||||||
for xx in 0 to 319 {
|
yy = (lsb(rw) & 127) + 20
|
||||||
gfx2.vertical_line(xx, 20, 200, 1)
|
gfx2.plot(msb(rw), yy, 1)
|
||||||
}
|
}
|
||||||
gfx2.monochrome_stipple(false)
|
repeat 50000 {
|
||||||
for xx in 0 to 319 {
|
rw = rndw()
|
||||||
gfx2.vertical_line(xx, 20, 200, 1)
|
yy = (lsb(rw) & 127) + 20
|
||||||
}
|
gfx2.plot(msb(rw), yy, 0)
|
||||||
for xx in 0 to 319 {
|
|
||||||
gfx2.vertical_line(xx, 20, 200, 0)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uword time = c64.RDTIM16()
|
uword time = c64.RDTIM16()
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
<keywords keywords="&;->;@;\$;and;as;asmsub;break;clobbers;do;downto;else;false;for;goto;if;if_cc;if_cs;if_eq;if_mi;if_ne;if_neg;if_nz;if_pl;if_pos;if_vc;if_vs;if_z;in;inline;not;or;repeat;return;romsub;step;sub;to;true;until;when;while;xor;~" ignore_case="false" />
|
<keywords keywords="&;->;@;\$;and;as;asmsub;break;clobbers;do;downto;else;false;for;goto;if;if_cc;if_cs;if_eq;if_mi;if_ne;if_neg;if_nz;if_pl;if_pos;if_vc;if_vs;if_z;in;inline;not;or;repeat;return;romsub;step;sub;to;true;until;when;while;xor;~" ignore_case="false" />
|
||||||
<keywords2 keywords="%address;%asm;%asmbinary;%asminclude;%breakpoint;%import;%launcher;%option;%output;%target;%zeropage;%zpreserved" />
|
<keywords2 keywords="%address;%asm;%asmbinary;%asminclude;%breakpoint;%import;%launcher;%option;%output;%target;%zeropage;%zpreserved" />
|
||||||
<keywords3 keywords="byte;const;float;str;struct;ubyte;uword;void;word;zp" />
|
<keywords3 keywords="byte;const;float;str;struct;ubyte;uword;void;word;zp" />
|
||||||
<keywords4 keywords="abs;acos;all;any;asin;atan;avg;callfar;ceil;cmp;cos;cos16;cos16u;cos8;cos8u;deg;fastrnd8;floor;len;ln;log2;lsb;lsl;lsr;max;memory;min;mkword;msb;offsetof;peek;peekw;poke;pokew;rad;reverse;rnd;rndf;rndw;rol;rol2;ror;ror2;round;sgn;sin;sin16;sin16u;sin8;sin8u;sizeof;sort;sqrt;sqrt16;sum;swap;tan" />
|
<keywords4 keywords="abs;acos;all;any;asin;atan;avg;callfar;callrom;ceil;cmp;cos;cos16;cos16u;cos8;cos8u;deg;floor;len;ln;log2;lsb;lsl;lsr;max;memory;min;mkword;msb;offsetof;peek;peekw;poke;pokew;rad;reverse;rnd;rndf;rndw;rol;rol2;ror;ror2;round;sgn;sin;sin16;sin16u;sin8;sin8u;sizeof;sort;sqrt;sqrt16;sum;swap;tan" />
|
||||||
</highlighting>
|
</highlighting>
|
||||||
<extensionMap>
|
<extensionMap>
|
||||||
<mapping ext="p8" />
|
<mapping ext="p8" />
|
||||||
|
@ -16,7 +16,7 @@ syn keyword prog8BuiltInFunc any all len max min reverse sum sort
|
|||||||
|
|
||||||
" Miscellaneous functions
|
" Miscellaneous functions
|
||||||
syn keyword prog8BuiltInFunc cmp lsb msb mkword peek peekw poke pokew rnd rndw
|
syn keyword prog8BuiltInFunc cmp lsb msb mkword peek peekw poke pokew rnd rndw
|
||||||
syn keyword prog8BuiltInFunc rndf fastrnd8 rol rol2 ror ror2 sizeof offsetof
|
syn keyword prog8BuiltInFunc rndf rol rol2 ror ror2 sizeof offsetof
|
||||||
syn keyword prog8BuiltInFunc swap memory callfar callrom
|
syn keyword prog8BuiltInFunc swap memory callfar callrom
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user