diff --git a/video.c b/video.c index 1281ff2..dea8f6f 100644 --- a/video.c +++ b/video.c @@ -915,11 +915,151 @@ static void render_scanline_text_base_normal(u32 layer, if(bg_control & 0x80) { - tile_render(8bpp, base, normal); + /* color depth: 8bpp + * combine: base + * alpha : normal + */ + + /* Render a single scanline of text tiles */ + u32 vertical_pixel_offset = (vertical_offset % 8) * + tile_width_8bpp; + u32 vertical_pixel_flip = + ((tile_size_8bpp - tile_width_8bpp) - + vertical_pixel_offset) - vertical_pixel_offset; + + tile_extra_variables_8bpp(); + + u8 *tile_base = vram + (((bg_control >> 2) & 0x03) * (1024 * 16)) + + vertical_pixel_offset; + u32 pixel_run = 256 - (horizontal_offset % 256); + u32 current_tile; + + map_base += ((vertical_offset % 256) / 8) * 32; + partial_tile_offset = (horizontal_offset % 8); + + if(pixel_run >= end) + { + if(partial_tile_offset) + { + partial_tile_run = 8 - partial_tile_offset; + if(end < partial_tile_run) + { + partial_tile_run = end; + partial_tile_mid_map(base, 8bpp, normal); + return; + } + else + { + end -= partial_tile_run; + partial_tile_right_map(base, 8bpp, normal); + } + } + + tile_run = end / 8; + multiple_tile_map(base, 8bpp, normal); + + partial_tile_run = end % 8; + + if(partial_tile_run) + { + partial_tile_left_map(base, 8bpp, normal); + } + } + else + { + if(partial_tile_offset) + { + partial_tile_run = 8 - partial_tile_offset; + partial_tile_right_map(base, 8bpp, normal); + } + + tile_run = (pixel_run - partial_tile_run) / 8; + multiple_tile_map(base, 8bpp, normal); + map_ptr = second_ptr; + end -= pixel_run; + tile_run = end / 8; + multiple_tile_map(base, 8bpp, normal); + + partial_tile_run = end % 8; + if(partial_tile_run) + { + partial_tile_left_map(base, 8bpp, normal); + } + } } else { - tile_render(4bpp, base, normal); + /* color depth: 4bpp + * combine: base + * alpha : normal + */ + + /* Render a single scanline of text tiles */ + u32 vertical_pixel_offset = (vertical_offset % 8) * + tile_width_4bpp; + u32 vertical_pixel_flip = + ((tile_size_4bpp - tile_width_4bpp) - + vertical_pixel_offset) - vertical_pixel_offset; + + tile_extra_variables_4bpp(); + + u8 *tile_base = vram + (((bg_control >> 2) & 0x03) * (1024 * 16)) + + vertical_pixel_offset; + u32 pixel_run = 256 - (horizontal_offset % 256); + u32 current_tile; + + map_base += ((vertical_offset % 256) / 8) * 32; + partial_tile_offset = (horizontal_offset % 8); + + if(pixel_run >= end) + { + if(partial_tile_offset) + { + partial_tile_run = 8 - partial_tile_offset; + if(end < partial_tile_run) + { + partial_tile_run = end; + partial_tile_mid_map(base, 4bpp, normal); + return; + } + else + { + end -= partial_tile_run; + partial_tile_right_map(base, 4bpp, normal); + } + } + + tile_run = end / 8; + multiple_tile_map(base, 4bpp, normal); + + partial_tile_run = end % 8; + + if(partial_tile_run) + { + partial_tile_left_map(base, 4bpp, normal); + } + } + else + { + if(partial_tile_offset) + { + partial_tile_run = 8 - partial_tile_offset; + partial_tile_right_map(base, 4bpp, normal); + } + + tile_run = (pixel_run - partial_tile_run) / 8; + multiple_tile_map(base, 4bpp, normal); + map_ptr = second_ptr; + end -= pixel_run; + tile_run = end / 8; + multiple_tile_map(base, 4bpp, normal); + + partial_tile_run = end % 8; + if(partial_tile_run) + { + partial_tile_left_map(base, 4bpp, normal); + } + } } } @@ -982,10 +1122,12 @@ static void render_scanline_text_transparent_normal(u32 layer, if(bg_control & 0x80) { + /* Render a single scanline of text tiles */ tile_render(8bpp, transparent, normal); } else { + /* Render a single scanline of text tiles */ tile_render(4bpp, transparent, normal); } } @@ -1049,10 +1191,12 @@ static void render_scanline_text_base_color16(u32 layer, if(bg_control & 0x80) { + /* Render a single scanline of text tiles */ tile_render(8bpp, base, color16); } else { + /* Render a single scanline of text tiles */ tile_render(4bpp, base, color16); } } @@ -1116,10 +1260,12 @@ static void render_scanline_text_transparent_color16(u32 layer, if(bg_control & 0x80) { + /* Render a single scanline of text tiles */ tile_render(8bpp, transparent, color16); } else { + /* Render a single scanline of text tiles */ tile_render(4bpp, transparent, color16); } } @@ -1183,10 +1329,12 @@ static void render_scanline_text_base_color32(u32 layer, if(bg_control & 0x80) { + /* Render a single scanline of text tiles */ tile_render(8bpp, base, color32); } else { + /* Render a single scanline of text tiles */ tile_render(4bpp, base, color32); } } @@ -1250,10 +1398,12 @@ static void render_scanline_text_transparent_color32(u32 layer, if(bg_control & 0x80) { + /* Render a single scanline of text tiles */ tile_render(8bpp, transparent, color32); } else { + /* Render a single scanline of text tiles */ tile_render(4bpp, transparent, color32); } } @@ -1317,10 +1467,12 @@ static void render_scanline_text_base_alpha(u32 layer, if(bg_control & 0x80) { + /* Render a single scanline of text tiles */ tile_render(8bpp, base, alpha); } else { + /* Render a single scanline of text tiles */ tile_render(4bpp, base, alpha); } } @@ -1384,10 +1536,12 @@ static void render_scanline_text_transparent_alpha(u32 layer, if(bg_control & 0x80) { + /* Render a single scanline of text tiles */ tile_render(8bpp, transparent, alpha); } else { + /* Render a single scanline of text tiles */ tile_render(4bpp, transparent, alpha); } }