Données, déclarations et structures

Déclarations de données

CHARSET

CHARSET
CHARSET 'chaine',valeur
CHARSET debut,valeur
CHARSET debut,fin,valeur
CHARSET 'chaine','chaine'
  • Chaine+Valeur, indexer chaque caractère de la chaine en partant de valeur et en incrémentant à chaque caractère
  • Début+Valeur, indexer chaque caractère à partir du code ASCII Début en partant de valeur et en incrémentant à chaque caractère
  • Idem mais de début à fin uniquement
  • Chaine+Chaine, pour établir des correspondances plus facilement (utilisation typique en chiffrement simple)
  • Aucun paramètre, réinitialiser tous les codes ASCII à leur valeur initiale

DB, DEFB, DM, DEFM valeur1, valeur2, valeur3, …

Cette directive prend 1 ou plusieurs paramètres et génère une suite d'octets représentative des paramètres en entrée. Les valeurs peuvent être littérales, une formule, un caractère ou même une chaine de caractères. On utilisera indifféremment DB, DM, DEFB, DEFM. Le code suivant produira la chaine 'Roudoudou'

org #7500
label DEFB 'r'-'a'+'A','oudoud',#6F,hi(label)

STR chaine1, chaine2, …

Cette directive est similaire à DEFB sauf que le dernier caractère produit subit un OR #80 (mis à 1 du bit le plus significatif), surtout utilisée pour gagner 1 octet en déclarant des chaines de caractères. Les deux lignes de code suivantes font exactement la même chose

str 'roudoudou'
defb 'roudoudo','u'|#80

DEFW valeur1,valeur2

Déclaration de valeurs 16 bits, il n'est plus possible d'utiliser des chaines de caractères, mais un caractère unique entre quotes reste toujours possible!

DEFI valeur1,valeur2

Déclaration de valeurs 32 bits, il n'est plus possible d'utiliser des chaines de caractères, mais un caractère unique entre quotes reste toujours possible!

DEFR valeur1,valeur2

Déclaration de valeurs réelles 40 bits du locomotive Basic, il n'est plus possible d'utiliser des chaines de caractères, mais un caractère unique entre quotes reste toujours possible!

DEFF valeur1,valeur2

Déclaration de valeurs réelles 40 bits Microsoft IEEE-754, il n'est plus possible d'utiliser des chaines de caractères, mais un caractère unique entre quotes reste toujours possible!

Déclarations et utilisation de structures

STRUCT nom_du_prototype, nom_de_la_variable / ENDSTRUCT

Quand STRUCT est utilisée avec 1 paramètre (le nom), les labels qui suivent serviront à déclarer la structure, en particulier ses indexes
Quand STRUCT est utilisée avec 2 paramètre (nom_type+nom_struct), une structure est créée de type nom_type et s'appellera nom_struct

Bien que RASM permette de mettre un peu n'importe quoi à l'intérieur de la déclaration d'une structure, l'usage pratique est de déclarer des labels et via les instructions de définition de données, une taille de champ. Il n'est pas nécessaire de renseigner une valeur aux instructions DEF

struct st1
  ch1 defw
  ch2 defb
endstruct

struct metast1
  struct st1 pr1
  struct st1 pr2
endstruct

struct metast1 bigst ; instanciation de metast1 en bigst

ld hl,bigst.pr2.ch1 ; récupération de l'adresse absolue d'un membre de bigst
ld a,(hl)

ld a,(ix+metast1.pr2.ch1 ; utilisation de l'offset du champ via la définition de la structure (pas besoin d'instancier pour cet usage)

préfixe {SIZEOF}

Le préfixe {sizeof} devant un nom de structure, de sous-structure ou devant le champ d'une structure, permet de récupérer sa taille

ld a,{sizeof}metast1 ; LD A,6
ld a,{sizeof}metast1.pr2 ; LD A,3
ld a,{sizeof}metast1.pr2.ch1 ; LD A,2

tableau de STRUCT

Il est possible d'instancier plusieurs fois la même structure, comme s'il s'agissait d'un tableau de structures, de la façon suivante

STRUCT mystruct my_instance,10

Cette façon de faire est différente d'un DEFS 10*{sizeof}mystruct car les données sont initialisées avec les valeurs par défaut si elles ont été définies lors de la déclaration de la structure, à la différence d'un remplissage à zéro. De plus il est possible d'adresse chacun des structures via un index en ajoutant l'index à la fin du nom de l'instance

ld hl,my_instances5 ; récupérer l'adresse de la cinquième structure
Sauf mention contraire, le contenu de cette page est protégé par la licence Creative Commons Attribution-ShareAlike 3.0 License