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(); }
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; } }
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 }
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; }