Commits

hominem_te_esse committed 6829f6a

SilverBull: apply a delay to CDVDMAN functions (initially for Shadow Heart 2)

The GUI variable define the timer to apply (the real value applied to CDVDMAN is multiplied by 250, so a value in GUI of 50, apply a 12500 timer to CDVDMAN).

Some values tu use depending of the game and the device mode (SMB/HDD/USB) - thanks to BatBastard/RandQalan:
SLUS_214.45 HDD=50 (Ar Tonelico 1)
SLUS_217.88 HDD=50 (Ar Tonelico 2)
SLUS_207.63 HDD=50 (Beyond Good & Evil) <--- (fixes looping audio/fully playable)
SLUS_201.91 HDD=50 (Defender)
SLUS_213.73 HDD=50 (Drakengard 2)
SLUS_212.44 HDD=50 (Fatal Frame 3)
SLUS_209.63 HDD=50 (Final Fantasy 12)
SLUS_204.14 HDD=50 (Legaia 2 Duel Saga)
SLUS_218.90 HDD=50 (Mana Khemia 2)
SLUS_214.10 HDD=50 (MK Armageddon)
SLUS_208.81 HDD=50 (MK Deception)
SLUS_210.87 HDD=50 (MK Shaolin Monks)
SLUS_211.15 HDD=50 (Okami)
SLUS_206.88 HDD=50 (PsiOps: The Mindgate Conspiracy)
SLUS_211.11 HDD=50 (Scarface)
SLUS_210.33 HDD=50 (Second Sight) (might still need UDMA 2 for cut-scene lag/freezes that don't break the game)
SLUS_203.47 HDD=50 (Shadow Hearts 1)
SLUS_210.41 HDD=50 SMB=6 (Shadow Hearts 2 Disk 1)
SLUS_210.44 HDD=50 SMB=6 (Shadow Hearts 2 Disk 2)
SLUS_213.26 HDD=50 (Shadow Hearts 3 FTNW)
SLUS_214.31 HDD=50 (SMT Devil Summoner 1)
SLUS_218.45 HDD=50 (SMT Devil Summoner 2)
SLUS_209.74 HDD=50 (SMT Digital Devil Saga 1)
SLUS_211.52 HDD=50 (SMT Digital Devil Saga 2)
SLUS_209.11 HDD=50 (SMT Nocturne)
SLUS_217.82 HDD=50 (SMT Persona 4)
SCUS_975.45 HDD=50 (SOCOM: Combined Assault)
SLUS_212.91 HDD=50 (Suikoden V) <--- might break or obsolete previous fix - further testing needed
SLUS_212.45 HDD=50 (Suikoden Tactics)
SLUS_212.01 HDD=50 (Tales Of Legendia) <--- slight music sync issues on world map - might need 10000 instead
SLUS_213.86 HDD=50 (Tales Of The Abyss) <--- for compatibility's sake - doesn't fix audio issues though
SLUS_214.52 HDD=50 (Valkyrie Profile 2: Silmeria)
SLUS_972.03 HDD=50 (Wild Arms 3)
SLUS_209.37 HDD=50 (Wild Arms ACF)
SLUS_204.69 HDD=50 (Xenosaga 1)
SLUS_208.92 HDD=50 (Xenosaga 2 Disk 1)
SLUS_211.33 HDD=50 (Xenosaga 2 Disk 2)
SLUS_213.89 HDD=50 (Xenosaga 3 Disk 1)
SLUS_214.17 HDD=50 (Xenosaga 3 Disk 2)
SLUS_213.48 HDD=50 (Yakuza)
SLUS_217.69 HDD=50 (Yakuza 2)

Read more here:
http://psx-scene.com/forums/f150/does-shadow-hearts-2-covenant-work-any-opl-hdd-85727/#post813142
http://psx-scene.com/forums/f150/does-shadow-hearts-2-covenant-work-any-opl-hdd-85727/index2.html#post814869
http://psx-scene.com/forums/f150/does-shadow-hearts-2-covenant-work-any-opl-hdd-85727/index3.html#post894166

Comments (0)

Files changed (14)

 
 #define CONFIG_FILE_NUM 3
 
-#define CONFIG_ITEM_NAME		"#Name"
-#define CONFIG_ITEM_LONGNAME	"#LongName"
-#define CONFIG_ITEM_SIZE		"#Size"
-#define CONFIG_ITEM_FORMAT		"#Format"
-#define CONFIG_ITEM_MEDIA		"#Media"
-#define CONFIG_ITEM_STARTUP		"#Startup"
-#define CONFIG_ITEM_ALTSTARTUP	"$AltStartup"
-#define CONFIG_ITEM_VMC			"$VMC"
-#define CONFIG_ITEM_COMPAT		"$Compatibility"
-#define CONFIG_ITEM_DMA			"$DMA"
-#define CONFIG_ITEM_DNAS		"$DNAS"
+#define CONFIG_ITEM_NAME			"#Name"
+#define CONFIG_ITEM_LONGNAME		"#LongName"
+#define CONFIG_ITEM_SIZE			"#Size"
+#define CONFIG_ITEM_FORMAT			"#Format"
+#define CONFIG_ITEM_MEDIA			"#Media"
+#define CONFIG_ITEM_STARTUP			"#Startup"
+#define CONFIG_ITEM_ALTSTARTUP		"$AltStartup"
+#define CONFIG_ITEM_VMC				"$VMC"
+#define CONFIG_ITEM_COMPAT			"$Compatibility"
+#define CONFIG_ITEM_DMA				"$DMA"
+#define CONFIG_ITEM_DNAS			"$DNAS"
+#define CONFIG_ITEM_CDVDMAN_TIMER	"$CallbackTimer"
 
 struct config_value_t {
         char key[32];

include/dialogs.h

 
 #define COMPAT_MODE_BASE		200
 
+#define COMPAT_CDVDMAN_TIMER	 98
 #define COMPAT_DMA				 99
 #define COMPAT_ALTSTARTUP		100
 #define COMPAT_GAME				101
 #define _STR_MODE7						134
 #define _STR_MODE8						135
 #define _STR_MODE9						136
+#define _STR_CDVDMAN_TIMER				137
+#define _STR_HINT_CDVDMAN_TIMER			138
 
-#define LANG_STR_COUNT 137
+#define LANG_STR_COUNT 139
 
 // Maximum external languages supported
 #define MAX_LANGUAGE_FILES 15

lng/lang_English.lng

 Mode 6
 Mode 7
 Mode 8
-Mode 9
+Mode 9
+Callback timer
+Apply a delay to CDVD functions (0 is default)

lng/lang_French.lng

 Mode 6
 Mode 7
 Mode 8
-Mode 9
+Mode 9
+Temporisation callback
+Applique un délai aux opérations du CDVD (0 par défaut)

lng/lang_Spanish.lng

                BIENVENIDO AL OPEN PS2 LOADER. EL CÓDIGO PRINCIPAL ESTA BASADO EN EL DEL HD PROJECT <http://psx-scene.com> ADAPTADO AL FORMATO DEL USB ADVANCE E INTERFAZ GRÁFICA INICIAL POR IFCARO <http://ps2dev.ifcaro.net> LA MAYOR PARTE DEL NÚCLEO DEL CARGADOR ES REALIZADA POR JIMMIKAELKAEL. TODAS LAS MEJORAS EN LA INTERFAZ SON REALIZADAS POR VOLCA. GRACIAS POR USAR NUESTRO PROGRAMA ^^
 Open PS2 Loader %s
 Guardar cambios
-O Atrás
-Configurar red
+Atrás
+Ajustes de red
 <Sin configurar>
-Configuración guardada...
+Configuración guardada.
 ¡Error al guardar la configuración!
 Salir
 Configuración
 Juegos por USB
-Juegos por HDD
-Juegos por RED
+Juegos por Disco duro
+Juegos por Red
 Aplicaciones
 Estilo
 Idioma
 Activado
 Desactivado
 Aceptar
-Preferencias juego
-Borrar todas las preferencias
-Preferencias para el juego borradas
+Ajustes del juego
+Borrar todos los ajustes
+Ajustes del juego borrados
 Desplazamiento
 Lento
 Medio
 Menú por defecto
 Cargar del disco
 Espera por favor
-Error al cargar la ID del juego
+Error al cargar el código ID del juego
 Listas ordenadas por alfabeto
-Error al cargar archivo de idioma
+Error al cargar el archivo de idioma
 No mostrar los colores para depuración
 Mando no encontrado, esperando...
 Carátulas, serigrafías y fondos
 Pantalla panorámica
 Apagar PS2
-Cargando configuración
-Guardando configuración
+Cargando configuración...
+Guardando configuración...
 Iniciar dispositivo
-Modo de inicio para dispositivo USB
-Modo de inicio para dispositivo HDD
-Modo de inicio para dispositivo ETH
+Modo de inicio para USB
+Modo de inicio para Disco duro
+Modo de inicio para Red
 Modo de inicio para Aplicaciones
 Automático
 Manual
-Iniciar servidor HDL
-Iniciando servidor HDL...
-Servidor HDL conectado... Pulsa [O] para desconectar
-Pulsa [X] para cerrar servidor HDL...
-Cerrando servidor HDL...
-Salida hacia
+Iniciar servidor HDLDump
+Iniciando servidor HDLDump...
+Servidor HDLDump conectado... Pulsa [O] para desconectar
+Pulsa [X] para cerrar servidor HDLDump...
+Cerrando servidor HDLDump...
+Salida del IGR
 Color de fondo 
 Color de texto
 Dirección IP
 Unidad o carpeta compartida
 Cuenta de usuario compartida
 Contraseña
-<sin definir>
-X Aceptar
+<Sin definir>
+Aceptar
 El archivo se borrará definitivamente, ¿continuar?
 Renombrar
 Borrar
 Preferencias de pantalla
 Mostrar las operaciones de Borrar y Renombrar
 Comprobar fragmentación de juego USB
-Recordar último juego jugado
+Recordar último juego en uso
 Error, el juego está fragmentado
 Error, no se pudo iniciar el archivo
 Test
-Dejar vacío para autentificar como GUEST
+Dejar en blanco para autentificar como GUEST
 Cargar núcleo alternativo
 Método de lectura de datos alternativo
-Remover llamadas del sistema
-Saltar lectura archivos PSS
+Eliminar llamadas del sistema
+Omitir lectura de archivos PSS
 Sin soporte DVD-DL
 Sin soporte IGR
-Buffer cdvdfsv reducido
+No usado
 Ocultar módulo dev9
 Combinación de IGR alternativa
 Cambiar el tamaño formateará la VMC
 Archivo VMC creado
 Archivo VMC inválido, el tamaño es incorrecto
 El archivo VMC debe ser creado
-Error con el archivo VMC, ¿continuar con la MC física?
+Error con el archivo VMC %s, ¿continuar con la tarjeta física (slot %d)?
 Refresco automático de las listas
 Acerca del OPL
-Desarrolladores
+Desarrolladores
+Tiempo de espera para inicio dispositivo USB
+Ruta predeterminada dispositivo USB
+Dejar en blanco para salida hacia el menú de PS2
+Valor en minutos, 0 para desactivar el paro automático
+Paro automático de la rotación del Disco duro
+Señal de vídeo
+Color de diálogos
+Color de selección
+Mostrar pantalla de información
+Info.
+Archivo ELF personalizado
+Seleccionar color
+Reconexión
+Dejar en blanco para mostrar todas las unidades o carpetas compartidas
+Ruta predeterminada conexión de red
+Retroceso
+Espacio
+Intro
+Modo
+Ranura VMC 1
+Ranura VMC 2
+ID del juego
+Modo DMA
+Sincronización vertical
+Modo 1
+Modo 2
+Modo 3
+Modo 4
+Modo 5
+Modo 6
+Modo 7
+Modo 8
+Modo 9

modules/iopcore/cdvdman/cdvdman.c

 static char g_ISO_parts=0x69;
 static char g_ISO_media=0x69;
 static char g_gamesetting_alt_read=0;
-static int g_gamesetting_disable_DVDDL=0;
-static int g_gamesetting_0_pss=0;
+static u16 g_gamesetting_disable_DVDDL=0;
+static u16 g_gamesetting_0_pss=0;
+static u32 g_gamesetting_timer=100;
 
 #define ISO_MAX_PARTS	16
 static int g_part_start[ISO_MAX_PARTS] = {
 			*((u32 *)&ptr[0]) = (u32)user_cb;
 			*((u32 *)&ptr[4]) = reason;
 
-			sys_clock.lo = 100;
-			sys_clock.hi = 0;
+			USec2SysClock(g_gamesetting_timer, &sys_clock);
 
 			DPRINTF("cdvdman_cb_event reason: %d - setting cb alarm...\n", reason);
 

modules/iopcore/cdvdman/imports.lst

 I_SetAlarm
 I_iSetAlarm
 I_CancelAlarm
+I_USec2SysClock
 thbase_IMPORTS_end
 
 thevent_IMPORTS_start
 	
 	{UI_BREAK},
 	
+	{UI_LABEL, 0, 1, -1, 0, 0, {.label = {NULL, _STR_CDVDMAN_TIMER}}}, {UI_SPACER}, {UI_INT, COMPAT_CDVDMAN_TIMER, 1, _STR_HINT_CDVDMAN_TIMER, 0, 0, {.intvalue = {0, 0, 0, 255}}}, {UI_BREAK},
 	{UI_LABEL, 0, 1, -1, 0, 0, {.label = {NULL, _STR_DMA_MODE}}}, {UI_SPACER}, {UI_ENUM, COMPAT_DMA, 1, -1, 0, 0, {.intvalue = {0, 0}}},
 	
 	{UI_SPLITTER},
 	for (i = 0; i < COMPAT_MODE_COUNT; ++i)
 		diaSetInt(diaCompatConfig, COMPAT_MODE_BASE + i, (compatMode & (1 << i)) > 0 ? 1 : 0);
 
+	int timer = 0;
+	configGetInt(configSet, CONFIG_ITEM_CDVDMAN_TIMER, &timer);
+	diaSetInt(diaCompatConfig, COMPAT_CDVDMAN_TIMER, timer);
+
 	// Find out the current game ID
 	char hexid[32];
 	configGetStrCopy(configSet, CONFIG_ITEM_DNAS, hexid);
 		else
 			configRemoveKey(configSet, CONFIG_ITEM_COMPAT);
 
+		diaGetInt(diaCompatConfig, COMPAT_CDVDMAN_TIMER, &timer);
+		if (timer != 0)
+			configSetInt(configSet, CONFIG_ITEM_CDVDMAN_TIMER, timer);
+		else
+			configRemoveKey(configSet, CONFIG_ITEM_CDVDMAN_TIMER);
+
 		diaGetString(diaCompatConfig, COMPAT_GAMEID, hexid);
 		if (hexid[0] != '\0')
 			configSetStr(configSet, CONFIG_ITEM_DNAS, hexid);
 	configGetDiscIDBinary(configSet, gid);
 
 	int dmaType = 0, dmaMode = 0, compatMode = 0;
+	configGetInt(configSet, CONFIG_ITEM_COMPAT, &compatMode);
 	configGetInt(configSet, CONFIG_ITEM_DMA, &dmaMode);
-	configGetInt(configSet, CONFIG_ITEM_COMPAT, &compatMode);
 	if(dmaMode < 3)
 		dmaType = 0x20;
 	else {
 		irx = &hdd_cdvdman_irx;
 	}
 
-	for (i=0;i<size_irx;i++){
-		if(!strcmp((const char*)((u32)irx+i),"######    GAMESETTINGS    ######")){
+	for (i = 0; i < size_irx; i++) {
+		if(!strcmp((const char*)((u32)irx + i), "######    GAMESETTINGS    ######")) {
 			break;
 		}
 	}
 
+	// patch 48bit flag
+	u8 flag_48bit = hddIs48bit() & 0xff;
+	memcpy((void*)((u32)irx + i + 34), &flag_48bit, 1);
+
 	if (compatMode & COMPAT_MODE_2) {
 		u32 alt_read_mode = 1;
-		memcpy((void*)((u32)irx+i+35),&alt_read_mode,1);
+		memcpy((void*)((u32)irx + i + 35), &alt_read_mode, 1);
 	}
+
 	if (compatMode & COMPAT_MODE_5) {
 		u32 no_dvddl = 1;
-		memcpy((void*)((u32)irx+i+36),&no_dvddl,4);
+		memcpy((void*)((u32)irx + i + 36), &no_dvddl, 2);
 	}
+
 	if (compatMode & COMPAT_MODE_4) {
 		u32 no_pss = 1;
-		memcpy((void*)((u32)irx+i+40),&no_pss,4);
+		memcpy((void*)((u32)irx + i + 38), &no_pss, 2);
 	}
 
-	// patch 48bit flag
-	u8 flag_48bit = hddIs48bit() & 0xff;
-	memcpy((void*)((u32)irx+i+34), &flag_48bit, 1);
+	// patch cdvdman timer
+	int timer = 0;
+	if (configGetInt(configSet, CONFIG_ITEM_CDVDMAN_TIMER, &timer)) {
+		u32 cdvdmanTimer = timer * 250;
+		memcpy((void*)((u32)irx + i + 40), &cdvdmanTimer, 4);
+	}
 
 	// patch start_sector
-	memcpy((void*)((u32)irx+i+44), &game->start_sector, 4);
+	memcpy((void*)((u32)irx + i + 44), &game->start_sector, 4);
 
-	for (i=0;i<size_irx;i++){
-		if(!strcmp((const char*)((u32)irx+i),"B00BS")){
+	for (i=0;i<size_irx;i++) {
+		if(!strcmp((const char*)((u32)irx + i), "B00BS")) {
 			break;
 		}
 	}
 	// game id
-	memcpy((void*)((u32)irx+i), &gid, 5);
+	memcpy((void*)((u32)irx + i), &gid, 5);
 
 	// patches cdvdfsv
 	/*void *cdvdfsv_irx;
 	"Mode 6",
 	"Mode 7",
 	"Mode 8",
-	"Mode 9"
+	"Mode 9",
+	"Callback timer",
+	"Apply a delay to CDVD functions (0 is default)"
 };
 
 static int guiLangID = 0;

src/supportbase.c

 	}
 
 	memcpy((void*)((u32)cdvdman_irx + i + 33), &game->parts, 1);
+
 	memcpy((void*)((u32)cdvdman_irx + i + 34), &game->media, 1);
+
 	if (compatmask & COMPAT_MODE_2) {
 		u32 alt_read_mode = 1;
 		memcpy((void*)((u32)cdvdman_irx + i + 35), &alt_read_mode, 1);
 	}
+
 	if (compatmask & COMPAT_MODE_5) {
 		u32 no_dvddl = 1;
-		memcpy((void*)((u32)cdvdman_irx + i + 36), &no_dvddl, 4);
+		memcpy((void*)((u32)cdvdman_irx + i + 36), &no_dvddl, 2);
 	}
+
 	if (compatmask & COMPAT_MODE_4) {
 		u32 no_pss = 1;
-		memcpy((void*)((u32)cdvdman_irx + i + 40), &no_pss, 4);
+		memcpy((void*)((u32)cdvdman_irx + i + 38), &no_pss, 2);
+	}
+
+	// patch cdvdman timer
+	int timer = 0;
+	if (configGetInt(configSet, CONFIG_ITEM_CDVDMAN_TIMER, &timer)) {
+		u32 cdvdmanTimer = timer * 250;
+		memcpy((void*)((u32)cdvdman_irx + i + 40), &cdvdmanTimer, 4);
 	}
 
 	*patchindex = i;
 
 				if (customFont)
 					fntReplace(FNT_DEFAULT, customFont, size, 1, 0);
-			} else
+			} else {
+				// TODO reload the language font file
 				fntSetDefault(FNT_DEFAULT);
+			}
 		} else {
 			snprintf(fullPath, 128, "%s%s", themePath, fntFile);
 			int fntHandle = fntLoadFile(fullPath);