Envoyer un e-mail à Collection ThomsonCollection Thomson
EditoForum 2002Liens
Nanoreseau
Docs
Logiciels
Matériel
Imprimer le documentLes cours d'assembleur de Prehis-To
Retour à la liste

Initiation à l’assembleur 6809

Exemples de programmes

Agrandissement d’un caractère affichable

Proposons-nous d’agrandir un caractère affichable sur l’écran selon les modalités suivantes :

  • Le caractère à afficher se trouvera en haut à gauche de l’écran.
  • Le caractère agrandi pourra être dimensionné à volonté et sera centré sur l’écran.
  • Pour avoir tel ou tel caractère à l’écran, il suffira de frapper la touche du caractère au clavier.
  • On sortira du programme en tapant sur la barre espace.

Pour que le caractère agrandi soit au milieu de l’écran, il faut positionner le premier pavé de telle sorte qu’il se trouve à la moitié de l’écran moins la moitié du caractère agrandi. La formule pour l’abscisse X0 sera donc 160-(XSIZ*4), puisque le caractère agrandi comporte 8 pavés en largeur et la formule pour l’ordonnée Y0 sera donc 100-(YSIZ*4), puisque le caractère agrandi comporte 8 pavés en hauteur. Les étiquettes sont en première colonne, le programme TO en 2ème colonne, le programme MO en 3ème colonne et les commentaires en 4ème colonne :

  XSIZ  | EQU    24             | EQU    24             | Largeur d’un pavé (maximum 38)
  YSIZ  | EQU    24             | EQU    24             | Hauteur d’un pavé (maximum 24)
  X0    | EQU    160-(XSIZ*4)   | EQU    160-(XSIZ*4)   | Abscisse du premier pavé
  Y0    | EQU    100-(YSIZ*4)   | EQU    100-(YSIZ*4)   | Ordonnée du premier pavé
  * Initialise l'écran
  DEBUT | LDU    #MSIN          | LDU    #MSIN          | Pointe sur la séquence d’initialisation
        | BSR    AFFM           | BSR    AFFM           | Exécute la séquence d’initialisation
  * Initialise le tracé
        | CLR    $6041          | CLR    $2036          | Demande le mode graphique
        | LDB    #0             | LDB    #0             | | Couleur 0 pour couleur de trait (on
        | STB    $6038          | STB    $2029          | | aurait pu écrire CLRB plutôt que LDB #0)
  * Préparation des registres
        | LDX    #X0            | LDX    #X0            | Charge l’abscisse du point de départ
        | LDY    #Y0            | LDY    #Y0            | Charge l’ordonnée du point de départ
        | LDU    #$4000         | LDU    #$0000         | Charge le pointeur du caractère sur l’écran
  * Programme d'affichage
  B0    | SET    *              | SET    *              |
        | LDB    $E7C3          |                       | | La RAMA doit être constamment
        | ORB    #$01           |                       | | réactivée puisque les routines de traçage
        | STB    $E7C3          | CALL   $06            | | de point et de ligne forcent en RAMB
        | LDB    ,U             | LDB    ,U             | Lit le segment courant
        | LDA    #$08           | LDA    #$08           | 8  segments à lire en tout
  B1    | SET    *              | SET    *              |
        | ASLB                  | ASLB                  | Expulse le bit 7 (se retrouve dans C de CC)
        | BSR    BOXF           | BSR    BOXF           | Affiche un BOXF ou un BOX
        | LEAX   XSIZ,X         | LEAX   XSIZ,X         | Déplace l’abscisse d’une case
        | DECA                  | DECA                  | Nombre de segments - 1
        | BNE    B1             | BNE    B1             | Si nombre de segments <> 0, segment suivant
        | LEAX   -(XSIZ*8),X    | LEAX   -(XSIZ*8),X    | Rétablit l’abscisse au début du pavé
        | LEAY   YSIZ,Y         | LEAY   YSIZ,Y         | Déplace l’ordonnée d’une rangée de cases
        | LEAU   40,U           | LEAU   40,U           | Pointe sur le segment suivant du  caractère
        | CMPU   #$4000+(40*8)  | CMPU   #$0000+(40*8)  | | Si pas dernier segment du caractère
        | BLO    B0             | BLO    B0             | | affiché à l’écran, traite le segment
  * Attente de frappe d'une touche
  WKEY  | JSR    $E806          | CALL   $0A            | Lit le clavier (B = code de touche appuyée)
        | CMPB   #$20           | CMPB   #$20           | Compare au code de touche 32
        | BEQ    EXIT           | BEQ    EXIT           | Si barre espace appuyée, fin du programme
        | BLT    WKEY           | BLT    WKEY           | Si inférieur ou négatif, nouvelle lecture
        | STB    CARAC          | STB    CARAC          | Sinon, initialise le code caractère
        | BRA    DEBUT          | BRA    DEBUT          | ...et affiche le caractère
  EXIT  | SWI                   | STOP                  | Arrêt du programme
  * Affichage d'un BOXF
  BOXF  | PSHS   A,X,Y          | PSHS   A,X,Y          | Empile les registres
        | BCC    BOX            | BCC    BOX            | Si pixel à 0, trace un BOX
        | LDA    #YSIZ+1        | LDA    #YSIZ+1        | Charge hauteur du BOXF
  B0    | SET    *              | SET    *              |
        | JSR    $E80F          | CALL   $10            | Trace le point de départ (X0,Y)
        | LEAX   XSIZ,X         | LEAX   XSIZ,X         | Déplace l’abscisse de la largeur d’un pavé
        | JSR    $E80C          | CALL   $0E            | Trace le segment (X0,Y)-(X1,Y)
        | LEAX   -XSIZ,X        | LEAX   -XSIZ,X        | Retour de l’abscisse en début de pavé
        | LEAY   1,Y            | LEAY   1,Y            | Ordonnée de la ligne en dessous (Y=Y+1)
        | DECA                  | DECA                  | | Pour toute la
        | BNE    B0             | BNE    B0             | | hauteur du pavé
  BOXF0 | PULS   A,X,Y,PC       | PULS   A,X,Y,PC       | Restaure les registres
  * Affichage d'un BOX
  BOX   | JSR    $E80F          | CALL   $10            | Trace le point de départ (X0,Y0)
        | LEAX   XSIZ,X         | LEAX   XSIZ,X         | Déplace l’abscisse à droite du pavé
        | JSR    $E80C          | CALL   $0E            | Trace le segment (X0,Y0)-(X1,Y0)
        | LEAY   YSIZ,Y         | LEAY   YSIZ,Y         | Déplace l’ordonnée en bas du pavé
        | JSR    $E80C          | CALL   $0E            | Trace le segment (X1,Y0)-(X1,Y1)
        | LEAX   -XSIZ,X        | LEAX   -XSIZ,X        | Retour de l’abscisse à gauche du pavé
        | JSR    $E80C          | CALL   $0E            | Trace le segment (X1,Y1)-(X0,Y1)
        | LEAY   -YSIZ,Y        | LEAY   -YSIZ,Y        | Retour de l’ordonnée en haut du pavé
        | JSR    $E80C          | CALL   $0E            | Trace le segment (X0,Y1)-(X0,Y0)
        | PULS   A,X,Y,PC       | PULS   A,X,Y,PC       | Restaure les registres
  * Affichage d'un message
  B0    | SET    *              | SET    *              |
        | JSR    $E803          | CALL   $02            | Envoie le caractère à PUTC$
  AFFM  | LDB    ,U+            | LDB    ,U+            | Lit un caractère
        | BNE    B0             | BNE    B0             | Si pas caractère $00, envoie le caractère
        | RTS                   | RTS                   | Retourne au programme principal
  * Message d'initialisation de l'écran
  MSIN  | FCB    $1F,$20,$20    | FCB    $1F,$20,$20    | | Ouverture maximum
        | FCB    $1F,$12,$14    | FCB    $1F,$12,$14    | | de la fenêtre
        | FCB    $1B,$40        | FCB    $1B,$40        | Couleur 0 pour la forme
        | FCB    $1B,$57        | FCB    $1B,$57        | Couleur 7 pour le fond
        | FCB    $1B,$67        | FCB    $1B,$67        | Couleur 7 pour le tour d’écran
        | FCB    $0C            | FCB    $0C            | Efface l’écran
  CARAC | FCB    32             | FCB    32             | Affiche le caractère en haut à gauche
        | FCB    0              | FCB    0              | - Fin du massage -
        | END                   | END                   | Fin du programme à assembler

Pour rappel, le passage rapide d’une page à l’autre sous éditeur assembleur se fait par les touches HOME et RAZ (SHIFT+HOME).

Chargement d’un secteur de disquette en mémoire

Selon les lecteurs de disquettes, le nombre de face et de pistes peut varier, le nombre de secteurs étant toujours le même pour une piste (16) et le catalogue débutant toujours au même endroit (piste 20/secteur 3). Pour la routine Moniteur de chargement d’un secteur, le code d’opération, le numéro de lecteur, le numéro de piste, le numéro de secteur et le pointeur sur le buffer de secteur doivent être initialisés.

Chargeons le premier secteur du catalogue d’une disquette en mémoire :

  • Le numéro de lecteur sera défini par DRIVE.
  • Le numéro de piste sera défini par TRACK.
  • Le numéro de secteur sera défini par SECT.

Si une erreur survient au chargement du secteur (« NON » au break), le code d’erreur se trouvera dans B.

Il est à noter que l’erreur d’opération disquette est mémorisée par le bit C de CC (0=pas d’erreur/1=erreur). Le test d’erreur en retour de routine Moniteur devra donc être assuré par un « BCC » ou un « BCS ». Libre à vous de pousser le scrupule jusqu’à afficher en toutes lettres un message lors d’une erreur.

Les étiquettes sont en première colonne, le programme TO en 2ème colonne, le programme MO en 3ème colonne et les commentaires en 4ème colonne :

  * Initialisation des valeurs utiles
  DRIVE | EQU    0              | EQU    0              | Numéro de lecteur
  TRACK | EQU    20             | EQU    20             | Numéro de piste
  SECT  | EQU    3              | EQU    3              | Numéro de secteur
  * Programme de chargement du secteur
  DEBUT | LDB    #$02           | LDB    #$02           | | Force en mode
        | STB    $6048          | STB    $2048          | | « lecture de secteur »
        | LDB    #DRIVE         | LDB    #DRIVE         |  | Fixe le numéro
        | STB    $6049          | STB    $2049          |  | de lecteur
        | LDD    #TRACK         | LDD    #TRACK         | | Fixe le numéro
        | STD    $604A          | STD    $204A          | | de piste à lire
        | LDB    #SECT          | LDB    #SECT          |  | Fixe le numéro
        | STB    $604C          | STB    $204C          |  | de secteur à lire
        | LDU    #MEM           | LDU    #MEM           | | Fixe l’adresse de chargement
        | STU    $604F          | STU    $204F          | | du secteur
        | JSR    $E82A          | CALL   $26            | Lit le secteur
        | BCS    ERROR          | BCS    ERROR          | Si erreur, « NON » au break
  OUI   | SWI                   | STOP                  | Pas d’erreur, « OUI » au break
  ERROR | LDB    $604E          | LDB    $204E          | Récupère le numéro de l’erreur
  NON   | SWI                   | STOP                  | Arrêt du programme
  MEM   | RMB    256            | RMB    256            | Buffer pour le secteur à lire
        | END                   | END                   | Fin du programme à assembler
Site
Plus
Forums
Code
Créations

*Site en favoris
*Page en favoris
*Site en démarrage
*Page en démarrage


Haut de page

Collection Thomson 2015 © Ghislain Fournier & François Mouret