mirror of
https://github.com/a2geek/jewel-of-kaldun.git
synced 2025-03-20 07:29:34 +00:00
473 lines
15 KiB
ArmAsm
Executable File
473 lines
15 KiB
ArmAsm
Executable File
********************************
|
|
* 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
|
|
|