Je cherche un module C++ qui pourrait faire la conversion FP 5 bytes (Spectrum/ZX81) vers des valeurs DOUBLE.
J'ai trouvé ça, mais j'avoue ne pas tout comprendre.
Comme je ne suis pas très Matheux, je suis dans l'impasse, même si le projet fonctionne...
C'est pour finir un projet 'tap/tzx' vers texte qui n'attend que cette routine....
Mon code (honteusement chouré à David Gonzales), qui me donne des résultats erronés:
Code : Tout sélectionner
double FloatToDec(unsigned char *ZxFP)
{
/// Code from David Gonzales
// input is the 5 bytes that comprise the floating point number
unsigned char x[6];
double DecNumber = 0;
int f,t;
unsigned char Xdigits;
int ZxDigits;
bool ZxSign;
// printf("%d %d %d %d %d",ZxFP[0],ZxFP[1],ZxFP[2],ZxFP[3],ZxFP[4]);
if(memcmp(ZxFP,"\000\000\000\000\000",5) == 0)
{
return 0;
}
//'get sign from second byte
ZxSign = ZxFP[1] & 128;
//'Adjust second byte after getting sign
ZxFP[1] = ZxFP[1] | 128;
//drop trailing BYTES that equal 0
//'result in x$
for( f = 4; f >= 1; f--)
{
if(ZxFP[f] != 0) break;
}
int len_x = f;
memcpy(x,ZxFP+1, len_x);
//x[len_x]=0;
//'get # of binary digits needed from first byte
ZxDigits = ZxFP[0] - 128;
// drop trailing BITS that equal 0
unsigned char bb = x[len_x - 1];
for(f = 6; f >= 1 ; f--)
{
if(bb & 1) break;
bb = bb >> 1;
}
DecNumber = bb;
//f now contains the number of significant bits
//'get # of binary digits in base number
Xdigits = ((unsigned char)len_x - 1) * 8 + (unsigned char)f;
//'convert string to base number
t = 0; // 'counter for powers of figure (256)
double figure = pow((double)2, f);
for(f = len_x - 1; f >= 1; f--)
{
DecNumber = DecNumber + (x[f-1] * figure * pow((double)256,t));
t = t + 1;
}
//'based on exponent, modify number to correct number
//'of digits
DecNumber = DecNumber * pow((double)2,ZxDigits - Xdigits);
printf("bb(%d) :\r\n",DecNumber);
if (ZxSign) DecNumber = -DecNumber;
return DecNumber;
}
- support TZX/TAP.
- extraction du code en mode texte pour le basic, listings pour l'assembleur et traitement des arrays (char et num )
Le code des FP sert à extraire les valeurs 5bytes des tableaux numériques.
Infos: https://www.sinclairzxworld.com/viewtop ... f=6&t=1422