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