TurboC sur PC-XT et far pointers

Pour tout ce qui touche au PC d'IBM et ses nombreux descendants. Attention tout de même, au delà de quelques MHz la discussion devient vite hors sujet.

Modérateurs : Papy.G, fneck, Carl

Répondre
gotcha
Messages : 2758
Inscription : 30 mars 2017 11:39
Localisation : Isère
Contact :

TurboC sur PC-XT et far pointers

Message par gotcha »

Hello,

Je suis en train de faire un petit programme de dump mémoire. Mon but est très simple : dumper le code du BIOS (le contenu du segment F000) dans un fichier.

Après quelques expérimentations, je suis assez dubitatif avec la gestion de la segmentation avec le C.

Le C n'a pas été crée dans l'idée d'une mémoire segmentée, et donc TurboC l'a étendu C avec la notion de 'far pointers':

Code : Tout sélectionner

int far *ptr;
Le problème est que dans la doc de TurboC, la libraire standard C n'utilise pas les far pointers.
Quand j’appelle la fonction 'write' par exemple pour écrire dans un fichier, elle prends un 'void *', pas un 'void far *'.

Du coup, j'ai l'impression que je ne peux pas utiliser les fonctions standard pleinement et qu'il faut que je copie en premier les données 'far' dans le segment courant du programme.

Quelqu'un a un avis sur la question ?
Amstrad CPC et Goupil power :mrgreen:
Bénévole à l'association pour un conservatoire de l’informatique et de la télématique (https://www.aconit.org)
Avatar de l’utilisateur
hlide
Messages : 3469
Inscription : 29 nov. 2017 10:23

Re: TurboC sur PC-XT et far pointers

Message par hlide »

Tu utilises quel "model" de compilation ? il y en a 6 : Tiny, Small, Medium, Compact, Large, Huge.
A priori, tu aurais besoin a minima du modèle COMPACT pour avoir les pointeurs de DATA en FAR par défaut. J'aurais pensé que les libs sont par modèle, d'où ma question.

EDIT :

Code : Tout sélectionner

void myputs (s)
    char *s;
{
    int i;
    for (i=O; s [i] != 0; i++) putc(s[i]);
}

main ()
{
    char near *mystr;
    mystr = "Hello, world\n";
    myputs(mystr);
}
But what if you recompile this program using the compact (or large or huge) memory model? The pointer mystr in main is still near (it's still a 16-bit pointer). However, the pointer s in myputs is now far, since that's the default.
Malheureusement, ça ne nous dit pas si "putc" en Compact accepte bien un FAR pointer qui est normalement par défaut pour Compact.
Dernière modification par hlide le 16 avr. 2021 18:10, modifié 3 fois.
Avatar de l’utilisateur
gilles
Messages : 2779
Inscription : 07 août 2008 13:44
Localisation : Nantes
Contact :

Re: TurboC sur PC-XT et far pointers

Message par gilles »

Dans mon souvenir la lib s’adaptait au modèle mémoire courant (small, large) mais ca remonte trop loin. Je dois avoir des exemples par contre (premiere version emu mo5 en turboC puis en pacificC avant de passer à djgpp)
gotcha
Messages : 2758
Inscription : 30 mars 2017 11:39
Localisation : Isère
Contact :

Re: TurboC sur PC-XT et far pointers

Message par gotcha »

Pour l'instant, j'ai utilisé la compilation par défaut. Je vais regarder la doc pour voir s'il y a en une option de modèle mémoire à donner au compilateur.
Dans mon cas, forcer tous les pointeurs à être 'far' serait l'idéal, si bien sur la librairie standard C suit ce modèle.

Pour info, j'utilise TurboC 2.01.
Amstrad CPC et Goupil power :mrgreen:
Bénévole à l'association pour un conservatoire de l’informatique et de la télématique (https://www.aconit.org)
Avatar de l’utilisateur
hlide
Messages : 3469
Inscription : 29 nov. 2017 10:23

Re: TurboC sur PC-XT et far pointers

Message par hlide »

How do you avoid this problem? The solution is to define myputs in
modern C style, like this:

Code : Tout sélectionner

void myputs(char *s);
{
    /*body of myputs*/
}
Now when Turbo C compiles your program, it knows that myputs expects
a pointer to char; and since you're compiling under the large model, it
knows that the pointer must be far. Because of that, Turbo C will push the
data segment (DS) register onto the stack along with the 16-bit value of
mystr, forming a far pointer.
Donc ça accrédite bien que la lib est adaptée au modèle de compilation (donc Compact à minima).
gotcha
Messages : 2758
Inscription : 30 mars 2017 11:39
Localisation : Isère
Contact :

Re: TurboC sur PC-XT et far pointers

Message par gotcha »

Super, merci ! J'essaie de compiler en 'large' ce soir.
Amstrad CPC et Goupil power :mrgreen:
Bénévole à l'association pour un conservatoire de l’informatique et de la télématique (https://www.aconit.org)
gotcha
Messages : 2758
Inscription : 30 mars 2017 11:39
Localisation : Isère
Contact :

Re: TurboC sur PC-XT et far pointers

Message par gotcha »

Bon, j'ai compilé mon programme en mode 'large' et je n'ai plus les warnings de conversion douteuse entre un far pointer et le paramètre de la fonction write().

J'ai regardé le contenu de mon dump du segment F000 et contrairement à la dernière fois où j'avais des données liées TurboC (le segment courant j'imagine), j'ai quelque chose qui ressemble BIOS. En particulier, j'ai pu retrouver la string "there is no help" que j'ai 'subi' dans le moniteur du G4 :) .

Donc la libraire standard C s'adapte bien au mode mémoire que l'on choisit pour la compilation.

Merci pour vos lumières :)
Amstrad CPC et Goupil power :mrgreen:
Bénévole à l'association pour un conservatoire de l’informatique et de la télématique (https://www.aconit.org)
Fool-DupleX
Messages : 2284
Inscription : 06 avr. 2009 12:07

Re: TurboC sur PC-XT et far pointers

Message par Fool-DupleX »

Dans Turbo-C, il y a plusieurs versions de la libc et un pragma qui permet la sélection automatique de la bonne version en fonction du modèle passé en paramètre au compilateur. Donc si tu n'es pas dans le bon modèle, c'est normal d'avoir des warnings et normal que l'adressage en mémoire soit incorrect.

Tu aurais aussi pu utiliser debug pour dumper le bios, ca prend deux lignes.
gotcha
Messages : 2758
Inscription : 30 mars 2017 11:39
Localisation : Isère
Contact :

Re: TurboC sur PC-XT et far pointers

Message par gotcha »

L'utilitaire Debug est quelque peu cryptique pour moi, mais je vais y jeter un œil quand même car ça a l'air d’être l'outil de base sous DOS.
Amstrad CPC et Goupil power :mrgreen:
Bénévole à l'association pour un conservatoire de l’informatique et de la télématique (https://www.aconit.org)
Répondre