ACCES MEMOIRE

A. Accès mémoire intra-segment.

C! c adr --- F83

Stocke la valeur huit bits c à l'adresse adr. Exemple:

ASCII A 16384 C!

met la valeur 65 (code ASCII de A) à l'adresse 16384.


C@ adr --- c F83

Dépose sur la pile le contenu huit bits c de l'adresse adr. Exemple:

16384 C@ .

affiche le contenu de l'octet d'adresse 16384.


! n adr --- F83

Affecte la valeur seize bits n à l'élément mémoire pointé par l'adresse adr. Est utilisé notamment pour affecter une valeur à une variable définie par l'utilisateur. Exemples:

55 16384 !
met la valeur 55 dans l'élément seize bits dont l'adresse mémoire commence à l'adresse 16384.
VARIABLE SCORE 10 SCORE !

affecte 10 unités à la variable SCORE précédemment définie.


+! n adr --- F83

Incrémente le contenu de l'adresse adr de la quantité n. Exemple:

VARIABLE SCORE 10 SCORE !
5 SCORE +! SCORE ?     affiche 15

@ adr --- n  

Dépose sur la pile de données la valeur 16 bits n stockée dans l'emplacement mémoire commençant à l'adresse adr. Exemple:

27262 @ .

affiche le contenu de l'adresse 27262


1+! adr ---  

Incrémente de une unité le contenu de l'adresse 16 bits dont la valeur a été préalablement empilée.

VARIABLE SCORE 10 SCORE !
SCORE 1+! SCORE @ .     affiche 11

1-! adr ---  

Décrémente de une unité le contenu de l'adresse 16 bits dont la valeur a été préalablement empilée.

VARIABLE SCORE 10 SCORE !SCORE 1-! SCORE @ .         affiche 9

2! d adr ---  

Stocke le nombre double précision d (32 bits) à l'adresse adr.

2 VARIABLE compte-bancaire
75000. compte-bancaire 2!

2@ adr --- d  

Délivre le nombre double précision contenu à l'adresse adr.

compte-bancaire 2@ D.         affiche 75000


B. Accès mémoire extra-segment.

LC! oct seg offset ---  

Stocke dans la zone mémoire extra-segment pointée par le numéro de segment seg et le décalage offset la valeur 8 bits oct.


LC@ seg offset --- oct  

Dépose sur la pile le contenu 8 bits de la zone mémoire extra- segment pointée par le numéro de segment seg et le décalage offset.


L! val seg offset ---  

Stocke dans la zone mémoire extra-segment pointée par le numéro de segment seg et le décalage offset la valeur 16 bits val.


L@ seg offset --- val  

Dépose sur la pile le contenu 16 bits de la zone mémoire extra- segment pointée par le numéro de segment seg et le décalage offset.


C. Déplacement de blocs mémoire.

CMOVE adr-départ adr-dest. long --- F83

Transfère une zone de mémoire de longueur long octets, depuis adr-départ vers adr-destination. La copie débute par les adresses les plus basses. Il se produit un phénomène d'écrasement de la zone d'origine (overlap, parfois désiré) si adr-départ < adr-destination < adr-départ+longueur lors de déplacements vers le haut de la mémoire.

 
CMOVE> adr-dep adr-dest long --- F83

Transfère une zone mémoire de long octets depuis adr-dep vers adr-dest. La copie débute par les adresses les plus hautes. Il se produit un phénomène d'écrasement (overlap) de la zone origine si adrdep-long < adr-dest < adr-dest lors de déplacements vers le bas la mémoire. Il n'y a pas risque d'écrasement pour des haut: CMOVE>

est alors préféré à 'CMOVE'. MOVE de vers n --- Déplace n octets des adresses 'de' à 'vers' sans recouvrement. Très utile si vous hésitez entre CMOVE et CMOVE>.


MOVE de vers n ---  

Déplace n octets des adresses de à vers sans recouvrement. Très utile si vous hésitez ente CMOVE et CMOVE>. Exemple:

CREATE TABLE1 1 C, 2 C, 4 C, 8 C,
CREATE TABLE2 4 ALLOT
TABLE1 TABLE2 4 MOVE

déplace 4 octets de TABLE1 vers TABLE2


LCMOVE seg1 adr1 seg2 adr2 long2 ---  

Transfère une zone mémoire de long octers depuis la zone mémoire commençant à seg1 adr1 vers la zone mémoire seg2 adr2. La copie débute par les adresses les plus basses. Les adresses sont exprimées sous la forme segment et offset.


LCMOVE> seg1 adr1 seg2 adr2 long2 ---  

Transfère une zone mémoire de long octers depuis la zone mémoire commençant à seg1 adr1 vers la zone mémoire seg2 adr2. La copie débute par les adresses les plus hautes. Les adresses sont exprimées sous la forme segment et offset. Exemples:

HEX
B000 0000   \ correspond à la RAM vidéo monochrome
B800 0000   \ correspond à la RAM vidéo couleur

Pour transférer cette zone mémoire vers un tampon écrit en Forth, il suffit de sélectionner une adresse mémoire sous forme de segment et offset et d'exécuter LCMOVE:

DECIMALCREATE TAMPON 10000 ALLOT
HEX B800 0000 (pour écran couleur)
DECIMAL DSEGMENT TAMPON 4000 LCMOVE

renvoie le contenu de TAMPON dans la RAM vidéo. Attention, avec les cartes VGA, l'accès à la RAM vidéo par LCMOVE est ploblématique. En mode graphique, il faut modifier les registres de contrôle de la carte. Cette opération est risquée, car certaines caleurs risquent d'endommager la carte vidéo ou le moniteur.


D. Exploration de zone mémoire.


DUMP adr long ---  

DUMP affiche le contenu de seize adresses consécutives par ligne, suivi des caractères ASCII équivalents au contenu de ces adresses. L'adresse de départ du vidage mémoire équivaut à l'adresse adr, mais ajustée si nécessaire au modulo 16 par défaut (0 pour n compris entre 0 et 15, 16 pour n compris entre 16 et 31, etc...). La position de adr est pointée par les caractères 'barre de fraction inverse' et 'barre de fraction' (\/) dans la zone numérique, par 'V' dans la zone ASCII. Le vidage mémoire (francisation de DUMP, nous faisons du mieux-disant culturel...) se fait sur une zone mémoire de n octets de longueur, avec un minimum de 16 octets.


LDUMP seg adr long ---  

Identique à DUMP, mais peut agir en dehors du segment courant. Exemple:

0 0 200 LDUMP

affiche le contenu des 200 premiers octets de la mémoire du système débutant au segment 0, adresse 0.


E.Ports 8 bits.

PC! c adr ---  

Les processeurs INTEL communiquent avec leur environnement matériel par l'intermédiaire des ports. Un port est une entrée ou une sortie de données "d'une largeur" de 8 bits reliée à une unité électronique déterminée et à laquelle correspond une adresse comprise entre 0 et 65535.

Les instruction d'accès aux ports INTEL écrite en FORTH, utilisent les instructions IN et OUT de l'assembleur INTEL et sont exécutées par le micro-processeur. FORTH élargit la palette des instructions d'accès aux ports en gérant des ports 8 et 16 bits.

L'ensemble du système IBM (et compatible) exploite les ports compris entre 0000h et 03F8h. Les ports situés au dela sont laissés à la discrétion des utilisateurs. En temps normal, aucun accessoire ne peut être exploité. Cependant, certaines cartes d'extension peuvent utiliser ces ports hauts.

En se reportant à la documentation technique de son système, l'utilisateur trouvera une foule de registres accessibles au travers de ces ports, comme ceux de la liaison série, carte vidéo, carte réseau, coprocesseur arithmétique, temporisateur, etc...


PC! c adr ---  

Stocke la valeur 8 bits c dans le port utilisateur d'adresse adr.


PC@ adr --- c  

Prélève la valeur n sur le port utilisateur d'adresse adr.


P! n adr ---  

Stocke la valeur n dans le port utilisateur d'adresse adr. Le port utilisateur est sélectionné en fonction des organes et périphériques éventuellement connectés (interfaces série, parrallèle).


P@ adr --- n  

Prélève la valeur n sur le port utilisateur d'adresse adr.
Exemple de transmission d'un caractère vers le port série :

HEX 03F8 CONSTANT SERIAL
\ Remplacer par 02F8 pour accès COM2:
: (rsemit) ( c ---) BEGIN SERIAL 5 + PC@ 20 =
\ Test si registre émission disponible
UNTIL SERIAL PC!
\ envoi du caractère
;

Dans ce programme, on lit d'abord le registre de transmission pour connaître sa disponibilité. Dès qu'il est libre, on peut émettre le caractère. Ainsi, le tampon d'émission n'est jamais saturé par l'envoi de caractères en rafale

Clin d'oeil: Un remerciement à Eddy Maue pour l'aide qu'il apporte à la lisibilité de ce site.

-- hautdepage -- sommaire -- page d'accueil --