mirror of https://github.com/gungwald/rnd.git
106 lines
2.5 KiB
ArmAsm
106 lines
2.5 KiB
ArmAsm
;**************************
|
|
;
|
|
; Random dungeon generator
|
|
;
|
|
;**************************
|
|
|
|
.code
|
|
|
|
.include "symbols.s"
|
|
.include "macros.s"
|
|
|
|
main
|
|
jsr seedRandomNumGenerator
|
|
jsr initLoResFullScreen
|
|
jsr setRandomColor ;Set the color
|
|
jsr drawHallway
|
|
jsr drawRoom
|
|
jsr waitForKeypress
|
|
sta TEXTON
|
|
rts
|
|
|
|
waitForKeypress
|
|
rts
|
|
|
|
drawHallway
|
|
lda #16
|
|
jsr generateRandomInt
|
|
sta x2 ;Rightmost X coordinate
|
|
HLIN #0,x2,#10
|
|
rts
|
|
|
|
drawRoom
|
|
rts
|
|
|
|
initLoResFullScreen
|
|
sta TEXTOFF ;Enable graphics
|
|
sta HIRESOFF ;Enable Lo-res
|
|
sta MIXEDOFF ;Full screen
|
|
jsr CLRSCR ;Clear the screen
|
|
rts
|
|
|
|
; Add A to FAC leaving result in FAC
|
|
addAccumToFac
|
|
pha
|
|
jsr MOVAF ;Move FAC to ARG
|
|
pla
|
|
jsr FLOAT ;Convert A to floating point in FAC
|
|
lda FACEXP ;Required for FADDT
|
|
jsr FADDT ;Add ARG to FAC putting result in FAC
|
|
rts ;Return with result in FAC
|
|
|
|
; Multiply FAC by A leaving result in FAC
|
|
multFacByAccum
|
|
pha ;Save A on stack
|
|
jsr MOVAF ;Move FAC to ARG
|
|
pla ;Get original value back in A
|
|
jsr FLOAT ;Convert value in A to floating point in FAC
|
|
lda FACEXP ;Required for FMULTT
|
|
jsr FMULTT ;Multiply ARG by FAC putting result in FAC
|
|
rts ;Return with result in FAC
|
|
|
|
; Seed RND function by calling it with a variable negative number.
|
|
seedRandomNumGenerator
|
|
lda RNDL ;RNDL is a good seed value, because it changes
|
|
ora #$80 ;Make it negative so RND will interpret it as a seed
|
|
jsr FLOAT ;Convert it to floating point
|
|
jsr RND ;Seed the random number generator
|
|
rts
|
|
|
|
; Generate a floating point random number in the range [0,1) with result in FAC
|
|
generateRandomFloat
|
|
lda #1 ;A 1 arg to RND says to give the next random num
|
|
jsr FLOAT ;Convert to floating point as required by RND
|
|
jsr RND ;Generate the random number
|
|
rts ;Return with result in FAC
|
|
|
|
; Generate an integer random number in the range [0,A) with result in A
|
|
generateRandomInt
|
|
pha ;Save parameter in A to stack
|
|
jsr generateRandomFloat ;Generate random number [0,1) in FAC
|
|
pla ;Load multiplier into accumulator
|
|
jsr multFacByAccum ;Multiply FAC by A
|
|
jsr CONINT ;Convert FAC to 1-byte int in X
|
|
txa ;Put the result in A
|
|
rts ;Return with result A
|
|
|
|
; Generate an integer random number in the range [1,A] inclusive
|
|
; with result in A
|
|
generateRandomPositive
|
|
jsr generateRandomInt ;Get an integer between [0,A) in A
|
|
clc ;Change the range to [1,A]
|
|
adc #1
|
|
rts
|
|
|
|
; Set the color to a random non-black value.
|
|
setRandomColor
|
|
lda #15 ;Max color number
|
|
jsr generateRandomPositive
|
|
jsr SETCOLR ;Set the color
|
|
rts
|
|
|
|
.data
|
|
|
|
x2 .byte 0
|
|
|