Derniers sujets
» L'ile oubliée
Aujourd'hui à 22:02 par Dom50

» Des propositions graphiques pour Oricutron
Aujourd'hui à 18:37 par TotoShampoin

» Bus d'extension - accès à la RAM
Aujourd'hui à 18:20 par laurentd75

» Annonces insolites
Hier à 20:15 par kenneth

» opération compliquée
Lun 18 Mar 2019 - 22:58 par laurentd75

» Novalight
Dim 17 Mar 2019 - 21:33 par Symoon

» Route en effet 3d
Dim 17 Mar 2019 - 18:37 par Dbug

» musique en c
Ven 15 Mar 2019 - 14:54 par laurentd75

»  Oric Atmos problème de sortie vidéo
Ven 15 Mar 2019 - 14:48 par kenneth

» 65c816 et dédicace à Fabrice F :)
Jeu 14 Mar 2019 - 11:20 par Jede

» cherche quelqu'un(e)(s) avec qui retravailler la rom basic 16 kos
Jeu 14 Mar 2019 - 10:45 par Jede

» Aux couleurs de l'Atmos
Jeu 14 Mar 2019 - 3:04 par Voyageur

» ORIC-1 sur LE BON COIN
Lun 11 Mar 2019 - 23:20 par kenneth

» Cumulus
Lun 11 Mar 2019 - 17:01 par Jede

» rs
Lun 11 Mar 2019 - 11:47 par kenneth

Qui est en ligne ?
Il y a en tout 2 utilisateurs en ligne :: 0 Enregistré, 0 Invisible et 2 Invités :: 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 175 membres enregistrés
L'utilisateur enregistré le plus récent est ZodiacFR

Nos membres ont posté un total de 6906 messages dans 594 sujets
Portail ORIC




mon premier petit programme en 100% assembleur :)

Aller en bas

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
Fichiers joints
sprite.zip Vous n'avez pas la permission de télécharger les fichiers joints.(1 Ko) Téléchargé 5 fois
goyo
goyo

Messages : 141
Date d'inscription : 02/05/2014
Age : 47
Localisation : Massy

Revenir en haut Aller en bas

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 : 139
Date d'inscription : 06/01/2013

Revenir en haut Aller en bas

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 : 139
Date d'inscription : 06/01/2013

Revenir en haut Aller en bas

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 : 141
Date d'inscription : 02/05/2014
Age : 47
Localisation : Massy

Revenir en haut Aller en bas

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 : 139
Date d'inscription : 06/01/2013

Revenir en haut Aller en bas

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 : 141
Date d'inscription : 02/05/2014
Age : 47
Localisation : Massy

Revenir en haut Aller en bas

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