forum

Navigation du forum
Vous devez vous identifier pour créer des messages et des sujets.

Nouveau projet : Gestion de sprites CPC+ sur CPC+

PrécédentPage 3 of 3

En TP3, ca ne marche pas comme çà. En tout cas c'est pas comme ça que je  fais.  Ton pointeur doit faire référence à une structure de données. 

En général il y deux cas :

1er cas : structure de données de taille fixe

Program Truc;

Type Pchar = String[80]; { par exemple }

Var VPrt : ^PChar;

Begin

 New (VPrt); { Crée le pointeur et réserve la mémoire }

ReadLn(VPrt^); WriteLn(VPrt^)

Dipose( VPrt); { Supprime le pointeur (cad libere la mémoire }

End;

Le type peut être n'importe quoi, des 'records' des tableaux en tout genre ou une autre zone pointeur

2ieme cas : Structure de donnée de taille non fixe (ou plutot  connu seulement à l'exécution du programme).

Plusieurs façons de faire, je fais comme ca par exemple pour une zone qui pourrait être un bloc graphique ou n'importe quoi d'autre  :

Program Truc;

Type PByte = Array[1..MaxInt] Of Byte; { ou char ou real ou etc. }
Var v: ^PByte; { v pointe vers un tableau d'octets quelconques de taille non définie }
i,n : Integer;

Begin

Write('Combien d''octets a reserver en RAM?'); ReadLn(n);
GetMem(v,n); { Reserve n octets pour la variable v, attention c'est au programmeur de gérer les dépassements }
WriteLn( 'Generation et stockage de ',n,'nombres aleatoires');
For i:=1 To n Do v^[i]:=Random(255);
WriteLN('OK, nombres générés => ');
For i:=1 To n Do Write(v^[i],'-');
FreeMem(v,n); { libere la mémoire et fait pointer le pointeur v vers NIL (0) }
End

Après un pointeur est juste un integer ( il n'a pas de Word en TP3, mais les INTEGER font l'affaire). On peut faire par exemple : Nouveau_pointeur:=Ancien_Pointer ou des tableaux de pointeurs ou des pointeurs de pointeurs... 

 

 

OK OK, je n'ai pas trop l'habitude de TP3... habituellement je code en TP7 objet.

Les pointeurs je les utilise tout le temps, mais avec la syntaxe de TP7 😉 avec allocation dynamique de mémoire sur le tas (Getmem et Freemem bien sûr, mais surtout NEW et DISPOSE, qui permettent d'initialiser un Object et de la détruire dynamiquement sur le tas).

Et j'ai déjà pointé sur des procédures et fonctions 😉  TP7 permettant de créer une variable de type Pointer (inexistant dans TP3 apparemment...) que j'alloue dynamiquement.

A priori, en TP3, pas possible de pointer sur une procédure... Dommage...

Peut-être une autre idée : charger au préalable le code produit par TP3 en mémoire avec un truc du style Load "prog",adresse, puis lancer ton code assemblé ?

Salut Laurent.

J'ai fait beaucoup de TP7 à une époque lointaine mais beaucoup oublié ;D  Dans les limitations du TP3 : pas d'objets (la programmation objet apparait avec la v5.xxx), pas de passage natif de procédures ou de  fonctions en paramêtre, ce qui peut être dommage.

Sur les pointeurs, Rien n'empêche en TP3 de créer un type pointeur générique. exemple ;

Type

  TByte : Array[1..maxint]; 
  Pointer : ^TByte

Var V : Pointer;

Récupérer l'adresse mémoire d'une procédure ou fonction est facile avec la commande  Addr. Tu peux donc bien 'pointer' vers une procédure.Le problème c'est comment on appelle ensuite   ladite procedure ou fonction avec le passage des paramêtres. C'est probablement possible avec une séquence INLINE mais je n'ai pas trouvé. Ca m'intéresserait beaucoup pour gérer les interuptions (TP3 peut gérer les interuptions d'après la doc mais les explications de la doc sont confuses)

Tu peux aussi déclarer des procedure ou des function a des adresses absolues (par exemple pour du code ASM non relogeable), c'est expliqué dans la doc ainsi que comment passer les paramètres dans les 2 sens et les précautions pour gérér la pile. (on peut même appeler des routines en C ou autre...). 

Peut-être une autre idée : charger au préalable le code produit par TP3 en mémoire avec un truc du style Load "prog",adresse, puis lancer ton code assemblé ?

Je ne suis pas sur de bien comprendre. En tout cas tu peux choisir en TP3 l'adresse de debut et de fin de compilation de ton code Pascal, ca te permet par exemple de réserver de la place pour du code machine auquel tu accederas avec des procedure définies en EXTERNAL et une adresse fixe (un  genre de CALL en fait)

Tout ca est décrit vers les pages 150 du manuel

Par contre attention : le code généré par TP3 n'est pas relogeable dynamiquement. Tu peux le compiler pour qu'il soit à telle adresse mais si tu veux le déplacer il faut le recompiler.

 

 

 

Ah oui effectivement. Il faut le compiler de manière absolue. C'est surement la solution...

Le type Pointer de ton exemple est un type créé, OK. D'ailleurs ça revient au même que d'avoir un type Pointer prédéfini. On pointe simplement sur une variable. Si celle-ci est du bon type capable de contenir une adresse mémoire, on obtient un pointeur vers la mémoire où elle se trouve. Effectivement 🙂 Malin 😉 

Reste en effet à gérer le passage de paramètres... Peut-être au préalable enregistrer les paramètres de manière absolue en mémoire, puis récupérer l'"absoluté" dans la procédure Pascal ? Puis le contraire ? Mais il faut que les paramètres aient une longueur fixe.

Il faut vraiment que je me penche sur TP3.

En tout cas, ton travail est impressionnant et passionnant 🙂

 

Merci... La j'ai commencé à dessiner quelques sprites pour un petit jeu ;D "La Malédiction de Ramstad CaPaC" lol.  
Site tres sympa pour les sprites 8x8 ou 16x16 (ou plus) : https://itch.io/game-assets/tag-16x16

Ci -joint la version 1.02 de TPSPRITE qui accèlere grandement les accès disque. 

Vais ajouter une commande pour exporter des "bloc images" pour les décors (des genres de tuiles). 

Fichiers téléversés :
phenix a réagi à ce message.
phenix

La malédiction de Ramstad CaPaC 🙂 

LOL trop fort 🙂

Merci pour le lien et pour le partage 😉

 

PrécédentPage 3 of 3