C64 6510 - tester 1 bit
Modérateurs : Papy.G, fneck, Carl
C64 6510 - tester 1 bit
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)
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 ?
Est ce que l'on peut enregistrer de la musique classique sur une cassette Metal ?
Re: C64 6510 - tester 1 bit
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).
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).
Re: C64 6510 - tester 1 bit
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
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
Re: C64 6510 - tester 1 bit
Merci pour ces réponses.
C'était simple et logique, je me complique la vie
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 ?
Est ce que l'on peut enregistrer de la musique classique sur une cassette Metal ?
Re: C64 6510 - tester 1 bit
Par contre je ne sais pas comment fonctionne BIT sur C64, probablement comme sur Thomson, un truc un peu loufoque
Re: C64 6510 - tester 1 bit
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).
Re: C64 6510 - tester 1 bit
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...)
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 ?
Est ce que l'on peut enregistrer de la musique classique sur une cassette Metal ?
Re: C64 6510 - tester 1 bit
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
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
Re: C64 6510 - tester 1 bit
Oui, Merci, et une synthèse ici
https://www.c64-wiki.com/wiki/Processor_Status_Register
https://www.c64-wiki.com/wiki/Processor_Status_Register
Franck
Est ce que l'on peut enregistrer de la musique classique sur une cassette Metal ?
Est ce que l'on peut enregistrer de la musique classique sur une cassette Metal ?
Re: C64 6510 - tester 1 bit
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)
Re: C64 6510 - tester 1 bit
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.