gbdk-2020 | GameBoy Development Kit |
| download: https://git.y1.nz/archives/gbdk.tar.gz | |
| README | Files | Log | Refs | LICENSE |
gbdk-lib/examples/gb/galaxy/galaxy.c
1 /*
2 * C version of the 'space' assembly demo.
3 *
4 * Little demo illustrating how to use the graphical possibilities
5 * of the GB (background, window and animated sprite)
6 * I have used fixed-point values for both the position and
7 * speed of objects to get smooth movements
8 *
9 * OBJ data : 0x8000 -> 0x8FFF (unsigned)
10 * Window data : 0x8800 -> 0x97FF (unsigned)
11 * Background data : 0x8800 -> 0x97FF (signed)
12 *
13 * Tiled 0xFC -> 0xFF are standard tiles (all black -> all white)
14 *
15 * Keys:
16 * Arrow keys : Change the speed (and direction) of the sprite
17 * Arrow keys + A : Change the speed (and direction) of the window
18 * Arrow keys + B : Change the speed (and direction) of the background
19 * START : Open/close the door
20 * SELECT : Basic fading effect
21 *
22 * Note that the window is kept in the lower right part of the screen
23 * since it can't be made transparent
24 */
25
26 #include <gb/gb.h>
27 #include <stdint.h>
28
29 const unsigned char std_data[] = {
30
31 /* Basic tiles (0xFC to 0xFF) */
32 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
33 0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,
34 0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,
35 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
36 };
37
38 const unsigned char earth_data[] = {
39
40 /* Tile 0x00 */
41 0x07,0x07,0x18,0x1F,0x32,0x2D,0x71,0x4E,0x70,0x4F,0xF8,0x87,0xF8,0x87,0xF8,0x87,
42 0xFC,0x83,0xFE,0x81,0x7F,0x40,0x7F,0x40,0x3F,0x20,0x1F,0x18,0x07,0x07,0x00,0x00,
43 0xC0,0xC0,0xF0,0x30,0x78,0x88,0x3C,0xC4,0x5C,0xA4,0x9E,0x62,0x3E,0xC2,0x3E,0xC2,
44 0x5E,0xA2,0x7E,0x82,0x0C,0xF4,0x0C,0xF4,0x98,0x68,0xB0,0x70,0xC0,0xC0,0x00,0x00,
45 0x07,0x07,0x1F,0x18,0x2F,0x30,0x4F,0x70,0x6F,0x50,0x9F,0xE0,0x9F,0xE0,0xBF,0xC0,
46 0xFF,0x80,0xB7,0xC8,0x63,0x5C,0x43,0x7C,0x3F,0x20,0x1F,0x18,0x07,0x07,0x00,0x00,
47 0xC0,0xC0,0xB0,0x70,0x18,0xE8,0x0C,0xF4,0x0C,0xF4,0x82,0x7E,0x82,0x7E,0x86,0x7A,
48 0xC6,0x3A,0xE6,0x1A,0xF4,0x0C,0xFC,0x04,0xF8,0x08,0xF0,0x30,0xC0,0xC0,0x00,0x00,
49
50 /* Tile 0x08 */
51 0x07,0x07,0x1E,0x19,0x20,0x3F,0x40,0x7F,0x42,0x7D,0x81,0xFE,0x81,0xFE,0x83,0xFC,
52 0xD7,0xA8,0xBB,0xC4,0x6E,0x51,0x7C,0x43,0x3F,0x20,0x1F,0x18,0x07,0x07,0x00,0x00,
53 0xC0,0xC0,0x70,0xB0,0xE8,0x18,0xF4,0x0C,0xF4,0x0C,0xFE,0x02,0xFE,0x02,0xFE,0x02,
54 0xFE,0x02,0x7E,0x82,0x3C,0xC4,0x3C,0xC4,0xF8,0x08,0xF0,0x30,0xC0,0xC0,0x00,0x00,
55 0x07,0x07,0x1B,0x1C,0x20,0x3F,0x40,0x7F,0x40,0x7F,0xE0,0x9F,0x90,0xEF,0x89,0xF6,
56 0x8D,0xF2,0x9F,0xE0,0x5E,0x61,0x6F,0x50,0x3F,0x20,0x1F,0x18,0x07,0x07,0x00,0x00,
57 0xC0,0xC0,0xB0,0x70,0x28,0xD8,0x04,0xFC,0x2C,0xD4,0x1E,0xE2,0x1E,0xE2,0x3E,0xC2,
58 0x7E,0x82,0xB6,0x4A,0xE4,0x1C,0xC4,0x3C,0xF8,0x08,0xF0,0x30,0xC0,0xC0,0x00,0x00,
59
60 /* Tile 0x10 */
61 0x07,0x07,0x18,0x1F,0x20,0x3F,0x40,0x7F,0x40,0x7F,0xEE,0x91,0xF1,0x8E,0xE0,0x9F,
62 0xE0,0x9F,0xF1,0x8E,0x71,0x4E,0x72,0x4D,0x3F,0x20,0x1F,0x18,0x07,0x07,0x00,0x00,
63 0xC0,0xC0,0xF0,0x30,0x08,0xF8,0x04,0xFC,0x04,0xFC,0x02,0xFE,0x02,0xFE,0x92,0x6E,
64 0xD6,0x2A,0xFE,0x02,0xEC,0x14,0xFC,0x04,0xF8,0x08,0xF0,0x30,0xC0,0xC0,0x00,0x00,
65 0x07,0x07,0x1D,0x1A,0x36,0x29,0x5C,0x63,0x6C,0x53,0xCE,0xB1,0x9F,0xE0,0x9E,0xE1,
66 0xAE,0xD1,0xBF,0xC0,0x47,0x78,0x47,0x78,0x2F,0x30,0x1F,0x18,0x07,0x07,0x00,0x00,
67 0xC0,0xC0,0x70,0xB0,0x08,0xF8,0x04,0xFC,0x04,0xFC,0xE2,0x1E,0x32,0xCE,0x0E,0xF2,
68 0x0E,0xF2,0x1E,0xE2,0x1C,0xE4,0x2C,0xD4,0xF8,0x08,0xF0,0x30,0xC0,0xC0,0x00,0x00,
69
70 /* Tile 0x18 */
71 0x07,0x07,0x1E,0x19,0x33,0x2C,0x49,0x76,0x42,0x7D,0xC4,0xBB,0xC1,0xBE,0xC1,0xBE,
72 0xE2,0x9D,0xF3,0x8C,0x78,0x47,0x78,0x47,0x3C,0x23,0x1C,0x1B,0x07,0x07,0x00,0x00,
73 0xC0,0xC0,0x70,0xB0,0x68,0x98,0xC4,0x3C,0xC4,0x3C,0xEE,0x12,0xF2,0x0E,0xE2,0x1E,
74 0xE2,0x1E,0xF2,0x0E,0x7C,0x84,0x7C,0x84,0xF8,0x08,0xF0,0x30,0xC0,0xC0,0x00,0x00
75 };
76
77 const unsigned char frame_data[] = {
78
79 /* Tile 0x00 */
80 0xFF,0x00,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,
81 0xFF,0x00,0x01,0xFE,0x03,0xFC,0x07,0xF8,0x0F,0xF0,0x1F,0xE0,0x3F,0xC0,0x7F,0x80,
82 0xFF,0x00,0xFE,0x01,0xFC,0x03,0xF8,0x07,0xF0,0x0F,0xE0,0x1F,0xC0,0x3F,0x80,0x7F,
83 0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,
84 0xFF,0x00,0xFF,0x01,0xFD,0x03,0xF9,0x07,0xF1,0x0F,0xE1,0x1F,0xC1,0x3F,0x81,0x7F,
85 0x80,0x7F,0x81,0x7E,0x83,0x7C,0x87,0x78,0x8F,0x70,0x9F,0x60,0xBF,0x40,0xFF,0x00,
86 0xFF,0x70,0xFF,0x98,0xEF,0xB8,0xCF,0xF8,0xFF,0x70,0xFF,0x00,0xFF,0x00,0xFF,0x01,
87 0xFF,0x00,0xFE,0x01,0xFC,0x03,0xF8,0x07,0xF0,0x0F,0xE0,0x1F,0xC0,0x3F,0xFF,0xFF,
88
89 /* Tile 0x08 */
90 0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0xFF,
91 0x00,0xFF,0x01,0xFE,0x03,0xFC,0x07,0xF8,0x0F,0xF0,0x1F,0xE0,0x3F,0xC0,0xFF,0xFF,
92 0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,
93 0xFF,0x0E,0xFF,0x13,0xFD,0x17,0xF9,0x1F,0xFE,0x0F,0xE0,0x1F,0xC0,0x3F,0x80,0xFF,
94 0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,
95 0xFF,0x01,0xFF,0x01,0xFD,0x03,0xF9,0x07,0xF1,0x0F,0xE1,0x1F,0xC1,0x3F,0x81,0x7F,
96 0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,
97 0x01,0xFF,0x01,0xFF,0x03,0xFD,0x07,0xF9,0x0F,0xF1,0x1F,0xE1,0x3F,0xC1,0x7F,0x81,
98
99 /* Tile 0x10 */
100 0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,
101 0x01,0xFF,0x01,0xFE,0x03,0xFC,0x77,0xF8,0xFF,0x98,0xEF,0xB8,0xCF,0xF8,0x7F,0xF0,
102 0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x0E,0xFF,0x13,0xFD,0x17,0xF9,0x1F,0xFF,0x0E,
103 0x80,0x7F,0x81,0x7E,0x83,0x7C,0x87,0x78,0x8F,0x70,0x9F,0x60,0xBF,0x40,0xFF,0x7F,
104 0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0xFF,0xFF,
105
106 /* Door1 */
107
108 /* Tile 0x15 */
109 0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,
110 0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,
111 0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0xFF,
112
113 /* Door2 */
114
115 /* Tile 0x18 */
116 0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,
117 0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0xFF,
118 0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,
119 0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
120
121 /* Door3 */
122
123 /* Tile 0x1C */
124 0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0xFF,
125 0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,
126 0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,
127 0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
128
129 /* Door4 */
130
131 /* Tile 0x20 */
132 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
133 };
134
135 const unsigned char bkg_data[] = {
136
137 /* Tile 0x00 */
138 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF,
139 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0xFF,0xFF,0xFF,
140 0xFF,0xFF,0xFF,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
141 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xF7,0xFF,0xFF,
142 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
143 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,
144 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
145 0xFF,0xFF,0xDF,0xFF,0xEF,0xFF,0xFF,0xF7,0xFF,0xFB,0xFF,0xFD,0xFF,0xFE,0xFE,0xFF,
146
147 /* Tile 0x08 */
148 0xFF,0xFF,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7D,0xFE,0x7C,0x39,
149 0xFF,0xFF,0xF7,0xFF,0xEF,0xFF,0xFF,0xDF,0xFF,0xBF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,
150 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,
151 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFE,0xFF,0xFD,
152 0xBB,0x01,0xC7,0x83,0xC7,0x83,0xC7,0x83,0xBB,0x01,0x7C,0x39,0x7D,0xFE,0xFF,0xFF,
153 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,
154 0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,
155 0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFB,0xAF,0x77,0x27,0x8F,0xDF,0x8F,0x27,0x8F,
156
157 /* Tile 0x10 */
158 0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
159 0xFF,0xFB,0xFF,0xF7,0xEF,0xFF,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
160 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
161 0xFF,0xBF,0xFF,0xDF,0xEF,0xFF,0xF7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
162 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
163 0xFF,0xFF,0xFF,0xFE,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
164 0xAF,0x77,0xFF,0xFB,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
165 0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0xFF,
166
167 /* Tile 0x18 */
168 0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,
169 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,0xFF,0xFF,
170 0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,
171 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0x7D,0xFE,0x7C,0x39,
172 0xFF,0xFF,0xF7,0xFF,0xEF,0xFF,0xFF,0xDF,0xFF,0xBF,0xFF,0x7F,0x7F,0xFF,0xFF,0xFF,
173 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFF,
174 0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
175 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFD,
176
177 /* Tile 0x20 */
178 0xFF,0xFF,0xDF,0xFF,0xEF,0xFF,0xFF,0xF7,0xFF,0xFB,0xFE,0xFD,0xFD,0xFE,0xFE,0xFF,
179 0xAB,0x11,0xC7,0x83,0x83,0xC7,0xC7,0x83,0xAB,0x11,0x7C,0x39,0x7D,0xFE,0xFE,0xFF,
180 0xFF,0xFF,0xFF,0xFF,0xFB,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0x7F,
181 0xFB,0xFF,0xFF,0xFD,0xFE,0xFE,0xFE,0xFF,0xFE,0xFE,0xFF,0xFD,0xFB,0xFF,0xFF,0xFF,
182 0xEF,0xFF,0xFF,0xDF,0x3F,0xBF,0x3F,0x7F,0x3F,0xBF,0xFF,0xDF,0xEF,0xFF,0xFF,0xFF,
183 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFB,0xFF,0xFF,0xFF,0xFF,
184 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFD,0xFE,0xFE,0xFD,
185 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0xFF,0xFF,
186
187 /* Tile 0x28 */
188 0xF7,0xFF,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
189 0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
190 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,
191 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
192 0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
193 };
194
195 /*
196 * Image size: 0x40 x 0x40
197 * Number of tiles (total - unique): 0x40 - 0x2D
198 */
199
200 const unsigned char bkg_tiles[] = {
201 0x00,0x01,0x02,0x03,0xFC,0xFC,0x04,0xFC,
202 0xFC,0x05,0x06,0xFC,0x07,0x08,0x09,0x0A,
203 0xFC,0xFC,0xFC,0x02,0x0B,0x0C,0x0D,0xFC,
204 0x0E,0x0F,0x10,0xFC,0x11,0x12,0x13,0x14,
205 0x15,0x16,0x17,0xFC,0x18,0x19,0x1A,0xFC,
206 0x1B,0x1C,0x1D,0xFC,0xFC,0x1E,0x1F,0x20,
207 0x21,0x22,0xFC,0x23,0x24,0x25,0xFC,0x26,
208 0x27,0x13,0x28,0x29,0x2A,0x2B,0x2C,0x11
209 };
210
211 /*
212 * Image size: 0x10 x 0x70
213 * Number of tiles (total - unique): 0x1C - 0x1C
214 */
215
216 const unsigned char earth_tiles[] = {
217 0x00,0x02,
218 0x04,0x06,
219 0x08,0x0A,
220 0x0C,0x0E,
221 0x10,0x12,
222 0x14,0x16,
223 0x18,0x1A
224 };
225
226 /*
227 * Image size: 0x80 x 0x50
228 * Number of tiles (total - unique): 0xA0 - 0x15
229 */
230
231 const unsigned char frame_tiles[] = {
232 0x80,0x81,0xFD,0x82,0x83,0x81,0xFD,0x82,0x83,0x81,0xFD,0x82,0x83,0x81,0xFD,0x84,
233 0x85,0x86,0x87,0x88,0x89,0x8A,0x87,0x88,0x89,0x8A,0x87,0x88,0x89,0x8A,0x8B,0x8C,
234 0xFD,0x8D,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x8E,0x8F,
235 0x82,0x8C,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x85,0x90,
236 0x8E,0x8F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0x8D,
237 0x85,0x90,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x82,0x8C,
238 0xFD,0x8D,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x8E,0x8F,
239 0x82,0x8C,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x85,0x90,
240 0x8E,0x91,0xFD,0x82,0x83,0x81,0xFD,0x82,0x83,0x81,0xFD,0x82,0x83,0x81,0x92,0x8D,
241 0x93,0x8A,0x87,0x88,0x89,0x8A,0x87,0x88,0x89,0x8A,0x87,0x88,0x89,0x8A,0x87,0x94
242 };
243
244 /*
245 * Image size: 0x60 x 0x30
246 * Number of tiles (total - unique): 0x48 - 0x03
247 */
248
249 const unsigned char door1_tiles[] = {
250 0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,
251 0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,
252 0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,
253 0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,
254 0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,
255 0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,
256
257 0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,
258 0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,
259 0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,
260 0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,
261 0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,
262 0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC
263 };
264
265 /*
266 * Image size: 0x60 x 0x30
267 * Number of tiles (total - unique): 0x48 - 0x04
268 */
269
270 const unsigned char door2_tiles[] = {
271 0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,
272 0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,
273 0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,
274 0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,
275 0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,
276 0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,
277
278 0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,
279 0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,
280 0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,
281 0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,
282 0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,
283 };
284
285 /*
286 * Image size: 0x60 x 0x30
287 * Number of tiles (total - unique): 0x48 - 0x04
288 */
289
290 const unsigned char door3_tiles[] = {
291 0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,
292 0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,
293 0x9E,0x9E,0x9E,0x9E,0x9E,0x9E,0x9E,0x9E,0x9E,0x9E,0x9E,0x9E,
294 0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,
295 0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,
296 0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
297
298 0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,
299 0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,
300 0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,
301 0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,
302 0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC
303 };
304
305 /*
306 * Image size: 0x60 x 0x30
307 * Number of tiles (total - unique): 0x48 - 0x01
308 */
309
310 const unsigned char door4_tiles[] = {
311 0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,
312 0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,
313 0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,
314 0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,
315 0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,
316 0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,
317
318 0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,
319 0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,
320 0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,
321 0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,
322 0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC
323 };
324
325 /* Should really be const, but sdcc doesnt yet support it. */
326 const unsigned char * const film[] = {
327 &door1_tiles[0x0C*0],
328 &door2_tiles[0x0C*0],
329 &door3_tiles[0x0C*0],
330 &door4_tiles[0x0C*0],
331 &door1_tiles[0x0C*1],
332 &door2_tiles[0x0C*1],
333 &door3_tiles[0x0C*1],
334 &door4_tiles[0x0C*1],
335 &door1_tiles[0x0C*2],
336 &door2_tiles[0x0C*2],
337 &door3_tiles[0x0C*2],
338 &door4_tiles[0x0C*2],
339 &door1_tiles[0x0C*3],
340 &door2_tiles[0x0C*3],
341 &door3_tiles[0x0C*3],
342 &door4_tiles[0x0C*3],
343 &door1_tiles[0x0C*4],
344 &door2_tiles[0x0C*4],
345 &door3_tiles[0x0C*4],
346 &door4_tiles[0x0C*4],
347 &door1_tiles[0x0C*5],
348 &door2_tiles[0x0C*5],
349 &door3_tiles[0x0C*5],
350 &door4_tiles[0x0C*5],
351 &door1_tiles[0x0C*6]
352 };
353
354 #define NBDFRAMES 0x18 /* Nb frames for the door */
355 #define NBSFRAMES 0x07 /* Nb frames for the sprite */
356 #define WINSZX 0x80u /* Size of the picture in the window */
357 #define WINSZY 0x50u
358 #define MINWINX ((uint8_t)MAXWNDPOSX-WINSZX + 1u) /* Bounds of the window origin */
359 #define MINWINY ((uint8_t)MAXWNDPOSY-WINSZY + 1u)
360 #define MAXWINX ((uint8_t)MAXWNDPOSX)
361 #define MAXWINY ((uint8_t)MAXWNDPOSY)
362 #define FADESTEP 0x10 /* Nb steps for the fading effect */
363 #define STARTFADE (0x06*FADESTEP) /* Initial value for the fading effect */
364
365 #define CLOSED 0x00
366 #define OPENING 0x01
367 #define OPENED 0x02
368 #define CLOSING 0x03
369
370 static uint8_t time = 0; /* Global "time" value (counter) */
371 uint8_t doorstate = 0; /* State of the door (OPENED, CLOSED...) */
372 uint8_t doorpos = 0; /* Current position in the door animation */
373 static uint8_t color = 0; /* Current color for fading effect */
374 uint8_t sframe = 0; /* Current frame of the sprite */
375 fixed bposx, bposy; /* Background position (fixed point) */
376 fixed bspx, bspy; /* Background speed (fixed point) */
377 fixed wposx, wposy; /* Window position (fixed point) */
378 fixed wspx, wspy; /* Window speed (fixed point) */
379 fixed sposx, sposy; /* Sprite position (fixed point) */
380 fixed sspx, sspy; /* Sprite speed (fixed point) */
381
382 void fade(void);
383 void scroll(void);
384 void door(void);
385 void animate_sprite(void);
386 void tile_sprite(void);
387 void place_sprite(void);
388
389 /* Fade the screen (off and on) */
390 void fade(void)
391 {
392 if(color == 0)
393 return;
394 switch(color)
395 {
396 case STARTFADE:
397 case STARTFADE-4*FADESTEP:
398 BGP_REG = 0xF9U;
399 break;
400 case STARTFADE-FADESTEP:
401 case STARTFADE-3*FADESTEP:
402 BGP_REG = 0xFEU;
403 break;
404 case STARTFADE-2*FADESTEP:
405 BGP_REG = 0xFFU;
406 break;
407 case STARTFADE-5*FADESTEP:
408 BGP_REG = 0xE4U;
409 break;
410 }
411 color--;
412 }
413
414 /* Scroll the background, the window and the sprite */
415 void scroll(void)
416 {
417 /* Update background */
418 bposx.w += bspx.w;
419 bposy.w += bspy.w;
420 SCX_REG = bposx.b.h;
421 SCY_REG = bposy.b.h;
422
423 /* Update window */
424 wposx.w += wspx.w ;
425 wposy.w += wspy.w ;
426 /* X position */
427 if(wposx.b.h >= MAXWINX) {
428 wposx.b.h = MAXWINX;
429 /* Invert speed */
430 wspx.w = -(int16_t)wspx.w;
431 } else if(wposx.b.h <= MINWINX) {
432 wposx.b.h = MINWINX;
433 /* Invert speed */
434 wspx.w = -(int16_t)wspx.w;
435 }
436 WX_REG = wposx.b.h;
437 /* Y position */
438 if(wposy.b.h >= MAXWINY) {
439 wposy.b.h = MAXWINY;
440 /* Invert speed */
441 wspy.w = -(int16_t)wspy.w;
442 } else if(wposy.b.h <= MINWINY) {
443 wposy.b.h = MINWINY;
444 /* Invert speed */
445 wspy.w = -(int16_t)wspy.w;
446 }
447 WY_REG = wposy.b.h;
448
449 /* Update sprite */
450 sposx.w += sspx.w;
451 sposy.w += sspy.w;
452 place_sprite();
453 }
454
455 /* Open and close the door */
456 void door(void)
457 {
458 if(doorstate == OPENING) {
459 doorpos++;
460 /* Draw the door in the window */
461 set_win_tiles(2, 2, 12, 6, (unsigned char*)film[doorpos]);
462 if(doorpos == NBDFRAMES)
463 doorstate = OPENED;
464 } else if(doorstate == CLOSING) {
465 doorpos--;
466 /* Draw the door in the window */
467 set_win_tiles(2, 2, 12, 6, (unsigned char*)film[doorpos]);
468 if(doorpos == 0)
469 doorstate = CLOSED;
470 }
471 }
472
473 /* Animate sprite */
474 void animate_sprite(void)
475 {
476 if((time&0x07) == 0) {
477 sframe++;
478 if(sframe == NBSFRAMES)
479 sframe = 0;
480 tile_sprite();
481 }
482 }
483
484 /* Set sprite tiles */
485 void tile_sprite(void)
486 {
487 uint8_t s;
488
489 s = sframe<<1;
490 set_sprite_tile(0, earth_tiles[s]);
491 set_sprite_tile(1, earth_tiles[s+1]);
492 }
493
494 /* Place sprite */
495 void place_sprite(void)
496 {
497 move_sprite(0, sposx.b.h, sposy.b.h);
498 move_sprite(1, sposx.b.h+8, sposy.b.h);
499 }
500
501 void main(void)
502 {
503 uint8_t i, j;
504
505 disable_interrupts();
506 DISPLAY_OFF;
507 LCDC_REG = LCDCF_OFF | LCDCF_WIN9C00 | LCDCF_WINON | LCDCF_BG8800 | LCDCF_BG9800 | LCDCF_OBJ16 | LCDCF_OBJON | LCDCF_BGON;
508 /*
509 * LCD = Off
510 * WindowBank = 0x9C00
511 * Window = On
512 * BG Chr = 0x8800
513 * BG Bank = 0x9800
514 * OBJ = 8x16
515 * OBJ = On
516 * BG = On
517 */
518
519 doorstate = CLOSED;
520
521 /* Set palettes */
522 BGP_REG = OBP0_REG = OBP1_REG = 0xE4U;
523
524 /* Initialize the background */
525 set_bkg_data(0xFC, 0x04, std_data);
526 set_bkg_data(0x00, 0x2D, bkg_data);
527 /*
528 * Draw the background
529 *
530 * Width = 0x100 = 0x20 * 8
531 * Height = 0x100 = 0x20 * 8
532 */
533 for(i = 0; i < 32; i+=8)
534 for(j = 0; j < 32; j+=8)
535 set_bkg_tiles(i, j, 8, 8, bkg_tiles);
536 bposx.w = 0;
537 SCX_REG = 0;
538 bposy.w = 0;
539 SCY_REG = 0;
540 bspx.w = 0xFF00;
541 bspy.w = 0x0080;
542
543 /* Initialize the window */
544 set_win_data(0x80, 0x21, frame_data);
545 /*
546 * Draw the frame in the window
547 *
548 * Width = 0x80 = 0x10 * 8
549 * Height = 0x50 = 0x0A * 8
550 */
551 set_win_tiles(0, 0, 16, 10, frame_tiles);
552 /*
553 * Draw the door in the window
554 *
555 * Width = 0x60 = 0x20 * 12
556 * Height = 0x30 = 0x20 * 6
557 */
558 set_win_tiles(2, 2, 12, 6, door1_tiles);
559 wposx.b.h = MAXWINX;
560 wposx.b.l = 0;
561 WX_REG = MAXWINX;
562 wposy.b.h = MAXWINY;
563 wposy.b.l = 0;
564 WY_REG = MAXWINY;
565 wspx.w = 0xFF80;
566 wspy.w = 0xFFC0;
567
568 /* Initialize the sprite */
569 set_sprite_data(0x00, 0x1C, earth_data);
570 set_sprite_prop(0, 0x00);
571 set_sprite_prop(1, 0x00);
572 sframe = 0;
573 sposx.w = 0x1000;
574 sposy.w = 0x1000;
575 sspx.w = 0x0040;
576 sspy.w = 0x0040;
577 tile_sprite();
578 place_sprite();
579
580 DISPLAY_ON;
581 enable_interrupts();
582
583 while(1) {
584 /* Skip four VBLs (slow down animation) */
585 for(i = 0; i < 4; i++)
586 vsync();
587 time++;
588 fade();
589 door();
590 scroll();
591 animate_sprite();
592 i = joypad();
593 if(i & J_B) {
594 if(i & J_UP)
595 bspy.w -= 0x0010;
596 if(i & J_DOWN)
597 bspy.w += 0x0010;
598 if(i & J_LEFT)
599 bspx.w -= 0x0010;
600 if(i & J_RIGHT)
601 bspx.w += 0x0010;
602 } else if(i & J_A) {
603 if(i & J_UP)
604 wspy.w -= 0x0010;
605 if(i & J_DOWN)
606 wspy.w += 0x0010;
607 if(i & J_LEFT)
608 wspx.w -= 0x0010;
609 if(i & J_RIGHT)
610 wspx.w += 0x0010;
611 } else {
612 if(i & J_SELECT)
613 color = STARTFADE;
614 if(i & J_START)
615 if(doorstate == CLOSED) {
616 doorstate = OPENING;
617 doorpos = 0;
618 } else if(doorstate == OPENED) {
619 doorstate = CLOSING;
620 doorpos = NBDFRAMES;
621 }
622 if(i & J_UP)
623 sspy.w -= 0x0010;
624 if(i & J_DOWN)
625 sspy.w += 0x0010;
626 if(i & J_LEFT)
627 sspx.w -= 0x0010;
628 if(i & J_RIGHT)
629 sspx.w += 0x0010;
630 }
631 }
632 }
This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.