Compilation code ASM

Forum Amiga Coding Compilation code ASM

  • Ce sujet contient 8 réponses, 4 participants et a été mis à jour pour la dernière fois par donutman, le il y a 3 années et 8 mois.
  • Créateur
    Sujet
  • #96029
    donutman
    • Level 1
    • Messages : 15

    Bonsoir à tous,

    je suis nouveau sur ce forum.
    Je me suis récemment lancé dans la programmation assembleur sous Amiga et j’ai découvert l’excellent livre « Amiga System Programmer’s Guide » chez Abacuns (livre à la couverture bleue).

    Je bloque néanmoins sur la compilation d’un de leur exemple (dont le but est la programmation d’une Copper list). En l’occurence, le programme doit partager l’écran en trois bandes noire, rouge et jaune.

    Voici ci-dessous ma retranscription du code (section 1.5 page 93 du livre). J’ai mis en gras la ligne qui pose problème.

    Lorsque je le compile j’obtiens l’erreur suivante :

    ** Word at Odd Address

    108 dc.w COLOR00, $0000 ; Backgroundcolor black

    Le manuel ASM-ONE donne des précisions concernant cette erreur :

    Trying to assemble an « op-code » at and « odd boundary’ causes an « Word at Odd Address » error. This is because the MC68000 family is restricted to run commands on an even boundary.

    Bon l’explication semble claire, l’op-code dc.w tombe sur une adresse impaire…

    Mais il me semble intuitivement que le rôle de « align » juste au-dessus permet de rétablir l’alignement justement… Je ne suis pas très calé en assembleur et ne sait pas trop comment me dépatouiller de ça… J’ai tenté un « CLstart : EVEN » mais ça a créé d’autres soucis….

    Une âme charitable pourrait-elle m’aider ??

     

    Merci d’avance et bonne soirée :)

    Donut.

    –> Le programme (il n’y a pas de balises code sur ce forum ??)

    ***********************************************************

    ;*** Example for a simple Copperlist ***
    ; ASPG p.93

    ; CustomChip-Register
    INTENA = $9A ; Interrupt-Enable-Register (write)
    DMACON = $96 ; DMA-control register (write)
    COLOR00 = $180 ; Color palette register 0

    ; Copper Register
    COP1LC = $80 ;Address of 1. Copper list
    COP2LC = $84 ;Address of 2. Copper list

    COPJMP1 = $88 ;Jump to Copper list 1
    COPJMP2 = $8a ;Jump to Copper list 2

    ; CIA-A Port register A (Mouse key)
    CIAAPRA = $BFE001

    ; Exec Library Base Offsets

    OpenLibrary = -30-522 ; LibName,Version/al,dO
    Forbid = -30-102 ;
    Permit = -30-108 ;
    AllocMem = -30-168 ; Byte Size, Requirements/d0,dl
    FreeMem = -30-180 ; Memory Block, Byte Size/al,d0

    ; Graphic base

    StartList = 38

    ; Other Labels

    Execbase = 4
    Chip = 2 ; request Chip-RAM

    ;*** INITIALISATION ***

    ; request memory for Copperlist

    Start:
    move.l Execbase,a6
    moveq #CLsize,d0 ; Set Parameter for AllocMem
    moveq #chip,d1 ; ask for Chip-RAM
    jsr AllocMem(a6) ; request memory
    move.l d0,CLadr ; Address of the RAM-area memory
    beq.s Ende ; Error! –> End

    ; copy Copperlist to CLadr
    lea CLstart,a0
    move.l CLadr,a1
    moveq #CLsize-l,d0 ; set loop value

    CLcopy:
    move.b (a0)+, (a1)+ ; copy Copperlist Byte for Byte
    dbf d0,CLcopy

    ;*** Main programm ***

    jsr forbid(a6) ; Task Switching off
    lea $dff000,a5 ; Basic address of the Register to A5

    move.w #$03a0,dmacon(a5) ; DMA offn
    move.l CLadr,copllc(a5) ; Address of the Copperlist to COP1LC

    clr.w copjmpl(a5) ; Load copperlist in program counter

    ; Switch Copper DMA
    move.w #$8280,dmacon(a5)

    ; wait for left mouse key
    Wait: btst #6,ciaapra ; bit test
    bne.s Wait ; done ? else continue.

    ;*** End programm ***

    ; Restore old Copper list

    move.l #GRname,a1 ; Set parameter for OpenLibrary
    clr.l d0
    jsr OpenLibrary(a6) ; Graphics Library open
    move.l d0,a4 ; Address of GraphicsBase to a4
    move.l StartList(a4),cop1lc(a5) ; load address of Startlist

    clr.w copjmpl(a5)
    move.w #$83e0,dmacon(a5) ; all DMA on
    jsr permit(a6) ; Task-Switching on

    ; Free memory of Copperlist

    move.l Cladr, a1 ; set parameter for FreeMem
    moveq #Clsize, d0
    jsr FreeMem(a6) ; Memory freed

    Ende: clr.l d0 ; Error Flag erased
    rts ; end program

    ; Variables
    CLadr: dc.l 0

    ; Constants
    GRname: dc.b « graphics.library »,0
    align ; even for other assemblers

    ; Copperlist
    CLstart:
    dc.w COLOR00, $0000 ; Backgroundcolor black
    dc.w $640f,$fffe ; On line 100
    dc.w COLOR00, $0f00 ; RED
    dc.w $be0f, $fffe ; Line 190
    dc.w COLOR00, $0fb0 ; GOLD
    dc.w $ffff,$fffe ; impossible wait
    CLend:

    CLsize = CLend – CLstart
    end
    ; End of program

    ***********************************************************

     

Affichage de 8 réponses de 1 à 8 (sur un total de 8)

Partager sur vos réseaux sociaux préférés :
Facebooktwitterredditpinterestlinkedintumblrmail

  • Auteur
    Réponses
  • #96036
    astrofra
    • Level 4
    • Messages : 126

      Chic! Un nouveau!

      d’autres seront plus qualifiés que moi, mais as-tu essayé (même si c’est une solution vraiment pas terrible) d’ajouter un « dc.b » juste en amont de ton label ?

      www.astrofra.com | fra.planet-d.net



      #96037
      donamiga
      • Level 5
      • Messages : 249

        pour le code il faut se mettre dans l’onglet « TEXTE », balise CODE
        j’avais des tas d’erreurs de compil (devpac, mais ça marche avec asm-one)
        moveq avec CLsize au lieu de move.l
        des copllc au lieu de cop1lc …

        
        ;*** Example for a simple Copperlist ***
        ; ASPG p.93
        
        ; CustomChip-Register
        INTENA = $9A ; Interrupt-Enable-Register (write)
        DMACON = $96 ; DMA-control register (write)
        COLOR00 = $180 ; Color palette register 0
        
        ; Copper Register
        COP1LC = $80 ;Address of 1. Copper list
        COP2LC = $84 ;Address of 2. Copper list
        
        COPJMP1 = $88 ;Jump to Copper list 1
        COPJMP2 = $8a ;Jump to Copper list 2
        
        ; CIA-A Port register A (Mouse key)
        CIAAPRA = $BFE001
        
        ; Exec Library Base Offsets
        
        OpenLibrary = -30-522 ; LibName,Version/al,dO
        Forbid = -30-102 ;
        Permit = -30-108 ;
        AllocMem = -30-168 ; Byte Size, Requirements/d0,dl
        FreeMem = -30-180 ; Memory Block, Byte Size/al,d0
        
        ; Graphic base
        
        StartList = 38
        
        ; Other Labels
        
        Execbase = 4
        Chip = 2 ; request Chip-RAM
        
        ;*** INITIALISATION ***
        
        ; request memory for Copperlist
        	
        Start:
        	move.l Execbase,a6
        	move.l #CLsize,d0 ; Set Parameter for AllocMem
        	moveq #chip,d1 ; ask for Chip-RAM
        	jsr AllocMem(a6) ; request memory
        	move.l d0,CLadr ; Address of the RAM-area memory
        	beq.s Ende ; Error! –> End
        
        	; copy Copperlist to CLadr
        	lea CLstart,a0
        	move.l CLadr,a1
        	move.l #CLsize-1,d0 ; set loop value
        
        CLcopy:
        	move.b (a0)+,(a1)+ ; copy Copperlist Byte for Byte
        	dbf d0,CLcopy
        
        ;*** Main programm ***
        
        	jsr forbid(a6) ; Task Switching off
        	lea $dff000,a5 ; Basic address of the Register to A5
        
        	move.w #$03a0,dmacon(a5) ; DMA offn
        	move.l CLadr,cop1lc(a5) ; Address of the Copperlist to COP1LC
        
        	clr.w copjmp1(a5) ; Load copperlist in program counter
        
        	; Switch Copper DMA
        	move.w #$8280,dmacon(a5)
        
        	; wait for left mouse key
        Wait:	btst #6,ciaapra ; bit test
        	bne.s Wait ; done ? else continue.
        
        ;*** End programm ***
        
        ; Restore old Copper list
        
        	move.l #GRname,a1 ; Set parameter for OpenLibrary
        	clr.l d0
        	jsr OpenLibrary(a6) ; Graphics Library open
        	move.l d0,a4 ; Address of GraphicsBase to a4
        	move.l StartList(a4),cop1lc(a5) ; load address of Startlist
        
        	clr.w copjmp1(a5)
        	move.w #$83e0,dmacon(a5) ; all DMA on
        	jsr permit(a6) ; Task-Switching on
        
        ; Free memory of Copperlist
        
        	move.l Cladr,a1 ; set parameter for FreeMem
        	move.l #Clsize,d0
        	jsr FreeMem(a6) ; Memory freed
        
        Ende:	clr.l d0 ; Error Flag erased
        	rts ; end program
        
        ; Variables
        CLadr: dc.l 0
        
        ; Constants
        GRname: dc.b "graphics.library",0
        	even
        ;align ; even for other assemblers
        	
        ; Copperlist
        CLstart:
        	dc.w COLOR00, $0000 ; Backgroundcolor black
        	dc.w $640f,$fffe ; On line 100
        	dc.w COLOR00, $0f00 ; RED
        	dc.w $be0f, $fffe ; Line 190
        	dc.w COLOR00, $0fb0 ; GOLD
        	dc.w $ffff,$fffe ; impossible wait
        CLend:
        
        CLsize = CLend – CLstart
        	end
        
        #96042
        donutman
        • Level 1
        • Messages : 15

          Bonjour astrofra,

          merci pour ton retour rapide :)

          Effectivement, si je rajoute un « dc.b 0 » correctement indenté juste avant le label, ça fonctionne bien !!

          En fait j’ai l’impression que mon align n’est pas pris en compte si je ne l’indente pas et le compilateur me renvoie un « Illegal operator » si je l’indente.

          Par ailleurs, dans la documentation officielle d’ASM-One, je ne trouve aucune mention de l’op-code « align » ce qui me rend très perplexe….

          Les deux autres solutions que j’ai trouvé sont :

          1) mettre la directive EVEN juste après le label (cf. doc ASM-ONE section 7.2.5 page 76)

          2) changer de zone mémoire via la directive SECTION (je suppose que ça repart sur une adresse paire du coup…) : SECTION tut,DATA_C à placer juste avant le label

          Bon néanmoins, un train peut en cacher un autre et, après la correction de ce soucis, je tombe sur cette nouvelle erreur lors de l’assemblage :

          *** Relative Mode Error

          43 moveq #CLsize,d0 ; Set Parameter for AllocMem

          La doc de référence indique (p.169) :

          If try to use a relativ value as a constant (e.g. word size or in calculations other than « + -« ) this is the error you will get

          J’ai pu me dépatouiller en remplaçant « moveq #CLsize,d0 » par « moveq 38,d0 » avec 38 une valeur suffisamment grande pour faire tenir la Copper list mais c’est moyennement satisfaisant (le programme s’assemble et affiche le résultat désiré ceci dit..).

          Pas facile facile de se lancer là dedans ^^

          #96043
          donutman
          • Level 1
          • Messages : 15

            Salut donamiga,

            merci pour ton retour !

            Ok pour la balise code, je vois comment faire pour la suite :)

            Effectivement, j’ai fait un copier/coller de l’exemple donné sans me rendre compte que les « 0 » (le chiffre) étaient remplacé par des « o » (la lettre) et les « 1 » (le chiffre) par des « l » (la lettre). Je m’en suis rendu compte après coup…

             

            Sinon, qu’entends-tu par :

            moveq avec CLsize au lieu de move.l

            Je ne suis pas sûr de bien saisir la différence entre moveq et move.l…

            move.l c’est la copie de deux blocs W (word) d’un coup mais moveq je ne comprends pas trop… je suppose que c’est la source de l’erreur que j’obtiens par la suite en ligne 43 (cf. mon 2eme message)

            Donut

            #96045
            donamiga
            • Level 5
            • Messages : 249

              moveq c’est un move quick : copie immediate de données 8 bits (court)
              mais le prob ne venait pas de là pour la 1ere erreur « word at odd address »
              le even ne devait pas etre mis correctement

              dans ce cas là, le moveq fonctionne parce que la copperlist n’est pas grosse, tient dans 1 octet.
              il avait du mal aussi avec le CLsize = CLend – CLstart à cause des espaces entre operandes : CLsize=CLend-CLstart (assez chiant asm-one pour ça)

              et avec d’autre assembleur, il indique que moveq #CLsize,d0 : « relative not allowed »
              EQU ou SET

              #96048
              donamiga
              • Level 5
              • Messages : 249

                changer de zone mémoire via la directive SECTION (je suppose que ça repart sur une adresse paire du coup…) : SECTION tut,DATA_C à placer juste avant le label

                dans cet exemple ça ne sert à rien car il y a allocation de Chip pour la copperlist

                en mettant section copper,data_c, plus besoin de la partie :

                	move.l Execbase,a6
                	move.l #CLsize,d0 ; Set Parameter for AllocMem
                	moveq #chip,d1 ; ask for Chip-RAM
                	jsr AllocMem(a6) ; request memory
                	move.l d0,CLadr ; Address of the RAM-area memory
                	beq.s Ende ; Error! –> End
                
                	; copy Copperlist to CLadr
                	lea CLstart,a0
                	move.l CLadr,a1
                	move.l #CLsize-1,d0 ; set loop value
                
                CLcopy:
                	move.b (a0)+,(a1)+ ; copy Copperlist Byte for Byte
                	dbf d0,CLcopy
                

                ni du free mem à la fin

                #96076
                lexomil
                • Level 3
                • Messages : 80

                  Salut jeune intrépide !

                  Il y’a quelques années j’ai fait plusieurs tuto sur la programmation ASM pour Amiga (entre autres), c’est 100% en français et ça se trouve là http://flabrador.free.fr/lexo/amiga/sotb/index.html avec sources à downloader et commentaires du code.

                  Tu trouvera également d’excellents tuto sur le site d’obligement .

                  Amuses toi bien

                  #96098
                  donutman
                  • Level 1
                  • Messages : 15

                    Hello,

                    merci *vraiment* à vous tous pour vos retours :)

                    Ca me fait très plaisir de trouver une communauté Amiga en français aussi réactive.
                    Je me suis lancé dans les tutos suggérés par lexomil, je crois que j’ai plein de lacune à combler ^^

                    A bientôt !

                    Donut

                  Partager sur vos réseaux sociaux préférés :
                  Facebooktwitterredditpinterestlinkedintumblrmail
                  Affichage de 8 réponses de 1 à 8 (sur un total de 8)
                  • Vous devez être connecté pour répondre à ce sujet.