CPC-POWER : CPC-SOFTS - CPCArchives 
Options de Recherche :
 
 
 

ARTICLES

45 / 72

Cours sur l'assembleur Z80 - adressages - instructions - vecteurs

COURS D’ASSEMBLEUR - adressages - instructions - vecteurs

 

Sommaire :

1) Les modes d'adressage

2) Les instructions du Z80

3) Les Vecteurs Système

 


 

 

Partie : les modes d'adressage


Un mode d'adressage est un moyen qui permet au microprocesseur d'avoir accès à une donnée. Cette donnée peut être un nombre quelconque dont on aura besoin dans le programme, un nombre qui se trouve déjà dans un registre, ou encore un nombre qui se trouve écrit quelque part en mémoire.

La connaissance des principaux modes d'adressage est obligatoire : elle permet d'écrire les programmes de la façon la plus courte, la plus simple et la plus lisible possible.

 

a) L'adressage inhérent

L'adressage inhérent est habituellement réservé aux instructions qui agissent directement sur les valeurs contenues par les registres. Ces instructions se composent d'elles-mêmes et n'ont aucunement besoin qu'on leur ajoute des indications.

Exemple : CPL

Tous les microprocesseurs possèdent ce genre d'instruction :elle signifie que le registre A (lui et pas un autre) se verra complémenté. En clair, cela veut dire que chacun de ses bits prendra l'autre valeur binaire ; les chiffres 1 seront remplacés par des 0 et réciproquement.

A contenait 143 décimal (par exemple) ; soit 10001111 binaire.

CPL

A contient 112 décimal, c'est à dire 01110000 binaire

 


b) L'adressage immédiat

Dans ce mode, une valeur apparaît après l'instruction assembleur.

Prenons par exemple LD A,100

La formule LD signifie que l'on va placer (charger) un nombre dans le registre A. Il est facile de voir qu'ici l'instruction LD n'aurait pu être écrite toute seule, comme dans l'adressage inhérent. Il nous faut absolument rajouter des indications à la suite : et, si l'on doit mettre un nombre dans l'accumulateur A, il faut bien dire lequel.

Dans le mode d'adressage immédiat, c'est la valeur marquée après la virgule (ici 100) qui sera écrite dans le registre que l'on aura choisi en écrivant son nom devant la virgule. Dans notre exemple, c'est le registre A qui est concerné mais n'importe quel autre registre de 8 bits ou 16 bits aurait fait l'affaire.

A contenait, par exemple, 50

LD A,100

A contient maintenant 100. Mais…

LD A,300

Cette ligne devrait, en principe, écrire dans A le nombre 300. Vous l'aurez deviné ; cela n'a aucun sens puisque A est un registre 8 bits et que le nombre maximal qu'il peut contenir est 255.

 


c) L'adressage étendu

On l'appelle souvent adressage absolu car c'est un mode qui permet d'avoir accès directement au contenu de n'importe quel octet de la mémoire.

LD A,(10)

L'accumulateur A sera chargé non par le nombre 10, comme il l'aurait été dans l'adressage immédiat, mais avec la valeur écrite dans l'octet n°10. L'instruction BASIC équivalente est la suivante :

PRINT PEEK(10) => réponse : 185

En fin de compte, le registre A contiendra 185. Les parenthèses qui englobent la valeur 10 sont là pour éviter la confusion entre les modes immédiat et étendu. Lorsqu'une valeur est " parenthésée ", elle correspond à l'adresse d'un octet de la mémoire et c'est cet octet qu'il faut prendre ne compte. Un deuxième exemple :

LD A,(5000)

Un piège, comme dans le paragraphe précédent ? 5000 paraît bien trop important pour notre accumulateur 8 bits. Mais non, cette ligne n'est pas un contre-sens : elle signifie que le registre A va contenir non pas le nombre 5000 mais le nombre qui se trouve écrit dans l'octet ayant 5000 pour adresse.

PRINT PEEK(5000) => réponse : 0

Ce qui fait que A sera chargé, une fois l'instruction exécutée, par la valeur 0.

 


d) L'adressage registre

Ce mode d'adressage ne fait apparaître aucun nombre dans l'instruction et n'est utilisable que lorsque l'on veut intervenir sur les contenus des registres. Exemple :

INC B

Cette instruction donne au microprocesseur l'odre d'incrémenter le registre B, c'est à dire d'augmenter sa valeur d'une unité. B contenait 200 (par exemple).

INC B

B contient 201. Autre exemple :

LD C,D

Nous retrouvons le mnémonique de chargement LD. Il n'y a aucune difficulté à interpréter cette instruction. Si 20 et 30 sont, par exemple, écrits dans les registres C et D, l'exécution de l'instruction inscrira la valeur 30 dans C (et D restera inchangé).

 


e) L'adressage indirect

Il est noté comme l'adressage étendu, mais l'expression qui se trouve entre parenthèses est, cette fois, le nom d'un registre. Voici quelques exemples :

LD C,(HL)

Le simple registre C va être chargé avec la valeur qui se trouve dans l'octet ayant pour adresse le nombre écrit dans HL. Supposons que, dans ce registre 16 bits, il y ait le nombre 48000.

PRINT PEEK(48000) => réponse : 146

Après LD C, (HL), il y aura dans le registre C la valeur 146. Cette instruction est donc tout à fait équivalente à LD C,(48000) en adressage étendu. Deuxième exemple :

LD HL,45000
LD B,(HL)

Il faut considérer que la première instruction LD place directement dans le registre HL le nombre 45000 (mode d'adressage immédiat. La seconde instruction va recopier dans le registre B le contenu de l'octet 45000.

PRINT PEEK(45000) => réponse 222

B contiendra donc la valeur 222.

 


f) L'adressage indexé

Prenons l'exemple suivant:

LD C,(IX+10)

Cette fois, le processeur va aller chercher, pour l'écrire dans C, la valeur qui se trouve dans l'octet ayant pour adresse le nombre contenu dans IX auquel on ajoute 10. C'est plus facile à comprendre qu'à expliquer ! admettons que IX contienne la valeur 46000. On ajoute 10 à 46000 et l'octet concerné est alors le n°46010.

PRINT PEEK(46010) => réponse : 63

Ainsi dans cet exemple, C va être chargé avec le nombre 63. Un dernier exemple :

LD H,(IY-20)

En considérant que IY contient le nombre 47000 (par exemple), cette instruction indique à la machine qu'elle doit placer dans H le nombre écrit dans l'octet 46980. Si l'on sait que le PEEK de cet octet vaut 132 , on en déduit que le registre H aura vu son contenu porté à 132. remarquons que seuls les registres IX et IY ont le privilège de pouvoir accéder à une case mémoire dont l'adresse est donnée par leurs contenus auxquels est ajoutée ou retranchée une valeur comprise entre +127 et -128 (un octet signé). Les instructions du type :

LD A,(BC+5)
Ou
LD A,(DE-3)

N'éxistent pas.

 


 

Partie : les instructions Z80

 

Modes d'Adressage

RR = Registre - Registre

Im = Immédiat

IDX = Indexé

D = Direct

In = Indirect

 

r ou r' est un registre 8 bits

n est un nombre de 8 bits

nn est un nombre 16 bits

dd est BC, DE, HL ou SP.

qq est AF, BC, DE ou HL.

pp est BC, DE, IX ou SP.

rr est HC, DE, IX ou SP.

 

Flags

C = Carry / flag de report

Z = Flag zéro

S = Flag signe

P/V = Flag parité ou dépassement

H = Flag demi-carry

N = Flag addition/soustraction

 

Modification des flags

? Flag fixé en fonction du résultat de l'opération

0 Flag annulé

1 Flag mis

* Flag non affecté

- Modification du flag imprévisible

V Flag mis si dépassement (overflow)

P Flag mis si parité

F Le flag P/V reçoit le contenu du flip-flop d'interruption (IFF)

 

Symbolisation

R

DEHL : echange les contenus de DE et HL.

 

 

GROUPE LOAD 8 BITS

 

Mnémonique

Opération

Symbolique

Nbre

d’octets

Nbre de

cycles

Mode d’

adressage

Flags affectés

C Z P/V S N H

LD r,r’

LD r,n

LD r,(HL)

LD r,(IX+d)

LD r,(IY+d)

LD (HL),r

LD (IX+d),r

LD (IY+d),r

LD (HL),n

LD (IX+d),n

LD (IY+d),n

LD A,(BC)

LD A,(DE)

LD A,(nn)

LD (BC),A

LD (DE),A

LD (nn),A

LD A,I

LD A,R

LD I,A

LD R,A

r

r

r

r

r

(HL)

(IX+d)

(IY+d)

(HL)

(IX+d)

(IY+d)

A

A

A

(BC)

(DE)

(nn)

A

A

I

R

1

2

1

3

3

1

3

3

2

4

4

1

1

3

1

1

3

2

2

2

2

1

2

2

5

5

2

5

5

3

5

5

2

2

4

2

2

4

2

2

2

2

RR

Im

In

IDX

IDX

In

IDX

IDX

In

IDX

IDX

In

In

D

In

In

D

RR

RR

RR

RR

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* ? F   ? 0 0

* ? F   ? 0 0

* * *   * * *

* * *   * * *

 

 

GROUPE LOAD 16 BITS

 

Mnémonique

Opération

Symbolique

Nbre

d’octets

Nbre de

cycles

Mode d’

adressage

Flags affectés

C Z P/V S N H

LD dd,nn

LD IX,nn

LD IY,nn

LD HL,(nn)

 

LD dd,(nn)

 

LD IX,(nn)

 

LD IY,(nn)

 

LD (nn),HL

 

LD (nn),dd

 

LD (nn),IX

 

LD (nn),IY

dd

IX

IY

H

L

dd

dd

IX

IX

IY

IY

(nn+1)

(nn)

(nn+1)

(nn)

(nn+1)

(nn)

(nn+1)

(nn)

3

4

4

3

 

4

 

4

 

4

 

3

 

4

 

4

 

4

3

4

4

5

 

6

 

6

 

6

 

5

 

6

 

6

 

6

Im

Im

Im

D

 

D

 

D

 

D

 

D

 

D

 

D

 

D

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

LD SP,HL

LD SP,IX

LD SP,IY

PUSH qq

 

PUSH IX

 

PUSH IY

 

POP qq

 

POP IX

 

POP IY

SP

SP

SP

(SP-1)

(SP-2)

(SP-1)

(SP-2)

(SP-1)

(SP-2)

qq

qq

IX

IX

IY

IY

1

2

2

1

 

2

 

2

 

1

 

2

 

2

1

2

2

3

 

4

 

4

 

3

 

4

 

4

RR

RR

RR

Im

 

Im

 

Im

 

Im

 

Im

 

Im

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

 

 

GROUPE ECHANGE – GROUPE TRANSFERT – RECHERCHE DE BLOC

 

Mnémonique

Opération

Symbolique

Nbre

d’octets

Nbre de

cycles

Mode d’

adressage

Flags affectés

C Z P/V S N H

EX DE,HL

EX AF,AF’

EXX

 

 

EX (SP),HL

 

EX (SP),IX

 

EX (SP),IY

 

LDI

 

 

 

LDIR

 

 

 

 

LDD

DEHL

AFAF’

BCBC’

DEDE’

HLHL’

H(SP+1)

L(SP)

IX(SP+1)

IX(SP)

IY(SP+1)

IY(SP)

(DE)

DE

HL

BC

(DE)

DE

HL

BC

JUSQUE BC=0

(DE)

DE

HL

BC

1

1

1

 

 

1

 

2

 

2

 

2

 

 

 

2

 

 

 

 

2

1

1

1

 

 

5

 

6

 

6

 

4

 

 

 

5

 

 

 

 

4

RR

RR

RR

 

 

RR

 

RR

 

RR

 

In

 

 

 

In

 

 

 

 

In

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

 

* * *   * * *

 

* * *   * * *

 

* * ?   * 0 0



* * 0   * 0 0

 

 

 

 

* * ?   * 0 0

LDDR

 

   

   

 

CPI

 

 

CPIR

 

 

 

 

CPD

 

 

CPDR

(DE)

DE

HL

BC

JUSQUE BC=0

A-(HL)

HL

BC

A-(HL)

HL

BC

JUSQUE A=(HL)

OU BC=0

A-(HL)

HL

BC

A-(HL)

HL

BC

JUSQUE A=(HL)

OU BC=0

2

 

 

 

 

2

 

 

2

 

 

 

 

2

 

 

2

5

 

 

 

 

4

 

 

5

 

 

 

 

4

 

 

5

In

 

 

 

 

In

 

 

In

 

 

 

 

In

 

 

In

* * 0   * 0 0

 

 

 

 

* ? ?   ? ? ?

 

 

* ? ?   ? ? ?

 

 

 

 

* ? ?   ? ? ?

 

 

* ? ?   ? ? ?

 

 

GROUPE ARITHMETIQUE ET LOGIQUE 8 BITS

Mnémonique

Opération

Symbolique

Nbre

d’octets

Nbre de

cycles

Mode d’

adressage

Flags affectés

C Z P/V S N H

ADD A,r

ADD A,n

ADD A,(HL)

ADD A,(IX+d)

ADD A,(IY+d)

ADC A,s

SUB A,s

SBC A,s

AND s

OR s

XOR s

CP s

INC

INC(HL)

INC(IX+d)

INC(IY+d)

DEC d

A

A

A

A

A

A

A

A

A

A

A

A-s

r-r+1

(HL)

(IX+d)

(IY+d)

d

1

2

1

3

3

 

 

 

 

 

 

 

1

1

3

3

1

2

2

5

5

 

 

 

 

 

 

 

1

3

6

6

Im

Im

In

IDX

IDX

Im

Im

Im

Im

Im

Im

Im

Im

In

IDX

IDX

Im

? ? V   ? 0 ?

? ? V   ? 0 ?

? ? V   ? 0 ?

? ? V   ? 0 ?

? ? V   ? 0 ?

? ? V   ? 0 ?

? ? V   ? 1 ?

? ? V   ? 1 ?

0 ? P   ? 0 1

0 ? P   ? 0 1

0 ? P   ? 0 1

? ? V   ? 1 ?

* ? V   ? 0 ?

* ? V   ? 0 ?

* ? V   ? 0 ?

* ? V   ? 0 ?

* ? V   ? 1 1

 

 

GROUPE ARITHMETIQUE GENERALE ET CONTROLE UNITE CENTRALE

Mnémonique

Opération

Symbolique

Nbre

d’octets

Nbre de

cycles

Mode d’

adressage

Flags affectés

C Z P/V S N H

DAA

convertit

A en BCD

arès

addition

ou sous-

traction

sur oper.

BCD

 

CPL

NEG

CCF

SCF

NOP

HALT

DI

EI

IM0

 

 

IM1

 

IM2

 

 

 

 

 

 

   

 

 

_

A

A

CY

CY

Pas d’opération

CPU halte

IFF

IFF

Mettre

Interruption

Mode 0

Interruption

Mode 1

Interruption

Mode 2

1

 

 

 

 

 

 

 

 

 

1

2

1

1

1

1

1

1

2

 

 

2

 

2

1

 

 

 

 

 

 

 

 

 

1

2

1

1

1

1

1

1

2

 

 

2

 

2

Im

 

 

 

 

 

 

 

 

 

Im

Im

Im

Im

Im

Im

Im

Im

Im

   

Im

 

Im

? ? P   ? * *

 

 

 

 

 

 

 

 

 

* * *   * 1 1

? ? V   ? 1 ?

? * *   * 0 *

1 * *   * 0 0

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

 

 

* * *   * * *

 

* * *   * * *

 

Mnémonique

Opération

Symbolique

Nbre

d’octets

Nbre de

cycles

Mode d’

adressage

Flags affectés

C Z P/V S N H

ADD HL,dd

ACD HL,dd

SBC HL,dd

ADD IX,pp

ADD IY,rr

INC dd

INC IX

INC IY

DEC dd

DEC IX

DEC IY

HL

HL

HL

IX

IY

dd

IX

IY

dd

IX

IY

1

2

2

2

2

1

2

2

1

2

2

3

4

4

4

4

1

2

2

1

2

2

Im

Im

Im

Im

Im

Im

Im

Im

Im

Im

Im

? * *   * 0 -

? ? V   ? 0 -

? ? V   ? 1 -

? * *   * 0 -

? * *   * 0 -

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

 

 

GROUPE ROTATION ET DECALAGE

 

 

GROUPE MISE, ANNULATION ET TEST DE BIT

Mnémonique

Opération

Symbolique

Nbre

d’octets

Nbre de

cycles

Mode d’

adressage

Flags affectés

C Z P/V S N H

Bit 6,r

Bit 6,(HL)

Bit 6,(IY+d)

Bit 6,(IY+d)

Set 6,r

Set 6,(HL)

Set 6,(IX+d)

Set 6,(IY+d)

Set 6,s

Z

Z

Z

Z

r

(HL)

(IX+d)

(IY+d)

s

2

2

4

4

2

2

4

4

-

2

3

5

5

2

4

6

6

-

RR

In

IDX

IDX

RR

In

IDX

IDX

RR

* ? -   - 0 1

* ? -   - 0 1

* ? -   - 0 1

* ? -   - 0 1

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

 

 

GROUPE DE JUMP (SAUT)

Mnémonique

Opération

Symbolique

Nbre

d’octets

Nbre de

cycles

Mode d’

adressage

Flags affectés

C Z P/V S N H

JP nn

JP cc,nn

 

 

 

 

JR e

JR C e

JR NC e

JR Z e

JR NZ e

JP(HL)

JP(IX)

JP(IY)

DJNZ e

PX

Si condition

cc vraie

PC

sinon continue

PC

Si c=0 continue

Si c=1 continue

Si z=0 continue

Si z=1 continue

PC

PC

PC

B

Si B=0 continue

B=0

PC

3

3

 

 

 

   

2

2

2

2

2

1

2

2

2

3

3

 

 

 

 

3

2

2

2

2

1

2

2

3

Im

Im

 

 

 

 

Im

Im

Im

Im

Im

In

IDX

IDX

Im

* * *   * * *

* * *   * * *

 

 

 

 

* * *   * *

* * *   * *

* * *   * *

* * *   * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

* * *   * * *

 

 

GROUPE CALL ET RETURN

Mnémonique

Opération

Symbolique

Nbre

d’octets

Nbre de

cycles

Mode d’

adressage

Flags affectés

C Z P/V S N H

CALL n

 

CALL cc,nn

 

 

 

RET

 

RET cc

 

 

 

RETI

 

RETN

 

 

RET P

(SP-1)(SP-2)

Si condition

cc fausse,

continuer sinon

comme CALL nn

PC

PC

Si condition

cc fausse,

continuer sinon

comme RET

Retour

d'interruption

Retour

d'interruption

non masquable

(SP-1)

(SP-2)

PC

PC

3

 

3

 

 

 

1

 

1

 

 

 

2

 

2

 

 

1

5

 

3

 

 

 

3

 

1

 

 

 

4

 

4

 

 

3

Im

 

Im

 

 

 

Im

 

Im

 

 

 

Im

 

Im

 

 

Im

* * *   * * *

 

* * *   * * *

 

 

 

* * *   * * *

 

* * *   * * *

 

 

 

* * *   * * *

 

* * *   * * *

 

 

* * *   * * *

 


 

Partie : les vecteurs système

Les vecteurs systèmes sont des sous-programmes mémorisés en ROM. Ils ne sont pas forcément ultra rapides ni optimisés, mais ils facilitent souvent la programmation. Ils permettent la gestion des éléments suivants :

- Le clavier
- Le texte
- Les sons
- Le gestionnaire graphique
- Le gestionnaire d'écran
- Les accès disquette, cassette et les fichiers
- Le kernell
- L'interface matérielle

Exemple : le vecteur &BC0E dans le gestionnaire d'écran.

 

BC0E : changement de mode
CA : A contient le numéro du mode;
CF : rien;
: les registres AF, BC, DE et HL sont modifiés.

C'est l'équivalent de l'instruction MODE en basic. CA donne la liste des registres qui permettent de paramétrer le vecteur. Ici c'est le registre accumulateur A qui doit contenir le numéro de mode, soit 0,1 ou 2. CF contient les registres de sortie ou de résultat du vecteur (ici il n'y en a pas). Une indication supplémentaire indique toutefois les registres qui ont été modifiés, ici ce sont AF, BC, DE et HL. Avant de lancer un tel vecteur, il peut donc être nécessaire de sauvegarder ces derniers. L'exemple suivant permet de passer en mode 2.

Push AF
Push BC
Push DE
Push HL

Ld A,2
Call &BC0E

Pop HL
Pop DE
Pop BC
Pop AF

 

 

*** LE CLAVIER ***

BB00 : Initialise le clavier, les prédéfinitions (KEY, KEYDEF), le tampon clavier (CLEAR INPUT sur 6128), etc.
CA : Aucune.
CF : Les registres AF,BC,DE et HL sont modifies.

 

BB06 : Attente d'une touche du clavier et renvoie son code dans l'accu (voir également BB18)
CA : Aucune.
CF: L'accumulateur = numéro du caractère (exemple : 66 pour la touche B du clavier).

 

BB09 : Teste si une touche est enfoncée. Cette routine n'attend pas et doit être placée dans une boucle d'attente.
CA : Aucune.
CF : Si une touche est pressée, CARRY = 1 et Accumulateur = numéro du caractère, sinon CARRY=0 et l'accumulateur est modifie.

 

BB18 : Attente d'une touche du clavier.
Cette routine se différencie de BB06 par le fait qu'elle renvoie pour quelques touches un code différent de BB06. Entre autres, les touches du pave numérique. Le vecteur BB18 renvoie des valeurs allant de 48 a 57 (codes Ascii) alors que BB06 donne 128 a 137 (valeur utilisable lors de la redéfinition d'une touche). La différence est vraie avec 139 pour ENTER (au lieu de 13 avec BB18) et 138 pour Ie "." du pave numérique (au lieu de 46 avec BB18).
CA : Aucune.
CF : L'accumulateur = numéro du caractère.

 

BB1B : Teste si une touche est enfoncée.
Cette routine n' attend pas et doit être placée dans une boucle d' attente.
Cette routine se différencie de BB09 par le fait qu'elle renvoie le numéro de la touche correspondant aux indications gravées sur le boîtier de votre CPC 6128 (exemple pour un clavier Azerty, la touche A correspond a 67).
CA : Aucune.
CF : Si une touche est pressée, CARRY = 1 et Accumulateur = numéro du caractère, sinon CARRY=0 et l'accumulateur est modifie.

 

BB21 : Demande l'état de la touche CAPS LOCK et SHIFT.
CA : Aucune.
CF: L contient l'état de la touche CAPS et H celui de SHIFT. Notons qu'une valeur 0 signifie une touche non enclenchée et 255 une touche pressée.

 

BB24 : Teste l'état du joystick.
Pour connaître la position d'un manche a balai, il faudra tester les 6 premiers bits de l'accumulateur (exemple BIT 1,A, JR Z,...).
CA : Aucune.
CF : A et H contiennent l'état du premier joystick et L l'etat du second. Les bits 0 a 5 de ces registres se placeront a 1 si les directions suivantes sont respectées ; haut, bas, gauche, droite, feu 2, feu 1. Exemple, pour un joy pointe vers le haut avec le bouton de feu enfonce, l'accumulateur aura ses bits 0 et 5 mis a 1.

 

BB3F : Réglage des temps de réponse et de répétition du clavier (SPEED KEY du Basic).
CA: H = temps avant la première répétition,
L = La vitesse de répétition.
Ces vitesses sont indiquées en cinquantième de seconde (LD H,50 pour une seconde).
CF : AF est modifie.

 

BB48 : Désactive la touche ESC. Sous Basic cet appel sera utilise de la façon suivante :
10 CALL &BB48
20 GOTO 20
CA: Aucune.
CF : AF et HL sont modifies.

 

 


*** LE MODE TEXTE ***

BB5A : Affiche un caractère Ascii à la position courante du curseur texte (LOCATE).
C'est en somme l'équivalent de PRINT mais pour un seul caractère. Sachez que pour afficher une phrase, il faudra écrire une routine de lecteur qui affichera les caractères un par un. Contrairement au Basic, cette routine n' exécute pas de retour chariot ce qui évite de replacer le curseur pour le caractère suivant. Exemple Basic PRINT "A";
CA : L'accumulateur contient Ie code Ascii du caractère à afficher (exemple : 65 pour A).
CF: Tout reste en place.

 

BB60 : Lit un caractère a la position courante du curseur texte.
Equivalent Basic de COPYCHR$.
CA : Aucune.
CF : Si la routine reconnaît un caractère, CARRY = 1 (JR C,..) et l'accumulateur contient le code Ascii de ce caractère, sinon, CARRY = 0 et A = 0.

 

BB66 : Fixe les limites d'une fenêtre texte (WINDOW du Basic).
II est évident que cette commande réagira exactement comme le Basic. Pour travailler sur plusieurs fenetres en même temps (WINDOW#1, WINDOW#2...), il vous faudra redéfinir à chaque fois cette nouvelle fenêtre.
CA: H = Un côté de la fenêtre (droit ou gauche).
D = Le deuxième côté de la fenêtre (gauche ou droit).
L = Le troisième cote de la fenêtre (haut ou bas).
E = Le dernier cote de la fenêtre (bas ou haut).
CF: les registres A,F,H,L,B,C,D et E sont modifies.

 

BB69 : Demande les dimensions de la fenêtre texte courante.
En somme vous pouvez retrouver les valeurs passées par la routine BB66.
CA: Aucune.
CF : Si la fenêtre couvre tout l'écran, CARRY = 0 sinon CARRY = 1.
H = Colonne à gauche.
D = Colonne à droite.
L = Rangée en haut.
E = Rangée en bas.

 

BB6C : Efface le contenu de la fenêtre active et place le curseur texte en position haut et gauche de cette dernière.
Cest le CLS du Basic.
CA : Aucune.
CF: Tous les registres sont modifies.

 

BB6F : Déplace la position du curseur texte horizontalement.
CA : L'accumulateur = nouvelle position de la colonne.
CF : AF et HL sont modifies.

 

BB72 : Déplace la position du curseur texte verticalement.
CA : L'accumulateur = nouvelle position de la rangée.
CF : AF et HL sont modifies.

 

BB75 : Déplace la position du curseur texte (LOCATE du Basic).
CA : H = Position de la colonne (X).
L = Position de la rangée (Y).
CF : AF et HL sont modifies.

 

BB78 : Demande la position courante du curseur texte.
Cette routine vous indiquera en sortie le nombre de rotation (scrolling) effectues sur cette fenêtre. Ce compteur est incrémente si la rotation se fait vers le bas et décrémente si la rotation se fait vers le haut.
CA: Aucune.
CF : H = Position de la colonne (X).
L = Position de la rangée (Y).
A = nombre de rotations.

 

BB90 : Détermine le stylo utilise pour l'écriture texte (l'instruction PEN de notre cher Basic)
CA : A = Numéro du stylo.
CF : AF et HL sont modifies.

 

BB93 : Demande le numéro du stylo utilise pour l'écriture texte.
CA : Aucune.
CF : A = Numéro du stylo utilise.

 

BB96 : Détermine le stylo utilise pour le fond des caractères texte (l'instruction PAPER du Basic)
CA: A = Numéro de fond.
CF : AF et HL sont modifies.

 

BB99 : Demande le numéro du stylo utilise pour le fond des caractères.
CA : Aucune.
CF : A = Numéro du stylo utilise.

 

BB9C : Echange les encres du stylo et du fond.
Sous Basic, vous pouvez appeler cette routine pour une inversion vidéo ou utiliser l'instruction, PRINT CHR$(24)
CA : Aucune.
CF : AF et HL sont modifies.

 

BB9F : Place le mode d'écriture opaque ou transparent pour le fond des caractères affichables.
CA A=0 pour fond opaque.
A<>0 pour fond transparent.
CF : AF et HL sont modifies.

 

BBA8 : Redéfinit la matrice des caractères Ascii affichables (au-dessus de 31).
L'équivalent Basic est la commande SYMBOL. Vous pensez bien qu'en travaillant en assembleur, vous n'aurez plus it réserver de place en mémoire avec l'instruction SYMBOL AFTER.
CA : A = numéro du caractère à redéfinir.
HL pointe sur la matrice (8 octets)
CF : Si le caractère est défini CARRY = 1 sinon CARRY = O.

Tous les registres sont modifies Exemple pour l'utilisation de ce vecteur:

LD A,240
LD HL,ASCII
JP &BBA8

ASCII DEFB 1,2,3.4.5,6,7,8

 


*** LES SONS ***

BCA7 : Initialise le gestionnaire sonore.
Ce vecteur coupe tous les sons joues ou en attente et réinitialise les différentes enveloppes (volume, fréquence).
CA : Aucune.
CF : les registres AF,HL,BC et DE sont modifies.

 

BCAA : Place un son sur le canal demande (l'instruction SOUND du Basic)
CA : HL pointe sur une table de données sonores de 9 octets qui doit se trouver dans la zone Ram entre &4000 et &C000.
CF : Si le canal n'est pas sature (cinq sons en attente) le son est place sur le canal et CARRY = 1, HL est modifie sinon, CARRY = 0.
En tout cas, les registres AF, BC, DE et IX sont modifies.
La table des données n'est pas organisée comme la commande SOUND du Basic. Voici l'ordre de placement des paramètres:

ORG 40000
LD HL,SONS
JP &BCAA
SONS DEFB 1 ;CANAL
DEFB 2 ;ENVELOPPE DE VOLUME
DEFB 3 ;ENVELOPPE DE TON
DEFW 1000 ;FREOUENCE
DEFB 31 ;BRUIT
DEFB 15 ;VOLUME
DEFW 300 ;DUREE

Cet exemple équivaut à la commande SOUND 1,1000,300,15,2,3,31. Vous constatez que la fréquence tout comme la durée du son sont placées sur deux octets.

Notez enfin que les valeurs négatives remplissent les mêmes rôles qu'en Basic .

 

BCAD : Teste l'état des canaux sonores (l'instruction SQ du Basic).
La valeur d'entrée pour les trois canaux sonores sont 1 pour le canal A, 2 pour le canal B et 4 pour le canal C.

Le mélange des canaux n'est pas réalisable par ce vecteur.
CA : A = Numéro du canal à tester.
CF : A = l'état du canal.
Les registre F, BC, DE et HL sont modifies.

 

BCB6 : Arrête momentanément tous les sons.
CA: Aucune.
CF : Les registres AF, BC et HL sont modifies.

 

BCB9 : Libère les sons arrêtes avec la routine BCB6.
CA : Aucune (si ce n'est l'utilisation de la routine précédente).
CF : Les registres AF, BC, DE et IX sont modifies.

 

BCBC : Création d'une enveloppe de volume (ENV).
CA : A = numéro de l'enveloppe (1 it 15).
HL pointe sur les données de l'enveloppe (15 octets).
CF : HL est augmente de 16, AF, HL et BC sont modifies.

 

BCBF : Création d'une enveloppe de fréquence (ENT).
CA : A = numéro de l'enveloppe (1 it 15).
HL pointe sur les données de l'enveloppe (15 octets).
CF: HL est augmente de 16, AF, HL et BC sont modifies.

 

BCC2 : Donne l'adresse des données d'une enveloppe de volume.
CA : A = numéro de l'enveloppe (1 it 15).
CF : Si OK, CARRY = 1, HL pointe sur les données et BC = la longueur de l'enveloppe.
Les registres F et DE sont modifies.

 

BCC5 : Donne l'adresse des données d'une enveloppe de fréquence.
CA : A = numéro de l'enveloppe (1 it 15).
CF : Si OK, CARRY = 1, HL pointe sur les données et BC = la longueur de l'enveloppe.
Les registres F et DE sont modifies.

Nous verrons, des le prochain numéro, la suite des vecteurs utilises pour les accès disque, le mode graphique sans oublier le gestionnaire écran.

 


*** LE GESTIONNAIRE GRAPHIQUE ***

Si l'écran du CPC est toujours en mode graphique, il existe des primitives pour la gestion texte et la spécialisation graphique. Nous allons voir ensemble la seconde rubrique, car la première a été étudiée le mois passé. Sachez tout de même, pour la suite, qu'une coordonnée dite absolue se réfère à l'origine (au point 0,0) de l'écran, alors qu'une coordonnée relative se réfère à la position actuelle du curseur. Exemple: le curseur étant en 10,10, un positionnement relatif de 10,10 le forcera en 20,20 alors qu'un déplacement absolu des mêmes valeurs ne l'aurait pas déplacé. Sur ce, c'est parti...

 

BBBA : initialisation du gestionnaire graphique
Le stylo prend la couleur 1, le curseur se positionne en bas à gauche de l'écran. Tout est remis à zéro.
CA : rien à faire;
CF : pas de retour;
: les registres AF, BC, DE et HL sont modifiés.

 

BBBD : remise à zéro du gestionnaire
Je dirai que cet appel ne change rien à rien. Le curseur reste à sa place, la couleur ne change pas... Bref, tout est comme si de rien n'était.
CA : queue, dalle;
CF : ma cache;
: les registres AF, BC, DE et HL sont modifiés.

 

BBC0 : positionnement absolu du curseur
Avec cet appel, vous réalisez le MOVE Basic. Positionnement aux coordonnées absolues à l'écran.
CA : DE contient la position horizontale X (abscisse) ;
: HL contient la position verticale y (ordonnée) ;
CF : bézef;
les registres AF, BC, DE et HL sont modifiés.

 

BBC3 : positionnement relatif du curseur
En Basic, on dirait MOVER. Le déplacement du curseur est relatif à sa position actuelle.
CA : DE contient le décalage horizontal;
: HL contient le décalage vertical;
CF : blop ;
: les registres AF, BC, DE et HL sont modifiés.

 

BBC6 : lecture de la position du curseur
Le curseur est sous Basic en XPOS,YPOS. Ce sont ces deux variables que nous allons récupérer d'un coup d'un seul.
CA : la couleur de la bicyclette du facteur, le vendredi;
CF : DE contient XPOS ;
: HL contient YPOS ;
: le registre AF est modifié.

 

BBC9 : positionnement de l'origine du curseur
ORIGIN n'est pas ici le nom de la société d'édition bien connue, mais l'endroit de l'écran servant de références aux positionnements absolus du curseur.
CA : DE contient la position horizontale X (abscisse) ;
: HL contient la position verticale y (ordonnée) par rapport au coin en bas à gauche de l'écran;
CF : il fait beau, n'est-il pas?
: les registres AF, BC, DE et HL sont modifiés.

 

BBCC : lecture de l'origine des tracés
Comme ci-dessus (BBC9) mais en lecture. CA : honni soit qui mal y pense; CF : DE contient l'abscisse;
: HL contient l'ordonnée;
: les registre sont préservés.

 

BBCF : définitions des limites horizontales de la fenêtre graphique
Il est possible de forcer un cliping sur l'écran graphique.
Ainsi, tout tracé ne débordera pas du rectangle défini.
Ce vecteur permet de délimiter horizontalement cette zone.
CA : DE contient la position du bord droit;
: HL contient la position du bord gauche;
CF : l'écran graphique est modifié; : les registres AF, BC, DE et HL sont modifiés.

 

BBD2 : définitions des limites verticales de la fenêtre graphique
Ce vecteur permet de délimiter verticalement la zone de clipping.
CA : DE contient la position du bord bas;
: HL contient la position du bord haut;
CF : la carry sonnera trois fois;
: les registres AF, BC, DE et HL
sont modifiés.

 

BBD5 : lecture des limites horizontales de la fenêtre graphique
Ce vecteur permet de lire les limites horizontales de la zone de clipping.
CA : None ;
CF : DE contient la position du bord droit;
: HL contient la position du bord gauche;
: le registre AF est modifié.

 

BBD8 : lecture des limites verticales de la fenêtre graphique
Ce vecteur permet de lire les limites verticales de la zone de cliping.
CA : DE contient la position du bord bas;
: HL contient la position du bord haut;
CF : pas de témoin;
: le registre AF est modifié.

 

BBDB : effacement de la fenêtre graphique
Le ménage à l'écran
CA : rien du tout;
CF : du tout;: les registres AF, BC, DE et HL sont modifiés.

 

BBDE : positionne la couleur des tracés (stylo)
Quoi de plus conventionnel.
CA : A contient la couleur;
CF : chouette;
: le registre AF est modifié.

 

BBE1 : lecture de la couleur des tracés (stylo)
Et de plus, pratique.
CA : hibou;
CF : A contient la couleur;
: le registre AF est modifié.

 

BBE4 : positionnement de la couleur du fond
Je dirai même plus.
CA : A contient la couleur;
CF : sans;
: le registre AF est modifié.

 

BBE7 : lecture de la couleur du fond Plus!
CA : c'est à quel sujet 7
CF : A contient la couleur;
: le registre AF est modifié.

 

BBEA : positionnement d'un point à l'écran en coordonnées absolues
On connaît cela.
CA : DE contient l'abscisse;
: HL contient l'ordonnée;
CF : califourchon;
: les registres AF, BC, DE et HL sont modifiés.

 

BBED : positionnement d'un point à l'écran en coordonnées relatives à la position actuelle du curseur
Rien de neuf.
CA : DE contient l'abscisse relative;
: HL contient l'ordonnée relative;
CF : les mots me manquent pour définir ce vide;
: les registres AF, BC, DE et HL sont modifiés.

 

BBF0 : teste un point aux coordonnées absolues spécifiées
Je me lasse.
CA : DE contient l'abscisse;
: HL contient l'ordonnée;
CF: A contient la couleur du point;
: les registres BC, DE et HL sont modifiés.

 

BBF3 : teste un point aux coordonnées relatives
Dans la vie, tout est relatif.
CA : DE contient l'abscisse relative;
: HL contient l'ordonnée relative;
CF : A contient la couleur du point;
: les registres BC, DE et HL sont modifiés.

 

BBF6 : tracé d'une droite en absolu
Le point de départ est la position actuelle du curseur. Seuls les points d'arrivée doivent être précisés en coordonnées absolues.
CA : DE contient l'abscisse du point d'arrivée;
: HL contient l'ordonnée du point d'arrivée;
CF : gardez la ligne;
: les registres AF, BC, DE et HL sont modifiés.

 

BBF9 : tracé d'une droite en relatif
Le point de départ est la position actuelle du curseur.
CA : DE contient l'abscisse relative du point d'arrivée;
: HL contient l'ordonnée relative du point d'arrivée;
CF : suivez la ligne jaune;
: les registres AF, BC, DE et HL .
sont modifiés.

 

BBFC : écriture d'un caractère en mode graphique à la position courante du curseur
CA : A contient le code ascii du caractère à écrire;
CF : Yop ;
: les registres AF, BC, DE et HL sont modifiés.

 


*** LE GESTIONNAIRE D'ECRAN ***

Comme vous l'avez vu, les vecteurs précédents se contentaient de modifier la mémoire vidéo sans faire appel au hardware. Nous allons maintenant énumérer les vecteurs qui s'interfacent entre le matériel et le logiciel de haut niveau. Conversion de numéros d'encre en valeurs pokables, utilisation des décalages d'écran, gestion des modes... Sachez encore la chose suivante: ce que nous nommons un masque est une configuration binaire qui permet d'isoler des bits d'un octet. Il offre la possibilité en l' occurrence de ne garder que les bits d'un seul pixel. A
vous de décaler ce masque pour isoler le bon pixel dans l'octet.
Roulez, jeunesse.

 

BBFF : initialisation totale du gestionnaire
Tout est remis à zéro, les encres, les modes, les adresses...
CA : nada ;
CF : rien;
: les registres AF, BC, DE et HL sont modifiés.

 

BC02 : réinitialisation partielle
Moins bulldozer que la première, elle sert à remettre les meubles en place sans bouleverser le gestionnaire.
CA : le vide total;
CF : comme en entrée;
: les registres AF, BC, DE et HL sont modifiés.

 

BC05 : positionne l'offset de départ de la mémoire vidéo
Vous connaissez le principe du scrolling ? Avec cela, vous n'aurez plus de mal à le gérer. Tout se fait tout seul. Attention! la position part de 0 et n'utilise donc pas l'adresse réelle mais le déplacement. De plus, le bit de poids faible est inactif. Les valeurs efficaces sont donc toutes les valeurs paires partant de zéro.
CA : HL contient l'offset de départ;
CF : aucune;
: les registres AF et HL sont modifiés.

 

BC08 : positionne l'adresse de l'écran en mémoire vive
C'est l'octet de poids fort de l'adresse en RAM que vous devez passer à cette routine (#40 ou #CO pour &4000 ou &C000).
CA : A contient une des deux valeurs citées;
CF : rien;
: les registres AF et HL sont modifiés.

 

BC0B: lecture de l'adresse de l'écran en RAM
Comme le vecteur précédent mais en lecture.
CA : rien;
CF : A contient le poids fort de l'adresse visée;
: les registres AF et HL sont modifiés.

 

BC0E : changement de mode
Que dire de plus expressif ?
CA : A contient le numéro du mode;
CF : rien;
: les registres AF, BC, DE et HL sont modifiés.

 

BC11 : lecture du mode vidéo courant Vive la mode.
CA : rien;
CF : A contient le numéro du mode;
: le registre AF est modifié.

 

BC14 : effacement de l'écran
Le bleu avec le beau ready.
CA : aucune;
CF : non plus;
: les registres AF, BC, DE et HL sont modifiés.

 

BC17 : lecture de la surface de l'écran en caractères
Cela permet de connaître la surface de travail du gestionnaire.
CA : rien;
CF : B contient le nombre de colonnes de l'écran en caractères;
: C contient le nombre de lignes en caractères.

 

BC1A : calcule l'adresse de caractère
Cela permet d'obtenir l'adresse d'un caractère en mémoire vidéo, en fonction des coordonnées passées.
CA : H contient la colonne et L la ligne;
CF : HL contient l'adresse en RAM;
: B est la largeur du caractère affiché;
: le registre AF est modifié.

 

BC1D : calcule ('adresse réelle d'un point graphique en fonction de ses coordonnées
Pas de commentaires.
CA : DE contient l'abscisse du point;
: HL contient l'ordonnée du point;
CF : HL contient l'adresse réelle du point en RAM ;
: B+ 1 contient le nombre de pixels par octets;
: C contient le masque de conversion;
: les registres AF et DE sont modifiés.

 

BC20 : calcule l'adresse nouvelle de l'octet situe à droite de celui dont on passe l'adresse
L'offset écran est pris en compte dans ce calcul.
CA : HL contient l'adresse courante;
CF : HL contient l'adresse suivante;
: le registre AF est modifie

 

BC23 : calcule l'adresse réelle de l'octet situe a gauche de celui dont on passe l'adresse
L' offset écran est aussi pris en compte dans ce calcul.
CA : HL contient l'adresse courante;
CF : HL contient l'adresse suivante;
: le registre AF est modifie.

 

BC26 : calcule l'adresse réelle de l'octet situe sous celui dont on passe l' adresse
L'offset écran est également pris en compte dans ce calcul.
CA : HL contient l'adresse courante;
CF : HL contient l'adresse suivante;
: le registre AF est modifie.

 

BC29 : calcule l'adresse réelle de CF l'octet situe au-dessus de celui dont on passe l'adresse
L'offset écran est toujours en compte dans ce calcul.
CA : HL contient l' adresse courante ;
CF : HL contient l'adresse suivante;
: le registre AF est modifie.

 

BC2C : remplit un octet avec la couleur demandée
Pour n' en afficher qu'un point, il faudra masquer les pixels indésirables.
Cette routine tient compte du mode en cours.
CA : A contient le numéro de couleur ;
CF : A contient l'octet rempli de pixels colores ;
: AF est modifie.

 

BC2F : renvoie un numéro de couleur en fonction d'un octet rempli de pixels
Elle fait le contraire de la routine précédente.
CA : A contient l'octet a analyser ;
CF : A contient le numéro de l'encre;
: AF est modifie.

 

BC32 : installe une encre
Si vous connaissez la commande INK du Basic, vous pourrez utiliser ce vecteur sans problème.
CA : A contient le numéro de l'encre ; : B est la première couleur ;
: C est la seconde couleur ;
CF : les registres AF, BC, DE et HL sont modifies.

 

BC35 : lecture des couleurs d'une encre
Appeler ce vecteur avec un numéro d'encre permet de lire ses composants préalablement installes avec le call précédent.
CA : A contient le numéro d'encre; CF : B et C contiennent respectivement la première et la seconde couleur.
: les registres AF, BC, DE et HL sont modifies.

 

BC38 : installation de la couleur du bord
Si tu ne vas pas a BORDER, c'est BORDER qui viendra a toi.
CA : B et C contiennent les composants de la couleur du Border;
CF : les registres AF, BC, DE et HL sont modifies.

 

BC3B : lecture des couleurs du bord Inverse du call précédent
CA : il suffit d'appeler ;
CF : B contient la première couleur et
C la seconde ;
: les registres AF, BC, DE et HL sont modifies.

 

BC3E : positionne la durée de clignotements des couleurs du bord
Mon dieu, com me cela est proche du Basic.
CA : H et L contiennent les durées sur un octet pour chaque couleur ;
CF : HL et AF sont modifies.

 

BC41 : lecture des durées d' exposition des couleurs du bord
CA : ne pas fumer ;
CF : H et L contiennent les valeurs programmees avec le call précédent;
: AF et HL sont modifies.

 

BC44 : remplissage d'un rectangle
Ce n'est pas un Fill mais juste un Cis de zone rectangle. On peut définir la couleur de cet effacement a l'aide d'un masque crée par l'appel du vecteur BC2C, par exemple. Les coordonnées sont exprimées en caractères.
CA : A contient le masque de couleur ; : H est la colonne de gauche;
: D est la colonne de droite ;
: L est le numéro de la ligne supérieure ;
: E est le numéro de la ligne inférieure ;
CF : HL, BC, DE et AF sont modifies.

 

BC47 : comme ci-dessus, sauf qu'on passe par une adresse écran au lieu de coordonnées
CA : A contient le masque de la couleur a appliquer ;
: HL contient I'adresse écran du bord haut gauche du rectangle a -remplir ;
: D contient Ie nombre d'octets;
: E contient Ie nombre de lignes ;
CF : HL, BC, DE et AF sont modifies.

 

BC4A : inversion des couleurs d'un caractère
C'est l'action que réalise le curseur.
CA : B est le masque de la couleur du fond;
: C est le masque de la couleur de l'encre;
: H est le numéro de la colonne ;
: L est le numéro de la ligne ;
CF : AF, BC, DE et HL sont modifies.

 

BC4D : fait scroller verticalement I' écran de 8 pixels
Comme cela se passe en mode caractère, cette routine utilise le CRTC au niveau hardware.
CA : B différent de 0 pour un scrolling normal (l'écran monte);
: Si B=0, l'écran descend dans un scrolling inverse;
CF : AF, BC, DE et HL modifies.

 

BC50 : fait scroller verticalement une fenêtre de 8 pixels
Contrairement a la précédente, cette routine travaille obligatoirement en soft, ce qui explique les saccades.
CA : B différent de 0 pour un scrolling normal;
: si B=O, l'écran descend dans un scrolling inverse;
: A contient Ie masque de couleur de l' encre ;
: H contient Ie numéro de la colonne de gauche;
: D contient Ie numéro de la colonne de droite ;
: L contient Ie numero de la ligne du haut ;
: E contient Ie numero de la ligne du bas;
CF : AF, BC, DE et HL modifies.

 

BC53 : conversion de la matrice d'un caractere standard en une autre compatible avec le mode courant
Comme le CPC dispose de modes dont les affichages des caracteres et des pixels sont differents, cette routine se charge de convertir les images binaires des caracteres en masques de points a afficher.
CA : HL contient l'adresse de la matrice du caractere de depart ;
: DE contient l'adresse d'une zone de memoire libre capable de recevoir la matrice generee (max 32 octets en mode 0) ;
CF : AF, BC, DE et HL sont modifies.

 

BC56 : conversion d'un caractere ecran en une matrice binaire de huit octets
Realisation de l'operation inverse de celie du vecteur precedent. Est utile lors des changements de modes si le caractere n' est pas encore stocke sous forme de matrice.
CA : A contient le masque de l'encre d' ecriture du caractere ;
: H contient la colonne ou il est;
: Len contient la ligne ;
CF : BC, DE, HL et AF modifies.

 

BC59 : positionne le mode graphique
II est possible de preciser la maniere dont seront affiches les pixels.
Quatre modes differents existent: l' affichage avec ecrasement du fond (0) ; le OU logique exclusif avec Ie fond (1) ; le ET logique (2) ; et le OU logique inclusif (3). Ces opérations logiques sont binaires et correspondent à l'algèbre de Boule.
CA : A contient le mode d'affichage des points (opération logique de 0 à 3);
CF : AF, BC, DE et HL modifies.

 

BC5C : affichage d'un point sur l'écran
Pas de mode, le fond est ecrase.
CA : B contient le masque de l'encre;
: C contient Ie masque du point; : HL contient l'adresse memoire du point;
CF : AF est modifie.

 

BC5F : traçage d'une ligne horizontale
Quoi de plus bete qu'un trait?
CA : A contient le masque de l'encre ; : DE contient l'abscisse de depart; : BC contient l'abscisse d'arrivee;
: HL contient la ligne ;
CF : AF, BC, DE et HL modifies.

 

BC62 : traçage d'une ligne verticale
Avec les deux derniers vecteurs, on peut faire des croix.
CA : A contient le masque de l'encre;
: DE contient l'abscisse (coordonnee horizontale) ;
: HL contient l'ordonnee de départ ;
: BC contient l'ordonnee d'arrivee ; CF : AF, BC, DE et HL modifies.

 


*** LES FICHIERS ***

BC65 : initialisation du gestionnaire cassette .
Cela permet de remettre en forme toutes les variables système de ce périphérique.
CA : rien à passer.
CF : AF, BC, DE et HL modifiés.

 

BC68 : positionnement de la vitesse d'écriture
Alors là, je ne puis vous en dire plus. A mon avis, il vaut mieux garder la valeur par défaut. Quoi qu'il en soit, je ne pense pas que ce vecteur agisse sur le lecteur de disquette. Je vous refile les commentaires tels que je les ai.
CA : HL contient la longueur de la moitié d'un bit à zéro (je ne puis vous dire en quelle unité c'est exprimé) ;
: A contient la précompensation à appliquer (la précompensation est normalement la valeur à partir de laquelle un réglage doit être effectué. Ici, va savoir...)
CF : AF et HL modifiés.

 

BC6B : affichage des messages
Le gestionnaire donne des messages concernant l'état d'avance de la lecture ou de la sauvegarde d'un fichier en nombre de blocs. Ce vecteur autorise ou inhibe ces messages, comme le fait un point d'exclamation au début du nom d'un fichier.
CA : A=0 interdit, dans les autres cas, autorise.
CF : AF modifié.

 

BC6E : mise en route du moteur cassette
Rien à dire sur ce vecteur si ce n'est qu'il n'influence pas le lecteur de disquette.
CA : aucune.
CF : A contient l'état précédent du moteur. De plus, si le moteur fonctionne, la retenue (Carry) est à un.

 

BC71 : arrêt du moteur cassette
Voir &BC6E.
CA : aucune.
CF : comme le vecteur précédent.

 

BC74 : restauration de l'état du moteur cassette
Pour remettre le moteur dans l'état dans lequel on l'avait trouvé avant d'intervenir.
CA : le contenu de l'accumulateur récupéré par l'un des deux vecteurs précédents.
CF : voir &BC6E.

 

BC77 : lecture du premier bloc d'un fichier avec installation du tampon de transfert
Pour que le système sache quel est le type du fichier à lire, il faut avant tout qu'il en charge le premier enregistrement de 128 octets.
Grâce aux informations qu'il contient, toutes les variables système sont initialisées.
CA : B contient la longueur du nom de fichier;
: HL l'adresse du nom de fichier;
: DE l'adresse du tampon de 2 Ko servant à recevoir les données en provenance du disque.
CF : si tout se passe bien, le carry vaut un et le drapeau de zéro est nul. Dans ce cas:
: HL pointe sur le tampon contenant l'en-tête du fichier;
: DE pointe sur les données;
: BC contient la longueur du fichier;
: A est le type du fichier.

 

BC7A : fermeture du fichier
A ce sujet, fermons-la!
CA : réduites à néant.
CF : si tout se passe bien, le carry vaut un. Dans tous les cas, HL, BC, DE et AF sont modifiés.

 

BC7D : abandon de la lecture et fermeture du fichier actif
CA : sans commentaire.
CF : AF, BC, DE et HL sont modifiés.

 

BC80 : lecture d'un octet CA : pas de condition.
CF : si tout se passe bien, le carry vaut un et zéro vaut zéro. A reçoit alors le caractère lu. Si le carry et zéro sont tous deux nuls, alors la fin de fichier est atteinte.

 

BC83 : transfert d'un fichier en mémoire
CA : HL doit pointer sur l'adresse où devront arriver les données.
CF : si le carry vaut un et zéro zéro, HL pointe sur le point d'entrée de la routine chargée. Dans tous les cas, HL, BC, DE, IX et AF sont modifiés.

 

BC86 : annulation de la lecture d'un octet
Lorsque vous lisez une donnée par l'intermédiaire de la routine &BC80, il vous est possible de la remettre dans le tampon disque en appelant ce vecteur.
CA : néant.
CF : rien.

 

BC89 : test de la fin de fichier
Il est toujours bon de savoir où on met les pieds.
CA : pas de condition.
CF : si le carry et le zéro valent zéro, alors la fin de fichier est atteinte. Si le carry vaut un, alors on peut lire tranquille.

 

BC8C : ouverture d'un fichier en sortie
Dans ce fichier, nous pourrons écrire à loisir.
CA : B contient la longueur du nom de fichier;
: HL l'adresse du nom de fichier;
: DE l'adresse du tampon de 2 Ko disponible pour le fichier.
CF : si tout se passe bien, le carry est vrai et le zéro est faux. Dans ce cas, HL pointe sur une zone mémoire qui sera écrite en début de chaque bloc de données.

 

BC8F : fermeture propre d'un fichier de sorties
Faire les choses proprement n'est pas forcément mauvais.
CA : pas de conditions.
CF : si tout se passe bien, le carry vaut un et le zéro zéro. Dans le cas où il n'existait pas de fichier ouvert, les deux drapeaux sont nuls.

 

BC92 : fermeture immédiate de fichier de sorties
Il arrive qu'on n'ait pas envie d'écrire le tampon de données sur bande. Dans ce cas, ce vecteur fait l'affaire.
CA : sans.
CF : HL, BC, DE et AF sont modifiés.

 

BC95 : écriture d'un caractère dans le fichier de sortie
Pourquoi se poser plus de questions? CA : A contient le caractère à écrire.
CF : si l'opération est réussie, alors le carry est à un et le zéro à zéro. Si le fichier n'était pas ouvert, alors les deux drapeaux sont faux. Dans tous les cas, AF et IX sont modifiés.

 

BC98 : transfert d'une zone mémoire vers la cassette
Il est bon de pouvoir sauver des données.
CA : HL contient l'adresse mémoire des données;
: DE le nombre d'octets à écrire;
: BC l'adresse du point d'entrée;
: A est le type du fichier.
CF : comme pour le vecteur précédent, mais HL, BC et DE sont aussi altérés

 

BC9B : génération du catalogue
Mieux vaut savoir de quoi il retourne.
CA : DE doit contenir l'adresse du tampon servant à recevoir les informations du catalogue.
CF : si tout se passe bien, le carry vaut un et le zéro zéro.

 

BC9E : écriture d'un enregistrement sur bande
CA : HL contient l'adresse des données à écrire;
: DE contient le nombre d'octets à écrire;
: A contient le caractère de synchronisation.
CF : les registres AF, HL, BC, DE et IX sont modifiés. Si tout se passe bien, le carry est vrai.

 

BCA1 : lecture d'un enregistrement cassette
CA : HL contient l'adresse en mémoire où seront transférées les données.
: DE contient le nombre d'octets à lire;
: A contient le caractère de synchronisation;
CF: comme pour le vecteur précédent.

 

BCA4 : comparaison de données entre la mémoire et le fichier
Mieux vaut être sûr!
CA : HL contient l'adresse des données à comparer;
: DE contient le nombre d'octets à comparer;
: A contient le caractère de synchronisation.
CF : comme pour le vecteur précédent.

 


*** LE NOYAU (KERNEL) ***

Le kernel est le centre de gestion du CPC. Il contient tous les vecteurs d'interruption ainsi que la gestion des plans mémoire, surtout en ce qui concerne les rom. Les RSX sont aussi pris en charge par cette partie du système. Sur CPC, les interruptions gèrent de nombreuses et diverses temporisations. La couleur ainsi que la musique sont prises en charge par ces files d'événements. Cette partie est donc très intéressante à utiliser.

 

BCC8 : remise en forme et nettoyage de toutes les files d'interruption ainsi que des chronomètres
Il faut bien pouvoir faire le ménage dans tout ce fouillis.
CA : pas de condition.
CF : DE contient l'adresse du vecteur d'interruption appelé par défaut. B la Rom sélectionnée, si c'est le cas. Si le programme est en ram,C contient l'adresse de la rom à sélectionner. AF et HL sont modifiés.

 

BCCB : recherche et initialisation de toutes les rom de second plan
Mieux vaut savoir où trouver ses petits.
CA : DE-HL forment la plage dans laquelle doit se faire la recherche de rom.
CF : DE-HL contient la nouvelle plage de gestion des rom. AL et BC sont modifiés.

 

BCCE : initialisation d'une rom de second plan
Il peut y avoir deux rom sur un même plan.
CA : C contient l'adresse de sélection de rom à tester;
: DE-HL contient la plage dans laquelle la rom doit être recherchée. CF : DE-HL contient la plage de mémoire dans laquelle se trouve la rom installée. AL et BC sont modifiés.

 

BCD1 : installation d'un RSX
Pratique les nouvelles commandes.
CA : BC contient l'adresse de la table des commandes RSX ;
: HL pointe sur une zone libre de quatre octets pour la gestion par le système.
CF : DE est modifié.

 

BCD4 : recherche d'un RSX dans les rom
CA : HL pointe sur le nom du RSX.
CF : si le RSX existe, HL contient l'adresse en mémoire, C le plan mémoire visé et Carry vaut un.
Dans tous les cas, AF, BC et DE sont modifiés.

 

BCD7 : initialisation et déposé d'un bloc d' événement dans la liste de ceux a activer lors d'une interruption en provenance du CRT .
Lorsque vous appelez ce vecteur, il met tout en ordre pour que la routine citée soit appelée a chaque fois qu'il est possible.
CA: contient l'adresse du bloc d' événement ;
B contient la classe de l' événement;
C contient l'adresse de sélection de la Rom;
DE contient l'adresse de la routine a insérer dans la file des événements temporises.
CF: AF, DE et HL modifies.

 

BCDA: déposé d'un bloc d'événement dans la liste de ceux a activer lors d'une interruption en provenance du CRT
Comme il est possible d enlever un bloc d' événement dans la file d'attente avec le vecteur suivant, il est possible de le remettre avec celui-ci.
CA : HL Contient l'adresse du bloc d' événement;
CF : AF, DE et HL modifies.

 

BCDD : enlève un bloc d'événement de la liste de ceux a activer lors d'une interruption en provenance du CRT
Voir la légende du vecteur précédent
CA : HL contient l'adresse du bloc d'événement ;
CF : AF, DE et HL modifies.

 

BCE0 : initialisation et dépose d'un bloc d' événement dans la liste de ceux a activer lors d'une interruption rapide (tous les 1/300' seconde)
S'il te plaît, monsieur le système, peux-tu me lancer cette routine 300 fois par seconde ? Pas de problème Batman, on y va...
CA: HL contient l'adresse du bloc d'événement;
B contient la classe de l'événement;
C contient l'adresse de sélection de la Rom;
DE contient l'adresse de la routine a insérer dans la file des événements temporises.
CF : AF, DE et HL modifies.

 

BCE3 : pose d'un bloc d' événement dans la liste de ceux a activer lors d'une interruption rapide
Le même vecteur que &BCDA mais pour les interruptions rapides.
CA: HL contient l'adresse du bloc d'événement
CF : AF, DE et HL modifies.

 

BCE6 : enlevé un bloc d'événement de la liste de ceux à activer lors d'une interruption rapide
Comme &BCDD mais pour les interruptions au 1 /300'
CA: HL contient l'adresse du bloc d'événement
CF: AF, DE et HL modifies.

 

BCE9 : dépose simple d'un bloc d'événement dans la liste de ceux iI activer lors d'une interruption normale (tous les 1/50' seconde)
Attention! ici le bloc d'événement n'est pas initialise. II faut utiliser le vecteur BCEF pour cela.
CA: HL contient l'adresse du bloc d'événement;
DE contient la valeur a installer dans le compteur ;
BC contient la valeur de recharge de ce compteur lorsqu'il atteint la valeur O.
CF : AF, BC, DE et HL modifies.

 

BCEC : enlevé un bloc d'événement dans la liste de ceux à activer lors d'une interruption normale II est possible de suspendre le lancement de certaines routines lentes sans pour autant les enlever de la file d' attente.
CA: HL contient l'adresse du bloc d'événement
CF : si le bloc d'événement appartenait bien a la liste, la retenue est vraie et DE contient la valeur du compteur. Dans tous les cas, AF, DE et HL modifies.

 

BCEF : initialise un bloc d'événement de manière à ce qu'il soit gérable par les deux vecteurs precedents
Installer un événement dans une liste, c'est bien mais encore faut-il que la zone de mémoire concernée soit réellement un bloc de contrôle. C'est ici que nous le créons.
CA: HL contient l'adresse du bloc d'événement;
B contient la classe de l'événement;
C contient l'adresse de sélection de la Rom;
DE contient l'adresse de la routine;
CF: AF et DE sont modifies et HL contient l'adresse du bloc d'événement augmentee de 7 octets.

 

BCF2 : actionne un bloc d'événement
Des compteurs sont mis en action lors des appels des interruptions. Le fait de passer par ce vecteur permet le lancement conditionnel de la routine tout en modifiant les compteurs et les priorités mis en oeuvre.
CA: HL contient l'adresse du bloc
d'événement
CF: les registres sauf IX et IY sont
modifies en fonction de la routine appelée.

 

BCF5 : fait le ménage dans toutes les files d'attente d'événements temporises
CA : rien a configurer.
CF : AF et HL sont modifies.

 

BCF8 : détruit un événement en l'enlevant physiquement de la file d'attente
CF : HL contient l'adresse du bloc d'événement.
CA : AF, BC, DE et HL modifies.

 

BCFB: recherche de l'événement suivant a traiter
Cela permet de savoir si des taches restent a remplir ou non.
CA: rien à faire.
CF: si une routine est trouvée, la retenue est vraie et HL contient l'adresse du bloc d'événement. De toute manière, AF, DE et HL sont modifies.

 

BCFE : traite un bloc d'événement
Dans ce cas, le lancement de la routine associée au bloc n'est pas force.
CA : HL contient l'adresse du bloc d'événement.
CF : AF, BC, DE et HL modifies.

 

BD01 : termine le traitement d'un événement
Permet de modifier les niveaux de priorité des événements vises. Le système réalise cette opération en fonction des priorités de tous les événements.

 

BD04 : interdiction des événements temporises normaux
Les files d'attente d'événements ne sont plus scannées.
CA : rien.
CF : HL est modifie.

 

BD07 : réautorise les événements temporises conventionnels Quand on a utilise le vecteur précèdent. on peut inverser l'action avec celui-ci.
CA : aucune.
CF : HL est modifie.

 

BD0A : interdit un événement
Ce vecteur permet de stopper l'action d'un événement sans pour autant perdre du temps avec la gestion de la file d' attente.
CA: HL contient l'adresse de l'événement.
CF : AF est modifie.

 

BD0D : donne le temps écoule en 1/300' de seconde depuis l'allumage du CPC
CA: rien a prévoir.
CF : DEHL forme le nombre demande sur 32 bits.

 


*** INTERFACE MATÉRIELLE ***

Les programmeurs de la Rom ont classé ainsi tous les gestionnaires de mémoire morte, les compteurs, les points d'entrée d'interruptions... Voici la liste de ces vecteurs:

 

BD10 : positionne le compteur interne à une valeur précise
BD10 est utilisé à l'allumage de la machine pour mettre l'horloge interne à zéro.
CA: DE contient le poids fort de la valeur; HL contient le poids faible.
CF : AF est modifié.

 

BD13 : charge un programme en Ram et le lance
Quoi de plus normal qu'un système se charge de cette tâche.
CA: HL contient l'adresse de la routine à appeler pour charger le programme (le vecteur cassette ou disquette accompagné des paramètres adéquats).
CF : les registres modifiés par le pro gramme appelé.

 

BD16 : lance un programme d'une Rom de second plan
Il est agréable de disposer de vecteurs indirects permettant d'appeler des routines stockées en Rom.
CA: HL contient l'adresse de la routine; C représente le numéro de la Rom.
CF: Dis monsieur le programme en
Rom, quels registres modifies-tu?

 

BD19 : synchronisation avec le CRTC
Appeler B019 revient à demander au CPC d'attendre que le balai qui génère l'image écran soit arrivé derrière le moniteur.
CA: aucune.
CF: pas plus, pas moins.

 

BD1C : positionnement du mode écran (chose importante, le changement de mode s'effectue sans effacement de l'écran)
Vous connaissez l'instruction Basic Mode, alors vous connaissez ce vecteur.
CA: A contient le numéro du mode (0,1 ou 2).
CF: AF est modifié.

 

BD1F : positionnement de l'offset de la mémoire vidéo
On peut se servir de ce vecteur pour opérer des scrollings hardwares à l'écran.
CA: A contient la base de l'adresse de la mémoire vidéo (&00, &40, &80 ou &CO selon le segment) ; HL contient l'offset (notez que ce dernier ne progresse que par pas de deux).
CF: AF est modifié.

 

BD22 : standardisation de la palette
Toutes les encres sont mises dans la couleur précisée (simulation d'effacement d'écran).
CA: DE contient l'adresse sur un vecteur encre (deux couleurs).
CF: AF est modifié.

 

BD25 : la palette modifiée (bis)
Comme pour le vecteur B022 mais agit aussi sur le border.
CA: DE contient l'adresse sur un vecteur encre.
CF: AF est modifié.

 

BD28 : initialisation du détournement vers l'imprimante
Il y a du PRINT #8 dans l'air.
CA: pas de paramètre.
CF: AF BC DE et HL sont modifiés.

 

BD2B : envoi d'un caractère à l'imprimante avec retour
Si l'imprimante est occupée, le système fera en sor:e d" attendre un peu et rendra la main 3vec un statut d'erreur si besoin est Attention 1 la donnée envoyée est perdue quoi qu'il arrive.
CA. A contient le code Ascii du caractère a envoyer.
CF: AF est modifié Si la retenue (carry) est vraie. tout s'est bien passé. Si elle est fausse, l'imprimante est restée occupée trop longtemps.

 

BD2E : test de l'imprimante
Le signal testé se nomme Busy.
CA : rien à faire.
CF: si la retenue est vraie, l'imprimante est occupée.

 

BD31 : envoi d'un caractère à l'imprimante sans retour
Pour l'appel de cette fonction, l'imprimante ne doit pas être occupée.
CA : A contient le caractère à envoyer.
CF: la retenue est toujours vraie; AF toujours modifié.

 

BD34 : envoi d'une donnée dans le PSG AY3 W8912
Quel nom barbare pour parler du générateur sonore. Si vous voulez en savoir plus, consultez les anciennes rubriques Bidouilles qui se sont étalées sur ce sujet
CA: A contient le numéro du registre; C contient la donnée.
CF : AF et BC sont modifiés.

 

 


*** LES BLOCS DE SAUT ***

Tous les vecteurs sont rangés en mémoire selon la grande liste que nous avons parcourue ensemble. Si certains ont étés détournés à des fins plus ou moins douteuses, il est possible de les réinitialiser grâce au vecteur suivant.

 

BD37 : réinitialise les blocs de saut standard
C'est pas un CALL a mais presque!
CA : rien à faire, cool!
CF: AF, BC, DE et HL modifiés.

 

Article rédigé par Christophe PETIT

 

Article créé le : Samedi 26 Septembre 2015 à 18 h 32
Dernière mise à jour le : Samedi 26 Septembre 2015 à 22 h 05
 
 

CPC-POWER/CPCArchives, projet maintenu par Fredouille.
Programmation par Kukulcan © 2007-2017 tous droits réservés.
Reproduction sans autorisation interdite. Tous les titres utilisées appartiennent à leurs propriétaires respectifs.