peasant: add random number generator
This commit is contained in:
parent
b49e5f00e8
commit
a7f0280aae
|
@ -74,7 +74,8 @@ qload.o: qload.s qboot.inc \
|
||||||
clear_bottom.s \
|
clear_bottom.s \
|
||||||
hgr_hgr2.s \
|
hgr_hgr2.s \
|
||||||
gr_offsets.s \
|
gr_offsets.s \
|
||||||
qkumba_popwr.s
|
qkumba_popwr.s \
|
||||||
|
random16.s
|
||||||
ca65 -o qload.o qload.s -l qload.lst
|
ca65 -o qload.o qload.s -l qload.lst
|
||||||
|
|
||||||
###
|
###
|
||||||
|
@ -136,6 +137,7 @@ qload.inc: generate_common QLOAD
|
||||||
./generate_common -a 0xb00 -s location_names_l qload.lst >> qload.inc
|
./generate_common -a 0xb00 -s location_names_l qload.lst >> qload.inc
|
||||||
./generate_common -a 0xb00 -s location_names_h qload.lst >> qload.inc
|
./generate_common -a 0xb00 -s location_names_h qload.lst >> qload.inc
|
||||||
./generate_common -a 0xb00 -s wait_until_keypress qload.lst >> qload.inc
|
./generate_common -a 0xb00 -s wait_until_keypress qload.lst >> qload.inc
|
||||||
|
./generate_common -a 0xb00 -s random16 qload.lst >> qload.inc
|
||||||
echo "hposn_high = \$$BA00" >> qload.inc
|
echo "hposn_high = \$$BA00" >> qload.inc
|
||||||
echo "hposn_low = \$$BB00" >> qload.inc
|
echo "hposn_low = \$$BB00" >> qload.inc
|
||||||
echo "driveoff = \$$A22" >> qload.inc
|
echo "driveoff = \$$A22" >> qload.inc
|
||||||
|
|
|
@ -21,6 +21,7 @@ check_keyboard:
|
||||||
rts
|
rts
|
||||||
|
|
||||||
key_was_pressed:
|
key_was_pressed:
|
||||||
|
inc SEEDL
|
||||||
|
|
||||||
and #$5f ; strip off high bit and make uppercase
|
and #$5f ; strip off high bit and make uppercase
|
||||||
|
|
||||||
|
|
|
@ -257,6 +257,7 @@ length_array:
|
||||||
.include "gr_offsets.s"
|
.include "gr_offsets.s"
|
||||||
.include "loadsave_menu.s"
|
.include "loadsave_menu.s"
|
||||||
.include "wait_keypress.s"
|
.include "wait_keypress.s"
|
||||||
|
.include "random16.s"
|
||||||
|
|
||||||
peasant_text:
|
peasant_text:
|
||||||
.byte 25,2,"Peasant's Quest",0
|
.byte 25,2,"Peasant's Quest",0
|
||||||
|
|
|
@ -0,0 +1,119 @@
|
||||||
|
; 16-bit 6502 Random Number Generator (cycle-invariant version)
|
||||||
|
|
||||||
|
; 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
|
||||||
|
; while waiting for keypress
|
||||||
|
|
||||||
|
;SEEDL = $4E
|
||||||
|
;SEEDH = $4F
|
||||||
|
|
||||||
|
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*
|
||||||
|
random16:
|
||||||
|
|
||||||
|
lda SEEDL ; 3
|
||||||
|
beq low_zero ; $0000 and $8000 are special values ; 3
|
||||||
|
;==========
|
||||||
|
; 6
|
||||||
|
lownz:
|
||||||
|
; -1
|
||||||
|
asl SEEDL ; Do a normal shift ; 5
|
||||||
|
lda SEEDH ; 3
|
||||||
|
rol ; 2
|
||||||
|
bcs five_cycle_do_eor ; 3
|
||||||
|
;===========
|
||||||
|
; 12
|
||||||
|
|
||||||
|
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:
|
||||||
|
; high byte is in A
|
||||||
|
|
||||||
|
eor #>XOR_MAGIC ; 2
|
||||||
|
sta SEEDH ; 3
|
||||||
|
lda SEEDL ; 3
|
||||||
|
eor #<XOR_MAGIC ; 2
|
||||||
|
sta SEEDL ; 3
|
||||||
|
eor_rts:
|
||||||
|
rts ; 6
|
||||||
|
;===========
|
||||||
|
; 19
|
||||||
|
|
||||||
|
;=========================================================================
|
||||||
|
|
||||||
|
six_cycles_no_eor:
|
||||||
|
nop ; 2
|
||||||
|
four_cycle_no_eor:
|
||||||
|
nop ; 2
|
||||||
|
two_cycle_no_eor:
|
||||||
|
nop ; 2
|
||||||
|
no_eor:
|
||||||
|
nop ; 2
|
||||||
|
nop ; 2
|
||||||
|
nop ; 2
|
||||||
|
nop ; 2
|
||||||
|
sta SEEDH ; 3
|
||||||
|
jmp eor_rts ; 3+6
|
||||||
|
;===========
|
||||||
|
; 20
|
||||||
|
|
||||||
|
|
||||||
|
;======================================================================
|
||||||
|
;======================================================================
|
||||||
|
|
||||||
|
low_zero:
|
||||||
|
lda SEEDH ; 3
|
||||||
|
beq eleven_cycle_do_eor ; High byte is also zero ; 3
|
||||||
|
; so apply the EOR
|
||||||
|
;============
|
||||||
|
; 6
|
||||||
|
ceo:
|
||||||
|
|
||||||
|
; -1
|
||||||
|
; wasn't zero, check for $8000
|
||||||
|
asl ; 2
|
||||||
|
beq six_cycles_no_eor ; if $00 is left after the shift; 3
|
||||||
|
; then it was $80
|
||||||
|
;===========
|
||||||
|
; 4
|
||||||
|
|
||||||
|
; else, do the EOR based on the carry
|
||||||
|
cep:
|
||||||
|
; -1
|
||||||
|
bcc four_cycle_no_eor ; 3
|
||||||
|
;============
|
||||||
|
; 2
|
||||||
|
|
||||||
|
bcs three_cycle_do_eor ; 2+3-1 = 4
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue