Derniers sujets
» Oricutron & RS232 "loopback"
mon premier petit programme en 100% assembleur :) EmptyHier à 23:21 par retroric

» J'ai fais la musique de Duck Hunt sur Atmos
mon premier petit programme en 100% assembleur :) EmptyHier à 11:43 par TotoShampoin

» aide requise pour afficher ligne de texte de differente couleur
mon premier petit programme en 100% assembleur :) EmptyHier à 11:13 par ]0[v]

» Pallida mors
mon premier petit programme en 100% assembleur :) EmptyLun 19 Aoû 2019 - 6:50 par didierv

» recherche un son de bruit de saut
mon premier petit programme en 100% assembleur :) EmptyDim 18 Aoû 2019 - 20:33 par ]0[v]

» Lancement de jeux - Messages d'erreur
mon premier petit programme en 100% assembleur :) EmptySam 17 Aoû 2019 - 21:54 par Symoon

» CEO MAG 350
mon premier petit programme en 100% assembleur :) EmptySam 17 Aoû 2019 - 10:36 par Dom50

» Bocco's adventures - nouveau jeu pour Oric
mon premier petit programme en 100% assembleur :) EmptySam 17 Aoû 2019 - 7:32 par kenneth

» CEO-MAG 351-352
mon premier petit programme en 100% assembleur :) EmptyVen 16 Aoû 2019 - 21:00 par retroric

» Citadelle V2
mon premier petit programme en 100% assembleur :) EmptyJeu 15 Aoû 2019 - 21:03 par fred72

» Ghost Town
mon premier petit programme en 100% assembleur :) EmptyJeu 15 Aoû 2019 - 18:08 par retroric

» Oric Atmos : problème de son
mon premier petit programme en 100% assembleur :) EmptyMer 14 Aoû 2019 - 18:03 par froggy

» Apprendre l'Assembleur ORIC
mon premier petit programme en 100% assembleur :) EmptyMar 13 Aoû 2019 - 15:09 par ]0[v]

» The last warrior
mon premier petit programme en 100% assembleur :) EmptyVen 9 Aoû 2019 - 19:13 par Symoon

» Devoirs de vacances
mon premier petit programme en 100% assembleur :) EmptyVen 9 Aoû 2019 - 11:22 par fred72

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

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 192 membres enregistrés
L'utilisateur enregistré le plus récent est Иван

Nos membres ont posté un total de 7641 messages dans 660 sujets
Portail ORIC




mon premier petit programme en 100% assembleur :)

Aller en bas

mon premier petit programme en 100% assembleur :) Empty mon premier petit programme en 100% assembleur :)

Message par goyo le Jeu 28 Fév 2019 - 18:57

Je suis fier de vous montrer mon premier mini programme en pur assembleur ...   Cool

j'ai osé faire le pas de passer de l'asm(); au fichier.s !

c'est une micro demo qui fait bouger mon personnage (Cwadia) de haut en bas en boucle ... oui .. c'est tout ... Shocked
happy

Code:


#define _rom_hires $ec33

#define HIR_ADDR $a000

_main
 
 ; Switch to hires
 
 jsr _rom_hires
 
 lda #20  ; x
 sta posx
 tax
 lda #169 ; y
 sta posy
 tay
 
 loop
 nop
 suite8
 sty posy
 
 jsr _disp_spr
 jsr _wait
 ldy posy
 dey
 bne suite8
 clc
 ldy #0
 suite9
 
 sty posy
 jsr _disp_spr
 jsr _wait
 ldy posy
 iny
 cpy #169
 bne suite9
 clc
 bcc loop
 
 ; ralentissement vonlontaire
_wait
 ldy #32
 wait1
 ldx #32
 wait2
 clc
 dex
 bne wait2
 dey
 bne wait1
rts

_disp_spr

 ; store _cwad1 sprite address in read
 lda #<_cwad1
 sta read+1
 lda #>_cwad1
 sta read+2
 ; store hires address in position
 lda #<HIR_ADDR
 sta position
 lda #>HIR_ADDR
 sta position+1
 ; calculate y position (ypos=40*y
 ldy posy
 suite5
 clc
 lda position
 adc #40
 bcc suite6
 inc position+1
 suite6
 sta position
 
 dey
 bne suite5
 clc
 ; add x position
 lda position
 adc posx
    bcc suite7
 inc position+1
 suite7
 sta position
 
 ; create write address
 lda position
 sta write+1
 lda position+1
 sta write+2
 
 ldy #31 ; y=spr height
 suite2
 clc
 ldx #0 ; x=spr width
 suite1
read
 lda $1234,x  
write
 sta $1234,x
 
 inx
 cpx #4
 bne suite1
 clc ; for cpx
 lda write+1
 adc #40
 
 bcc suite3
 inc write+2
 suite3
 clc
 sta write+1
 ; increment spr read with 4
 lda read+1
 adc #4
 bcc suite4
 inc read+2
 suite4
 sta read+1
 
 dey
 bne suite2
rts

_cwad1
 .byt $7F,$70,$43,$7F
 .byt $7F,$60,$40,$7F
 .byt $7E,$40,$41,$5F
 .byt $7C,$57,$47,$4F
 .byt $7C,$7F,$6C,$47
 .byt $78,$7F,$60,$43
 .byt $78,$48,$70,$43
 .byt $71,$77,$50,$41
 .byt $71,$55,$58,$41
 .byt $70,$47,$58,$41
 .byt $73,$70,$78,$41
 .byt $67,$7B,$78,$41
 .byt $63,$77,$78,$41
 .byt $60,$6F,$7F,$41
 .byt $63,$7D,$7F,$41
 .byt $71,$7D,$7C,$41
 .byt $70,$5A,$5C,$43
 .byt $78,$67,$78,$47
 .byt $7C,$5F,$70,$4F
 .byt $7E,$40,$40,$4F
 .byt $76,$43,$7C,$45
 .byt $78,$46,$7C,$63
 .byt $7F,$6B,$76,$5F
 .byt $7F,$6A,$73,$5F
 .byt $7F,$40,$40,$5F
 .byt $7F,$53,$7B,$5F
 .byt $7F,$67,$7C,$5F
 .byt $7F,$70,$41,$7F
 .byt $7F,$7B,$4D,$7F
 .byt $7F,$78,$61,$7F
 .byt $7F,$71,$41,$7F
 .byt $7F,$7F,$7F,$7F
 

position .dsb  2;
posx .byt 10
posy .byt 50
goyo
goyo

Messages : 169
Date d'inscription : 02/05/2014
Age : 48
Localisation : Massy

Revenir en haut Aller en bas

mon premier petit programme en 100% assembleur :) Empty Re: mon premier petit programme en 100% assembleur :)

Message par Dbug le Sam 2 Mar 2019 - 9:01

Bon début Smile

Question, c'est quel assembler, XA?

_________________

Dbug
Dbug

Messages : 182
Date d'inscription : 06/01/2013

Revenir en haut Aller en bas

mon premier petit programme en 100% assembleur :) Empty Re: mon premier petit programme en 100% assembleur :)

Message par Dbug le Sam 2 Mar 2019 - 9:14

Quelques astuces Smile

Si tu utilises XA, tu n'es pas obligé d'inventer des labels "suite1", "suite2", etc... pour toutes les petites routines d'addition, tu peux juste utiliser des blocs locaux.

Donc au lieu de :
Code:
 clc ; for cpx
 lda write+1
 adc #40
 bcc suite3
 inc write+2
suite3
 clc
 sta write+1

 ; increment spr read with 4
 lda read+1
 adc #4
 bcc suite4
 inc read+2
suite4
 sta read+1
tu peux faire ca:

Code:
 
.(
 clc ; for cpx
 lda write+1
 adc #40
 bcc suite
 inc write+2
suite
 clc
 sta write+1
.)

.(
 ; increment spr read with 4
 lda read+1
 adc #4
 bcc suite
 inc read+2
suite
 sta read+1
.)
comme ca tu peux utiliser "suite" de partout, le symbol n'est pas visible a l'extérieur des blocs .( .)

A la place de la multiplication par 40, en général on utilise directement une table qui contient les valeurs 0, 40, 80, ...

Et vu qu'en général, on ajoute l'adresse de départ de l'écran, au final on obtient une table qui contient l'adresse qui va bien déjà calculée:

TextAddressesLow .byt <$a0000+0*40,<$a0000+1*40,<$a0000+2*40,...
TextAddressesHigh .byt >$a0000+0*40,>$a0000+1*40,>$a0000+2*40,...

Donc dans ton code, tout ca:
Code:

 ; store hires address in position
 lda #<HIR_ADDR
 sta position
 lda #>HIR_ADDR
 sta position+1

 ; calculate y position (ypos=40*y
 ldy posy
suite5
 clc
 lda position
 adc #40
 bcc suite6
 inc position+1
suite6
 sta position
 
 dey
 bne suite5
se remplace par ca:
Code:

 ldy posy
lda TextAddressesLow  ,y
sta position+0
lda TextAddressesHigh  ,y
sta position+1

et un dernier petit truc:

Si en sortant de ta boucle d'affichage tu sais que la retenue est toujours a 1, plutôt que de faire un CLC avant de faire ton ADC #40, tu peux juste ne pas mettre le CLC et faire un ADC #39 (en commentant évidement que ca part du principe que la retenue doit etre a 1)

Vala.

Ha si, plutôt que le inx/cpx#4/bne tu peux juste afficher a l'envers en faisant juste un dex/bpl







_________________

Dbug
Dbug

Messages : 182
Date d'inscription : 06/01/2013

Revenir en haut Aller en bas

mon premier petit programme en 100% assembleur :) Empty Re: mon premier petit programme en 100% assembleur :)

Message par goyo le Dim 3 Mar 2019 - 20:09

Dbug a écrit:Quelques astuces Smile

Si tu utilises XA, tu n'es pas obligé d'inventer des labels "suite1", "suite2", etc... pour toutes les petites routines d'addition, tu peux juste utiliser des blocs locaux.

Donc au lieu de :
Code:
 clc ; for cpx
 lda write+1
 adc #40
 bcc suite3
 inc write+2
suite3
 clc
 sta write+1

 ; increment spr read with 4
 lda read+1
 adc #4
 bcc suite4
 inc read+2
suite4
 sta read+1
tu peux faire ca:

Code:
 
.(
 clc ; for cpx
 lda write+1
 adc #40
 bcc suite
 inc write+2
suite
 clc
 sta write+1
.)

.(
 ; increment spr read with 4
 lda read+1
 adc #4
 bcc suite
 inc read+2
suite
 sta read+1
.)
comme ca tu peux utiliser "suite" de partout, le symbol n'est pas visible a l'extérieur des blocs .( .)

A la place de la multiplication par 40, en général on utilise directement une table qui contient les valeurs 0, 40, 80, ...

Et vu qu'en général, on ajoute l'adresse de départ de l'écran, au final on obtient une table qui contient l'adresse qui va bien déjà calculée:

TextAddressesLow  .byt <$a0000+0*40,<$a0000+1*40,<$a0000+2*40,...
TextAddressesHigh .byt >$a0000+0*40,>$a0000+1*40,>$a0000+2*40,...

Donc dans ton code, tout ca:
Code:

 ; store hires address in position
 lda #<HIR_ADDR
 sta position
 lda #>HIR_ADDR
 sta position+1

 ; calculate y position (ypos=40*y
 ldy posy
suite5
 clc
 lda position
 adc #40
 bcc suite6
 inc position+1
suite6
 sta position
 
 dey
 bne suite5
se remplace par ca:
Code:

 ldy posy
lda TextAddressesLow  ,y
sta position+0
lda TextAddressesHigh  ,y
sta position+1

et un dernier petit truc:

Si en sortant de ta boucle d'affichage tu sais que la retenue est toujours a 1, plutôt que de faire un CLC avant de faire ton ADC #40, tu peux juste ne pas mettre le CLC et faire un ADC #39 (en commentant évidement que ca part du principe que la retenue doit etre a 1)

Vala.

Ha si, plutôt que le inx/cpx#4/bne tu peux juste afficher a l'envers en faisant juste un dex/bpl


Merci beaucoup Dbug pour tes remarques et tes conseils d'expert.

Je n'ai pas bien compris la dernière astuce, je vais mieux l'étudier.
goyo
goyo

Messages : 169
Date d'inscription : 02/05/2014
Age : 48
Localisation : Massy

Revenir en haut Aller en bas

mon premier petit programme en 100% assembleur :) Empty Re: mon premier petit programme en 100% assembleur :)

Message par Dbug le Dim 3 Mar 2019 - 22:16

Je n'ai pas bien compris la dernière astuce, je vais mieux l'étudier.
Bein disons que toutes les instructions mettent a jour le registre d'état DEX n'échappe pas a la règle et met a jour Z si le resultat est nul, et N si il est négatif.

Si tu décrémente (en partant de la fin évidement) et n'a plus besoin du CPX donc tu gagnes quelques cycles, donc ta routine va plus vite.

_________________

Dbug
Dbug

Messages : 182
Date d'inscription : 06/01/2013

Revenir en haut Aller en bas

mon premier petit programme en 100% assembleur :) Empty Re: mon premier petit programme en 100% assembleur :)

Message par goyo le Lun 4 Mar 2019 - 11:28

Dbug a écrit:
Je n'ai pas bien compris la dernière astuce, je vais mieux l'étudier.
Bein disons que toutes les instructions mettent a jour le registre d'état DEX n'échappe pas a la règle et met a jour Z si le resultat est nul, et N si il est négatif.

Si tu décrémente (en partant de la fin évidement) et n'a plus besoin du CPX donc tu gagnes quelques cycles, donc ta routine va plus vite.

Merci Dbug, du coup j'ai appris beaucoup en quelques postes !! Smile

me reste plus qu'a programmer mon premier petit jeu en assembleur ! :o
goyo
goyo

Messages : 169
Date d'inscription : 02/05/2014
Age : 48
Localisation : Massy

Revenir en haut Aller en bas

mon premier petit programme en 100% assembleur :) Empty Re: mon premier petit programme en 100% assembleur :)

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

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