Derniers sujets
Qui est en ligne ?
Il y a en tout 2 utilisateurs en ligne :: 0 Enregistré, 0 Invisible et 2 Invités Aucun
Le record du nombre d'utilisateurs en ligne est de 29 le Mer 25 Fév 2015 - 14:01
Connexion
Statistiques
Nous avons 241 membres enregistrésL'utilisateur enregistré le plus récent est ben_frog
Nos membres ont posté un total de 8921 messages dans 811 sujets
Oricutron: Pb gestion des fichiers .tap
4 participants
Forum Oric :: Forums :: Forum Public :: Emulations
Page 1 sur 1
Oricutron: Pb gestion des fichiers .tap
Bonjour,
En testant Tyrann3 avec oricutron, j'ai trouvé 2 bugs dans la gestion des fichiers .tap.
Les problèmes sont situés dans le fichier tape.c:
Premier big::
Dans la fonction tape_load_tap
Un contournement possible est de remplacer le test par oric->tapeoffs >= oric-tapelen-1
Je n'e pense pas que cette modification entraine d'autres bugs (mais on ne sait jamais)
L'autre solution consiste à ajouter systématiquement l'extension .TAP dans toutes les instructions BASIC, ce qui déclenchera le test ( i > 3 ) && ( strcasecmp( &oric->lasttapefile[i-4], ".tap" ) == 0 ) ) et force le chargement du fichier. C'est ce que j'avais indiqué pour Tyrann3.
Second bug:
Pour le reproduire:
-> Le second fichier n'est jamais chargé.
Le bug est dans la fonction tape_autoinsert():
Je pense que c'est parce que tape_autoinsert, en ligne 1088, essaye d'abord de charger un fichier "PROG2" , via la fonction tape_load_tap(), fichier qui n'existe pas.
Le problème est que oric->tapebuf n'est pas vide (il contient PROG1.TAP) de ce fait les tests suivants ne sont pas satisfaits et on n'essaye pas de charger un fichier avec les extensions .tap ou .ort.
On peut corriger ça en modifiant la fonction tape_patches au mêm niveau que pour le bug précédent, en ajoutant
Ce qui donne:
Le patch complet (pour une révision r644 ou supérieure):
Remarques:
En testant Tyrann3 avec oricutron, j'ai trouvé 2 bugs dans la gestion des fichiers .tap.
Les problèmes sont situés dans le fichier tape.c:
Premier big::
Dans la fonction tape_load_tap
- Code:
// TAP
else if (memcmp(oric->tapebuf, "\x16\x16\x16", 3) == 0)
{
oric->rawtape = SDL_FALSE;
// I give up trying to do anything clever.
// Just allow an extra byte for broken tape images.
oric->tapelen++;
}
- Code:
if( ( oric->cpu.read( &oric->cpu, oric->pch_fd_getname_addr ) != 0 ) &&
( oric->autoinsert ) )
{
// Only do this if there is no tape inserted, or we're at the
// end of the current tape, or the filename ends in .TAP, .ORT or .WAV
if( ( !oric->tapebuf ) ||
( oric->tapeoffs >= oric->tapelen ) ||
( ( i > 3 ) && ( strcasecmp( &oric->lasttapefile[i-4], ".tap" ) == 0 ) ) ||
( ( i > 3 ) && ( strcasecmp( &oric->lasttapefile[i-4], ".ort" ) == 0 ) ) ||
( ( i > 3 ) && ( strcasecmp( &oric->lasttapefile[i-4], ".wav" ) == 0 ) ) )
{
tape_autoinsert( oric );
oric->cpu.write( &oric->cpu, oric->pch_fd_getname_addr, 0 );
}
}
}
Un contournement possible est de remplacer le test par oric->tapeoffs >= oric-tapelen-1
Je n'e pense pas que cette modification entraine d'autres bugs (mais on ne sait jamais)
L'autre solution consiste à ajouter systématiquement l'extension .TAP dans toutes les instructions BASIC, ce qui déclenchera le test ( i > 3 ) && ( strcasecmp( &oric->lasttapefile[i-4], ".tap" ) == 0 ) ) et force le chargement du fichier. C'est ce que j'avais indiqué pour Tyrann3.
Second bug:
Pour le reproduire:
- Mettre deux fichiers dans le répertoire tapes, par exemple PROG1.TAP et PROG2.TAP.
- Lancer oricutron
- CLOAD "PROG1"
- CLOAD "PROG2"
-> Le second fichier n'est jamais chargé.
Le bug est dans la fonction tape_autoinsert():
- Code:
void tape_autoinsert( struct machine *oric )
{
char *odir;
int i;
if( strncmp( (char *)&oric->mem[oric->pch_fd_getname_addr], oric->lasttapefile, 16 ) == 0 )
oric->mem[oric->pch_fd_getname_addr] = 0;
// Try and load the tape image
strcpy( tapefile, oric->lasttapefile );
i = (int)strlen(tapefile);
odir = getcwd( NULL, 0 );
chdir( tapepath );
tape_load_tap( oric, tapefile ); // <--- Ligne 1088
if( !oric->tapebuf )
{
// Try appending .tap
strcpy( &tapefile[i], ".tap" );
tape_load_tap( oric, tapefile );
}
if( !oric->tapebuf )
{
// Try appending .ort
strcpy( &tapefile[i], ".ort" );
tape_load_tap( oric, tapefile );
}
if( oric->tapebuf )
{
// We already inserted this one. Don't re-insert it when we get to the end. */
oric->lasttapefile[0] = 0;
}
chdir( odir );
free( odir );
}
Je pense que c'est parce que tape_autoinsert, en ligne 1088, essaye d'abord de charger un fichier "PROG2" , via la fonction tape_load_tap(), fichier qui n'existe pas.
Le problème est que oric->tapebuf n'est pas vide (il contient PROG1.TAP) de ce fait les tests suivants ne sont pas satisfaits et on n'essaye pas de charger un fichier avec les extensions .tap ou .ort.
On peut corriger ça en modifiant la fonction tape_patches au mêm niveau que pour le bug précédent, en ajoutant
- Code:
if ( oric->tapeoffs >= oric->tapelen -1) tape_eject( oric );
- Code:
tape_autoinsert( oric );
Ce qui donne:
- Code:
void tape_autoinsert( struct machine *oric )
{
char *odir;
int i;
SDL_bool tape_found;
if( strncmp( (char *)&oric->mem[oric->pch_fd_getname_addr], oric->lasttapefile, 16 ) == 0 )
oric->mem[oric->pch_fd_getname_addr] = 0;
// Try and load the tape image
strcpy( tapefile, oric->lasttapefile );
i = (int)strlen(tapefile);
odir = getcwd( NULL, 0 );
chdir( tapepath );
tape_found = tape_load_tap( oric, tapefile );
if( !tape_found )
{
// Try appending .tap
strcpy( &tapefile[i], ".tap" );
tape_found = tape_load_tap( oric, tapefile );
}
if( !tape_found )
{
// Try appending .ort
strcpy( &tapefile[i], ".ort" );
tape_load_tap( oric, tapefile );
}
if( oric->tapebuf )
{
// We already inserted this one. Don't re-insert it when we get to the end. */
oric->lasttapefile[0] = 0;
}
chdir( odir );
free( odir );
}
Le patch complet (pour une révision r644 ou supérieure):
- Code:
--- tape.c 2014-11-16 22:53:00.000000000 +0100
+++ tape.c.new 2015-07-14 15:07:14.104774319 +0200
@@ -1075,6 +1075,7 @@
{
char *odir;
int i;
+ SDL_bool tape_found;
if( strncmp( (char *)&oric->mem[oric->pch_fd_getname_addr], oric->lasttapefile, 16 ) == 0 )
oric->mem[oric->pch_fd_getname_addr] = 0;
@@ -1085,14 +1086,14 @@
odir = getcwd( NULL, 0 );
chdir( tapepath );
- tape_load_tap( oric, tapefile );
- if( !oric->tapebuf )
+ tape_found = tape_load_tap( oric, tapefile );
+ if( !tape_found )
{
// Try appending .tap
strcpy( &tapefile[i], ".tap" );
tape_load_tap( oric, tapefile );
}
- if( !oric->tapebuf )
+ if( !tape_found )
{
// Try appending .ort
strcpy( &tapefile[i], ".ort" );
@@ -1161,7 +1162,7 @@
// Only do this if there is no tape inserted, or we're at the
// end of the current tape, or the filename ends in .TAP, .ORT or .WAV
if( ( !oric->tapebuf ) ||
- ( oric->tapeoffs >= oric->tapelen ) ||
+ ( oric->tapeoffs >= oric->tapelen -1 ) ||
( ( i > 3 ) && ( strcasecmp( &oric->lasttapefile[i-4], ".tap" ) == 0 ) ) ||
( ( i > 3 ) && ( strcasecmp( &oric->lasttapefile[i-4], ".ort" ) == 0 ) ) ||
( ( i > 3 ) && ( strcasecmp( &oric->lasttapefile[i-4], ".wav" ) == 0 ) ) )
Remarques:
- J'ai fait ces tests avec la dernière version du SVN (r663).
- Concernant le permier bug, il semble que la gestion des fichiers incorrects était différente jusqu'à la r638, je n'ai pas vérifier cette révision.
assinie- Messages : 271
Date d'inscription : 09/02/2014
Re: Oricutron: Pb gestion des fichiers .tap
Merci pour les patchs.
Je vais les appliquer dès que possible.
Edit : Sauf si ISS me bat comme d'habitude
Je vais les appliquer dès que possible.
Edit : Sauf si ISS me bat comme d'habitude
Dernière édition par Hialmar le Mar 14 Juil 2015 - 21:46, édité 1 fois
Hialmar- Admin
- Messages : 840
Date d'inscription : 03/03/2014
Age : 53
Localisation : Toulouse
Re: Oricutron: Pb gestion des fichiers .tap
Not this time Hialmar . Today is soldering day for me...
iss- Messages : 112
Date d'inscription : 30/10/2014
Re: Oricutron: Pb gestion des fichiers .tap
J'ai mis les modifs sur le SVN.
Ça marche beaucoup mieux pour Tyrann 3 mais j'ai encore eu un bug tout à l'heure. Il se produit quand on fuit un combat.
Il faut que je cherche d'où ça vient.
Il y a aussi encore des tap qui ne marchent pas avec Oricutron mais qui marchent avec Euphoric comme le Hobbit trouvé sur oric.org.
Ça marche beaucoup mieux pour Tyrann 3 mais j'ai encore eu un bug tout à l'heure. Il se produit quand on fuit un combat.
Il faut que je cherche d'où ça vient.
Il y a aussi encore des tap qui ne marchent pas avec Oricutron mais qui marchent avec Euphoric comme le Hobbit trouvé sur oric.org.
Hialmar- Admin
- Messages : 840
Date d'inscription : 03/03/2014
Age : 53
Localisation : Toulouse
Re: Oricutron: Pb gestion des fichiers .tap
A quel moment tu as un problème de chargement avec le Hobbit?
Je viens de le charger et il démarre correctement.
Je viens de le charger et il démarre correctement.
assinie- Messages : 271
Date d'inscription : 09/02/2014
Re: Oricutron: Pb gestion des fichiers .tap
Pour faire fonctionner The Hobbit sur Oricutron, sélectionner Oric 1 et non pas Oric Atmos.
soft-bug- Ministre des Finances
- Messages : 24
Date d'inscription : 19/01/2014
Localisation : Colombes (92)
Re: Oricutron: Pb gestion des fichiers .tap
Ah merci je vais essayer.
Hialmar- Admin
- Messages : 840
Date d'inscription : 03/03/2014
Age : 53
Localisation : Toulouse
Sujets similaires
» Besoin d'aide pour la gestion du temps ...
» Oricutron v1.1 + FT-DOS: Bug
» Oricutron - touches 6 et 8
» [Info] - fichiers joints et stockage
» [résolu] Format des fichiers Hyperbasic...
» Oricutron v1.1 + FT-DOS: Bug
» Oricutron - touches 6 et 8
» [Info] - fichiers joints et stockage
» [résolu] Format des fichiers Hyperbasic...
Forum Oric :: Forums :: Forum Public :: Emulations
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|
Jeu 21 Mar 2024 - 8:51 par Dom50
» carte mère Oric (re)tracée
Mar 5 Mar 2024 - 18:54 par kenneth
» Meurtre à Grande Vitesse
Dim 25 Fév 2024 - 5:09 par Iurius
» ORIC-1 sur LE BON COIN
Ven 23 Fév 2024 - 23:01 par Mcar
» ORIC ATMOS sur LE BON COIN
Dim 4 Fév 2024 - 12:06 par kiwilevrai
» Problème d'affichage des couleurs avec un Oric Atmos
Sam 27 Jan 2024 - 1:26 par pierbail
» Bienvenue dans le Forum des Oriciens
Mar 9 Jan 2024 - 12:33 par Dom50
» Rencontre avec Laurant Weill, co-fondateur de Loriciel, et mon garçon de 12 ans
Ven 29 Déc 2023 - 14:13 par Arcade-des-Monts
» Bonnes fêtes
Mar 26 Déc 2023 - 10:21 par Dom50
» Murders in Venice / Meutres à Venise
Sam 18 Nov 2023 - 22:44 par retroric
» Un clavier PS/2 pour tester un ORIC
Dim 27 Aoû 2023 - 9:49 par Voyageur
» Disquette 3" Sedoric
Mar 1 Aoû 2023 - 14:22 par AtomeX
» faire un 6502 avec des phototransistor
Dim 16 Juil 2023 - 17:26 par Voyageur
» Oricutron linux et DSK
Jeu 29 Juin 2023 - 18:34 par Voyageur
» No Problem !
Dim 25 Juin 2023 - 17:53 par Voyageur