Derniers sujets
» L'immonde Docteur Kokus
Mar 17 Oct 2017 - 18:46 par Dom50

» Rencontre avec Emmanuel Viau (ERE informatique)
Mar 17 Oct 2017 - 18:17 par Dom50

» Organisation RAM vidéo
Mar 17 Oct 2017 - 14:26 par Davros

» OVERLAYS : est-ce accessible avec LCC65
Lun 16 Oct 2017 - 14:47 par Jede

» Holdies
Dim 15 Oct 2017 - 21:09 par Dbug

» Infocarte ORIC
Dim 15 Oct 2017 - 13:26 par fred72

» Alchimie DOUZE
Dim 15 Oct 2017 - 8:46 par kenneth

» maxiNoob apprend le C
Ven 13 Oct 2017 - 22:55 par Dbug

» page zéro ?
Ven 13 Oct 2017 - 22:36 par Dbug

» Orix : Thread de notification sur le développement
Jeu 12 Oct 2017 - 22:25 par Jede

Qui est en ligne ?
Il y a en tout 1 utilisateur en ligne :: 0 Enregistré, 0 Invisible et 1 Invité

Aucun

Le record du nombre d'utilisateurs en ligne est de 29 le Mer 25 Fév 2015 - 14:01
Connexion

Récupérer mon mot de passe

Statistiques
Nous avons 123 membres enregistrés
L'utilisateur enregistré le plus récent est james64

Nos membres ont posté un total de 5719 messages dans 417 sujets
Portail ORIC




cc65 et Inline assembler

Poster un nouveau sujet   Répondre au sujet

Voir le sujet précédent Voir le sujet suivant Aller en bas

cc65 et Inline assembler

Message  goyo le Sam 10 Déc 2016 - 19:49

Hello,
Je test le compilateur frasm avec de l'assembleur dans le code C.
j'aimerais coder mon petit jeux en c avec des petites routines en assembleur, ainsi que des datas graphiques intégrées au code .... !

et la doc cc65.org est apparemment trop brève à ce sujet :o

Si quelqu'un a déjà fait du inline asm, ça m'aiderai de savoir comment il a codé cela...


Code:

main()
{
      
          
   asm("  LDX $D1      ");  // Load register X
   asm("  _label4:     ");
   asm("  LDY $CF      ");
   asm("  DEY          ");
   asm("  _label1:     ");
   asm("  LDA ($CD),Y  ");
   asm("  STA ($CB),Y  ");
   asm("  DEY          ");
   asm("  CPY #$FF     ");
   asm("  BNE _label1  ");  // $F7
   asm("  CLC          ");
   asm("  LDA $CB      ");
   asm("  ADC $D0      ");
   asm("  STA $CB      ");
   asm("  BCC _label2  ");  //  $02
   asm("  INC $CC      ");
   asm("  _label2:     ");
   asm("  CLC          ");
   asm("  LDA $CD      ");
   asm("  ADC $CF      ");
   asm("  STA $CD      ");
   asm("  BCC _label3  ");  //  $02
   asm("  INC $CE      ");
   asm("  _label3:     ");
   asm("  DEX          ");
   asm("  BNE _label4  ");  // $DB
   asm("  RTS          ");
        
}
;

j'ai des erreurs sur les labels "_label4:"

Code:
0x6b9                  _main
06b9 a6 d1  LDX $D1      
 _label4:    
ERROR - invalid opcode
ERROR - parse error at/before character ":"
06bb a4 cf  LDY $CF      
06bd 88  DEY          
 _label1:    
ERROR - invalid opcode
ERROR - parse error at/before character ":"
06be b1 cd  LDA ($CD),Y  
06c0 91 cb  STA ($CB),Y  
06c2 88  DEY          
06c3 c0 ff  CPY #$FF    
 BNE _label1  


D:\LCC65\bin\frasm.exe -o 6502.out -l errors.txt C:\WINDOWS\TEMP\vag4889.o
 ERROR SUMMARY - ERRORS DETECTED 16
               -  WARNINGS       0
Impossible de trouver D:\LCC65\Euphoric\PRG_C\test1.tap

HELP !!!   pale
avatar
goyo

Messages : 79
Date d'inscription : 02/05/2014
Age : 46
Localisation : Massy

Revenir en haut Aller en bas

Re: cc65 et Inline assembler

Message  assinie le Dim 11 Déc 2016 - 13:11

Bonjour,

Tu utilises cc65 ou lcc65?
cc65 utilise ca65 comme assembleur.
avatar
assinie

Messages : 171
Date d'inscription : 09/02/2014

Revenir en haut Aller en bas

Re: cc65 et Inline assembler

Message  goyo le Lun 12 Déc 2016 - 12:15

J'utilise le cc65. Mais je viens de voirque ce serait mieux avec lcc65, j'ai effectivement vu la page suivante :

http://miniserve.defence-force.org/svn/public/pc/tools/osdk/main/Osdk/_final_/sample/mixed/hello_world_mixed/

apparemment on passe les parametres par la pile .
avatar
goyo

Messages : 79
Date d'inscription : 02/05/2014
Age : 46
Localisation : Massy

Revenir en haut Aller en bas

Re: cc65 et Inline assembler

Message  assinie le Lun 12 Déc 2016 - 21:17

J'ai testé la compilation de ton exemple avec cc65 + ca65 et le seul "problème" que j'ai rencontré provient des espaces après les noms des labels.
A priori cc65 est un peu chatouilleux sur les espaces "non significatifs" en fin de ligne et lorsqu'il génère le code assembleur il supprime tous les labels qui, selon lui, ne sont pas utilisés.
Du coup, il supprime la déclaration des labels et forcémént au moment de l'assemblage, ca65 ne les trouve pas et remonte des erreurs.
En supprimant les espaces inutiles, ça passe sans problème.

Mais à priori, dans ton cas je pense que c'est une incompatibilité de syntaxe entre le code généré par cc65 et frasm que tu utilises pour l'assemblage.

Dans tous les cas, je pense qu'il vaut mieux faire une librairie en assembleur avec tes procédures et ensuite le programme en C pour les appeler.
C'est plus facile à maintenir que de tout mélanger dans le source C.
Ensuite, il suffit d'indiquer les librairies perso au linker.

Tu peux regarder les sources des librairies standards fournies avec cc65 ou lcc65 suivant le cas pour voir comment on passe les paramètres et les valeurs de retour.
avatar
assinie

Messages : 171
Date d'inscription : 09/02/2014

Revenir en haut Aller en bas

Re: cc65 et Inline assembler

Message  didierv le Lun 12 Déc 2016 - 22:25

Dans mes tablettes (de chocolat), j'ai a tester le passage de parametres entre CC65 et CA65. Normalement, cela est réalisé comme OSDK par la pile.

_________________
DidierV - CEO Mag
alias coco.oric sur Defence-Force
avatar
didierv

Messages : 489
Date d'inscription : 19/01/2014
Age : 54
Localisation : Nord de la France

http://www.dmacoco.fr

Revenir en haut Aller en bas

Re: cc65 et Inline assembler

Message  assinie le Mar 13 Déc 2016 - 0:00

cc65 utilise sa propre pile pour le passage de paramètres, il y a plusieurs fonctions disponibles pour les ajouter ou les récupérer via les registres A et X du 6502.
avatar
assinie

Messages : 171
Date d'inscription : 09/02/2014

Revenir en haut Aller en bas

Re: cc65 et Inline assembler

Message  goyo le Mer 14 Déc 2016 - 14:07

assinie a écrit:J'ai testé la compilation de ton exemple avec cc65 + ca65 et le seul "problème" que j'ai rencontré provient des espaces après les noms des labels.
A priori cc65 est un peu chatouilleux sur les espaces "non significatifs" en fin de ligne et lorsqu'il génère le code assembleur il supprime tous les labels qui, selon lui, ne sont pas utilisés.
Du coup, il supprime la déclaration des labels et forcémént au moment de l'assemblage, ca65 ne les trouve pas et remonte des erreurs.
En supprimant les espaces inutiles, ça passe sans problème.

Mais à priori, dans ton cas je pense que c'est une incompatibilité de syntaxe entre le code généré par cc65 et frasm que tu utilises pour l'assemblage.

Dans tous les cas, je pense qu'il vaut mieux faire une librairie en assembleur avec tes procédures et ensuite le programme en C pour les appeler.
C'est plus facile à maintenir que de tout mélanger dans le source C.
Ensuite, il suffit d'indiquer les librairies perso au linker.

Tu peux regarder les sources des librairies standards fournies avec cc65 ou lcc65 suivant le cas pour voir comment on passe les paramètres et les valeurs de retour.

Merci pour ces éclaircissements, aurais-tu un exemple simple en c d'utilisation d'une librairie en asm (sur une page web ou perso) à me communiquer =)
avatar
goyo

Messages : 79
Date d'inscription : 02/05/2014
Age : 46
Localisation : Massy

Revenir en haut Aller en bas

Re: cc65 et Inline assembler

Message  assinie le Jeu 15 Déc 2016 - 1:08

J'ai trouvé une page avec un exemple simple ici (en anglais)

En résumé, si ta fonction assembleur prend un paramètre a de type char et renvoie une valeur de type unsigned int,il faut déclarer ta fonction assembleur dans le code C
Code:
extern int __fastcall__ testasm(unsigned char a);

Le __fastcall__ permet d'avoir le dernier paramètre directement dans les registres A (poids faible) et X (poids fort).
Sans le __fastcall__, il faut faire un jsr popa ou jsr popax suivant la taille du paramètre.
Si il y a pllusieurs paramètres, ils sont rangés dans l'ordre inverse sur la pile C (ie: l'avant dernier sera le premier récupéré par un jsr popa ou jsr popax).

Le label de la fonction dans le code assembleur doit commencer par un _ pour être reconnu.
Pour la valeur de retour, il suffit de la mettre dans les registres A et X (X doit être mis à 0 dans le cas ou tu renvoies une valeur de type char)

Pour l'exemple ci-dessus, le code assembleur ressemblerait à:
Code:

;
; testasm.s
; Ajoute 1 au paramètre passé
;

_testasm:
    ldx #$00   ; Poids fort de la valeur de retour
    clc
    adc #01    ; Ajoute 1 au paramètre passé
    bne suite
    inx
suite:
    rts

et pour la partie en C:
Code:

#include <stdio.h>
extern int __fastcall__ testasm(unsigned char a);

void main(void)
{
    unsigned char a=2;
    printf("%u\n", testasm(a);
}

Si tu mets plusieurs fonctions dans le fichier assembleur, il devrait ressembler à quelque chose comme ça:
Code:

;
; Déclare les fonctions exportées (ie: utilisable par le programme C)
;
    .export _fonctionA, _fonctionB

.code

.proc _fonctionA
    ;
    ; Code assembleur de la fonction A
    ;
.endproc

.proc _fonctionB
    ;
    ; Code assembleur de la fonction B
    ;
.endproc

fonctionC:
    ;
    ; Code assembleur
    ; cette fonction ne peut pas être appelée depuis le C
    ;

Je te conseille de regarder le source des librairies standard de cc65 sur github ou de regarder le code assembleur généré par cc65.
avatar
assinie

Messages : 171
Date d'inscription : 09/02/2014

Revenir en haut Aller en bas

Re: cc65 et Inline assembler

Message  goyo le Jeu 15 Déc 2016 - 7:15

C'est super, j'ai toutes les réponses à mes questions !

ma prochaine étape : paramétrer visual studio 2013 pour lcc65 Wink

merci assinie de ton aide précieuse, merci à tous Smile
avatar
goyo

Messages : 79
Date d'inscription : 02/05/2014
Age : 46
Localisation : Massy

Revenir en haut Aller en bas

Re: cc65 et Inline assembler

Message  didierv le Mar 20 Déc 2016 - 4:42

Assinie a été le plus rapide ...
Ci dessous un lien vers la doc de CC65 qui résume le fonctionnement
https://cc65.github.io/doc/cc65-intern.html#ss1.1

_________________
DidierV - CEO Mag
alias coco.oric sur Defence-Force
avatar
didierv

Messages : 489
Date d'inscription : 19/01/2014
Age : 54
Localisation : Nord de la France

http://www.dmacoco.fr

Revenir en haut Aller en bas

Re: cc65 et Inline assembler

Message  didierv le Ven 23 Déc 2016 - 8:27

Envoyé à Grégoire une integration de CC65 dans VS pour Apple 2.
Joyeux Noel à tous

_________________
DidierV - CEO Mag
alias coco.oric sur Defence-Force
avatar
didierv

Messages : 489
Date d'inscription : 19/01/2014
Age : 54
Localisation : Nord de la France

http://www.dmacoco.fr

Revenir en haut Aller en bas

Re: cc65 et Inline assembler

Message  goyo le Lun 16 Jan 2017 - 11:29

Je me permet de continuer sur le sujet :

Je suis sous lcc65, et je souhaite passer ma variable ecran dans le code ASM() , enfin si c'est possible .
Code:

 unsigned int ecran = 0xA000;
 /* ..... */
 asm("clc");
 asm("ldy 10");
 asm("suite1:");
 asm("ldx #$FF");
 asm("suite:");
 asm("lda #65");
 asm("sta (ecran),x);  /* <----- ici comment passer ma variable ecran ? */
 asm("dex");
 asm("bne suite");
 asm("dey");
    asm("bne suite1");
 asm("rts");

De plus comment accéder au low et au high byte de la variable ecran dans en code ASM() ?


Enfin question pour les experts ;-)
Puis je passer à asm() des variables de type pointeur ?
avatar
goyo

Messages : 79
Date d'inscription : 02/05/2014
Age : 46
Localisation : Massy

Revenir en haut Aller en bas

Re: cc65 et Inline assembler

Message  assinie le Lun 16 Jan 2017 - 19:10

Je ne sais pas si la syntaxe de lcc65 est similaire à celle de cc65 mais au cas où...

asm() ou __asm__ () de cc65 fonctionnent sur le même principe que la fonction printf(), à savoir que le premier paramètre est en fait une chaine de format et les suivant les paramètres de ce format.

Exemple:
Code:
asm("sta (%v),y", globalEcran);
génère le code assembleur:
Code:
sta (_globalEcran),y

et
Code:
asm("sta %v,x", globalEcran);
génère le code assembleur
Code:
sta _globalEcran,x

La page expliquant le format pour cc65 est ici


Pour récupérer le poids fort ou le poids faible dans un lda par exemple, il faut utiliser la syntaxe:
Code:
lda #>valeur
lda #<valeur

Si tu utilises lcc65 avec frasm, il me semble que la syntaxe est:
Code:
lda #HIGH(valeur)
lda #LOW(valeur)

Remarque: sta (ptr),x est incorrect.
avatar
assinie

Messages : 171
Date d'inscription : 09/02/2014

Revenir en haut Aller en bas

Re: cc65 et Inline assembler

Message  goyo le Lun 16 Jan 2017 - 19:51

Merci Assinie de tes explicatons  Smile

En fait il fait toujours une erreur, il n'aime pas cette expression
Code:
asm("sta (%v),x", ecran);
J'ai essayé plusieurs façons de le formuler sans trouver..

le Lcc65 est peut être plus limité que le CC65

Je vais peut etre devoir me mettre au CC65...

assinie a écrit:Je ne sais pas si la syntaxe de lcc65 est similaire à celle de cc65 mais au cas où...

asm() ou __asm__ () de cc65 fonctionnent sur le même principe que la fonction printf(), à savoir que le premier paramètre est en fait une chaine de format et les suivant les paramètres de ce format.

Exemple:
Code:
asm("sta (%v),y", globalEcran);
génère le code assembleur:
Code:
sta (_globalEcran),y

et
Code:
asm("sta %v,x", globalEcran);
génère le code assembleur
Code:
sta _globalEcran,x

La page expliquant le format pour cc65 est ici


Pour récupérer le poids fort ou le poids faible dans un lda par exemple, il faut utiliser la syntaxe:
Code:
lda #>valeur
lda #<valeur

Si tu utilises lcc65 avec frasm, il me semble que la syntaxe est:
Code:
lda #HIGH(valeur)
lda #LOW(valeur)

Remarque: sta (ptr),x est incorrect.
avatar
goyo

Messages : 79
Date d'inscription : 02/05/2014
Age : 46
Localisation : Massy

Revenir en haut Aller en bas

Re: cc65 et Inline assembler

Message  assinie le Lun 16 Jan 2017 - 20:09

Quelle erreur as-tu?

Comme indiqué en remarque dans mon post précédent, l'instruction sta (ecran),x est illégale.
En indirect c'est soit sta (ecran),y soit sta (ecran,x)
avatar
assinie

Messages : 171
Date d'inscription : 09/02/2014

Revenir en haut Aller en bas

Re: cc65 et Inline assembler

Message  goyo le Lun 16 Jan 2017 - 20:56

Hélas ni l'un ni l'autre ne fonctionne. Et il n'y a pratiquement pas d'aide sur le Net.

Je ne vois pas le détail de l'erreur sous VS j'ai une ligne avec ... Build Faild - fichier EXEC

J'avais mis en place Visual studio avec LCC65 , je vais peut être devoir le refaire pour CC65 .. :o

assinie a écrit:Quelle erreur as-tu?

Comme indiqué en remarque dans mon post précédent, l'instruction sta (ecran),x est illégale.
En indirect c'est soit sta (ecran),y soit sta (ecran,x)
avatar
goyo

Messages : 79
Date d'inscription : 02/05/2014
Age : 46
Localisation : Massy

Revenir en haut Aller en bas

Re: cc65 et Inline assembler

Message  didierv le Mar 17 Jan 2017 - 22:35

je vais peut être devoir le refaire pour CC65

Oui, vas-y.
La communauté CC65 est plus active (C64, Apple2 ...) et tu devrais pouvoir trouver des aides (cf mon mail)
et j'oserais dire que cela me motivera aussi un peu - plus ca va moins je code et plus je prends de retard dans le mag
bref, je tourne en rond

_________________
DidierV - CEO Mag
alias coco.oric sur Defence-Force
avatar
didierv

Messages : 489
Date d'inscription : 19/01/2014
Age : 54
Localisation : Nord de la France

http://www.dmacoco.fr

Revenir en haut Aller en bas

Re: cc65 et Inline assembler

Message  Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous pouvez répondre aux sujets dans ce forum