Section courante

A propos

Section administrative du site

Directives assembleur

Les directives assembleur (aussi appelées pseudo-instructions ou pseudo-opcodes) ne génèrent pas de code machine directement mais contrôlent le processus d'assemblage : définition de données, organisation mémoire, symboles, macros et génération de listing.

Cette page documente les directives supportées par l'assembleur 6502 comme par exemple l'ASM6502.PAS inclus dans le projet DEV-COOLS. Les conventions de syntaxe sont proches de celles des assembleurs Motorola et Atari, avec des synonymes provenant de différentes traditions (Motorola, MOS Technology, Commodore, Apple,...).

Vue d'ensemble

Le ASM6502.PAS est un assembleur 6502 a deux passes écrit en Pascal. Il accepte un fichier source en entrée et produit un listing et un fichier objet binaire en sortie.

Syntaxe d'invocation :

ASM6502 [options] fichier_source [options]

L'assembleur effectue :

Format d'une ligne source :

[etiquette] [opcode/directive] [operandes] [; commentaire]

Règles de formatage :

Exemple de programme minimal :

  1.         ORG  $C000        ; adresse de debut
  2. start:  LDA  #$41         ; charger 'A' dans l'accumulateur
  3.         JSR  $FFD2        ; appeler la routine d'affichage
  4.         RTS               ; retour
  5.         END               ; fin du source

Récapitulatif des directives supportées :

Directive Synonymes Type Description
DB FCB, BYTE Données Définir octet(s)
DW FDB, WORD Données Définir mot(s) 16 bits
DS RMB, BLKB Données Réserver de l'espace
FCC - Données Chaîne de caractères
EQU = Contrôle Définir symbole constant
SET - Contrôle Definir symbole modifiable
ORG AORG Contrôle Adresse absolue d'assemblage
RORG - Contrôle Adresse relative d'assemblage
END - Contrôle Fin du source
LIST - Listing Contrôle du listing
OPT - Listing Options de listing
MACRO - Macros Début de définition de macro
ENDM - Macros Fin de définition de macro

Directives de données

DB / FCB / BYTE - Define Byte (Définir octet)

Réservé et initialisé un ou plusieurs octets en mémoire. Les trois mnémoniques sont synonymes :

Mnémonique Convention
DB Notation Intel/Zilog
FCB Form Constant Byte (notation Motorola)
BYTE Notation générique

Syntaxe :

[etiquette] DB valeur[,valeur,...]
[etiquette] FCB valeur[,valeur,...]
[etiquette] BYTE valeur[,valeur,...]

Chaque valeur peut être :

Exemples :

  1. octet1   DB   $41           ; un octet = 65 = 'A'
  2. octets   DB   1,2,3,4,5    ; cinq octets consecutifs
  3. mixte    DB   'A',0,$FF    ; caractere, zero, $FF
  4. chaine   DB   'Hello',0    ; chaine terminee par zero
  5. expr     DB   base+3       ; expression evaluee a l'assemblage
  6. negatif  DB   -1           ; un octet = $FF

Les chaînes entre apostrophes sont décomposées en octets ASCII individuels. Pour inclure une apostrophe dans une chaîne, la doubler : DB 'l''art' produit les octets $6C,$27,$61,$72,$74.

Codage mémoire de DB 'AB',0,$FF :

Adresse Contenu Description
$xxxx $41 'A'
$xxxx+1 $42 'B'
$xxxx+2 $00 zero
$xxxx+3 $FF $FF

DW / FDB / WORD - Define Word (Définir mot 16 bits)

Réservé et initialisé un ou plusieurs mots de 16 bits en mémoire. Les mots sont stockes en format little-endian (octet de poids faible en premier), conformément a l'architecture du 6502.

Les trois mnémoniques sont synonymes :

Réservé et initialisé un ou plusieurs octets en mémoire. Les trois mnémoniques sont synonymes :

Mnémonique Convention
DW Notation Intel/Zilog
FDB Form Double Byte (notation Motorola)
WORD Notation générique

Syntaxe :

[etiquette] DW valeur[,valeur,...]
[etiquette] FDB valeur[,valeur,...]
[etiquette] WORD valeur[,valeur,...]

Chaque valeur est une expression 16 bits (0-65535 ou -32768..32767).

Exemples :

  1. adresse  DW   $C000          ; un mot = $C000
  2. vecteur  DW   start          ; adresse du symbole 'start'
  3. table    DW   sub1,sub2,sub3 ; table de 3 adresses
  4. calcul   DW   fin-debut      ; expression (difference d'adresses)

Codage mémoire de DW $1234,$ABCD :

Adresse Contenu Description
$xxxx $34 octet bas de $1234
$xxxx+1 $12 octet haut de $1234
$xxxx+2 $CD octet bas de $ABCD
$xxxx+3 $AB octet haut de $ABCD

Utilisation typique - table de vecteurs :

  1. ; Table de saut pour un menu a 4 choix
  2. JmpTable:
  3.   DW  Option0        ; adresse du descripteur 0
  4.   DW  Option1        ; adresse du descripteur 1
  5.   DW  Option2        ; adresse du descripteur 2
  6.   DW  Option3        ; adresse du descripteur 3
  7.  
  8. ; Vecteurs d'interruption (a placer a $FFFA)
  9. ORG  $FFFA
  10. DW   NMI_Handler   ; vecteur NMI ($FFFA-$FFFB)
  11. DW   Reset_Handler ; vecteur RESET ($FFFC-$FFFD)
  12. DW   IRQ_Handler   ; vecteur IRQ/BRK ($FFFE-$FFFF)

DS / RMB / BLKB - Define Storage (Réserver de l'espace)

Réservé un bloc de mémoire sans l'initialiser. L'assembleur avance simplement le compteur d'adresses de la taille spécifiée sans générer d'octets dans le fichier de sortie.

Les trois mnémoniques sont synonymes :

Mnémonique Description
DS Define Storage
RMB Reserve Memory Bytes (notation Motorola)
BLKB Block Bytes

Syntaxe :

[etiquette] DS nombre_octets
[etiquette] RMB nombre_octets
[etiquette] BLKB nombre_octets

Le nombre_octets est une expression constante.

Exemples :

  1. buffer   DS   256         ; reserver 256 octets
  2. tampon   RMB  64          ; reserver 64 octets
  3. espace   BLKB 128         ; reserver 128 octets
  4. var1     DS   1           ; reserver 1 octet (variable)
  5. var16    DS   2           ; reserver 2 octets (variable 16 bits)

Dans le listing, DS affiche la taille réservée entre parenthèses au lieu du contenu mémoire :

  1. C100:  (0100)          buffer   DS   256

Notes :

FCC - Form Constant Character string (Chaîne de caractères)

FCC définit une chaîne de caractères en utilisant un délimiteur choisi par le programmeur. Le premier caractère après FCC (et les espaces) sert de délimiteur ; la chaîne se termine au prochain occurrence de ce délimiteur.

Syntaxe :

[etiquette] FCC delimiteur texte delimiteur

Le délimiteur peut être n'importe quel caractère. Les délimiteurs courants sont /, ", |, !,...

Exemples :

  1. msg1   FCC  /Hello, World!/     ; delimiteur '/'
  2. msg2   FCC  "Bonjour"           ; delimiteur '"'
  3. msg3   FCC  |Texte|             ; delimiteur '|'
  4. msg4   FCC  !Test!              ; delimiteur '!'

Pour inclure le caractère délimiteur dans la chaîne, le doubler :

  1. msg5   FCC  /Fichier d//entree/  ; produit : Fichier d/entree

FCC produit un octet par caractère (code ASCII). Contrairement a DB avec une chaîne, FCC ne permet pas de mélanger des valeurs numériques et des caractères dans la même directive.

Codage mémoire de FCC /ABC/ :

Adresse Contenu Description
$xxxx $41 'A'
$xxxx+1 $42 'B'
$xxxx+2 $43 'C'

Utilisation typique :

  1. message  FCC  /Appuyez sur une touche.../
  2.          DB   $0D,$0A,0    ; retour chariot + saut de ligne + zero

Comparaison DB vs FCC :

Directive Avantage Limitation
DB Mélange octets et chaînes Chaînes entre apostrophes
FCC Délimiteur libre Chaînes uniquement

Directives de contrôle

ORG / AORG - Origin (Adresse absolue d'assemblage)

ORG définit l'adresse a laquelle le code ou les données suivants seront assembles. AORG (Absolute Origin) est un synonyme.

Syntaxe :

ORG adresse
AORG adresse

L'adresse est une expression constante (16 bits, $0000-$FFFF).

Exemples :

  1. ORG   $C000          ; assembler a partir de $C000
  2. ORG   $FFFA          ; vecteurs d'interruption
  3.  
  4. ; Programme complet avec ORG
  5.         ORG  $0600         ; zone libre sur beaucoup de systemes
  6. start:  LDA  #$00
  7.         STA  $D020         ; couleur de bordure (C64)
  8.         RTS
  9.         ORG  $FFFC
  10.         DW   start          ; vecteur RESET

Notes :

RORG - Relative Origin (Adresse relative d'assemblage)

RORG définit une adresse relative (offset) pour le code suivant. Le code est généré à la position courante dans le fichier de sortie, mais les références d'adresses sont calculées comme si le code était a l'adresse spécifiée.

Syntaxe :

RORG adresse

Cela permet de générer du code relocalisable étant chargé à une adresse différente de celle d'assemblage.

Exemple :

  1. ; Code assemble dans le fichier a la suite du code precedent,
  2. ; mais avec des adresses calculees pour $8000
  3. RORG  $8000
  4. ; Les references symboliques utiliseront des adresses $8000+

Dans le listing, RORG affiche les deux adresses :

8000 = 0200              RORG  $8000

(adresse logique $8000, position physique $0200 dans le fichier)

EQU / = - Equate (Définir symbole constant)

EQU définit un symbole avec une valeur constante. Le symbole '=' est un synonyme de EQU.

Syntaxe :

etiquette  EQU  expression
etiquette  =    expression

L'étiquette est OBLIGATOIRE (une erreur est générée sinon). La valeur est une expression 16 bits résolue a l'assemblage. Un symbole défini par EQU ne peut PAS être redéfini.

Exemples :

  1. CHROUT   EQU  $FFD2         ; adresse de la routine KERNAL
  2. SCREEN   EQU  $0400         ; adresse de la memoire ecran
  3. BORDER   EQU  $D020         ; registre de couleur bordure
  4. MAXLEN   EQU  80            ; constante numerique
  5. BUFSIZE  EQU  MAXLEN+2      ; expression
  6. CR       =    $0D           ; retour chariot
  7. LF       =    $0A           ; saut de ligne
  8. CRLF     =    CR*256+LF     ; les deux combines

Utilisation typique :

  1. ; Definir les adresses du materiel (Commodore 64)
  2. VIC_BASE EQU  $D000
  3. VIC_CTRL EQU  VIC_BASE+$11  ; registre de controle ($D011)
  4. VIC_RSTR EQU  VIC_BASE+$12  ; registre raster ($D012)
  5. CIA1     EQU  $DC00
  6. CIA2     EQU  $DD00
  7.  
  8. ; Utilisation dans le code
  9.                 LDA  VIC_RSTR       ; lire la position du raster
  10.                 CMP  #$80
  11.                 BNE  wait

Dans le listing, EQU affiche la valeur avec '=' :

          = D020              BORDER   EQU  $D020

Notes :

SET - Définir symbole modifiable

SET est similaire a EQU mais permet de redéfinir le symbole avec une nouvelle valeur plus tard dans le source.

Syntaxe :

etiquette SET expression

Exemples :

  1. compteur SET  0             ; valeur initiale
  2.          DB   compteur      ; genere 0
  3. compteur SET  compteur+1    ; incrementer
  4.          DB   compteur      ; genere 1
  5. compteur SET  compteur+1    ; incrementer encore
  6.          DB   compteur      ; genere 2

Notes :

Comparaison EQU vs SET :

Propriété EQU SET
Redéfinition Interdite Autorisée
Marqueur symbole E S
Usage typique Constantes Compteurs

END - Fin du source

END signale la fin du fichier source. Tout ce qui suit la directive END est ignore par l'assembleur (sauf les directives LIST et OPT).

Syntaxe :

END [adresse_execution]

Si une adresse d'exécution est spécifiée, elle est enregistrée comme point d'entrée du programme dans le fichier objet.

Exemples :

  1. END               ; fin du source, pas d'adresse d'execution
  2. END  start        ; fin du source, execution a 'start'
  3. END  $C000        ; fin du source, execution a $C000

Dans le listing avec adresse d'exécution :

          (C000)              END  $C000

Notes :

Directives de listing

LIST - Contrôle du listing

LIST contrôle la génération du fichier listing pendant l'assemblage (passe 2).

Syntaxe :

LIST ON|OFF|MACRO|NOMACRO

Options :

Option Effet
ON Active la génération du listing
OFF Désactive la génération du listing
MACRO Active le listing des expansions de macros
NOMACRO Désactive le listing des expansions de macros

Exemples :

  1. LIST  OFF             ; desactiver le listing
  2. ; ... code qui ne sera pas liste ...
  3. LIST  ON              ; reactiver le listing
  4.  
  5. LIST  MACRO           ; montrer l'expansion des macros
  6. ; ... appels de macros avec expansion visible ...
  7. LIST  NOMACRO         ; masquer l'expansion des macros

Notes :

OPT - Options de listing

OPT est une directive alternative pour contrôler le listing, compatible avec la syntaxe Motorola.

Syntaxe :

OPT LIST|NOLIST

Options :

Option Effet
LIST Active la génération du listing (= LIST ON)
NOLIST Désactive la génération du listing (= LIST OFF)

Exemples :

  1. OPT  NOLIST           ; desactiver le listing
  2. ; ... tables de donnees volumineuses ...
  3. OPT  LIST             ; reactiver le listing

Notes :

Comparaison LIST vs OPT :

Fonctionnalité LIST OPT
Activer listing LIST ON OPT LIST
Désactiver listing LIST OFF OPT NOLIST
Activer macros LIST MACRO (non supporté)
Désactiver macros LIST NOMACRO (non supporté)

Macros (MACRO, ENDM)

MACRO - Début de définition de macro

MACRO définit une macro-instruction qui peut être ensuite appelée comme un opcode ordinaire. Lors de l'appel, le corps de la macro est expanse (substitue) dans le code source.

Syntaxe :

nom  MACRO  [param1[,param2[,...]]]
     ; corps de la macro (instructions et directives)
     ENDM

Le nom de la macro est l'étiquette de la ligne MACRO. Les paramètres sont des noms symboliques qui seront remplaces par les arguments lors de l'appel.

Exemple de définition :

  1. ; Macro pour charger un mot 16 bits dans A:X
  2. LOAD16  MACRO  addr
  3.         LDA    addr       ; octet bas dans A
  4.         LDX    addr+1     ; octet haut dans X
  5.         ENDM
  6.  
  7. ; Macro pour sauvegarder un mot 16 bits
  8. STORE16 MACRO  addr
  9.         STA    addr       ; stocker octet bas
  10.         STX    addr+1     ; stocker octet haut
  11.         ENDM

Utilisation (appel de macro) :

  1. LOAD16  $0080             ; expanse en LDA $0080 / LDX $0081
  2. STORE16 $0082             ; expanse en STA $0082 / STX $0083

Paramètres de macros

Les paramètres sont substitues textuellement lors de l'expansion. Chaque occurrence du nom de paramètre dans le corps de la macro est remplacée par l'argument correspondant.

Exemple avec plusieurs paramètres :

  1. ; Macro pour additionner deux octets et entreposer le resultat
  2. ADD_STORE MACRO  src1,src2,dest
  3.           CLC
  4.           LDA    src1
  5.           ADC    src2
  6.           STA    dest
  7.           ENDM
  8.  
  9. ; Appel
  10. ADD_STORE  score_lo,bonus_lo,total_lo
  11.  
  12. ; Se developpe en :
  13. ;         CLC
  14. ;         LDA    score_lo
  15. ;         ADC    bonus_lo
  16. ;         STA    total_lo

Règles :

ENDM - Fin de définition de macro

ENDM signale la fin du corps de la macro. Un ENDM sans MACRO correspondant génère une erreur.

Notes sur les macros :

Exemple complet avec macros

  1. ; Definir des macros utilitaires
  2. PUSH_AXY MACRO
  3.          PHA
  4.          TXA
  5.          PHA
  6.          TYA
  7.          PHA
  8.          ENDM
  9.  
  10. PULL_AXY MACRO
  11.          PLA
  12.          TAY
  13.          PLA
  14.          TAX
  15.          PLA
  16.          ENDM
  17.  
  18. INC16    MACRO  var
  19.          INC    var
  20.          BNE    @skip
  21.          INC    var+1
  22. @skip
  23.          ENDM
  24.  
  25. ; Utilisation dans le code
  26.          ORG    $C000
  27. handler: PUSH_AXY           ; sauvegarder les registres
  28.          INC16  counter     ; incrementer un compteur 16 bits
  29.          PULL_AXY           ; restaurer les registres
  30.          RTS
  31.  
  32. counter: DW     0
  33.          END

Étiquettes et symboles

Étiquettes standard

Une étiquette est un nom symbolique associe a une adresse mémoire. Elle commence en colonne 1 de la ligne source et peut être suivie de ':' (optionnel).

Syntaxe :

etiquette opcode operande
etiquette: opcode operande

Règles de nommage :

Exemples :

  1. start    LDA #$00        ; 'start' = adresse de cette instruction
  2. loop:    INX             ; 'loop' = adresse de cette instruction
  3. data     DB  1,2,3       ; 'data' = adresse du premier octet
  4. _temp    DS  4           ; '_temp' est une etiquette valide

Une étiquette seule sur une ligne (sans opcode) est valide :

  1. ma_routine
  2.  PHA              ; 'ma_routine' = adresse du PHA
  3.  ; ...
  4.  RTS

Étiquettes locales (@)

Les étiquettes commençant par '@' sont des étiquettes locales. Elles sont automatiquement préfixées par la dernière étiquette globale rencontrée, ce qui évite les conflits de noms.

Syntaxe :

@nom_local

Mécanisme interne : si la dernière étiquette globale est 'ROUTINE', alors '@loop' est stocke comme 'ROUTINE@loop' dans la table des symboles.

Exemple :

  1. routine1
  2.          LDX  #$10
  3. @loop    DEX              ; stocke comme 'routine1@loop'
  4.          BNE  @loop       ; reference 'routine1@loop'
  5.          RTS
  6.  
  7. routine2
  8.          LDY  #$20
  9. @loop    DEY              ; stocke comme 'routine2@loop'
  10.          BNE  @loop       ; reference 'routine2@loop'
  11.          RTS

Sans étiquettes locales, il faudrait utiliser des noms différents (loop1, loop2) pour éviter l'erreur de définition multiple.

Table des symboles

L'assembleur maintient une table des symboles contenant :

La table des symboles est affichée à la fin du listing, triée par ordre alphabétique :

NOM_SYMBOLE     VALEUR  FLAGS
--------------- ------  -----
BORDER          D020    E        ; E = symbole EQU
COMPTEUR        0003    S        ; S = symbole SET
HANDLER         C000             ; (pas de flag = etiquette)
INCONNU         0000    U        ; U = non defini (erreur)
MULTI           C010    M        ; M = definition multiple

Drapeaux :

Expressions et opérateurs

L'assembleur supporte des expressions arithmétiques et logiques dans les opérandes et les directives. Les expressions sont évaluées en arithmétique 16 bits signée.

Opérateurs arithmétiques

Opérateur Précédence Description Exemple
- (unaire) Négation -1 = $FFFF
+ (unaire) Positif (no-op) +5 = 5
~ (unaire) Complément a un ~$FF = $FF00
* haute Multiplication 3*4 = 12
/ haute Division entière 10/3 = 3
% haute Modulo (reste) 10%3 = 1
+ basse Addition $10+$20 = $30
- basse Soustraction $20-$10 = $10

Opérateurs binaires (bit a bit)

Opérateur Précédence Description Exemple
& très basse ET binaire (AND) $FF&$0F = $0F
| très basse OU binaire (OR) $F0|$0F = $FF
<< très basse Décalage a gauche $01<<4 = $10
>> très basse Décalage a droite $80>>4 = $08

Opérateurs de sélection d'octet (unaires)

Opérateur Description Exemple
< Octet de poids faible (low) <$1234 = $34
> Octet de poids fort (high) >$1234 = $12

Ces opérateurs sont essentiels pour charger les parties basse et haute d'une adresse 16 bits dans des registres 8 bits :

  1. LDA  #<adresse     ; charger l'octet bas de 'adresse' dans A
  2. LDX  #>adresse     ; charger l'octet haut de 'adresse' dans X

Exemple complet :

  1. ptr      EQU  $80          ; pointeur en page zero
  2. target   EQU  $C000        ; adresse cible
  3.  
  4. ; Initialiser le pointeur 16 bits
  5.          LDA  #<target     ; A = $00 (octet bas de $C000)
  6.          STA  ptr          ; stocker l'octet bas
  7.          LDA  #>target     ; A = $C0 (octet haut de $C000)
  8.          STA  ptr+1        ; stocker l'octet haut

Symbole special : compteur d'adresses

Les symboles '.' (point) et '*' (étoile) représentent la valeur courante du compteur d'adresses (location counter).

Exemples :

  1. HERE     EQU  *           ; HERE = adresse courante
  2. LENGTH   EQU  *-start     ; longueur depuis 'start'
  3.  
  4. ; Boucle infinie
  5. loop     JMP  *           ; sauter a soi-meme (= JMP loop)
  6.  
  7. ; Table avec calcul de taille
  8. table    DB   1,2,3,4,5
  9. tablen   EQU  *-table     ; tablen = 5

Note : '*' en colonne 1 est un commentaire ; '*' dans une expression est le compteur d'adresses. Le contexte détermine l'interprétation.

Parenthèses

Les parenthèses '(' et ')' permettent de regrouper des sous-expressions pour contrôler l'ordre d'évaluation :

  1. LDA  #(3+4)*2       ; = 14 (sans parentheses : 3+8 = 11)
  2. DB   (fin-debut)/2  ; moitie de la taille

Note : dans le contexte des modes d'adressage du 6502, les parenthèses ont aussi un sens syntaxique (adressage indirect). L'assembleur distingue le contexte selon la position :

  1. LDA  ($80),Y         ; adressage indirect indexe Y
  2. LDA  #($80+$10)      ; expression parenthesee = $90

Ordre de précédence complet

Du plus prioritaire au moins prioritaire :

Les parenthèses outrepassent l'ordre de précédence.

Caractères littéraux

Un caractère entre apostrophes est évalué comme sa valeur ASCII :

  1. LDA  #'A'           ; equivalent a LDA #$41
  2. CMP  #'0'           ; equivalent a CMP #$30
  3. DB   'Z'            ; equivalent a DB $5A

Formats numériques

L'assembleur ASM6502.PAS supporte quatre bases numériques pour les constantes, avec deux notations possibles pour chacune (préfixe ou suffixe).

Décimal (base 10)

Le format par défaut. Pas de préfixe ni suffixe requis, mais le suffixe 'D' peut être utilise pour la clarté.

Syntaxe :

  1. nombre        ; decimal par defaut
  2. nombreD       ; decimal explicite (suffixe D)

Exemples :

  1. LDA  #100            ; decimal implicite
  2. LDA  #100D           ; decimal explicite
  3. DB   0,127,255       ; decimaux implicites
  4. DW   1000            ; decimal implicite
  5. DW   65535           ; valeur maximale 16 bits

Plage : 0 a 65535 (non signe) ou -32768 a 32767 (signe).

Hexadécimal (base 16)

Préfixe '$' (notation Motorola/MOS) ou suffixe 'H'.

Syntaxe :

  1. $nombre       ; prefixe $ (Motorola)
  2. nombreH       ; suffixe H
  3. $             ; sans nombre = compteur d'adresses (locPtr)

Exemples :

  1. LDA  #$FF            ; prefixe $
  2. LDA  #0FFH           ; suffixe H (le 0 initial est recommande)
  3. STA  $D020           ; adresse hexadecimale
  4. DW   $FFFC           ; vecteur RESET
  5. DB   $0A,$0D         ; LF, CR

Notes :

Binaire (base 2)

Préfixe '%' ou suffixe 'B'.

Syntaxe :

  1. %nombre       ; prefixe %
  2. nombreB       ; suffixe B

Exemples :

  1. LDA  #%10110011      ; prefixe %
  2. LDA  #10110011B      ; suffixe B
  3. AND  #%11110000      ; masquer les 4 bits de poids faible
  4. ORA  #%00000001      ; mettre le bit 0 a 1
  5. DB   %01010101       ; motif alterne

Le binaire est particulièrement utile pour :

Octal (base 8)

Suffixe 'O'.

Syntaxe :

  1. nombreO       ; suffixe O

Exemples :

  1. LDA  #377O           ; octal 377 = decimal 255 = $FF
  2. DB   101O            ; octal 101 = decimal 65 = 'A'
  3. DW   177777O         ; octal 177777 = $FFFF

L'octal est rarement utilise en programmation 6502, mais il est supporté pour la compatibilité avec certains sources assembleur historiques.

Récapitulatif des formats numériques

Base Préfixe Suffixe Exemples
Décimal (aucun) D 42, 255, 100D
Hexadécimal $ H $FF, $1234, 0FFH
Binaire % B %10101010, 10101010B
Octal (aucun) O 377O, 101O

Equivalences entre assembleurs

Les différents assembleurs 6502 utilisent des conventions variées pour les formats numériques :

Format ASM6502 ACME CA65 DASM Merlin
Décimal 42 42 42 42 42
Hexadécimal $FF $FF $FF $FF $FF
Binaire %1010 %1010 %1010 %1010 %1010
Octal 377O - - - -
Caractère 'A' 'A' 'A' "A" "A"

La notation préfixe '$' pour l'hexadécimal et '%' pour le binaire est quasi-universelle parmi les assembleurs 6502.



Dernière mise à jour : Mardi, le 24 mars 2026