- Ce sujet contient 21 réponses, 5 participants et a été mis à jour pour la dernière fois par stephbb75, le il y a 1 mois et 3 semaines.
-
CréateurSujet
-
10 mars 2024 à 22 h 59 min #177260stephbb75
- Level 10
- Messages : 1104
Salut,
Je tente de faire un peut de C pour Amiga mais sur mon PC (pour des raisons pratique pour moi !).
Mais j’arrive pas à grand choses
J’ai les dernière version de tout.Si je prend se code :
http://www.pjhutchison.org/tutorial/graphics.html
Qui ma fois est tout con (rien de très spécial) cela compile sans problème sur Amiga avec StormC mais pas sur le PC.
Il ne connais pas #include <stdlib.h> (un comble !)
Du coup la fonction rand() bas il ne la connais pas !si je retire l’include et la fonction il compile
mais il explose au link
undefined reference to `IntuitionBase’
undefined reference to `GfxBase’
undefined reference to `SysBase’et j’en passe !!!!
J’ai tester plusieurs petit programme (ouvrir un simple fenêtre !) et j’ai toujours des erreurs
Quelqu’un a réussit à compiler un autre truc que le code d’exemple ?
P.S.
J’ai tenté d’ajouter les définitions qu’il y a dans le code de démos …
// We need to declare the libraries as “externally_visible” since we are using the option -fwhole-program in the Makefile
__attribute__((externally_visible)) struct ExecBase *SysBase;
Pareil des erreurs…https://youtube.com/@stephbb75
-
CréateurSujet
-
AuteurRéponses
-
11 mars 2024 à 17 h 07 min #177297Jeeg
- Level 5
- Messages : 212
Salut,
L’extension BartmanAbyss pour vscode c’est fait pour faire de la démo ou des jeux en très bas niveau, il n’y a les les bibliothèques standards comme amiga.lib & co.
Il existe un fork fait par jyoberle qui devrait t’aller mieux pour ce que tu veux faire.
https://github.com/jyoberle/vscode-amiga-debugSinon tu as toujours la possibilité d’utiliser des compilateurs sur Amiga comme SAS-C
https://www.amigapassion.fr/abbaye/
11 mars 2024 à 18 h 05 min #177300slack- Level 7
- Messages : 459
@stephbb75,
Quelle configuration utilises-tu exactement ? Peux-tu publier un source C et les commandes exactes que tu lances ?
Pour compiler sur un PC, un source C destiné à l’amiga, il te faut un cros-compilateur. Quel(s) logiciel(s) utilises-tu ?
11 mars 2024 à 18 h 08 min #177301abzalon56- Level 4
- Messages : 115
S’il trouve pas stdlib, il te manque peut etre un include path dans la conf ?
Quand tu dis “sur PC” tu cross compile ou tu passes par un émulateur ?Bartman Abyss, la réponse est dans le titre :) Je connais pas mais ca m’intéresse , je vais jeter un coup d’oeil !
11 mars 2024 à 18 h 58 min #177304stephbb75- Level 10
- Messages : 1104
Salut @Jeeg,
Il existe un fork fait par jyoberle qui devrait t’aller mieux pour ce que tu veux faire.
Oui je l’ai testé, le problème c’est que je ne comprend rien a ce qu’il faut faire pour que WinUae (ou FS_UAE) fonctionne, il me dit toujours que les assign ne sont pas bon !
Le programme compilé fonctionne bien sur Amiga (ou émulateur) mais le but est aussi de pouvoir faire du debugSinon tu as toujours la possibilité d’utiliser des compilateurs sur Amiga comme SAS-C
Oui j’en fait aussi, mais pour des raisons pratique, j’ai le clavier du 2000 sur les genoux, c’est pas simple d’écrire longtemps du code comme cela
https://youtube.com/@stephbb75
11 mars 2024 à 19 h 03 min #177305stephbb75- Level 10
- Messages : 1104
Salut @slack
Quelle configuration utilises-tu exactement ?
C’est dans le titre
Visual Studio Code et l’extension BartmanAbyss.
J’ai testé avec l’extension de jyoberle (lien dans le message de Jeeg), voire ma réponsePeux-tu publier un source C
Il est dans le lien donnée dans mon 1er message, rien de spécial, ouverture d’un fenêtre et dessin de 10 carres.
Il compile très bien sur Amiga.il te faut un cros-compilateur. Quel(s) logiciel(s) utilises-tu ?
Oui, c’est GCC qui compile…
https://youtube.com/@stephbb75
11 mars 2024 à 21 h 55 min #177317stephbb75- Level 10
- Messages : 1104
Pour info :
Si vous utilisez le fork fait par jyoberle sur un A500 en 1.3, il faut ajouter sur la disquette de boot (1.3) un répertoire “Locale” car sa startup-sequence fait un assign dessus.
J’avance un peut
https://youtube.com/@stephbb75
12 mars 2024 à 19 h 54 min #177376Jeeg- Level 5
- Messages : 212
@stephbb75, effectivement, en plus de pointer vers un fichier rom kickstart, il faut aussi pointer vers un disque système de type floppy ou même un dossier qui est un HDF pour WinUae, c’est ce que je fais et cela fonctionne bien.
Bonne continuation.
https://www.amigapassion.fr/abbaye/
12 mars 2024 à 21 h 24 min #177385stephbb75- Level 10
- Messages : 1104
Salut @Jeeg,
Oui cela fonctionne, pareil pour le 3.1 il faut ajouter à la disquette de boot un rep Font et Locale pour que cela fonctionne.
Maintenant je compile de débug le programme d’exemple sans problème
Mais pas un autre code
Code qui compile sur Amiga avec SAS et StromC !!!!
Si qq’un arrive a compiler et exécuter ce programme :
/* Graphics Example 1 */
#include <proto/intuition.h>
#include <proto/gadtools.h>
#include <proto/graphics.h>
#include <proto/layers.h>
#include <proto/exec.h>
#include <proto/dos.h>
#include <intuition/intuition.h>
#include <stdlib.h>/* Random no between 0 and n */
int randomNum(int n) {
return (rand() % n);
}int main(void) {
struct Window *myWindow;
struct RastPort *rp;
int closewin = FALSE, num;
struct IntuiMessage *msg;
ULONG msgClass;
long startx,starty,width;myWindow = OpenWindowTags(NULL,
WA_Left, 20, WA_Top, 20,
WA_Width, 200, WA_Height, 150,
WA_IDCMP, IDCMP_CLOSEWINDOW | IDCMP_REFRESHWINDOW,
WA_Flags, WFLG_SIZEGADGET | WFLG_DRAGBAR | WFLG_DEPTHGADGET | WFLG_CLOSEGADGET | WFLG_ACTIVATE |
WFLG_SMART_REFRESH,
WA_Title, “My Window”,
WA_PubScreenName, “Workbench”,
TAG_DONE);
/* Get Window’s Rastport */
rp = myWindow->RPort;/* Draw some random colour boxes */
for(num=1; num<=10; num++) {
/* Set foreground colour */
SetAPen(rp, (ULONG)randomNum(32)+1);
startx = 10 + randomNum(50);
starty = 10 + randomNum(50);
width = 20 + randomNum(50);
/* Move to start position and draw 4 lines */
Move(rp, startx, starty);
Draw(rp, startx + width, starty + 0);
Draw(rp, startx + width, starty + width);
Draw(rp, startx + 0, starty + width);
Draw(rp, startx + 0, starty + 0);
}while (closewin == FALSE) {
Wait(1L << myWindow->UserPort->mp_SigBit);
msg = GT_GetIMsg(myWindow->UserPort);
msgClass = msg->Class;
GT_ReplyIMsg(msg);
if (msgClass == IDCMP_CLOSEWINDOW) {
CloseWindow(myWindow);
closewin = TRUE;
}
if (msgClass == IDCMP_REFRESHWINDOW)
RefreshWindowFrame(myWindow);
}return(0);
}moi j’y arrive pas, ente les include qu’il ne trouve pas, puis au link cela merde aussi !!!
https://youtube.com/@stephbb75
14 mars 2024 à 21 h 59 min #177459JOB- Level 0 - Newbie
- Messages : 5
Bonsoir @stephbb75,
Le code suivant compile et ouvre la jolie fenêtre (sous 3.1) :
/* Graphics Example 1 */
#include <proto/intuition.h>
#include <proto/gadtools.h>
#include <proto/graphics.h>
#include <proto/layers.h>
#include <proto/exec.h>
#include <proto/dos.h>
#include <intuition/intuition.h>
#include <stdlib.h>// We need to declare the libraries as “externally_visible” since we are using the option -fwhole-program in the Makefile
__attribute__((externally_visible)) struct ExecBase *SysBase;
__attribute__((externally_visible)) struct IntuitionBase *IntuitionBase = NULL;
__attribute__((externally_visible)) struct UtilityBase *UtilityBase = NULL;
__attribute__((externally_visible)) struct GfxBase *GfxBase = NULL;
__attribute__((externally_visible)) struct Library *GadToolsBase = NULL;/* Random no between 0 and n */
int randomNum(int n) {
return (rand() % n);
}int main(void) {
struct Window *myWindow;
struct RastPort *rp;
int closewin = FALSE, num;
struct IntuiMessage *msg;
ULONG msgClass;
long startx,starty,width;SysBase = *((struct ExecBase**)4UL);
IntuitionBase = (struct IntuitionBase *)OpenLibrary((CONST_STRPTR)”intuition.library”,0L);
UtilityBase = (struct UtilityBase *)OpenLibrary((CONST_STRPTR)”utility.library”,0L);
GfxBase = (struct GfxBase *)OpenLibrary(“graphics.library”,0L);
GadToolsBase = OpenLibrary(“gadtools.library”,0L);if(IntuitionBase && UtilityBase && GfxBase && GadToolsBase)
{
myWindow = OpenWindowTags(NULL,
WA_Left, 20, WA_Top, 20,
WA_Width, 200, WA_Height, 150,
WA_IDCMP, IDCMP_CLOSEWINDOW | IDCMP_REFRESHWINDOW,
WA_Flags, WFLG_SIZEGADGET | WFLG_DRAGBAR | WFLG_DEPTHGADGET | WFLG_CLOSEGADGET | WFLG_ACTIVATE |
WFLG_SMART_REFRESH,
WA_Title,”My Window”,
WA_PubScreenName, “Workbench”,
TAG_DONE);/* Get Window’s Rastport */
rp = myWindow->RPort;/* Draw some random colour boxes */
for(num=1; num<=10; num++) {
// Set foreground colour
SetAPen(rp, (ULONG)randomNum(32)+1);
startx = 10 + randomNum(50);
starty = 10 + randomNum(50);
width = 20 + randomNum(50);
/* Move to start position and draw 4 lines */
Move(rp, startx, starty);
Draw(rp, startx + width, starty + 0);
Draw(rp, startx + width, starty + width);
Draw(rp, startx + 0, starty + width);
Draw(rp, startx + 0, starty + 0);
}while (closewin == FALSE) {
Wait(1L << myWindow->UserPort->mp_SigBit);
msg = GT_GetIMsg(myWindow->UserPort);
msgClass = msg->Class;
GT_ReplyIMsg(msg);
if (msgClass == IDCMP_CLOSEWINDOW) {
CloseWindow(myWindow);
closewin = TRUE;
}
if (msgClass == IDCMP_REFRESHWINDOW)
RefreshWindowFrame(myWindow);
}
}if(IntuitionBase != NULL)
CloseLibrary((struct Library *)IntuitionBase);if(UtilityBase != NULL)
CloseLibrary((struct Library *)UtilityBase);if(GfxBase != NULL)
CloseLibrary((struct Library *)GfxBase);if(GadToolsBase != NULL)
CloseLibrary(GadToolsBase);return(0);
}__attribute__((used)) __attribute__((section(“.text.unlikely”))) void _start(int argc, char **argv)
{
main();
}Pour ceci (je préfère détailler pour être sûr que cela soit reproductible) :
- j’ai utilisé la dernière version de l’extension (https://marketplace.visualstudio.com/items?itemName=JOB.amiga-debug-job)
- j’ai ouvert un projet sur un répertoire vide puis après Ctrl+Shift+P, j’ai choisi la commande “Amiga: Init Project with Libs”
- pour l’Amiga 500, j’ai renseigné les chemins vers un kickstart et un workbench dans launch.json
- puis j’ai remplacé tout le code dans main.c par celui ci-dessus
Quelques remarques :
- Il n’y a pas de code de startup qui ouvre par exemple la dos.library (contrairement au comportement par défaut de SAS). Il faut donc ouvrir toutes les bibliothèques dont on a besoin “à la main”
- Le linker trouve la fonction “rand” dans la bibliothèque (statique) clib2. Toutes les fonctions accessibles de la clib2 sont décrites sur la page https://github.com/jyoberle/clib2. La fonction “rand” est très simple et il n’est pas nécessaire d’initialiser la clib2 avant d’appeler cette fonction
- Normalement, il faut en effet initialiser la clib2 avant d’appeler ses fonctions
Pour cette dernière raison, je conseille de partir du squelette de code qu’on obtient avec la commande “Amiga: Init Project with Libs” puis :
- de modifier OPTION_USE_CLIB2 pour le mettre à 1 (#define OPTION_USE_CLIB2 1)
- d’insérer son propre code en remplacement de l’appel à la fonction “MUIShowHide”
Cette approche assure aussi que MUI fonctionnera correctement. J’ai passé pas mal de temps à débugger ce dernier cas, car les versions récentes de gcc (contrairement à SAS par exemple) réalisent des optimisations assez poussées qui font que les fonctions variadiques de MUI comme “MUI_NewObject” voyaient leurs paramètres disparaître purement et simplement (gcc ne les voyait pas être utilisés et donc ne les passait pas dans la pile !). D’où ma redéfinition de certaines fonctions de MUI dans les fichiers main.c et misc.c.
Je travaille sur une version améliorée de la clib2 et il y aura donc aussi une nouvelle version de l’extension. Si les Amigaïstes du forum ont des idées d’amélioration ou des questions d’utilisation, qu’ils n’hésitent pas à revenir vers moi !
14 mars 2024 à 22 h 12 min #177460stephbb75- Level 10
- Messages : 1104
Salut @JOB
Merci, je vais tester et donnerais le résultat
Mais se seras que la semaine prochaine, je n’aurais pas d’ordi se WE
https://youtube.com/@stephbb75
18 mars 2024 à 17 h 02 min #177571stephbb75- Level 10
- Messages : 1104
Salut,
J’ai refait comme indiqué (pour 500 en 1.3, 500 3.1 et 1200 3.1).
(plusieurs fois…)Cela compile et exécute WinUae.
MAIS…
Il lui manque un librairie, la utility.library pour exécuter le a.exe !
(et je ne sais même pas ou la trouver, mais j’ai chercher moins de 5 minutes!)Je vais arrêter la pour le moment tout en suivant les futures versions
La je passe trop de temps a tenter de simplement compiler (bien que maintenant celui ci est ok) et exécuter (la fonctionne pas encore pour moi) un simple code.je pense qu’il faudrait fournir un DH0 bootable, même s’il faut au préalable lui copier quelques fichier système (bien que je ne suis pas sur, je ne connais pas suffisamment, qu’il serais possible de filer un boot qui fonctionne, les ROM ne son pas distribuables, mais une disquette bootable elle oui, donc un DD aussi je suppose)
En tout K cela semble pas mal pour faire un dev qui n’utilise pas le système (type demo) mais pour faire un programme qui utilise le système il faut encore trop bidouiller, autant le faire sur l’Amiga
https://youtube.com/@stephbb75
18 mars 2024 à 17 h 49 min #177576slack- Level 7
- Messages : 459
@stephbb75,
La bibliothèque utility.library est apparue avec le système 2.0.
Tu peux consulter http://amigadev.elowar.com/read/ADCD_2.1/Libraries_Manual_guide/node04A8.html
Est-ce que ton programme fonctionne sur la version 3.1 de l’OS ?
18 mars 2024 à 19 h 33 min #177582stephbb75- Level 10
- Messages : 1104
Salut,
Est-ce que ton programme fonctionne sur la version 3.1 de l’OS ?
non il me demande la même lib, qui n’est pas présente sur mes systèmes 1.3, 3.1 et 3.2 !
https://youtube.com/@stephbb75
18 mars 2024 à 21 h 19 min #177589slack- Level 7
- Messages : 459
@stephbb75,
Je n’ai pas d’amiga sous la main mais je pense que cette bibliothèque est en ROM, dans le kickstart. Je testerai sur mon 1200 en 3.0.
18 mars 2024 à 21 h 37 min #177591stephbb75- Level 10
- Messages : 1104
@slack,
Je ne sais pas, mais sur mon install 3.2 voici ce que j’ai en tentent d’exécuter le programme compilé avec VSC :
Pareil en 3.1, 3.9 et 3.2
https://youtube.com/@stephbb75
-
AuteurRéponses
- Vous devez être connecté pour répondre à ce sujet.