First functional build with make, Merlin32, and AppleCommander!

This commit is contained in:
Rob 2016-09-21 21:28:17 -05:00
parent d24afe1c8b
commit 953fa9d1b5
28 changed files with 6031 additions and 24 deletions

View File

@ -2,13 +2,17 @@
include local.config
# Local stuff:
# > PGMS is a list of direct assembler targetrs
PGMS = jok.system.s newgame.s
# > SRC is a list of all source files used to trigger a rebuild
SRC = $(PGMS) castle-level-1.s castle-level-2.s variables.s
SRC = castle-level-1.s castles.s display.s filing.s graphics.s input.output.s jok.system.s \
math.mac.s monsters.s noise.s prolib.mac.s reset.s story.s variables.s \
castle-level-2.s convert.s endgame.s general.mac.s io.mac.s jewel.of.kaldun.s \
main.control.s math.s newgame.s places.s prolib.s shapes.s title.s jewel.end.game.s \
jok.segments.s
JOK_SYS = JOK.SYSTEM
JOK_PIC = JOK.TITLE.PIC
JOK_PIC = JEWEL.TITLE.PIC
NEWGAME = NEWGAME
JOK_PGM = JEWEL.OF.KALDUN
JOK_END = JEWEL.END.GAME
TMPL = template.po
APP = jewel-of-kaldun
DISK = $(APP).po
@ -18,6 +22,7 @@ ZIP = $(APP).zip
jok: $(SRC)
$(ASM) jok.system.s
$(ASM) newgame.s
$(ASM) jok.segments.s
cp $(TMPL) $(DISK)
cat $(JOK_SYS).bin | $(AC) -p $(DISK) $(JOK_SYS) SYS 0x2000
$(AC) -k $(DISK) $(JOK_SYS)
@ -25,11 +30,15 @@ jok: $(SRC)
$(AC) -k $(DISK) $(JOK_PIC)
cat $(NEWGAME).bin | $(AC) -p $(DISK) $(NEWGAME) BIN 0x1000
$(AC) -k $(DISK) $(NEWGAME)
cat $(JOK_PGM).bin | $(AC) -p $(DISK) $(JOK_PGM) BIN 0x6000
$(AC) -k $(DISK) $(JOK_PGM)
cat $(JOK_END).bin | $(AC) -p $(DISK) $(JOK_END) BIN 0x0800
$(AC) -k $(DISK) $(JOK_END)
$(AC) -ll $(DISK)
zip $(ZIP) $(DISK)
clean:
rm $(PGM) $(DISK) $(ZIP)
rm *_Output.txt _FileInformation.txt
rm $(JOK_SYS).bin $(NEWGAME).bin
rm $(JOK_SYS).bin $(NEWGAME).bin $(JOK_PGM).bin $(JOK_END).bin

375
castles.s Executable file
View File

@ -0,0 +1,375 @@
********************************
* Draw CASTLE1, CASTLE2, and *
* lower the drawbridge for *
* castle #1. *
* Uses: GENERAL.MAC *
********************************
********************************
* Draw King Aradeas' castle *
********************************
CASTLE1 ENT
LDX #5
JSR HCOLOR ; HCOLOR = 5
MOVB #159;EY ; set starting points:
NILW EX ; HPLOT 0,? TO 0,159
NILW SX
MOVB #5;CTR0
:0 JSR PARAPET1 ; draw 5 sets of parapets
DEC CTR0
BNE :0
MOVB #10;SY ; draw a bar 10 pixels wide
JSR PARAPET0 ; !
MOVB #0;SY ; !
JSR PARAPET0 ; !
MOVB #10;SY ; !
JSR PARAPET0 ; finished tower
MOVW #90;SX ; prepare for sloped left
MOVW #90;EX ; side of tower
MOVB #0;SY
MOVB #20;EY
JSR SLOPDOWN
MOVW #130;SX ; prepare for sloped right
MOVW #130;EX ; side of tower
MOVB #0;SY
JSR SLOPUP
LDX #7 ; HCOLOR = 7
JSR HCOLOR
MOVB #40;SY ; and prepare for drawing the
NILW SX ; outline of castle
MOVW #10;EX
MOVB #40;EY
MOVB #5;CTR0
:1 JSR OUTLINE1 ; draw outline of parapets
DEC CTR0
BNE :1
MOVW #100;SX ; begin outlining the tower
MOVB #159;SY
MOVW #100;EX
MOVB #30;EY
JSR DRAWLINE
MOVW #90;EX
MOVB #20;EY
JSR LINETO
MOVB #0;EY
JSR LINETO
MOVB #0;SY
MOVW #90;SX
MOVW #100;EX
MOVB #2;CTR0
:4 JSR OUTLINE1 ; now outlining upper parapets
DEC CTR0 ; of the tower
BNE :4
MOVW #140;EX ; and finish off the tower.
JSR LINETO
MOVB #20;EY
JSR LINETO
MOVW #130;EX
MOVB #31;EY
JSR LINETO
MOVB #159;EY
JSR LINETO
NILW SX ; draw the bottom line.
MOVB #159;SY
MOVW #279;EX
JSR DRAWLINE
RTS
********************************
* Draw the Castle of Kaldun. *
********************************
CASTLE2 LDX #5
JSR HCOLOR
MOVB #159;EY
MOVW #80;EX
MOVB #70;SY
MOVW #80;SX
JSR PARAPET0
MOVB #60;SY
JSR PARAPET0
MOVB #70;SY
JSR PARAPET0
MOVB #100;SY
JSR PARAPET0
JSR PARAPET0
MOVB #5;CTR0
:0 JSR PARAPET2
DEC CTR0
BNE :0
MOVW #70;SX
MOVW #70;EX
MOVB #60;SY
MOVB #80;EY
JSR SLOPDOWN
MOVB #90;EY
MOVW #110;SX
MOVW #110;EX
JSR SLOPUP
LDX #7
JSR HCOLOR
MOVB #159;SY
MOVB #159;EY
NILW SX
MOVW #279;EX
JSR DRAWLINE
MOVW #45;SX
MOVB #125;EY
MOVW #80;EX
JSR DRAWLINE
MOVB #159;SY
MOVW #80;SX
MOVW #80;EX
MOVB #90;EY
JSR DRAWLINE
MOVW #70;EX
MOVB #80;EY
JSR LINETO
MOVB #60;EY
JSR LINETO
MOVW #70;SX
MOVB #60;SY
MOVW #80;EX
JSR OUTLINE1
JSR OUTLINE1
MOVW #120;EX
JSR LINETO
MOVB #80;EY
JSR LINETO
MOVW #110;EX
MOVB #90;EY
JSR LINETO
MOVB #100;EY
JSR LINETO
MOVW #130;EX
JSR LINETO
MOVW #130;SX
MOVB #100;SY
MOVW #130;EX
MOVB #90;EY
MOVB #5;CTR0
:1 JSR OUTLINE2
DEC CTR0
BNE :1
MOVW #80;SX
MOVB #155;SY
MOVW #279;EX
MOVB #155;EY
MOVB #11;CTR0
:2 JSR LAYERS2
DEC CTR0
BNE :2
MOVW #110;EX
JSR LAYERS2
JSR LAYERS2
JSR LAYERS2
MOVW #75;SX
MOVW #115;EX
JSR LAYERS2
MOVW #70;SX
MOVW #120;EX
JSR LAYERS2
JSR LAYERS2
MOVW #80;SX
MOVB #81;SY
MOVW #80;EX
MOVB #84;EY
JSR BRICKS2
MOVW #90;SX
MOVB #76;SY
MOVW #90;EX
MOVB #79;EY
JSR BRICKS2
MOVW #100;SX
MOVB #81;SY
MOVW #100;EX
MOVB #84;EY
JSR BRICKS2
MOVW #110;SX
MOVB #76;SY
MOVW #110;EX
MOVB #79;EY
JSR DRAWLINE
MOVB #9;CTR0
:3 MOVB #106;SY
MOVB #109;EY
JSR BRICKS2
ADDW SX;#10;SX
MOVW SX;EX
MOVB #111;SY
MOVB #114;EY
JSR BRICKS2
ADDW SX;#10;SX
MOVW SX;EX
DEC CTR0
BNE :3
RTS
********************************
* General subroutines used by *
* castle drawing routines. *
********************************
BRICKS2 JSR DRAWLINE
ADDB SY;#10;SY
ADDB EY;#10;EY
LDA EY
CMP #160
BLT BRICKS2
RTS
LAYERS2 JSR DRAWLINE
SUBB SY;#5;SY
SUBB EY;#5;EY
RTS
OUTLINE2 JSR DRAWLINE
SUBB SY;#10;SY ; SY=SY-10
ADDW EX;#20;EX ; EX=EX+20
JSR DRAWLINE
ADDW SX;#20;SX ; SX=SX+20
ADDB EY;#10;EY ; EY=EY+10
JSR DRAWLINE
ADDB SY;#10;SY ; SY=SY+10
ADDW EX;#9;EX ; EX=EX+9 (not off page..)
JSR DRAWLINE
ADDW EX;#1;EX ; EX=EX+1 (correct ^^^)
ADDW SX;#10;SX ; SX=SX+10
SUBB EY;#10;EY ; EY=EY-10
RTS
OUTLINE1 JSR DRAWLINE
ADDB #10;SX;SX ; SX=SX+10
ADDB #10;EY;EY ; EY=EY+10
JSR DRAWLINE
ADDB #10;SY;SY ; SY=SY+10
ADDB #10;EX;EX ; EX=EX+10
JSR DRAWLINE
ADDB #10;SX;SX ; SX=SX+10
SUBB EY;#10;EY ; EY=EY-10
JSR DRAWLINE
SUBB SY;#10;SY ; SY=SY-10
ADDB #10;EX;EX ; EX=EX+10
RTS
DRAWLINE ENT
LDA SY ; draws a hi-res line
LDX SX ; using the AppleSoft
LDY SX+1 ; routines:
JSR HPOSN ; HPLOT SX,SY TO EX,EY
LINETO LDY EY
LDA EX
LDX EX+1
JSR HPLOTTO
RTS
PARAPET1 MOVB #40;SY ; draw the high part of
JSR PARAPET0 ; a parapet and then the
MOVB #50;SY ; low part of it.
JMP PARAPET0 ; (King Aradeas' castle)
PARAPET2 MOVB #90;SY ; draw parapets for
JSR PARAPET0 ; Kalduns' castle.
JSR PARAPET0
MOVB #100;SY
PARAPET0 MOVB #10;CTR1 ; draw a block of 10 lines
:0 JSR DRAWLINE ; (vertical)
JSR INCX
DEC CTR1
BNE :0
RTS
SLOPDOWN MOVB #10;CTR0
:0 JSR DRAWLINE
JSR INCX
INC EY
DEC CTR0
BNE :0
RTS
SLOPUP MOVB #10;CTR0
:0 JSR DRAWLINE
JSR INCX
DEC EY
DEC CTR0
BNE :0
RTS
INCX INC SX ; increase both
BNE :0 ; SX and EX by one.
INC SX+1
:0 INC EX
BNE :1
INC EX+1
:1 RTS
********************************
* Variables used by the Castle *
* drawing routines. *
********************************
SX ENT
HEX 0000
SY ENT
HEX 00
EX ENT
HEX 0000
EY ENT
HEX 00
CTR0 HEX 00
CTR1 HEX 00
********************************
* Lower King Aradeas' *
* drawbridge: *
********************************
DRAWBRID MOVB #0;CTR0
NILW SX
NILW EX
MOVB #131;SX
:0 LDX #7
JSR DISPLAYB
LDA #100
JSR MONWAIT
LDX #4
JSR DISPLAYB
INC CTR0
LDA CTR0
CMP #27
BLT :0
DEC CTR0 ; fall through to Display
LDX #7 ; Bridge routine...
DISPLAYB JSR HCOLOR
MOVB #159;SY
LDY CTR0
MOVB BRIDGEX,Y;EX
MOVB BRIDGEY,Y;EY
JSR DRAWLINE
MOVB #120;SY
LDY CTR0
MOVB CHAINX,Y;EX
MOVB CHAINY,Y;EY
JSR DRAWLINE
RTS
********************************
* Drawbridge points: *
********************************
BRIDGEX DFB 131,133,136,139,142,145,148,151,154
DFB 156,159,161,163,166,168,170,171,173
DFB 175,176,177,178,179,180,180,180,180
BRIDGEY DFB 109,109,109,109,110,111,112,113,114
DFB 116,117,119,121,123,125,127,130,132
DFB 135,138,140,143,146,149,152,155,159
CHAINX DFB 131,133,135,138,140,142,145,147,149
DFB 151,153,155,157,159,160,162,163,165
DFB 166,167,168,169,169,170,170,170,170
CHAINY DFB 119,119,119,119,120,120,121,122,123
DFB 124,125,127,128,130,132,134,136,138
DFB 140,142,144,146,149,151,153,156,159

137
convert.s Executable file
View File

@ -0,0 +1,137 @@
********************************
* Integer conversion routines. *
* Uses: IO *
* IO.MAC *
* MATH *
********************************
* External references
; jewel.of.kaldun.s
DATA EXT
********************************
* CONVERT converts a hex byte *
* to decimal and prints it in *
* the form: XXX. *
* I.E. $10 = 016 *
********************************
CONVERT LDA #"0"
LDY #3
:0 STA CONVSTR-1,Y
DEY
BNE :0
LDA (PTR),Y
:1 CMP #100
BLT :2
SBC #100
INC CONVSTR
JMP :1
:2 CMP #10
BLT :3
SBC #10
INC CONVSTR+1
JMP :2
:3 CMP #1
BLT :DONE
SBC #1
INC CONVSTR+2
JMP :3
:DONE LDY #0 ; kill leading zeros
:LOOP LDA CONVSTR,Y
CMP #"0"
BNE :JUSTIFY
INY
CPY #2 ; check only 1st two 0's
BLT :LOOP
:JUSTIFY CPY #0 ; Y contains how many 0's
BEQ :PRINTIT ; to "zap"
:JBEGIN LDX #0 ; the Jloop shifts data left
:JLOOP LDA CONVSTR+1,X
STA CONVSTR,X
INX
CPX #3
BLT :JLOOP
DEY
BNE :JBEGIN
:PRINTIT LDA DATA ; call output routine to
PHA ; print number string.
LDA DATA+1
PHA
PRINT CONVSTR
PLA
STA DATA+1
PLA
STA DATA
RTS
CONVSTR ASC "999"00
********************************
* Converts a hex word into a *
* printable string. *
* I.E. $FFFF = 65535 *
* $0000 = 00000 *
********************************
CONVWORD LDY #5
LDA #"0"
:0 STA CWSTR-1,Y
DEY
BNE :0
LDX #0
:AGAIN LDY #0
:LOOP LDA (PTR),Y
STA NUM1,Y
LDA NUMBERS,X
STA NUM2,Y
INX
INY
CPY #2
BLT :LOOP
STX XTEMP
JSR IDIV
LDX XTEMP
LDA #<NUM1
STA PTR
LDA #>NUM1
STA PTR+1
TXA
LSR
TAY
LDA RESULT
CLC
ADC CWSTR-1,Y
STA CWSTR-1,Y
CPX #10
BLT :AGAIN
:KILL LDY #0 ; kill leading zeros
:KILLOOP LDA CWSTR,Y
CMP #"0"
BNE :JUSTIFY
INY
CPY #4 ; check 1st 4 zeros
BLT :KILLOOP
:JUSTIFY CPY #0 ; Y contains how many 0's
BEQ :PRINTIT ; to "zap"
:JBEGIN LDX #0 ; the Jloop shifts data left
:JLOOP LDA CWSTR+1,X
STA CWSTR,X
INX
CPX #5
BLT :JLOOP
DEY ; check if another leading 0
BNE :JBEGIN ; must be killed.
:PRINTIT LDA DATA ; call output routine to
PHA ; print number string.
LDA DATA+1
PHA
PRINT CWSTR
PLA
STA DATA+1
PLA
STA DATA
RTS
CWSTR ASC "99999"00
NUMBERS DA 10000,1000,100,10,1

332
display.s Executable file
View File

@ -0,0 +1,332 @@
********************************
* Display map routines: *
********************************
* Default values:
WSCREEN = 24
HSCREEN = 20
WMAP = 48
HMAP = 32
********************************
* Get the value of map @ (x,y) *
********************************
MAPINDEX DEX
DEY
STX XOFF
STY YOFF
LDA #0
STA XOFF+1
STA YOFF+1
LDA MAPSW
BMI :NOMONS
*-------------------------------
LDY #0
:REPEAT LDA M_HP,Y ; if HP = 0, no monster at this
BEQ :CHECK ; location.
LDA M_LEVEL,Y ; check if monster is on the
CMP MAPADDR+1 ; correct level
BNE :CHECK
LDA M_X,Y ; check x-coordinate against
CMP XOFF ; map x-coordinate.
BNE :CHECK
LDA M_Y,Y ; check y-coordinate
CMP YOFF
BNE :CHECK
LDA XOFF ; ensure that map x and map y
ORA YOFF ; are not both 0 (no monster)
BEQ :CHECK
LDA M_TYPE,Y ; get the monster type!
STY MAP_MNUM
RTS ; have mons type, so exit
:CHECK INY
CPY #MONSMAX
BLT :REPEAT
*-------------------------------
:NOMONS IMULW YOFF;#WMAP;PTR
ADDW PTR;MAPADDR;PTR
LDY XOFF
LDA (PTR),Y
RTS
MAP_MNUM HEX 00
********************************
* Update Screen *
********************************
UPSCREEN MOVB X0;AX
MOVB Y0;AY
MOVB CX;X0
MOVB CY;Y0
MOVB CX;X1
MOVB CY;Y1
LDA #%10000000
STA CLRFLAG
LDA #%00000000
STA XORFLAG
:0 LDA Y0
CMP #2
BLT :1
DEC Y0
LDX CX
LDY Y0
JSR MAPCHECK
BCC :0
:1 LDA X0
CMP #2
BLT :2
DEC X0
LDX X0
LDY CY
JSR MAPCHECK
BCC :1
:2 LDA X1
CMP #WMAP+1
BGE :3
INC X1
LDX X1
LDY CY
JSR MAPCHECK
BCC :2
:3 LDA Y1
CMP #HMAP+1
BGE :4
INC Y1
LDX CX
LDY Y1
JSR MAPCHECK
BCC :3
:4 SEC
LDA Y1
SBC Y0
CMP #HSCREEN-1
BLT :5
SEC
LDA CY
SBC Y0
STA TEMP0
SEC
LDA Y1
SBC CY
CMP TEMP0
BLT :40
DEC Y1
JMP :4
:40 INC Y0
JMP :4
:5 SEC
LDA X1
SBC X0
CMP #WSCREEN-1
BLT :6
SEC
LDA CX
SBC X0
STA TEMP0
SEC
LDA X1
SBC CX
CMP TEMP0
BLT :50
DEC X1
JMP :5
:50 INC X0
JMP :5
:6 SUBB X1;X0;WX
SUBB Y1;Y0;WY
LDA WX
LSR
STA ZX
SEC
LDA #WSCREEN/2
SBC ZX
STA ZX
LDA WY
LSR
STA ZY
SEC
LDA #HSCREEN/2
SBC ZY
STA ZY
LDA OX
ORA OY
BPL :7
MOVB ZX;OX
MOVB ZY;OY
JSR HCLEAR
JMP :8
:7 LDA #%10000000 ; to erase old picture
STA XORFLAG ; of Meltok ...
LDA #%00000000
STA CLRFLAG
MOVB #2;SNUM
LDA CH:X+1 ; Should be current location
LDX CH:X ; of Meltok on screen.
LDY CH:Y ; Including "sliding" movement.
JSR DRAWSHAP ; Draw it
LDA #%00000000 ; Clear reverse flag
STA XORFLAG ; Done.
LDA #%10000000
STA CLRFLAG
SUBB AX;X0;DX
SUBB AY;Y0;DY
SUBB OX;DX;NX
SUBB OY;DY;NY
:70 LDA NX
BPL :71
JSR HRIGHT
INC NX
JMP :70
:71 LDA NY
BPL :72
JSR HDOWN
INC NY
JMP :71
:72 CLC
LDA NY
ADC WY
CMP #19
BLT :73
JSR HUP
DEC NY
JMP :72
:73 CLC
LDA NX
ADC WX
CMP #24
BLT :74
JSR HLEFT
DEC NX
JMP :73
:74 MOVB NX;ZX
MOVB NY;ZY
MOVB ZX;OX
MOVB ZY;OY
:8 MOVB Y0;TEMPY
:_NEXTY MOVB X0;TEMPX
:_NEXTX LDY TEMPY
LDX TEMPX
JSR MAPINDEX
CMP #15 ; show monsters too!
BLT :SHGOOD
CMP #98
BNE :NEXTSH1
LDA #1
JMP :SHGOOD
:NEXTSH1 CMP #99
BNE :NEXTSH2
LDA #6
JMP :SHGOOD
:NEXTSH2 CMP #97
BNE :NEXTSH3
LDA #4
JMP :SHGOOD
:NEXTSH3 CMP #100
BLT :NEXTSH4
LDA #0
JMP :SHGOOD
:NEXTSH4 CMP #22 ; barred door
BEQ :SHGOOD
:NEXTSH5 LDA #15 ; circle -- for errors
:SHGOOD STA SNUM
NILB XPLACE+1
NILB YPLACE+1
MOVB ZX;XPLACE
MOVB ZY;YPLACE
LDY #3
:MUL8 ASL XPLACE
ROL XPLACE+1
ASL YPLACE
ROL YPLACE+1
DEY
BNE :MUL8
LDA SNUM
CMP #12
BLT :MOREYET
CMP #14+1
BGE :MOREYET
LDY MAP_MNUM
LDA YPLACE
STA M_Y0,Y
LDA XPLACE
STA M_X0,Y
LDA XPLACE+1
STA M_X1,Y
:MOREYET LDY YPLACE
LDX XPLACE
LDA XPLACE+1
JSR DRAWSHAP
LDA TEMPX
CMP CX
BNE :99
LDA TEMPY
CMP CY
BNE :99
LDA #%00000000
STA CLRFLAG
LDA #%10000000
STA XORFLAG
MOVB #2;SNUM
LDY YPLACE
LDX XPLACE
LDA XPLACE+1
JSR DRAWSHAP
MOVW XPLACE;CH:X
MOVW YPLACE;CH:Y
LDA #%00000000
STA XORFLAG
LDA #%10000000
STA CLRFLAG
:99 INC ZX
INC TEMPX
LDA TEMPX
CMP #WMAP
BEQ :9999
BGE :100
:9999 CMP X1
BLT :NEXTX
BEQ :NEXTX
:100 SUBB ZX;WX;ZX
DEC ZX
INC ZY
INC TEMPY
LDA TEMPY
CMP #HMAP
BEQ :1111
BGE :EXIT
:1111 CMP Y1
BLT :NEXTY
BEQ :NEXTY
JMP :EXIT
:NEXTY JMP :_NEXTY
:NEXTX JMP :_NEXTX
:EXIT RTS
********************************
* Map Check verifies that the *
* check square is valid to *
* see through. *
********************************
MAPSW HEX 00
MAPCHECK LDA #$80 ; special switch to ignore the
STA MAPSW ; monsters!
JSR MAPINDEX ; get data
PHA ; save data
LDA #0 ; reset switch to normal
STA MAPSW ; ...
PLA ; restore data and work with it:
CMP #99
BGE :GOOD
CMP #0
BEQ :GOOD
CMP #6
BLT :BAD
CMP #12 ; for monsters #12-#14
BGE :BAD
:GOOD CLC
RTS
:BAD SEC
RTS

320
endgame.s Executable file
View File

@ -0,0 +1,320 @@
********************************
* End Game routines: *
* death *
* and WINNING! *
********************************
* External routines
; graphics.s
HGRCLEAR EXT
HADDR EXT
HADDR2 EXT
SETHGR EXT
; input.output.s
PRSTR EXT
CBOT3 EXT
CLRSCRN EXT
TEXT EXT
TEXTADDR EXT
CSTRING EXT
CLRMID EXT
GETRET EXT
; title.s
WAIT EXT
; shapes.s
CLRFLAG EXT
XORFLAG EXT
SNUM EXT
DRAWSHAP EXT
; noise.s
DONOISE EXT
DURATION EXT
FREQUENC EXT
VOLUME EXT
; castles.s
SX EXT
SY EXT
EX EXT
EY EXT
DRAWLINE EXT
CASTLE1 EXT
********************************
* This is the death routine. *
********************************
THEDEATH ENT
JSR HGRCLEAR
JSR GREENBCK
LDY #10
JSR PAUSE
PRINT DEATH1
JSR RAISTONE
LDY #15
JSR PAUSE
PRINT DEATH2
JSR DRAWRIP
LDY #10
JSR PAUSE
JSR CBOT3
RTS
DEATH1 HEX 825583
ASC "... You're dead! ..."00
DEATH2 HEX 825583
ASC "All good things must"8D83
ASC "come to and end!"00
********************************
* Pause for a bit. *
********************************
PAUSE LDA #255
JSR WAIT
DEY
BNE PAUSE
RTS
********************************
* Do the green background for *
* death scene. *
********************************
GREENBCK LDA #90
STA HLINE
LDA #92
STA HLINE2
:LOOP JSR HADDR
JSR HADDR2
BCS :ALLDONE
JSR GREEN12
ADDB #4;HLINE;HLINE
ADDB #4;HLINE2;HLINE2
LDA HLINE2
CMP #159
BLT :LOOP
:ALLDONE RTS
********************************
* Do two lines of green. *
********************************
GREEN12 LDY #0
:1 LDX #0
:0 LDA GREEN1,X
STA (HPTR),Y
LDA GREEN2,X
STA (HPTR2),Y
INX
INY
CPX #8
BLT :0
CPY #40
BLT :1
RTS
GREEN1 HEX 204102050A142850
GREEN2 HEX 0A14285020410205
********************************
* Draw R. I. P. on gravestone. *
********************************
DRAWRIP LDA #%00000000 ; prepare to draw R. I. P.
STA CLRFLAG
LDA #%10000000
STA XORFLAG
MOVB #19;SNUM ; Draw "R"
LDY #100
LDX #<115
LDA #>115
JSR DRAWSHAP
MOVB #16;SNUM ; Draw "."
LDY #103
LDX #<121
LDA #>121
JSR DRAWSHAP
JSR DO_THUMP ; make noise
MOVB #20;SNUM ; Draw "I"
LDY #100
LDX #<135
LDA #>135
JSR DRAWSHAP
MOVB #16;SNUM ; Draw "."
LDY #103
LDX #<141
LDA #>141
JSR DRAWSHAP
JSR DO_THUMP ; make noise
MOVB #21;SNUM ; Draw "P"
LDY #100
LDX #<155
LDA #>155
JSR DRAWSHAP
MOVB #16;SNUM ; Draw "."
LDY #103
LDX #<159
LDA #>159
JSR DRAWSHAP
JSR DO_THUMP
RTS
********************************
* Make a thumping sound. *
********************************
DO_THUMP LDY #35 ; make a sound similar to
:LOOP BIT SPEAKER ; typical "thump"
LDA #45
JSR WAIT
DEY
BNE :LOOP
LDY #2
LDA #255 ; pause for effect.
JSR WAIT
RTS
********************************
* Routine to raise gravestone *
* out of the ground. *
********************************
RAISTONE LDY #140
:LOOP STY :YSAVE
JSR DRAWSTON
MOVB #15;VOLUME
MOVB #1;DURATION
MOVB #150;FREQUENC
JSR DONOISE
LDY :YSAVE
DEY
CPY #70
BGE :LOOP
RTS
:YSAVE HEX 00
********************************
* Routine to draw gravestone *
* from Y to 140. *
********************************
DRAWSTON STY SY ; set starting and
STY EY ; ending y positions
MOVB #0;:COUNTER ; init counter
LDX #3
JSR HCOLOR ; HCOLOR=3
:LOOP MOVW #104;SX ; default starting and
MOVW #174;EX ; ending x positions
LDA :COUNTER ; check counter
CMP #15 ; if < 15 then use data
BGE :DRAW ; if =>15 then use default
ASL ; multiply by 2
TAY
LDA GRAVSTON,Y ; set endpoints
STA SX ; for hline
LDA GRAVSTON+1,Y
STA EX
:DRAW JSR DRAWLINE ; use drawline routine
BIT SPEAKER ; buzz
INC :COUNTER ; counter+= 1
LDA :COUNTER ; exit early -- no need
CMP #16 ; to draw the WHOLE gravestone
BGE :EXIT ; again!
INC SY ; sy+= 1
INC EY ; ey+= 1
LDA SY ; check if y is still
CMP #141 ; < 141.
BLT :LOOP ; if y<141 then repeat
:EXIT RTS
:COUNTER HEX 00 ; used for offset in table
********************************
* Data for gravestone. *
********************************
GRAVSTON DFB 128,150 ; for y=70 (final position)
DFB 123,155 ; y=71
DFB 120,158 ; y=72
DFB 118,160 ; y=73
DFB 116,162 ; y=74
DFB 114,164 ; y=75
DFB 112,166 ; y=76
DFB 111,167 ; y=77
DFB 110,168 ; y=78
DFB 108,170 ; y=79
DFB 107,171 ; y=80
DFB 107,171 ; y=81
DFB 106,172 ; y=82
DFB 105,173 ; y=83
DFB 105,173 ; y=84
GAMEWON ENT
JSR CLRSCRN
JSR TEXT
LDA #11
STA TLINE
JSR TEXTADDR
CENTER CONGRATS
JSR HGRCLEAR
JSR CASTLE1
LDY #15
:DELAY LDA #255
JSR WAIT
DEY
BNE :DELAY
JSR CLRMID
JSR SETHGR
PRINT GAMEWIN1
JSR GETRET
JSR CLRMID
PRINT GAMEWIN2
JSR GETRET
JSR CLRMID
PRINT GAMEWIN3
JSR GETRET
JSR CLRMID
JSR TEXT
PRINT GAMEWIN4
JSR GETRET
JSR CLRMID
PRINT GAMEWIN5
JSR GETRET
JSR CLRMID
JSR SETHGR
PRINT GAMEWIN6
RTS
CONGRATS ASC "Contragulations!!"00
GAMEWIN1 HEX 54
ASC "As you return from your successful"8D
ASC "journey to retrieve the Jewel of Kaldun,"8D
ASC "the kingdom stirs with renewed hope!"00
GAMEWIN2 HEX 54
ASC "The king, upon hearing of your return,"8D
ASC "prepares a royal reception in honor of"8D
ASC "the kingdoms hero."00
GAMEWIN3 HEX 54
ASC "However, throughout the whole affair,"8D
ASC "the king appears troubled. By what, you"8D
ASC "do know."00
GAMEWIN4 HEX 43
ASC "Later, while the two of you relax in the"8D
ASC "plush surroundings, you inquire why he"8D
ASC "looked troubled."8D
HEX 8D
ASC "'Alas,' he replies, 'the whole kingdom"8D
ASC "rejoices at your wonderful success."8D
ASC "However, my daughter is another matter."8D
ASC "You see, she is a particularly strong-"8D
ASC "willed woman. I'm afraid that she is"8D
ASC "too dear to me to force her into an un-"8D
ASC "wanted marriage. And, I also don't wish"8D
ASC "for you to be forced to marry.'"8D
HEX 8D
ASC "You breathe a sigh of relief, that is"8D
ASC "not really your style. You tell the"8D
ASC "king that you understand, and was think-"8D
ASC "ing the same thing."00
GAMEWIN5 HEX 43
ASC "The king answers, 'I like you kid, and"8D
ASC "you definately are good material. So,"8D
ASC "here is the deal: I will give you a"8D
ASC "dutchy.'"8D
HEX 8D
ASC "Wow, your own dutchy... now if you can"8D
ASC "just figure out that last comment. When"8D
ASC "you left, the king mumbled, 'For the"8D
ASC "sake of the kingdom, I hope I have done"8D
ASC "the right thing...'"00
GAMEWIN6 HEX 54
ASC "Stay tuned for part two!"00

85
filing.s Executable file
View File

@ -0,0 +1,85 @@
********************************
* Filer Module: Load and Save *
* game states. *
* Uses: PROLIB *
* PROLIB.MAC *
* IO *
* IO.MAC *
********************************
BUFFER = $BB00
GAMEDATA = $1000
********************************
* Loader: Loads a new game *
* or an old game. Selected by *
* the user. *
********************************
LOADER PRINT LOADSTR
MOVB #0;LOADSTAT
STA KEYSTROB
:AGAIN LDA KEYBOARD
BPL :AGAIN
STA KEYSTROB
CMP #"N"
BEQ :NEWGAME
CMP #"n"
BEQ :NEWGAME
CMP #"O"
BEQ :OLDGAME
CMP #"o"
BNE :AGAIN
:OLDGAME JSR CLINE
PRINT OLDSTR
MOVB #1;LOADSTAT
@OPEN #OLDNAME;#BUFFER;REFNUM
JMP :LOAD
:NEWGAME JSR CLINE
PRINT NEWSTR
@OPEN #NEWNAME;#BUFFER;REFNUM
:LOAD @READ REFNUM;#GAMEDATA;#$D3C
@CLOSE REFNUM
JSR CLINE
RTS
LOADSTR HEX 5783
ASC "Play New or Old game? (N/O)"00
OLDSTR HEX 5783
ASC "... Loading old game ..."00
NEWSTR HEX 5783
ASC "... Loading new game ..."00
OLDNAME STR "OLDGAME"
NEWNAME STR "NEWGAME"
REFNUM HEX 00
LOADSTAT HEX 00
********************************
* Saves a game currently in *
* play. *
********************************
SAVER PRINT SAVESTR
JSR GETYN
BCC :YUP
JMP :NOPE
:YUP PRINT SAVESTR2
@DESTROY #OLDNAME
CMP #0 ; no error?
BEQ :FINISH ; ok!
CMP #$46 ; file not found?
BEQ :FINISH ; ok!
JMP _MLICHK ; unknown error
:FINISH @CREATE #OLDNAME;#$C3;#$F6;#$1000;#$01
@OPEN #OLDNAME;#BUFFER;REFNUM
@WRITE REFNUM;#GAMEDATA;#$D3C
@FLUSH REFNUM
@CLOSE REFNUM
:NOPE JSR CLINE
RTS
SAVESTR HEX 5783
ASC "Do you wish to save the game?"00
SAVESTR2 HEX 825783
ASC "... Saving: Please Wait ..."00

74
general.mac.s Executable file
View File

@ -0,0 +1,74 @@
********************************
* General Macros used by *
* Jewel of Kaldun source *
********************************
MOVB MAC
LDA ]1
STA ]2
EOM
MOVW MAC
MOVB ]1;]2
IF #=]1
MOVB ]1/$100;]2+1
ELSE
MOVB ]1+1;]2+1
FIN
EOM
NILB MAC
LDA #0
STA ]1
EOM
NILW MAC
LDA #0
STA ]1
STA ]1+1
EOM
ADDB MAC
CLC
LDA ]1
ADC ]2
STA ]3
EOM
ADDW MAC
ADDB ]1;]2;]3
IF #=]1
LDA ]1/$100
ELSE
LDA ]1+1
FIN
IF #=]2
ADC ]2/$100
ELSE
ADC ]2+1
FIN
STA ]3+1
EOM
SUBB MAC
SEC
LDA ]1
SBC ]2
STA ]3
EOM
SUBW MAC
SUBB ]1;]2;]3
IF #=]1
LDA ]1/$100
ELSE
LDA ]1+1
FIN
IF #=]2
SBC ]2/$100
ELSE
SBC ]2+1
FIN
STA ]3+1
EOM

473
graphics.s Executable file
View File

@ -0,0 +1,473 @@
********************************
* High-Resolution Graphics *
* routines for Jewel of Kaldun *
* Uses: MATH *
********************************
SETHGR ENT
STA $C057
STA $C053
STA $C050
RTS
********************************
* Turn on the hi-res screen *
* and clear it. *
********************************
HGR JSR SETHGR
HGRCLEAR ENT
LDA #191
STA HLINE
:0 JSR HADDR
BCC :CONT
RTS
:CONT LDA #0
LDY #39
:1 STA (HPTR),Y
DEY
BPL :1
DEC HLINE
JMP :0
********************************
* Store Hi-Res Screen @ $4000. *
********************************
HSTORE MOVW #$2000;HPTR
MOVW #$4000;HPTR2
:YLOOP LDY #0
:LOOP LDA (HPTR),Y
STA (HPTR2),Y
INY
BNE :LOOP
INC HPTR2+1
INC HPTR+1
LDA HPTR+1
CMP #$40
BLT :YLOOP
RTS
********************************
* Restore hires screen to 4000 *
********************************
HRESTORE MOVW #$4000;HPTR
MOVW #$2000;HPTR2
:YLOOP LDY #0
:LOOP LDA (HPTR),Y
STA (HPTR2),Y
INY
BNE :LOOP
INC HPTR+1
INC HPTR2+1
LDA HPTR2+1
CMP #$40
BLT :YLOOP
RTS
********************************
* Clear the scrolling portion *
* of the hi-res screen. *
********************************
HCLEAR LDA #159
STA HLINE
:1 JSR HADDR
BCS :END
LDY #28
LDA #0
:0 STA (HPTR),Y
DEY
BPL :0
DEC HLINE
JMP :1
:END RTS
********************************
* Scroll the hi-res screen to *
* the left two pixels. *
********************************
HLEFT LDA #159
STA HLINE
:1 JSR HADDR
BCS :END
LDY #1
:0 LDA (HPTR),Y
AND #%01111110
LSR
STA TEMP
INY
LDA (HPTR),Y
AND #%00000001
ASL
ASL
ASL
ASL
ASL
ASL
ORA TEMP
DEY
DEY
STA (HPTR),Y
INY
INY
CPY #28
BLT :0
LDY #28
LDA (HPTR),Y
AND #%01111110
LSR
DEY
STA (HPTR),Y
INY
LDA #0
STA (HPTR),Y
DEC HLINE
JMP :1
:END RTS
********************************
* Scroll the hi-res screen to *
* the right two pixels. *
********************************
HRIGHT LDA #159
STA HLINE
:1 JSR HADDR
BCS :END
LDY #26
:0 LDA (HPTR),Y
AND #%01000000
LSR
LSR
LSR
LSR
LSR
LSR
STA TEMP
INY
LDA (HPTR),Y
AND #%00111111
ASL
ORA TEMP
INY
STA (HPTR),Y
DEY
DEY
DEY
CPY #-1
BNE :0
LDY #0
LDA (HPTR),Y
AND #%00111111
ASL
INY
STA (HPTR),Y
DEY
TYA
STA (HPTR),Y
DEC HLINE
LDY #28
LDA (HPTR),Y
AND #%00001111 ; chop off rightmost bits
STA (HPTR),Y
JMP :1
:END RTS
********************************
* Scroll the hi-res screen up *
* two pixels. *
********************************
HUP LDA #0
STA HLINE2
LDA #8
STA HLINE
:0 JSR HADDR2
JSR HADDR
BCS :END
LDY #28
:1 LDA (HPTR),Y
STA (HPTR2),Y
DEY
BPL :1
INC HLINE2
INC HLINE
JMP :0
:END LDY #28
LDA #0
:2 STA (HPTR2),Y
DEY
BPL :2
INC HLINE2
JSR HADDR2
BCC :END
RTS
********************************
* Scroll the hi-res screen *
* down two pixels. *
********************************
HDOWN LDA #159
STA HLINE2
LDA #151
STA HLINE
:0 JSR HADDR2
JSR HADDR
BCS :END
LDY #28
:1 LDA (HPTR),Y
STA (HPTR2),Y
DEY
BPL :1
DEC HLINE2
DEC HLINE
JMP :0
:END LDY #28
LDA #0
:2 STA (HPTR2),Y
DEY
BPL :2
DEC HLINE2
JSR HADDR2
BCC :END
RTS
********************************
* This routine calculates the *
* hi-res address of line that *
* is stored in LINE via the *
* look-up tables. *
********************************
HADDR ENT
LDA HLINE
CMP #192
BCS :END
TAY
LDA HLOW,Y
STA HPTR
LDA HHIGH,Y
STA HPTR+1
CLC
:END RTS
********************************
* This routine calculates the *
* hi-res address of line that *
* is stored in LINE2 via the *
* look-up tables. *
********************************
HADDR2 ENT
LDA HLINE2
CMP #192
BCS :END
TAY
LDA HLOW,Y
STA HPTR2
LDA HHIGH,Y
STA HPTR2+1
CLC
:END RTS
********************************
* Low-order bytes of hi-res *
* row address: *
********************************
HLOW HEX 0000000000000000
HEX 8080808080808080
HEX 0000000000000000
HEX 8080808080808080
HEX 0000000000000000
HEX 8080808080808080
HEX 0000000000000000
HEX 8080808080808080
HEX 2828282828282828
HEX A8A8A8A8A8A8A8A8
HEX 2828282828282828
HEX A8A8A8A8A8A8A8A8
HEX 2828282828282828
HEX A8A8A8A8A8A8A8A8
HEX 2828282828282828
HEX A8A8A8A8A8A8A8A8
HEX 5050505050505050
HEX D0D0D0D0D0D0D0D0
HEX 5050505050505050
HEX D0D0D0D0D0D0D0D0
HEX 5050505050505050
HEX D0D0D0D0D0D0D0D0
HEX 5050505050505050
HEX D0D0D0D0D0D0D0D0
********************************
* High-order bytes of hi-res *
* row address: *
********************************
HHIGH HEX 2024282C3034383C
HEX 2024282C3034383C
HEX 2125292D3135393D
HEX 2125292D3135393D
HEX 22262A2E32363A3E
HEX 22262A2E32363A3E
HEX 23272B2F33373B3F
HEX 23272B2F33373B3F
HEX 2024282C3034383C
HEX 2024282C3034383C
HEX 2125292D3135393D
HEX 2125292D3135393D
HEX 22262A2E32363A3E
HEX 22262A2E32363A3E
HEX 23272B2F33373B3F
HEX 23272B2F33373B3F
HEX 2024282C3034383C
HEX 2024282C3034383C
HEX 2125292D3135393D
HEX 2125292D3135393D
HEX 22262A2E32363A3E
HEX 22262A2E32363A3E
HEX 23272B2F33373B3F
HEX 23272B2F33373B3F
********************************
* Graphically displays the *
* amount of Gold Pieces *
* character has. *
********************************
STATUSGP LDY #38
LDA GP+1
BNE LOTAGOLD
LDA #160
SEC
SBC GP
BCS STATUS
LOTAGOLD LDA #0
STATUS STA TEMP
STY YTEMP
LDA #160
STA HLINE
:1 JSR HADDR
BCS :EXIT
LDY YTEMP
LDA COLORS-29,Y
STA (HPTR),Y
INY
LDA COLORS-29,Y
STA (HPTR),Y
DEC HLINE
LDA HLINE
CMP TEMP
BGE :1
:3 JSR HADDR
BCC :2
:EXIT RTS
:2 LDA #0
LDY YTEMP
STA (HPTR),Y
INY
STA (HPTR),Y
DEC HLINE
JMP :3
********************************
* The colors associated with *
* the various statuses. *
********************************
COLORS HEX D5AA00552A00
HEX AAD5002A55
********************************
* Graphically displays the *
* status of your keys. *
********************************
STATUSKY LDY #29
LDX KEY
LDA SPKEY
BEQ :0
INX
:0 LDA #160
:1 CPX #0
BEQ :DONE
SEC
SBC #10
DEX
CMP #0
BNE :1
:DONE JMP STATUS
********************************
* Graphically display the *
* percent of hitpoints *
* remaining. *
********************************
STATUSHP LDA #0
STA NUM1+1
STA NUM2+1
LDA #160
STA NUM1
LDA HP
STA NUM2
JSR IMUL
LDA RESULT
STA NUM1
LDA RESULT+1
STA NUM1+1
LDA #0
STA NUM2+1
LDA MAXHP
STA NUM2
JSR IDIV
SEC
LDA #160
SBC RESULT
BCS :0
LDA #0
:0 LDY #32
JMP STATUS
********************************
* Graphically display the *
* percent of experience *
* points required. *
********************************
* problems occur here because when the player needs more
* than (or equal amount of) 800 XP, multiplied number
* grows larger than the 16 bit number allows (65,536)!
* Old routine: [[ (XP * 160) / XPREQD = graphics X ]]
* MOVW XP;NUM1
* MOVW #160;NUM2
* JSR IMUL
* MOVW RESULT;NUM1
* MOVW XPREQD;NUM2
* JSR IDIV
* New routine: [[ ( (1600/XPREQD) * (XP/10) ) ]]
* it's not quite as accurate, but at least the graphics bar
* will work for the higher levels!
STATUSXP MOVW #1600;NUM1
MOVW XPREQD;NUM2
JSR IDIV ; RESULT = 1600 / XPREQD
MOVW RESULT;NUM1
MOVW XP;NUM2
JSR IMUL ; RESULT = RESULT * XP
MOVW RESULT;NUM1
MOVW #10;NUM2
JSR IDIV ; RESULT = RESULT / 10
LDA RESULT+1
BNE :1
LDA RESULT
CMP #160
BLT :0
:1 LDA #0
:0 LDY #35
JMP STATUS

335
input.output.s Executable file
View File

@ -0,0 +1,335 @@
********************************
* Input/Output Routines *
* Uses: IO.MAC *
********************************
* External references
; jewel.of.kaldun.s
DATA EXT
********************************
* Turn on text screen. *
********************************
TEXT ENT
STA $C056
STA $C054
STA $C051
RTS
********************************
* Routine to pause for RETURN *
* to be pressed. *
********************************
GETRET ENT
LDA #23
STA TLINE
JSR TEXTADDR
LDA ESCABORT
BMI :ESCCR
CENTER GRSTR
JMP :XXX
:ESCCR MOVB #0;TTAB
PRINT ESCCRSTR
:XXX JSR M:GETKEY
BIT ESCABORT
BPL :YYY
CMP #$9B ; ESCAPE
BEQ :EXIT
:YYY CMP #$8D ; RETURN
BNE :XXX
:EXIT LDA #23
STA TLINE
JSR TEXTADDR
LDA KEYBOARD
CMP #$9B
BNE :LEAVE
PLA ; CLEAR STACK OF ADDRESS
PLA
:LEAVE LDA #%00000000
STA ESCABORT
STA KEYSTROB ; clear keypress
JMP CLINE
ESCABORT HEX 00
GRSTR ASC "Press <RETURN> to continue"00
ESCCRSTR ASC "<RETURN> to continue or <ESCAPE> to stop"00
********************************
* Routine to wait for a Y or *
* a N. *
********************************
GETYN JSR M:GETKEY
CMP #"Y"
BEQ :YES
CMP #"y"
BEQ :YES
CMP #"n"
BEQ :NO
CMP #"N"
BNE GETYN
:NO SEC
RTS
:YES CLC
RTS
********************************
* Routine to center a string. *
********************************
CSTRING ENT
LDY #0
:0 LDA (DATA),Y
BEQ :FINISH
CMP #$8D
BEQ :FINISH
INY
BNE :0
:FINISH TYA
LSR
STA TEMP
SEC
LDA #20
SBC TEMP
STA TTAB
JSR PRSTR
********************************
* Print a carriage return. *
********************************
PRCR INC TLINE
JSR TEXTADDR
LDY #0
STY TTAB
LDA TLINE
CMP #24
BCC END1
STY TLINE
END1 RTS
********************************
* The following routine(s) *
* handle printing with special *
* control characters: *
* *
* ^I ($89) Inverse mode *
* ^N ($8E) Normal mode *
* ^M ($8D) Carriage Return *
* ^@ ($80) Print Hex number *
* that is stored *
* at the pointer *
* location in Dec. *
* ^A ($81) Print Hex WORD *
* that is stored *
* at the pointer *
* location in Dec. *
* ^B ($82) To clear bottom *
* 3 lines. *
* ^C ($83) To center the *
* following line *
* of text on scrn. *
* %00xxxxxx Htab + 1 *
* %01xxxxxx Vtab *
* *
* All other characters lower *
* than a SPACE ($A0) are *
* ignored. *
********************************
* MASK byte and PTR increment routine:
MASK HEX FF
DATAINC INC DATA
BNE END2
INC DATA+1
END2 RTS
* This is the Print routine:
PRSTR ENT
LDY #0
LDA (DATA),Y
BEQ END2
BMI :0
CMP #%00111111
BGE :VTAB
STA TTAB
DEC TTAB
:NEXT JSR DATAINC
JMP PRSTR
:VTAB AND #%00111111
:V0 STA TLINE
JSR TEXTADDR
BCC :NEXT
LDA #0
BEQ :V0
:0 CMP #$89
BNE :1
LDA #%00111111
:MASK STA MASK
BNE :NEXT
:1 CMP #$8E
BNE :2
LDA #%11111111
BNE :MASK
:2 CMP #$8D
BNE :3
:NEWLINE JSR PRCR
JMP :NEXT
:3 CMP #$80
BNE :4
JSR DATAINC
LDA (DATA),Y
STA PTR
JSR DATAINC
LDA (DATA),Y
STA PTR+1
JSR CONVERT
JMP :NEXT
:4 CMP #$83
BNE :5
LDY #1 ; pass #$83
:40 LDA (DATA),Y
CMP #$A0
BLT :41
INY
BNE :40
:41 TYA
LSR
STA TEMP
SEC
LDA #20
SBC TEMP
STA TTAB
JMP :NEXT
:5 CMP #$82
BNE :6
JSR CBOT3
JMP :NEXT
:6 CMP #$81
BNE :7
JSR DATAINC
LDA (DATA),Y
STA PTR
JSR DATAINC
LDA (DATA),Y
STA PTR+1
JSR CONVWORD
JMP :NEXT
:7 CMP #$A0
BLT :NEXTPTR
BIT AUTOCAPS
BPL :GO
JSR CHARCAPS ; capitalize letter
:GO LDY TTAB
AND MASK
STA (TPTR),Y
STA SPEAKER
INY
STY TTAB
CPY #40
BLT :NEXTPTR
LDY #0
STY TTAB
:NEXTPTR JMP :NEXT
AUTOCAPS HEX 00 ; default: Mixed mode
********************************
* CLINE clears the current *
* line pointed to by TPTR. *
********************************
CLINE LDY #40
LDA #$A0
:0 STA (TPTR),Y
DEY
BPL :0
RTS
********************************
* CLRMID clears middle portion *
* of text screen. Lines 1-22. *
* (line 0 = vtab 1) *
********************************
CLRMID ENT
LDA #22
STA TLINE
:0 JSR TEXTADDR
JSR CLINE
DEC TLINE
BNE :0
RTS
********************************
* CBOT3 clears the bottom *
* three (3) lines of the text *
* screen. *
********************************
CBOT3 ENT
LDA #21
BNE CLRSCRN0
********************************
* Clears the text screen. *
********************************
CLRSCRN ENT
LDA #0
CLRSCRN0 STA TLINE
:0 JSR TEXTADDR
BCS END0
JSR CLINE
INC TLINE
JMP :0
********************************
* TEXTADDR uses the lookup *
* tables to find the address *
* of the line number stored in *
* TLINE. *
********************************
TEXTADDR ENT
LDA TLINE
CMP #24
BGE END0
TAY
LDA TEXTLOW,Y
STA TPTR
LDA TEXTHIGH,Y
STA TPTR+1
CLC
END0 RTS
********************************
* The lookup tables for the *
* text screen: *
********************************
TEXTLOW HEX 0080008000800080
HEX 28A828A828A828A8
HEX 50D050D050D050D0
TEXTHIGH HEX 0404050506060707
HEX 0404050506060707
HEX 0404050506060707
********************************
* Sets inverse status line and *
* clears last three lines of *
* text screen. *
********************************
STATLINE PRINT STATTEXT
JSR CBOT3
LDA #21
STA TLINE
JSR TEXTADDR
RTS
STATTEXT HEX 015489 ; htab 1:vtab 21:inverse
ASC " KY HP XP GP"
HEX 8E00 ; normal

26
io.mac.s Executable file
View File

@ -0,0 +1,26 @@
* External references
; jewel.of.kaldun.s
DATA EXT
; input.output.s
PRSTR EXT
********************************
* Input/Output Macros *
********************************
PRINT MAC
LDA #<]1
STA DATA
LDA #>]1
STA DATA+1
JSR PRSTR
EOM
CENTER MAC
LDA #<]1
STA DATA
LDA #>]1
STA DATA+1
JSR CSTRING
EOM

68
jewel.end.game.s Executable file
View File

@ -0,0 +1,68 @@
********************************
* *
* Jewel of Kaldun *
* *
* written by *
* https://github.com/a2geek *
* *
* story by *
* https://github.com/bshagle *
* *
* Copyright (c) 1990,2016 *
* *
********************************
* Code location:
ORG $0800
* Add in macro files:
USE jok-includes.inc
PAG
USE io.mac
PAG
USE general.mac
PAG
USE prolib.mac
PAG
* 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.END.GAME.bin
PAG
* End Game Routines
PUT endgame
PAG
PUT reset

428
jewel.of.kaldun.s Executable file
View File

@ -0,0 +1,428 @@
********************************
* *
* 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

35
jok-includes.inc Executable file
View File

@ -0,0 +1,35 @@
* ZP Equates:
TLINE EQU $00 ; address of text screen line
TPTR EQU $01 ; line number of current text
TTAB EQU $03 ; index for text screen (HTAB)
TEMP EQU $04 ; temporary storage
DATA EQU $05 ; data address
PTR EQU $07 ; an extra pointer...
HPTR EQU $09 ; address of hi-res line
HPTR2 EQU $0B ; address of 2ndary hi-res line
HLINE EQU $0D ; current hi-res line number
HLINE2 EQU $0F ; secondary hi-res line number
YTEMP EQU $10 ; temporary storage for Y reg.
XTEMP EQU $11 ; temporary storage for X reg.
* ProDOS locations:
MACHID EQU $BF98 ; machine ID in ProDOS global pg
* I/O locations:
KEYBOARD EQU $C000 ; address for keyboard input
KEYSTROB EQU $C010 ; clears current keypress
SPEAKER EQU $C030 ; to click the speaker: noise
* AppleSoft locations:
HCOLOR = $F6F0
HPLOTTO = $F53A
HPOSN = $F411
* ROM locations:
MONWAIT EQU $FCA8 ; monitor wait routine (Acc.)

20
jok.segments.s Executable file
View File

@ -0,0 +1,20 @@
*--------------------------*
* SEGMENTS *
*--------------------------*
TYP $06 ; Binary File / Fixed Address
*--------------------------
* Segment #1
*--------------------------
ASM jewel.of.kaldun.s ; Master Source File for Segment #1
*--------------------------
* Segment #2
*--------------------------
ASM jewel.end.game.s ; Master Source File for Segment #2
*--------------------------

View File

@ -5,8 +5,6 @@
TYP $FF ; system program
ORG $2000 ; they originate @ $2000
EXP OFF ; macro expansion
TR ON ; truncate
* General Macros --
@ -108,8 +106,9 @@ TIT_LEN EQU $2000 ; Length of Title (full screen)
STA $BF6F
* Load in Title:
@OPEN #TIT_NAME;#TIT_BUFF;REFNUM
BCS :HELPERR ; can't quite make it.
@READ REFNUM;#TIT_ADDR;#TIT_LEN
BCC :OK_TITLE
JMP LOADERRT
:OK_TITLE @READ REFNUM;#TIT_ADDR;#TIT_LEN
@CLOSE REFNUM
* Print version of Loader:
LDY #19
@ -121,37 +120,56 @@ TIT_LEN EQU $2000 ; Length of Title (full screen)
JSR CHECKSUM
* Load in JOK:
@OPEN #JOK_NAME;#JOK_BUFF;REFNUM
:HELPERR BCS :HELPER2
@READ REFNUM;#JOK_ADDR;#JOK_LEN
BCC :OK_JOK
JMP LOADERRJ
:OK_JOK @READ REFNUM;#JOK_ADDR;#JOK_LEN
@CLOSE REFNUM
* Load in JOK end game:
@OPEN #JOK2NAME;#JOK2BUFF;REFNUM
:HELPER2 BCS LOADERR2
BCS LOADERRE
@READ REFNUM;#JOK2ADDR;#JOK2LEN
@CLOSE REFNUM
* Check Checksum: (A0E647)
LDA SUM+2
CMP #$A0
BNE DATACORR
BNE :DATACORR
LDA SUM+1
CMP #$E6
BNE DATACORR
LDA SUM
CMP #$47
BNE DATACORR
:DATACORR BNE DATACORR
* Start JOK:
JMP JOK_ADDR ; begin game!
LOADERR LDY #40
:LOOP LDA ERRORMSG-1,Y
STA LINE24-1,Y
DEY
BNE :LOOP
BEQ ERRORXX
LOADERR2 LDY #40
:LOOP2 LDA ERRORMS2-1,Y
LOADERRT LDA #>TIT_NAME
LDY #<TIT_NAME
JMP :MSG
LOADERRJ LDA #>JOK_NAME
LDY #<JOK_NAME
JMP :MSG
LOADERRE LDA #>JOK2NAME
LDY #<JOK2NAME
:MSG PHA
TYA
PHA
LDY #40
:LOOP1 LDA ERRORMSG-1,Y
STA LINE24-1,Y
DEY
BNE :LOOP1
* Print filename on LINE24 overlaying <FILENAME> in the text...
PLA
STA PTR
PLA
STA PTR+1
LDY #0
LDA (PTR),Y ; length byte
TAX
:LOOP2 INY
LDA (PTR),Y
STA LINE24+7,Y
DEX
BNE :LOOP2
ERRORXX JSR $FF3A ; bell
FOREVER LDA #<$0200 ; sets $03F0 (BRK address) to
@ -190,8 +208,7 @@ DATACORR LDY #28
JSR $FF3A ; bell
JMP FOREVER
ERRORMSG ASC "ERROR: JEWEL.OF.KALDUN IS UNACCESSABLE!"
ERRORMS2 ASC "ERROR: JEWEL.END.GAME IS UNACCESSABLE!"
ERRORMSG ASC "ERROR: <FILENAME> IS UNACCESSABLE!"
JOK2NAME STR "JEWEL.END.GAME"
JOK_NAME STR "JEWEL.OF.KALDUN"
TIT_NAME STR "JEWEL.TITLE.PIC"

1067
main.control.s Executable file

File diff suppressed because it is too large Load Diff

34
math.mac.s Executable file
View File

@ -0,0 +1,34 @@
********************************
* Math macros used by Jewel of *
* Kaldun source: *
* Uses: *
* GENERAL.MAC *
* MATH *
********************************
IMULW MAC
MOVW ]1;NUM1
MOVW ]2;NUM2
JSR IMUL
MOVW RESULT;]3
EOM
IDIVW MAC
MOVW ]1;NUM1
MOVW ]2;NUM2
JSR IDIV
MOVW RESULT;]3
EOM
IMODW MAC
MOVW ]1;NUM1
MOVW ]2;NUM2
JSR IDIV
MOVW NUM1;]3
EOM
IDIVMODW MAC
IDIVW ]1;]2;]3
MOVW NUM1;]4
EOM

126
math.s Executable file
View File

@ -0,0 +1,126 @@
********************************
* Mathematical routines used *
* by Jewel of Kaldun *
********************************
********************************
* Integer division routine. *
* NUM0 = routine scratch *
* space *
* NUM1 = numerator *
* NUM2 = denominator *
* RESULT = quotient *
* remainder is in NUM1 after *
* completion of division. *
********************************
IDIV LDA #0
STA RESULT
STA RESULT+1
LDA NUM2
ORA NUM2+1
BNE :PREP
SEC
RTS
:PREP LDX #0
LDA NUM2
STA NUM0
LDA NUM2+1
STA NUM0+1
:99 ASL NUM0
ROL NUM0+1
BCS :GO
INX
JMP :99
:GO LDA NUM2
STA NUM0
LDA NUM2+1
STA NUM0+1
TXA
TAY
BEQ :SKIP
:0 ASL NUM0
ROL NUM0+1
DEY
BNE :0
:SKIP LDA NUM0+1
CMP NUM1+1
BEQ :1
BGE :CONT
BLT :2
:1 LDA NUM0
CMP NUM1
BEQ :2
BGE :CONT
:2 SEC
LDA NUM1
SBC NUM0
STA NUM1
LDA NUM1+1
SBC NUM0+1
STA NUM1+1
LDA #0
STA NUM0+1
LDA #1
STA NUM0
TXA
TAY
BEQ :11
:10 ASL NUM0
ROL NUM0+1
DEY
BNE :10
:11 CLC
LDA RESULT
ADC NUM0
STA RESULT
LDA RESULT+1
ADC NUM0+1
STA RESULT+1
:CONT DEX
BPL :GO
CLC
RTS
********************************
* Integer multiplication *
* routine: *
* NUM1 = one number *
* NUM2 = second number *
* RESULT = answer to NUM1xNUM2 *
********************************
IMUL LDA #0
STA RESULT
STA RESULT+1
:MORE LDA NUM2
BNE :GO
LDA NUM2+1
BNE :GO
RTS
:GO LSR NUM2+1
ROR NUM2
BCC :SHIFT
CLC
LDA NUM1
ADC RESULT
STA RESULT
LDA NUM1+1
ADC RESULT+1
STA RESULT+1
:SHIFT ASL NUM1
ROL NUM1+1
JMP :MORE
********************************
* Variables used by the *
* integer multiplication and *
* division routines: *
********************************
NUM0 HEX 0000
NUM1 HEX 0000
NUM2 HEX 0000
RESULT HEX 0000

390
monsters.s Executable file
View File

@ -0,0 +1,390 @@
********************************
* Monster Routines: *
********************************
* Init Monster variables:
MONSINIT LDY #0 ; zero out all monster
LDA #0 ; data.
:FINISH STA M_HP,Y
STA M_TYPE,Y
STA M_X,Y
STA M_Y,Y
STA M_MOVE,Y
STA M_X0,Y
STA M_X1,Y
STA M_Y0,Y
INY
CPY #MONSMAX
BLT :FINISH
RTS
********************************
* Check to see if another *
* monster has appeared. *
********************************
MONCHECK LDA RANDOM2
EOR RANDOM3 ; 1 in 16 chance of appearing:
AND #%00001111 ; check if monster is
BNE :NOMONS0 ; appearing this time
LDY #0
:CONT LDA M_HP,Y ; find space in monster
STY CURMONST ; list.
BEQ :FOUND
INY
CPY #MONSMAX
BLT :CONT
:NOMONS0 JMP _NOMONST ; no space in list.
:FOUND LDA RANDOM1
EOR RANDOM3
AND #%00011111 ; y location (max = 32)
STA CURMON_Y
INC CURMON_Y
LDA RANDOM2
AND #%00011111 ; 1st part of x (gives 0-32)
STA CURMON_X ; map is 32 + 16 = 48.
INC CURMON_X
LDA RANDOM3
AND #%00001111 ; 2nd part of x (gives 0-15)
CLC
ADC CURMON_X
STA CURMON_X
CMP #WMAP ; ensure that map does not
BGE :NOMONS0 ; exceed X coordinate max
LDA CURMON_Y
CMP #HMAP ; ensure that map does not
BGE :NOMONS0 ; exceed Y coordinate max
LDX #>LEVEL1
LDA RANDOM1
EOR RANDOM2
EOR RANDOM3
AND #%00000001
BEQ :ATLVL1
:ATLVL2 LDX #>LEVEL2
:ATLVL1 STX CURMON_L
*-------------------------------
JSR MONMOVCK ; check if good locale
BCC :GOODLOC
JMP _NOMONST ; bad location
*-------------------------------
:GOODLOC LDY CURMONST
LDA RANDOM1 ; randomize
EOR RANDOM2
EOR RANDOM3
AND #%00000111
CMP #2
BLT :GHOST
CMP #4
BLT :ZOMBIE
:BLOB LDA #2
STA M_HP,Y
LDA #4
STA M_MOVE,Y
LDA #13
BNE :FINISH ; always
:GHOST LDA #8
STA M_HP,Y
LDA #2
STA M_MOVE,Y
LDA #12
BNE :FINISH ; always
:ZOMBIE LDA #16
STA M_HP,Y
LDA #1
STA M_MOVE,Y
LDA #14
:FINISH STA M_TYPE,Y
LDA CURMON_X
STA M_X,Y
LDA CURMON_Y
STA M_Y,Y
LDA CURMON_L
STA M_LEVEL,Y
CMP MAPADDR+1 ; no at same level
BNE _NOMONST
LDA M_X,Y
TAX
LDA M_Y,Y
TAY
CPX X0
BLT _NOMONST ; exit, keep monster
CPX X1
BGE _NOMONST ; exit, keep monster
CPY Y0
BLT _NOMONST ; exit, keep monster
CPY Y1
BGE _NOMONST ; exit, keep monster
LDA #0 ; no good -- same screen as
STA M_HP,Y ; Meltok!
_NOMONST RTS
CURMONST HEX 00
CURMON_X HEX 00
CURMON_Y HEX 00
CURMON_L HEX 00
********************************
* Make monsters move about! *
********************************
MOVMONST LDY #0
:DOMORE STY CURMONST
LDA M_HP,Y
BEQ :NEXTMON
LDA M_MOVE,Y
BEQ :MOVEIT
SEC
SBC #1
STA M_MOVE,Y
JSR CH4CHAR ; attack anyway!
JMP :NEXTMON
:MOVEIT LDA M_TYPE,Y
TAX
LDA TYPCONST-12,X ; update move counter
STA M_MOVE,Y ; again...
LDA M_Y,Y
STA CURMON_Y
LDA M_X,Y
STA CURMON_X
LDA M_LEVEL,Y
STA CURMON_L
JSR CH4CHAR ; if M near, attack him
BCC :NEXTMON ; carry clear = attacked
LDA RANDOM1
AND #%00000011
BNE :MOVETOW
:MOVERAN JSR M_RANDOM ; move randomly
JMP :NEXTMON
:MOVETOW JSR M_TOWARD ; move toward Meltok
:NEXTMON INC CURMONST
LDY CURMONST
CPY #MONSMAX
BLT :DOMORE
LDY #0
:CHECKIT LDA M_HP,Y ; see if monster is in table
BEQ :DOTHAT ; if HP = 0, not there
LDA M_TYPE,Y ; check if the monster moved
TAX ; this turn. That is, check
LDA TYPCONST-12,X ;if at the maximum number of
CMP M_MOVE,Y ; turns allowed for type.
BNE :DOTHAT ; if not eq, did not move
LDA M_X,Y ; see if monster is actually
TAX ; in the same room as
INX ; Meltok is.
CPX X0 ; checking the X range
BLT :DOTHAT
CPX X1
BEQ :SKIP00 ; only if > than
BGE :DOTHAT
:SKIP00 LDA M_Y,Y ; checking the Y range
TAX
INX
CPX Y0
BLT :DOTHAT
CPX Y1
BEQ :SKIP11 ; if <=, in the same room
BGE :DOTHAT
:SKIP11 LDA M_LEVEL,Y
CMP MAPADDR+1
BEQ :DOTHIS ; if ==, save level too!
:DOTHAT INY
CPY #MONSMAX
BGE :EXITNOW
BLT :CHECKIT
:DOTHIS JSR UPSCREEN
:EXITNOW RTS
TYPCONST DFB 2,4,1
CH4CHAR LDA M_LEVEL,Y ; check if on same leve
CMP MAPADDR+1 ; as Meltok
BEQ :CHECKX
SEC
RTS
:CHECKX LDA M_X,Y
SEC
SBC CX
CLC ; why, i do not know
ADC #1
CMP #1
BEQ :CHECKY0 ; Y should = 0; horizontal
CMP #-1
BEQ :CHECKY0 ; Y should = 0; horizontal
CMP #0
BEQ :CHECKY ; check for vertical
SEC
RTS
:CHECKY LDA M_Y,Y
SEC
SBC CY
CLC ; why, i do not know
ADC #1
CMP #1
BEQ :ATTACK
CMP #-1
BEQ :ATTACK
SEC
RTS
:CHECKY0 LDA M_Y,Y
SEC
SBC CY
CLC ; why, i do not know
ADC #1
CMP #0 ; we have a horizontal attack!
BEQ :ATTACK
SEC
RTS
:ATTACK LDA M_TYPE,Y
JSR M:OWIE
CLC
RTS
M_TOWARD LDA CURMON_X
CMP CX
BEQ :CHECKY
BLT :XISLESS
DEC CURMON_X
JMP :FINISHX
:XISLESS INC CURMON_X
:FINISHX JSR MONMOVCK
BCC M_REGMOV ; ok move!
LDY CURMONST
LDA M_X,Y
STA CURMON_X
:CHECKY LDA CURMON_Y
CMP CY
BEQ :_RANDOM ; do random move
BLT :YISLESS
DEC CURMON_Y
JMP :FINISHY
:YISLESS INC CURMON_Y
:FINISHY JSR MONMOVCK
BCC M_REGMOV ; ok, move!
LDY CURMONST
LDA M_Y,Y
STA CURMON_Y
:_RANDOM JMP M_RANDOM
M_REGMOV LDY CURMONST
LDA CURMON_X
STA M_X,Y
LDA CURMON_Y
STA M_Y,Y
RTS
M_RANDOM LDA RANDOM1
BMI :XDOWN
:XUP INC CURMON_X
JMP :CHECKX
:XDOWN DEC CURMON_X
:CHECKX JSR MONMOVCK
BCS :DO_Y ; was bad location
JMP M_REGMOV
:DO_Y LDY CURMONST ; restore old X value
LDA M_X,Y ; (this way monster does not
STA CURMON_X ; move diagonally)
LDA RANDOM2
BMI :YDOWN
:YUP INC CURMON_Y
JMP :CHECKY
:YDOWN DEC CURMON_Y
:CHECKY JSR MONMOVCK
BCS :NO_GO ; was bad location
JMP M_REGMOV
:NO_GO LDA #0 ; make a move possible
LDY CURMONST ; next time through.
STA M_MOVE,Y ; (no move done this time)
LDA M_Y,Y ; restore current Y value to
STA CURMON_Y ; general locations..
RTS
MONMOVCK LDX CURMON_X ; monster move check routine
LDY CURMON_Y
LDA CURMON_L
CMP MAPADDR+1 ; check level
BNE :GO_ON
INX ; to overcome MAPINDEX's add
INY
CPX CX
BNE :GO_ON
CPY CY
BEQ :BAD ; that is the character!
:GO_ON LDA MAPADDR+1
PHA
LDA CURMON_L
STA MAPADDR+1
JSR MAPINDEX
CMP #100 ; text = blank space
BGE :GOOD
CMP #3 ; unlocked door
BEQ :GOOD
CMP #5 ; found secret door
BEQ :GOOD
CMP #6 ; chest
BEQ :GOOD
CMP #7 ; opened chest
BEQ :GOOD
CMP #8 ; ladder
BEQ :GOOD
CMP #9 ; throne
BEQ :GOOD
CMP #10 ; Jewel of Kaldun
BEQ :GOOD
CMP #11 ; empty holder
BEQ :GOOD
:BAD PLA ; restore real address
STA MAPADDR+1 ; of map.
SEC
RTS
:GOOD PLA ; restore real address
STA MAPADDR+1 ; of map.
CLC
RTS
********************************
* Monsters Hit *
********************************
MONSHIT LDY #0
:NEXTMON LDA M_HP,Y
BEQ :NOTHERE
LDA M_X,Y
TAX
INX
CPX DIR:X
BNE :NOTHERE
LDA M_Y,Y
TAX
INX
CPX DIR:Y
BNE :NOTHERE
LDA M_HP,Y
SEC
SBC CLEVEL ; lose CLEVEL hit points
STA M_HP,Y
BEQ :DEAD
BCS :ALIVE
:DEAD LDA M_TYPE,Y
TAX
LDA M_XPER-12,X
STA XPGAIN
ADDW XPGAIN;XP;XP
TYA
PHA
JSR STATUSXP
PRINT MONDEAD
PLA
TAY
LDA #0
STA M_HP,Y
JSR UPSCREEN ; monster died, redraw screen
:ALIVE LDA #0
RTS
:NOTHERE INY
CPY #MONSMAX
BNE :NEXTMON
LDA #0
RTS
M_XPER DFB 30,10,75 ; experience points/monsters
MONDEAD HEX 825501 ; vtab 22:htab 1
ASC "You killed the monster! You receive"8D80
DA XPGAIN
ASC " experience points."00
XPGAIN HEX 0000

28
noise.s Executable file
View File

@ -0,0 +1,28 @@
********************************
* Do noise routines: *
********************************
* Take from April issue of Nibble:
DONOISE ENT
LDA SPEAKER
LDY VOLUME ; get volume
:YLOOP DEY ; pause for volume control
BNE :YLOOP
STA SPEAKER ; click again
LDY DURATION ; load duration
LDA $F000,Y ; and use as index to ran #s
CLC
ADC FREQUENC ; add pitch
TAX ; get pause length
:XLOOP DEX ; pause
BNE :XLOOP
DEC DURATION ; decrement duration
BNE DONOISE
RTS
DURATION ENT
HEX 00
FREQUENC ENT
HEX 00
VOLUME ENT
HEX 00

240
places.s Executable file
View File

@ -0,0 +1,240 @@
* External references
; jewel.of.kaldun.s
DATA EXT
; input.output.s
PRSTR EXT
********************************
* Print a room description for *
* the location at (cx,cy). *
* If on/in some item, describe *
* that. *
********************************
ROOMDESC JSR CBOT3
LDA #22 ; set vtab at 23.
STA TLINE
JSR TEXTADDR
LDX CX
LDY CY
JSR MAPINDEX
CMP #100
BGE :DOROOMS
CMP #12 ; won't handle a # > 11.
BLT :THINGS
CMP #99 ; handle special chest
BNE :BLANK
LDA #12 ; special case
JMP :THINGS
:BLANK LDA #0
:THINGS ASL
TAY
LDA D:THINGS,Y
STA DATA
LDA D:THINGS+1,Y
STA DATA+1
JSR PRSTR
RTS
:DOROOMS CMP #254
BLT :DOROOM0
BEQ :DORM254
PRINT ROOM255
RTS
:DORM254 PRINT ROOM254
RTS
:DOROOM0 SEC
SBC #100
CMP #63 ; deal with only rooms
BLT :ROOMS ; 100 - 162.
LDA #63 ; print warning msg.
:ROOMS ASL
TAY
LDA D:ROOMS,Y
STA DATA
LDA D:ROOMS+1,Y
STA DATA+1
JSR PRSTR
RTS
D:THINGS DA SHAPE00,SHAPE01,SHAPE02,SHAPE03
DA SHAPE04,SHAPE05,SHAPE06,SHAPE07
DA SHAPE08,SHAPE09,SHAPE10,SHAPE11
DA SHAPE99
SHAPE00 HEX 00
SHAPE01 HEX 00
SHAPE02 HEX 00
SHAPE03 HEX 83
ASC "You are in a doorway."00
SHAPE04 HEX 00
SHAPE05 HEX 83
ASC "You are in a secret passage."00
SHAPE06 HEX 83
ASC "You stand before a chest."00
SHAPE07 HEX 83
ASC "You stand before an opened chest."00
SHAPE08 HEX 83
ASC "You stand before a ladder."00
SHAPE09 HEX 83
ASC "You stand before an ornate throne."00
SHAPE10 HEX 83
ASC "You are before the fabled"8D83
ASC "Jewel of Kaldun!"00
SHAPE11 HEX 83
ASC "You are before an empty stand..."00
SHAPE99 HEX 83
ASC "... A very ornate chest ..."00
D:ROOMS DA ROOM100,ROOM101,ROOM102,ROOM103
DA ROOM104,ROOM105,ROOM106,ROOM107
DA ROOM108,ROOM109,ROOM110,ROOM111
DA ROOM112,ROOM113,ROOM114,ROOM115
DA ROOM116,ROOM117,ROOM118,ROOM119
DA ROOM120,ROOM121,ROOM122,ROOM123
DA ROOM124,ROOM125,ROOM126,ROOM127
DA ROOM128,ROOM129,ROOM130,ROOM131 ; boo-boo in map:
DA ROOM132,ROOM133,ROOM134,ROOM135 ; no 131-139 rooms!
DA ROOM136,ROOM137,ROOM138,ROOM139
DA ROOM140,ROOM141,ROOM142,ROOM143
DA ROOM144,ROOM145,ROOM146,ROOM147
DA ROOM148,ROOM149,ROOM150,ROOM151
DA ROOM152,ROOM153,ROOM154,ROOM155
DA ROOM156,ROOM157,ROOM158,ROOM159
DA ROOM160,ROOM161,ROOM162,ROOM163
ROOM100 HEX 83
ASC "You are in front of the castle."00
ROOM101 HEX 83
ASC "You stand in the courtyard."00
ROOM104 ; same message as #102
ROOM102 HEX 83
ASC "You are in a secret hallway."00
ROOM103 HEX 83
ASC "The south-west tower."00
ROOM105 HEX 83
ASC "The south-east tower."00
ROOM106 HEX 83
ASC "The guards room."00
ROOM107 HEX 83
ASC "The captain of the guards room."00
ROOM108 HEX 83
ASC "Someones' horde of ???"00
ROOM109 HEX 83
ASC "A hidden closet."00
ROOM110 HEX 83
ASC "The ladder room."00
ROOM111 HEX 83
ASC "A hall."00
ROOM112 HEX 83
ASC "The processional hall."00
ROOM113 HEX 83
ASC "The guest room."00
ROOM114 HEX 83
ASC "You are in the kitchen."00
ROOM115 HEX 83
ASC "The storage room."8D83
ASC "It smells a bit in here!"00
ROOM116 HEX 83
ASC "The Kings' guards room."00
ROOM117 HEX 83
ASC "The Kings' closet."00
ROOM118 HEX 83
ASC "The Kings' bathroom."00
ROOM119 HEX 83
ASC "A private hall."00
ROOM120 HEX 83
ASC "The Kings' bedroom."00
ROOM121 HEX 83
ASC "The throne room and"8D83
ASC "audience chamber."00
ROOM122 HEX 83
ASC "The dining room."00
ROOM123 HEX 83
ASC "The wine cellar."00
ROOM124 HEX 83
ASC "The north-west tower."00
ROOM125 HEX 83
ASC "The wizards' magic chamber!"00
ROOM126 HEX 83
ASC "The wizards' room."00
ROOM127 HEX 83
ASC "A secret back passage..."00
ROOM128 HEX 83
ASC "The north-east tower."00
ROOM129 HEX 83
ASC "You stand behind the castle"8D83
ASC "Freedom is but a step away!"00
ROOM130 HEX 83
ASC "You stand somewhere on the"8D83
ASC "second level!"00
ROOM131 ; these rooms do not exist
ROOM132 ; on either level!!
ROOM133
ROOM134
ROOM135
ROOM136
ROOM137
ROOM138
ROOM139 HEX 00 ; cover for boo-boo
ROOM140 HEX 83
ASC "You stand in a long, winding"8D83
ASC "hallway."00
ROOM141 HEX 83
ASC "... some odd little room ..."00
ROOM142 HEX 83
ASC "This appears to be a reception"8D83
ASC "room."00
ROOM143 HEX 83
ASC "Boy, this guy must've been rich!"00
ROOM144 HEX 83
ASC "You have no idea what this empty room"8D83
ASC "was used for!"00
ROOM145 HEX 83
ASC "... another hallway ..."00
ROOM146 HEX 83
ASC "... and yet one more hallway ..."00
ROOM147 HEX 83
ASC "This looks like a great hall."00
ROOM148 HEX 83
ASC "A guests' room?"00
ROOM149 HEX 83
ASC "Maybe this is a guest room."00
ROOM150 HEX 83
ASC "And yet, another guest room!"00
ROOM151 HEX 83
ASC "Boy, one more ..."00
ROOM152 HEX 83
ASC "Wait, maybe these are servants"8D83
ASC "quarters!"00
ROOM153 HEX 83
ASC "Someone must've done a lot of"8D83
ASC "work here. The walls are black!"00
ROOM154 HEX 83
ASC "There is a beautiful jewel in"8D83
ASC "this room."00
ROOM155 HEX 83
ASC "The south-west tower has a beautiful"8D83
ASC "view of the landscape."00
ROOM156 HEX 83
ASC "Boy, ain't this fun?"00
ROOM157 HEX 83
ASC "The south-east tower doesn't have as"8D83
ASC "beautiful a view as the south-west."00
ROOM158 HEX 83
ASC "Time to leave this place, eh?"00
ROOM159 HEX 83
ASC "Where do you think you are going?"00
ROOM160 HEX 83
ASC "The north-west tower... Ah, there"8D83
ASC "is a ladder!"00
ROOM161 HEX 83
ASC "Boy, you feel tired."00
ROOM162 HEX 83
ASC "The south-west tower... There is a"8D83
ASC "ladder here!"00
ROOM163 HEX 83
ASC "Oh dear, I have no idea what room"8D83
ASC "this is!!"00
ROOM254 HEX 83
ASC "A rather broken up ladder."00
ROOM255 HEX 83
ASC "A smashed chest."00

77
prolib.mac.s Executable file
View File

@ -0,0 +1,77 @@
********************************
* ProDOS Library Macro command *
* list: *
********************************
~QUIT = $65 ; quit
~GETTIME = $82 ; get time
~CREATE = $C0 ; create
~DESTROY = $C1 ; destroy
~OPEN = $C8 ; open file
~READ = $CA ; read file
~WRITE = $CB ; write file
~CLOSE = $CC ; close file
~FLUSH = $CD ; flush file
* ProDOS addresses --
MLI = $BF00
_DATE = $BF90
_TIME = $BF92
* ProDOS Macro commands --
* call: @name parameter #1;parameter #2; ... ;parameter #n
@QUIT MAC ; @quit
JSR _QUIT
EOM
@GETTIME MAC ; @gettime
JSR _GETTIME
EOM
@CREATE MAC ; @create path;access;file_type;
MOVW ]1;D:C0PATH ; auxiliary_type;
MOVB ]2;D:C0ACC ; storage_type
MOVB ]3;D:C0FTYP
MOVW ]4;D:C0ATYP
MOVB ]5;D:C0STYP
JSR _CREATE
EOM
@DESTROY MAC ; @destroy path
MOVW ]1;D:C1PATH
JSR _DESTROY
EOM
@OPEN MAC ; @open path;file_buffer; (1K)
MOVW ]1;D:C8PATH ; reference_number (ret)
MOVW ]2;D:C8BUFF
JSR _OPEN
MOVB D:C8REF;]3
EOM
@READ MAC ; @read ref_num;input_buff;
MOVB ]1;D:CAREF ; requested_length
MOVW ]2;D:CABUFF ; (actual_length returned)
MOVW ]3;D:CARLEN
JSR _READ
EOM
@WRITE MAC ; @write ref_num;output_buff;
MOVB ]1;D:CBREF ; requested_length
MOVW ]2;D:CBBUFF ; (actual_length returned)
MOVW ]3;D:CBRLEN
JSR _WRITE
EOM
@CLOSE MAC ; @close reference_number
MOVB ]1;D:CCREF
JSR _CLOSE
EOM
@FLUSH MAC ; @flush reference_number
MOVB ]1;D:CDREF
JSR _FLUSH
EOM

121
prolib.s Executable file
View File

@ -0,0 +1,121 @@
********************************
* ProDOS MLI calls. *
* Uses: IO *
* IO.MAC *
********************************
_QUIT JSR MLI ; Perform QUIT function
DFB ~QUIT
DW D:QUIT
_MLICHK BNE MLIERROR ; Error occured ...
RTS
MLIERROR LDA #23
STA TLINE
JSR TEXTADDR
JSR CLINE
LDA #$40
JSR WAIT
LDY #$C0
:BELL LDA #$10
JSR WAIT
STA SPEAKER
DEY
BNE :BELL
CENTER MLIERR_S
STA KEYSTROB
:KEYLOOP LDA KEYBOARD
CMP #RETURN
BNE :KEYLOOP
STA KEYSTROB
JMP MAIN
MLIERR_S ASC "AN ERROR HAS OCCURED! PRESS <RETURN>"00
_GETTIME JSR MLI ; perform get_time function
DFB ~GETTIME
DW 0
JMP _MLICHK
_CREATE @GETTIME ; perform create function
MOVW _DATE;D:C0DATE
MOVW _TIME;D:C0TIME
JSR MLI
DFB ~CREATE
DW D:CREATE
JMP _MLICHK
_DESTROY JSR MLI ; perform destroy function
DFB ~DESTROY
DW D:DESTR
RTS ; error checking nulled
_OPEN JSR MLI ; perform open function
DFB ~OPEN
DW D:OPEN
JMP _MLICHK
_READ JSR MLI ; perform read function
DFB ~READ
DW D:READ
JMP _MLICHK
_WRITE JSR MLI ; perform write function
DFB ~WRITE
DW D:WRITE
JMP _MLICHK
_CLOSE ENT
JSR MLI ; perform close function
DFB ~CLOSE
DW D:CLOSE
JMP _MLICHK
_FLUSH JSR MLI ; perform flush function
DFB ~FLUSH
DW D:FLUSH
JMP _MLICHK
* ProDOS data/parameters --
D:QUIT DFB 4 ; 4 parameters
DFB 0 ; all are reserved.
DW 0
DFB 0
DW 0
D:CREATE DFB $7 ; 7 parameters
D:C0PATH DW 0 ; address of pathname
D:C0ACC DFB 0 ; access bits
D:C0FTYP DFB 0 ; file type
D:C0ATYP DW 0 ; auxiliary file type
D:C0STYP DFB 0 ; storage type
D:C0DATE DW 0 ; creation date
D:C0TIME DW 0 ; creation time
D:DESTR DFB $1 ; 1 parameter
D:C1PATH DW 0 ; address of pathname
D:OPEN DFB $3 ; 3 parameters
D:C8PATH DW 0 ; address of path name
D:C8BUFF DW 0 ; address of file buffer
D:C8REF DFB 0 ; reference number (returned)
D:READ DFB $4 ; 4 parameters
D:CAREF DFB 0 ; reference number
D:CABUFF DW 0 ; address of data buffer
D:CARLEN DW 0 ; requested length
D:CAALEN DW 0 ; actual length
D:WRITE DFB $4 ; 4 parameters
D:CBREF DFB 0 ; reference number
D:CBBUFF DW 0 ; address of data buffer
D:CBRLEN DW 0 ; requested length
D:CBALEN DW 0 ; actual length
D:CLOSE DFB $1 ; 1 parameter
D:CCREF ENT
DFB 0 ; reference number
D:FLUSH DFB $1 ; 1 parameter
D:CDREF DFB 0 ; reference number

48
reset.s Executable file
View File

@ -0,0 +1,48 @@
* External references
_CLOSE EXT
D:CCREF EXT
DOQUIT EXT
MAIN EXT
********************************
* Reset routine handler. *
********************************
RESETUP ENT
LDY #0 ; save old reset
:0 LDA $3F2,Y ; handler
STA RESTORE,Y
INY
CPY #3
BLT :0
LDA #<DORESET ; install my own reset
STA $3F2 ; handler
LDA #>DORESET
STA $3F3
EOR #$A5
STA $3F4
RTS
RESTORE ENT
HEX 000000 ; store old reset bytes
********************************
* Actual reset routine: *
* close all files, *
* print message, *
* and call DOQUIT *
********************************
DORESET @CLOSE #0 ; close all files
JSR TEXT
JSR CLRSCRN
PRINT RESETMSG
LDY #5 ; pause a bit
:LOOP LDA #255
JSR WAIT
DEY
BNE :LOOP
JSR DOQUIT
JMP MAIN
RESETMSG HEX 4A83
ASC "You didn't really want to do"8D83
ASC "that now, did you?"00

396
shapes.s Executable file
View File

@ -0,0 +1,396 @@
* External references
; jewel.of.kaldun.s
;DATA EXT
********************************
* Jewel of Kaldun shape *
* drawing routines. *
* Uses: GRAPHICS *
* MATH *
* MATH.MAC *
* GENERAL.MAC *
********************************
SHTABLE DFB %00000000 ; Shape #0: Blank space
DFB %00000000
DFB %00000000
DFB %00000000
DFB %00000000
DFB %00000000
DFB %00000000
DFB %00000000
DFB %11111111 ; Shape #1: Wall
DFB %11111111
DFB %11111111
DFB %11111111
DFB %11111111
DFB %11111111
DFB %11111111
DFB %11111111
DFB %00111100 ; Shape #2: Meltok
DFB %00111100
DFB %00011000
DFB %11111111
DFB %00011000
DFB %00111100
DFB %00100100
DFB %01100110
DFB %11111111 ; Shape #3: Door (unlocked)
DFB %11111111
DFB %11100111
DFB %11000011
DFB %11000011
DFB %11000011
DFB %11000011
DFB %11000011
DFB %11111111 ; Shape #4: Locked Door
DFB %11111111
DFB %11100111
DFB %11000011
DFB %11000011
DFB %11010011
DFB %11000011
DFB %11000011
DFB %11111111 ; Shape #5: Secret Door (found)
DFB %11100111
DFB %11011011
DFB %11011011
DFB %11011011
DFB %11011011
DFB %11011011
DFB %11011011
DFB %00000000 ; Shape #6: Chest
DFB %00000000
DFB %00111100
DFB %01100110
DFB %01111110
DFB %01100110
DFB %01100110
DFB %01111110
DFB %00000000 ; Shape #7: Opened Chest
DFB %00001100
DFB %00000110
DFB %00000110
DFB %01111110
DFB %01100110
DFB %01100110
DFB %01111110
DFB %00000000 ; Shape #8: Ladder
DFB %01100110
DFB %01111110
DFB %01100110
DFB %01111110
DFB %01100110
DFB %01111110
DFB %01100110
DFB %00000000 ; Shape #9: Throne
DFB %00000110
DFB %00000110
DFB %00000110
DFB %01111110
DFB %01100110
DFB %01100110
DFB %01100110
DFB %00011000 ; Shape #10: Jewel of Kaldun
DFB %00111100
DFB %00111100
DFB %00011000
DFB %11000011
DFB %01111110
DFB %00011000
DFB %00111100
DFB %00000000 ; Shape #11: Empty Holder
DFB %00000000 ; (Jewel of Kaldun gone)
DFB %00000000
DFB %00000000
DFB %11000011
DFB %01111110
DFB %00011000
DFB %00111100
DFB %00000000 ; Shape #12: Ghost
DFB %00111100
DFB %01111110
DFB %01101010
DFB %01111110
DFB %01111110
DFB %01011010
DFB %00000000
DFB %00000000 ; Shape #13: Blob
DFB %01100110
DFB %00101100
DFB %00111100
DFB %01111110
DFB %01010110
DFB %01000100
DFB %00000000
DFB %00000000 ; Shape #14: Zombie
DFB %00011000
DFB %01111110
DFB %00011000
DFB %00111100
DFB %01100110
DFB %01100110
DFB %00000000
DFB %00000000 ; Shape #15: Circle
DFB %00111100
DFB %01111110
DFB %01111110
DFB %01111110
DFB %01111110
DFB %00111100
DFB %00000000
DFB %00000000 ; Shape #16: Dot
DFB %00000000
DFB %00000000
DFB %00011000
DFB %00011000
DFB %00000000
DFB %00000000
DFB %00000000
DFB %10101010 ; Shape #17: Half wall (fade-in)
DFB %01010101
DFB %10101010
DFB %01010101
DFB %10101010
DFB %01010101
DFB %10101010
DFB %01010101
DFB %01010101 ; Shape #18: Half wall (fade-in)
DFB %10101010
DFB %01010101
DFB %10101010
DFB %01010101
DFB %10101010
DFB %01010101
DFB %10101010
DFB %01111111 ; Shape #19: Letter "R"
DFB %11000011
DFB %11000011
DFB %11000011
DFB %01111111
DFB %00110011
DFB %01100011
DFB %11000011
DFB %11111111 ; Shape #20: Letter "I"
DFB %00011000
DFB %00011000
DFB %00011000
DFB %00011000
DFB %00011000
DFB %00011000
DFB %11111111
DFB %01111111 ; Shape #21: Letter "P"
DFB %11000011
DFB %11000011
DFB %11000011
DFB %01111111
DFB %00000011
DFB %00000011
DFB %00000011
DFB %11111111 ; Shape #22: Barred Door
DFB %11111111
DFB %11100111
DFB %11000011
DFB %11111111
DFB %11000011
DFB %11111111
DFB %11000011
********************************
* Shape draw variables *
********************************
XOFFSET HEX 0000
XLOC HEX 0000
YLOC HEX 00
SNUM ENT
HEX 0000
DRAWREP HEX 00
CLRFLAG ENT
DFB %10000000 ; flag for clearing background
XORFLAG ENT
DFB %00000000 ; flag to XOR with background
BITMASK DFB %01111111,%00111111 ; bits to keep for
DFB %00011111,%00001111 ; offset values
DFB %00000111,%00000011
DFB %00000001
BITABLE1 DFB %00000000,%00000001 ; bits to keep in 1st
DFB %00000011,%00000111 ; graphic byte
DFB %00001111,%00011111
DFB %00111111
BITABLE2 DFB %01111110,%01111100 ; bits to keep in 2nd
DFB %01111000,%01110000 ; graphicbyte
DFB %01100000,%01000000
DFB %00000000
********************************
* Draw a shape routine. Upon *
* entry: *
* X-axis: AAXX *
* Y-axis: YY *
* Shape Num: preset *
********************************
DRAWSHAP ENT
STA XLOC+1 ; save entry values:
STX XLOC ; xval = XXAA
STY YLOC ; yval = YY
STY HLINE
IMULW #8;SNUM;DATA
ADDW DATA;#SHTABLE;DATA
IDIVMODW XLOC;#7;XLOC;XOFFSET ; calc offset(s)
MOVB #8;DRAWREP
:REPEAT JSR HADDR
LDX XOFFSET
LDY XLOC
CPY #40
BGE :SECOND
BIT CLRFLAG
BPL :20
LDA BITABLE1,X
AND (HPTR),Y
STA (HPTR),Y
:20 LDY #0
LDA BITMASK,X
STA BITSTORE
AND (DATA),Y
LDX XOFFSET
:10 CPX #0
BEQ :11
ASL
DEX
JMP :10
:11 LDY XLOC
BIT XORFLAG
BMI :2X1
ORA (HPTR),Y
JMP :2X2
:2X1 EOR (HPTR),Y
:2X2 STA (HPTR),Y
:SECOND LDX XOFFSET
LDY XLOC
INY
CPY #40
BGE :NOTGOOD
BIT CLRFLAG
BPL :30
LDA BITABLE2,X
AND (HPTR),Y
STA (HPTR),Y
:30 LDY #0
LDA BITSTORE
EOR #%11111111
AND (DATA),Y
LDX XOFFSET
:0 CPX #7
BGE :1
LSR
INX
JMP :0
:1 LDY XLOC
INY
BIT XORFLAG
BMI :3X1
ORA (HPTR),Y
JMP :3X2
:3X1 EOR (HPTR),Y
:3X2 STA (HPTR),Y
:NOTGOOD INC DATA
BNE :2
INC DATA+1
:2 INC HLINE
DEC DRAWREP
BNE :REPEATX
RTS
:REPEATX JMP :REPEAT
BITSTORE HEX 00
* NOTE: This is a hack. -8 is treated as 8 bites by Merlin32;
* thus the MOVW is in error. Using the value of $FFF8
* because my trusty PC calculator tells me that is correct. :-)
ARRIVEC2 MOVW #$FFF8;XMELTOK
MOVB #2;SNUM
LDA #%00000000
STA CLRFLAG
LDA #%10000000
STA XORFLAG
:REPEAT LDY #151
LDA XMELTOK+1
LDX XMELTOK
JSR DRAWSHAP
LDA #70
JSR WAIT
LDY #151
LDA XMELTOK+1
LDX XMELTOK
JSR DRAWSHAP
INC XMELTOK
BNE :1
INC XMELTOK+1
:1 LDA XMELTOK+1
CMP #>71
BNE :REPEAT
LDA XMELTOK
CMP #<71
BNE :REPEAT
BEQ COMMONCX
XMELTOK HEX 0000
LEAVEC1 MOVW #131;XMELTOK
MOVB #2;SNUM
LDA #%00000000
STA CLRFLAG
LDA #%10000000
STA XORFLAG
:REPEAT LDY #151
LDA XMELTOK+1
LDX XMELTOK
JSR DRAWSHAP
LDA #70
JSR WAIT
LDY #151
LDA XMELTOK+1
LDX XMELTOK
JSR DRAWSHAP
INC XMELTOK
BNE :1
INC XMELTOK+1
:1 LDA XMELTOK+1
CMP #>280
BNE :REPEAT
LDA XMELTOK
CMP #<280
BNE :REPEAT
COMMONCX LDY #151
LDX XMELTOK
LDA XMELTOK+1
JSR DRAWSHAP
LDA #%10000000
STA CLRFLAG
LDA #%00000000
STA XORFLAG
RTS

274
story.s Executable file
View File

@ -0,0 +1,274 @@
* External references
; graphics.s
HGRCLEAR EXT
********************************
* The story behind the Jewel *
* of Kaldun along with the *
* instructions for play. *
* Uses: IO *
* IO.MAC *
* CASTLES *
********************************
STORY JSR CLRSCRN
LDA #0
STA TLINE
JSR TEXTADDR
CENTER TITLE00
PRINT STORYP1
JSR GETRET
JSR CLRMID
PRINT STORYP2
JSR HGRCLEAR
JSR CASTLE1
JSR GETRET
JSR CLRMID
JSR SETHGR
PRINT STORYP3
JSR GETRET
JSR CLRMID
PRINT STORYP4
JSR DRAWBRID
JSR GETRET
JSR CLRMID
PRINT STORYP5
JSR LEAVEC1
JSR GETRET
JSR CLRMID
JSR TEXT
PRINT STORYP6
JSR GETRET
JSR CLRMID
PRINT STORYP7
JSR HGRCLEAR
JSR CASTLE2
JSR GETRET
JSR CLRMID
JSR SETHGR
PRINT STORYP8
JSR ARRIVEC2
JSR GETRET
JSR CLRSCRN
PRINT STORYP9
LDA #%10000000
STA ESCABORT
JSR GETRET
JSR CLRSCRN
JSR TEXT
LDA #0
STA TLINE
JSR TEXTADDR
CENTER INSTR00
PRINT INSTRP1
JSR GETRET
JSR CLRMID
PRINT INSTRP2
JSR GETRET
JSR CLRMID
PRINT INSTRP3
JSR GETRET
JSR CLRMID
PRINT INSTRP4
LDA #%10000000
STA ESCABORT
JSR GETRET
JSR CLRSCRN
LDA #0
STA TLINE
JSR TEXTADDR
CENTER PLAY00
PRINT PLAYP1
LDA #%10000000
STA ESCABORT
JSR GETRET
JSR CLRSCRN
LDA #0
STA TLINE
JSR TEXTADDR
CENTER GPL00
PRINT GPLP1
LDA #%10000000
STA ESCABORT
JSR GETRET
JSR CLRSCRN
RTS
GPL00 ASC "CONTACT & LICENSE"00
PLAY00 ASC "PLAYING NOTES"00
INSTR00 ASC "INSTRUCTIONS"00
TITLE00 ASC "THE STORY"00
STORYP1 HEX 43
ASC "For many years, there had been a legend"8D
ASC "of a magical emerald, entitled the"8D
ASC "'Jewel of Kaldun.' This gem had been"8D
ASC "lost in a deserted castle that was once"8D
ASC "occupied by the great magician Kaldun."8D
HEX 8D
ASC "This castle is rumored to be haunted"8D
ASC "with ghosts, zombies and magical bats,"8D
ASC "and has been acclaimed as being 'fates"8D
ASC "friend or foe.' It has been said that"8D
ASC "whatever kingdom possesses this 'Jewel"8D
ASC "of Kaldun' shall have only peace and"8D
ASC "health for the rest of its days."8D
HEX 8D
ASC "King Aradea was ruling during troubled"8D
ASC "times. Famine and disease plagued his"8D
ASC "kingdom. When he heard of this jewel,"8D
ASC "he announced the following proclamation:"8D00
STORYP2 HEX 4305
ASC "Whosoever finds the Jewel of"8D05
ASC "Kaldun shall be given the hand"8D05
ASC "of my beautiful daughter Lydia"8D05
ASC "in marriage and will follow as"8D05
ASC "my successor. However, there"8D05
ASC "is one stipulation to this"8D05
ASC "quest: he whoever tries must"8D05
ASC "begin his search in the deserted"8D05
ASC "castle at sunset and return to"8D05
ASC "me by noon the following day."8D05
ASC "For whosoever accomplishes this"8D05
ASC "task must be quick of mind and"8D05
ASC "stout of heart. The one who is"8D05
ASC "capable of this task will be"8D05
ASC "worthy of my daughter, and of my"8D05
ASC "kingdom."8D14
ASC "- King Aradea"00
STORYP3 HEX 54
ASC "The kingdom stirred with hope and"8D
ASC "intrigue. Many men attempted the quest"8D
ASC "and were never seen again."00
STORYP4 HEX 54
ASC "One day a local peasant named Meltok"8D
ASC "decided to undertake the proclaimed"8D
ASC "search."00
STORYP5 HEX 54
ASC "After telling King Aradea of his plans,"8D
ASC "he leaves the castle in hopes of the"8D
ASC "Jewel of Kaldun ..."00
STORYP6 HEX 43
ASC "As Meltok left the castle, he realized"8D
ASC "that he needed to know more about this"8D
ASC "castle and the wizard, Kaldun..."8D
HEX 8D
ASC "As you talk to your fellow peasants,"8D
ASC "you notice that noone really knows of"8D
ASC "the wizard Kaldun -- it's all made up!"8D
HEX 8D
ASC "However, about the Castle of Kaldun and"8D
ASC "the Jewel of Kaldun, there is plenty to"8D
ASC "tell. For one, it is said that the"8D
ASC "castle lies deserted. However, it is"8D
ASC "also told that the moment a live creature"8D
ASC "sets foot upon the castles' ground,"8D
ASC "monsters begin to appear. From where,"8D
ASC "noone can tell..."00
STORYP7 HEX 43
ASC "There is a rumor that makes you stop"8D
ASC "in your tracks. 'It is said,' an old"8D
ASC "man says, 'that if the Jewel of Kaldun"8D
ASC "is removed from the castle, the land"8D
ASC "will prosper but a few years before all"8D
ASC "of mankind is lost! Be careful, my"8D
ASC "son.' And with that, he leaves you."8D
ASC "When you look around for the man, he is"8D
ASC "no where to be seen..."00
STORYP8 HEX 55
ASC "Finally, Meltok arrived at the Castle of"8D
ASC "Kaldun."00
STORYP9 HEX 54
ASC "It is time for you to help Meltok find"8D
ASC "the Jewel of Kaldun. Are you capable"8D
ASC "of this formidable task?"00
INSTRP1 HEX 43
ASC "To move Meltok, use the I, J, K, and M"8D
ASC "keys:"8D83
ASC "(north)"8D83
ASC "I"8D83
ASC "(west) J K (east)"8D83
ASC "M"8D83
ASC "(south)"8D
HEX 8D
ASC "When Meltok is on a ladder, press:"8D05
ASC "[A] to ascend (go up) and"8D05
ASC "[D] to descend (go down)"8D
HEX 8D
ASC "When you are unsure of what an item on"8D
ASC "the screen is, press [L] for look."8D
HEX 8D
ASC "To open a chest, press [O], but beware:"8D
ASC "Some treasure chests have traps in them"8D
ASC "that can hurt Meltok!"00
INSTRP2 HEX 43
ASC "To search for secret doors, press [S]"8D
ASC "and the direction you wish to search in."8D
HEX 8D
ASC "When Meltok has found keys, he may"8D
ASC "unlock some of the locked doors in the"8D
ASC "castle by pressing [U] and the direction"8D
ASC "of the door. (There are some special"8D
ASC "doors that will not be opened by the"8D
ASC "general keys ... you must find those.)"8D
HEX 8D
ASC "To heal Meltok, press [R] to rest him."8D
ASC "Hit Points will slowly heal."8D
HEX 8D
ASC "When the JEWEL OF KALDUN is found, press"8D
ASC "[T] and the direction of the gem to take"8D
ASC "it."00
INSTRP3 HEX 43
ASC "To get a numerical status, press:"8D05
ASC "[H] for health, or"8D05
ASC "[W] for wealth"8D
ASC "Health consists of Hit Points, Exper-"8D
ASC "ience and level. Wealth consists of"8D
ASC "Gold Pieces, Keys, and any special"8D
ASC "items."8D
HEX 8D
ASC "When Meltok encounters those vile"8D
ASC "creatures that inhabit the Castle of"8D
ASC "Kaldun, press [F] and a direction key"8D
ASC "to fight them. You will do more damage"8D
ASC "as you go up levels, and will even gain"8D
ASC "automatic hits -- if you live that long."00
INSTRP4 HEX 43
ASC "Whenever you are asked for the direc-"8D
ASC "tion you wish to perform an action in,"8D
ASC "use the movement keys to indicate the"8D
ASC "direction (I, J, K, and M)."8D
HEX 8D
ASC "To get a summary of the commands"8D
ASC "available to Meltok, press [?]."8D
HEX 8D83
ASC "We hope you enjoy the Jewel of Kaldun!"8D83
ASC "A2 Geek / BShagle"00
PLAYP1 HEX 43
ASC "For those of you interested, here are"8D
ASC "all of the monster statistics:"8D
HEX 8D05
ASC "Name HP XP Movement"8D05
ASC "------- -- -- --------"8D05
ASC "Blob 2 10 4"8D05
ASC "Zombie 16 75 1"8D05
ASC "Ghost 8 30 2"8D
HEX 8D
ASC "Movement is how many turns Meltok can"8D
ASC "make before the monster will move. It"8D
ASC "should be said, however, that the mon-"8D
ASC "sters can attack on every move!!"00
GPLP1 HEX 43
ASC "This program is licensed under the GPL."8D
ASC "Please see the LICENSE file available"8D
ASC "in the source code."8D
HEX 8D
ASC "Visit us to report bugs, make"8D
ASC "suggestions, or to just grab the code"8D
ASC "to hack on!"8D
HEX 8D83
ASC "github.com/a2geek/jewel-of-kaldun"8D
HEX 00

472
title.s Executable file
View File

@ -0,0 +1,472 @@
********************************
* Jewel of Kaldun title page. *
* Uses: MATH.MAC *
* MATH *
* SHAPES *
* GENERAL.MAC *
* GRAPHICS *
********************************
TITLEPG JSR SETHGR
STA $C052 ; full page graphics
JSR DRAWBKGD
LDY #15
:PAUSE LDX ROL_CTR
INC ROL_CTR
LDA ROL_CTR,X
TAX
:XXX DEX
BNE :XXX
STA SPEAKER
DEY
BNE :PAUSE
JSR ROLJEWEL
LDA #%00000000
STA CLRFLAG
STA XORFLAG
DRAWLETS MOVW #TTABLE;PTR
:PREPARE LDY #0
LDA (PTR),Y
BNE :GO
JMP :FINISHD
:GO STA TITINCR
JSR PTRINC
LDA (PTR),Y
STA SNUM
JSR PTRINC
LDA (PTR),Y
STA TITLECTR
JSR PTRINC
LDA (PTR),Y
STA TITDELAY
JSR PTRINC
LDA (PTR),Y
STA TITX
LDA #0
STA TITX+1
JSR PTRINC
LDA (PTR),Y
STA TITY
JSR PTRINC
IMULW TITINCR;TITX;TITX
IMULW TITINCR;TITY;TITY
JMP :START
:LOOP MOVB TITINCR;LINECTR
LDY #0
LDA (PTR),Y
STA DIRX
JSR PTRINC
LDA (PTR),Y
STA DIRY
JSR PTRINC
:DRAW LDA TITX+1
LDX TITX
LDY TITY
JSR DRAWSHAP
LDA DIRX
CMP #-1
BEQ :XDEC
CLC
ADC TITX
STA TITX
BNE :YTEST
INC TITX+1
JMP :YTEST
:XDEC DEC TITX
LDA TITX
CMP #-1
BNE :YTEST
DEC TITX+1
:YTEST LDA DIRY ; y is only 1 byte
CLC
ADC TITY
STA TITY
DEC LINECTR
BNE :DRAW
:START DEC TITLECTR
BNE :LOOP
JMP :PREPARE
:FINISHD LDA #%10000000
STA CLRFLAG
RTS
WAIT ENT
SEC
:1 PHA
:0 SBC #1
BNE :0
PLA
SBC #1
BNE :1
RTS
PTRINC INC PTR
BNE :0
INC PTR+1
:0 RTS
TITLECTR HEX 00
LINECTR HEX 00
TITX HEX 0000
TITY HEX 0000
DIRX HEX 00
DIRY HEX 00
TITINCR HEX 0000
TITDELAY HEX 00
********************************
* Table of (x,y) on a 35x20 *
* grid for title page. *
********************************
TTABLE DFB 2,16,41 ; "the", 39 points, 2x2
DFB 100,17,4 ; beginning
DFB 0,1,0,1,0,1,0,1,0,1,1,1,1,0,1,-1,1,-1,0,-1,0,-1
DFB 0,-1,0,-1,0,1,0,1,0,1,0,1,0,1,0,1,0,-1,0,-1
DFB 0,-1,1,-1,1,0,1,1,0,1,0,1,1,1,1,0,1,-1,1,-1
DFB 1,-1,-1,-1,-1,0,-1,1,0,1,0,1,1,1,1,0,1,0
DFB 2,16,4 ; cross the "t", 2x2, 4 pts
DFB 100,16,6
DFB 1,0,1,0,1,0
DFB 8,15,11 ; "J", 11 points, 8x8
DFB 50,6,6 ; beginning (x,y)
DFB 1,1,1,0,1,0,1,-1,0,-1,0,-1,0,-1,0,-1,0,-1,-1,0
DFB 8,15,15 ; "e", 15 points, 8x8
DFB 50,12,5
DFB 1,0,1,0,1,0,0,-1,-1,-1,-1,0,-1,0,-1,1,0,1,0,1
DFB 1,1,1,0,1,0,1,0
DFB 8,15,13 ; "w", 13 points, 8x8
DFB 50,16,3
DFB 0,1,0,1,0,1,1,1,1,-1,0,-1,0,1,1,1,1,-1,0,-1
DFB 0,-1,0,-1
DFB 8,15,15 ; "e", 15 points, 8x8
DFB 50,22,5
DFB 1,0,1,0,1,0,0,-1,-1,-1,-1,0,-1,0,-1,1,0,1,0,1
DFB 1,1,1,0,1,0,1,0
DFB 8,15,11 ; "l", 11 points, 8x8
DFB 50,26,1
DFB 1,0,0,1,0,1,0,1,0,1,0,1,-1,1,1,0,1,0,-1,-1
DFB 2,16,41 ; "of", 44 pts, 2x2
DFB 100,111,4
DFB 1,1,1,0,1,-1,1,0,-1,0,-1,1,0,1,0,1,1,1
DFB 1,0,1,0,1,-1,0,-1,0,-1,-1,-1,1,1,1,1,1,1,1,0
DFB 1,-1,0,-1,0,-1,0,-1,-1,-1,-1,1,0,1,0,1
DFB 0,1,0,1,0,1,0,1,0,1,1,1,1,-1,0,-1,0,-1,-1,-1
DFB 1,0,1,0,1,-1
DFB 8,15,7 ; "K", left line, 8x8
DFB 50,4,9
DFB 0,1,0,1,0,1,0,1,0,1,0,1
DFB 8,15,7 ; "K", finish it off, 8x8
DFB 50,7,9
DFB -1,1,-1,1,-1,1,1,1,1,1,1,1
DFB 8,15,14 ; "a", 14 points, 8x8
DFB 50,9,11
DFB 1,0,1,0,1,1,0,1,0,1,0,1,-1,0,-1,0,-1,0,-1,-1
DFB 1,-1,1,0,1,0
DFB 8,15,11 ; "l", 11 points, 8x8
DFB 50,13,9
DFB 1,0,0,1,0,1,0,1,0,1,0,1,-1,1,1,0,1,0,-1,-1
DFB 8,15,16 ; "d", 16 points, 8x8
DFB 50,20,9
DFB 0,1,0,1,0,1,0,1,0,1,0,1,-1,0,-1,0,-1,0,-1,-1
DFB 0,-1,0,-1,1,-1,1,0,1,0
DFB 8,15,14 ; "u", 14 points, 8x8
DFB 50,21,11
DFB 0,1,0,1,0,1,1,1,1,0,1,-1,1,-1,0,-1,0,-1,0,1
DFB 0,1,0,1,0,1
DFB 8,15,14 ; "n", 14 points, 8x8
DFB 50,26,11
DFB 0,1,0,1,0,1,0,1,0,-1,0,-1,1,-1,1,-1,1,0,1,1
DFB 0,1,0,1,0,1
DFB 0 ; end
********************************
* Draw Background routine. *
* Leave bit set for blue, or *
* strip it off for purple. *
********************************
DRAWBKGD LDA #0
STA HLINE
LDA #2
STA HLINE2
:LOOP JSR HADDR
JSR HADDR2
BCS :ALLDONE
JSR BKLINE12
ADDB #4;HLINE;HLINE
ADDB #4;HLINE2;HLINE2
LDA HLINE
CMP #180
BLT :LOOP
:ALLDONE RTS
BKLINE12 LDY #0
:1 LDX #0
:0 LDA BACKGND1,X
STA (HPTR),Y
LDA BACKGND2,X
STA (HPTR2),Y
INX
INY
CPX #8
BLT :0
CPY #40
BLT :1
RTS
BACKGND1 HEX 858A94A8D0A0C182 ; high bit is set..
BACKGND2 HEX D0A0C182858A94A8 ; blue background.
********************************
* Roll Jewel of Kaldun onto *
* the graphics screen. *
* Jewel picture is stored *
* in hi-res page 2, or *
* locations $4000-$5FFF *
********************************
ROLJEWEL LDA #0
STA ROL_CTR
LDA #174
STA ROLSTART
:LOOP STA HLINE2 ; on page one
LDA #14
STA HLINE ; on page two
:SCROLL JSR HADDR
JSR HADDR2
ADDB #$20;HPTR+1;HPTR+1 ; make page 2 hires
LDY #8
:COPY LDA (HPTR),Y ; copy a line of the jewel
STA (HPTR2),Y ; onto the graphics page.
INY
CPY #32
BLT :COPY
INC HLINE ; increas copying until
INC HLINE2 ; at bottom of window
*-------------------------------
LDX ROL_CTR
INC ROL_CTR
LDY $FF00,X
:0TEST0 DEY
BNE :0TEST0
*-------------------------------
STA SPEAKER
LDA HLINE2 ; on page 1.
CMP #177
BLT :SCROLL
STA SPEAKER
LDY ROLSTART ; do a pause that decreases
:PAUSE LDA #20 ; as jewel moves farther
JSR WAIT ; onto the page
DEY
BNE :PAUSE
LDA ROLSTART ; check if we are already
CMP #14 ; finished
BEQ :EXIT
DEC ROLSTART ; move jewel up a bit
DEC ROLSTART
DEC ROLSTART
DEC ROLSTART
LDA ROLSTART
CMP #14 ; if.lt.14, we have final
BGE :LOOP ; if.ge.14, keep on going
LDA #14 ; show at top.
BNE :LOOP ; always
:EXIT RTS
ROLSTART HEX 00 ; where we are on scroll
ROL_CTR HEX 00 ; -----
********************************
* Fade the Castle wall in for *
* the title page. *
********************************
WALLFADE STA $C052
MOVW #WFTABLE;PTR
MOVB #246;TITLECTR
LDA #%00000000
STA CLRFLAG
LDA #%00000000
STA XORFLAG
:REPEAT JSR TITBUZZ
NILW TITX
NILW TITY
MOVB #18;SNUM
LDY #0
LDA (PTR),Y
STA TITX
JSR PTRINC
LDA (PTR),Y
BPL :0
PHA
MOVB #17;SNUM
PLA
AND #%01111111
:0 STA TITY
JSR PTRINC
DEC TITY
DEC TITX
IMULW #8;TITX;TITX
IMULW #8;TITY;TITY
LDY TITY
LDX TITX
LDA TITX+1
STA SPEAKER
JSR DRAWSHAP
DEC TITLECTR
BEQ :DONE
JMP :REPEAT
:DONE LDA #%10000000
STA CLRFLAG
LDA #%00000000
STA XORFLAG
RTS
TITBUZZ STA SPEAKER
LDX ROL_CTR
INC ROL_CTR
:REPEAT DEX
BNE :REPEAT
STA SPEAKER
RTS
********************************
* Data for fade in of castle *
* wall. These are randomly *
* generated locations. High *
* bit on the Y coordinate *
* determines the shape number. *
* ON = shape #17 *
* OFF= shape #18 *
********************************
WFTABLE DFB 33,149,24,149,28,22,25,148,2,22,23,151
DFB 13,151,3,149,22,21,29,21,2,150,4,21
DFB 29,20,33,23,27,149,12,151,24,150,7,148
DFB 11,21,17,21,30,150,34,21,33,148,11,149
DFB 33,151,2,151,9,20,16,23,16,150,16,22
DFB 7,151,14,150,23,23,26,151,8,21,34,22
DFB 1,22,21,20,8,149,3,21,6,150,22,149,21,151
DFB 32,22,31,23,8,22,10,149,21,150,26,23
DFB 27,20,6,151,8,23,35,148,10,23,34,151
DFB 23,148,21,23,25,21,24,22,26,22,5,150
DFB 8,150,14,151,13,148,16,149,11,148,28,151
DFB 17,151,14,21,18,149,34,23,19,20,19,151
DFB 19,149,28,23,20,150,5,20,7,23,4,151
DFB 14,23,9,22,29,150,33,150,32,149,9,151
DFB 1,21,5,22,1,23,35,151,9,21,2,21
DFB 1,20,18,23,13,22,34,149,17,20,20,151
DFB 9,148,22,22,3,150,25,22,15,150,15,21
DFB 3,22,23,20,30,23,27,21,31,22,12,22
DFB 20,22,22,23,3,23,13,149,5,148,16,151
DFB 1,148,3,148,17,148,29,151,31,148,27,151
DFB 27,22,9,149,13,23,5,23,5,149,19,148
DFB 15,148,3,151,11,23,30,151,6,149,35,21
DFB 10,150,6,22,9,23,30,21,5,151,19,150
DFB 25,23,32,151,17,23,32,23,26,150,26,149
DFB 28,150,25,20,23,150,16,21,6,21,7,22
DFB 7,150,17,149,23,22,14,22,25,150,27,150
DFB 17,150,13,21,31,21,19,23,20,149,33,22
DFB 19,21,22,151,35,149,30,22,28,21,12,149
DFB 29,22,1,151,35,150,20,21,26,21,7,149
DFB 15,151,35,22,30,149,12,23,4,150,19,22
DFB 18,150,10,151,7,21,29,148,11,22,27,148
DFB 15,20,3,20,9,150,11,151,2,23,21,149
DFB 22,150,12,21,28,149,25,151,21,148,5,21
DFB 33,20,7,20,13,20,15,23,27,23,4,149
DFB 1,150,1,149,29,149,12,150,35,20,13,150
DFB 21,22,2,149,31,151,15,149,29,23,17,22
DFB 34,150,10,21,20,23,32,21,15,22,18,151
DFB 24,21,24,151,14,149,11,150,32,150,25,149
DFB 4,22,4,23,24,23,33,21,23,21,6,23
DFB 31,20,31,149,18,21,23,149,10,22,8,151
DFB 21,21,11,20,18,22,31,150,35,23
********************************
* Prepare for scrolling: *
********************************
LINE21 = $650
LINE22 = $6D0
LINE23 = $750
SCPREP JSR CLRSCRN
LDY #40
LDA #$20 ; inverse space
:0 STA LINE21-1,Y
STA LINE22-1,Y
STA LINE23-1,Y
DEY
BPL :0
STA $C053
RTS
********************************
* Scrolling line: *
********************************
SCLINE INV " "
INV "... THE JEWEL OF KALDUN "
INV "... PROGRAMMED BY A2GEEK "
INV "... STORY BY BSHAGE "
INV "... PRESS <RETURN> TO PLAY "
INV "... PRESS <I> FOR INSTRUCTIONS AND INFORMATION "
INV "..."
HEX 00
********************************
* Scroll that line, and check *
* to see if a RETURN or I has *
* been pressed. (or Q) *
********************************
SCROLL LDA #0
STA KEYSTROB
:REPEAT TAY
PHA
LDX #0
:1 LDA SCLINE,Y
BNE :0
LDY #0
BEQ :1
:0 STA LINE22,X
INY
INX
CPX #40
BLT :1
LDA #220
JSR WAIT
LDA KEYBOARD
BMI :KEY
:RESUME PLA
TAY
INY
LDA SCLINE,Y
BEQ SCROLL
TYA
JMP :REPEAT
:KEY STA KEYSTROB
CMP #$8D
BEQ :EXIT
CMP #"Q"
BEQ :EXIT
CMP #"q"
BEQ :EXIT
CMP #"I"
BEQ :EXIT
CMP #"i"
BEQ :EXIT
DEC RANDOM1 ; delay until all three
BNE :RESUME ; bytes of RANDOM (aka
DEC RANDOM2 ; counter) become
BNE :RESUME ; zero once again.
**** DEC RANDOM3 ; Then, trick the program
**** BNE :RESUME ; into thinking that "I"
LDA #"I" ; has been pressed.
:EXIT PHA
JSR SCPREP ; clear out scrolling region.
PLA
TAY ; do this to preserve
PLA ; keypress...
TYA
RTS