C64 6510 - tester 1 bit

C'est le lieu des discussions diverses et variées, mais toujours en rapport avec le thème général du forum et dans l'esprit de celui-ci. Contient des rubriques électroniques.

Modérateurs : Papy.G, fneck, Carl

Répondre
Avatar de l’utilisateur
frktaunus
Messages : 1148
Inscription : 08 mai 2019 11:23
Localisation : LILLE

C64 6510 - tester 1 bit

Message par frktaunus »

bonjour,
je me remet le jeu d'instructions 6510 tout doucement en mémoire.
je me demande comment faire pour tester juste 1 bit dans un octet, afin de décider de la suite du programme à exécuter.
Par exemple j'ai en mémoire un octet "0101?101" et je veux savoir si '?' est à 0 ou à 1.
Faut-il faire 4 ROR et tester le bit Carry ? (BCC / BCS)
Y'a-t-il plus simple et rapide?

(En marge, quelle est l'utilité de la commande BIT)
Franck
Est ce que l'on peut enregistrer de la musique classique sur une cassette Metal ?
Avatar de l’utilisateur
hlide
Messages : 3503
Inscription : 29 nov. 2017 10:23

Re: C64 6510 - tester 1 bit

Message par hlide »

Plusieurs possibilités :

1) AND #$<bitmask_imm> : bitmask_imm = 1 << pos. A modifié et si Z est 1 alors le bit demandé est à 0 sinon à 1. Voir http://www.unusedino.de/ec64/technical/aay/c64/band.htm pour tous les modes d'adressage.
2) AND $<bitmask_var> : Soit A ou $<bitmask_var> contienne le mask du bit demandé. Si Z est 1 alors le bit demandé est à 0 sinon à 1. Voir http://www.unusedino.de/ec64/technical/aay/c64/band.htm pour tous les modes d'adressage.
3) BIT $<bitmask_var> : A n'est pas modifié en sortie. Soit A ou $<bitmask_var> contienne le mask du bit demandé. Si Z est 1 alors le bit demandé est à 0 sinon à 1. Les bit 7 et 6 sont respectivement copiés dans N et V. Voir http://www.unusedino.de/ec64/technical/aay/c64/bbit.htm pour tous les modes d'adressage.

Dans ton cas, utiliser AND #$08 (deux cycles) pour obtenir dans Z l'état du bit serait le plus rapide si tu acceptes la modification de A en sortie ($08 si Z = 0 ou $00 si Z = 1).
jasz
Messages : 1313
Inscription : 05 oct. 2016 20:05
Localisation : Quelque part dans le 31

Re: C64 6510 - tester 1 bit

Message par jasz »

Pourquoi faire des décalages? Et d'ailleurs ce n'est pas des ROR mais des LSR
10101011 ROR donne 11010101
10101011 LSR donne 01010101

1010?010 AND $#08 donne 0000?000. Il suffira de tester l'état du retour par le couple BEQ (égal à 0) ou BNE (non égal à 0) ;)
BCC ou BCS ne sont que des tests de la retenue (carry) dans des opérations comme l'addition, la soustraction ou la multiplication par exemple.
11111111 ADD $#01 donne 00000000 et le carry est égal à 1
00000000 SUB $#01 donne 11111111 et le carry est égal à 1
Avatar de l’utilisateur
frktaunus
Messages : 1148
Inscription : 08 mai 2019 11:23
Localisation : LILLE

Re: C64 6510 - tester 1 bit

Message par frktaunus »

Merci pour ces réponses.
C'était simple et logique, je me complique la vie ;)
Franck
Est ce que l'on peut enregistrer de la musique classique sur une cassette Metal ?
jasz
Messages : 1313
Inscription : 05 oct. 2016 20:05
Localisation : Quelque part dans le 31

Re: C64 6510 - tester 1 bit

Message par jasz »

Par contre je ne sais pas comment fonctionne BIT sur C64, probablement comme sur Thomson, un truc un peu loufoque :roll:
Avatar de l’utilisateur
hlide
Messages : 3503
Inscription : 29 nov. 2017 10:23

Re: C64 6510 - tester 1 bit

Message par hlide »

Absolument pas loufoque, BIT fonctionne comme TEST du 86 : c'est un AND qui n'altère pas l'accumulateur A, juste les flags. On a BIT vs. AND tout comme on a CMP vs. SEC:SBC (pour SUB).
Avatar de l’utilisateur
frktaunus
Messages : 1148
Inscription : 08 mai 2019 11:23
Localisation : LILLE

Re: C64 6510 - tester 1 bit

Message par frktaunus »

re!
j'ai besoin d'une précision avec le "AND"
l'accumulateur est chargé avec le résultat du AND sur lui même. ok.
et je vois dans une doc que que les flag N et Z sont également modifiés. quelle information portent-ils?

(par ce qu'ensuite, les conditions de branchements sont basées sur ces flags, et pas sur l'accumulateur...)
Franck
Est ce que l'on peut enregistrer de la musique classique sur une cassette Metal ?
Avatar de l’utilisateur
hlide
Messages : 3503
Inscription : 29 nov. 2017 10:23

Re: C64 6510 - tester 1 bit

Message par hlide »

Z = 1 si l'accumulateur est à 0
N = 1 si l'accumulateur est négatif

ces flags servent dans les sauts conditionnels : BEQ = saut si Z = 1, BNE = saut si Z = 0, etc.

Voir ici pour les détails : http://unusedino.de/ec64/technical/aay/c64/bmain.htm
Avatar de l’utilisateur
frktaunus
Messages : 1148
Inscription : 08 mai 2019 11:23
Localisation : LILLE

Re: C64 6510 - tester 1 bit

Message par frktaunus »

Franck
Est ce que l'on peut enregistrer de la musique classique sur une cassette Metal ?
jasz
Messages : 1313
Inscription : 05 oct. 2016 20:05
Localisation : Quelque part dans le 31

Re: C64 6510 - tester 1 bit

Message par jasz »

frktaunus a écrit : 15 nov. 2020 12:22 (par ce qu'ensuite, les conditions de branchements sont basées sur ces flags, et pas sur l'accumulateur...)
Oui et non, je dirais.
Quand tu fais par exemple un transfert de l'accumulateur A sur l'accumulateur B les flags N et Z sont aussi impactés. Il est nullement nécessaire de faire le test de B et aller directement aux branchements conditionnés (BEQ, BNE, BLT, BGT etc... sauf BCC et BCS)
Avatar de l’utilisateur
hlide
Messages : 3503
Inscription : 29 nov. 2017 10:23

Re: C64 6510 - tester 1 bit

Message par hlide »

Ben c'est ce que Franck nous dit au final. Les branchements ne lisent que l'un des flags pour conditionner le saut. Ce sont les autres instructions qui peuvent modifier les flags et il ne suffit pas que ce soit dû à un accumulateur : SEC (C <= 1), CLC (C <= 0) par exemple.
Répondre