mirror of
https://github.com/a2geek/jewel-of-kaldun.git
synced 2025-03-20 07:29:34 +00:00
429 lines
13 KiB
ArmAsm
Executable File
429 lines
13 KiB
ArmAsm
Executable File
********************************
|
|
* *
|
|
* Jewel of Kaldun *
|
|
* (primary application segment)*
|
|
* *
|
|
* written by *
|
|
* https://github.com/a2geek *
|
|
* *
|
|
* story by *
|
|
* https://github.com/bshagle *
|
|
* *
|
|
* Copyright (c) 1990,2016 *
|
|
* *
|
|
********************************
|
|
|
|
* Code location:
|
|
|
|
ORG $6000
|
|
|
|
* External references:
|
|
; reset.s
|
|
RESETUP EXT
|
|
RESTORE EXT
|
|
; endgame.s
|
|
THEDEATH EXT
|
|
; graphics.s
|
|
HGRCLEAR EXT
|
|
|
|
* Memory map:
|
|
* __________
|
|
* | | $FFFF
|
|
* | ProDOS | to ProDOS/ROM
|
|
* |__________| $BF00
|
|
* | | $BEFF
|
|
* --> | J.O.K. | to Main program
|
|
* |__________| $6000
|
|
* | | $5FFF
|
|
* | HGR P2 | to Copy of title page
|
|
* |__________| $4000
|
|
* | | $3FFF
|
|
* | HGR P1 | to Graphics display
|
|
* |__________| $2000
|
|
* | | $1FFF
|
|
* | Map/Stat | to Map & Stats (to $1Cxx)
|
|
* |__________| $1000
|
|
* | | $0FFF
|
|
* | J.O.K. | to JOK End Game routines
|
|
* |__________| $0800 Reset routines
|
|
* | | $07FF
|
|
* | TextPage | to Text page
|
|
* |__________| $0400
|
|
* | | $03FF Free ($0200-$03CF)
|
|
* | Zp & St | to System Stack ($0100-$01FF)
|
|
* |__________| $0000 Zero Page ($0000-$00FF)
|
|
*
|
|
|
|
* Save file name:
|
|
|
|
DSK JEWEL.OF.KALDUN.bin
|
|
|
|
* Add in macro files:
|
|
|
|
USE jok-includes.inc
|
|
PAG
|
|
USE io.mac
|
|
PAG
|
|
USE general.mac
|
|
PAG
|
|
USE math.mac
|
|
PAG
|
|
USE prolib.mac
|
|
PAG
|
|
|
|
RETURN = $8D ; ASCII for <return> (high bit on)
|
|
ESCAPE = $9B ; ASCII for <escape> ( " " " )
|
|
|
|
LEVEL1 = $1000
|
|
LEVEL2 = $1600
|
|
|
|
********************************
|
|
* Jewel Of Kaldun, main file: *
|
|
********************************
|
|
|
|
JSR RESETUP
|
|
LDA #$20 ; page 1 of Hires...
|
|
STA 230
|
|
JSR INIT ; initialize screens, etc.
|
|
JSR CLRSCRN
|
|
JSR CHEKCASE
|
|
JSR HGRCLEAR
|
|
JSR TITLEPG ; draw title page
|
|
JSR WALLFADE ; fade in wall
|
|
JSR HSTORE ; store hi-res page @ $4000
|
|
MAIN ENT
|
|
JSR HRESTORE ; restore hi-res page
|
|
JSR SCPREP
|
|
JSR SETHGR ; ensure that hi-res is on
|
|
JSR SCROLL
|
|
CMP #RETURN
|
|
BEQ :PLAYGAM
|
|
CMP #"Q"
|
|
BEQ :BYEQUIT
|
|
CMP #"q"
|
|
BEQ :BYEQUIT
|
|
CMP #"I"
|
|
BEQ :INSTR
|
|
CMP #"i"
|
|
BNE MAIN
|
|
:INSTR JSR TEXT
|
|
JSR STORY
|
|
JMP MAIN
|
|
:BYEQUIT JSR DOQUIT
|
|
JMP MAIN
|
|
:PLAYGAM JSR LOADER
|
|
JSR HGRCLEAR
|
|
JSR CLRSCRN
|
|
LDA LOADSTAT
|
|
CMP #1
|
|
BEQ :RESTART
|
|
JSR MONSINIT ; clear out monsters
|
|
MOVW #0;GP
|
|
MOVW #0;XP
|
|
MOVW #100;XPREQD
|
|
MOVB #0;KEY
|
|
MOVB #0;SPKEY
|
|
MOVB #10;HP
|
|
MOVB #10;MAXHP
|
|
MOVB #1;CLEVEL
|
|
MOVB #25;CX
|
|
MOVB #32;CY
|
|
MOVB #-1;OX
|
|
MOVB #-1;OY
|
|
MOVB #-1;X0
|
|
MOVB #-1;Y0
|
|
MOVW #LEVEL1;MAPADDR
|
|
:RESTART JSR STATLINE
|
|
JSR STATUSGP
|
|
JSR STATUSKY
|
|
JSR STATUSHP
|
|
JSR STATUSXP
|
|
:UPDATE JSR UPSCREEN
|
|
:GOING JSR CHKLEVEL
|
|
JSR CTRLLOOP
|
|
PHA ; save exit code
|
|
JSR MOVMONST
|
|
PLA ; and restore it
|
|
JSR CHKLIFE
|
|
BEQ :GOING
|
|
CMP #-1
|
|
BNE :UPDATE
|
|
JSR CBOT3
|
|
JSR GETRET
|
|
JMP MAIN
|
|
|
|
********************************
|
|
* Check if user can handle *
|
|
* lower case letters. *
|
|
********************************
|
|
CHEKCASE LDX #%00000000 ; default: Mixed mode
|
|
LDA MACHID
|
|
AND #%11001000 ; Keep ID bits
|
|
BEQ :CHECK ; Have an Apple II
|
|
CMP #%01000000 ; Check for an Apple II+
|
|
BNE :OKAY ; Nope.
|
|
:CHECK PRINT CASEMSG ; ask if user can view in
|
|
JSR GETYN ; lower case
|
|
BCC :OKAY
|
|
LDX #%10000000
|
|
:OKAY STX AUTOCAPS ; adjust for user.
|
|
RTS
|
|
CASEMSG HEX 4A83
|
|
ASC "DO YOU HAVE LOWERCASE?"8D83
|
|
ASC "(Y/N)"00
|
|
|
|
********************************
|
|
* Check if player wishes to *
|
|
* quit. *
|
|
********************************
|
|
DOQUIT ENT
|
|
PRINT QUITMSG
|
|
JSR GETYN
|
|
BCC :QUITJOK
|
|
JSR CBOT3
|
|
RTS
|
|
|
|
:QUITJOK LDY #0 ; copy quit-code
|
|
:QLOOP LDA BEGQUIT,Y ; to $200
|
|
STA $200,Y
|
|
INY
|
|
CPY #ENDQUIT-BEGQUIT+1
|
|
BLT :QLOOP
|
|
LDY #0 ; restore
|
|
:MLOOP LDA RESTORE,Y ; old reset vector
|
|
STA $3F2,Y
|
|
INY
|
|
CPY #3
|
|
BLT :MLOOP
|
|
JMP $200+$7 ; skip quit code
|
|
BEGQUIT DFB 4 ; quit code
|
|
DFB 0
|
|
DW 0000
|
|
DFB 0
|
|
DW 0000
|
|
|
|
MOVW #$400;PTR ; clear memory
|
|
LDA #0 ; from $400 to
|
|
LDY #0 ; $BEFF
|
|
:LOOP STA (PTR),Y
|
|
INY
|
|
BNE :LOOP
|
|
STA SPEAKER
|
|
INC PTR+1
|
|
LDA PTR+1
|
|
CMP #$BF
|
|
BLT :LOOP
|
|
JSR $FB2F ; text..
|
|
JSR $FC58 ; clear screen
|
|
LDA #"S" ; print "SMILE!"
|
|
STA $400 ; the hard way...
|
|
LDA #"M"
|
|
STA $401
|
|
LDA #"I"
|
|
STA $402
|
|
LDA #"L"
|
|
STA $403
|
|
LDA #"E"
|
|
STA $404
|
|
LDA #"!"
|
|
STA $405
|
|
LDY #20 ; pause
|
|
:PAUSE LDA #255
|
|
JSR $FCA8
|
|
DEY
|
|
BNE :PAUSE
|
|
JSR $BF00 ; quit.
|
|
DFB $65
|
|
DW $200
|
|
HEX 00
|
|
ENDQUIT
|
|
QUITMSG HEX 5783
|
|
ASC "Do you wish to exit?"00
|
|
|
|
********************************
|
|
* Check to see if Meltok is *
|
|
* still alive! *
|
|
********************************
|
|
CHKLIFE PHA
|
|
LDA HP ; check hp
|
|
BEQ :DEATH ; if hp=0, dead
|
|
CMP MAXHP ; check against max
|
|
BLT :ALIVE ; if hp<max, alive
|
|
BEQ :ALIVE ; if hp=max, alive
|
|
:DEATH PLA ; throw away old status
|
|
JSR CLRSCRN ; clear text screen
|
|
PRINT DEATHMSG
|
|
JSR THEDEATH ; do death routine
|
|
LDA #-1 ; done with game
|
|
RTS
|
|
:ALIVE PLA ; use old status
|
|
RTS
|
|
DEATHMSG HEX 825583
|
|
ASC "... Suddenly ..."00
|
|
|
|
********************************
|
|
* Check to see if Meltok has *
|
|
* advanced a level. *
|
|
********************************
|
|
CHKLEVEL LDA XP+1 ; check hi byte of xp
|
|
CMP XPREQD+1 ; against xpreq'd
|
|
BLT :NOINCR ; if xp<xpreq'd, no up lvl
|
|
BEQ :CHECKLO ; if xp=xpreq'd, check lo byte
|
|
BGE :UPLEVEL ; if xp>xpreq'd, go up level!
|
|
:NOINCR RTS
|
|
:CHECKLO LDA XP ; check lo byte of xp
|
|
CMP XPREQD ; against xpreq'd
|
|
BLT :NOINCR ; if xp<xpreq'd, no up lvl
|
|
:UPLEVEL SUBW XP;XPREQD;XP ; xp= xp - xpreq'd
|
|
IMULW XPREQD;#2;XPREQD ; xpreq'd= xpreq'd * 2
|
|
INC CLEVEL ; add 1 to character level
|
|
LDA RANDOM1 ; generate random number
|
|
EOR RANDOM3
|
|
AND #%00001111 ; go up 1-16 hit points
|
|
CLC
|
|
ADC MAXHP
|
|
STA MAXHP ; add 0-15 to maxhp
|
|
INC MAXHP ; add +1 to maxhp.
|
|
MOVB MAXHP;HP ; and restore char to full H.
|
|
JSR STATUSXP ; update XP
|
|
JSR STATUSHP ; and HP...
|
|
PRINT ADVANCED ; print advancement msg
|
|
STA KEYSTROB
|
|
:WAITESC LDA KEYBOARD ; wait for user to press
|
|
CMP #$8D ; RET to continue with
|
|
BNE :WAITESC ; game.
|
|
STA KEYSTROB
|
|
JSR CBOT3
|
|
RTS ; serves as exit.
|
|
ADVANCED HEX 825501 ; vtab 22:htab 1
|
|
ASC "You have advanced a level! Meltok is"8D
|
|
ASC "now level "80
|
|
DA CLEVEL
|
|
ASC " and needs "81
|
|
DA XPREQD
|
|
ASC " experience"8D
|
|
ASC "points to advance to next level. [RET]"00
|
|
|
|
********************************
|
|
* Initialize Text Screen and *
|
|
* any variables that are *
|
|
* required to be pre-set. *
|
|
********************************
|
|
|
|
INIT LDA #149
|
|
JSR $FDED ; disable 80 colums
|
|
JSR TEXT ; set text mode
|
|
LDA #0
|
|
STA KEY
|
|
STA SPKEY
|
|
STA GP
|
|
STA XP
|
|
STA XP+1
|
|
LDA #<100
|
|
STA XPREQD
|
|
LDA #>100
|
|
STA XPREQD+1
|
|
LDA #10
|
|
STA HP
|
|
STA MAXHP
|
|
LDA #1
|
|
STA CLEVEL
|
|
RTS
|
|
|
|
********************************
|
|
* Variables for Jewel of *
|
|
* Kaldun, all are external: *
|
|
* GP: Gold Pieces *
|
|
* XP: Experience *
|
|
* XPREQD: Experience required*
|
|
* KEY: Number of keys *
|
|
* SPKEY: Special key flag *
|
|
* HP: Hit Points *
|
|
* MAXHP: Maximum HP *
|
|
* CLEVEL: Character level *
|
|
********************************
|
|
|
|
GP = $1C00
|
|
XP = $1C02
|
|
XPREQD = $1C04
|
|
KEY = $1C06
|
|
SPKEY = $1C07
|
|
HP = $1C08
|
|
MAXHP = $1C09
|
|
CLEVEL = $1C0A
|
|
CX = $1C0B
|
|
CY = $1C0C
|
|
XOFF = $1C0D
|
|
YOFF = $1C0F
|
|
MAPADDR = $1C11
|
|
OX = $1C13
|
|
OY = $1C14
|
|
DX = $1C15
|
|
DY = $1C16
|
|
AX = $1C17
|
|
AY = $1C18
|
|
X0 = $1C19
|
|
Y0 = $1C1A
|
|
X1 = $1C1B
|
|
Y1 = $1C1C
|
|
TEMP0 = $1C1D
|
|
WX = $1C1E
|
|
WY = $1C1F
|
|
ZX = $1C20
|
|
ZY = $1C21
|
|
TEMPX = $1C22
|
|
TEMPY = $1C23
|
|
XPLACE = $1C24
|
|
YPLACE = $1C26
|
|
NX = $1C28
|
|
NY = $1C29
|
|
CH:X = $1C2A
|
|
CH:Y = $1C2C
|
|
|
|
* Monster variables:
|
|
|
|
MONSMAX = 30
|
|
M_HP = $1C2E
|
|
M_TYPE = $1C4C
|
|
M_X = $1C6A
|
|
M_Y = $1C88
|
|
M_MOVE = $1CA6
|
|
M_X0 = $1CC4
|
|
M_X1 = $1CE2
|
|
M_Y0 = $1D00
|
|
M_LEVEL = $1D1E
|
|
|
|
* Add in all routines:
|
|
|
|
PAG
|
|
PUT input.output
|
|
PAG
|
|
PUT convert
|
|
PAG
|
|
PUT graphics
|
|
PAG
|
|
PUT math
|
|
PAG
|
|
PUT castles
|
|
PAG
|
|
PUT shapes
|
|
PAG
|
|
PUT title
|
|
PAG
|
|
PUT prolib
|
|
PAG
|
|
PUT filing
|
|
PAG
|
|
PUT places
|
|
PAG
|
|
PUT noise
|
|
PAG
|
|
PUT display
|
|
PAG
|
|
PUT monsters
|
|
PAG
|
|
PUT main.control
|
|
PAG
|
|
PUT story
|
|
|