Beispiel #1
0
void backup_flash()
{
	int ret;
	volatile u16 *read_addr=(volatile u16 *)0x22000000;
	volatile u16 *write_addr=(volatile u16 *)0x20200000;
	u32 i;
	flash_info_struct flash_info;

	vdp_start_draw_list();
	vdp_end_draw_list();

	if ((ret = ar_init_flash_io(&flash_info)) != IAPETUS_ERR_OK)
	{
		if (!ar_handle_detect_error(ret))
		   return;
	}

	for (i = 0; i < 0x40000; i++)
		write_addr[i] = read_addr[i];

	vdp_printf(&main_font, 8, 3 * 8, 0xF, "Firmware ready to download. Set your");
	vdp_printf(&main_font, 8, 4 * 8, 0xF, "Commlink utility to download data from");
	vdp_printf(&main_font, 8, 5 * 8, 0xF, "LWRAM(0x00200000 to 0x00240000)");
	vdp_printf(&main_font, 8, 6 * 8, 0xF, "Press any button to exit.");

	commlink_start_service();
	wait_for_press(-1);
	commlink_stop_service();
}
Beispiel #2
0
void vdp1_clip_test()
{
   int gouraud_table_address = 0x40000;
   u32 clipping_mode = 3;//outside

   u16* p = (u16 *)(0x25C00000 + gouraud_table_address);

   for (;;)
   {
      vdp_start_draw_list();

      sprite_struct quad;

      //system clipping
      quad.x = 319 - 8;
      quad.y = 223 - 8;

      vdp_system_clipping(&quad);

      //user clipping
      quad.x = 8;
      quad.y = 8;
      quad.x2 = 319 - 16;
      quad.y2 = 223 - 16;

      vdp_user_clipping(&quad);

      //fullscreen polygon
      quad.x = 319;
      quad.y = 0;
      quad.x2 = 319;
      quad.y2 = 223;
      quad.x3 = 0;
      quad.y3 = 223;
      quad.x4 = 0;
      quad.y4 = 0;

      quad.bank = RGB16(0x10, 0x10, 0x10);//gray

      quad.gouraud_addr = gouraud_table_address;

      quad.attr = (clipping_mode << 9) | 4;//use gouraud shading

      //red, green, blue, and white
      p[0] = RGB16(31, 0, 0);
      p[1] = RGB16(0, 31, 0);
      p[2] = RGB16(0, 0, 31);
      p[3] = RGB16(31, 31, 31);

      vdp_draw_polygon(&quad);

      vdp_end_draw_list();

      vdp_vsync();

      if (per[0].but_push_once & PAD_A)
      {
         clipping_mode = 0; //clipping disabled
      }
      if (per[0].but_push_once & PAD_B)
      {
         clipping_mode = 2; //inside drawing mode
      }
      if (per[0].but_push_once & PAD_C)
      {
         clipping_mode = 3; //outside drawing mode
      }

      if (per[0].but_push_once & PAD_START)
         break;
   }
}
Beispiel #3
0
void vdp1_clip_test()
{
   int gouraud_table_address = 0x40000;
   u32 clipping_mode = 3;//outside

   u16* p = (u16 *)(0x25C00000 + gouraud_table_address);

   auto_test_sub_test_start("Clipping test");

   VDP1_REG_FBCR = 0;

   vdp_start_draw_list();

   sprite_struct quad;

   quad.x = 0;
   quad.y = 0;

   vdp_local_coordinate(&quad);

   //system clipping
   quad.x = 319 - 8;
   quad.y = 223 - 8;

   vdp_system_clipping(&quad);

   //user clipping
   quad.x = 8;
   quad.y = 8;
   quad.x2 = 319 - 16;
   quad.y2 = 223 - 16;

   vdp_user_clipping(&quad);

   //fullscreen polygon
   quad.x = 319;
   quad.y = 0;
   quad.x2 = 319;
   quad.y2 = 223;
   quad.x3 = 0;
   quad.y3 = 223;
   quad.x4 = 0;
   quad.y4 = 0;

   quad.bank = RGB16(0x10, 0x10, 0x10);//gray

   quad.gouraud_addr = gouraud_table_address;

   quad.attr = (clipping_mode << 9) | 4;//use gouraud shading

   //red, green, blue, and white
   p[0] = RGB16(31, 0, 0);
   p[1] = RGB16(0, 31, 0);
   p[2] = RGB16(0, 0, 31);
   p[3] = RGB16(31, 31, 31);

   vdp_draw_polygon(&quad);

   vdp_end_draw_list();

   vdp_vsync();

   VDP1_REG_FBCR = 3;

   vdp_vsync();
   vdp_vsync();

#ifdef BUILD_AUTOMATED_TESTING

   auto_test_get_framebuffer();

#else

   for (;;)
   {
      while (!(VDP2_REG_TVSTAT & 8)) 
      {
         ud_check(0);
      }

      while (VDP2_REG_TVSTAT & 8) 
      {
         
      }

      if (per[0].but_push_once & PAD_A)
      {
         clipping_mode = 0; //clipping disabled
      }
      if (per[0].but_push_once & PAD_B)
      {
         clipping_mode = 2; //inside drawing mode
      }
      if (per[0].but_push_once & PAD_C)
      {
         clipping_mode = 3; //outside drawing mode
      }

      if (per[0].but_push_once & PAD_START)
         break;

      if (per[0].but_push_once & PAD_X)
      {
         ar_menu();
      }

      if (per[0].but_push_once & PAD_Y)
      {
         reset_system();
      }
   }

#endif

}
Beispiel #4
0
int reflash_ar(font_struct *font, u8 *rom_addr, int ask_upload)
{
   int ret;
   volatile u16 *write_addr=(volatile u16 *)0x22000000;
   u16 *read_addr=(u16 *)((u32)rom_addr | 0x20000000);
	flash_info_struct flash_info;
	int i;

   vdp_start_draw_list();
   vdp_end_draw_list();

   for (;;)
   {
start:
      if ((ret = ar_init_flash_io(&flash_info)) != IAPETUS_ERR_OK)
      {
			if (!ar_handle_detect_error(ret))
				return 1;
      }

      vdp_printf(font, 8, 8, 0xF, "Detected cart succesfully");

		if (ask_upload)
		{
			vdp_printf(font, 8, 3 * 8, 0xF, "Please upload flash to 0x00200000 and");
			vdp_printf(font, 8, 4 * 8, 0xF, "then press 'A' to continue. ");
			vdp_printf(font, 8, 5 * 8, 0xF, "Press 'X' to exit.");

			commlink_start_service();

			if (wait_for_press(PAD_A | PAD_X) & PAD_X)
				return 1;

			commlink_stop_service();

			if (strncmp((char *)read_addr, "SEGA SEGASATURN ", 16) != 0)
			{
				vdp_printf(font, 8, 7 * 8, 0xF, "Invalid or no ROM uploaded. ");
				vdp_printf(font, 8, 8 * 8, 0xF, "Press 'A' to try again.");

				wait_for_press(PAD_A);
				vdp_clear_screen(font);
				goto start;
			}
		}

      vdp_printf(font, 8, 7 * 8, 0xF, "WARNING: Rewriting the flash may damage");
      vdp_printf(font, 8, 8 * 8, 0xF, "your AR. Press A+B+C to continue.");
      vdp_printf(font, 8, 9 * 8, 0xF, "Press 'X' to exit.");

      for (;;)        
      {
         vdp_vsync(); 
         if (per[0].but_push & PAD_A &&
             per[0].but_push & PAD_B &&
             per[0].but_push & PAD_C)
            break;
         else if (per[0].but_push_once & PAD_X)
            return 1;
      }

      vdp_printf(font, 8, 11 * 8, 0xF, "DO NOT TURN OFF YOUR SYSTEM");

      vdp_printf(font, 8, 12 * 8, 0xF, "Erasing flash...");
      ar_erase_flash_all(&flash_info);
      vdp_printf(font, 17 * 8, 12 * 8, 0xF, "OK");

      vdp_printf(font, 8, 13 * 8, 0xF, "Writing flash...");		
      font->transparent = FALSE;
      for (i = 0; i < flash_info.num_pages; i++)
      {
         vdp_printf(font, 17 * 8, 13 * 8, 0xF, "%d%%  ", (i+1) * 100 / flash_info.num_pages);
         ar_write_flash(&flash_info, write_addr+(i*flash_info.page_size), read_addr+(i*flash_info.page_size), 1);
      }
      vdp_printf(font, 17 * 8, 13 * 8, 0xF, "OK  ");
      font->transparent = TRUE;
      vdp_printf(font, 8, 14 * 8, 0xF, "Verifying flash...");
      ret = ar_verify_write_flash(&flash_info, write_addr, read_addr, flash_info.num_pages);
      vdp_printf(font, 19 * 8, 14 * 8, 0xF, ret ? "OK" : "FAILED");

      if (ret)
      {
         vdp_printf(font, 8, 15 * 8, 0xF, "SUCCESS! Press reset to finish.");
         goto done;
      }

      vdp_printf(font, 8, 15 * 8, 0xF, "Failed flashing AR. Press a 'A' to");
      vdp_printf(font, 8, 16 * 8, 0xF, "retry or 'X' to exit");

		if (wait_for_press(PAD_A | PAD_X) & PAD_X)
			return 0;

      vdp_clear_screen(font);
   }

done:
	wait_for_press(PAD_A);
	return 1;
}