CODINGAMSLIVE ★ AMSLIVE n°07 - INITIATION ASSEMBLEUR : LES TABLES ★

AMSLIVE n°07 - INITIATION ASSEMBLEUR : LES TABLESCoding Amslive

Pouf Pouf, comme dirait Zik, nous allons parler des tables. C'est vague, direz-vous. Focalisez, vous répondrai-je. Ce n'est pas tant la table qui m'intéresse mais plutôt sa rotation, tout comme tournent des bits dans un octet. Vous allez voir comment optimiser un tantinet la-dite rotation.

LE VIF DU SUJET

Une table, en assembleur, c'est une succession de valeurs. A vrai dire, un assembleur ne reconnaît pas une table : c'est nous qui lui définissons une adresse en RAM qui va nous servir de base de données pour un texte, un raster, une ondulation, un plasma ou que sais-je encore... Donc, on la définira par :

TABLE DB 1,2,3,4,5,6,7,8

ou

TABLE EQU &1A00

et dans ce cas, les valeurs de la table (ici, les nombres de 1 à 8) seront déjà placées en &1A00. Cela revient exactement au même, sauf que... Si votre ondulation (ou votre raster ou...) a une définition de 150 valeurs, allez-vous vous amuser à toutes les saisir sous DAMS ou MAXAM ? Le chargement d'un fichier annexe (binaire) contenant les valeurs, allié à la seconde méthode est alors indispensable.

TOUT VA BIEN

Oui, décidément tout est parfait. Vous avez fait une routine d'ondulation qui s'inspire (heureusement d'ailleurs) de la table de vos rêves. Hélàs, vous souhaitez voir bouger tout ce petit monde à présent. Vers le haut ou le bas, mais que ça bouge. C'est à dire, que toutes les valeurs de la deuxième à la dernière prennent la place de la précédente et que l'ancienne première devienne la dernière.

En deux mots, on voudrait qu'il se passe ce genre de phénomène...

12 3 4 5 6 7 8 puis
2 3 4 5 6 7 8 1 puis
3 4 5 6 7 8 12 puis
4 5 6 7 8 12 3 puis
etc..

Une rotation, quoi.

Alors là, ma p'titc dame, on a plusieurs solutions. La bourrin qui prend plein de temps machine et la délicate, rafinée mais horriblement gourmande en mémoire. Bof... Voyons les deux !

LA METHODE BOURRIN
(dite "méthode SNN")

Elle consisterait à sauvegarder le premier octet de la table, de décaler la totalité de la table d'un octet et de replacer l'octet sauvé en fin de table. Les données du raster partiront toujours de la même adresse (table). Le pointeur est fixe. Simple comme bonjour.

LD A,(TABLE)
LD HL,TABLE+1
LD DE,TABLE
LD BC,LONG-1
LDIR LD,(TABLE+LONG-1),A
...
RASTER LD HL,TABLE
...
TABLE DB 1,2,3,4,5,6,7,8
LONG EQU8

Voilà, c'est tout simple, la dame est contente. Mais elle a pas recompté sa monnaie et elle vient de se faire arnaquer par son boucher habituel : pour un décalage de 100 octets (BC=100), le TM (Temps Machine) pris par LDIR sera de [(BC-1)*6] + 5, soit 599 NOPS. Agrrr ! La bave qui coule le long de ses lèvres ridées, les yeux rouge "terminator" et le dentier aiguisé, la p'tite vieille retourne voir son boucher. Ca va saigner !

DINER MONDAIN CHEZ LES DE CLIGNANCOURT, OU COMMENT FAIRE CE GENRE DE CHOSES AVEC CLASSE...

Son boucher a fini par craquer et par l'envoyer chez les De Glignancourt. Là, au moins, elle apprendra à onduler correctement et proprement, mais aussi avec goût. Quelle femme charmante !
Primo et ça va en surprendre plus d'un, il nous faut deux tables... ou plus exactement deux tables juxtaposées identiques l'une à l'autre (et c'est pour ça que je disais que ça allait prendre de la place). En résumé, il nous faut ça...

1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8

Au début, on lira de 1 à 8 de la table 1. Puis on décalera notre pointeur de façon à lire de 2 (table 1) à 1 (table 2). Puis du 3 (table 1 ) au 2 (table 2) et ainsi de suite. Quand on en sera à lire toutes les valeurs de la table 8, hopopop ! on reviendra sur la table 1. Ce décalage de pointeur sera nettement moins gourmand en TM qu'un décalage complet de la table. C'est exquis.

Tiens, la petite vieille vient de se faire foutre dehors par le majord'homme. C'est sûr qu'avec son cadis, elle fait désordre à coté de ces extraordinaires meubles Louis XV. Ah ! Ils viennent de lâcher les chiens... Bon, pas grave, continuons nos explications...

Pour savoir exactement où on en est, on va utiliser un compteur. La routine, au final, devrait ressembler à ça...

LONG EQU 8
COMPTNOP
; Initialisation
XOR A
LD(COMPT),A
LD HL,TABLE
LD (AUTO+1),HL
; A chaque affichage du raster
LD A,(COMPT)
CP LONG-1
JP Z,DERIV
INC A
LD (COMPT),A
LD HL,(AUTO+1)
INC HL
LD (AUTO+1),HL
JP RASTER
DERIV XOR A
LD (COMPT),A
LD HL,TABLE
LD (AUTO+1),HL
JP RASTER
...
RASTER ...
; Affichage des 8 lignes
AUTO LD HL,0
...
TABLE DB 1,2,3,4,5,6,7,8
TABLE2 DS 8


Ah, j'y pense, vous n'oublierez pas de rajouter ce petit sous-programme quelque part...

LD HL,TABLE
LD DE,TABLE2
LD BC,LONG+1
LDIR

...afin de recopier la première table dans la deuxième (c'est fait une bonne fois pour toutes, et puis ça évite d'encombrer la mémoire de votre assembleur avec 2 tables en ASCII de surcroît).
Je me rends compte que je suis peut-être allé un peu vite, là. Alors, sachez, tout en gonflant le torse, que vous venez de faire une modification interne du programme. Si. N'appelez pas le SAMU, c'est pas trop grave, ça va même vous arriver assez souvent. Cela veut dire que le programme se modifie tout seul. Par exemple, une fois, le programme désassemblé vous donnera :

LD HL,&1A01

puis juste après, vous tomberez sur un :

LD HL,&1A02

Magie ?
Euh... Si vous posez la question, c'est que vraiment, vous n'avez rien compris !
L'instruction LD HL,valeur est codée par les valeurs suivantes : 21 XX XX (d'abord L, puis H) Donc, dans la mémoire nous avons, pour TABLE se trouvant en &3350 :

AUTO ;21
AUTO+1 ;50
AUTO+2 ;33

Si on charge HL avec la valeur &ABCD et qu'on envoie le tout à l'adresse AUTO+1, on aura de la même façon :

AUTO ;21
AUTO+1 ;CD
AUTO+2 ;AB

Ben voilà, vous avez compris cette modification du programme. La première valeur de la table ne sera pas la même d'une fois sur l'autre car le pointeur, HL, est incrémenté à chaque fois.

Après une discussion avec mon rédac'chef, il m'indique qu'il y a moyen d'éviter l'utilisation d'un compteur. Sa méthode est, à l'image de ses articles, d'une simplicité exemplaire... C'est pourquoi je prendrai 14 pages dans le prochain numéro pour tenter de vous l'expliquer...

MONDIEUMONDIEUMONDIEU !

Ciel, je me rends compte que la p'tite vieille bouge encore au fond du jardin. Il faudrait l'achever, ça fait désordre. Les enfants ! Les enfants ! Allez donc faire du 4x4 dans le jardin. Oui, je sais qu'il fait nuit et que d'habitude votre père vous interdit de rouler sur la pelouze, mais là, voyez-vous, c'est "spécial". Vous êtes des coeurs !

Pfiou ! Difficile de dire de quoi nous parlerons la prochaine fois. J'espère que les débutants en assembleur n'auront pas été dégoûtés par un tel manque de rigueur dans les explications et me feront part de leurs difficultés par mail ({snn@tlsc.com) ou bien par courrier, via Madram (voir Contact AFC)

SNN Sous Narin Nucléaire , AMSLIVE n°7

★ ANNÉE: ???
★ AUTEUR: SNN

Page précédente : AMSLIVE n°07 - 3D

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Coding » AMSLIVE n°15 - YM FAIT DU SKI
» Coding » AMSLIVE n°16 - les Gros Ports
» Coding » AMSLIVE n°01 - Rasters
» Coding » AMSLIVE n°07 - SINUS SITE , LA SUITE (2/2)
» Coding » AMSLIVE n°04 - Initiation Au Soundtracker
» Coding » AMSLIVE n°06 - Sinus
Je participe au site:
» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 527 millisecondes et consultée 1544 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.