J'essaie d'écrire une boucle tandis que lors de l'assemblage avec un processeur 6502 et je ne peux pas comprendre comment écrire le code hexadécimal. J'ai vu des exemples écrits à l'aide du raccourci où il y a une étiquette où la boucle doit commencer et mettre fin, mais je ne vois rien pour le code hexagone réel. p>
Les deux codes que je vois être utiles sont les suivants: p>
4 Réponses :
Voici un endroit pour Vous devez commencer . La page comporte un cross-assembler que vous pouvez exécuter sur votre PC. Que pourrait em> être une bonne plate-forme de développement pour vous. Avant de faire quoi que ce soit, vous devez comprendre la théorie de l'exploitation du 6502. Vous devez alors comprendre le processus de développement logiciel qui inclut: - préparer un "fichier source", ainsi appelé,
des instructions symboliques que vous
appelez "sténographie" Votre exemple de programme tente de copier vous le format comme ceci: p>
- en utilisant un
assembleur, traduire cette source
fichier dans les instructions de la machine qui
Le 6502 comprend
- charger le
Traduction dans le 6502
-- récit
le 6502 pour exécuter la traduite
Instructions de la machine P> len code> octets de mémoire de
src code> à
dst code>. p >
LDX #0 ; Start with the first byte
_LOOP LDA SRC,X ; load a byte from SRC into the A register
STA DST,X ; store that byte into DST
INX ; bump the index register to point to the next SRC and DST locations
CPX #LEN ; have we moved LEN characters?
BNE _LOOP ; if not, go move the next one
Merci, cela aide mais je suis toujours pas clair sur la façon dont quelque chose comme cet exemple de ce site Web: "LDX # 0; Commencez par le premier octet _loop lda src, x; déplacez-le STA dst, x Inx; puis bosse l'index ... Cpx #len; ... jusqu'à ce que nous atteignions la limite BNE _LOOP "peut être représenté dans Hex. L'étiquette _loop est importante dans le sténographie là-bas, mais je ne vois pas comment avoir quelque chose comme ça dans le code de la machine. Désolé, je n'ai aucune idée de la façon de formater ce code.
@jnhyf vous vraiment i> doit diviser votre problème en "Comment puis-je écrire ce code dans le code de machine 6502" et "Comment puis-je puis convertir ce code en notation hexadécimale". Comme il se trouve, il est difficile de vous aider.
@jnhyf - Il y a deux étapes: (1) Écrivez votre programme dans la langue d'assemblage, ce que vous appelez "sténographique" (terme que je n'ai jamais entendu, BTW); (2) Donnez ce fichier de langage de montage à l'assembleur, qui crache ensuite les codes hexagonaux que vous voulez.
Incidemment, les boucles décrémentales sont plus efficaces - elles omettent la nécessité pour les instructions de la comparaison, et aussi bien que ces deux octets sont également n'importe où de 2 à 6 horloges plus rapidement par itération (en fonction du mode de comparaison et d'adressage): LDX #len; Commencez par le dernier octet _loop LDA SRC, X; charger un octet de SRC dans le registre STA DST, X; stocker cet octet dans DST Dex; Bump the Index Register pour pointer vers les emplacements SRC et DST suivants BNE _LOOP; Sinon zéro, allez déplacer le prochain
@jnhyf - une chose que vous semblez être bloquée est l'existence de l'étiquette "_loop" dans le code de montage. Il s'agit simplement d'une directive Assembleur qui représente l'adresse à l'emplacement que l'instruction commence. Il n'est pas assemblé dans quoi que ce soit dans le code de la machine qui est sorti sur le point, il est défini. Lorsqu'il est utilisé dans le cadre d'un opérande (c'est-à-dire, les arguments aux instructions de l'assemblée), il est remplacé par l'adresse de l'instruction qu'il est au moment de la définition. Sur le 6502, il est écrit d'abord de la première fois d'octet significatif - 0300 $ est écrit "00 03" dans le code de la machine.
A avec 6502, rien de tout cela ne sera extrêmement simple que si vous pouvez gagner beaucoup d'hypothèses. Si la condition que vous testez est toujours un registre, les instructions de comparaison (CMP, CPX, CPX, CPC) et les instructions de la branche sont évidemment ce dont vous avez besoin pour 1. P>
Si cela sera un octet unique stocké en mémoire, vous devez charger cet octet, puis comparez-le. P>
S'il s'agit d'une valeur de 16 bits stockée en deux octets, vous devez charger et tester chaque valeur de l'octet. P>
traiter avec des flotteurs? Si vous avez écrit ou que vous avez à votre disposition, un package à point flottant (tel que les routines de point de base de commodore 64 roms), vous devez les utiliser. P>
Vous pouvez voir pourquoi les langages de haut niveau ont des types de données. P>
Donc vraiment, cela dépend du type de données que vous abordez, mais toute mise en œuvre de Le cas spécifique que vous identifiez dans votre question est correct si vous connaissez les données que vous allez comparerez toujours en X et que votre destination sera toujours + 127 / -128 octets (limite de portée des instructions BXX). p> pendant que code> signifie vraiment: p>
pendant code> en 6502 devrait suivre à peu près ce qui précède. p>
Les instructions de la branche prennent une adresse relative signée monte-octet, qui est ajoutée à l'adresse de la prochaine instruction pour donner la cible de la branche. Étant donné que l'instruction de succursale occupe toujours 2 octets, l'adresse cible est l'adresse de l'instruction de branche plus l'opérande (Signé-étendu) moins 2. P>
Exemples:
$ d0 $ 00 code>: no-op: la succursale va à l'instruction suivante, quelle que soit l'état
$ d0 $ Fe code>: points de branche retour à soi-même, créant une boucle infinie si
z = 0 code>. p>.
Uppote pour décoder et répondre à la question mal formulée. ; -)
Voici un exemple montrant la correspondance entre l'assemblage (ce que vous appelez "sténographie") et code machine. Premièrement, voici le code d'assemblage pour l'algorithme, avec certains paramètres abstraits:
4000 LDX #LEN A2 0A 4002 LOOP LDA SRC,X BD 34 12 4005 STA DEST,X 9D 78 56 4008 DEX CA 4009 BNE LOOP D0 F7 400B
Pourquoi voulez-vous des codes hexagonaux au lieu d'utiliser un assembleur?
@jnhyf "Code hexdecimal"? Quel IDE, assembleur ou compilateur utilisez-vous? Quelle expérience avec 6502 assemblée avez-vous déjà?
J'espère que vous ne nous indiquez pas que vous écrivez un programme 6502 sans utiliser d'assembleur. Qu'utilisez-vous pour un système de développement? Une pomme ][ ? Ou quoi?
Essayer d'écrire un compilateur qui génère un code hexagonal afin qu'il puisse être exécuté sur un microprocesseur simulé de 6502.
Il peut utiliser un entraîneur à microprocesseur (par exemple, innovision-group.net/catalog/images/... ). Ce sont des ordinateurs simples que vous programmez directement dans le code de la machine. Vous pouvez toujours utiliser un assembleur pour générer le code de la machine, mais vous devez toujours entrer manuellement le code de la machine dans le système.
Oui, sauf au lieu d'une machine distincte, elle est simulée dans une page Web. Le code imprime le code hexagonal copié dans le système.