104 lines
1.6 KiB
ArmAsm
104 lines
1.6 KiB
ArmAsm
.include "global.s"
|
|
|
|
;; BANKED: checked
|
|
.area _BASE
|
|
|
|
;; Store window tile table into (BC) at xy = DE of size WH = HL
|
|
;; WH >= (1,1)
|
|
.get_xy_wtt::
|
|
PUSH HL ; Store WH
|
|
PUSH HL ; Store WH
|
|
LDH A,(.LCDC)
|
|
BIT 6,A
|
|
JR NZ,1$
|
|
LD HL,#0x9800 ; HL = origin
|
|
JR .get_xy_tt
|
|
1$:
|
|
LD HL,#0x9C00 ; HL = origin
|
|
JR .get_xy_tt
|
|
;; Store background tile table into (BC) at XY = DE of size WH = HL
|
|
;; WH >= (1,1)
|
|
.get_xy_btt::
|
|
PUSH HL ; Store WH
|
|
LDH A,(.LCDC)
|
|
BIT 3,A
|
|
JR NZ,1$
|
|
LD HL,#0x9800 ; HL = origin
|
|
JR .get_xy_tt
|
|
1$:
|
|
LD HL,#0x9C00 ; HL = origin
|
|
; JR .get_xy_tt
|
|
|
|
.get_xy_tt::
|
|
PUSH BC ; Store source
|
|
XOR A
|
|
OR E
|
|
JR Z,2$
|
|
|
|
LD BC,#0x20 ; One line is 20 tiles
|
|
1$:
|
|
ADD HL,BC ; Y coordinate
|
|
DEC E
|
|
JR NZ,1$
|
|
2$:
|
|
LD B,#0x00 ; X coordinate
|
|
LD C,D
|
|
ADD HL,BC
|
|
|
|
POP BC ; BC = source
|
|
POP DE ; DE = WH
|
|
PUSH HL ; Store origin
|
|
PUSH DE ; Store WH
|
|
3$:
|
|
LDH A,(.STAT)
|
|
AND #0x02
|
|
JR NZ,3$
|
|
|
|
LD A,(HL+) ; Copy W tiles
|
|
LD (BC),A
|
|
INC BC
|
|
DEC D
|
|
JR NZ,3$
|
|
POP HL ; HL = WH
|
|
LD D,H ; Restore D = W
|
|
POP HL ; HL = origin
|
|
DEC E
|
|
JR Z,4$
|
|
|
|
PUSH BC ; Next line
|
|
LD BC,#0x20 ; One line is 20 tiles
|
|
ADD HL,BC
|
|
POP BC
|
|
|
|
PUSH HL ; Store current origin
|
|
PUSH DE ; Store WH
|
|
JR 3$
|
|
4$:
|
|
RET
|
|
|
|
_get_tiles::
|
|
PUSH BC
|
|
|
|
LDA HL,11(SP) ; Skip return address and registers
|
|
LD D,(HL) ; DE = src
|
|
DEC HL
|
|
LD E,(HL)
|
|
DEC HL
|
|
LD B,(HL) ; BC = dst
|
|
DEC HL
|
|
LD C,(HL)
|
|
LDA HL,4(SP) ; Skip return address and registers
|
|
PUSH DE ; Store address on stack for set_xy_tt
|
|
LD D,(HL) ; D = x
|
|
INC HL
|
|
LD E,(HL) ; E = y
|
|
INC HL
|
|
LD A,(HL+) ; A = w
|
|
LD L,(HL) ; L = h
|
|
LD H,A ; H = w
|
|
|
|
CALL .get_xy_tt
|
|
|
|
POP BC
|
|
RET
|