******************************** * * * 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 (high bit on) ESCAPE = $9B ; ASCII for ( " " " ) 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 hpxpreq'd, go up level! :NOINCR RTS :CHECKLO LDA XP ; check lo byte of xp CMP XPREQD ; against xpreq'd BLT :NOINCR ; if xp100 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