Browse Source

Initial commit

Thomas B 2 months ago
commit
d2719852ed
4 changed files with 701 additions and 0 deletions
  1. 2
    0
      .gitignore
  2. 52
    0
      Makefile
  3. 15
    0
      README.md
  4. 632
    0
      src/galaxy.c

+ 2
- 0
.gitignore View File

1
+build
2
+*.gb

+ 52
- 0
Makefile View File

1
+# Adapted from GBDK-2020 examples
2
+
3
+ifndef GBDK_HOME
4
+	GBDK_HOME = ../../../
5
+endif
6
+
7
+BIN := duality.gb
8
+SRC_DIR := src
9
+BUILD_DIR := build
10
+
11
+SRCS := $(wildcard $(SRC_DIR)/*.c)
12
+OBJS := $(SRCS:%.c=$(BUILD_DIR)/%.o)
13
+
14
+LCC := $(GBDK_HOME)/bin/lcc
15
+GB_EMU := gearboy
16
+
17
+LCCFLAGS := -Wa-l -Wl-m -Wm"-yn Duality"
18
+EMUFLAGS := $(BIN)
19
+
20
+GBDK_DEBUG = ON
21
+ifdef GBDK_DEBUG
22
+	LCCFLAGS += -debug -Wa-j -Wa-y -Wa-s -Wl-j -Wl-y -Wl-u -Wm-yS
23
+	EMUFLAGS += $(BUILD_DIR)/$(BIN:.gb=.sym)
24
+endif
25
+
26
+.PHONY: all run $(BIN) clean
27
+
28
+all: $(BIN)
29
+
30
+run: $(BIN)
31
+	@echo Emulating $<
32
+	@$(GB_EMU) $(EMUFLAGS)
33
+
34
+$(BUILD_DIR)/%.o: %.c
35
+	@mkdir -p $(@D)
36
+	@echo Compiling $<
37
+	@$(LCC) $(LCCFLAGS) -c -o $@ $<
38
+
39
+$(BUILD_DIR)/%.o: %.s
40
+	@mkdir -p $(@D)
41
+	@echo Assembling $<
42
+	@$(LCC) $(LCCFLAGS) -c -o $@ $<
43
+
44
+$(BUILD_DIR)/$(BIN): $(OBJS)
45
+	@echo Linking $@
46
+	@$(LCC) $(LCCFLAGS) -o $@ $<
47
+
48
+$(BIN): $(BUILD_DIR)/$(BIN)
49
+	@cp $< $@
50
+
51
+clean:
52
+	rm -rf $(BUILD_DIR) $(BIN)

+ 15
- 0
README.md View File

1
+# Duality
2
+
3
+My first homebrew GameBoy game.
4
+A port of the GTA San Andreas Arcade Game Duality.
5
+
6
+## Getting Started
7
+
8
+You need the [GBDK-2020](https://gbdk.org/docs/api/docs_getting_started.html) to build the ROM and [Gearboy](https://github.com/drhelius/Gearboy) to emulate it comfortably.
9
+Then just build and run it.
10
+
11
+    make run
12
+
13
+## License
14
+
15
+To-Do

+ 632
- 0
src/galaxy.c View File

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    0x80                  /* Size of the picture in the window */
357
+#define WINSZY    0x50
358
+#define MINWINX   (MAXWNDPOSX-WINSZX+1) /* Bounds of the window origin */
359
+#define MINWINY   (MAXWNDPOSY-WINSZY+1)
360
+#define MAXWINX   MAXWNDPOSX
361
+#define MAXWINY   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 = MAXWNDPOSX;
560
+  wposx.b.l = 0;
561
+  WX_REG = MAXWNDPOSX;
562
+  wposy.b.h = MAXWNDPOSY;
563
+  wposy.b.l = 0;
564
+  WY_REG = MAXWNDPOSY;
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
+}

Loading…
Cancel
Save