2016-10-20 2 views
0

Je crée un programme simple qui permet à l'utilisateur de taper entrée, puis quitte le programme lorsque l'utilisateur entre une certaine clé. Cependant, je ne sais pas où aller avec le code que j'ai actuellement ci-dessous:Comment quitter une boucle?

  OBJ $8000 
    KYBD EQU $C000 
    STROBE EQU $C010 
    COUT EQU $FDED 
    HOME EQU $FC58 

    START JSR HOME 
    LOOP LDA KYBD 
      CMP #$80 
      BCC LOOP 
      STA STROBE 
      JSR COUT 
      JMP LOOP 

Merci pour toute aide.

+2

On dirait que vous savez déjà comment faire des comparaisons et des branches conditíonal. Cela devrait suffire à résoudre votre problème. –

Répondre

2

En termes simples, juste tester le contenu .a pour le mot de code que vous souhaitez utiliser pour sortir et se ramifient en cas d'égalité:

 OBJ $8000 
KYBD EQU $C000 
STROBE EQU $C010 
COUT EQU $FDED 
HOME EQU $FC58 

START JSR HOME 
LOOP LDA KYBD 
     CMP #$80 
     BCC LOOP 
     CMP #$<KEYCODE> 
     BEQ EXIT 
     STA STROBE 
     JSR COUT 
     JMP LOOP 
EXIT NOP 
2

Les adresses et le comportement stroboscopique clavier ressembler à un Apple II, donc je vais l'utiliser pour répondre. Pour une question légèrement différente de la réponse du gourou huit bits, voici une version ("A") de votre code qui suppose que vous voulez imprime le caractère clé de fin (puisque c'est souvent Entrée/Retour comme ci-dessous) ce qui rend la boucle plus propre. Vous pouvez également omettre le # CMP 80 $ parce que LDA KYBD fixe N.

START JSR HOME 
LOOP LDA KYBD ;Key pressed? 
     BPL LOOP 
     STA STROBE ;Yes: clear key 
     JSR COUT ;Print key 
     CMP #$8D ;End key? 
     BNE LOOP 
     RTS  ;Yes: return to caller 

Si vous ne souhaitez pas imprimer la touche de fin, vous devriez toujours effacer le stroboscopique avant de quitter:

START JSR HOME 
LOOP LDA KYBD ;Key pressed? 
     BPL LOOP 
     STA STROBE ;Yes: clear key 
     CMP #$8D ;End key? 
     BEQ EXIT 
     JSR COUT ;No: print key 
     JMP LOOP 
EXIT RTS  ;Yes: return to caller 

Le le code de sortie sera spécifique à l'environnement. Par exemple, RTS conviendrait si AppLESoft BASIC était appelé avec CALL 32768, mais si votre programme avait été appelé à partir du système d'exploitation ProDOS Disk, vous auriez besoin d'appeler une API avec la commande QUIT.

Notez que la version "A" ne fonctionne que si COUT préserve le contenu de A, comme dans le firmware Apple II. Garder à l'esprit ce qui est dans chaque registre et quels drapeaux sont modifiés ou laissés intacts après chaque instruction est le moyen de concilier et de compacter le langage d'assemblage.