mirror of
https://github.com/dschmenk/VM02.git
synced 2024-05-28 13:41:32 +00:00
270 lines
4.4 KiB
Plaintext
270 lines
4.4 KiB
Plaintext
|
CONST FALSE = 0
|
||
|
CONST TRUE = NOT FALSE
|
||
|
CONST SHOWLORES = $C056
|
||
|
CONST KEYBOARD = $C000
|
||
|
CONST KEYSTROBE = $C010
|
||
|
CONST EMPTY = 0
|
||
|
CONST TREE = 4
|
||
|
CONST FIRE = 13
|
||
|
CONST FORESTSIZE = 42*42
|
||
|
BYTE HELLOMSG[] = "PRESS ANY KEY TO BEGIN..."
|
||
|
BYTE EXITMSG[] = "PRESS ANY KEY TO EXIT."
|
||
|
BYTE GOODBYE[] = "THAT'S ALL FOLKS!"
|
||
|
BYTE TREES1[FORESTSIZE]
|
||
|
BYTE TREES2[FORESTSIZE]
|
||
|
WORD RNDNUM
|
||
|
;
|
||
|
; Defines for ASM routines
|
||
|
;
|
||
|
ASM EQUATES
|
||
|
SRC EQU $F0
|
||
|
SRCL EQU SRC
|
||
|
SRCH EQU SRC+1
|
||
|
DST EQU SRC+2
|
||
|
DSTL EQU DST
|
||
|
DSTH EQU DST+1
|
||
|
ESP EQU DST+2
|
||
|
END
|
||
|
;
|
||
|
; CALL 6502 ROUTINE
|
||
|
; ROMCALL(AREG, XREG, YREG, STATUS, ADDR)
|
||
|
;
|
||
|
ASM ROMCALL
|
||
|
TMP EQU $06
|
||
|
|
||
|
PHP
|
||
|
LDA ESTKL,X
|
||
|
STA TMP
|
||
|
LDA ESTKH,X
|
||
|
STA TMP+1
|
||
|
INX
|
||
|
LDA ESTKL,X
|
||
|
PHA
|
||
|
INX
|
||
|
LDA ESTKL,X
|
||
|
TAY
|
||
|
INX
|
||
|
LDA ESTKL+1,X
|
||
|
PHA
|
||
|
LDA ESTKL,X
|
||
|
INX
|
||
|
STX TMP+2
|
||
|
TAX
|
||
|
PLA
|
||
|
BIT ROMIN
|
||
|
PLP
|
||
|
JSR JMPTMP
|
||
|
PHP
|
||
|
BIT LCBNK2
|
||
|
STA REGVALS+0
|
||
|
STX REGVALS+1
|
||
|
STY REGVALS+2
|
||
|
PLA
|
||
|
STA REGVALS+3
|
||
|
LDX TMP+2
|
||
|
LDA #<REGVALS
|
||
|
LDY #>REGVALS
|
||
|
STA ESTKL,X
|
||
|
STY ESTKH,X
|
||
|
PLP
|
||
|
RTS
|
||
|
JMPTMP: JMP (TMP)
|
||
|
REGVALS: DS 4
|
||
|
END
|
||
|
;
|
||
|
; GRCOLOR(COLOR)
|
||
|
;
|
||
|
ASM GRCOLOR
|
||
|
LDA ESTKL,X
|
||
|
INX
|
||
|
STX TMP+2
|
||
|
BIT $C081
|
||
|
JSR $F864
|
||
|
BIT $C080
|
||
|
LDX TMP+2
|
||
|
END
|
||
|
;
|
||
|
; GRPLOT(X, Y)
|
||
|
;
|
||
|
ASM GRPLOT
|
||
|
LDA ESTKL,X
|
||
|
INX
|
||
|
LDY ESTKL,X
|
||
|
INX
|
||
|
STX TMP+2
|
||
|
BIT $C081
|
||
|
JSR $F800
|
||
|
BIT $C080
|
||
|
LDX TMP+2
|
||
|
END
|
||
|
;
|
||
|
; SET MEMORY TO VALUE
|
||
|
; MEMSET(VALUE, ADDR, SIZE)
|
||
|
;
|
||
|
ASM MEMSET
|
||
|
LDY #$00
|
||
|
LDA ESTKL+1,X
|
||
|
STA DSTL
|
||
|
LDA ESTKH+1,X
|
||
|
STA DSTH
|
||
|
INC ESTKL,X
|
||
|
INC ESTKH,X
|
||
|
SETMEM: DEC ESTKL,X
|
||
|
BNE :+
|
||
|
DEC ESTKH,X
|
||
|
BEQ MEMEXIT
|
||
|
: LDA ESTKL+2,X
|
||
|
STA (DST),Y
|
||
|
INY
|
||
|
BNE :+
|
||
|
INC DSTH
|
||
|
: DEC ESTKL,X
|
||
|
BNE :+
|
||
|
DEC ESTKH,X
|
||
|
BEQ MEMEXIT
|
||
|
: LDA ESTKH+2,X
|
||
|
STA (DST),Y
|
||
|
INY
|
||
|
BNE SETMEM
|
||
|
INC DSTH
|
||
|
BNE SETMEM
|
||
|
MEMEXIT: INX
|
||
|
INX
|
||
|
INX
|
||
|
END
|
||
|
;
|
||
|
; PRINT STRING
|
||
|
; PRSTR(STR)
|
||
|
;
|
||
|
ASM PRSTR
|
||
|
LDY #$00
|
||
|
LDA ESTKL,X
|
||
|
STA SRCL
|
||
|
LDA ESTKH,X
|
||
|
STA SRCH
|
||
|
BIT ROMIN
|
||
|
LDA (SRC),Y
|
||
|
STA ESTKL,X
|
||
|
BEQ :+
|
||
|
_PRS1: INY
|
||
|
LDA (SRC),Y
|
||
|
ORA #$80
|
||
|
JSR $FDED
|
||
|
TYA
|
||
|
CMP ESTKL,X
|
||
|
BNE _PRS1
|
||
|
: INX
|
||
|
BIT LCBNK2
|
||
|
END
|
||
|
DEF TEXTMODE
|
||
|
DROP ROMCALL(0, 0, 0, 0, $FB39)
|
||
|
END
|
||
|
|
||
|
DEF HOME
|
||
|
DROP ROMCALL(0, 0, 0, 0, $FC58)
|
||
|
END
|
||
|
|
||
|
DEF GOTOXY(X, Y)
|
||
|
^($24) = X
|
||
|
DROP ROMCALL(Y, 0, 0, 0, $FB5B)
|
||
|
END
|
||
|
|
||
|
DEF GRMODE
|
||
|
DROP ROMCALL(0, 0, 0, 0, $FB40)
|
||
|
DROP ^SHOWLORES
|
||
|
END
|
||
|
|
||
|
DEF RANDOMIZE(SEED)
|
||
|
RNDNUM = (SEED << 8) ? (SEED >> 8 & $FF) + SEED
|
||
|
END
|
||
|
|
||
|
DEFOPT RND
|
||
|
RNDNUM = (RNDNUM << 8) + RNDNUM + 12345
|
||
|
RETURN RNDNUM & $7FFF
|
||
|
END
|
||
|
|
||
|
DEFOPT BYFIRE(TREEPTR)
|
||
|
IF ^(TREEPTR - 43) == FIRE
|
||
|
RETURN TRUE
|
||
|
ELSIF ^(TREEPTR - 42) == FIRE
|
||
|
RETURN TRUE
|
||
|
ELSIF ^(TREEPTR - 41) == FIRE
|
||
|
RETURN TRUE
|
||
|
ELSIF ^(TREEPTR - 1) == FIRE
|
||
|
RETURN TRUE
|
||
|
ELSIF ^(TREEPTR + 1) == FIRE
|
||
|
RETURN TRUE
|
||
|
ELSIF ^(TREEPTR + 41) == FIRE
|
||
|
RETURN TRUE
|
||
|
ELSIF ^(TREEPTR + 42) == FIRE
|
||
|
RETURN TRUE
|
||
|
ELSIF ^(TREEPTR + 43) == FIRE
|
||
|
RETURN TRUE
|
||
|
FIN
|
||
|
RETURN FALSE
|
||
|
END
|
||
|
DEFOPT FORESTFIRE
|
||
|
WORD NEWTREES, OLDTREES, NEWTREE, OLDTREE, YROW
|
||
|
BYTE X, Y
|
||
|
|
||
|
MEMSET(EMPTY, @TREES1, FORESTSIZE)
|
||
|
MEMSET(EMPTY, @TREES2, FORESTSIZE)
|
||
|
OLDTREES = @TREES1
|
||
|
NEWTREES = @TREES2
|
||
|
|
||
|
FOR Y = 1 TO 40
|
||
|
YROW = Y * 42
|
||
|
FOR X = 1 TO 40
|
||
|
IF RND < 16384
|
||
|
^(OLDTREES + X + YROW) = TREE
|
||
|
FIN
|
||
|
NEXT
|
||
|
NEXT
|
||
|
WHILE ^$C000 < 128
|
||
|
FOR Y = 1 TO 40
|
||
|
YROW = Y * 42
|
||
|
FOR X = 1 TO 40
|
||
|
OLDTREE = OLDTREES + X + YROW
|
||
|
NEWTREE = NEWTREES + X + YROW
|
||
|
WHEN ^OLDTREE
|
||
|
IS EMPTY
|
||
|
IF RND < 400
|
||
|
^NEWTREE = TREE
|
||
|
ELSE
|
||
|
^NEWTREE = EMPTY
|
||
|
FIN
|
||
|
IS TREE
|
||
|
IF RND < 10 OR BYFIRE(OLDTREE)
|
||
|
^NEWTREE = FIRE
|
||
|
ELSE
|
||
|
^NEWTREE = TREE
|
||
|
FIN
|
||
|
IS FIRE
|
||
|
^NEWTREE = EMPTY
|
||
|
WEND
|
||
|
GRCOLOR(^NEWTREE)
|
||
|
GRPLOT(X - 1, Y - 1)
|
||
|
NEXT
|
||
|
NEXT
|
||
|
NEWTREES =, OLDTREES = OLDTREES, NEWTREES
|
||
|
LOOP
|
||
|
DROP ^$C010
|
||
|
END
|
||
|
|
||
|
PRSTR(@HELLOMSG)
|
||
|
WHILE ^$C000 < 128
|
||
|
RNDNUM = RNDNUM + 1
|
||
|
LOOP
|
||
|
RANDOMIZE(RNDNUM)
|
||
|
DROP ^$C010
|
||
|
GRMODE
|
||
|
HOME
|
||
|
GOTOXY(10,22)
|
||
|
PRSTR(@EXITMSG)
|
||
|
FORESTFIRE
|
||
|
TEXTMODE
|
||
|
HOME
|
||
|
PRSTR(@GOODBYE)
|
||
|
DONE
|
||
|
|