Forum Oric
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Derniers sujets
» rs
mon premier petit programme en 100% assembleur :) EmptyDim 31 Mar 2024 - 14:35 par kenneth

» Bla Bla général du Jury
mon premier petit programme en 100% assembleur :) EmptyJeu 21 Mar 2024 - 8:51 par Dom50

» carte mère Oric (re)tracée
mon premier petit programme en 100% assembleur :) EmptyMar 5 Mar 2024 - 18:54 par kenneth

» Meurtre à Grande Vitesse
mon premier petit programme en 100% assembleur :) EmptyDim 25 Fév 2024 - 5:09 par Iurius

» ORIC-1 sur LE BON COIN
mon premier petit programme en 100% assembleur :) EmptyVen 23 Fév 2024 - 23:01 par Mcar

» ORIC ATMOS sur LE BON COIN
mon premier petit programme en 100% assembleur :) EmptyDim 4 Fév 2024 - 12:06 par kiwilevrai

» Problème d'affichage des couleurs avec un Oric Atmos
mon premier petit programme en 100% assembleur :) EmptySam 27 Jan 2024 - 1:26 par pierbail

» Bienvenue dans le Forum des Oriciens
mon premier petit programme en 100% assembleur :) EmptyMar 9 Jan 2024 - 12:33 par Dom50

» Rencontre avec Laurant Weill, co-fondateur de Loriciel, et mon garçon de 12 ans
mon premier petit programme en 100% assembleur :) EmptyVen 29 Déc 2023 - 14:13 par Arcade-des-Monts

» Bonnes fêtes
mon premier petit programme en 100% assembleur :) EmptyMar 26 Déc 2023 - 10:21 par Dom50

» Murders in Venice / Meutres à Venise
mon premier petit programme en 100% assembleur :) EmptySam 18 Nov 2023 - 22:44 par retroric

» Un clavier PS/2 pour tester un ORIC
mon premier petit programme en 100% assembleur :) EmptyDim 27 Aoû 2023 - 9:49 par Voyageur

» Disquette 3" Sedoric
mon premier petit programme en 100% assembleur :) EmptyMar 1 Aoû 2023 - 14:22 par AtomeX

» faire un 6502 avec des phototransistor
mon premier petit programme en 100% assembleur :) EmptyDim 16 Juil 2023 - 17:26 par Voyageur

» Oricutron linux et DSK
mon premier petit programme en 100% assembleur :) EmptyJeu 29 Juin 2023 - 18:34 par Voyageur

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 243 membres enregistrés
L'utilisateur enregistré le plus récent est paul225l

Nos membres ont posté un total de 8922 messages dans 811 sujets
Sites Sympas

> Culture Club


Le Deal du moment : -40%
Tefal Ingenio Emotion – Batterie de cuisine 10 ...
Voir le deal
59.99 €

mon premier petit programme en 100% assembleur :)

2 participants

Aller en bas

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

Message par goyo 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 : 199
Date d'inscription : 02/05/2014
Age : 52
Localisation : Massy

DRONAERTY aime ce message

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 Sam 2 Mar 2019 - 9:01

Bon début Smile

Question, c'est quel assembler, XA?
Dbug
Dbug

Messages : 248
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 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 : 248
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 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 : 199
Date d'inscription : 02/05/2014
Age : 52
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 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 : 248
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 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 : 199
Date d'inscription : 02/05/2014
Age : 52
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