diff --git a/src/render/opengl/SDL_render_gl.c b/src/render/opengl/SDL_render_gl.c index b1279a1066c79..4f6021e59f482 100644 --- a/src/render/opengl/SDL_render_gl.c +++ b/src/render/opengl/SDL_render_gl.c @@ -412,12 +412,35 @@ convert_format(GL_RenderData *renderdata, Uint32 pixel_format, GLint *internalFormat, GLenum *format, GLenum *type) { switch (pixel_format) { +#ifdef __DREAMCAST__ + case SDL_PIXELFORMAT_RGB888: + *internalFormat = GL_RGB; + *format = GL_RGB; + *type = GL_UNSIGNED_BYTE; // Dreamcast-specific handling for RGB888 + break; + case SDL_PIXELFORMAT_RGB565: + *internalFormat = GL_RGB; + *format = GL_RGB; + *type = GL_UNSIGNED_SHORT_5_6_5; // Dreamcast-specific handling for RGB565 + break; + case SDL_PIXELFORMAT_ARGB1555: + *internalFormat = GL_RGBA; + *format = GL_RGBA; + *type = GL_UNSIGNED_SHORT_5_5_5_1; // Dreamcast-specific handling for ARGB1555 + break; + case SDL_PIXELFORMAT_ARGB8888: + *internalFormat = GL_RGBA; + *format = GL_RGBA; + *type = GL_UNSIGNED_BYTE; // Dreamcast-specific handling for ARGB8888 + break; +#else case SDL_PIXELFORMAT_ARGB8888: case SDL_PIXELFORMAT_RGB888: *internalFormat = GL_RGBA8; *format = GL_BGRA; *type = GL_UNSIGNED_INT_8_8_8_8_REV; break; +#endif case SDL_PIXELFORMAT_ABGR8888: case SDL_PIXELFORMAT_BGR888: *internalFormat = GL_RGBA8; diff --git a/src/video/dreamcast/60hz.h b/src/video/dreamcast/60hz.h new file mode 100644 index 0000000000000..835f7cca7acad --- /dev/null +++ b/src/video/dreamcast/60hz.h @@ -0,0 +1,807 @@ +#define ASK_60HZ_WIDTH 96 +#define ASK_60HZ_HEIGHT 60 + +static unsigned short __ask_60hz__[96*60]= + { + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x864, 0x18CA, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x18C9, 0x843, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x843, 0x18C9, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x18EB, 0x18C8, 0x842, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x22, 0x10A8, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x18EB, 0x10A7, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1085, 0x18EB, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x18EB, 0x864, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, + 0x18C8, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x18EB, 0x10A7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x842, 0x18EA, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x18C9, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x843, 0x18EB, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x18EB, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x844, 0x18EB, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x18EA, 0x843, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x843, 0x18EB, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x18EA, 0x22, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x843, 0x18EB, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x18EB, 0x21, 0x0, 0x0, + 0x0, 0x21, 0x18EA, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x18C9, 0x0, 0x0, + 0x0, 0x10A8, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x1087, 0x0, + 0x865, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x18EB, 0x843, + 0x18EB, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x18EA, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x52B1, + 0x52B1, 0x5290, 0x420F, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x422F, 0x212C, 0x4A70, 0x318D, 0x210C, 0x210C, 0x210C, 0x39CE, + 0x4A70, 0x296D, 0x39CE, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x212C, 0x73B4, 0xA518, 0x6312, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0xF79F, + 0xDEDD, 0xD6BD, 0xDEFE, 0x9CF7, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0xBDFA, 0x210C, 0x9CD7, 0xB5BA, 0x294C, 0x210C, 0x296D, 0xCE5C, + 0x8435, 0x52B1, 0x8C56, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x6312, 0xDEDD, 0x8C56, 0x52B1, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0xF79F, + 0x39CE, 0x210C, 0x4A70, 0xDEFE, 0x422F, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0xBDFA, 0x210C, 0x296D, 0xD69D, 0x7BF5, 0x210C, 0x9CD7, 0xBDFB, + 0x294C, 0x52B1, 0x8C56, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x8435, 0xA538, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0xF79F, + 0x39CE, 0x210C, 0x294D, 0xDEDD, 0x4A70, 0xA518, 0xA538, 0xBDFB, + 0xEF7F, 0x422F, 0x9CD7, 0xE73E, 0xE73F, 0xA538, 0x294D, 0x212C, + 0x9496, 0xE73E, 0xEF5F, 0xC63B, 0x210C, 0x212C, 0x9496, 0xE73E, + 0xEF5F, 0xC63B, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x94B7, 0x210C, 0x210C, 0x5290, 0xDEFE, 0x8435, 0xDEFE, 0x420F, + 0x210C, 0x422F, 0x6B73, 0x210C, 0x210C, 0x210C, 0x210C, 0xA518, + 0xF79F, 0xF79F, 0xF79F, 0x39CE, 0x212C, 0x9CD7, 0xE71E, 0xEF5F, + 0xA538, 0x318D, 0x210C, 0xA518, 0xA538, 0xBDFB, 0xEF7F, 0x39CE, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0xF79F, + 0x94B7, 0x8C56, 0xBDDA, 0xCE7C, 0x296D, 0xA518, 0xDEDD, 0x6312, + 0x39CE, 0x8C76, 0xB5BA, 0x4A4F, 0x4A4F, 0xBDDA, 0x8C56, 0x31AE, + 0xEF5F, 0x7394, 0x420F, 0x6312, 0x210C, 0x31AE, 0xEF5F, 0x7394, + 0x420F, 0x6312, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x8C76, 0xEF7F, 0x7393, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x318D, + 0x94B7, 0xAD79, 0x39CE, 0x210C, 0x7BD4, 0xD69C, 0x52B1, 0x4A50, + 0xC63B, 0x94B7, 0x210C, 0xA518, 0xDEDD, 0x6312, 0x39CE, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0xF79F, + 0xAD79, 0xA518, 0x8435, 0x39EE, 0x210C, 0xA518, 0x94B7, 0x210C, + 0x210C, 0xCE5C, 0xCE7C, 0xBDDA, 0xBDFA, 0xD69C, 0xB5BA, 0x212C, + 0xA518, 0xEF5F, 0xA518, 0x422F, 0x210C, 0x212C, 0xA518, 0xEF5F, + 0xA518, 0x422F, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x39EE, 0xF79F, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x8C55, 0xA518, 0x210C, 0x210C, 0xB59A, 0x7BF4, 0x210C, 0x210C, + 0x6332, 0xCE7C, 0x210C, 0xA518, 0x94B7, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0xF79F, + 0x39CE, 0x210C, 0x210C, 0x210C, 0x210C, 0xA518, 0x8C56, 0x210C, + 0x210C, 0xCE7C, 0x9CD7, 0x6B73, 0x6B73, 0x6B73, 0x5AD1, 0x210C, + 0x210C, 0x294D, 0x5AF2, 0xDEDD, 0x4A4F, 0x210C, 0x210C, 0x294D, + 0x5AF2, 0xDEDD, 0x4A4F, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x39CE, 0xF79F, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x8C56, 0xA518, 0x210C, 0x210C, 0xB59A, 0x7BF4, 0x210C, 0x210C, + 0x6332, 0xCE7C, 0x210C, 0xA518, 0x8C56, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0xF79F, + 0x39CE, 0x210C, 0x210C, 0x210C, 0x210C, 0xA518, 0x8C56, 0x210C, + 0x210C, 0x9496, 0xC61B, 0x5290, 0x39EF, 0x6B73, 0x5AD1, 0x318D, + 0x8C56, 0x420F, 0x5290, 0xD6BD, 0x6312, 0x318D, 0x8C56, 0x420F, + 0x5290, 0xD6BD, 0x6312, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x39CE, 0xF79F, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x8C56, 0xA518, 0x210C, 0x210C, 0x7BD4, 0xD69C, 0x52B1, 0x4A50, + 0xC63B, 0x94B7, 0x210C, 0xA518, 0x8C56, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0xF79F, + 0x39CE, 0x210C, 0x210C, 0x210C, 0x210C, 0xA518, 0x8C56, 0x210C, + 0x210C, 0x296D, 0x9CD7, 0xE71E, 0xEF5F, 0xB5BA, 0x39EE, 0x294C, + 0x9CD7, 0xE73E, 0xE73E, 0xA538, 0x294C, 0x294C, 0x9CD7, 0xE73E, + 0xE73E, 0xA538, 0x294C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x39CE, 0xF79F, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x8C56, 0xA518, 0x210C, 0x210C, 0x212C, 0x9CD7, 0xE73E, 0xEF5F, + 0xA538, 0x318D, 0x210C, 0xA518, 0x8C56, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x422F, 0xB5BA, 0xEF5F, 0xE71E, 0x8415, 0x210C, + 0x210C, 0x5AF1, 0xD6BD, 0xEF5F, 0xB5BA, 0x318D, 0x210C, 0x210C, + 0xF79F, 0x39CE, 0x210C, 0x210C, 0x210C, 0xBDFA, 0x6B73, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x318D, 0xCE7C, 0x9CF8, 0x420F, 0x4A4F, 0x5290, 0x210C, + 0x31AE, 0xDEDD, 0x73B4, 0x422F, 0xB59A, 0xA518, 0x210C, 0x210C, + 0xF79F, 0x39CE, 0x210C, 0x210C, 0x210C, 0xBDFA, 0x6B73, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x7393, 0xCE5C, 0x212C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x6332, 0xCE5C, 0x210C, 0x210C, 0x4A4F, 0xDEDD, 0x296D, 0x210C, + 0xF79F, 0x39CE, 0x210C, 0x210C, 0x210C, 0xBDFA, 0x6B73, 0x318D, + 0xBDFA, 0xBDFA, 0xBDFA, 0xBDFA, 0x94B7, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x9CD7, 0xAD79, 0xBDFA, 0xEF5F, 0xBDFB, 0x422F, 0x210C, + 0x8415, 0xA538, 0x210C, 0x210C, 0x212C, 0xEF7F, 0x39CE, 0x210C, + 0xF79F, 0xAD79, 0xA518, 0xA518, 0xA518, 0xDEFE, 0x6B73, 0x294C, + 0x6B73, 0x6B73, 0x8435, 0xEF5F, 0x73B4, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x9CF8, 0xD69C, 0x5AD1, 0x422F, 0xA538, 0xBDFB, 0x210C, + 0x8435, 0xA538, 0x210C, 0x210C, 0x212C, 0xEF7F, 0x39CE, 0x210C, + 0xF79F, 0x94B7, 0x8C56, 0x8C56, 0x8C56, 0xD6BD, 0x6B73, 0x210C, + 0x210C, 0x294D, 0xBDDA, 0xAD59, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x8C56, 0x8C76, 0x210C, 0x210C, 0x420F, 0xEF5F, 0x210C, + 0x7393, 0xBDFB, 0x210C, 0x210C, 0x39CE, 0xE71E, 0x318D, 0x210C, + 0xF79F, 0x39CE, 0x210C, 0x210C, 0x210C, 0xBDFA, 0x6B73, 0x210C, + 0x210C, 0x9CD7, 0xCE7C, 0x318D, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x5290, 0xBDDA, 0x31AD, 0x212C, 0x8415, 0xD69C, 0x210C, + 0x420F, 0xE73E, 0x4A70, 0x212C, 0x9497, 0xB5BA, 0x210C, 0x210C, + 0xF79F, 0x39CE, 0x210C, 0x210C, 0x210C, 0xBDFA, 0x6B73, 0x210C, + 0x73B4, 0xE71E, 0x4A4F, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x94B7, 0xD6BD, 0xD6BD, 0xD6BD, 0x5AF1, 0x210C, + 0x210C, 0x8435, 0xDEFE, 0xDEDD, 0xD6BD, 0x4A4F, 0x210C, 0x210C, + 0xF79F, 0x39CE, 0x210C, 0x210C, 0x210C, 0xBDFA, 0x6B73, 0x31AE, + 0xE73E, 0xEF5F, 0xD6BD, 0xD6BD, 0xAD59, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x420F, 0x5290, 0x318D, 0x210C, 0x210C, + 0x210C, 0x210C, 0x420F, 0x5290, 0x318D, 0x210C, 0x210C, 0x210C, + 0x52B1, 0x212C, 0x210C, 0x210C, 0x210C, 0x422F, 0x31AD, 0x212C, + 0x52B1, 0x52B1, 0x52B1, 0x52B1, 0x422F, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x18EA, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x18EA, + 0x843, 0x18EB, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x18EB, 0x843, + 0x0, 0x1087, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x1087, 0x0, + 0x0, 0x0, 0x18C9, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x18C9, 0x0, 0x0, + 0x0, 0x0, 0x21, 0x18EB, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x18EB, 0x21, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x22, 0x18EA, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x18EA, 0x22, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x843, 0x18EA, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x18EA, 0x843, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, 0x18EB, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x18EB, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, 0x18C9, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x18C9, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10A7, 0x18EB, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x18EB, 0x10A7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x864, 0x18EB, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x18EB, 0x864, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x10A7, 0x18EB, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x18EB, 0x10A7, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x842, 0x18C8, 0x18EB, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x18EB, 0x18C8, 0x842, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x843, 0x18C9, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, 0x210C, + 0x18C9, 0x843, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + }; + +static void __ask_60hz_fade16(unsigned short n) +{ + int i,j; + unsigned short rs=0xB; + unsigned short gs=0x5; + unsigned short bs=0x0; + unsigned short rm=0xF800; + unsigned short gm=0x07E0; + unsigned short bm=0x1F; + unsigned short * buff=(unsigned short*)((unsigned)vram_l+(640-96/2)+(640*2*((480-60)/2))); + for(j=0;j<60;j++) + for(i=0;i<96;i++) + { + register unsigned short r=(__ask_60hz__[i+j*96]&rm)>>rs; + register unsigned short g=(__ask_60hz__[i+j*96]&gm)>>gs; + register unsigned short b=(__ask_60hz__[i+j*96]&bm)>>bs; + if (r>n) + r-=n; + else + r=0; + if (g>n) + g-=n; + else + g=0; + if (b>n) + b-=n; + else + b=0; + buff[i+j*640]=((r<info.functions & MAPLE_FUNC_CONTROLLER) { + cond = (cont_state_t *)maple_dev_status(dev); + m=maple_addr(p,u); + } + } + } + + if (cond){ + for(i=0;i<500;i++) + { + if (cond->buttons & CONT_Y) return !sdl_dc_default_60hz; + timer_spin_sleep(10); + } + } + + return sdl_dc_default_60hz; +} + +static int sdl_dc_ask_60hz() +{ + static int ret=0x12345; + int i; + if (sdl_dc_no_ask_60hz) + return sdl_dc_default_60hz; + if (ret!=0x12345) + return ret; + for(i=128;i>=0;i--) + __ask_60hz_fade16(i); + + ret=__ask_60hz_wait(); + + for(i=0;i<=128;i++) + __ask_60hz_fade16(i); + return ret; +} diff --git a/src/video/dreamcast/SDL_dreamcastopengl.c b/src/video/dreamcast/SDL_dreamcastopengl.c index ed65870f1578c..1bc406eca3121 100644 --- a/src/video/dreamcast/SDL_dreamcastopengl.c +++ b/src/video/dreamcast/SDL_dreamcastopengl.c @@ -23,7 +23,9 @@ #include "SDL_dreamcastopengl.h" #include "SDL_video.h" + #if defined(SDL_VIDEO_DRIVER_DREAMCAST) && defined(SDL_VIDEO_OPENGL) +#include #include "GL/gl.h" #include "GL/glu.h" #include "GL/glkos.h" @@ -186,6 +188,8 @@ int DREAMCAST_GL_Initialize(_THIS) { if (DREAMCAST_GL_LoadLibrary(_this, NULL) < 0) { return -1; } + + // vid_set_mode(DM_640x480_VGA, PM_RGB888); return 0; } @@ -212,17 +216,18 @@ SDL_GLContext DREAMCAST_GL_CreateContext(_THIS, SDL_Window *window) { } // Store the GL attributes in the context - context->red_size = _this->gl_config.red_size; - context->green_size = _this->gl_config.green_size; - context->blue_size = _this->gl_config.blue_size; - context->alpha_size = _this->gl_config.alpha_size; - context->depth_size = _this->gl_config.depth_size; - context->stencil_size = _this->gl_config.stencil_size; - context->double_buffer = _this->gl_config.double_buffer; + // context->red_size = 5; // You can still set these if you want to keep them in context + // context->green_size = 6; + // context->blue_size = 5; + // context->alpha_size = 0; + // context->depth_size = 32; + // context->stencil_size = 8; + // context->double_buffer = 1; return (SDL_GLContext) context; } + int DREAMCAST_GL_MakeCurrent(_THIS, SDL_Window *window, SDL_GLContext context) { DreamcastGLContext *glcontext = (DreamcastGLContext *) context; diff --git a/src/video/dreamcast/SDL_dreamcastvideo.c b/src/video/dreamcast/SDL_dreamcastvideo.c index 13dabedebce8e..c34c8d3615db1 100644 --- a/src/video/dreamcast/SDL_dreamcastvideo.c +++ b/src/video/dreamcast/SDL_dreamcastvideo.c @@ -53,11 +53,25 @@ #define DREAMCASTVID_DRIVER_EVDEV_NAME "dcevdev" #include "SDL_dreamcastopengl.h" +//Custom code for 60Hz +static int sdl_dc_no_ask_60hz=0; +static int sdl_dc_default_60hz=0; +#include "60hz.h" +void SDL_DC_ShowAskHz(SDL_bool value) +{ + sdl_dc_no_ask_60hz=!value; +} + +void SDL_DC_Default60Hz(SDL_bool value) +{ + sdl_dc_default_60hz=value; +} /* Initialization/Query functions */ static int DREAMCAST_VideoInit(_THIS); static void DREAMCAST_VideoQuit(_THIS); - +void DREAMCAST_GetDisplayModes(_THIS, SDL_VideoDisplay *display); +int DREAMCAST_SetDisplayMode(_THIS, SDL_VideoDisplay *display, SDL_DisplayMode *mode); #ifdef SDL_INPUT_LINUXEV static int evdev = 0; static void DREAMCAST_EVDEV_Poll(_THIS); @@ -108,6 +122,8 @@ static SDL_VideoDevice *DREAMCAST_CreateDevice(void) device->VideoInit = DREAMCAST_VideoInit; device->VideoQuit = DREAMCAST_VideoQuit; device->PumpEvents = DREAMCAST_PumpEvents; + device->GetDisplayModes = DREAMCAST_GetDisplayModes; + device->SetDisplayMode = DREAMCAST_SetDisplayMode; #ifdef SDL_INPUT_LINUXEV if (evdev) { device->PumpEvents = DREAMCAST_EVDEV_Poll; @@ -152,32 +168,189 @@ static void DREAMCAST_EVDEV_Poll(_THIS) SDL_EVDEV_Poll(); } #endif - -int DREAMCAST_VideoInit(_THIS) -{ +int __sdl_dc_is_60hz=0; +int DREAMCAST_VideoInit(_THIS) { SDL_VideoDisplay display; SDL_DisplayMode current_mode; + int disp_mode; + int pixel_mode; + int width = 640, height = 480; // Default to 640x480, modify based on requirements + int bpp = 32; // Bits per pixel + Uint32 Rmask, Gmask, Bmask; SDL_zero(current_mode); - current_mode.w = 640; - current_mode.h = 480; - current_mode.refresh_rate = 60; + // Determine if we are in 60Hz or 50Hz mode based on cable type and region + if (!vid_check_cable()) { + __sdl_dc_is_60hz = 1; // 60Hz for VGA + if (width == 320 && height == 240) disp_mode = DM_320x240_VGA; + else if (width == 640 && height == 480) disp_mode = DM_640x480_VGA; + else if (width == 768 && height == 480) disp_mode = DM_768x480_PAL_IL; + else { + SDL_SetError("Couldn't find requested mode in list"); + return -1; + } + } else if (flashrom_get_region() != FLASHROM_REGION_US && !sdl_dc_ask_60hz()) { + __sdl_dc_is_60hz = 0; + if (width == 320 && height == 240) disp_mode = DM_320x240_PAL; + else if (width == 640 && height == 480) disp_mode = DM_640x480_PAL_IL; + else { + SDL_SetError("Couldn't find requested mode in list"); + return -1; + } + } else { + __sdl_dc_is_60hz = 1; // Default to 60Hz + if (width == 320 && height == 240) disp_mode = DM_320x240; + else if (width == 640 && height == 480) disp_mode = DM_640x480; + else if (width == 768 && height == 480) disp_mode = DM_768x480; + else { + SDL_SetError("Couldn't find requested mode in list"); + return -1; + } + } + + // Set pixel mode based on bpp + switch (bpp) { + case 15: // ARGB1555 + pixel_mode = PM_RGB555; + Rmask = 0x00007C00; // 5 bits for Red + Gmask = 0x000003E0; // 5 bits for Green + Bmask = 0x0000001F; // 5 bits for Blue + current_mode.format = SDL_PIXELFORMAT_ARGB1555; // Set the correct format + break; + case 16: // RGB565 + pixel_mode = PM_RGB565; + Rmask = 0x0000F800; + Gmask = 0x000007E0; + Bmask = 0x0000001F; + current_mode.format = SDL_PIXELFORMAT_RGB565; // Set the correct format + break; + case 24: // RGB888 + case 32: // ARGB8888 + pixel_mode = PM_RGB888; + Rmask = 0x00FF0000; + Gmask = 0x0000FF00; + Bmask = 0x000000FF; + current_mode.format = SDL_PIXELFORMAT_RGB888; // Set the correct format + break; + default: + SDL_SetError("Unsupported pixel format"); + return -1; + } - /* 32 bpp for default */ - current_mode.format = SDL_PIXELFORMAT_RGB888; + // Initialize other properties of current_mode as needed + current_mode.w = width; + current_mode.h = height; + current_mode.refresh_rate = (__sdl_dc_is_60hz) ? 60 : 50; // Set refresh rate based on __sdl_dc_is_60hz current_mode.driverdata = NULL; SDL_zero(display); display.desktop_mode = current_mode; display.current_mode = current_mode; display.driverdata = NULL; - SDL_AddDisplayMode(&display, ¤t_mode); + SDL_AddDisplayMode(&display, ¤t_mode); SDL_AddVideoDisplay(&display, SDL_TRUE); - /* Set video mode using KOS */ - vid_set_mode(DM_640x480_NTSC_IL, PM_RGB888); - return 1; + + // Set the mode using KOS + vid_set_mode(disp_mode, pixel_mode); + + SDL_Log("SDL2 Dreamcast video initialized."); + return 1; // Success +} + + +void DREAMCAST_GetDisplayModes(_THIS, SDL_VideoDisplay *display) { + SDL_DisplayMode mode; + int refresh_rate = __sdl_dc_is_60hz ? 60 : 50; // Determine refresh rate based on flag + + // Adding a 320x240 mode in ARGB1555 format + SDL_zero(mode); + mode.w = 320; + mode.h = 240; + mode.format = SDL_PIXELFORMAT_ARGB1555; // Change as necessary + mode.refresh_rate = refresh_rate; // Use the determined refresh rate + SDL_AddDisplayMode(display, &mode); + + // Adding a 640x480 mode in RGB565 format + SDL_zero(mode); + mode.w = 640; + mode.h = 480; + mode.format = SDL_PIXELFORMAT_RGB565; // Change as necessary + mode.refresh_rate = refresh_rate; // Use the determined refresh rate + SDL_AddDisplayMode(display, &mode); + + // Adding a 768x480 mode in RGB565 format + SDL_zero(mode); + mode.w = 768; + mode.h = 480; + mode.format = SDL_PIXELFORMAT_RGB565; // Change as necessary + mode.refresh_rate = refresh_rate; // Use the determined refresh rate + SDL_AddDisplayMode(display, &mode); + + // Adding a 640x480 mode in RGB888 format + SDL_zero(mode); + mode.w = 640; + mode.h = 480; + mode.format = SDL_PIXELFORMAT_RGB888; // Change as necessary + mode.refresh_rate = refresh_rate; // Use the determined refresh rate + SDL_AddDisplayMode(display, &mode); + + // Optionally, you can add more modes depending on your requirements + // e.g., 800x600, 1024x768, etc. + + SDL_Log("Display modes for Dreamcast retrieved successfully."); +} + +int DREAMCAST_SetDisplayMode(_THIS, SDL_VideoDisplay *display, SDL_DisplayMode *mode) { + int pixel_mode; + int disp_mode = -1; // Initialize to an invalid value + + // Determine the appropriate display mode based on width and height + if (__sdl_dc_is_60hz) { + if (mode->w == 320 && mode->h == 240) { + disp_mode = DM_320x240; // 60Hz mode + } else if (mode->w == 640 && mode->h == 480) { + disp_mode = DM_640x480; // 60Hz mode + } else if (mode->w == 768 && mode->h == 480) { + disp_mode = DM_768x480; // 60Hz mode + } + } else { // 50Hz + if (mode->w == 320 && mode->h == 240) { + disp_mode = DM_320x240_PAL; // 50Hz mode + } else if (mode->w == 640 && mode->h == 480) { + disp_mode = DM_640x480_PAL_IL; // 50Hz mode + } + } + + // Check if the determined display mode is valid + if (disp_mode < 0) { + SDL_SetError("Unsupported display mode"); + return -1; + } + + // Determine pixel mode based on the format in the mode + switch (mode->format) { + case SDL_PIXELFORMAT_ARGB1555: + pixel_mode = PM_RGB555; // Use the correct constant + break; + case SDL_PIXELFORMAT_RGB565: + pixel_mode = PM_RGB565; // Keep as is + break; + case SDL_PIXELFORMAT_RGB888: + pixel_mode = PM_RGB888; // Keep as is + break; + case SDL_PIXELFORMAT_UNKNOWN: + default: + SDL_SetError("Unsupported pixel format"); + return -1; + } + + // Set the video mode using KOS (no return value handling) + vid_set_mode(disp_mode, pixel_mode); // Assuming this function works fine without return checks + + SDL_Log("Display mode set to: %dx%d @ %dHz", mode->w, mode->h, mode->refresh_rate); + return 0; // Return success } void DREAMCAST_VideoQuit(_THIS) diff --git a/test/dreamcast/test/nehe06/nehe06.c b/test/dreamcast/test/nehe06/nehe06.c index ca7b284efa7c7..1ec664f9f84bf 100644 --- a/test/dreamcast/test/nehe06/nehe06.c +++ b/test/dreamcast/test/nehe06/nehe06.c @@ -71,11 +71,17 @@ void LoadGLTextures() { glBindTexture(GL_TEXTURE_2D, texture[0]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexImage2D(GL_TEXTURE_2D, 0, 3, image1->w, image1->h, 0, GL_RGB, GL_UNSIGNED_BYTE, image1->pixels); + + // Create an empty texture first + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image1->w, image1->h, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); + + // Update the texture with the image data + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, image1->w, image1->h, GL_RGB, GL_UNSIGNED_BYTE, image1->pixels); SDL_FreeSurface(image1); } + void InitGL(int Width, int Height) { glViewport(0, 0, Width, Height); LoadGLTextures(); diff --git a/test/dreamcast/test/sdlanimation/Makefile.dc b/test/dreamcast/test/sdlanimation/Makefile.dc index bfcf83e42345e..73496116f0f62 100644 --- a/test/dreamcast/test/sdlanimation/Makefile.dc +++ b/test/dreamcast/test/sdlanimation/Makefile.dc @@ -20,7 +20,7 @@ clean: rm -f $(OBJS) $(TARGET).elf $(TARGET).bin romdisk.img $(TARGET).elf: $(OBJS) - kos-cc -o $(TARGET).elf $(OBJS) -lSDL2 -lSDL2main -lm -lkosutils + kos-cc -o $(TARGET).elf $(OBJS) -lSDL2 -lSDL2main -lGL -lm -lkosutils $(TARGET).bin: $(TARGET).elf $(KOS_OBJCOPY) -O binary $(TARGET).elf $(TARGET).bin diff --git a/test/dreamcast/test/textureGLrender/Makefile.dc b/test/dreamcast/test/textureGLrender/Makefile.dc new file mode 100644 index 0000000000000..e271e709e756b --- /dev/null +++ b/test/dreamcast/test/textureGLrender/Makefile.dc @@ -0,0 +1,29 @@ +TARGET = texture +OBJS = texture.o romdisk.o +KOS_ROMDISK_DIR = romdisk + +# Update include paths for SDL2 +KOS_CFLAGS+= -I../../../../build-scripts/build/include -I../../../../build-scripts/build/include-config-/SDL2 -I../../../../build-scripts/build/include/SDL2 -I. -DDREAMCAST + +#KOS_CFLAGS+= -O3 -ffast-math -fno-common -fno-builtin -fno-exceptions -fstrict-aliasing + +#KOS_CPPFLAGS=-fno-operator-names -fno-exceptions $(KOS_CFLAGS) + +# Update library paths and libraries for SDL2 +KOS_LIBS+= -L../../../../build-scripts/build -lSDL2 -lSDL2main + +all: $(TARGET).bin + +include $(KOS_BASE)/Makefile.rules + +clean: + rm -f $(OBJS) $(TARGET).elf $(TARGET).bin romdisk.o romdisk.img + +$(TARGET).elf: $(OBJS) + kos-cc -o $(TARGET).elf $(OBJS) -lSDL2 -lSDL2main -lGL -lm -lkosutils + +$(TARGET).bin: $(TARGET).elf + $(KOS_OBJCOPY) -O binary $(TARGET).elf $(TARGET).bin + +run: $(TARGET).bin + $(KOS_LOADER) $(TARGET).bin diff --git a/test/dreamcast/test/textureGLrender/romdisk/Troy2024.bmp b/test/dreamcast/test/textureGLrender/romdisk/Troy2024.bmp new file mode 100644 index 0000000000000..b084519845b00 Binary files /dev/null and b/test/dreamcast/test/textureGLrender/romdisk/Troy2024.bmp differ diff --git a/test/dreamcast/test/textureGLrender/texture.c b/test/dreamcast/test/textureGLrender/texture.c new file mode 100644 index 0000000000000..b25385906f60a --- /dev/null +++ b/test/dreamcast/test/textureGLrender/texture.c @@ -0,0 +1,200 @@ + #include + #include + #include + #include + + #define FPS 60 + #define WINDOW_WIDTH 640 + #define WINDOW_HEIGHT 480 + + const Uint32 waittime = 1000 / FPS; + + float xrot = 0.0f, yrot = 0.0f, zrot = 0.0f; + const float ROTATION_SPEED = 0.1f; + + SDL_Texture* texture = NULL; + +SDL_Texture* LoadTexture(SDL_Renderer* renderer, const char* filename) { + Uint8 *rowhi, *rowlo; + Uint8 *tmpbuf, tmpch; + SDL_Surface* image = SDL_LoadBMP(filename); + if (!image) { + fprintf(stderr, "Unable to load %s: %s\n", filename, SDL_GetError()); + return NULL; + } + tmpbuf = (Uint8 *)malloc(image->pitch); + if (!tmpbuf) { + fprintf(stderr, "Out of memory\n"); + return NULL; + } + rowhi = (Uint8 *)image->pixels; + rowlo = rowhi + (image->h * image->pitch) - image->pitch; + for (int i = 0; i < image->h / 2; ++i) { + for (int j = 0; j < image->w; ++j) { + tmpch = rowhi[j * 3]; + rowhi[j * 3] = rowhi[j * 3 + 2]; + rowhi[j * 3 + 2] = tmpch; + tmpch = rowlo[j * 3]; + rowlo[j * 3] = rowlo[j * 3 + 2]; + rowlo[j * 3 + 2] = tmpch; + } + memcpy(tmpbuf, rowhi, image->pitch); + memcpy(rowhi, rowlo, image->pitch); + memcpy(rowlo, tmpbuf, image->pitch); + rowhi += image->pitch; + rowlo -= image->pitch; + } + free(tmpbuf); + + // Set transparent pixel as the pixel at (0,0) for BMPs with no alpha channel + if (image->format->BitsPerPixel == 24 || image->format->BitsPerPixel == 32) { + Uint32 transparentColor = *(Uint32 *)image->pixels; + SDL_SetColorKey(image, SDL_TRUE, transparentColor); + } + + // Convert the surface to a format compatible with the renderer + SDL_Surface* converted_surface = SDL_ConvertSurfaceFormat(image, SDL_PIXELFORMAT_ARGB1555, 0); + if (!converted_surface) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Unable to convert surface: %s\n", SDL_GetError()); + SDL_FreeSurface(image); + return NULL; + } + + // Create texture from the converted surface + SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, converted_surface); + if (!texture) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Unable to create texture: %s\n", SDL_GetError()); + } + + SDL_FreeSurface(image); // Free the original surface + SDL_FreeSurface(converted_surface); // Free the converted surface + return texture; +} + + + +void DrawScene(SDL_Renderer* renderer) { + SDL_SetRenderDrawColor(renderer, 0, 0, 255, 255); + SDL_RenderClear(renderer); + + // Calculate the center of the screen + int centerX = WINDOW_WIDTH / 2; + int centerY = WINDOW_HEIGHT / 2; + + // Define the center of the texture + int textureWidth = 256; // Width of your texture + int textureHeight = 256; // Height of your texture + + // Define the corners of the quad + SDL_Point corners[4] = { + {-textureWidth / 2, -textureHeight / 2}, // Top-left corner + {textureWidth / 2, -textureHeight / 2}, // Top-right corner + {textureWidth / 2, textureHeight / 2}, // Bottom-right corner + {-textureWidth / 2, textureHeight / 2} // Bottom-left corner + }; + + // Apply rotation around the center + for (int i = 0; i < 4; i++) { + float x = corners[i].x; + float y = corners[i].y; + + // Rotate around Z axis + corners[i].x = (int)(x * cos(zrot) - y * sin(zrot)); + corners[i].y = (int)(x * sin(zrot) + y * cos(zrot)); + } + + // Calculate the destination rectangle's position (centered) + SDL_Rect dstRect = { + centerX - textureWidth / 2, // Center the rectangle on the screen + centerY - textureHeight / 2, // Center the rectangle on the screen + textureWidth, // Texture width + textureHeight // Texture height + }; + + // Draw the rotated quad with vertical flip + SDL_RenderCopyEx(renderer, texture, NULL, &dstRect, zrot * (180.0 / M_PI), NULL, SDL_FLIP_VERTICAL); + + SDL_RenderPresent(renderer); +} + + + void HandleJoystickInput(SDL_Joystick* joystick) { + Uint8 hat = SDL_JoystickGetHat(joystick, 0); + + if (hat & SDL_HAT_UP) xrot += ROTATION_SPEED; + if (hat & SDL_HAT_DOWN) xrot -= ROTATION_SPEED; + if (hat & SDL_HAT_LEFT) yrot -= ROTATION_SPEED; + if (hat & SDL_HAT_RIGHT) yrot += ROTATION_SPEED; + + // Add Z-axis rotation with joystick buttons + if (SDL_JoystickGetButton(joystick, 0)) zrot += ROTATION_SPEED; + if (SDL_JoystickGetButton(joystick, 1)) zrot -= ROTATION_SPEED; + } + + int main(int argc, char** argv) { + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK) < 0) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "SDL could not initialize! SDL Error: %s\n", SDL_GetError()); + return 1; + } + + SDL_Window* window = SDL_CreateWindow("SDL2 Texture Demo", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_SHOWN|SDL_VIDEO_OPENGL); + if (!window) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Window could not be created! SDL Error: %s\n", SDL_GetError()); + return 1; + } + + SDL_SetHint(SDL_HINT_RENDER_DRIVER, "opengl"); + SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); + if (!renderer) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Renderer could not be created! SDL Error: %s\n", SDL_GetError()); + return 1; + } + SDL_RendererInfo info; + if (SDL_GetRendererInfo(renderer, &info) == 0) { + SDL_Log("Renderer Name: %s", info.name); + SDL_Log("Texture Formats: "); + for (int i = 0; i < info.num_texture_formats; i++) { + SDL_Log(" %s", SDL_GetPixelFormatName(info.texture_formats[i])); + } + } + texture = LoadTexture(renderer, "/rd/Troy2024.bmp"); + if (!texture) { + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); + SDL_Quit(); + return 1; + } + + SDL_Event event; + int running = 1; + + SDL_Joystick* joystick = SDL_JoystickOpen(0); + if (!joystick) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Unable to open joystick: %s\n", SDL_GetError()); + } + + while (running) { + while (SDL_PollEvent(&event)) { + if (event.type == SDL_QUIT) { + running = 0; + } + } + + if (joystick) { + HandleJoystickInput(joystick); + } + + DrawScene(renderer); + + SDL_Delay(waittime); // Wait for the remaining frame time + } + + if (joystick) { + SDL_JoystickClose(joystick); + } + SDL_DestroyTexture(texture); + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); + SDL_Quit(); + return 0; + }