Forum
Hello
en fait la commande INLINE est l'ancêtre de ASM. Mais avec INLINE tu dois taper les codes hexa alors que ASM est un assembleur intégré. J'ai fait un petit programme qui génére automatique le code INLINE dans un source Pascal à partir de l'assembleur de WINAPE. La limitation (masi c'est pareil avec ASM je suppose est que le code doit être relogeable.
Finalement je n'ai pas trop programmé cette semaine de congés et j'ai plus profité du soleil (froid mais quand même)...J'ai fini quand même la version 1.02 de TPSRPRITE. Là je me lance dans un petit jeu d'actions pour utiliser tout çà ;D En fait ce que j'aimerai est pouvoir appeler une procédure pascal (sans paramêtres) depuis du code assembleur mais je n'yarrive pas. Ca mettrait l'équivalent des AFTER, EVERY, ON SQ du Basic
doublon à supprimer
Super, ton utilitaire pour encoder en INLINE ton code assembleur winape 🙂 ouahhh 🙂 ça doit être pratique
Tu as essayé de créer un pointeur sur ta procédure pascal ?
Genre ça, qui marche en Borland Pascal :
Program test_ptr_proc;
Var Ptr_proc:pointer;
Procedure ma_proc; Far;
begin
end;
Begin
Ptr_proc:=@ma_proc;
end.
Pour compléter l'idée, l'idée est d'enregistrer ce PRT (Ptr_proc) dans une mémoire fixe, genre #EFFF, pour pouvoir ensuite appeler la procédure Pascal depuis l'assembleur en récupérant cette adresse et en JUMPant dessus.
La question est de savoir s'il faut d'abord sauvegarder les registres comme en appel de procédure ASM pascal (PUSHer les registres, puis les POPer après le RET.)
Franchement je sais même pas si ça peut marcher.........,c'est juste une idée 😉
Je ne sais même pas si ça existe de pouvoir pointer vers une procédure avec @ dans la version pascal que tu utilises sur le Z80.
En pascal Borland (16 bit) ça marche 😉
J'ai chargé Turbo Pascal sur 6128.
Un truc très simple : déclarer une variable de type pointeur :
Program Truc;
Var Vptr : Pointer;
Begin End.
Erreur de compilation... le type Pointer n'existe pas en Turbo Pascal version 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^:=Random(255);WriteLN('OK, nombres générés => ');For i:=1 To n Do Write(v^,'-');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).
La malédiction de Ramstad CaPaC 🙂
LOL trop fort 🙂
Merci pour le lien et pour le partage 😉