[CPC] Fichier TZX pour CPC... où en est-on?

Tout sur les ordinateurs de Mr SucreCPC PCW PC PDA NC ...

Modérateur : Politburo

Répondre
Xavier
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 684
Enregistré le : 10 mars 2006 15:48
Contact :

[CPC] Fichier TZX pour CPC... où en est-on?

Message par Xavier »

Salut,

J'ai besoin d'un cassette virtelle de réference pour addapter mon
TzxManager pour le CPC... (pas compatible pour le moment!)
http://dskcenter.free.fr/zxtools.html

Toujours pour "Moon-Control"... qui ne marche que pour le CPC464.

C'est pour regarder la structure des entêtes CPC...
Afin de créer des Tzx qui fonctionnent...

Si quelqu'un a un exemple de TZX ou un URL...
Je suis parti sur des blocks en mode standard "&h10"
Blocs de 2048 octets avec headers ams separés sans porteurs de synchro.
Comme les fichiers spectrum... d'ailleurs.
Merci d'avance.
Xavier
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 684
Enregistré le : 10 mars 2006 15:48
Contact :

Re: [CPC] Fichier TZX pour CPC... où en est-on?

Message par Xavier »

Salut,

Je pensais vous annoncer une bonne nouvelle...
... la mise à jour de TzxManager.
La conversion de fichiers AMS type basic avec Header AMS est prêt.
J'étais sur la conversion en wav...
Je m'apprêtais à modifier ZxSpectape pour récuperer les cassettes...

Mais, j'ai un gros problême qui bloque les projets !
Un problême de conversion C# vers Visual Basic...
Car ce CRC n'est pas usuel et je n'arrive pas à le coder. :oops:

Le CRC Polynomiale sur les fichiers cassettes n'est pas codé.

Donc, ca me donne un "Read error b" au chargement du TZX.
8-(

... j'ai cherché ...
Et tout le monde semblent avoir "honteusement" copier le même code:
(sources OTLA , 2CDT et 2CPC)

Code : Tout sélectionner

#define kCRCpoly  4129
//------------------------------------------------
//------------------------------------------------
// from 2CDT Copyright (c) Kevin Thacker   :
/* CRC code shamelessly taken from Pierre Guerrier's AIFF decoder! */
#define kCRCpoly  4129  /* used for binary long division in CRC */
/* CRC polynomial: X^16+X^12+X^5+1 */
unsigned int CRCupdate(unsigned int CRC, unsigned char new_byte)
{ unsigned int aux = CRC ^ (new_byte << 8);
 int i;
 for(i=0; i<8; i++)
   if (aux & 0x8000)
       aux = (aux <<= 1) ^ kCRCpoly;
     else
       aux <<= 1;
 return (aux);}
//------------------------------------------------
  
Bon...
^=XOR.
<<=rotation bits.

Le réél problème, c'est que c'est du C#... et pas du Visual Basic.
J'ai trouvé ca http://www.freevbcode.com/ShowCode.asp?ID=2755 d'approchant.
Mais, le code ne donne pas la même chose.

Si quelqu'un peut m'aider, ça peut débloquer beaucoup d'autre choses...

J'ai déjà passé des heures à tripoter le code... et toujours des CRC differents à ceux du fichier K7.

Autre infos dans la doc de Tape2HDD :
The checksum is generated bitwise, in a rather odd way: The initial value
is FFFFh, for each bit in the 256 byte section the value is adjusted as
follows:
IF (newbit XOR value.bit15)=0 THEN value=value*2
ELSE value=(value XOR 810h)*2+1
The result is XORed by FFFFh, and saved to tape (upper byte first).
Xavier
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 684
Enregistré le : 10 mars 2006 15:48
Contact :

Re: [CPC] Fichier TZX pour CPC... où en est-on?

Message par Xavier »

Salut,

Toujours rien du côté du CRC... :oops:

Mais, pour info... le format TZX et le format CDT sont identiques.
L'extension Tzx a été changée... car l'Amstrad CPC... n'est pas un Zx Spectrum.
Donc, il est possible de créer les images cassettes en "TZX"... puis de changer l'extension en "CDT" pour le rendre compatible.
Avatar du membre
gilles
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3100
Enregistré le : 17 avr. 2007 21:25
Localisation : 44
Contact :

Re: [CPC] Fichier TZX pour CPC... où en est-on?

Message par gilles »

peut etre que le
aux = (aux <<= 1) ^ kCRCpoly;
doit se traduire en 2 expressions en basic
genre
...
then
aux=aux*2
aux=aux XOR kCRCpoly
else
...
poste donc ton essai le plus approchant qu'on regarde...
Xavier
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 684
Enregistré le : 10 mars 2006 15:48
Contact :

Re: [CPC] Fichier TZX pour CPC... où en est-on?

Message par Xavier »

gilles a écrit :peut etre que le
aux = (aux <<= 1) ^ kCRCpoly;
doit se traduire en 2 expressions en basic
genre
...
then
aux=aux*2
aux=aux XOR kCRCpoly
else
...
poste donc ton essai le plus approchant qu'on regarde...
Ok, je vais mettre TzxManager en ligne demain.
La routine CRC sera à jour. (mais toujours avec des problème)
le "<<" est une rotation de bits vers la droite.
Dans l'exemple donné en vb... elle est vers la gauche.
Un problème de signe en long!!!
Donc, suivant les explications de l'auteur de l'exemple,
kCRCpoly doit être modifié et inversé.
Je télécharge le code dès que possible.
Xav.
Avatar du membre
gilles
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3100
Enregistré le : 17 avr. 2007 21:25
Localisation : 44
Contact :

Re: [CPC] Fichier TZX pour CPC... où en est-on?

Message par gilles »

Xavier a écrit :
gilles a écrit :peut etre que le
aux = (aux <<= 1) ^ kCRCpoly;
doit se traduire en 2 expressions en basic
genre
...
then
aux=aux*2
aux=aux XOR kCRCpoly
else
...
poste donc ton essai le plus approchant qu'on regarde...
Ok, je vais mettre TzxManager en ligne demain.
La routine CRC sera à jour. (mais toujours avec des problème)
le "<<" est une rotation de bits vers la droite.
Dans l'exemple donné en vb... elle est vers la gauche.
Un problème de signe en long!!!
Donc, suivant les explications de l'auteur de l'exemple,
kCRCpoly doit être modifié et inversé.
Je télécharge le code dès que possible.
Xav.
rotation ou décalage? en C le << est plutôt un décalage (sans réintroduire le bit (excusez du peu)).
pour faire de la rotation en C on fait un truc comme

(aux<<1)&((aux&0x8000!=0)?1:0); (pour du 32 bits).

enfin il me semble...
Xavier
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 684
Enregistré le : 10 mars 2006 15:48
Contact :

Re: [CPC] Fichier TZX pour CPC... où en est-on?

Message par Xavier »

Salut,

Oui, à bits perdus avec ">>" ou "<<".
Donc, il faut rajouter le bit en mlb ou mhb.(truc comme ça!)

donc value<<8 = value *256 !!!
??? il calcule son CRC sur l'octet "fort".

Bon...
TzxManager est en ligne : http://dskcenter/download/TzxManager.zip

Je peut aussi faire une DLL... mais :
1/ c'est pas marrant.
2/ je sais pas faire.
Deux bonnes raisons pour me creuser la tête.
;-)
Xavier
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 684
Enregistré le : 10 mars 2006 15:48
Contact :

Re: [CPC] Fichier TZX pour CPC... où en est-on?

Message par Xavier »

Salut,


La recherche dans le code de TzxManager est plutôt longue...

Alors voilà le code VB:

Code : Tout sélectionner

Public Function CRCP16(datas() As Byte) As Double

   Dim L As Long
   Dim ICRC As Double
   Dim Constpoly As Double
    

' Initialise. Integer maths used.
'=> X^16+ X^12+X^5+1
' Bit 16: Bit12+bit5+bit0
'
'4129=&h1021 = 1-0001000000100001
' (pour une rotation gauche 16 bits)
' on inverse...
'              1000010000001000=&h8408=33800
' (pour une rotation droite 16bits)

         Constpoly = 33800 ' Normalement OK
         

          ICRC = &HFFFF
         
	 ' On calcule le CRC pour le tableau [Datas]
	 ' Déjà défini lors de l'appel.
         ' Mise à jour de chaque octets dans [DATAs]

         For L = 0 To UBound(datas)
          CRCUpdate ICRC, datas(L), Constpoly
         Next

       Debug.Print "CRC16="; Hex(ICRC) ', "Const:"; Constpoly; Hex(ICRC Xor &HFFFF)
         CRCP16 = (ICRC)


End Function

Private Function CRCUpdate(CRC As Double, B As Byte, Constpoly As Double)

   Dim Bits As Byte
   Dim Aux As Double
  
   CRC = CRC Xor (CLng(B) * 256) ' Rotation de la nouvelle valeur sur 8bits-> &H**00
   
  
   For Bits = 0 To 7
      ' Vu que la rotation change...
      ' nous ne somme plus sur le test du dernier bit &h8000...
      ' mais du premier &h1
      If (Aux And 1) > 0 Then ' test LSB

               ' only xor with polynomial if lsb set.
               CRC = (rightShift(CRC) Xor Constpoly)
                Else
               ' LSB zero, just shift.
               CRC = rightShift(CRC)
      End If
   Next
Debug.Print CRC

End Function

Private Function rightShift(ByVal V) As Double
         rightShift = V And 65534 ' &hFFFE
         rightShift = rightShift \ 2
         rightShift = rightShift And 32767 ' &h7FFF
End Function

Private Function leftShift(ByVal V) As Double
'
' Non testé !
' ---------
'
         leftShift = V And 32767   ' &h7FFF
         leftShift = (leftShift * 2)
         leftShift = leftShift And 65534 ' &hFFFE
End Function
Répondre

Retourner vers « Amstrad »