16bit random

This commit is contained in:
Tyrel Souza 2023-01-23 23:09:19 -05:00
parent 96c424fba7
commit 3bdf1a28c1
No known key found for this signature in database
GPG Key ID: F3614B02ACBE438E
4 changed files with 48 additions and 29 deletions

View File

@ -15,5 +15,5 @@ clean:
# Rule to run the final cartridge .nes file in the FCEUX emulator # Rule to run the final cartridge .nes file in the FCEUX emulator
############################################################################### ###############################################################################
run: run:
#on-workspace 4 "fceux atlantico.nes && i3-msg '[id=$(xdotool getactivewindow)] floating enable'" on-workspace 1 "fceux atlantico.nes && i3-msg '[id=$(xdotool getactivewindow)] floating enable'"
on-workspace 4 "fceux atlantico.nes" #on-workspace 1 "fceux atlantico.nes"

View File

@ -42,9 +42,10 @@ ParamAttribs: .res 1 ; Used as parameter to subroutine
PrevOAMCount: .res 1 ; Store the previous number of bytes that were sent to the OAM PrevOAMCount: .res 1 ; Store the previous number of bytes that were sent to the OAM
Seed: .res 2 ; Initialize the 16-bit seed to any value except 0
ActorsArray: .res MAX_ACTORS * .sizeof(Actor) ActorsArray: .res MAX_ACTORS * .sizeof(Actor)
Seed: .res 1 ; Used as the RANDOM NUMBER GENERATOR SEED
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; PRG-ROM code located at $8000 ;; PRG-ROM code located at $8000
@ -69,6 +70,29 @@ LoopButtons:
rts rts
.endproc .endproc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Returns a random 8-bit number inside A (0-255), clobbers Y (0).
;; Requires a 2-byte value on the Zero page called "Seed"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; This is a 16-bit Galois Linerar Feedback Shift register with polynomial $0039
;; The sequence of numbers it generates will repeat after 65535 calls.
;; Execution time is an average of 125 cycles (excluding jsr and rts)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.proc GetRandomNumber
ldy #8 ; Loop counter (generates 8 bits)
lda Seed+0
: asl ; Shift the register
rol Seed+1
bcc :+
eor #$39 ; Apply XOR feedback when a 1 bit is shifted out
:
dey
bne :--
sta Seed+0 ; Saves the value in A into the Seed
cmp #0 ; Set flags
rts
.endproc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Subroutine to load all 32 color palette values from ROM ;; Subroutine to load all 32 color palette values from ROM
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -258,7 +282,13 @@ EndRoutine:
sta ParamType ; Load parameter for the actor type sta ParamType ; Load parameter for the actor type
lda #223 lda #223
sta ParamXPos ; Load parameter for actor position X sta ParamXPos ; Load parameter for actor position X
lda #185 jsr GetRandomNumber ; load random number into A
lsr ; Divide by 8 (right shift thrice)
lsr
lsr
clc
adc #180 ; add 180 to lower it
sta ParamYPos sta ParamYPos
jsr AddNewActor ; Call the subroutine to add the new missile actor jsr AddNewActor ; Call the subroutine to add the new missile actor
@ -277,7 +307,16 @@ EndRoutine:
sta ParamType ; Load parameter for the actor type sta ParamType ; Load parameter for the actor type
lda #235 lda #235
sta ParamXPos ; Load parameter for actor position X sta ParamXPos ; Load parameter for actor position X
lda #60 jsr GetRandomNumber ; load random number into A
lsr ; Divide by 4 (right shift twice)
lsr
clc
adc #35 ; add 35 to lower it, so its not in the status bar
;Adjust the random Y to be between top and bottom
sta ParamYPos sta ParamYPos
jsr AddNewActor ; Call the subroutine to add the new missile actor jsr AddNewActor ; Call the subroutine to add the new missile actor
@ -515,30 +554,6 @@ EndRoutine:
.endproc .endproc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Returns a random 8 bit number inside A (0-255), clobbers Y (0)
;; requires 1-byte value on the Zero Page called Seed
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; this is an 8 bit galois LFSR with polynomial $1D
;; The sequence of numbers it generates will repeat after 255 calls
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.proc GetRandomNumber
ldy #8 ; Loop counter (generates 8 bits)
lda Seed ;
Loop8Times:
asl ; Shift the register left
bcc :+ ;
eor #$1D ; Apply XOR feebback when a 1bit is shifted out
: ;
dey ;
bne Loop8Times ;
sta Seed ; Saves the value in A
cmp #0 ;
rts ;
.endproc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Reset handler (called when the NES resets or powers on) ;; Reset handler (called when the NES resets or powers on)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -557,6 +572,10 @@ InitVariables:
lda #165 lda #165
sta YPos sta YPos
lda #$10
sta Seed+1
sta Seed+0 ; Initialize the seed with any value not zero
Main: Main:
jsr LoadPalette ; Call LoadPalette subroutine to load 32 colors into our palette jsr LoadPalette ; Call LoadPalette subroutine to load 32 colors into our palette

Binary file not shown.

Binary file not shown.