#define BPL1PTH 0x0e0
#define COLOR00 0x180
-void emul_video(uint8_t *rgb, uint8_t *memory, uint16_t render_palette[], int width, int height, int diwstart, uint16_t *io, int start, int stop, int double_size)
+int emul_video(uint8_t *rgb, uint8_t *memory, uint16_t render_palette[], int width, int height, int diwstart, uint16_t *io, int start, int stop, int double_size)
{
uint32_t bitplane[8] = {0, 0, 0, 0, 0, 0, 0, 0};
uint8_t *bitmem[8];
int i;
int all_white;
- /* special case where all palette entries are white. (unknown reason, maybe due to teleporter travel) */
+ /* special case where all palette entries are white, except for color 0 that is always black. (this happens during explosion) */
all_white = 1;
- for (i = 0; i < 16; i++) {
+ for (i = 1; i < 16; i++) {
if (io[i * 2 + 0x180] != 0xfff)
all_white = 0;
}
copperlist = (io[COP1LCH] << 16) | io[COP1LCL];
if (!copperlist) {
print_error("Copper list pointer not initialized, please fix!\n");
- return;
+ return all_white;
}
#ifdef DEBUG_COPPERLIST
while (42) {
if (++count == 100) {
print_error("Copper list does not seem to terminate, please fix!\n");
- return;
+ return all_white;
}
c1 = m68k_read_memory_16(copperlist);
c2 = m68k_read_memory_16(copperlist + 2);
printf("\n");
#endif
print_error("Bitplane %d in copper list not set or out of range, please fix!\n", i);
- return;
+ return all_white;
}
bitmem[i] = memory + bitplane[i];
}
}
}
+ return all_white;
}
-void emul_video(uint8_t *rgb, uint8_t *memory, uint16_t render_palette[], int width, int height, int diwstart, uint16_t *io, int start, int stop, int double_size);
+int emul_video(uint8_t *rgb, uint8_t *memory, uint16_t render_palette[], int width, int height, int diwstart, uint16_t *io, int start, int stop, int double_size);
double render_delay = 0.0;
uint32_t palette_address;
uint16_t palette[16];
+ int all_white = 0;
#ifdef HAVE_OVR
int eye;
#endif
* if no item list is available, for legacy rendering
*/
#ifdef HAVE_OVR
- rc = render_all_items((config_amiga_speed) ? 1.0 : frame_time, 1);
+ if (all_white)
+ rc = render_all_white(1);
+ else
+ rc = render_all_items((config_amiga_speed) ? 1.0 : frame_time, 1);
#else
- rc = render_all_items((config_amiga_speed) ? 1.0 : frame_time, 0);
+ if (all_white)
+ rc = render_all_white(0);
+ else
+ rc = render_all_items((config_amiga_speed) ? 1.0 : frame_time, 0);
#endif
if (rc)
goto goto_legacy;
/* transfer benson without game view
* because we only got benson refreshed during VBL IRQ
*/
- emul_video(image, memory, palette, IMAGE_WIDTH, IMAGE_HEIGHT, IMAGE_DIWSTART, chipreg, BENSON_AT_LINE, IMAGE_HEIGHT, double_pixel_size);
+ all_white = emul_video(image, memory, palette, IMAGE_WIDTH, IMAGE_HEIGHT, IMAGE_DIWSTART, chipreg, BENSON_AT_LINE, IMAGE_HEIGHT, double_pixel_size);
/* render sound to sound buffer
* buffer pointer read and write is atomic, so no locking required!
*/
return 0;
}
+int render_all_white(int vr)
+{
+ render_item_t sky_item;
+
+ memset(&sky_item, 0, sizeof(sky_item));
+ sky_item.type = RENDER_ITEM_SKY;
+
+ /* set color */
+ sky_item.u.ground.red = 1.0;
+ sky_item.u.ground.green = 1.0;
+ sky_item.u.ground.blue = 1.0;
+
+ render_one_item(&sky_item, vr);
+
+ return 0;
+}
+
void render_capture_reset(void)
{
/* flush old list, if exists */
void render_capture_stop(void);
void render_capture_event(int event);
int render_all_items(double inter, int vr);
+int render_all_white(int vr);
void render_capture_reset(void);
int render_capture_is_interstellar(void);