1
2
3
4        MODULE  get_data
5
6	PUBLIC	get_bkg_data
7	PUBLIC	_get_bkg_data
8	PUBLIC	get_win_data
9	PUBLIC	_get_win_data
10	PUBLIC	get_sprite_data
11	PUBLIC	_get_sprite_data
12
13	GLOBAL	copy_vram
14
15        SECTION code_driver
16
17        INCLUDE "target/gb/def/gb_globals.def"
18
19
20; void __LIB__ set_bkg_data(uint8_t first_tile, uint8_t nb_tiles, unsigned char *data) __smallc NONBANKED;
21; void __LIB__ set_win_data(uint8_t first_tile, uint8_t nb_tiles, unsigned char *data) __smallc NONBANKED;
22get_bkg_data:
23_get_bkg_data:
24get_win_data:
25_get_win_data:
26	LDH	A,(LCDC)
27	BIT	4,A
28	JP	NZ,_get_sprite_data
29
30	PUSH	BC
31
32	ld	hl,sp+4
33	LD	C,(HL)		; BC = data
34	INC	HL
35	LD	B,(HL)
36	INC	HL
37	LD	E,(HL)		; E = nb_tiles
38	INC	HL
39	INC	HL
40	LD	L,(HL)		; L = first_tile
41	PUSH	HL
42
43	XOR	A
44	OR	E		; Is nb_tiles == 0?
45	JR	NZ,set_1
46	LD	DE,0x1000	; DE = nb_tiles = 256
47	JR	set_2
48set_1:
49	LD	H,0x00		; HL = nb_tiles
50	LD	L,E
51	ADD	HL,HL		; HL *= 16
52	ADD	HL,HL
53	ADD	HL,HL
54	ADD	HL,HL
55	LD	D,H		; DE = nb_tiles
56	LD	E,L
57set_2:
58	POP	HL		; HL = first_tile
59	LD	A,L
60	RLCA			; Sign extend (patterns have signed numbers)
61	SBC	A
62	LD	H,A
63	ADD	HL,HL		; HL *= 16
64	ADD	HL,HL
65	ADD	HL,HL
66	ADD	HL,HL
67
68	PUSH	BC
69	LD	BC,0x9000
70	ADD	HL,BC
71	POP	BC
72
73set_3:			; Special version of '.copy_vram'
74	BIT	3,H		; Bigger than 0x9800
75	JR	Z,set_4
76	BIT	4,H
77	JR	Z,set_4
78	RES	4,H		; Switch to 0x8800
79set_4:
80	LDH	A,(STAT)
81	AND	0x02
82	JR	NZ,set_4
83
84	LD	A,(HL+)
85	LD	(BC),A
86	INC	BC
87	DEC	DE
88	LD	A,D
89	OR	E
90	JR	NZ,set_3
91
92	POP	BC
93	RET
94
95get_sprite_data:
96_get_sprite_data:
97	PUSH	BC
98
99	ld	hl,sp+4
100	LD	C,(HL)		; BC = data
101	INC	HL
102	LD	B,(HL)
103	INC	HL
104	LD	E,(HL)		; E = nb_tiles
105	INC	HL
106	INC	HL
107	LD	L,(HL)		; L = first_tile
108	PUSH	HL
109
110	XOR	A
111	OR	E		; Is nb_tiles == 0?
112	JR	NZ,spr_1
113	LD	DE,0x1000	; DE = nb_tiles = 256
114	JR	spr_2
115spr_1:
116	LD	H,0x00		; HL = nb_tiles
117	LD	L,E
118	ADD	HL,HL		; HL *= 16
119	ADD	HL,HL
120	ADD	HL,HL
121	ADD	HL,HL
122	LD	D,H		; DE = nb_tiles
123	LD	E,L
124spr_2:
125	POP	HL		; HL = first_tile
126	LD	L,A
127	ADD	HL,HL		; HL *= 16
128	ADD	HL,HL
129	ADD	HL,HL
130	ADD	HL,HL
131
132	PUSH	BC
133	LD	BC,0x8000
134	ADD	HL,BC
135	LD	B,H
136	LD	C,L
137	POP	HL
138
139	CALL	copy_vram
140
141	POP	BC
142	RET
143