Forum Oric
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Derniers sujets
» Bla Bla général du Jury
Oricutron: Pb gestion des fichiers .tap EmptyJeu 21 Mar 2024 - 8:51 par Dom50

» carte mère Oric (re)tracée
Oricutron: Pb gestion des fichiers .tap EmptyMar 5 Mar 2024 - 18:54 par kenneth

» Meurtre à Grande Vitesse
Oricutron: Pb gestion des fichiers .tap EmptyDim 25 Fév 2024 - 5:09 par Iurius

» ORIC-1 sur LE BON COIN
Oricutron: Pb gestion des fichiers .tap EmptyVen 23 Fév 2024 - 23:01 par Mcar

» ORIC ATMOS sur LE BON COIN
Oricutron: Pb gestion des fichiers .tap EmptyDim 4 Fév 2024 - 12:06 par kiwilevrai

» Problème d'affichage des couleurs avec un Oric Atmos
Oricutron: Pb gestion des fichiers .tap EmptySam 27 Jan 2024 - 1:26 par pierbail

» Bienvenue dans le Forum des Oriciens
Oricutron: Pb gestion des fichiers .tap EmptyMar 9 Jan 2024 - 12:33 par Dom50

» Rencontre avec Laurant Weill, co-fondateur de Loriciel, et mon garçon de 12 ans
Oricutron: Pb gestion des fichiers .tap EmptyVen 29 Déc 2023 - 14:13 par Arcade-des-Monts

» Bonnes fêtes
Oricutron: Pb gestion des fichiers .tap EmptyMar 26 Déc 2023 - 10:21 par Dom50

» Murders in Venice / Meutres à Venise
Oricutron: Pb gestion des fichiers .tap EmptySam 18 Nov 2023 - 22:44 par retroric

» Un clavier PS/2 pour tester un ORIC
Oricutron: Pb gestion des fichiers .tap EmptyDim 27 Aoû 2023 - 9:49 par Voyageur

» Disquette 3" Sedoric
Oricutron: Pb gestion des fichiers .tap EmptyMar 1 Aoû 2023 - 14:22 par AtomeX

» faire un 6502 avec des phototransistor
Oricutron: Pb gestion des fichiers .tap EmptyDim 16 Juil 2023 - 17:26 par Voyageur

» Oricutron linux et DSK
Oricutron: Pb gestion des fichiers .tap EmptyJeu 29 Juin 2023 - 18:34 par Voyageur

» No Problem !
Oricutron: Pb gestion des fichiers .tap EmptyDim 25 Juin 2023 - 17:53 par Voyageur

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

Récupérer mon mot de passe

Statistiques
Nous avons 241 membres enregistrés
L'utilisateur enregistré le plus récent est ben_frog

Nos membres ont posté un total de 8921 messages dans 811 sujets
Sites Sympas

> Culture Club


-50%
Le deal à ne pas rater :
-50% sur les sacs à dos pour ordinateur portable Urban Factory ...
19.99 € 39.99 €
Voir le deal

Oricutron: Pb gestion des fichiers .tap

4 participants

Aller en bas

Oricutron: Pb gestion des fichiers .tap Empty Oricutron: Pb gestion des fichiers .tap

Message par assinie Mar 14 Juil 2015 - 16:06

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
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++;
  }
Ce code a probablement été ajouté pour prendre en compte les fichiers incorrects (ceux à qui il manque le dernier octet), mais dans la fonction tape_patches
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 );
          }
        }
      }
le test oric->tapeoffs >= oric->tapelen n'est jamais vrai et le  BASIC attend en vain le dernier octet dans le cas d'un fichier incorrect.
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:

  1. Mettre deux fichiers dans le répertoire tapes, par exemple PROG1.TAP et PROG2.TAP.
  2. Lancer oricutron
  3. CLOAD "PROG1"
  4. 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 );
juste avant
Code:
tape_autoinsert( oric );
ou alors, on peut modifier la fonction tape_autoinsert pour qu'elle teste le code de retour de tape_load_tap.
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 );
}
Je ne sais pas si le dernier test  if( oric->tapebuf ) doit être modifier ou non (ça marche sans le changer).

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
assinie

Messages : 271
Date d'inscription : 09/02/2014

Revenir en haut Aller en bas

Oricutron: Pb gestion des fichiers .tap Empty Re: Oricutron: Pb gestion des fichiers .tap

Message par Hialmar Mar 14 Juil 2015 - 19:04

Merci pour les patchs.

Je vais les appliquer dès que possible.

Edit : Sauf si ISS me bat comme d'habitude Wink


Dernière édition par Hialmar le Mar 14 Juil 2015 - 21:46, édité 1 fois

_________________
Hialmar
Membre du CEO et de Silicium.
Hialmar
Hialmar
Admin

Messages : 840
Date d'inscription : 03/03/2014
Age : 53
Localisation : Toulouse

Revenir en haut Aller en bas

Oricutron: Pb gestion des fichiers .tap Empty Re: Oricutron: Pb gestion des fichiers .tap

Message par iss Mar 14 Juil 2015 - 21:09

Not this time Hialmar Smile. Today is soldering day for me...
iss
iss

Messages : 112
Date d'inscription : 30/10/2014

Revenir en haut Aller en bas

Oricutron: Pb gestion des fichiers .tap Empty Re: Oricutron: Pb gestion des fichiers .tap

Message par Hialmar Mer 22 Juil 2015 - 20:21

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.

_________________
Hialmar
Membre du CEO et de Silicium.
Hialmar
Hialmar
Admin

Messages : 840
Date d'inscription : 03/03/2014
Age : 53
Localisation : Toulouse

Revenir en haut Aller en bas

Oricutron: Pb gestion des fichiers .tap Empty Re: Oricutron: Pb gestion des fichiers .tap

Message par assinie Mer 22 Juil 2015 - 21:47

A quel moment tu as un problème de chargement avec le Hobbit?
Je viens de le charger et il démarre correctement.
assinie
assinie

Messages : 271
Date d'inscription : 09/02/2014

Revenir en haut Aller en bas

Oricutron: Pb gestion des fichiers .tap Empty Re: Oricutron: Pb gestion des fichiers .tap

Message par soft-bug Mer 22 Juil 2015 - 21:55

Pour faire fonctionner The Hobbit sur Oricutron, sélectionner Oric 1 et non pas Oric Atmos.
soft-bug
soft-bug
Ministre des Finances

Messages : 24
Date d'inscription : 19/01/2014
Localisation : Colombes (92)

Revenir en haut Aller en bas

Oricutron: Pb gestion des fichiers .tap Empty Re: Oricutron: Pb gestion des fichiers .tap

Message par Hialmar Mer 22 Juil 2015 - 22:08

Ah merci je vais essayer.

_________________
Hialmar
Membre du CEO et de Silicium.
Hialmar
Hialmar
Admin

Messages : 840
Date d'inscription : 03/03/2014
Age : 53
Localisation : Toulouse

Revenir en haut Aller en bas

Oricutron: Pb gestion des fichiers .tap Empty Re: Oricutron: Pb gestion des fichiers .tap

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum