Derniers sujets
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
Statistiques
Nous avons 243 membres enregistrésL'utilisateur enregistré le plus récent est paul225l
Nos membres ont posté un total de 8922 messages dans 811 sujets
mon premier petit programme en 100% assembleur :)
2 participants
Forum Oric :: Forums :: Forum Public :: Assembleur
Page 1 sur 1
mon premier petit programme en 100% assembleur :)
Je suis fier de vous montrer mon premier mini programme en pur assembleur ...
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 ...
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 ...
- 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- Messages : 199
Date d'inscription : 02/05/2014
Age : 52
Localisation : Massy
DRONAERTY aime ce message
Re: mon premier petit programme en 100% assembleur :)
Bon début
Question, c'est quel assembler, XA?
Question, c'est quel assembler, XA?
Dbug- Messages : 248
Date d'inscription : 06/01/2013
Re: mon premier petit programme en 100% assembleur :)
Quelques astuces
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 :
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:
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
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
- 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
.)
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
- 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- Messages : 248
Date d'inscription : 06/01/2013
Re: mon premier petit programme en 100% assembleur :)
Dbug a écrit:Quelques astuces
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 :tu peux faire ca:
- 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+1comme ca tu peux utiliser "suite" de partout, le symbol n'est pas visible a l'extérieur des blocs .( .)
- 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
.)
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:se remplace par 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
- 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- Messages : 199
Date d'inscription : 02/05/2014
Age : 52
Localisation : Massy
Re: mon premier petit programme en 100% assembleur :)
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.Je n'ai pas bien compris la dernière astuce, je vais mieux l'étudier.
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- Messages : 248
Date d'inscription : 06/01/2013
Re: mon premier petit programme en 100% assembleur :)
Dbug a écrit: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.Je n'ai pas bien compris la dernière astuce, je vais mieux l'étudier.
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 !!
me reste plus qu'a programmer mon premier petit jeu en assembleur ! :o
goyo- Messages : 199
Date d'inscription : 02/05/2014
Age : 52
Localisation : Massy
Sujets similaires
» petit programme en multitâche ?
» MONASM pour emulateur ORIC
» Lancement automatique d'un programme Basic
» HADES Assembleur
» Assembleur/Désassembleur MAD.COM ?
» MONASM pour emulateur ORIC
» Lancement automatique d'un programme Basic
» HADES Assembleur
» Assembleur/Désassembleur MAD.COM ?
Forum Oric :: Forums :: Forum Public :: Assembleur
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|
Dim 31 Mar 2024 - 14:35 par kenneth
» Bla Bla général du Jury
Jeu 21 Mar 2024 - 8:51 par Dom50
» carte mère Oric (re)tracée
Mar 5 Mar 2024 - 18:54 par kenneth
» Meurtre à Grande Vitesse
Dim 25 Fév 2024 - 5:09 par Iurius
» ORIC-1 sur LE BON COIN
Ven 23 Fév 2024 - 23:01 par Mcar
» ORIC ATMOS sur LE BON COIN
Dim 4 Fév 2024 - 12:06 par kiwilevrai
» Problème d'affichage des couleurs avec un Oric Atmos
Sam 27 Jan 2024 - 1:26 par pierbail
» Bienvenue dans le Forum des Oriciens
Mar 9 Jan 2024 - 12:33 par Dom50
» Rencontre avec Laurant Weill, co-fondateur de Loriciel, et mon garçon de 12 ans
Ven 29 Déc 2023 - 14:13 par Arcade-des-Monts
» Bonnes fêtes
Mar 26 Déc 2023 - 10:21 par Dom50
» Murders in Venice / Meutres à Venise
Sam 18 Nov 2023 - 22:44 par retroric
» Un clavier PS/2 pour tester un ORIC
Dim 27 Aoû 2023 - 9:49 par Voyageur
» Disquette 3" Sedoric
Mar 1 Aoû 2023 - 14:22 par AtomeX
» faire un 6502 avec des phototransistor
Dim 16 Juil 2023 - 17:26 par Voyageur
» Oricutron linux et DSK
Jeu 29 Juin 2023 - 18:34 par Voyageur