9
votes

Écrire une boucle tandis que

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.

Les deux codes que je vois être utiles sont les suivants:

  1. Comparaison d'un octet en mémoire au X REG (sténographie: CPX, hexagonal: CE). Cela définit le drapeau Z à zéro s'il est égal et
  2. branche x octets si z drapeau = 0 (sténographie: BNE, hex: d0)

6 commentaires

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.


4 Réponses :


6
votes

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

Votre exemple de programme tente de copier len code> octets de mémoire de src code> à dst code>. p >

vous le format comme ceci: 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


5 commentaires

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



1
votes

A pendant que signifie vraiment:

  1. Testez une condition
  2. Si la condition est fausse, allez à 5
  3. faire quelque chose
  4. retourne à 1 (un simple JMP ou une branche)
  5. reste du programme

    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.

    Si cela sera un octet unique stocké en mémoire, vous devez charger cet octet, puis comparez-le.

    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.

    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.

    Vous pouvez voir pourquoi les langages de haut niveau ont des types de données.

    Donc vraiment, cela dépend du type de données que vous abordez, mais toute mise en œuvre de pendant en 6502 devrait suivre à peu près ce qui précè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).


0 commentaires

2
votes

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.

Exemples:
$ d0 $ 00 : no-op: la succursale va à l'instruction suivante, quelle que soit l'état
$ d0 $ Fe : points de branche retour à soi-même, créant une boucle infinie si z = 0 . .


1 commentaires

Uppote pour décoder et répondre à la question mal formulée. ; -)



3
votes

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


0 commentaires