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

UTF8REMAP 'caractère UTF8','code 8 bits'

Certains caractères UTF8, en particulier les accents, les majuscules accentuées, certains symboles ne sont pas standards. Il est possible d'effecturer un mapping (à la manière de CHARSET) en les déclarant avec cette directive.

Notez qu'il faudra impérativement utiliser l'option de ligne de commande -fq pour que le préprocesseur autorise les caractères spéciaux.

utf8remap 'é',50
defb 'é' ; produira l'octet 50

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)
DEFB 'roudoudou\xFF' ; add hex value #FF at the end of the string

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

Il est possible de déclarer plusieurs chaines à la suite de la directive, chacune aura son marqueur de fin

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

STR supporte les valeurs hexa de type \xFF à l'intérieur des chaines

Il est possible de mélanger des chaines et des expressions. Dans ce cas, le marqueur de fin ne sera pas ajouté à la chaine précédent l'expression

str 'roudou',0+'d','ou'
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

déclaration de STRUCT et initialisation

STRUCT mystruct
field1 defs 10
ENDSTRUCT

STRUCT mystruct my_instance,1,'roudoudou' ; déclare 1 struct et rempli le premier champ avec 'roudoudou', qui sera complété par un zéro car la déclaration était vide
Sauf mention contraire, le contenu de cette page est protégé par la licence Creative Commons Attribution-ShareAlike 3.0 License