forum
Nouveau projet : Gestion de sprites CPC+ sur CPC+
Citation de Gilles59 le 17 avril 2021, 1 h 01 minEn 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...
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...
Citation de Laurent11 le 17 avril 2021, 2 h 38 minOK 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é ?
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é ?
Citation de Gilles59 le 17 avril 2021, 10 h 46 minSalut 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 : ^TByteVar 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.
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.
Citation de Laurent11 le 17 avril 2021, 11 h 18 minAh 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 🙂
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 🙂
Citation de Gilles59 le 17 avril 2021, 11 h 32 minMerci... 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-16x16Ci -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).
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 :Citation de Laurent11 le 17 avril 2021, 11 h 44 minLa malédiction de Ramstad CaPaC 🙂
LOL trop fort 🙂
Merci pour le lien et pour le partage 😉
La malédiction de Ramstad CaPaC 🙂
LOL trop fort 🙂
Merci pour le lien et pour le partage 😉