Page 1 sur 2

ASR ???!

Publié : lun. 30 juin 2014 19:31
par Orion_
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

Re: ASR ???!

Publié : lun. 30 juin 2014 19:59
par touko
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 .

Re: ASR ???!

Publié : lun. 30 juin 2014 20:12
par Orion_
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

Re: ASR ???!

Publié : lun. 30 juin 2014 20:21
par Orion_
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 ??!!
:raleur: :raleur: :evil:

Re: ASR ???!

Publié : lun. 30 juin 2014 20:42
par touko
Pour ASRW
tu fais
lsr ma_var+1
ror ma_var

Code : Tout sélectionner

lda	#$80
sec
asl	A
résultat A = 0
Normal, seul ROR et ROL (rotate, c'est clair pourtant :P ) prennent compte la retenue ..
ASL et LSR ne font que du décalage de bit .

Re: ASR ???!

Publié : mar. 01 juil. 2014 09:02
par Orion_
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)

Re: ASR ???!

Publié : mar. 01 juil. 2014 09:30
par MooZ
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...

Code : Tout sélectionner

lsr.s:
    cmp    #$80
    ror    A
    rts
Pour le décalage a gauche c'est plus funky.

Code : Tout sélectionner

asl.s:
    asl    A
    bcc   .clear_bit7
        ora    #$80
        rts
.clear_bit7:
        and    #$7f
        rts
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.

Re: ASR ???!

Publié : mar. 01 juil. 2014 11:47
par touko
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.
Oui c'est ce que je te dis, c'est différent .
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
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)
Non effectivement, je t'ai proposé un ASRW classique non signé, mais le signe n'était pas dans l'énoncé de départ :P
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 .
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 ??!!
Je plussois, j'ai jamais compris pourquoi non plus .

Re: ASR ???!

Publié : mar. 01 juil. 2014 13:45
par MooZ
OK! Voilà une version en temps constant avec du code en RAM.

Code : Tout sélectionner

asl.w:
    and    #$5f
    asl    A
    sta   .l+1
    cla
    ror    A
.l: adc    #$00
    rts
Je peux faire encore plus simple :D

Re: ASR ???!

Publié : mar. 01 juil. 2014 13:54
par touko
Tu es sur que tu fais un aslw là ???
Surtout que c'est un asrw qu'il veut :mrgreen:

Re: ASR ???!

Publié : mar. 01 juil. 2014 14:19
par Orion_
je vois pas l'interet d'un ASL vu qu'on veut de toute façon dégager les bit du haut :D

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)

Re: ASR ???!

Publié : mar. 01 juil. 2014 14:44
par touko
Ok, ça,ça peut faire l'affaire (si je me suis pas planté lol) ..

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
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 ???

Re: ASR ???!

Publié : mar. 01 juil. 2014 15:09
par MooZ
Ah non c'est un aslb.s pour shifter un entier signé.
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

Re: ASR ???!

Publié : mar. 01 juil. 2014 15:29
par touko

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
Par contre niveau cycles c'est :?
31 cycles si /1 est ram et 26 si /1 est ZP

Re: ASR ???!

Publié : mar. 01 juil. 2014 15:37
par MooZ
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