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 4 années et 11 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.