jewel-of-kaldun/graphics.s

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