ASR ???!
Modérateurs : SirG, Redfield1, shubibiman, Laucops
- Orion_
- NECstasien
- Messages : 217
- Inscription : mer. 11 juil. 2007 20:56
- Localisation : Perpignan
- Contact :
ASR ???!
alors la je comprend pas, sur le processeur pc engine (et donc 6502)
on a l'instruction ASL, mais pas ASR ???? on a LSR par contre...
ça devrait pas être l'inverse ?
faire un shift a droite et conserver le signe négatif me semble tellement évident et capital, pourquoi avoir fait un ASL alors que ça sert strictement a rien ???
dans la logique on peu s'en sortir avec ASR/LSL, mais surement pas avec LSR/ASL ...
sur le GPU Jaguar c'est ce qu'il y a d'ailleurs, y'a un SHL et un SHAR, et pas l'inverse ...
comment je fait une macro ASRW moi alors ? :|
décidément l'asm 8bits me rendra fou
on a l'instruction ASL, mais pas ASR ???? on a LSR par contre...
ça devrait pas être l'inverse ?
faire un shift a droite et conserver le signe négatif me semble tellement évident et capital, pourquoi avoir fait un ASL alors que ça sert strictement a rien ???
dans la logique on peu s'en sortir avec ASR/LSL, mais surement pas avec LSR/ASL ...
sur le GPU Jaguar c'est ce qu'il y a d'ailleurs, y'a un SHL et un SHAR, et pas l'inverse ...
comment je fait une macro ASRW moi alors ? :|
décidément l'asm 8bits me rendra fou
- touko
- NECromancer
- Messages : 2297
- Inscription : lun. 31 mars 2008 14:32
Re: ASR ???!
LSR est le contraire de ASL ..
CAD un décalage d'un bit vers la droite/gauche sans prise en compte de la retenu .
Pour ton LSRW, il faut faire
lsr ma_var + 1
ror ma_var
ROL et ROR font des rotations de bit avec prise en compte de la retenu , l'avantage de ASL et LSR, c'est que justement t'as pas à te soucier de l'état de la retenue quand tu veux juste faire du shift de bit .
Par contre, si tu shiftes de plusieurs bit je te conseille de mettre ma_var ou ma_var + 1 dans le reg A et de shifter A plutôt .
CAD un décalage d'un bit vers la droite/gauche sans prise en compte de la retenu .
Pour ton LSRW, il faut faire
lsr ma_var + 1
ror ma_var
ROL et ROR font des rotations de bit avec prise en compte de la retenu , l'avantage de ASL et LSR, c'est que justement t'as pas à te soucier de l'état de la retenue quand tu veux juste faire du shift de bit .
Par contre, si tu shiftes de plusieurs bit je te conseille de mettre ma_var ou ma_var + 1 dans le reg A et de shifter A plutôt .
Dernière modification par touko le mer. 02 juil. 2014 10:17, modifié 4 fois.
- Orion_
- NECstasien
- Messages : 217
- Inscription : mer. 11 juil. 2007 20:56
- Localisation : Perpignan
- Contact :
Re: ASR ???!
sauf que pour moi ROR ça fait des rotations de bits, sans prise en compte du Carry.
enfin, c'est le cas sur tout les processeurs 16bits :p
exemple: Avec le carry a 0, ROR de $01 ça ferais $80
donc sur 8bits c'est différent et c'est donc l'équivalent d'un shift Arithmétique
fallais le savoir ... merci
(c'est débile d'ailleurs, fallais appeler ça ASR, pas ROR .......)
et c'est bien ASRW que je voulais, pas ASLW
sinon j'avais bidouillé ça en fouillant les macro de HuC
asrw .macro
lda \1+1 ; Trash A !
cmp #$80
ror \1+1
ror \1
.endm
enfin, c'est le cas sur tout les processeurs 16bits :p
exemple: Avec le carry a 0, ROR de $01 ça ferais $80
donc sur 8bits c'est différent et c'est donc l'équivalent d'un shift Arithmétique
fallais le savoir ... merci
(c'est débile d'ailleurs, fallais appeler ça ASR, pas ROR .......)
et c'est bien ASRW que je voulais, pas ASLW
sinon j'avais bidouillé ça en fouillant les macro de HuC
asrw .macro
lda \1+1 ; Trash A !
cmp #$80
ror \1+1
ror \1
.endm
- Orion_
- NECstasien
- Messages : 217
- Inscription : mer. 11 juil. 2007 20:56
- Localisation : Perpignan
- Contact :
Re: ASR ???!
punaise mais quel bande de $#@! ces concepteur 6502
quel idée d'avoir appeler l'instruction ASL "ARITHMÉTIQUE"
elle n'a rien d'arithmétique !
lda #$80
sec
asl A
résultat A = 0
super, donc c'est exactement le comportement d'un LSL, alors pourquoi avoir appeler ça ASL ?? alors qu'a coté on a bien un LSR ??!!

quel idée d'avoir appeler l'instruction ASL "ARITHMÉTIQUE"
elle n'a rien d'arithmétique !
lda #$80
sec
asl A
résultat A = 0
super, donc c'est exactement le comportement d'un LSL, alors pourquoi avoir appeler ça ASL ?? alors qu'a coté on a bien un LSR ??!!
- touko
- NECromancer
- Messages : 2297
- Inscription : lun. 31 mars 2008 14:32
Re: ASR ???!
Pour ASRW
tu fais
lsr ma_var+1
ror ma_var
Normal, seul ROR et ROL (rotate, c'est clair pourtant
) prennent compte la retenue ..
ASL et LSR ne font que du décalage de bit .
tu fais
lsr ma_var+1
ror ma_var
Code : Tout sélectionner
lda #$80
sec
asl A
résultat A = 0ASL et LSR ne font que du décalage de bit .
- Orion_
- NECstasien
- Messages : 217
- Inscription : mer. 11 juil. 2007 20:56
- Localisation : Perpignan
- Contact :
Re: ASR ???!
je crois que tu n'a pas compris.
a tu déjà programmer sur autre chose qu'un processeur 8bits ?
sur un proc 16bits (au hasard le 68000)
LSR = décalage de bit sans prise en compte du bit de poids fort (Exemple: LSR de $8000 donnerais $4000)
ASR = décalage de bit AVEC prise en compte du bit de poids fort (Exemple: ASR de $8000 donnerais $C000)
ROR = rotation de bit, sans prise en compte du carry (Exemple: Si Carry = 1, ROR de $0040 donnerais $0020)
Tel que je le comprend maintenant, ça semble différente sur 6502 car on ne peu faire plus d'un décalage par instruction, d'ou la logique du ROR qui décale dans le Carry puis reprendre le carry pour la prochaine rotation.
mais encore faut il le savoir.
ce que j'entends donc par ASRW pour ma par, c'est une prise en compte du bit de poids fort afin de conserver le signe négatif. (ce qui n'est pas le cas avec la macro que tu me propose)
a tu déjà programmer sur autre chose qu'un processeur 8bits ?
sur un proc 16bits (au hasard le 68000)
LSR = décalage de bit sans prise en compte du bit de poids fort (Exemple: LSR de $8000 donnerais $4000)
ASR = décalage de bit AVEC prise en compte du bit de poids fort (Exemple: ASR de $8000 donnerais $C000)
ROR = rotation de bit, sans prise en compte du carry (Exemple: Si Carry = 1, ROR de $0040 donnerais $0020)
Tel que je le comprend maintenant, ça semble différente sur 6502 car on ne peu faire plus d'un décalage par instruction, d'ou la logique du ROR qui décale dans le Carry puis reprendre le carry pour la prochaine rotation.
mais encore faut il le savoir.
ce que j'entends donc par ASRW pour ma par, c'est une prise en compte du bit de poids fort afin de conserver le signe négatif. (ce qui n'est pas le cas avec la macro que tu me propose)
- MooZ
- Administrateur
- Messages : 2090
- Inscription : jeu. 16 déc. 2004 14:25
- Contact :
Re: ASR ???!
Hum... Il y a un saut de génération entre le 6502 et le 68000. Tu me diras le 6809 est un proc 8bit avec la multiplication en hard et co. Bon après on part dans des considérations du type, quel est le prix des IPs, la techno la plus répandue, etc...
Sinon pour la prise en compte du poids fort...
Pour le décalage a gauche c'est plus funky.
Eh ouais, vu que ce sont des nombres signés les valeurs max vont de -128 à 127 (si je ne raconte pas de conneries). Le 7ème bit des nombres positifs sera donc toujours à 0.
Sinon pour la prise en compte du poids fort...
Code : Tout sélectionner
lsr.s:
cmp #$80
ror A
rtsCode : Tout sélectionner
asl.s:
asl A
bcc .clear_bit7
ora #$80
rts
.clear_bit7:
and #$7f
rts- touko
- NECromancer
- Messages : 2297
- Inscription : lun. 31 mars 2008 14:32
Re: ASR ???!
Oui c'est ce que je te dis, c'est différent .Tel que je le comprend maintenant, ça semble différente sur 6502 car on ne peu faire plus d'un décalage par instruction, d'ou la logique du ROR qui décale dans le Carry puis reprendre le carry pour la prochaine rotation.
C'est pas parce que tu as l'habitude que ça se passe comme ça sur 68000 que c'est forcement mieux,c'est différent (mieux dans certains cas , moins bien dans d'autres) .
Un mec qui passe du 6502 au 68000 trouvera aussi plein de choses stupides, car différentes de ses habitudes .
Et l'avantage de ce système c'est de pouvoir faire des tests de bit rapides
ASL/LSR ma_var
BCC/BCS label
Non effectivement, je t'ai proposé un ASRW classique non signé, mais le signe n'était pas dans l'énoncé de départce que j'entends donc par ASRW pour ma par, c'est une prise en compte du bit de poids fort afin de conserver le signe négatif. (ce qui n'est pas le cas avec la macro que tu me propose)
Et comme le décalage/rotation sans prise en compte du bit 7 n'existe pas sur 6502.
Après faut voir pourquoi tu veux conserver le signe, peut être qu'il y à une solution plus simple que l'exemple de mooz .
Je plussois, j'ai jamais compris pourquoi non plus .super, donc c'est exactement le comportement d'un LSL, alors pourquoi avoir appeler ça ASL ?? alors qu'a coté on a bien un LSR ??!!
- MooZ
- Administrateur
- Messages : 2090
- Inscription : jeu. 16 déc. 2004 14:25
- Contact :
Re: ASR ???!
OK! Voilà une version en temps constant avec du code en RAM.
Je peux faire encore plus simple 
Code : Tout sélectionner
asl.w:
and #$5f
asl A
sta .l+1
cla
ror A
.l: adc #$00
rts- touko
- NECromancer
- Messages : 2297
- Inscription : lun. 31 mars 2008 14:32
Re: ASR ???!
Tu es sur que tu fais un aslw là ???
Surtout que c'est un asrw qu'il veut
Surtout que c'est un asrw qu'il veut
Dernière modification par touko le mar. 01 juil. 2014 14:46, modifié 3 fois.
- Orion_
- NECstasien
- Messages : 217
- Inscription : mer. 11 juil. 2007 20:56
- Localisation : Perpignan
- Contact :
Re: ASR ???!
je vois pas l'interet d'un ASL vu qu'on veut de toute façon dégager les bit du haut 
pour asrw j'en ai besoin car j'ai une virgule fixe qui peut être négative (accélération verticale dans un jeu de plateforme, donc saut = accélération Y négative)
pour asrw j'en ai besoin car j'ai une virgule fixe qui peut être négative (accélération verticale dans un jeu de plateforme, donc saut = accélération Y négative)
- touko
- NECromancer
- Messages : 2297
- Inscription : lun. 31 mars 2008 14:32
Re: ASR ???!
Ok, ça,ça peut faire l'affaire (si je me suis pas planté lol) ..
Cependant pourquoi une accélération sur 16 bit,c'est pas un peu surdimensionné ???
Pas moyens de t'en sortir avec une accélération de +/- 127 ???
Code : Tout sélectionner
; // ASRW signé
asrw_s .macro
lda /1 + 1
tax
and #$80
sax
lsr a
ror /1
cpx #1
bne .reg_a_pos
ora #$80
.reg_a_pos:
sta /1 + 1
.endm
Pas moyens de t'en sortir avec une accélération de +/- 127 ???
Dernière modification par touko le mar. 01 juil. 2014 15:22, modifié 3 fois.
- MooZ
- Administrateur
- Messages : 2090
- Inscription : jeu. 16 déc. 2004 14:25
- Contact :
Re: ASR ???!
Ah non c'est un aslb.s pour shifter un entier signé.
Sinon voilà un aslw.s en macro:
Sinon voilà un aslw.s en macro:
Code : Tout sélectionner
aslw.s .macro
lda \1+1
asl \1
rol A
and #$7f
bcc .pos_\@
ora #$80
.pos_\@:
sta \1+1
.endm- touko
- NECromancer
- Messages : 2297
- Inscription : lun. 31 mars 2008 14:32
Re: ASR ???!
Code : Tout sélectionner
; // Macro ASRW_S 1.1
asrw_s .macro
lda /1 + 1
and #$80
lsr /1 + 1
ror /1
ora /1 + 1
sta /1 + 1
.endm
31 cycles si /1 est ram et 26 si /1 est ZP
Dernière modification par touko le mar. 01 juil. 2014 15:38, modifié 1 fois.
- MooZ
- Administrateur
- Messages : 2090
- Inscription : jeu. 16 déc. 2004 14:25
- Contact :
Re: ASR ???!
Si tu veux doubler le dernier bit un simple cmp #$80 suffit. Si A >= $80, le carry flag vaudra 1.
Code : Tout sélectionner
; // Macro ASRW_S 1.1
asrw_s .macro
lda /1 + 1
cmp #$80
ror /1 + 1
ror /1
.endm