Você está na página 1de 403

1

Pierre LOGLISCI

Le microcontrôleur
PIC
16F84

Edition de l’Auteur
2

 Cet ouvrage est la propriété de l’Auteur.

Il est protégé par les Lois sur le Copyright.

Aucune partie de ce livre ne peut être reproduite,


sous aucune forme ou par un quelconque procédé
(électronique, photocopie, CD ou autre), sans l’autorisation
écrite de l’Auteur.

La bible pour désassembler à la main est une nouveaté mondiale,


idée originale de l’Auteur.

- Le nom et le logo MICROCHIP sont des Marques déposées de


MICROCHIP Technology Inc. - Arizona - USA

- PIC, PICmicro, PICMASTER, PICSTART Plus, PROMATE 2, MPASM,


MPLAB, MPLAB-ICE, MPLAB-IDE, MPLIB et MPLINK sont des
Marques de MICROCHIP

- WINDOWS, MICROSOFT et MICROSOFT INTERNET EXPLORER


sont des Marques déposées de MICROSOFT

- PicBASIC est une Marque déposée de Micro Engineering Labs


3

Dédicace

Lorsque ce travail n’était qu’un manuscrit, mon plus grand problème fut
de savoir comment faire pour lui donner une forme dactylographique
acceptable pour être lu par tous.

Je n’avais que très peu de connaissances en ce qui concerne l’utilisation


du clavier, des logiciels de traitement de texte et d’images, et du scanner...
Je ne savais pas comment créer les indispensables tableaux, ni comment
accéder aux caractères spéciaux....
Je n’avais aucune expérience de composition et de mise en page...
Bref : je ne savais pas comment m’y prendre pour faire en sorte qu’un tas
de feuilles gribouillées à la main deviennent un livre...

Si j’y suis parvenu, c’est grâce à l’aide spontanée et constante que m’a
apportée ma fille Elodie qui - comme un guide de haute montagne - m’a
précédé dans la difficile ascension en m’ouvrant des chemins faciles et sûrs,
toujours en se mettant à ma place, dosant les difficultés à la mesure de
l’effort qu’elle savait que j’étais capable de fournir .
Sans jamais faire de concessions, elle s’est de nombreuses fois obligée à
chercher - chez elle, sur son propre PC - les solutions pratiques aux
problèmes que je lui soumettais, au fur et à mesure qu’ils se présentaient.
4

C’est à elle que je dédicace ce livre.

Pour son aide, bien sûr ; mais aussi pour les constants encouragements
répétés qu’elle m’a donnés, l’enthousiasme qu’elle a partagé avec moi
pendant tout le temps que j’ai consacré au projet, et son doux sourire, dont
elle m’entoure encore.
5

Avant-propos

Bien qu’il existe une déjà abondante littérature sur les


microcontrôleurs PIC en général, l’amateur qui veut s’attaquer à une
réalisation personnelle utilisant le modèle 16F84 n’y arrive qu’au prix de
gros efforts.
Ceci à cause du fait qu’il y a plusieurs modèles de PIC qui, tout en
possédant la même philosophie, diffèrent sensiblement l’un de l’autre (par
le nombre d’instructions, le nombre de pages mémoire, le nom des
registres, la présence ou l’absence de ressources internes...) et déroutent
celui qui en entreprend l’étude pour la première fois.
Or, si les ouvrages traitant les microcontrôleurs PIC en général
sont nombreux, aucun n’aborde le 16F84 en particulier.
Dans ces conditions, le lecteur qui ne s’intéresse qu’à ce modèle
exclusivement, doit se livrer à tout un travail pour séparer ce qui est
important et nécessaire (parce que ça concerne le 16F84) de ce qui est
superflu (parce que ça ne concerne pas le 16F84 mais se réfère à d’autres
modèles).
Aussi j’ai condensé dans cet ouvrage les seules notions pratiques
nécessaires pour aborder un montage personnel à base de 16F84.

Il y a plusieurs raisons à cela.

En premier lieu, ce modèle possédant une mémoire EEPROM


effaçable électriquement, s’impose comme la solution idéale pour ceux qui
veulent apprendre à utiliser un microcontrôleur PIC, du fait qu’il est
reprogrammable jusqu’à plus de 1.000 fois (selon les spécifications du
fabricant).

Associé à de simples organes périphériques, il représente l’outil


d’apprentissage par excellence, car le lecteur peut tester tous les
programmes avec le même microcontrôleur et revenir sur les erreurs, les
corriger et rapidement re-tester l’application.
6

Ce microcontrôleur possède un fusible interne, accessible par


programmation, qu’il faudra se garder de laisser intact. Car lorsque ce
fusible a été brûlé, le microcontrôleur, s’il peut encore être effacé et
reprogrammé, ne peut plus être lu correctement , car sa mémoire est
restituée complètement désorganisée.
Bien utile pour ceux qui mettent au point une application commerciale
qu’ils veulent protéger et mettre à l’abri de copies sauvages, ce fusible doit
être ignoré pendant la durée de l’étude.
Cette accessibilité permanente de la mémoire représente l’aspect le
plus original de tous les microcontrôleurs à mémoire flash, parmi lesquels
trône le 16F84.
De plus, la capacité mémoire de ce modèle (ni trop petite ni trop
grande) le prédestine comme le compromis idéal non seulement pour
l’auto-apprentissage, mais aussi pour les premières applications
personnelles que chacun aura envie d’inventer.
Car, s’il est incontestable qu’on peut parvenir à la réalisation d’un
grand nombre de dispositifs en téléchargeant programmes et circuits
imprimés à partir des nombreux sites consacrés aux microcontrôleurs, dans
ce domaine particulier de la microélectronique seules les capacités
personnelles comptent.
C’est pourquoi ce livre s’adresse tout particulièrement à qui veut
vraiment prendre ... dans une main le PIC 16F84 ... et dans l’autre les
indispensables outils de développement et... le fer à souder !

Les seules connaissances exigées pour en aborder la lecture sont


les bases fondamentales de l’électronique générale et de l’électronique
logique.

Un avertissement tout de même - s’il était nécessaire - consiste à


rappeler que pour maîtriser la réalisation d’un montage incorporant un
microcontrôleur 16F84 il faut disposer d’un ordinateur et d’un outil de
développement (pouvant être soit une copie de l’assembleur MPLAB que
Microchip distribue gratuitement sur son site Internet, soit un compilateur
BASIC). Nous verrons ceci plus loin, dans la section traitant de la
programmation.
7

Du contrôleur au microcontrôleur
Pour le dire avec des mots simples, un contrôleur est un dispositif
qui - placé au cœur d’un processus - surveille l’évolution d’un événement et
compare son état (ou sa valeur) à une donnée prédéterminée, pour
intervenir dès que les limites préfixées sont atteintes.

De ce point de vue, un contrôleur n’est pas forcément électronique.


Il peut être mécanique, pneumatique, thermique, etc..

Son travail consiste à surveiller (lire) la valeur d’une situation, et à


la comparer en permanence à une valeur fixée d’avance.
Lorsqu’il y a une différence entre la valeur lue et celle fixée, le contrôleur
génère une commande qui - envoyée à un endroit approprié du processus -
réduit cette différence ou ramène les choses à la normale.
Aussi, un thermostat d’ambiance ou la valve de sécurité installée
sur le couvercle d’une cocotte-minute, sont des exemples de contrôleurs
simples.

Un contrôleur peut accomplir une ou plusieurs tâches à la suite.

Les plus souples de tous les contrôleurs sont évidemment les


contrôleurs faisant appel à l’électronique, et plus particulièrement les
microcontrôleurs.

La surveillance de la valeur d’une situation se fait alors au moyen


d’une ou plusieurs lignes d’acquisition de données configurées en entrées,
tandis que l’envoi de commandes se fait au moyen d’une ou plusieurs
lignes configurées en sorties.

L’ensemble des tâches confiées à un microcontrôleur s’appelle


programme.
8

Le microcontrôleur 16F84
Présentation générale

Ce modèle de PIC (Programmable Interface Controler) est un


circuit de petite taille, fabriqué par la Société américaine Arizona
MICROCHIP Technology.
En le regardant pour la première fois, il fait davantage penser à un
banal circuit intégré logique TTL ou MOS, plutôt qu’à un microcontrôleur.
Son boîtier est un DIL (Dual In Line) de 2x9 pattes.

En dépit de sa petite taille, il est caractérisé par une architecture


interne qui lui confère souplesse et vitesse incomparables.

Ses principales caractéristiques sont :

- 13 lignes d’entrées/sorties, réparties en un port de 5 lignes


(Port A) et un port de 8 lignes (Port B)
- alimentation sous 5 Volts
- architecture interne révolutionnaire lui conférant une extraordinaire
rapidité
- une mémoire de programme pouvant contenir 1.019 instructions de 14
bits chacune (allant de l’adresse 005 à l’adresse 3FF)
- une mémoire RAM utilisateur de 68 emplacements à 8 bits (de l’adresse
0C à l’adresse 4F)
- une mémoire RAM de 2x12 emplacements réservée aux registres spéciaux
- une mémoire EEPROM de 64 emplacements
- une horloge interne, avec pré diviseur et chien de garde
- possibilité d’être programmé in-circuit, c’est à dire sans qu’il soit
nécessaire de le retirer du support de l’application
- vecteur de Reset situé à l’adresse 000
- un vecteur d’interruption, situé à l’adresse 004
- bus d’adresses de 13 lignes
- présence d’un code de protection permettant d’en empêcher la duplication
- facilité de programmation
- simplicité
- faible prix .
9

Brochage du PIC 16F84


(µC vu de dessus)
10

Le cortège des invariants

Indépendamment de ce qu’on veut faire de ses 13 lignes (que l’on


définit par lignes d’entrée/sortie) et quelle que soit l’application à laquelle
on le destine, un microcontrôleur PIC 16F84, pour pouvoir fonctionner, a
nécessairement besoin de :

- une alimentation de 5 Volts ;


- un quartz et deux condensateurs (si un pilotage précis par base de
temps à quartz est nécessaire), ou une résistance et un condensateur (pour
une base de temps de type RC, économique, utilisable dans les cas ne
demandant pas une extrême précision de cadencement) ;
- un condensateur de découplage (pour réduire les transitoires se
formant inévitablement dans tout système impulsionnel) ;
- un bouton poussoir et une résistance, pour la mise en place d’une
commande de Reset.

Ces éléments - qu’il convient de considérer comme des invariants


devant nécessairement figurer dans tout montage - représentent le cortège
obligatoire de tout microcontrôleur PIC 16F84, de la même façon -
pourrais-je dire - qu’un transistor demande, pour fonctionner, une résistance
de Base et une résistance de Collecteur.

Les applications type sont celles des deux pages suivantes :


11

1) Pilotage par quartz


12

2) Pilotage par oscillateur RC


13

Les Entrées/Sorties
A part les cinq pins réservées au cortège des invariants devant
nécessairement figurer dans tout montage, les treize autres pins du 16F84
servent d’entrées/sorties.

Elles sont regroupées en deux ports : Port A et Port B.

Le Port A possède 5 lignes, nommées:


RA0..........pin 17
RA1..........pin 18
RA2..........pin 1
RA3..........pin 2
RA4..........pin 3 (RA4/T0CKI)
(NB : RA = Register A)

Le Port B possède 8 lignes, nommées:


RB0..........pin 6 (RB0/INT)
RB1..........pin 7
RB2..........pin 8
RB3..........pin 9
RB4..........pin 10
RB5..........pin 11
RB6..........pin 12
RB7..........pin 13
(NB : RB = Register B)

A remarquer que RB0 (pin 6) et RA4 (pin 3), outre qu’à pouvoir
servir d’entrées/sorties, selon la façon dont on les programme peuvent
respectivement servir l’une comme entrée d’interruption et l’autre comme
entrée d’horloge externe pour le pilotage du timer (TMR0).
14

Organisation de la mémoire du PIC 16F84

La mémoire du PIC 16F84 est répartie en trois espaces, logés sur


la même pastille de silicium :

1) Une mémoire EEPROM de type flash, de 1 K mots de 14 bits,


allant de l’adresse 000 à l’adresse 3FF.
Cet espace est dénommé mémoire de programme, dont le plan est le
suivant :

5 adresses réservées au µC 000 Vecteur de Reset


(adresses que je 001
conseille de sauter) 002
003
004 Vecteur d’Interruption

005 Début du programme


utilisateur
.

1019 adresses
restantes, .
disponibles pour y loger
les instructions de
votre programme .

3FF Fin de l’espace mémoire


disponible
15

Cette mémoire est celle dans laquelle le programmateur écrit les


instructions du programme.

Dans cet espace mémoire, les cinq premières adresses (000, 001,
002, 003, et 004) sont réservées au microcontrôleur.

Certaines d’entre elles sont particulièrement remarquables :

a) l’adresse 000 correspond au vecteur de Reset.


A la mise sous tension, ou à chaque fois que des instructions spécifiques
l’obligent, le Program Counter (PC) se rend à cette adresse et c’est là que le
système trouve la première instruction à exécuter.
C’est une case devant obligatoirement être remplie et contenir l’origine du
programme (ORG).
Si cette adresse était vide, le microcontrôleur ne ferait rien, car aucun
programme ne serait exécuté.

b) l’adresse 004 correspond au vecteur d’interruption.


C’est l’adresse « point de rencontre » définie par le fabricant, à laquelle
système et utilisateur se rendent lorsqu’un problème surgit, pour se dire ce
qu’il se passe et quel sont les remèdes d’urgence à apporter.

2) une mémoire de données (Data Memory) EEPROM flash, de 64


emplacements à 8 bits, allant de l’adresse 00 à l’adresse 3F, auxquels on
accède uniquement par l’intermédiaire de quatre registres spéciaux:
-EEADR (EEprom ADRess) pour ce qui concerne les adresses
- EEDATA (EEprom DATA) pour ce qui concerne les données
- EECON1 (EEprom CONtrol) permettant de définir le
- EECON2 mode de fonctionnement de cette mémoire.

Pour lire dans cette mémoire, les étapes à suivre sont les suivantes :
1) on écrit l’adresse dans le registre EEADR ;
2) on met à 1 le bit 0 (RD : Read Data) du registre EECON1 (ce qui
provoque le transfert de la donnée dans le registre EEDATA) ;
3) on lit la donnée dans le registre EEDATA où elle est devenue disponible.
16

Exemple : on veut lire le contenu de l’emplacement mémoire 03 :

BCF STATUS,RP0
MOVLW 03
MOVWF EEADR
BSF STATUS,RP0
BSF EECON1,0
BCF STATUS,RP0

A partir de ce moment, ayant autorisé le mode « lecture », la


donnée contenue à l’adresse 03 est disponible dans le registre EEDATA, et
on peut l’utiliser comme on veut.

Ainsi, par exemple, on veut lire une donnée en EEPROM et la


porter dans le registre W :

BCF STATUS,RP0
MOVLW adresse dont on veut lire le contenu
MOVWF EEADR
BSF STATUS,RP0
BSF EECON1,0
BCF STATUS,RP0
MOVF EEDATA,W

Voyons maintenant comment écrire une donnée en EEPROM :

BCF STATUS,RP0
BCF INTCON,7
MOVLW donnée que l’on veut écrire
MOVWF EEDATA
MOVLW adresse
MOVWF EEADR
BSF STATUS,RP0
BCF EECON1,4
BSF EECON1,2
MOVLW 55
MOVWF EECON2
MOVLW AA
MOVWF EECON2
17

BSF EECON1,1
BCF EECON1,2
BSF INTCON,7
BCF STATUS,RP0

Cette séquence montre que pour écrire dans cette mémoire, les étapes à
suivre sont un peu plus complexes, car on est obligé de passer d’abord par
EECON2 avant de confirmer la donnée par EECON1 :
1) on interdit les interruptions ;
2) on écrit la donnée dans le registre EEDATA ;
3) on écrit l’adresse dans le registre EEADR ;
4) on configure le registre EECON1
5) on envoie la séquence définie par Microchip (55 et AA)
6) on reconfigure les registres EECON1, INTCON et STATUS.

Voyons les choses plus en détail au moyen d’un autre exemple


montrant l’écriture d’une donnée (par exemple : 13) à une certaine adresse
(par exemple : 1F) :

EEDATA EQU 08
EEADR EQU 09
EECON1 EQU 88
EECON2 EQU 89
INTCON EQU 0B
BCF INTCON,7
MOVLW 13
MOVWF EEDATA
MOVLW 1F
MOVWF EEADR
BSF STATUS,RP0
BCF EECON1,4
BSF EECON1,2
MOVLW 55
MOVWF EECON2
MOVLW AA
MOVWF EECON2
BSF EECON1,1
BCF EECON1,2
BSF INTCON,7
BCF STATUS,RP0
18

3) Une mémoire RAM à 8 bits, que Microchip appelle Register File,


réservée aux données.
A plus proprement parler, il s’agit d’une RAM statique (SRAM).

Cet espace est à son tour réparti en deux zones :

a) une zone RAM de 24 emplacements à 8 bits réservée aux


registres spéciaux, dont 12 situés en Page 0 (adresses 00 à 0B) et 12 situés
en Page 1 (adresses 80 à 8B) selon la mappe suivante :

Page 0 Page 1
00 Adressage indirect 80 Adressage indirect
01 TMR0 81 OPTION
02 PCL 82 PCL
03 STATUS 83 STATUS
04 FSR 84 FSR
05 PORT A 85 TRIS A
06 PORT B 86 TRIS B
07 87
08 EEDATA 88 EECON1
09 EEADR 89 EECON2
0A PCLATH 8A PCLATH
0B INTCON 8B INTCON

Ces registres - auxquels on accède en programmant le bit 5 (RP0) du


registre STATUS - servent à contrôler le fonctionnement de nombreux
organes internes au PIC. Nous y reviendrons plus en détail;

b) une zone RAM de données, constituée de 68 emplacements à 8


bits (adresses de 0C à 4F) situés juste au dessous des registres spéciaux,
formant la RAM utilisateur proprement dite, selon la mappe détaillée ci-
après :
0C
0D
0E
0F
10
19

11
12
13
14
15
16
17
18
19
1A
1B
1C
1D
1E
1F
20
21
22
23
24
25
26
27
28
29
2A
2B
2C
2D
2E
2F
30
32
33
34
35
36
37
38
39
3A
20

3B
3C
3D
3E
3F
40
41
42
43
44
45
46
47
48
49
4A
4B
4C
4D
4E
4F

Lors de la programmation il faut toujours indiquer l’adresse de la


zone RAM à partir de laquelle le µC doit commencer à écrire, ainsi que le
nombre d’emplacements à réserver pour chaque variable.

Comme ceci, par exemple :

ORG OC
Compteur RES 3

Ce qui revient à dire : réserve trois emplacements à la variable Compteur,


dans l’ordre suivant :

Compteur à l’adresse 0C
Compteur+1 à l’adresse 0D
Compteur+2 à l’adresse 0E .
Ainsi, par exemple :

pour effacer les données de l’adresse OE, on écrira :


CLRF Compteur+2.
21

4) et enfin une toute petite mémoire EEPROM, contenant seulement 8


cases, de l’adresse 2000 à l’adresse 2007, réservées au microcontrôleur.

Les adresses 2000, 2001, 2002 et 2003 correspondent aux


emplacements dans lesquels l’utilisateur peut stocker un code
d’identification (en n’utilisant que les quatre bits de poids faible de chacun
de ces mots à 14 bits).

L’adresse 2007 correspond au registre de configuration du


microcontrôleur.

Lui aussi mot de 14 bits, dont les cinq premiers seulement sont utilisables :

4 3 2 1 0
CP PWRTE WDTE FOSC1 FOSC0

- Bit 0 - FOSC0 (OSCillateur zéro) et


- Bit 1 - FOSC1 (OSCillateur un)
sont à programmer en fonction du type d’oscillateur utilisé,
conformément aux spécifications du tableau suivant:

FOSC1 FOSC0 Type d’oscillateur Caractéristiques


0 0 LP (Low Power) Quartz
jusqu’à 200 KHz
0 1 XT Quartz (XT ou 4)
MHz
1 0 HS (High Speed) jusqu’à
20 MHz
1 1 RC RC jusqu’à 4 MHz

- Bit 2 - WDTE (Watch-Dog Timer Enable)


1 = autorise le chien de garde
0 = n’autorise pas le chien de garde
- Bit 3 - PWRTE (PoWeR Timer Enable)
Le µC possède un timer permettant de retarder de 72 ms le
lancement du programme après la mise sous tension du circuit.
1 = le µC attend 72 ms
0 = le µC démarre tout de suite
22

- Bit 4 - CP (Code Protection)


1 = pas de protection (le µC pourra être lu correctement)
0 = avec protection (le µC ne pourra plus être lu correctement.
Le contenu de la mémoire sera désorganisé).
23

Les registres spéciaux

Nous avons dit que dans l’espace mémoire RAM que Microchip
appelle Register File, une zone est réservée aux registres spéciaux.

Le mot registre est utilisé ici pour désigner un emplacement


mémoire, tandis que le mot file signifie groupement.

Certains de ces registres sont situés en Page 0 entre les adresses 00


et 0B, et d’autres sont situés en Page 1 entre les adresses 80 et 8B.
Quelques-uns d’entre eux figurent même dans les deux pages (Page 0 et
Page 1) pour en faciliter l’accès.

Ils ont des noms et des usages spécifiques, et servent à commander


le microcontrôleur.

Il y en a 16 en tout, et sont si importants qu’ils conditionnent


véritablement la programmation.

Ils sont utilisés constamment, et constamment tenus présents dans la tête du


programmeur.

Celui qui veut écrire ne fût-ce qu’un petit programme de quelques


lignes, ne peut pas les ignorer.

C’est pourquoi ils doivent être étudiés et connus à fond.

Examinons-les en détail, un par un, par ordre alphabétique.


24

EEADR (EEprom ADRess)

Registre dans lequel on écrit l’adresse de la mémoire de données


EEPROM (mémoire flash de 64 octets, allant de l’adresse 00 à l’adresse
3F) à laquelle on veut accéder pour y lire ou pour y écrire.

Contrairement à l’EEPROM de programme qui - en plus de la


tension d’alimentation du microcontrôleur - nécessite une tension externe
pour la programmation, cette EEPROM fonctionne avec la seule tension
d’alimentation, dans toute sa plage.
25

EECON1 (EEprom CONtrol 1)

Registre de contrôle permettant de définir le mode de


fonctionnement de la mémoire de données EEPROM (mémoire flash de 64
octets, allant de l’adresse 00 à l’adresse 3F).
Registre à 8 bits, mais dont 5 seulement sont utilisés:
7 6 5 4 3 2 1 0
EEIF WRERR WREN WR RD

Bit 0 : RD (ReaD)
Normalement à 0. Il se met dans cet état de lui-même.
Le programmeur ne peut y écrire que un 1.
N’accepte pas d’être programmé à zéro.

Bit 1 : WR (WRite)
Normalement à 0. Il se met dans cet état de lui-même.
Le programmeur ne peut écrire que un 1.
N’accepte pas d’être programmé à zéro.

Bit 2 : WREN (WRite ENable)


Mis à zéro, interdit toute écriture en mémoire.
Mis à 1, autorise une écriture en mémoire.

Bit 3 : WRERR (WRite ERRor)


Flag d’erreur. Normalement à zéro.
Passe à 1 pour signaler qu’une erreur s’est produite
juste au moment où une écriture était en cours
(Celle-ci n’a pu aboutir parce qu’un événement
inopiné s’est produit ; par exemple un Reset).

Bit 4 : EEIF (EEprom Interrupt Flag)


Flag d’interruption.
Il est automatiquement mis à 1 lorsque la
programmation de l’EEPROM de données est terminée.
Doit être mis à zéro par programmation.
26

EECON2 (EEprom CONtrol 2)

Registre n’ayant aucune consistance physique, et dont le seul rôle


consiste à obliger le programmeur à vérifier les données qu’il envoie dans
l’EEPROM.
27

EEDATA (EEprom DATA)

- Pendant une opération de lecture : registre dans lequel est


disponible la donnée qu’on est allé chercher à une certaine adresse de la
mémoire EEPROM.

- Pendant une opération d’écriture : registre dans lequel on place la


donnée qu’on veut y écrire.
28

FSR (File Select Register)

Sert à sélectionner la mémoire de données, pour pouvoir y accéder.


29

INTCON (INTerrupt CONtrol)

Est le registre qui préside au fonctionnement des interruptions.

Dans le 16F84 il y a quatre sources possibles d’interruptions.


Chaque fois que l’une d’elles surgit, le microcontrôleur (après avoir noté
dans la pile l’adresse de retour) abandonne momentanément (interrompt) le
programme qu’il avait en cours d’exécution et saute à l’adresse 004
(adresse prédéfinie par le fabricant, de la même façon que l’adresse 000 a
été prédéfinie pour la fonction Reset).

En lisant le contenu de ce registre, on peut déterminer la provenance de la


demande d’interruption et aiguiller le programme de manière à y répondre
de façon adéquate.

L’interruption peut être commandée soit par un flanc montant, soit par un
flanc descendant : cela dépend de la façon dont on a préalablement
programmé le bit 6 (INTEDG) du registre OPTION :
1 = l’interruption est générée à l’apparition d’un front
montant ;
0 = l’interruption est générée à l’apparition d’un front
descendant.

Les quatre sources d’interruption possibles sont :

1) la fin d’une programmation de l’EEPROM de données ;

2) le débordement du timer interne ;

3) une commande externe appliquée sur la pin 6 (RB0/INT) ;

4) un changement d’état sur l’une des pins 10, 11, 12 ou 13


(respectivement RB4, RB5, RB6, RB7).
Dans ce cas, seule une configuration des lignes en entrée peut donner
lieu à une éventuelle demande d’interruption.
30

Examinons un par un chacun des bits de ce registre :

7 6 5 4 3 2 1 0
GIE EEIE TOIE INTE RBIE TOIF INTF RBIF

Bit 7 : GIE (Global Interrupt Enable)


Le chef suprême du registre INTCON.
Le roi de toutes les interruptions !
Mis à 1, il autorise la prise en compte de tous les autres
bits de l’octet ; tandis que mis à zéro, il les masque
(même s’ils sont positionnés).
Sous l’action d’un Reset il est automatiquement
mis à zéro.
Pour interdire la prise en compte de toute éventuelle
demande d’interruption pouvant surgir pendant que le
microcontrôleur est déjà occupé à en traiter une, ce bit
(GIE) passe automatiquement à zéro jusqu’à ce que
dans le programme apparaît l’instruction RETFIE,
qui le repositionne à 1.
Au cas où l’utilisation de ce bit soit nécessaire,
il ne faut pas oublier que:
après l’avoir activé (pour ouvrir
l’accès au(x) bit(s) concerné(s),
et après l’instruction RETFIE, c’est à dire
à la fin d’un sous-programme d’interruption,
lorsque son utilisation n’est plus nécessaire,
il faut le mettre à zéro, au risque de placer
les demandes d’interruption
dans un cycle qui les ferait revenir continuellement.

Bit 6 : EEIE (EEprom Interrupt Enable)


Mis à 1, autorise l’interruption que l’EEPROM génère
à la fin de la programmation.

7 6 5 4 3 2 1 0
EEIE
31

Bit 5 : T0IE (Timer zero Interrupt Enable)

7 6 5 4 3 2 1 0
TOIE

Mis à 1, il autorise les interruptions provoquées par le


débordement du timer interne (passage de FF à 00).

Bit 4 : INTE (INTerrupt Enable)

7 6 5 4 3 2 1 0
INTE

Mis à 1, il autorise les demandes d’interruption


provenant de l’extérieur, appliquées sur la pin 6
(RB0 /INT).
NB : ces demandes peuvent se déclencher soit à l’apparition d’un
Front montant, soit à l’apparition d’un front descendant, selon la façon
Dont on a programmé le bit 6 du registre OPTION (INTEDG)
1 = sur front montant
0 = sur front descendant

Bit 3 : RBIE (Register B Interrupt Enable)

7 6 5 4 3 2 1 0
RBIE

Mis à 1, il autorise les interruptions provoquées


par un changement d’état sur les lignes du port B
(RB4, BR5, RB6, RB7).
32

Bit 2 : T0IF (Timer zero Interrupt Flag)


7 6 5 4 3 2 1 0
TOIF

Le fonctionnement de ce flag est conditionné


par l’état du bit 5. Il ne fonctionne que
si le bit 5 a préalablement été mis à 1.
Dans la mesure où le bit 5 est à 1, ce flag passe à 1
chaque fois que le timer TMR0 déborde (passage de
FF à 00).

Bit 1 : INTF (INTerrupt Flag)


7 6 5 4 3 2 1 0
INTF

Le fonctionnement de ce flag est


conditionné par l’état du bit 4. Il ne fonctionne que si le
bit 4 a préalablement été mis à 1.
Dans la mesure où le bit 4 est à 1, ce flag passe à 1
chaque fois qu’une demande d’interruption surgit, pro-
venant de l’extérieur, appliquée sur la pin 6 du boîtier
(RB0/INT).

Bit 0 : RBIF (Register B Interrupt Flag)

7 6 5 4 3 2 1 0
RBIF

Le fonctionnement de ce flag
est conditionné par l’état du bit 3. Il ne fonctionne
que si le bit 3 a préalablement été mis à 1.
Dans la mesure où le bit 3 est à 1, ce bit passe à 1
chaque fois qu’il y a un changement d’état sur l’une
des lignes du port B (RB4, RB5, RB6 ou
RB7) par rapport à la dernière opération de lecture du
port B (dans la mesure, évidemment, où les lignes de ce
port sont configurées en entrée).
33

OPTION

Est le registre qui préside au fonctionnement de l’horloge interne


du microcontrôleur (TMR0) :

7 6 5 4 3 2 1 0
RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0

Bit 7 : RBPU (Register B Pull Up)


Mis à zéro (actif à l’état bas) valide les résistances de
pull-up présentes, à l’intérieur du boîtier, sur les lignes
du port B.

Bit 6 : INTEDG (INTerrupt EDGe)


Détermine le front du signal d’horloge sur lequel on veut que
soit prise en compte une demande d’interruption provenant
de l’extérieur (commande appliquée sur
la pin 6 : RB0/INT). Car on peut faire agir une telle
demande soit à l’apparition d’un front montant (passage
de zéro à 1), soit à l’apparition d’un front
descendant (passage de 1 à zéro).
1 = interruption programmée pour se déclencher

sur un front montant ( )


0 = interruption programmée pour se déclencher

sur un front descendant ( ).


Bit 5 : T0CS (Timer zero Clock Source)
Sert à choisir la provenance du signal qu’on souhaite
utiliser comme clock pour piloter l’horloge interne.
Il existe deux choix possibles : soit utiliser l’horloge
interne utilisant le quartz pilote du microcontrôleur et
fournissant un signal dont la fréquence est celle du quartz
divisée par 4, soit utiliser un signal externe prélevé sur
la pin RA4 (bit 4 du port A).
0 = le timer est piloté par l’horloge interne
1 = le timer est piloté par un signal externe.
34

Bit 4 : T0SE (Timer zero Signal Edge)


Sert à déterminer si l’horloge doit avancer sur front
montant ou sur front descendant.
0 = l’horloge avance sur front montant ( )

1 = l’horloge avance sur front descendant ( ).


Bit 3 : PSA (Pre-Scaler Assignment)
Sert à affecter le prédiviseur soit au timer TMR0
soit au Watch-Dog.
0 = le pré diviseur est affecté au timer TMR0
1 = le pré diviseur est affecté au Watch-Dog.

Bits 2 – 1 – 0 : PS2 – PS1 – PS0 (Pre-Scaler rate)


Ces trois bits servent à programmer le facteur de division
qu’on veut assigner au prédiviseur dans le but d’avoir
des signaux plus lents.

A remarquer que le facteur de division n’est pas le même


selon que le pré diviseur soit affecté au TMR0 (timer)
ou au Watch-Dog (chien de garde) :

Facteur de division
PS2 PS1 PS0
Pour le TMR0 Pour le Watch-Dog
0 0 0 2 1
0 0 1 4 2
0 1 0 8 4
0 1 1 16 8
1 0 0 32 16
1 0 1 64 32
1 1 0 128 64
1 1 1 256 128

Pour écrire dans ce registre on utilise soit l’instruction BSF,bit


Soit l’instruction BCF,bit.
35

Représentation imagée du fonctionnement du timer TMR0 et du


Watch-Dog (chien de garde) :
36

PCL (Program Counter Low)

Il s’agit du compteur qui fournit au programme la partie basse de


l’adresse.

Dans les microcontrôleurs de Microchip les lignes d’adresses sont


réparties en deux bytes : le PCL (fourni par ce registre Program Counter
Low), et le PCH (fourni par le registre PCLATH Program Counter LATch
High).

Il s’agit d’un compteur dont la tâche est d’adresser la mémoire


dans laquelle sont logées les instructions du programme.

L’organisation de ce type de compteur, dans les microcontrôleurs


PIC, veut que l’adresse soit composée de deux parties : la partie basse
(fournie par PCL, sur dix lignes d’adresse) et la partie haute (fournie par
PCLATH).
37

PCLATH (Program Counter LATch High)

L’adresse du compteur de programme est obtenue en mettant


ensemble la partie basse fournie par PCL (Program Counter Low) et la
partie haute fournie par PCLATH.

Contrairement à ce qu’on pourrait penser, ce registre ne fournit pas


un nombre complémentaire fixe de bits, mais un nombre de bits variable, en
fonction des instructions qui sont traitées.
38

PORT A - PORT B
Alors que TRIS A et TRIS B se limitent à définir le sens de chaque
ligne des ports (entrée ou sortie), PORT A et PORT B permettent
concrètement au microcontrôleur de communiquer avec l’extérieur.

Voici des exemples :

1) Comment écrire un 0 sur une ligne de port (par exemple, sur RA0) :

MOVLW 11111110 (en binaire, pour que ce soit


plus parlant). Octet de confi-
guration de port :
0 = sortie
1 = entrée
Dans ce cas : on veut pro-
grammer le bit 0 en sortie,
et tous les autres en entrée.
MOVWF TRISA Charge l’octet de configura-
tion dans le registre TRIS A,
mais toutes les lignes sont
encore maintenues en haute
impédance.
BCF PORTA,0 Met à zéro (clear) le bit 0
du port A. Toutes les autres
lignes du port restent à
haute impédance.

2) Comment écrire un 1 sur une ligne de port (par exemple, sur RA2) :

MOVLW 11111110 (en binaire, pour que ce soit


plus parlant). Octet de confi-
guration de port :
0 = sortie
1 = entrée
Dans ce cas : on veut pro-
grammer le bit 2 en sortie
et tous les autres en entrée.
MOVWF TRISA Charge l’octet de configura-
tion dans le registre TRIS A.
39

BSF PORTA,2 Met à 1 (set) le bit 2 du


port A. Toutes les autres
lignes du port restent à
haute impédance.

3) Comment lire l’état logique d’une ligne de port.


C’est à dire : comment savoir si une ligne est à 0 ou à 1 :

MOVLW 11111111 (en binaire). Octet de configu-


tion de port (on veut que tou-
tes les lignes du port soient
des entrées).
MOVWF TRISA Charge l’octet de configura-
tion dans le registre TRIS A.
BTFSC PORTA,3 Teste le bit 3 des lignes du
port A. S’il est à 1, l’in-
struction suivante est exécu-
tée. Si par contre il est à 0,
l’instruction suivante est igno-
rée et le programme exécute
l’instruction se trouvant enco-
re après.
NB : Au lieu de BTFSC, on
aurait pu utiliser l’instruction
BTFSS pour, dans ce cas, exé-
ter l’instruction suivante si le
bit testé est à 0.

4) Comment lire l’octet entier d’un port configuré en entrée :

MOVF PORTA,W Charge le contenu du port A


dans le registre W.
40

STATUS (Registre d’état)

Les cinq premiers bits de ce registre (bits 0 à 4) correspondent à


des flags que le programmeur peut interroger pour obtenir des informations
lui permettant d’écrire correctement la suite des instructions de son
programme ; tandis que les bits 5, 6 et 7 (RP0, RP1, RP2), d’après la façon
dont on les programme, pourraient sélectionner 8 pages de registres
internes (chacune de 128 octets).
Comme dans le 16F84 il n’y a que deux pages de registres (Page 0 et Page
1), seul le bit 5 (RP0) sert (les bits 6 et 7 sont à ignorer purement et
simplement).

7 6 5 4 3 2 1 0
RP0 TO PD Z DC C

Bit 0 : C (Carry)
Flag indiquant si une retenue a eu lieu dans un octet lors
d’une addition ou d’une soustraction.
Si une retenue a été générée, ce bit passe à 1.

Bit 1 : DC (Digit Carry)


Flag fonctionnant comme le bit de Carry, sauf qu’ici la
surveillance de la retenue s’exerce non pas sur l’octet
entier, mais sur le premier demi-octet.
Ce flag se positionne à 1 si une retenue est générée du bit
3 (bit de poids fort du quartet inférieur) vers le bit 0 du
quartet supérieur.
Il est utile pour corriger le résultat d’opérations effectuées
en code BCD.

Bit 2 : Z (Zero)
Ce flag passe à 1 si le résultat d’une opération (arithmé-
tique ou logique) est 0.

Bit 3 : PD (Power Down)


Mise en veilleuse de l’alimentation, effectuée par l’instruction
SLEEP.
Passe à 1 lorsqu’on utilise l’instruction CLWDT, ou à la mise sous
tension.
41

Bit 4 : TO (Time Out)


Dépassement de délai.
Passe à 0 si le timer du Watch-Dog (chien de garde) déborde.
Est mis à 1 par les instructions CLWDT et SLEEP, ainsi qu’à la
mise sous tension.

Bit 5 : RP0 (Register Page zero)


Sert à sélectionner l’une des deux pages de registres (Page 0
ou Page 1).
0 = sélectionne la page mémoire 0 (adresses de 00
à 7F)
1 = sélectionne la page mémoire 1 (adresses de 80
à FF).

Exemples de programmation :

1) BCF STATUS, RP0 (Bit Clear File STATUS Register Page 0).
Met à zéro le bit RP0 du registre
d’état. Autrement dit : sélectionne
le banc mémoire 0 (adresses 00 à
7F).

2) BSF STATUS,RP0 (Bit Set File STATUS Register Page 0).


Met à 1 le bit RP0 du registre
d’état. Autrement dit : sélectionne
le banc mémoire 1 (adresses de 80
à FF).
42

TMR0 (TiMeR zero)

Est le registre de contrôle de l’horloge interne (timer) du


microcontrôleur.
Ce timer peut soit fonctionner seul, soit être précédé par un pré diviseur
programmable à 8 bits dont la programmation se fait par l’intermédiaire du
registre OPTION.

Ce registre peut être lu et modifié à tout moment, soit pour


connaître sa position courante, soit pour le déclencher à partir d’une valeur
déterminée.
Une quelconque opération d’écriture dans ce registre met automatiquement
à zéro le comptage en cours dans le pré diviseur.
Se rappeler que le timer compte sur 8 bits, et qu’une fois que le comptage
est arrivé à FF, celui-ci revient à 00 (ce qui provoque le passage à 1 du bit 2
du registre INTCON appelé T0IF).

En programmation on peut écrire :

1) pour le lire :
MOVF TMR0 ,W
(porte la valeur de TMR0 dans W)

2) pour lui donner une valeur de départ :


MOVLW valeur
MOVWF TMR0

3) pour le mettre à zéro :


CLRF TMR0
43

TRIS A - TRIS B

Ce sont les registres qui définissent le sens de chacune des lignes


des ports A et B.

Toute ligne mise à 1 est programmée comme entrée, tandis que toute ligne
mise à zéro est programmée comme sortie.

Il n’y a aucune instruction permettant d’écrire directement dans


ces registres : on y accède en transitant par le registre de travail W. En
programmation, on commence donc par charger l’octet de configuration
dans le registre W, puis on copie celui-ci dans TRIS A ou TRIS B.

Exemple :

MOVLW 00000001 (en binaire, sinon 01 en hexa)


MOVWF TRISA

Le bit 0 du port A est défini comme entrée, tandis que les sept autres lignes
sont définies comme sorties.
44

La PROGRAMMATION

Différentes façons de programmer

Il existe plus d’un chemin possible pour programmer les PIC.

Nous en examinerons deux :

1) la programmation en langage ASSEMBLEUR

2) la programmation en langage BASIC.


45

Avantages et inconvénients de la programmation en


langage ASSEMBLEUR

Avantages :
La programmation en langage ASSEMBLEUR se fait à l’aide d’un outil de
programmation entièrement gratuit et que l’on peut diffuser librement.
Cet outil (qui est un magnifique environnement de programmation complet)
s’appelle MPLAB.
Il est disponible en téléchargement gratuit sur le site de Microchip.

Inconvénients :
Pour programmer en langage ASSEMBLEUR, il faut non seulement
connaître le fonctionnement de chaque instruction, mais aussi l’architecture
interne du microcontrôleur, la structure de sa mémoire, les adresses des
registres spéciaux, le fonctionnement de chacune de ses ressources internes,
etc..
La programmation en langage ASSEMBLEUR s’appuie sur des
organigrammes plus travaillés, et requiert plus de rigueur et de minutie.
Le programmeur doit plus faire attention aux impératifs machine qu’à la
finalité de son programme.
Distrait par le impératifs machine, le programmeur commet souvent des
erreurs.
Ces erreurs sont souvent difficiles à déceler et à corriger.
46

Avantages et inconvénients de la programmation en


langage BASIC

Avantages :
La programmation en BASIC se fait à l’aide d’un langage facile et direct
qui (bien qu’étant de l’anglais) comprend des mots puissants, si bien qu’un
programme écrit en BASIC comporte peu de mots.
Les erreurs de programmation sont plus rares, et se décèlent facilement.
L’écriture des programmes prend peu de temps.

Inconvénients :
La programmation en BASIC nécessite un COMPILATEUR
expressément conçu pour la programmation des PIC.
Il s’agit d’un produit commercial, fruit d’un travail d’équipe, et donc
payant.
Les programmes en langage BASIC, bien que très courts pour le
programmeur qui les écrit, demandent plus de place EEPROM car, vus côté
PIC, ils demandent plus d’instructions élémentaires. A tel point que parfois
un microcontrôleur pouvant contenir à l’aise un programme écrit en
langage assembleur, s’avère posséder une mémoire insuffisante s’il était
programmé en langage BASIC, pour faire la même chose.
47

Les outils nécessaires pour programmer en


langage ASSEMBLEUR

Pour programmer en langage ASSEMBLEUR il faut :

1) un PC et une imprimante, pour écrire les instructions permettant de


confectionner le fichier à extension . asm

2) un ASSEMBLEUR fourni gratuitement par Microchip (à télécharger


sur INTERNET) permettant de confectionner le fichier à extension .hex
Cet ASSEMBLEUR s’appelle MPLAB.
Il faut l’installer sur votre PC et apprendre à vous en servir.

3) un PROGRAMMATEUR de PIC.
Relativement simple à réaliser.
Il existe des modèles pour port série et des modèles pour port parallèle.
Je vous conseille un modèle pour port parallèle.
Cherchez un schéma sur un magazine d’Electronique, ou achetez un kit.

4) un LOGICIEL adapté à votre programmateur de PIC.


Si vous achetez un kit, il vous sera fourni avec le kit.
Si vous copiez le schéma dans un magazine, vous devez pouvoir
télécharger le logiciel à l’adresse citée dans l’article.

5) Des câbles de liaison et une petite alimentation (un bloc secteur).


48

Les outils nécessaires pour programmer en


langage BASIC

Pour programmer en langage BASIC il faut :

1) un PC et une imprimante, pour écrire les instructions permettant de


confectionner le fichier à extension .bas

2) un COMPILATEUR PicBASIC proposé par Micro Engineering Labs


(dont l’importateur exclusif pour la France est SELECTRONIC à Lille)
permettant de confectionner le fichier à extension .hex

3) un PROGRAMMATEUR de PIC
(mêmes remarques qu’à propos des outils pour programmer
en langage ASSEMBLEUR)

4) un LOGICIEL adapté à votre programmateur de PIC


(idem)

5) Des câbles de liaison et une petite alimentation (un bloc secteur).


49

STRUCTURE d’un PROGRAMME

L’écriture d’un programme implique l’élaboration d’une véritable


structure.
C’est pourquoi je ne saurais trop vous conseiller d’agir avec méthode et
précision.

Tout programme doit comporter un titre : une sorte de définition


succincte de ce que fait le programme.

L’étape suivante consiste à mettre ce programme sur papier


(listing).
Nous y ajouterons des commentaires, ligne par ligne, pour chaque opération
effectuée.
Ceux-ci seront clairs et abondants. Ils vous aideront – plus tard – à
comprendre les détails du programme.
Ils doivent être tels que si vous repreniez votre feuille plusieurs mois après,
vous devriez facilement savoir vous relire et comprendre.
Mieux encore : si vous travaillez en équipe, n’importe qui de votre équipe
devrait être en mesure de comprendre de quoi il s’agit.

Prenez l’habitude de signer et dater vos programmes.

Dans la mesure du possible, accompagnez-les d’un organigramme.


50

CANEVAS d’un programme


Tout programme se construit selon un modèle, une sorte de
squelette (template, en anglais).

Voici le squelette d’un programme pour PIC 16F84 :

Processor 16F84
Déclarations obligatoires Radix .....
Include <<P16F84>>

Equivalences ..... EQU .....

Initialisation de la RAM
et réservation d’un ORG 0C
certain nombre d’adresses RES ...
mémoire

Début du programme ORG 00


après Reset

Configuration des lignes


de port

Instructions

Sous programmes

Fin du programme END


51

PROGRAMMATION
en langage ASSEMBLEUR

La programmation en langage ASSEMBLEUR se fait en utilisant


les 37 instructions formant son dictionnaire.

En langage ASSEMBLEUR le PIC 16F84 ne comprend que ces 37


mots (en fait : 35 instructions communes à tous les modèles de PIC, plus
deux instructions spécifiques au 16F84 : OPTION et TRIS).

Ces 37 mots forment ce que l’on appelle le set d’instructions du


16F84.
Il convient de toutes les connaître.

Ecrire un programme en langage ASSEMBLEUR revient donc à


détailler au PIC ce qu’il doit faire, en le disant exclusivement au moyen de
ces 37 mots de son vocabulaire : les seuls mots qu’il est capable de
comprendre.

Examinons-les une par une.


52

Les INSTRUCTIONS du 16F84

Le microcontrôleur 16F84 possède un set de seulement 37 instructions


codées (en représentation binaire) sur 14 bits, selon le modèle :

XX XXXX XXXX XXXX

bit de poids fort bit de poids faible

Codées en hexadécimal, elles prennent la forme :

XXXX

A remarquer qu’étant donné que les deux bits de poids fort (bits 12
et 13) ne peuvent prendre que seulement quatre valeurs binaires (00 - 01 -
10 et 11), il en résulte que la première valeur de toute instruction codée en
hexadécimal ne peut dépasser 3.
Autrement dit : eu égard à la première valeur de chaque instruction codée
en hexadécimal, les seuls formats possibles sont :

0XXX...
1XXX...
2XXX...
3XXX...

avec une étendue comprise entre 0000 et 3FFF.

La plupart des instructions opèrent en utilisant le registre de travail


W (Working register) comparable à l’accumulateur des anciens
microprocesseurs, et soit un registre soit une valeur immédiate codée sur 8
bits appelée literal.
Le résultat des opérations peut être envoyé soit dans le registre W
(accumulateur) soit dans le registre sollicité (soit dans les deux, avec
certaines instructions).
Un petit nombre d’instructions opèrent en utilisant uniquement un registre
(c’est le cas des instructions BCF, BSF, BTFSC, BTFSS, CLRW, CLRWT
et SLEEP).
Les 37 instructions du 16F84 peuvent être classées comme on
veut.
53

Je vous propose quatre types de classement:

a) classement par ordre alphabétique


b) classement par genre
c) classement par type
d) classement par ordre croissant d’encodage.

Toutes les instructions sont codées en un seul mot de 14 bits (0 à 13).

Elles sont toutes exécutées en un seul cycle d’horloge , sauf CALL,


GOTO, RETFIE, RETLW et RETURN qui demandent 2 cycles, et BTFSC,
BTFSS, DECFSZ, INCFSZ qui – selon le cas – peuvent demander soit un
cycle, soit deux cycles.

NB : Parmi les 37 instructions constituant le set du 16F84, deux lui


sont spécifiques (je l’ai déjà dit) et ont un caractère spécial : OPTION et
TRIS.
Ces deux instructions ne figurent pas dans les autres modèles de PIC. Aussi
Microchip recommande de ne pas les utiliser, dans le but de laisser
compatibles les programmes (écrits pour ce µC) avec ceux écrits pour
d’autres modèles de PIC.
Il suffit de le savoir.
Mais ceci n’est pas un obstacle pour nous, du fait que notre intérêt est
exclusivement tourné vers le 16F84.
54

a) Classement par lettre alphabétique


ADDLW ADD Literal to W
ADDWF ADD W to File
ANDLW AND Literal and W
ANDWF AND W and File

BCF Bit Clear File


BSF Bit Set File
BTFSC Bit Test File, Skip if Clear
BTFSS Bit Test File, Skip if Set

CALL CALL subroutine


CLRF CLeaR File
CLRW CLeaR W
CLRWDT CLeaR Wach Dog Timer
COMF COMplement File

DECF DECrement File


DECFSZ DECrement File, Skip if Zero

GOTO

INCF INCrement File


INCFSZ INCrement File, Skip if Zero
IORLW Inclusive OR Literal with W
IORWF Inclusive OR W with File

MOVF MOVe File


MOVLW MOVe Literal to W
MOVWF MOVe W to File

NOP No OPeration

OPTION load OPTION register

RETFIE RETurn From IntErrupt


RETLW RETurn from subroutine with Literal in W
RETURN RETURN from subroutine
RLF Rotate Left File
55

RRF Rotate Right File

SLEEP
SUBLW SUBtract Literal with W
SUBWF SUBtract W from File
SWAPF SWAP File

TRIS TRIState port

XORLW eXclusive OR Literal and W


XORWF eXclusive OR W and File
56

b) Classement par genre


- instructions arithmétiques :
ADDLW
ADDWF
SUBLW
SUBWF

- instructions d’incrémentation :
DECF
DECFSZ
INCF
INCFSZ

- instructions d’effacement :
CLRF
CLRW
CLRWDT

- instructions de mouvement :
MOVF
MOVLW
MOVWF

- instructions de rotation :
RLF
RRF

- instructions logiques :
ANDLW
ANDWF
COMF
IORLW
IORWF
XORLW
XORWF
57

- instructions de saut et branchement :


CALL
GOTO
RETFIE
RETLW
RETURN

- instructions agissant sur les bits :


BCF
BSF
BTFSC
BTFSS

- instructions diverses :
NOP
OPTION
TRIS
SLEEP
SWAPF
58

c) Classement par type


- instructions travaillant seules :
CLRW
CLRWDT
NOP
OPTION
RETFIE
RETURN
SLEEP

- instructions travaillant avec une constante ou une étiquette (k) :


ADDLW k
ANDLW k
CALL k
GOTO k
IORLW k
MOVLW k
RETLW k
SUBLW k
XORLW k

- instructions travaillant avec un registre (f) :


CLRF f
MOVWF f
TRIS f

- instructions travaillant sur un bit (b) d’octet (f) :


BCF f,b
BSF f,b
BTFSC f,b
BTFSS f,b
Il est évident que b ne peut prendre qu’une
valeur comprise entre 0 et 7, désignant la po-
sition du bit dans l’octet :
7 6 5 4 3 2 1 0
59

- instructions travaillant avec un registre (f) mais proposant un


choix (d) dans la destination du résultat :
- d = 0 : le résultat est placé dans W
- d = 1 : le résultat est placé dans le registre f

ADDWF f,d
ANDWF f,d
COMF f,d
DECF f,d
DECFSZ f,d
INCF f,d
INCFSZ f,d
IORWF f,d
MOVF f,d
RLF f,d
RRF f,d
SUBWF f,d
SWAPF f,d
XORWF f,d
60

d) Classement par ordre croissant


d’encodage

0 1 2 3
0000 NOP 1xxx BCF 2xxx CALL 30xx MOVLW
0008 RETURN 1xxx BSF 2xxx GOTO 34xx RETLW
0009 RETFIE 1xxx BTFSC 38xx IORLW
0062 OPTION 1xxx BTFSS 39xx ANDLW
0063 SLEEP 3Axx XORLW
0064 CLWDT 3Cxx SUBLW
006x TRIS 3Exx ADDLW
00xx MOVWF
0100 CLRW
01xx CLRF
02xx SUBWF
03xx DECF
04xx IORWF
05xx ANDWF
06xx XORWF
07xx ADDWF
08xx MOVF
09xx COMF
0Axx INCF
0Bxx DECFSZ
0Cxx RRF
0Dxx RLF
0Exx SWAPF
0Fxx INCFSZ
61

ADDLW
ADD Literal to W

- Additionne de manière immédiate le literal au contenu du registre


W, et place le résultat dans W.

- Le literal est un mot de 8 bits (de 00 à FF).

- Cette instruction affecte 3 bits du registre d’état :


le flag C : Carry
le flag DC : Digit Carry
le flag Z : Zero

- 1 cycle d’horloge

- Encodage de l’instruction :

13 0
11 111x kkkk kkkk
3 E ↓↓↓↓ ↓↓↓↓
Valeur de l’octet que
l’on veut ajouter à W
(valeur pouvant aller
de 00 à FF).

- Exemple de programmation :

ADDLW 06

En supposant que W contienne 04 avant l’instruction, après l’instruction il


contient 0A (en hexa : 06 + 04 = 0A).
62

ADDWF
ADD W to File

- Additionne le contenu du registre W à l’octet situé (en mémoire RAM) à


l’adresse indiquée de suite (adresse comprise entre 0C et 4F) ; avec deux
variantes : le résultat peut être placé soit dans le registre W, soit dans la
mémoire RAM à la place de l’octet utilisé pour faire l’addition (la nouvelle
valeur prend la place de l’ancienne).

- Cette instruction affecte 3 bits du registre d’état :


le flag C : Carry
le flag DC : Digit Carry
le flag Z : Zero

- 1 cycle d’horloge

- Encodage de l’instruction:

13 0
00 0111 dfff ffff
0 7 ↓↓↓↓ ↓↓↓↓
(W) 0
ou
(registre) 1
↓↓↓ ↓↓↓↓
De 000 1100
à 100 1111
Adresse de la RAM
(entre 0C et 4F)
dont le contenu est
à additionner à W.

- Exemples de programmation :

1) MOVF VentesDuMois,W
ADDWF,0
63

2) MOVF VentesDuMois,W
ADDWF,1

L’exemple 1 met dans W ce qui se trouve à l’adresse VentesDu Mois, puis


additionne VentesDuMois au contenu de W, et range le résultat dans W.

L’exemple 2 met dans W ce qui se trouve à l’adresse VentesDu Mois, puis


additionne VentesDuMois au contenu de W, et range le résultat à l’adresse
VentesDuMois, en renplaçant l’ancienne valeur par le total qu’on vient de
trouver.
64

ANDLW
AND Literal and W

- Effectue une opération logique ET (AND) entre la valeur immédiate du


literal et l’octet se trouvant dans le registre W.

- Le literal est un mot de 8 bits (de 00 à FF)

- Cette instruction affecte le bit Z du registre d’état

- 1 cycle d’horloge

- Encodage de l’instruction :

13 0
11 1001 kkkk kkkk
3 9 ↓↓↓↓ ↓↓↓↓
Valeur de l’octet avec
laquelle on veut
effectuer le ET logique
(valeur pouvant aller
de 00 à FF).

- Table de vérité d’une porte ET :

A B Q
0 0 0
0 1 0
1 0 0
1 1 1
65

- Exemple de programmation :

ANDLW A7

En supposant que W contienne 5C (01011100) avant l’instruction, après


l’instruction W contient 04.

A7 = 10100111
5C = 01011100
AND = 00000100 (04 en hexa)

Pourquoi cette instruction dans le set du 16F84 ? A quoi sert-elle ?

Elle sert lorsque – dans un octet – on a besoin de récupérer un bit en


particulier (ou certains bits en particulier).

Pour cela il suffit de préparer un masque, c’est à dire on octet composé de 0


(aux emplacements où se trouvent les bits à éliminer) et de 1 (aux
emplacements où se trouvent les bits à récupérer).

Exemple : on souhaite récupérer uniquement le bit 5 de l’octet 01111010.

On prépare alors le masque 00100000 et on fait un ET logique entre l’octet


et le masque. Comme ceci :
01111010 (octet)
00100000 (masque)
Ce qui donne : 00100000 (résultat)

Le résultat de l’opération permet donc bien de récupérer


uniquement le bit 5 de l’octet : ici c’est un 1 (00100000).

Une fois récupéré, on peut utiliser ce bit comme on veut.


66

ANDWF
AND W and File

- Effectue une opération logique ET (AND) entre l’octet se trouvant dans le


registre W et l’octet situé (en mémoire RAM) à l’adresse indiquée de suite
(adresse comprise entre 0C et 4F) ; avec deux variantes : le résultat peut
être placé soit dans le registre W, soit dans la mémoire RAM à la place de
l’octet utilisé pour effectuer le ET logique (la nouvelle valeur prend la place
de l’ancienne).

- Cette instruction affecte le bit Z du registre d’état

- 1 cycle d’horloge

- Encodage de l’instruction:

13 0
00 0101 dfff ffff
0 5 ↓↓↓↓ ↓↓↓↓
(W) 0
ou
(registre) 1
↓↓↓ ↓↓↓↓
De 000 1100
à 100 1111
Adresse de la RAM
(entre 0C et 4F)
où se trouve l’octet
avec lequel on veut
faire le ET logique.

- Exemples de programmation :

1) ANDWF,0 Adresse

2) ANDWF,1 Adresse
67

L’exemple 1 effectue un ET logique entre l’octet se trouvant dans W et


l’octet se trouvant à Adresse, et range le résultat dans W.

L’exemple 2 effectue un ET logique entre l’octet se trouvant dans W et


l’octet se trouvant à Adresse, et range le résultat dans Adresse.

- Table de vérité d’une porte ET :

A B Q
0 0 0
0 1 0
1 0 0
1 1 1

Pourquoi cette instruction dans le set du 16F84 ? A quoi sert-elle ?

Elle sert lorsque – dans un octet – on a besoin de récupérer un bit en


particulier (ou certains bits en particulier).

Pour cela il suffit de préparer un masque, c’est à dire on octet composé de 0


(aux emplacements où se trouvent les bits à éliminer) et de 1 (aux
emplacements où se trouvent les bits à récupérer).

Exemple : on souhaite récupérer uniquement le bit 5 de l’octet 01111010.

On prépare alors le masque 00100000 et on fait un ET logique entre l’octet


et le masque. Comme ceci :
01111010 (octet)
00100000 (masque)
Ce qui donne : 00100000 (résultat)

Le résultat de l’opération permet donc bien de récupérer


uniquement le bit 5 de l’octet : ici c’est un 1 (00100000).

Une fois récupéré, on peut utiliser ce bit comme on veut.


68

BCF
Bit Clear File

- Met à zéro le bit désigné de l’octet situé (en mémoire RAM) à


l’adresse indiquée de suite (adresse comprise entre 0C et 4F).

- 1 cycle d’horloge

- Encodage de l’instruction:

13 0
01 00bb bfff ffff
1 ↓↓ ↓↓↓↓ ↓↓↓↓
Position
du bit
dans
l’octet.
↓↓↓ ↓↓↓↓
De 000 1100
à 100 1111
Adresse de la RAM
(entre 0C et 4F)
où se trouve l’octet
sur lequel on veut opérer.

- Position du bit dans l’octet :


111

110

101

100

11

10

7 0

- Exemples de programmation :

En supposant qu’on veuille mettre à zéro (Clear) un certain bit de l’octet


situé à l’adresse 27 de la mémoire RAM, la programmation serait :
69

BCF 27,0 (pour mettre à zéro le bit 0)

ou BCF 27,1 (pour mettre à zéro le bit 1)

ou BCF 27,2 (pour mettre à zéro le bit 2)

etc...
70

BSF
Bit Set File

- Met à 1 (Set) le bit désigné de l’octet situé (en mémoire RAM) à


l’adresse indiquée de suite (adresse comprise entre 0C et 4F).

- 1 cycle d’horloge

- Encodage de l’instruction:

13 0
01 01bb bfff ffff
1 ↓↓ ↓↓↓↓ ↓↓↓↓
Position
du bit
dans
l’octet.
↓↓↓ ↓↓↓↓
De 000 1100
à 100 1111
Adresse de la RAM
(entre 0C et 4F)
où se trouve l’octet
sur lequel on veut opérer.

- Position du bit dans l’octet :


111

110

101

100

11

10

7 0

- Exemples de programmation :

En supposant qu’on veuille mettre à 1 (Set) un certain bit de l’octet


situé à l’adresse 1C de la mémoire RAM, la programmation serait :
71

BSF 1C,0 (pour mettre à 1 le bit 0)

ou BSF 1C,1 (pour mettre à 1 le bit 1)

ou BSF 1C,2 (pour mettre à 1 le bit 2)

etc...
72

BTFSC
Bit Test File, Skip if Clear

- Vérifie l’état logique du bit désigné de l’octet situé (en mémoire RAM) à
l’adresse indiquée de suite (adresse comprise entre 0C et 4F).
Est-il à zéro ?
S’il est à zéro, ignore l’instruction suivante.

- Selon que la réponse soit OUI ou NON, l’instruction prend 1 ou 2 cycles


d’horloge.

- Encodage de l’instruction:

13 0
01 10bb bfff ffff
1 ↓↓ ↓↓↓↓ ↓↓↓↓
Position
du bit
dans
l’octet.
↓↓↓ ↓↓↓↓
De 000 1100
à 100 1111
Adresse de la RAM
(entre 0C et 4F)
où se trouve l’octet
sur lequel on veut opérer.

- Position du bit dans l’octet :


111

110

101

100

11

10

7 0
73

- Organigramme du traitement :

- Exemple de programmation :

En supposant que l’octet dont on veut tester un bit soit situé à l’adresse 1A,
la programmation serait la suivante :

BTFSC 1A,0 (pour tester le bit 0)

ou BTFSC 1A,1 (pour tester le bit 1)

ou BTFSC 1A,2 (pour tester le bit 2)

etc...
74

BTFSS
Bit Test File, Skip if Set

- Vérifie l’état logique du bit désigné de l’octet situé (en mémoire RAM) à
l’adresse indiquée de suite (adresse comprise entre 0C et 4F).
Est-il à 1 ?
S’il est à 1, ignore l’instruction suivante.

- Selon que la réponse soit OUI ou NON, l’instruction prend 1 ou 2 cycles


d’horloge.

- Encodage de l’instruction:

13 0
01 11bb bfff ffff
1 ↓↓ ↓↓↓↓ ↓↓↓↓
Position
du bit
dans
l’octet.
↓↓↓ ↓↓↓↓
De 000 1100
à 100 1111
Adresse de la RAM
(entre 0C et 4F)
où se trouve l’octet
sur lequel on veut opérer.

- Position du bit dans l’octet :


111

110

101

100

11

10

7 0
75

- Organigramme du traitement :

- Exemple de programmation :

En supposant que l’octet dont on veut tester un bit soit situé à l’adresse 1C,
la programmation serait la suivante :

BTFSS 1C,0 (pour tester le bit 0)

ou BTFSS 1C,1 (pour tester le bit 1)

ou BTFSS 1C,2 (pour tester le bit 2)

etc...
76

CALL
CALL subroutine

- Appel à sous-programme.

- Le µC sauvegarde l’adresse de retour dans la pile (stack), puis charge dans


le PC (Program Counter) l’adresse à laquelle il est invité à se rendre. Il peut
s’agir aussi bien d’une adresse que d’une label ; et c’est là que démarre le
sous-programme.

- Tout sous-programme appelé par l’instruction CALL doit obligatoirement


se terminer soit par l’instruction RETURN, soit par l’instruction
RETLW qui renvoient au programme principal.
Ne pas confondre l’instruction CALL avec l’instruction GOTO.
L’instruction CALL fait toujours revenir le programme principal à l’endroit
où il avait été abandonné ; tandis que l’instruction GOTO provoque
l’abandon total de la séquence et peut conduire soit à une toute autre action,
soit à l’arrêt total du programme.

- La pile (stack) est une zone de mémoire ne pouvant contenir que 8 mots
de 13 bits.
Ceci limite à 8 niveaux les possibilités d’imbrication. S’il y en avait un
neuvième, la première adresse de retour serait perdue...

- Cette instruction prend 2 cycles d’horloge.

- Encodage de l’instruction :

13 0
10 0kkk kkkk kkkk
2 ↓↓↓ ↓↓↓↓ ↓↓↓↓
Adresse de l’EEPROM
de programme à laquelle
est logé le sous-programme
(adresse comprise entre 000 et 3FF).
77

- Organigramme du traitement :

Programme principal
..................................
..................................
..................................
CALL sous-programme---------------
-->.................................. ↓
↑ .................................. ↓
↑ .................................. ↓
↑ sous-programme <----- ↓
↑ ..................................
↑ ..................................
↑<-- RETURN

- Exemple de programmation :

CALL Tempo (saute à l’adresse correspondant à Tempo).


78

CLRF
CLeaR File

- Efface (Clear) ce qui se trouve (en mémoire RAM) à l’adresse


indiquée de suite (adresse comprise entre 00 et 4F).

- Cette instruction affecte le bit Z du registre d’état

- 1 cycle d’horloge

- Encodage de l’instruction :

13 0
00 0001 1fff ffff
0 1 ↓↓↓ ↓↓↓↓
Adresse de la RAM
(entre 00 et 4F)
où se trouve l’octet
qu’on veut effacer.

- Exemples de programmation :

1) CLRF INTCON (pour désactiver les interruptions)

2) CLRF PORTB (pour mettre à zéro tous les bits du port B)

3) CLRF 1E (pour effacer ce qui se trouve à l’adresse 1E)


79

CLRW
CLeaR W

- Efface (Clear) le registre W.

- Cette instruction affecte le bit Z du registre d’état

- 1 cycle d’horloge

- Encodage de l’instruction :

13 0
00 0001 xxxx xxxx
0 1 0 0

- Exemple de programmation :

CLRW (efface le registre W).

En supposant que W contienne F8 avant l’instruction, après l’instruction


il contient 00.
80

CLRWDT
CLeaR Wach Dog Timer

- Met à zéro le compteur du chien de garde (ainsi que celui du pré diviseur,
si celui-ci est activé).

- Cette instruction affecte deux bits du registre d’état :


- le flag TO (Time Out) passe à 1
- le flag PD (Power Down) passe à 1

- 1 cycle d’horloge

- Encodage de l’instruction :

13 0
00 0000 0110 0100
0 0 6 4

- Exemple de programmation :

CLWDT (efface le compteur du chien de garde).

Peu importe où en était le compteur du chien de garde, cette instruction


le fait revenir à zéro.
81

COMF
COMplement File

- Effectue un complément bit à bit sur l’octet situé (en mémoire RAM) à
l’adresse indiquée de suite (adresse comprise entre 0C et 4F) ; avec deux
variantes : le résultat peut être placé soit dans le registre W, soit dans la
mémoire RAM à la place de l’octet utilisé pour faire le complément (la
nouvelle valeur prend la place de l’ancienne).
Faire le complément bit à bit d’un octet équivaut à changer ses zéros en 1,
et inversement.
Exemple : le complément de 00111100 est 11000011.

- Cette instruction affecte le bit Z du registre d’état

- 1 cycle d’horloge

- Encodage de l’instruction:

13 0
00 1001 dfff ffff
0 9 ↓↓↓↓ ↓↓↓↓
(W) 0
ou
(registre) 1
↓↓↓ ↓↓↓↓
De 000 1100
à 100 1111
Adresse de la RAM
(entre 0C et 4F)
où se trouve l’octet
sur lequel on veut opérer.

- Exemples de programmation :

1) COMF 2B,0 (effectue le complément bit à bit de


l’octet situé à l’adresse 2B et range le
résultat dans W)
En supposant que 2B contienne 11100000 avant l’instruction, après
l’instruction cette valeur est transformée en 00011111.
82

2) COMF 2B,1 (même chose, mais le résultat est rangé à


la place de l’octet utilisé pour faire le
complément).
83

DECF
DECrement File

- Décrémente la valeur de l’octet situé (en mémoire RAM) à l’adresse


indiquée de suite (adresse comprise entre 0C et 4F) ; avec deux variantes :
le résultat peut être placé soit dans le registre W, soit dans la mémoire
RAM à la place de l’octet qu’on a décrémenté (la nouvelle valeur prend la
place de l’ancienne).

- Cette instruction affecte le bit Z du registre d’état

- 1 cycle d’horloge

- Encodage de l’instruction:

13 0
00 0011 dfff ffff
0 3 ↓↓↓↓ ↓↓↓↓
(W) 0
ou
(registre) 1
↓↓↓ ↓↓↓↓
De 000 1100
à 100 1111
Adresse de la RAM
(entre 0C et 4F)
où se trouve l’octet
qu’on veut décrémenter.

- Exemples de programmation :

1) DECF COMPTEUR,0 (décrémente l’octet se trouvant


à l’adresse COMPTEUR, et
range le résultat dans W)

2) DECF COMPTEUR,1 (même chose, mais cette fois


le résultat est rangé à l’adresse
COMPTEUR).
84

DECFSZ
DECrement File, Skip if Zero

- Décrémente la valeur de l’octet situé (en mémoire RAM) à l’adresse


indiquée de suite (adresse comprise entre 0C et 4F), et effectue un test :
l’octet a-t-il atteint zéro ?
Si OUI, ignore l’instruction suivante.
Avec deux variantes : le résultat peut être placé soit dans le registre W, soit
dans la mémoire RAM à la place de l’octet décrémenté (la nouvelle valeur
prend la place de l’ancienne).

- Selon qu’à la suite de la décrémentation l’octet ait atteint ou pas la valeur


zéro, l’instruction prend 1 ou 2 cycles d’horloge.

- Encodage de l’instruction:

13 0
00 1011 dfff ffff
0 B ↓↓↓↓ ↓↓↓↓
(W) 0
ou
(registre) 1
↓↓↓ ↓↓↓↓
De 000 1100
à 100 1111
Adresse de la RAM
(entre 0C et 4F)
où se trouve l’octet
qu’on veut décrémenter.

- Cette instruction est généralement suivie par l’instruction CALL.

- Exemples de programmation :

1) DECFSZ 2F,0 (décrémente l’octet se trouvant à


l’adresse 2F, et range le résultat dans W.
Si le résultat est zéro, ignore l’instruction
suivante).
85

2) DECFSZ 2F,1 (même chose, mais cette fois le


résultat est rangé à l’adresse 2F.
La nouvelle valeur prend la place
de l’ancienne).
86

GOTO

- Branchement inconditionnel.
Va de façon inconditionnelle à l’adresse indiquée de suite (adresse de
démarrage du sous-programme). Il peut s’agir aussi bien d’une adresse que
d’une label.
Cette instruction interrompt l’exécution séquentielle des instructions et
oblige à poursuivre le programme d’une adresse complètement ailleurs.
A la différence de l’instruction CALL (qui fait toujours revenir le
programme principal à l’endroit où il avait été abandonné) , l’instruction
GOTO provoque l’abandon complet de la séquence et peut conduire soit à
une toute autre action, soit à l’arrêt total du programme.

- Cette instruction prend 2 cycles d’horloge.

- Encodage de l’instruction :

13 0
10 1kkk kkkk kkkk
2 ↓↓↓ ↓↓↓↓ ↓↓↓↓
Adresse de l’EEPROM
de programme, à laquelle
le programme doit se rendre
pour poursuivre
(adresse comprise entre 005 et 3FF).

- Exemple de programmation

GOTO ALLUMAGE

Après cette instruction, le PC (Program Counter) est chargé avec la


valeur de l’adresse à laquelle commence le programme ALLUMAGE.
87

INCF
INCrement File

- Incrémente la valeur de l’octet situé (en mémoire RAM) à l’adresse


indiquée de suite (adresse comprise entre 0C et 4F) ; avec deux variantes :
le résultat peut être placé soit dans le registre W, soit dans la mémoire
RAM à la place de l’octet qu’on a incrémenté (la nouvelle valeur prend la
place de l’ancienne).

- Cette instruction affecte le bit Z du registre d’état

- 1 cycle d’horloge

- Encodage de l’instruction:

13 0
00 1010 dfff ffff
0 A ↓↓↓↓ ↓↓↓↓
(W) 0
ou
(registre) 1
↓↓↓ ↓↓↓↓
De 000 1100
à 100 1111
Adresse de la RAM
(entre 0C et 4F)
où se trouve l’octet
qu’on veut incrémenter.

- Exemples de programmation :

1) INCF NOMBRE,0 (incrémente l’octet se trouvant


à l’adresse NOMBRE,
et range le résultat dans W)

2) INCF NOMBRE,1 (même chose, mais cette fois


le résultat est rangé à l’adresse
NOMBRE. La nouvelle valeur
prend la place de l’ancienne).
88

INCFSZ
INCcrement File, Skip if Zero

- Incrémente la valeur de l’octet situé (en mémoire RAM) à l’adresse


indiquée de suite (adresse comprise entre 0C et 4F), et effectue un test :
l’octet a-t-il atteint zéro ?
Si OUI, ignore l’instruction suivante.
Avec deux variantes : le résultat peut être placé soit dans le registre W, soit
dans la mémoire RAM à la place de l’octet incrémenté (la nouvelle valeur
prend la place de l’ancienne).

- Selon qu’à la suite de l’incrémentation l’octet ait atteint ou pas la valeur


zéro, l’instruction prend 1 cycle ou deux d’horloge.

- Encodage de l’instruction:

13 0
00 1111 dfff ffff
0 F ↓↓↓↓ ↓↓↓↓
(W) 0
ou
(registre) 1
↓↓↓ ↓↓↓↓
De 000 1100
à 100 1111
Adresse de la RAM
(entre 0C et 4F)
où se trouve l’octet
qu’on veut incrémenter.

- Cette instruction est généralement suivie par CALL.

- Exemples de programmation :

1) INCFSZ DATE,0 (incrémente l’octet se trouvant à


l’adresse DATE, et range le résul-
tat dans W. Si le résultat est zéro,
ignore l’instruction suivante).
89

2) INCFSZ DATE,1 (même chose, mais cette fois


le résultat est rangé à l’adresse
DATE. La nouvelle valeur prend
la place de l’ancienne).
90

IORLW
Inclusive OR Literal with W

- Effectue une opération logique OU inclusif (Inclusive OR) entre la valeur


immédiate du literal et l’octet se trouvant dans le registre W.
Le résultat de l’opération reste dans le registre W.

- Le literal est un mot de 8 bits (de 00 à FF)

- Cette instruction affecte le bit Z du registre d’état

- 1 cycle d’horloge

- Encodage de l’instruction :

13 0
11 1000 kkkk kkkk
3 8 ↓↓↓↓ ↓↓↓↓
Valeur de l’octet avec
lequel on veut
effectuer le OU inclusif
(valeur pouvant aller
de 00 à FF).

- Table de vérité d’une porte OU inclusif :

A B Q
0 0 0
0 1 1
1 0 1
1 1 1
91

- Exemple de programmation :

IORLW B5 (10110101)

En supposant que W contienne 49 (01001001) avant l’instruction, après


l’instruction il contient FD.

B5 = 10110101
49 = 01001001
OR = 11111101 (FD en hexa)

Pourquoi cette instruction dans le set du 16F84 ? A quoi sert-elle ?

Elle sert lorsque – dans un octet – on a besoin de forcer à 1 un bit en


particulier (ou certains bits en particulier).

Pour cela il suffit de préparer un masque, c’est à dire on octet composé de 0


(aux emplacements où se trouvent les bits à ignorer) et de 1 (aux
emplacements où se trouvent les bits qu’on veut forcer à 1).

Exemple : on souhaite forcer à 1 les bits 7 et 6 de l’octet 01111010.

On prépare alors le masque 11000000 et on fait un OU logique entre l’octet


et le masque. Comme ceci :
01111010 (octet)
11000000 (masque)
Ce qui donne : 11111010 (résultat)

Le résultat de l’opération permet donc bien de forcer à 1 les bits 7


et 6 de l’octet. Il se trouve qu’ici le bit 6 était déjà à 1. Mais le programme
ne le savait pas. L’instruction IORLW permet de préciser les choses.

Une fois forcés à 1, on peut utiliser ces bits (ou l’octet) comme on veut.
92

IORWF
Inclusive OR With File

- Effectue une opération logique OU inclusif (Inclusive OR) entre l’octet se


trouvant dans le registre W et l’octet situé (en mémoire RAM) à l’adresse
située de suite (adresse comprise entre 0C et 4F) ; avec deux variantes : le
résultat peut être placé soit dans le registre W, soit dans la mémoire RAM à
la place de l’octet utilisé pour faire le OU inclusif (la nouvelle valeur prend
la place de l’ancienne).

- Cette instruction affecte le bit Z du registre d’état

- 1 cycle d’horloge

- Encodage de l’instruction:

13 0
00 0100 dfff ffff
0 4 ↓↓↓↓ ↓↓↓↓
(W) 0
ou
(registre) 1
↓↓↓ ↓↓↓↓
De 000 1100
à 100 1111
Adresse de la RAM (entre 0C et 4F) où se trouve
l’octet avec lequel on veut faire le OU inclusif.

- Table de vérité d’une porte OU inclusif :

A B Q
0 0 0
0 1 1
1 0 1
1 1 1
93

- Exemples de programmation :

1) IORWF 29,0 (effectue le OU inclusif entre


l’octet se trouvant dans W et
celui situé à l’adresse 29, et range
le résultat dans W).
En supposant que le contenu de l’adresse 29 soit C7 (11000111) et
que W contienne 69 (01101001), après l’instruction on obtient EF
(11101111).

2) IORWF 29,1 (même chose, mais le résultat est


rangé à l’adresse 29, à la place de
l’octet utilisé pour faire le OU
inclusif).

Pourquoi cette instruction dans le set du 16F84 ? A quoi sert-elle ?

Elle sert lorsque – dans un octet – on a besoin de forcer à 1 un bit en


particulier (ou certains bits en particulier).

Pour cela il suffit de préparer un masque, c’est à dire on octet composé de 0


(aux emplacements où se trouvent les bits à ignorer) et de 1 (aux
emplacements où se trouvent les bits qu’on veut forcer à 1).

Exemple : on souhaite forcer à 1 les bits 7 et 6 de l’octet 01111010.

On prépare alors le masque 11000000 et on fait un OU logique entre l’octet


et le masque. Comme ceci :
01111010 (octet)
11000000 (masque)
Ce qui donne : 11111010 (résultat)

Le résultat de l’opération permet donc bien de forcer à 1 les bits 7


et 6 de l’octet. Il se trouve qu’ici le bit 6 était déjà à 1. Mais le programme
ne le savait pas. L’instruction IORLW permet de préciser les choses.

Une fois forcés à 1, on peut utiliser ces bits (ou l’octet) comme on veut.
94

MOVF
MOVe File

- Cette instruction peut faire deux choses :

1) soit porter dans W le contenu situé (en mémoire


RAM) à l’adresse indiquée de suite (adresse com-
prise entre 0C et 4F), avec l’option de program-
mation ,0

2) soit copier l’octet sur lui-même au même emplacement


de la RAM, avec l’option de programmation ,1

Bien que ça paraisse comique de copier le contenu d’un registre sur lui-
même, en fait - étant donné que cette opération modifie le bit Z du registre
d’état - elle est utile quand on a besoin de faire un test à zéro sur l’octet, en
toute sécurité.

- Cette instruction affecte le bit Z du registre d’état

- 1 cycle d’horloge

- Encodage de l’instruction:

13 0
00 1000 dfff ffff
0 8 ↓↓↓↓ ↓↓↓↓
(W) 0
ou
(registre) 1
↓↓↓ ↓↓↓↓
De 000 1100
à 100 1111
Adresse de la RAM (entre 0C et 4F)
où se trouve l’octet qu’on veut traiter.
95

- Exemples de programmation :

1) MOVF PORTB,0 (porte dans W l’état


es lignes du port B).

1) MOVF 18,1 (copie le contenu de l’adresse 18


sur lui-même).
96

MOVLW
MOVe Literal to W

- Charge de manière immédiate le literal dans le registre W

- Le literal est un mot de 8 bits (de 00 à FF)

- 1 cycle d’horloge

- Encodage de l’instruction :

13 0
11 00xx kkkk kkkk
3 0 ↓↓↓↓ ↓↓↓↓
Valeur du literal

- Exemple de programmation :

MOVLW F5 (met F5 , c’est à-dire


11110101, dans W).
97

MOVWF
MOVe W to File

- Prend le contenu du registre W et le met (dans la mémoire RAM) à


l’adresse indiquée de suite (adresse de 0C à 4F)

- 1 cycle d’horloge

- Encodage de l’instruction:

13 0
00 0000 1fff ffff
0 0 ↓↓↓ ↓↓↓↓
Adresse de la RAM (entre 0C et 4F) à laquelle
on veut mettre la valeur du registre W.

- Exemple de programmation :

MOVWF 0D (écrit le contenu de W à


l’adresse RAM 0D).
98

NOP
No OPeration

- L’instruction la plus paresseuse !


Ne fait rien.
Elle sert juste à occuper le processeur pour laisser passer un peu de temps
(1 cycle d’horloge).
S’utilise essentiellement pour créer des temporisations.

- 1 cycle d’horloge

- Encodage de l’instruction:

13 0
00 0000 0xx0 0000
0 0 0 0

- Exemple de programme:

NOP
99

OPTION
load OPTION register

- NB : cette instruction est spécifique au 16F84.

Microchip recommande de ne pas l’utiliser, dans le but de laisser les


programmes (écrits pour ce type de microcontrôleur) compatibles avec
ceux écrits pour d’autres modèles de PIC.
Il suffit de le savoir.
Mais ceci n’est pas un obstacle pour nous, du fait que notre intérêt est
exclusivement tourné vers le 16F84.

- Charge le registre OPTION, c’est à-dire le registre qui sert à configurer le


TMR0 ( l’horloge interne du microcontrôleur) ainsi que le prédiviseur.

- S’agissant d’un registre à lecture/écriture simultanée, on ne peut pas y


écrire directement, mais il faut obligatoirement transiter par le registre W.

En programmation, on commence par écrire l’octet de configuration dans


W. Puis l’instruction OPTION - en même temps qu’elle adresse ce registre-
y copie automatiquement l’octet de configuration.
100

RETFIE
RETurn From IntErrupt

- Retour au programme principal après exécution d’un sous-programme


d’interruption.
Charge le PC (Program Counter : compteur d’instructions) avec la valeur
qui se trouve au sommet de la pile (stack) ; ce qui provoque le retour au
programme principal.

- Lorsqu’une interruption est demandée, le microcontrôleur, avant de sauter


à l’adresse 004 de l’EEPROM mémoire de programme, sauve la valeur du
Program Counter dans la pile.
Cette valeur - comme dans une pile d’assiettes - se place tout en haut de la
pile (dans laquelle il y a seulement 8 places).
A la fin du sous-programme de réponse à l’interruption, le µC rencontre
l’instruction RETFIE par laquelle il récupère la valeur se trouvant au
sommet de la pile (correspondant à la dernière valeur entrée) et la
positionne dans le Program Counter, faisant ainsi revenir le programme à
son flux normal (pile de type LIFO : Last In, First Out).

- Après cette instruction, le pointeur de pile (stack pointer) se positionne


tout en haut de la pile, et le bit du GIE (General Interrupt Enable) du
registre INTCON (bit7) bascule à 1.

- Cette instruction prend 2 cycles d’horloge

- Encodage de l’instruction:

13 0
00 0000 0000 1001
0 0 0 9

- Exemple de programme :

RETFIE
101

RETLW
RETurn from subroutine with Literal in W

- Instruction jusqu’à un certain point similaire à RETURN, en ce sens


qu’elle ferme un sous-programme et provoque le retour au programme
principal à l’endroit où il avait été abandonné ; mais avec une particularité
en plus : charge dans le registre W la valeur du literal.

- Le literal est un mot de 8 bits (de 00 à FF)

- Cette instruction prend 2 cycles d’horloge

- Encodage de l’instruction:

13 0
11 01xx kkkk kkkk
3 4 ↓↓↓↓ ↓↓↓↓
Valeur de l’octet avec laquelle on veut
charger W en rentrant du sous-programme
(valeur pouvant aller de 00 à FF).
102

RETURN
RETURN from subroutine

- Retour d’un sous-programme.


Le PC (Program Counter) est chargé avec l’adresse se trouvant au sommet
de la pile.

- C’est l’instruction qui ferme un sous-programme et provoque le retour au


programme principal à l’endroit auquel il avait été abandonné.

- Cette instruction prend 2 cycles d’horloge

- Encodage de l’instruction:

13 0
00 0000 0000 1000
0 0 0 8
103

RLF
Rotate Left File

- Rotation à gauche.

← C ← 7 6 5 4 3 2 1 0 ←

- Effectue le déplacement d’une position vers la gauche des bits de l’octet


situé (en mémoire RAM) à l’adresse indiquée de suite (adresse comprise
entre 0C et 4F) en utilisant le bit de CARRY du registre d’état : le contenu
du bit de CARRY devient le nouveau bit 0 de l’octet ayant effectué la
rotation à gauche, tandis que l’ancien bit 7 entre dans CARRY ; avec deux
variantes : le résultat de la rotation peut être rangé soit dans le registre W,
soit dans la mémoire RAM à la place de l’octet utilisé pour effectuer la
rotation (la nouvelle valeur prend la place de l’ancienne).

- NB : Avant d’utiliser cette instruction il convient de préalablement effacer


le bit de CARRY.
Car, à supposer que dans CARRY il ait un 1, après une rotation à gauche de
00000001 on aurait 00000011 alors qu’on s’attendait à 00000010.
L’instruction qui efface le bit de CARRY est : BCF STATUS,0
(efface le bit zéro du registre STATUS, c’est à-dire le bit de CARRY).

- Cette instruction affecte le bit C du registre d’état

- 1 cycle d’horloge
104

- Encodage de l’instruction:

13 0
00 1101 dfff ffff
0 D ↓↓↓↓ ↓↓↓↓
(W) 0
ou
(registre) 1
↓↓↓ ↓↓↓↓
De 000 1100
à 100 1111
Adresse de la RAM (entre 0C et 4F)
où se trouve l’octet dont on veut
effectuer la rotation à gauche.
105

RRF
Rotate Right File

- Rotation à droite.

→ C → 7 6 5 4 3 2 1 0 →

- Effectue le déplacement d’une position vers la droite des bits de l’octet


situé (en mémoire RAM) à l’adresse indiquée de suite (adresse comprise
entre 0C et 4F) en utilisant le bit de CARRY du registre d’état : le contenu
du bit de CARRY devient le nouveau bit 7 de l’octet ayant effectué la
rotation à droite, tandis que l’ancien bit 0 entre dans CARRY ; avec deux
variantes : le résultat de la rotation peut être rangé soit dans le registre W,
soit dans la mémoire RAM à la place de l’octet utilisé pour effectuer la
rotation (la nouvelle valeur prend la place de l’ancienne).

- NB : Avant d’utiliser cette instruction il convient de préalablement effacer


le bit de CARRY .

L’instruction qui efface le bit de CARRY est : BCF STATUS,0


(efface le bit zéro du registre STATUS, c’est à-dire le bit de CARRY).

- Cette instruction affecte le bit C du registre d’état

- 1 cycle d’horloge
106

- Encodage de l’instruction:

13 0
00 1100 dfff ffff
0 C ↓↓↓↓ ↓↓↓↓
(W) 0
ou
(registre) 1
↓↓↓ ↓↓↓↓
De 000 1100
à 100 1111
Adresse de la RAM (entre 0C et 4F)
où se trouve l’octet dont on veut
effectuer la rotation à droite.
107

SLEEP

- Mise en veilleuse.
Cette instruction s’utilise non pas pour mettre le µC hors tension, mais
pour arrêter le séquencement des instructions (ralentir le signal d’horloge
jusqu’à l’extrême limite : la fréquence zéro).
Pendant cette mise en veilleuse, l’horloge externe (faisant partie de ce que
nous avons appelé le cortège des invariants) est coupée. Le flux du
programme est bloqué.
Seul le chronomètre du Watch Dog (chien de garde) reste actif.
La consommation du boîtier (qui normalement est de 2 mA) tombe à 30
µA.
Parmi les causes pouvant réveiller le µC retenons : une demande
d’interruption, ou un signal provenant du chronomètre (timer) du chien de
garde.

- Cette instruction affecte deux bits du registre d’état :


TO (Time Out) passe à 1
PD (Power Down) passe à 0
En plus, elle met à zéro le chronomètre du chien de garde, ainsi que le pré
diviseur.

- 1 cycle d’horloge

- Encodage de l’instruction:

13 0
00 0000 0110 0011
0 0 6 3
108

SUBLW
SUBtract Literal with W

- Soustrait le literal (valeur immédiate représentée par un octet pouvant


aller de 00 à FF) du contenu du registre W, et place le résultat dans W.

Literal diminuende
- W - diminuteur
= résultat = différence

- Cette instruction affecte 3 bits du registre d’état :


- le flag C (Carry)
- le flag DC (Digit Carry)
- le flag Z (Zero)

- 1 cycle d’horloge

- Encodage de l’instruction:

13 0
11 110x kkkk kkkk
3 C ↓↓↓↓ ↓↓↓↓
Valeur de l’octet (literal)
représentant le diminuende
(valeur pouvant aller de 00 à FF).
109

SUBWF
SUBtract W from File

- Soustrait la valeur contenue dans le registre W de la valeur se trouvant (en


mémoire RAM) à l’adresse indiquée de suite (adresse comprise entre 0C et
4F) ; avec deux variantes : le résultat (différence) peut être rangé soit dans
le registre W, soit dans la mémoire RAM à la place du diminuende.

File (valeur se trouvant à l’emplacement RAM, le diminuende)


- W (valeur contenue dans le registre W, le diminuteur )
Résultat différence

- Cette instruction affecte 3 bits du registre d’état :


- le flag C (Carry)
- le flag DC (Digit Carry)
- le flag Z (Zero)

- 1 cycle d’horloge

- Encodage de l’instruction:

13 0
00 0010 dfff ffff
0 2 ↓↓↓↓ ↓↓↓↓
(W) 0
ou
(registre) 1
↓↓↓ ↓↓↓↓
De 000 1100
à 100 1111
Adresse de la RAM (entre 0C et 4F)
à laquelle on veut ranger la différence.
110

SWAPF
SWAP File

- Echange les quatre bits de poids fort d’un octet se trouvant (en mémoire
RAM) à l’adresse indiquée de suite (adresse comprise entre 00 et 4F), avec
ses propres quatre bits de poids faible :

1 0 0 0 1 0 1 1
devient
1 0 1 1 1 0 0 0

Avec deux variantes : le résultat de l’échange peut être placé soit dans le
registre W, soit dans la mémoire RAM en lieu et place de l’octet utilisé
pour effectuer le swap.

- 1 cycle d’horloge

- Encodage de l’instruction:

13 0
00 1110 dfff ffff
0 E ↓↓↓↓ ↓↓↓↓
(W) 0
ou
(registre) 1
↓↓↓ ↓↓↓↓
De 000 1100
à 100 1111
Adresse de la RAM (entre 0C et 4F)
où se trouve l’octet dont on veut
échanger les quartets.
111

TRIS
TRIState port

- NB : cette instruction est spécifique au 16F84.

Microchip recommande de ne pas l’utiliser, dans le but de laisser les


programmes (écrits pour ce type de microcontrôleur) compatibles avec
ceux écrits pour d’autres modèles de PIC.
Il suffit de le savoir.
Mais ceci n’est pas un obstacle pour nous, du fait que notre intérêt est
exclusivement tourné vers le 16F84.

- Charge le registre TRIS (A ou B), et met les lignes de port à haute


impédance.
Ce registre configure, c’est à dire définit le sens de fonctionnement de
chacune des lignes des ports A et B ; assigne à chaque ligne soit le rôle
d’entrée, soit le rôle de sortie, sans pour autant provoquer aucune entrée ni
aucune sortie.

- Il s’agit d’un registre de 8 bits, pouvant tous se programmer


individuellement par 0 ou par 1 :

0 = la ligne de port (qui lui correspond) est configurée


comme sortie

1 = la ligne de port (qui lui correspond) est configurée


comme entrée

- S’agissant d’un registre à lecture/écriture simultanée, on ne peut pas y


écrire directement, mais il faut obligatoirement transiter par le registre W.

En programmation, on commence par écrire l’octet de configuration dans


W. Puis l’instruction TRIS (A ou B), en même temps qu’elle adresse ce
registre, copie automatiquement l’octet de configuration dans le port A ou
dans le port B.
112

- Encodage de l’instruction :

13 0
00 0000 0110 0fff
0 0 6 ↓↓↓
Ne peut prendre que
deux valeurs :
101 (pour désigner le port A)
110 (pour désigner le port B)

- Exemple de programmation :

MOVLW 00000100 (en binaire)


MOVWF TRISB

On charge dans le registre W l’octet de configuration de port (ligne 2 en


entrée, toutes les autres lignes en sortie), que l’instruction TRIS valide.

A partir de ce moment le port est configuré, mais aucune donnée n’y entre,
aucune donnée n’y sort.
Les lignes du port sont mises en haute impédance (tristate).
113

XORLW
EXclusive OR Literal and W

- Effectue un OU exclusif (Exclusive OR) entre la valeur immédiate du


literal et l’octet se trouvant dans le registre W.
Le résultat est rangé dans W.

- Le literal est un mot de 8 bits (de 00 à FF).

- Un OR exclusif permet de comparer deux octets bit à bit.


Si les bits de même poids sont au même niveau, le résultat est zéro.
Si par contre ils sont à des niveaux différents, le résultat est 1.
Exemple de XOR entre deux octets :
00110011
01110010
résultat = 01000001

- Un OR exclusif permet d’inverser un état logique.


Exemple :
Soit au départ l’octet 11111111.
Si le XOR se fait avec 00000000 , rien ne change ;
le résultat est : 11111111.
Si par contre le XOR se fait avec 00000001,le résultat est :11111110
(Alors que les zéros ne font rien changer, les 1 provoquent un basculement
d’état).

- Table de vérité d’une porte OU exclusif :

A B Q
0 0 0
0 1 1
1 0 1
1 1 0
114

- Cette instruction affecte le bit Z du registre d’état

- 1 cycle d’horloge

- Encodage de l’instruction:

13 0
11 1010 kkkk kkkk
3 A ↓↓↓↓ ↓↓↓↓
Valeur de l’octet avec lequel
on veut effectuer le OU exclusif
(valeur pouvant aller de 00 à FF).

Pourquoi cette instruction dans le set du 16F84 ? A quoi sert-


elle pratiquement ?

Elle sert lorsque – dans un octet – on a besoin d’inverser un bit en


particulier (ou certains bits en particulier).

Pour cela il suffit de préparer un masque, c’est à dire on octet composé de 0


(aux emplacements où se trouvent les bits à ignorer) et de 1 (aux
emplacements où se trouvent les bits qu’on veut inverser).

Exemple : on souhaite inverser les bits 7, 6, 5 et 4 de l’octet 01111010.

On prépare alors le masque 11110000 et on fait un OU logique entre l’octet


et le masque. Comme ceci :
01111010 (octet)
11110000 (masque)
Ce qui donne : 10001010 (résultat)

L’instruction XORLW a donc bien inversé l’état logique des bits


7, 6, 5 et 4 de l’octet se trouvant dans W. Les bits qui étaient à 0 sont
passés à 1, et inversement.
115

XORWF
Exclusive OR W and File

- Effectue un OU exclusif (Exclusive OR) entre l’octet se trouvant dans le


registre W et l’octet situé (en mémoire RAM) à l’adresse indiquée de suite
(adresse comprise entre 0C et 4F) ; avec deux variantes : le résultat peut
être rangé soit dans le registre W, soit dans la mémoire RAM à la place de
l’octet utilisé pour effectuer le OU exclusif (la nouvelle valeur prend la
place de l’ancienne).

- Un OR exclusif permet de comparer deux octets bit à bit.


Si les bits de même poids sont au même niveau, le résultat est zéro.
Si par contre ils sont à des niveaux différents, le résultat est 1.
Exemple de XOR entre deux octets :
00110011
01110010
résultat = 01000001

- Un OR exclusif permet d’inverser un état logique.


Exemple :
Soit au départ l’octet 11111111.
Si le XOR se fait avec 00000000 , rien ne change ;
le résultat est : 11111111.
Si par contre le XOR se fait avec 00000001, le résultat est :11111110.
(Alors que les zéros ne font rien changer, les 1 provoquent un basculement
d’état).

- Table de vérité d’une porte OU exclusif :

A B Q
0 0 0
0 1 1
1 0 1
1 1 0
116

- Cette instruction affecte le bit Z du registre d’état

- 1 cycle d’horloge

- Encodage de l’instruction:

13 0
00 0110 dfff ffff
0 6 ↓↓↓↓ ↓↓↓↓
(W) 0
ou
(registre) 1
↓↓↓ ↓↓↓↓
De 000 1100
à 100 1111
Adresse de la RAM (entre 0C et 4F)
où se trouve l’octet avec lequel on veut
effectuer le OU exclusif.

Pourquoi cette instruction dans le set du 16F84? A quoi sert-


elle pratiquement?

Elle sert essentiellement lorsque – dans un octet – on a besoin d’inverser un


bit en particulier (ou certains bits en particulier).

Pour cela il suffit de préparer un masque, c’est à dire on octet composé de 0


(aux emplacements où se trouvent les bits à ignorer) et de 1 (aux
emplacements où se trouvent les bits qu’on veut inverser).

Exemple : on souhaite inverser les bits 7, 6, 5 et 4 de l’octet 01111010.

On prépare alors le masque 11110000 et on fait un OU logique entre l’octet


et le masque. Comme ceci :
01111010 (octet)
11110000 (masque)
Ce qui donne : 10001010 (résultat)

L’instruction XORWF a donc bien inversé l’état logique des bits 7,


6, 5 et 4 de l’octet en mémoire. Les bits qui étaient à 0 sont passés à 1, et
inversement.
117

ENCODAGE des INSTRUCTIONS

Signification des lettres utilisées dans l’encodage des


instructions :

b = position du bit dans l’octet sur lequel on opère ( il peut aller


de 0 à 7)

d = registre de destination, avec deux variantes :


d = 0 : le résultat est placé dans W
d = 1 : le résultat est placé dans le registre

f = généralement adresse de la mémoire RAM où se trouve l’octet


concerné ( dans l’espace mémoire compris entre 00 et 4F).
Dans l’instruction TRIS : octet de configuration de port

k = valeur du literal (ou adresse, dans les instructions CALL et


GOTO)

w = registre W (accumulateur)

x = valeur indifférente : peut être soit 0 soit 1.


L’assembleur lui donne automatiquement la valeur 0
(forme recommandée par Microchip)
118

Exemples de programmes
écrits en langage ASSEMBLEUR

Programme 1

a) Organigramme
119

b) Fichier à extension .asm

;Titre du programme : PROG1


;Ce programme allume la LED branchée sur la
;sortie RB0 (bit 0 du Port B) et la laisse
;indéfiniment allumée.

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; DIRECTIVES
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
PROCESSOR 16F84
RADIX HEX
INCLUDE « P16F84.INC »
__CONFIG 3FF1

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; VECTEUR de RESET
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ORG 00 ;Vecteur de Reset.
GOTO START ;Renvoi à l’adresse EEPROM 05 (hexa)

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; INITIALISATIONS
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
START ORG 05 ;Saut introduit pour passer au-dessus
;des 5 premières adresses de la mémoire
;EEPROM (00 – 01 – 02 – 03 et 04).

CLRF PORTB ;Initialise le Port B.

BSF STATUS,RP0 ;Met à 1 (set) le bit 5 (RP0) du


;registre d’état (STATUS).
;Autrement dit : sélectionne la
;page 1 du Register File (adresses
;de 80 à 8B) dans laquelle se trouve
;le Registre STATUS (à l’adresse 83).

MOVLW b’00000000’ ;Met la valeur binaire 00000000 dans


;le registre W, matérialisant ainsi notre
;intention d’utiliser les 8 lignes du
;Port B comme SORTIES.

MOVWF TRISB ;Port B configuré, mais encore en


;haute impédance (Trhee-state).

BCF STATUS,RP0 ;Retour à la page 0 du Register File.


120

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; PROGRAMME
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
LOOP BSF PORTB,0 ;Allume la LED, car l’instruction
; « BSF » met à 1 (set).
;Dans le cas présent, elle met à 1 le
;bit zéro du Port B (PORTB,0).

GOTO LOOP ;Le programme se reboucle.


;La LED reste indéfiniment allumée.

END ;Fin du programme.

c) Fichier à extension .hex


020000000528D1
06000A00860183160030A0
080010008600831206140A2881
02400E00F13F80
00000001FF
121

Programme 2

a) Organigramme
122

b) Fichier à extension .asm


;Titre du programme : PROG2
;Ce programme fait clignoter indéfiniment la LED branchée sur la
;sortie RB0 (bit 0 du Port B).
;Le programme comporte une temporisation (DELAI) pour rendre
;perceptibles les allumages et les extinctions de la LED, sinon les
;transitions auraient lieu à très grande vitesse et notre œil ne verrait
;pas les clignotements.

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; DIRECTIVES
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
PROCESSOR 16F84
RADIX HEX
INCLUDE « P16F84.INC »
__CONFIG 3FF1

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; DECLARATIONS DES VARIABLES
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
COMPT1 EQU 0C ;On met la variable COMPT1 à
;l’adresse RAM 0C.
COMPT2 EQU 0D ;On met la variable COMPT2 à
;l’adresse RAM 0D.

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; VECTEUR DE RESET
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ORG 00 ;Vecteur de Reset.
GOTO START ;Renvoi à l’adresse EEPROM 05 (hexa)

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; INITIALISATIONS
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
START ORG 05 ;Saut introduit intentionnellement pour faire
;démarrer le programme à l’adresse EEPROM 05.

CLRF PORTB ;Efface les 8 bits du Port B.

BSF STATUS,RP0 ;Met à 1 (set) le bit 5 (RP0) du


;registre d’état (STATUS).
;Autrement dit : sélectionne la
;page 1 du Register File (adresses
;de 80 à 8B) dans laquelle se trouve
;le Registre STATUS (à l’adresse 83).

MOVLW b’00000000’ ;Met la valeur binaire 00000000 dans


;le registre W, matérialisant ainsi notre
;intention d’utiliser les 8 lignes du
123

;Port B comme SORTIES.


;La notation b’00000000’ indique que
;la valeur 00000000 est à interpréter
;en tant que chiffre binaire.

MOVWF TRISB ;Port B configuré, mais encore en


;haute impédance (Trhee-state).

BCF STATUS,RP0 ;Retour à la page 0 du Register File.

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; PROGRAMME PRINCIPAL
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
MAIN BCF PORTB,0 ;LED éteinte car l’instruction
; « BCF » met à 0 (clear).
;Ici, elle met à 0 le bit 0 du
;Port B (PORTB,0).

CALL DELAI ;Appelle le sous-programme de


;retard (DELAI).

BSF PORTB,0 ;LED allumée, car l’instruction


; « BSF » met à 1 (set).
;Ici elle met à 1 le bit 0 du
;Port B (PORTB,0).

CALL DELAI ;On appelle à nouveau le


;sous-programme de retard.
GOTO MAIN ;Retour au programme principal.

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; SOUS-PROGRAMME de TEMPORISATION
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
DELAI DECFSZ COMPT1,1 ;Décrémente COMPT1et - s’il n’est pas
GOTO DELAI ;à zéro - va à DELAI

MOVLW .255 ;Charge la variable COMPT1 (adresse


MOVWF COMPT1 ;RAM 0C) avec 255 (en décimal).

DECFSZ COMPT2,1 ;Décrémente COMPT2, et s’il n’est pas


GOTO DELAI ;à zéro, va à DELAI

MOVLW .255 ;Recharge COMPT1 avec 255


MOVWF COMPT1

MOVLW .255 ;Recharge COMPT2 avec 255


MOVWF COMPT2

RETURN ;Fin du sous-programme DELAI

END ;Fin du programme.


124

c) Fichier à extension .hex


020000000528D1
06000A00860183160030A0
100010008600831206100F2006140F200A288C0B6E
100020000F28FF308C008D0B0F28FF308C00FF3025
040030008D00080037
02400E00F13F80
00000001FF
125

PROGRAMME 3

a) Organigramme
126

b) Fichier à extension .asm


;Titre du programme : PROG3
;Ce programme fait clignoter un certain nombre de fois la LED
;branchée sur la sortie RB0 (bit 0 du PORT B), puis fait clignoter
;un certain autre nombre de fois la LED branchée sur la sortie
;RB1 (bit 1 du Port B), et recommence le cycle indéfiniment.

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; DIRECTIVES
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
PROCESSOR 16F84
RADIX HEX
INCLUDE « P16F84.INC »
__CONFIG 3FF1

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; DECLARATIONS DES VARIABLES
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
COMPT1 EQU 0C ;On met la variable COMPT1 à
; l’adresse RAM 0C.
COMPT2 EQU 0D ; On met la variable COMPT2 à
; l’adresse RAM 0D.
nFOIS EQU 0E ; On met la variable nFOIS à
; l’adresse RAM 0E.

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; VECTEUR DE RESET
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ORG 00 ;Vecteur de Reset.
GOTO START ;Renvoi à l’adresse EEPROM 05 (hexa)

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; INITIALISATIONS
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
START ORG 05 ;Saut introduit intentionnellement pour faire
;démarrer le programme à l’adresse EEPROM 05.

CLRF PORTB ;Efface les 8 bits du Port B.

BSF STATUS,RP0 ;Met à 1 (set) le bit 5 (RP0) du


;registre d’état (STATUS).
;Autrement dit : sélectionne la
;page 1 du Register File (adresses
;de 80 à 8B) dans laquelle se trouve
;le Registre STATUS (à l’adresse 83).

MOVLW b’00000000’ ;Met la valeur binaire 00000000 dans


;le registre W, matérialisant ainsi notre
;intention d’utiliser les 8 lignes du
127

;Port B comme SORTIES.


;La notation b’00000000’ indique que
;la valeur 00000000 est à interpréter
;en tant que chiffre binaire.

MOVWF TRISB ;Port B configuré, mais encore en


;haute impédance (Trhee-state).

BCF STATUS,RP0 ;Retour à la page 0 du Register File.

GOTO MAIN1 ;Renvoi à l’adresse correspondant à


;la label MAIN1.

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; SOUS-PROGRAMME de TEMPORISATION
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
TEMPO MOVLW .255 ;Charge COMPT2 (« grande boucle »)
MOVWF COMPT2 ;avec la valeur décimale 255.

DELAI2 MOVLW .255 ;Charge COMPT1 (« petite boucle »)


MOVWF COMPT1 ;avec la valeur décimale 255.

DELAI1 DECFSZ COMPT1,1 ;Décrémente COMPT1et - s’il n’est pas


GOTO DELAI1 ;à zéro - va à DELAI1

DECFSZ COMPT2,1 ;Décrémente COMPT2, et s’il n’est pas


GOTO DELAI2 ;à zéro, va à DELAI2.

RETURN ;Fin du sous-programme TEMPO.

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; PROGRAMME PRINCIPAL
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
MAIN1 MOVLW .2 ;On définit le nombre de cycles de la
MOVWF nFOIS ;première phase (ici : 2 clignotements)

LED1 BCF PORTB,0 ;LED éteinte car l’instruction


; « BCF » met à 0 (clear).
;Ici, elle met à 0 le bit 0 du
;Port B (PORTB,0).

CALL TEMPO ;Appelle le sous-programme de


;retard (TEMPO).

BSF PORTB,0 ;LED allumée, car l’instruction


; « BSF » met à 1 (set).
;Ici elle met à 1 le bit 0 du
;Port B (PORTB,0).

CALL TEMPO ;On appelle à nouveau le


;sous-programme de retard.
128

DECFSZ nFOIS,1 ;Décrémente le nombre de cycles


GOTO LED1 ;affectés à LED1, et si le compteur
GOTO MAIN2 ;n’est pas arrivé à 0, effectue un
;nouveau cycle. Si par contre nFOIS
;est à 0, l’instruction « GOTO LED1 »
;est ignorée et le programme saute à
; « GOTO MAIN2 ».

MAIN2 MOVLW .5 ;On définit le nombre de cycles de la


MOVWF nFOIS ;deuxième phase (ici :5 clignotements)

LED2 BCF PORTB,1 ;LED éteinte car l’instruction


; « BCF » met à 0 (clear).
;Ici, elle met à 0 le bit 1 du
;Port B (PORTB,1).

CALL TEMPO ;Appelle le sous-programme de


;retard (TEMPO).

BSF PORTB,1 ;LED allumée, car l’instruction


; « BSF » met à 1 (set).
;Ici elle met à 1 le bit 1 du
;Port B (PORTB,1).

CALL TEMPO ;On appelle à nouveau le


;sous-programme de retard.

DECFSZ nFOIS,1 ;Décrémente le nombre de cycles


GOTO LED2 ;affectés à LED2, et si le compteur
GOTO MAIN1 ;n’est pas arrivé à 0, effectue un
;nouveau cycle. Si par contre nFOIS
;est à 0, l’instruction « GOTO LED2 »
;est ignorée et le programme saute à
; « GOTO MAIN1 ».

END ;Fin du programme.


129

c) Fichier à extension .hex


020000000528D1
06000A00860183160030A0
10001000860083121428FF308D00FF308C008C0B7B
100020000F288D0B0D28080001308E0006140B20C0
1000300006100B208E0B16281D2802308E00861409
0C0040000B2086100B208E0B1F281428AC
00000001FF
130

PROGRAMME 4

a) Organigramme
131

b) Fichier à extension .asm


;Titre du programme : PROG4
;Ce programme fait clignoter une LED
;branchée sur la sortie RB0 (bit 0 du PORT B), si l’entrée RA4
;(bit 4 du Port A) est activée.
;En désactivant RA4, la LED s’éteint.

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; DIRECTIVES
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
PROCESSOR 16F84
RADIX HEX
INCLUDE « P16F84.INC »
__CONFIG 3FF1

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; DECLARATIONS
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
STATUS EQU 03 ; Aurions pu ne pas les
RP0 EQU 05 ; déclarer, car ces
PORTA EQU 05 ; équivalences sont
PORTB EQU 06 ; définies dans le fichier
TRISA EQU 85 ; INCLUDE « P16F84.INC ».
TRISB EQU 86 ; C’est redondant. Mais ce n’est
START EQU 05 ; pas interdit.
COMPT1 EQU 0C ;On met la variable COMPT1 à
; l’adresse RAM 0C.
COMPT2 EQU 0D .On met la variable COMPT2 à
; l’adresse RAM 0D.
nFOIS EQU 0E ;On met la variable nFOIS
;à l’adresse RAM 0E.

ORG 00 ;Vecteur de Reset.

GOTO START ;Renvoi à l’adresse EEPROM 05 (hexa)

ORG 05 ;Voulons intentionnellement faire


;démarrer le programme à l’adresse EEPROM 05.

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; INITIALISATIONS
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

CLRF PORTB ;Efface les 8 bits du Port B.

BSF STATUS,RP0 ;Met à 1 (set) le bit 5 (RP0) du


;registre d’état (STATUS).
;Autrement dit : sélectionne la
;page 1 du Register File pour atteindre
;le Registre TRISB (à l’adresse 86).
132

MOVLW 00 ;Met des zéros dans le registre W,


;pour les porter ensuite dans le
;Registre TRISB
MOVWF TRISB ;matérialisant ainsi notre intention
;d’utiliser les 8 lignes du Port B
;comme sorties.
MOVLW 0xFF ;Met 11111111 dans le Registre W,
;pour les porter ensuite dans le
;Registre TRISA
MOVWF TRISA ;matérialisant ainsi notre intention
;d’utiliser les 8 lignes du Port A
;comme entrées.

BCF STATUS,RP0 ;Retour à la page 0 du Register File.

GOTO MAIN ;Renvoi au programme principal.

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; SOUS-PROGRAMMES
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

TEMPO ;Début du sous-programme TEMPO

MOVLW .255 ;Charge COMPT2 (« grande boucle »)


MOVWF COMPT2 ;avec la valeur décimale 255

DELAI2 MOVLW .255 ;Charge COMPT1 («petite boucle »)


MOVWF COMPT1 ;avec la valeur décimale 255

DELAI1 DECFSZ COMPT1,1 ;Décrémente COMPT1, et s’il n’est pas


GOTO DELAI1 ;arrivé à zéro, va à DELAI1. Ces deux
;instructions permettent de vider la
;variable COMPT1 (qui est une zone
;RAM et qui pourrait, au démarrage du
;système, contenir une valeur
;aléatoire), pour ensuite lui donner
;une valeur précise.

DECFSZ COMPT2,1 ;Décrémente COMPT2, et s’il n’est


;pas à zéro, va à DELAI2, « grande
;boucle » engendrant un retard long
GOTO DELAI2 ;COMPT2 fois la valeur de COMPT1.

RETURN ;Fin du sous-programme TEMPO


;et retour au programme principal
;à la ligne située juste après
;l’instruction « CALL TEMPO ».

LED ;Début du sous-programme « LED »

BSF PORTB,0 ;Allume la LED.


133

CALL TEMPO ;Appel du sous-programme de


;temporisation.

BCF PORTB,0 ;Eteint la LED.

CALL TEMPO ;Nouvel appel du sous-


;programme de temporisation.

RETURN ;Fin du sous-programme « LED ».

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; PROGRAMME PRINCIPAL
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
MAIN BTFSS PORTA,4 ;Est-ce que l’entrée RA4 est activée ?

GOTO MAIN ;NON. Alors on continue à tester.

CALL LED ;OUI. Dans ce cas on appelle le


;sous-programme LED.

GOTO MAIN ;Retour au programme principal.

END

c) Fichier à extension .hex


020000000528D1
06000A00860183160030A0
100010008600FF30850083121B28FF308D00FF30E3
100020008C008C0B11288D0B0F28080006140D2056
0E00300006100D200800051E1B2816201B2898
00000001FF
134

PROGRAMME 5

Fichier à extension .asm


;Titre du programme : PROG5
;Ce programme fait clignoter une LED
;en utilisant les interruptions générées
;par le timer interne (TMR0).

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; DIRECTIVES
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
PROCESSOR 16F84
INCLUDE « P16F84.INC »
__CONFIG 3FF1

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; DECLARATIONS
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

SAVE_W EQU 0C ;Déclaration de


SAVE_STAT EQU 0D ;deux variables.

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; VECTEURS
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ORG 00 ;Vecteur de Reset.
GOTO START

ORG 04 ;Vecteur d’interruption.


GOTO INT_VECT

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; START
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
START ORG 05

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; INITIALISATIONS
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

BSF STATUS,RP0 ;On passe en Page 1.

MOVLW b’00000000’ ;Port B en sortie.


MOVWF TRISB
135

MOVLW b’00000111’ ;On configure OPTION.


MOVWF OPTION_REG .Le pré diviseur divise par 255.

BCF STATUS,RP0 ;On revient en Page 0.

CLRF TMR0 ;Timer à zéro.

CLRF PORTB ;Toutes LED éteintes.

MOVLW b’10100000’ ;On configure INTCON.


MOVWF INTCON ; - GIE (bit 7) à 1
; - T0IE (bit 5) à 1
; - tous les autres bits à zéro.

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; PROGRAMME PRINCIPAL
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
LOOP GOTO LOOP ;Boucle introduite juste pour occuper
;le processeur, car le but du programme
;est d’attendre l’apparition du signal
;d’interruption.

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; PROGRAMME d’INTERRUPTION
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

INT_VECT MOVWF SAVE_W ;Phase de PUSH (store).

MOVF STATUS,W ;On sauve le Registre W


MOVWF SAVE_STAT ;ainsi que le Registre
;STATUS.
BCF INTCON,T0IF ;On met à zéro le flag
;T0IF qui passe à 1 à chaque
;débordement du TMR0
;(bit 2).
BTFSC PORTB,0
GOTO LED_OFF
BSF PORTB,0 ;On allume la LED RB0.
GOTO FIN

LED_OFF BCF PORTB,0 ;On éteint la LED RB0.

FIN MOVF SAVE_STAT,W ;Phase de POP (restore).


MOVWF STATUS ;On remet en place le
MOVF SAVE_W,W :Registre STATUS, ainsi
;que le Registre W.

RETFIE ;Lorsqu’une interruption est générée,


;le PIC met automatiquement à zéro le
;bit GIE du Registre INTCON pendant
;toute la durée d’exécution du
;sous-programme d’interruption (pour
136

;empêcher la prise en compte d’une


;nouvelle interruption pouvant surgir,
;alors qu’il est justement en train d’en
;traiter une. (On dit que pendant ce
;temps-là les interruptions sont
;masquées).
:L’instruction RETFIE, en même temps
;qu’elle provoque le retour au
;programme principal, remet à 1 le bit
;GIE (Global Interrupt Enable).

END
137

PROGRAMME 6

Fichier à extension .asm


;Titre du programme : PROG6
;Ce programme fait clignoter une LED
;en utilisant les interruptions générées
;par le timer interne (TMR0), et - en plus - allume et laisse
;toujours allumée une deuxième LED branchée sur RB1.

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; DIRECTIVES
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
PROCESSOR 16F84
INCLUDE « P16F84.INC »
__CONFIG 3FF1

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; DECLARATIONS
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

SAVE_W EQU 0C
SAVE_STAT EQU 0D ;Variables
CHOIX EQU 0E
COMPT EQU 0F

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; VECTEURS
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ORG 00 ;Vecteur de Reset.
GOTO START

ORG 04 ;Vecteur d’interruption.


GOTO INT_VECT

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; START
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
START ORG 05

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; INITIALISATIONS
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

BSF STATUS,RP0 ;On passe en Page 1.


138

MOVLW b’00000000’ ;Port B en sortie.


MOVWF TRISB

MOVLW b’00000111’ ;On configure OPTION.


MOVWF OPTION_REG .Le pré diviseur divise par 255.

BCF STATUS,RP0 ;On revient en Page 0.

CLRF TMR0 ;Timer à zéro.

CLRF PORTB ;Toutes LED éteintes.

MOVLW b’10100000’ ;On configure INTCON.


MOVWF INTCON ; - GIE (bit 7) à 1
; - T0IE (bit 5) à 1
; - tous les autres bits à zéro.

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; PROGRAMME PRINCIPAL
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
MAIN BSF PORTB,1 ;On allume la LED (BR1) et on la
GOTO MAIN ;laisse toujours allumée, en attendant
;l’apparition d’une interruption.

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; PROGRAMME d’INTERRUPTION
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

INT_VECT MOVWF SAVE_W ;Phase de PUSH (store).


MOVF STATUS,W ;On sauve W
MOVWF SAVE_STAT ;et STATUS dans la RAM.

BCF INTCON,T0IF ;On met à zéro le flag


;T0IF qui passe à 1 à chaque
;débordement du TMR0
;(bit 2).
BTFSC PORTB,0
GOTO SUITE
BSF PORTB,0 ;On allume la LED RB0.
GOTO FIN

SUITE BCF PORTB,0 ;On éteint la LED RB0.

FIN MOVF SAVE_STAT,W ;Phase de POP (restore).


MOVWF STATUS ;On remet en place
MOVF SAVE_W,W :STATUS et W.

RETFIE ;Lorsqu’une interruption est générée,


;le PIC met automatiquement à zéro le
;bit GIE du Registre INTCON pendant
;toute la durée d’exécution du
;sous-programme d’interruption (pour
139

;empêcher la prise en compte d’une


;nouvelle interruption pouvant surgir,
;alors qu’il est justement en train d’en
;traiter une. (On dit que pendant ce
;temps-là les interruptions sont
;masquées).
:L’instruction RETFIE, en même temps
;qu’elle provoque le retour au
;programme principal, remet à 1 le bit
;GIE (Global Interrupt Enable).

END
140

PROGRAMME 7

Fichier à extension .asm


;Titre du programme : PROG7
;Ce programme active un chenillard sur 4 LED
;utilisant les bits 0, 1, 2, et 3 du Port B.
;Chaque LED s’allume pendant un temps calibré de juste 1 minute
;(60 secondes) fourni par le TMR0 en association avec un compteur.

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; DIRECTIVES
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
PROCESSOR 16F84
INCLUDE « P16F84.INC »
__CONFIG 3FF1

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; DECLARATIONS des VARIABLES
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
SHIFT EQU 0C
COMPT1 EQU 0D

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; VECTEURS
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ORG 00 ;Vecteur de Reset.
GOTO START ;Renvoi à l’adresse EEPROM 05

ORG 04 ;Vecteur d’interruption.


GOTO INT_VECT ;Renvoi au programme d’interruption.

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; INITIALISATIONS
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
START ORG 05 ;Saut introduit intentionnellement
;pour passer au-dessus des adresses
;EEPROM 01 – 02 – 03 – et 04,
;et obliger le programme à démarrer
;à l’adresse 05.

BSF STATUS,RP0 ;On passe en Page 1 pour atteindre


;TRISB (adresse 86) et OPTION
;(adresse 81).

MOVLW b’00000000’ ;Port B configuré en sortie (0=sortie).


MOVWF TRISB
MOVLW b’00000100’ ;Pré diviseur affecté au TMR0, et
141

MOVWF OPTION_REG ;configurer pour diviser par 32.

BCF STATUS,RP0 ;On revient en Page 0.

MOVLW .125
MOVWF COMPT1

MOVLW b’10100000’ ;On configure le Registre INTCON :


MOVWF INTCON ; - GIE (bit 7) à 1
; - T0IE (bit 5) à 1
; - tous les autres bits à zéro

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; PROGRAMME PRINCIPAL
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
LOOP1 GOTO LOOP1 ;Boucle introduite pour occuper le
;processeur, car le but principal du
;programme est d’attendre l’apparition
;du signal d’interruption pour
;déclencher l’animation du chenillard.

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; PROGRAMME d’INTERRUPTION
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
INT_VECT MOVLW b’00000001’ ;On allume la LED
MOVWF SHIFT ;branchée sur RB0,
MOVF SHIFT,0 ;en transitant par
MOVWF PORTB ;la variable SHIFT.

BCF STATUS,0 ;Pour créer un effet de


RLF SHIFT,1 ;chenillard, on utilise
;l’instruction RLF (Rotate
;Left File) laquelle :
; 1) provoque un glissement (rotation)
; à gauche (Left), et
; 2) insère le contenu du bit de CARRY
; dans le bit 0 du Registre STATUS.
; Comme on ignore la valeur (0 ou 1)
; de la CARRY, il est impératif de
; l’effacer au préalable.
BTFSC SHIFT,4 ;Lorsque – de rotation en
rotation –
;le 1 baladeur atteint le bit 4, on
;provoque un SWAP (croisement) entre
;le demi octet de poids faible et le demi
;octet de poids fort (on inverse les
;demi octets)
SWAPF SHIFT,1 ;Après chaque rotation, l’octet est
;gardé dans le même Registre SHIFT,
;pour y évoluer.

CALL DELAI ;On appelle le sous programme DELAI


142

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; SOUS-PROGRAMME de TEMPORISATION
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

DELAI MOVLW .6 ;On initialise le TMR0 avec la valeur


MOVWF TMR0 ;6 (décimal), afin qu’il déborde
;après 250 impulsions.

TEST MOVF TMR0,0 ;On porte la valeur du TMR0 dans


BTFSS STATUS,Z ;W pour pouvoir la tester :
;a-t-elle vu arriver (256 – 6)
;250 impulsions ?
;C’est à dire : est-ce que le TMR0
;est arrivé à FF ?
GOTO TEST ;Si NON : on continue à tester.

MOVLW .6 ;Si OUI : on recharge TMR0


MOVWF TMR0 ;avec 6 (décimal) et ensuite
DECFSZ COMPT1,1 ;on décrémente la variable COMPT1
GOTO TEST ;Est-ce que COMPT1 = 0 ?
;NON : on continue à décrémenter.
;OUI : 1 seconde s’est écoulée.
MOVLW .6 ;On recharge
MOVWF TMR0 ;le TMR0.

MOVLW .125 ;On recharge


MOVWF COMPT1 ;la variable COMPT1.

RETURN ;Fin du sous-programme DELAI.

END ;Fin du programme.


143

MPLAB

Qu’est-ce que MPLAB


MPLAB est un outil de développement spécifique aux
microcontrôleurs PIC, conçu et fourni gratuitement par Microchip.
Il permet d’écrire, mettre au point et optimiser les programmes,
sous Windows.
En effet, en plus d’un éditeur et d’un assembleur, il inclut un ensemble
d’outils permettant non seulement de fabriquer le code objet d’une
application, mais aussi de simuler le programme, c’est à dire le voir
dérouler à l’écran.
Il supporte plusieurs outils externes, parmi lesquels deux modèles
de programmateurs (PICSTART PLUS et PROMATE 2) et deux
émulateurs (PICMASTER et PICMASTER-CE).
MPLAB est facile à apprendre et à utiliser.
144

Il offre beaucoup de flexibilité aux développeurs, notamment grâce


aux nombreuses fenêtres pouvant être ouvertes à tout moment lors d’une
mise au point, permettant de voir le contenu d’un quelconque emplacement
mémoire et d’un quelconque registre.
145

Comment obtenir MPLAB


MPLAB est téléchargeable à partir du site Internet de Microchip
(www.microchip.com).
Si vous aviez besoin de le copier sur disquettes, prévoyez-en un bon
nombre (il vous en faudra au moins huit).
Vous seriez en possession de fichiers compressés, que vous devriez
décompresser au moyen d’un logiciel adapté (WinZip, par exemple).

Remarquez que MPLAB est un produit en constante évolution, et


qu’en fonction de la version qui vous serait fournie, vous pourriez trouver
un certain nombre de fichiers modifiés ou différents d’une version à l’autre.
La version que Microchip diffuse au moment où j’écris et dont je
me sers dans mes exemples est la version 5.20
146

Caractéristiques requises par le PC pour


l’installation de MPLAB

Pour pouvoir être installé, MPLAB nécessite la configuration


minimale suivante :

- un PC compatible 486 ou mieux ;

- Microsoft Windows depuis 3.1 jusqu’à la version la plus


récente ;

- écran VGA ;

- 8 Méga de mémoire (32 Méga recommandés) ;

- 20 Méga d’espace disponible sur le disque dur ;

- la souris.
147

Comment installer MPLAB

MPLAB s’installe automatiquement.

Pendant la procédure d’installation, qui démarre toute seule,


plusieurs fenêtres vont s’ouvrir.

La première est celle qui vous souhaite la bienvenue et vous


informe que vous vous préparez à installer la version 5.20 de MPLAB .
Cliquez sur le bouton Next.
148

Dans la fenêtre suivante, décochez les éléments que vous ne


souhaitez pas installer.

A moins que vous ayez acheté un simulateur ou un émulateur


(chose dont je doute fort !), vous ne devriez installer que les outils logiciels
courants, et l’aide.

Décochez les autres.

Cliquez ensuite sur le bouton Next.


149

Dans la fenêtre Select Language Components, vous ne devriez


maintenir actif que tout ce qui se rapporte à Windows.

Décochez tout ce qui se rapporte au DOS (Je n’aime pas les


programmes tournant sous DOS. Vous non plus, j’imagine ! ).
150

La fenêtre suivante (Select Destination Directory) vous indique le


chemin que l’installation va prendre dans votre PC.

Acceptez, en cliquant sur Next.

La fenêtre suivante vous demande si vous voulez créer des copies


de sauvegardes des fichiers que l’installation pourrait être amenée à
remplacer.
151

Acceptez la configuration par défaut (No) en cliquant sur Next.


152

Dans la fenêtre suivante (Add to Start Menu ?) acceptez la


suggestion Yes .
153

Faites la même chose dans la fenêtre suivante :

Acceptez la configuration suggérée, en cliquant sur Next.


154

Puis acceptez encore ce qui vous est proposé dans la fenêtre qui
suit :
155

Vous arrivez enfin à la dernière fenêtre : celle qui vous dit que
maintenant tout est prêt pour que l’installation démarre de vrai !

Cliquez sur Next : c’est parti.


156

Une fois l’installation terminée (Installation Completed !), vous


pouvez ignorer le Readme proposé. Cliquez sur MPLAB.EXE pour créer un
raccourci.

Vous pouvez démarrer.

L’environnement de développement de MPLAB est à vous !


157

Comment désinstaller MPLAB

Le fichier INSTALL.LOG enregistre les noms de tous les fichiers


copiés au cours de la procédure d’installation.

Le jour que l’on souhaite désinstaller MPLAB, la procédure de


désinstallation utilise INSTALL.LOG pour savoir quels sont les fichiers à
supprimer.

Pour la désinstallation, il suffit de lancer UNWISE.EXE se


trouvant dans le répertoire de MPLAB.
158

Comment démarrer avec MPLAB

Tout d’abord une constatation : l’écran de démarrage de MPLAB


ressemble à la plupart des écrans Windows, en ce sens qu’il comporte - en
haut - la barre des menus et la barre d’outils, et - en bas - une barre d’état
informant de la façon dont le système est configuré.
En cliquant sur la toute première icône de la barre d’outils (icône
en couleur représentant trois fiches en perspective : bleu, rouge, jaune):

vous pouvez déjà constater la présence d’autres barres d’outils (il y


en a quatre) :

Comme l’on sait que dans tout logiciel bien conçu plus il y a
d’outils disponibles et plus le travail est facile, la première évidence est que
MPLAB est un logiciel sympathique.

A ajouter aussi que MPLAB est un logiciel sûr, et qu’il possède plusieurs
points d’entrée.
159

MPLAB est un logiciel sûr : vous pouvez l’utiliser sans vous faire
le moindre souci, car il ne vous laissera jamais modifier ou supprimer quoi
que ce soit présentant le moindre danger pour l’intégrité des fichiers sans
vous mettre en garde et vous demander de confirmer la commande;

MPLAB possède plusieurs points d’entrée : en ce sens que vous


pouvez effectuer la même tâche en empruntant des chemins différents, sans
obligatoirement obéir à un mode d’emploi préétabli. Il suffit, la plupart des
fois, d’adapter et de croiser les grilles écran ouvertes sur le bureau.

Eu égard à cette souplesse, c’est-à-dire : étant donné qu’il est


possible d’emprunter différents chemins pour accomplir la même tâche, la
manière d’écrire un programme et de l’assembler que je vais vous indiquer,
est seulement l’une des manières possibles. Au fur et à mesure que vous
vous familiariserez avec MPLAB, vous en découvrirez d’autres.
160

Première étape : création du projet

Créer un projet

Pour pouvoir aboutir à un programme, MPLAB a besoin de


naviguer entre plusieurs fichiers.

Pour cette raison, avant de vous autoriser à écrire un programme,


MPLAB vous oblige à créer un projet.

Créer un projet revient à définir entre autres:

1) le nom que va porter le programme ;

2) les fichiers que MPLAB devra utiliser au cours du


développement.

Un projet comporte un nom, avec extension .pjt

Convenons d’appeler notre projet phase1


Le nom du projet sera donc : phase1.pjt
161

Comment créer un projet


Lancez MPLAB, puis allez dans :
Project

New Project

Une fenêtre s’ouvre (New Project) :

MPLAB vous rappelle que le nom du projet doit impérativement


être suivi de l’extension .pjt
162

Dans le champ File Name entrez le nom que vous voulez donner à
votre projet (nous avons convenu de l’appeler phase1) suivi de .pjt
(phase1.pjt).

Puis cliquez sur OK.

Cette manœuvre ouvre une autre fenêtre (Edit Project):


163

Dans cette fenêtre :

a) le Target Filename (le nom du fichier cible, c’est à dire


celui auquel vous voulez aboutir) doit correspondre à celui que vous voulez
créer, portant donc l’extension .hex (phase1.hex) ;
164

b) le Development Mode se rapporte bien au MPLAB-


SIM Simulator PIC 16F84 et non pas à un autre mode de développement
(sinon cliquez sur la touche Change et modifiez en conséquence; puis
cliquez en répondant toujours OK) ;

b) le Language Tool Suite doit être celui de Microchip.

Après ces vérifications, cliquez sur la touche OK.

Dès lors, le projet est créé.

Il contient les paramètres qui lui sont nécessaires, et vous pourrez


vous y référer par la suite.
165

Deuxième étape :
écriture du programme source

Pour taper votre programme, allez dans :

File

New

C’est à partir de maintenant que l’écriture à proprement parler des


instructions du programme peut démarrer.
166

La fenêtre d’accueil est Untitled1 :

C’est celle de l’éditeur de texte de MPLAB.

Elle est prête à recevoir les lignes de votre programme.

Agrandissez-la à plein écran, et commencez la frappe.

Pour séparer les champs (labels, instructions, opérandes et


commentaires) servez-vous de la touche de tabulation.

N’oubliez pas d’insérer des ; (point-virgule) avant les


commentaires.
167

Lorsque toutes les lignes du programme ont été saisies, allez dans :
File

Save As...

Une fenêtre s’ouvre (Save File As):


168

Dans le champ File Name demandant le nom sous lequel vous


voulez sauvegarder le fichier, tapez le nom du programme - qui doit être
impérativement le même que celui du projet, suivi de l’extension .asm ainsi
que MPLAB vous le rappelle (phase1.asm) - ou allez le chercher dans la
liste déroulante, au moyen de l’ascenseur. Puis terminez en cliquant sur la
touche OK.

Dès lors, ce fichier à extension .asm contient le « programme


source », que l’on appelle plus couramment « fichier source », ou tout
simplement « source ».
Ce fichier est sauvegardé.

Notez ou retenez bien son nom (phase1.asm), car vous aurez


l’occasion d’y revenir.
169

Troisième étape:
conversion du programme source
en programme objet

Le but de cette opération est de convertir le fichier source (celui


dont l’extension est .asm ) en fichier objet, c’est à dire en un fichier ayant
le même nom que celui du fichier source, mais avec extension .hex

Autrement dit : convertir phase1.asm en phase1.hex

Pour cela, allez dans :

Project

Edit Project
170

Une fenêtre s’ouvre :

Vous connaissez cette fenêtre pour l’avoir vue lors de l’ouverture


du projet.
Assurez-vous d’abord que le nom du fichier figurant dans la zone
Target Filename correspond à celui qui vous intéresse (phase1.hex).
Le cas échéant, modifiez en cliquant sur la touche Change.
171

Cette fenêtre comporte déjà le nom du fichier cible (phase1.hex).


Mais, à ce stade, MPLAB demande qu’un nœud soit créé entre le fichier
cible et le fichier source.

En bas, à droite, une touche est disponible : Add Node.

Un clic sur cette touche, ouvre la fenêtre Add Node.

Au moyen de l’ascenseur, cherchez-y le fichier de même nom à


extension .asm (phase1.asm) et cliquez sur ce fichier pour que son nom
s’inscrive dans le champ Nom de fichier.

Puis cliquez sur OK.


172

La fenêtre Edit Project s’ouvre une nouvelle fois :

Mais cette fois, dans la zone Project Files, figurent les noms de
deux fichiers :
- celui à extension .hex
- et celui à extension .asm
173

Cliquez sur OK pour verrouiller le nœud entre MPLAB et


MPASM (un autre utilitaire de l’environnement intégré) et lier ainsi ces
deux fichiers.

Puis allez dans :

Project

Build All

Dès lors, la compilation démarre: les instructions du fichier


phase1.asm écrites en langage assembleur (celui utilisant les
mnémoniques) sont transformées en une suite de 0 et de 1 (seul langage
compréhensible par le 16F84) pour constituer le fichier phase1.hex
174

Il arrive qu’une compilation soit bonne du premier coup.

A supposer que tel soit le cas, vous devriez voir s’ouvrir la fenêtre
suivante :

Par le message : « Build completed successfully » (la compilation


s’est achevée avec succès), cette fenêtre vous informe que l’assemblage de
votre fichier à extension .asm (phase1.asm) a aboutit à un fichier à
extension .hex (phase1.hex)

Félicitations ! Cela veut dire que dans votre programme source


vous n’avez commis aucune erreur.
175

Vous pourriez - tout au plus - voir apparaître des « messages » ou


des « warnings », c’est à dire des avertissements, des mises en garde.

Bien que les messages et les warnings n’empêchent pas le


déroulement d’un programme, il est tout de même bon de leur jeter un coup
d’œil et d’en comprendre les raisons.

Il suffit de demander à MPLAB de numéroter les lignes de votre


programme (en cliquant sur l’icône dans l’une des barres des outils, en haut
de l’écran)

Puis, de vous reporter à la ligne mentionnée par chaque message


ou warning et de l’examiner attentivement. A cette ligne le compilateur
assembleur de MPASM n’a pas trouvé une erreur à proprement parler, mais
une sorte d’ambiguïté, une anomalie, et il vous prévient que cela pourrait
conduire à une exécution défaillante de votre programme.
176

Quatrième étape:
correction des erreurs

Si votre programme contient des erreurs, la compilation n’aboutit


pas.

Avec le message Build failed (construction ratée), vous verriez


apparaître des messages mentionnant la ou les erreurs.

Dans ce cas, il faut impérativement revenir au fichier à extension


.asm et corriger les erreurs.
Puis, relancer la compilation depuis le début par :
Project

Make Project

Vous revenez ainsi à la fenêtre Build Results.

Cela autant de fois que nécessaire, jusqu’à lire le message :


« Build completed successfully ».
177

Cinquième étape:
simulation du programme

Disons-le tout de suite : cette étape est facultative, car elle


concerne la simulation.

La simulation est une sorte de vérification virtuelle permettant de


voir à l’écran ce qui se passe lorsque les instructions sont exécutées par le
microcontrôleur.

On peut la faire de différentes façons :

- en mode pas à pas


- en mode step over
- en mode exécution automatique
- avec ouverture de fenêtres.
178

Mode pas à pas


Pour simuler un programme en mode pas à pas, appelez à l’écran
le fichier à extension .asm
Puis allez dans :
Debug

Run

Reset
(ou tapez le raccourci clavier F6) :

Cette manœuvre effectue un Reset logiciel du programme qu’on


veut simuler.
En effet, le Program Counter est mis à zéro (adresse
correspondant au vecteur Reset du 16F84).
179

La ligne de programme se trouvant à cette adresse passe en


surbrillance, tandis que dans la barre d’état (située en bas de l’écran) PC
prend la valeur 00.

Ensuite allez dans :

Debug

Run

Step

En tapant sur le raccourci clavier F7 le PC (Program Counter)


avance d’un pas à la fois, ainsi que vous pouvez le constater en lisant la
valeur du Program Counter dans la barre d’état.

C’est l’exécution en mode pas à pas.


180

Vous pouvez aussi vous


servir de la souris, en cliquant
sur l’icône :

(Deux empreintes de pas: Pas à pas : F7)

Icône située dans la barre des outils, en haut de l’écran.

Devant une boucle, vous pourriez stopper la simulation soit en


tapant sur le raccourci clavier F5, soit en cliquant sur l’icône du feu rouge :

(Feu rouge : Halt : F5)


181

Mode Step Over

Lorsque dans le programme il y a des boucles, l’exécution peut


prendre beaucoup de temps.
Dans ce cas, il existe la possibilité de demander au simulateur
d’ignorer les boucles.

C’est le mode Step Over.

Pour ce type d’exécution il faut choisir le chemin :

Debug

Run

Step Over
182

Pour faire avancer le programme dans ce mode, tapez sur le


raccourci clavier
F8 ou cliquez de façon répétée sur l’icône montrant deux

empreintes de pas entrecoupées :

Le programme s’exécute alors selon un mode qui - en apparence -


ressemble au mode pas à pas, mais qui en réalité ignore toutes les boucles.
De ce fait, le temps de son exécution est considérablement plus court.

L’arrêt de la simulation peut se faire à tout moment, soit en


cliquant sur l’icône du feu rouge, soit en tapant sur la touche F6.

L’on revient alors au début du programme.


183

Mode exécution automatique


Au lieu de faire du pas à pas, on peut faire exécuter le programme
en entier, automatiquement, sans avoir besoin ni de cliquer sur une
quelconque icône, ni de taper sur une quelconque touche de raccourci.

Il suffit d’aller dans :


Debug→Run→Animate :

L’arrêt de la simulation peut se faire à tout moment, soit en


cliquant sur l’icône du feu rouge

soit en tapant sur la touche F6.


Dans les deux cas l’on revient au début du programme.
184

Ouverture de fenêtres

En complément à la simulation, vous pourriez avoir besoin de voir


de plus près comment évolue une variable, une adresse, le contenu d’un
compteur ou d’une quelconque zone mémoire.

Pour ce genre d’observation, MPLAB met à disposition un grand


nombre de fenêtres (Windows) spécifiques.

Il suffit d’aller soit dans :


Window

Cette fenêtre permet d’ouvrir les trois fenêtres principales : celle


relative à la pile (Stack Window), celle relative à la RAM (File Register
185

Window), ou celle relative aux registres à usage spécial (Special Function


Register Window).
Sinon on peut aller dans :

Window

Watch Windows

New Watch Window
186

Cette manœuvre ouvre une fenêtre comportant tous les noms des
registres et variables utilisé dans votre programme :

Il suffit de cliquer sur ce qui vous intéresse, pour aussitôt voir


s’ouvrir la fenêtre correspondante, dans laquelle toute variable subissant
une modification au cours de l’exécution du programme, change de
couleur, attirant votre attention.

Il est même possible de suivre l’évolution de plusieurs variables et


d’avoir sous vos yeux, constamment ouvertes, plusieurs fenêtres.

Pour cela, au moyen de l’ascenseur, sélectionnez la ligne


correspondant à ce que vous voulez observer, et terminez - après avoir
éventuellement sélectionné d’autres registres encore - en cliquant sur le
bouton Add, puis sur le bouton Close.

Dès lors, plusieurs fenêtres se positionnent sur l’écran, rangée


l’une derrière l’autre, comme les cartes dans la main d’un joueur, que vous
pouvez rendre actives à souhait.

Faites ensuite avancer le programme en mode pas à pas (F7).


187

PROGRAMMATION
en langage BASIC
Le BASIC que nous allons utiliser est le PicBASIC élaboré par la
Société MICRO ENGINEERING Labs (représentée en France par
SELECTRONIC à Lille).

Le COMPILATEUR PicBASIC tient sur une disquette.


Il est proposé en deux versions : la version standard et la version
professionnelle.
Tous les exemples que je fournis ont été réalisés avec la version standard,
qui permet de réaliser n’importe quel programme, sans limitations.
Ce que l’on trouve en plus dans la version Pro, c’est un plus grand confort
de travail : possibilité d’ouvrir plusieurs fenêtres en même temps,
numérotation des lignes du fichier source, etc..
La disquette est accompagnée d’un manuel d’utilisation en anglais et d’une
traduction en français.
Ce logiciel, vendu par SELECTRONIC à Lille, au moment de la rédaction
de ces pages, coûte € 129,50 (prix au 16/09/2002).

Si vous voulez mon conseil : n’hésitez pas à vous le procurer.


Il fera de vous des programmeurs enthousiastes, car programmer
avec le PicBASIC de MICRO ENGINEERING Labs (MEL) est
extrêmement facile.
Il n’y a rien de comparable entre la programmation en langage
ASSEMBLEUR et la programmation en langage MEL PicBASIC.
Bien qu’il existe d’autres BASIC pour les microcontrôleurs PIC,
proposés par d’autres Sociétés, celui de MEL est de loin le meilleur, car
extrêmement puissant et très facile à prendre en main.
Alors un conseil : ne cédez pas à la tentation de vous en procurer
ou d’accepter une version quelconque de BASIC pour PIC, pensant faire
une bonne affaire. Car vous vous habitueriez à travailler avec ses
instructions et – si un jour vous vous rendiez compte des limites de votre
BASIC et vous vouliez passer au MEL PicBASIC – vous auriez de la
difficulté à chasser de votre mémoire les instructions de l’ancien BASIC,
avec le risque de les mélanger et fatalement d’avoir à corriger des erreurs.
Faites donc dès à présent l’effort de cet achat, et je vous assure que
vous ne le regretterez pas. Le langage ASSEMBLEUR, l’architecture du
188

PIC, la Page 0, la Page1, le Registre STATUS, le Registre OPTION et tout


le reste.. sera vite oublié. Vous ne verrez plus que votre programme.

C’est comme si, pour préparer un programme commandant


l’ouverture de la porte de votre garage :

a) avec le langage ASSEMBLEUR vous devriez écrire :


- approchez-vous de la porte du garage
- mettez la main gauche dans la poche gauche de votre veste
- prenez la clé de la porte du garage
- avez-vous la clé en main ?
- non
- mettez alors la main droite dans la poche droite de votre veste
- prenez la clé de la porte du garage
- avez-vous la clé en main ?
- oui
- sortez la main droite de la poche droite de votre veste
- introduisez la clé dans la serrure de la porte du garage
- tournez la clé
-etc...
- etc...
- fin

b) alors qu’avec le langage MEL PicBASIC il suffirait d’écrire :


- approchez-vous de la porte du garage
- prenez la clé
- ouvrez la porte du garage
- fin

Ce sont les instructions du PicBASIC qui - avec leur puissance -


comprennent ce que vous voulez faire et effectuent toutes les petites tâches
intermédiaires, à votre place, sans que vous ayez besoin de les détailler.

Merveilleux, non ?

Avant d’examiner chaque instruction une par une, il est


indispensable de s’arrêter sur quelques particularités qui facilitent
grandement l’apprentissage du langage MEL PicBASIC.
189

Symbol
Avec la directive Symbol on peut associer un nom à une variable
ou à une pin du microcontrôleur.
Ainsi définies, telle variable ou telle pin du microcontrôleur
peuvent alors être plus facilement utilisées dans l’écriture d’un programme.
Par exemple : Symbol LED = Pin 0
Signifie : associe à Pin 0 (c’est à dire à RB0) le nom LED.
Ainsi, par exemple l’instruction :
LED = 1
est plus facile à lire dans le programme, car on comprend qu’elle allume la
LED (met au niveau logique haut la pin 0 du Port B).

Symbol permet de renommer un chiffre (le plus souvent) ou une


variable.
Chiffres et variables qui – rencontrés dans la lecture d’un programme – ne
diraient pas grand’chose, deviennent plus explicites après avoir été
rebaptisés par Symbol car il est beaucoup plus facile de retenir un nom
qu’une adresse, le nom étant chargé d’une signification, alors qu’une
adresse ne dit rien.
190

Les variables de type B et W

Les variables correspondent à des emplacements mémoire utilisés


pour stocker temporairement des données.

Le MEL PicBASIC propose d’emblée des variables prêtes à


l’emploi.

Selon que les données à stocker soient de petites données et


qu’elles tiennent en un seul octet (byte = 8 bits), ou qu’elles soient de
grandes données et que pour les accueillir il faille un mot (word = 16 bits),
MEL PicBASIC propose deux types de variables :

a) les variables de type B (byte) utilisées pour stocker des


variables à 8 bits, et

b) les variables de type W (word) utilisées pour stocker des


variables à 16 bits.

Pour le microcontrôleur 16F84 PicBASIC a prédéfini 52 variables


de type B (de B0 à B51), et 26 variables de type W (de W0 à W25).

Les variables de type W sont constituées de la juxtaposition de


deux variables de type B. Ainsi la variable W0 est constituée de la
juxtaposition de la variable B0 et de la variable B1. La variable W1 est
constituée de la juxtaposition de la variable B2 et de variable B3, et ainsi de
suite..
Le compilateur ne peut utiliser que les registres du microcontrôleur
pour stocker les variables du programme. Ce qui veut dire que le nombre
des variables mises à disposition dépend du modèle de PIC utilisé.
191

Les variables de bit

Il faut savoir qu’il existe aussi des variables de bit prédéfinies.


Ce sont les variables B0 et B1 qui les accueillent.
Dans ce cas, les variables de bit qu’elles logent s’appellent :
Bit0, Bit1, Bit2 ........ et ainsi de suite jusqu’à Bit15.
192

Dénomination des lignes de PORTS

MEL PicBASIC n’appelle pas de la même façon les bits du Port A


et les bits du Port B.

a) Les bits du Port A


Les bits du Port A sont appelés : Pin0
Pin1
Pin2
Pin3
Pin5

b) Les bits du Port B


Les bits du Port B sont appelés : 0
1
2
3
4
5
6
7

Attention donc !
- Pour vous référer à l’un des 5 bits du Port A vous direz :
Pin0, Pin1, Pin2, Pin3, Pin4.

- Pour vous référer à l’un des 8 bits du Port B vous direz :


0, 1, 2, 3, 4, 5, 6, 7.
193

Configuration des bits de chaque Port

Chaque bit de Port (Port A et Port B) peut être configuré en entrée


ou en sortie :
- tout bit mis à 0 est configuré en entrée
- tout bit mis à 1 est configuré en sortie.

Mais la façon dont MEL PicBASIC configure les bits n’est pas la
même pour le Port A et pour le Port B.

Port A
a) Pour configurer le Port A en entrée (associé - par exemple - à
des interrupteurs) il faut premièrement s’adresser au Registre du Port A
(situé à l’adresse 5). Puis il faut définir la direction de ce Port en s’adressant
au Registre TRISA (situé à l’adresse 85).
Les bits mis à 0 deviennent des entrées. Tandis que les bits mis à 1
deviennent des sorties.
Pour configurer tout le Port A en entrée il faut donc écrire :
Symbol PORTA = 5
Symbol TRISA = $85
POKE TRISA,255 (255 = 11111111)
(Tous bits du Port A en entrée).

b) Pour configurer le Port A en sortie il faut faire de même :


premièrement s’adresser au Registre du Port A (situé à l’adresse 5). Puis
définir la direction de ce Port en s’adressant au Registre TRISA (situé à
l’adresse 85).
Les bits mis à 0 deviennent des entrées. Tandis que les bits mis à 1
deviennent des sorties.
Pour configurer tout le Port A en sortie il faut donc écrire :
Symbol PORTA = 5
Symbol TRISA = $85
POKE TRISA,0 (0 = 00000000)
(Tous bits du Port A en sortie).
194

Port B

Pour configurer le Port B on utilise l’instruction

DIRS = X X X X X X X X

DIRS suivi du signe égal et - après le signe égal - des 0 et des 1


formant l’octet de configuration, conformément à la façon dont on veut
configurer le Port.

0 = entrée
1 = sortie

Exemples :

- DIRS = % 11111111 (Tous bits du Port B configurés en


(ou DIRS = 255) sortie).

- DIRS = % 00000000 (Tous bits du Port B configurés en


(ou DIRS = 0) entrée).

- DIRS = % 00001111 (Bits 0 à 3 configurés en sortie, et


(ou DIRS = 15) bits 4 à 7 configurés en entrée)

- etc.. (tous les cas de figure sont permis).


195

Lecture des Ports

Pour lire l’état d’un Port on utilise l’instruction PEEK.


Comme ceci :

PEEK PORTA,B0
Ce qui signifie : lire le contenu du Port A et le stocker dans la
variable B0. En fait cette variable peut être l’une quelconque
des variables prédéfinies pour le 16F84 (B0... B51).

Ensuite on peut affiner par :

IF B0, Bit0 = 0 Then......

ou

IF B0, Bit0 = 1 Then.....

etc..
196

Les constantes

Les constantes numériques peuvent être exprimées en trois bases :

- décimale
- binaire
- hexadécimale

Pour dire au compilateur en quelle base on veut travailler, on place


un préfixe devant le nombre.

En écrivant un nombre sans préfixe, le compilateur traite ce


nombre en décimal.
Par exemple : 100 (sans préfixe) est interprété comme 100 (base
décimale).

En tapant %100, le compilateur interprète le nombre 100 en


binaire (00000100 c’est à dire 4 en décimal).

Enfin, en tapant $100, le compilateur interprète le nombre 100 en


hexadécimal (0001 0000 0000 c’est à dire 256 en décimal).
197

Les labels

Les labels (étiquettes) doivent obligatoirement commencer à la


première colonne, et doivent se terminer par deux points ( :)

Elles servent généralement à identifier des sous-programmes pour


que le PIC - à l’issue d’un test, par exemple - fasse une certaine chose si la
condition est vraie, ou une autre chose si la condition est fausse. Ou, devant
la position d’un interrupteur, pour qu’il fasse une certaine chose si
l’interrupteur est ouvert ou une certaine autre chose si l’interrupteur est
fermé.... etc..

Les étiquettes repèrent des adresses, pour que le PIC y accède


quand on y fait référence.
198

Les commentaires

En PicBASIC les commentaires doivent obligatoirement être


précédés par une apostrophe (‘) (Attention : la directive REM n’existe pas
en PicBASIC).

Tout ce qui est écrit après une apostrophe est ignoré par le
compilateur.

Les commentaires servent à garder une trace de ce que fait le


programme.

L’écriture d’un programme sans commentaires n’est pas à


envisager, car même si la compréhension d’un programme peut paraître
évidente au moment de sa création, elle peut s’avérer difficile quelque
temps après, ou sa lecture impossible pour ceux qui devraient en assurer la
maintenance.

Ne soyez pas avares de commentaires. Mettez-les même quand les


seules instructions du programme pourraient donner une impression
d’évidence.
199

Le set d’INSTRUCTIONS du
MEL PicBASIC

Le MEL PicBASIC est constitué de 40 instructions.

Ne confondez pas - je vous prie - les 40 instructions de ce langage


avec les 37 instructions du langage ASSEMBLEUR : cela n’a strictement
rien à voir !

Examinons ces 40 instructions une par une, en les présentant par


ordre alphabétique pour que vous les retrouviez plus facilement.

Je signale qu’elles peuvent être écrites comme on veut :


- en majuscules
- en minuscules
- et même en mélangeant majuscules et minuscules.

Par exemple, l’instruction GOTO peut s’écrire :

- GOTO
- Goto
- goto
- GoTO
- goTO
- gOto
- etc...
200

Classement par ordre alphabétique


BRANCH
BUTTON
CALL
DEBUG
DIRS =
EEPROM
END
FOR/NEXT
GOSUB
GOTO
HIGH
I2Cin
I2Cout
IF...THEN
INPUT
LET
LOOKdown
LOOKup
LOW
NAP
OUTPUT
PAUSE
PEEK
PINS =
POKE
POT
PULSin
PULSout
PWM
RANDOM
READ
RETURN
REVERSE
SERin
SERout
SLEEP
SOUND
TOGLE
TRISA
WRITE
201

Classement par genre

BRANCH BUTTON I2Cin DEBUG


CALL DIRS = I2Cout EEPROM
GOSUB HIGH TRISA END
GOTO INPUT FOR...NEXT
RETURN LOW IF...THEN
OUTPUT LET
PINS = LOOKDOWN
POT LOOKUP
PULSin NAP
PULSout PAUSE
PWM PEEK
REVERSE POKE
SERin RANDOM
SERout READ
SOUND SLEEP
TOGLE WRITE
202

BRANCH
Cette instruction est une variante de GOTO.
Comme GOTO, elle permet de sauter à des sous-programmes.
Mais ici en fonction de la valeur prise par la variable donnée en offset.

SYNTAXE :
BRANCH offset (Label1, Label2, ... )
Si offset vaut 0, le programme saute à Label1
S’il vaut 1, le programme saute à Label2
et ainsi de suite..

EXEMPLE :
BRANCH B5 (Label1, Label2, Label3)
Si B5 vaut 0, le programme fait un GOTO au sous-programme
appelé Label1.
S’il vaut1, le programme fait un GOTO au sous-programme
appelé Label2.
S’il vaut2, le programme fait un GOTO au sous-programme
appelé Label3.

Si la valeur de l’offset (ici B5) prend une valeur supérieure au


nombre des sous-programmes indiqués dans les parenthèses (ici : 0, 1, 2) le
programme n’effectue aucun saut et continue en séquence.
203

BUTTON
Cette instruction lit l’état d’un interrupteur placé sur l’une des 8
lignes (0.....7) du Port B (RB) et peut :
- déclencher une procédure d’anti-rebonds
- déclencher une procédure d’auto-répétition
- tester si l’interrupteur ferme vers la masse ou vers le +
- faire un GOTO à un sous-programme, selon que l’interrupteur
soit ouvert ou fermé.

SYNTAXE :
BUTTON Pin, Down, Delay, Rate, Var, Action, Label

Nom du sous-programme
auquel il faut sauter.

Etat auquel l’interrupteur doit se


trouver (0 si ouvert, 1 si fermé)
pour que le saut ait lieu.

Nom de la variable (B0....B51) servant


au décomptage des auto-répétitions.

Nombre de fois (0.....255) qu’on veut faire


tourner l’auto-répétition pour lire l’état
de l’interrupteur.

Nombre de cycles (0.....255) qu’on veut laisser passer


à partir du moment où l’interrupteur a été actionné,
avant de déclencher une procédure d’auto-répétition.
Si Delay vaut 0, les fonctions anti-rebonds et
répétition automatique n’ont pas lieu. Si Delay vaut
255, seule la fonction anti-rebonds a lieu, pas
celle d’auto-répétition.

Etat de l’interrupteur au moment où il est appuyé.

Numéro de la pin du Port B (RB) sur laquelle se trouve


l’interrupteur (0.......7).
204

EXEMPLE :
BUTTON 2, 0, 100, 10, B0, 0, CLIGNOTE
Lit l’état de l’interrupteur placé sur RB2 (en supprimant les
rebonds des contacts) et – si l’interrupteur est ouvert – saute au
sous-programme appelé CLIGNOTE.
205

CALL

Appelle un sous-programme écrit en langage ASSEMBLEUR.


C’est une instruction qui assure une sorte de passerelle, grâce à
laquelle on peut incorporer, à des instructions écrites en PicBASIC, des
instructions écrites en langage ASSEMBLEUR.

SYNTAXE :
CALL Label

EXEMPLE :
CALL DELAI
DELAI DECFSZ COMPT1,1
GOTO DELAI
MOVLW .255
MOVWF COMPT1

DECFSZ COMPT2,1
GOTO DELAI
MOVLW .255
MOVWF COMPT1
MOVLW .255
MOVWF COMPT2
RETURN
206

DEBUG

Sert lors de la mise au point d’un programme.

La mise au point d’un programme est une phase délicate.


Le programme est écrit, mais des erreurs de syntaxe ou de
compilation peuvent apparaître. Le programme ne se déroule pas
correctement. Il faut alors le déboguer.
Pour cela il existe différentes techniques.
L’une d’elles consiste à placer une instruction DEBUG dans le
programme pour provoquer l’affichage de valeurs permettant de délimiter
des étapes dans le déroulement du programme et localiser l’erreur.
L’instruction DEBUG se comporte comme une sorte de point
d’arrêt dynamique. Elle ne peut être utilisée que pendant la phase du
développement, et ne peut pas figurer dans un programme mis au point.
Dans tous les cas, il faut retirer cette instruction d’aide à la mise au
point, lors de la fabrication de la version finale du programme.
De toutes façons, si l’instruction DEBUG restait dans le
programme, elle serait ignorée une fois que celui-ci ait été correctement
compilé.
Au fur et à mesure que vous réalisez votre programme, ayez
toujours la mise au point en tête.
Si vous modifiez temporairement des instructions, ayez une feuille
volante avec leur liste. C’est la meilleure façon pour ne pas oublier de
toutes les restaurer ensuite.
207

DIRS

Définit la direction des lignes du Port B.

SYNTAXE :
DIRS = X X X X X X X X

(octet de configuration)
(0.......255)

0 = entrée
1 = sortie

EXEMPLES :
1)
DIRS = 255 (255 décimal, donc 11111111 en binaire)
Cela peut s’écrire aussi :
DIRS = %11111111
Tous bits du Port B configurés en sortie

2)
DIRS = 0
Tous bits du Ports B configurés en entrée.
208

EEPROM

C’est l’instruction avec laquelle on écrit dans l’EEPROM du PIC,


dans des adresses consécutives, à partir de celle qu’on lui indique comme
étant l’adresse de départ.

SYNTAXE :
EEPROM Adresse, (Donnée, Donnée, Donnée,......)

Dans les parenthèses - espacées par des virgules -


les données à écrire dans l’EEPROM
(constantes numériques ou caractères ASCII).

Adresse de départ, à partir de laquelle on veut écrire dans


l’EEPROM.
Si on ne met rien dans ce paramètre, l’écriture démarre
automatiquement à l’adresse 0.
(NB : Dans le µC 16F84 l’étendue de l’EEPROM va de 00 à 3F).

EXEMPLE :
EEPROM 8, (2, 4, 8, 16, 32, 64, 128)

On stocke 2 à l’adresse EEPROM 08


On stocke 4 à l’adresse EEPROM 09
On stocke 8 à l’adresse EEPROM 0A
On stocke 16 à l’adresse EEPROM 0B
On stocke 32 à l’adresse EEPROM 0C
On stocke 64 à l’adresse EEPROM 0D
On stocke 128 à l’adresse EEPROM 0E

NB : Les données entrent dans la mémoire EEPROM une seule


fois : lors de la programmation du circuit, et non pas
chaque fois qu’on exécute le programme.
209

END

C’est l’instruction que l’on doit obligatoirement placer à la fin de


tout programme.
Elle termine l’exécution du programme et place le microcontrôleur
en mode veille.
Pour réveiller le microcontrôleur on est obligé de faire un Reset
matériel.
210

FOR... NEXT

Cette instruction introduit une boucle en faisant exécuter un certain


nombre de fois les actions détaillées dans ce que l’on appelle : le
corps de l’instruction.

SYNTAXE :
FOR Variable = Début TO Fin (Pas)
.
.
. .
.
NEXT Variable

Variable prend d’abord la valeur définie par


Début ; puis – successivement – toutes les valeurs suivantes, par
incrémentation automatique, jusqu’à atteindre la valeur définie par Fin, et
chaque fois, pour chaque valeur de Variable, exécute les instructions
détaillées dans le corps de l’instruction.
A chaque passage, Variable s’incrémente (de 1).
Mais on peut aussi incrémenter la Variable au pas qu’on veut.
Dans ce cas il faut le préciser en donnant une valeur à Pas, placée entre
deux parenthèses.

Par exemple, si l’on écrit :


FOR B1 = 0 TO 10 (2)
B1 prendra successivement
non pas les valeurs 0, 1, 2, 3, 4, 5, 6, 7, 8 et 9
mais 0, 2, 4, 6, 8 et 10.

EXEMPLE :
FOR B1 = 1 TO 10
HIGH 0
PAUSE 200
LOW 0
PAUSE 200
NEXT B1
211

Fait clignoter 10 fois de suite (allume pendant 200 millisecondes,


puis éteint pendant 200 millisecondes) la LED connectée sur RB0 (Pin 0 du
Port B).

NB : Des boucles FOR... NEXT peuvent être imbriquées dans


d’autres boucles FOR... NEXT jusqu’à un maximum de 16 imbriquements.

EXEMPLE :

LOOP
FOR B0 = 1 TO 5
FOR B1 = 1 TO 7
HIGH B1
PAUSE 10
LOW B1
PAUSE 500
NEXT B1
NEXT B0

GOTO LOOP

Pour chacune des valeurs pouvant être prises par B1 (c’est


à dire 1 à 7. C’est la boucle interne) faire le travail défini par la boucle
interne autant de fois que les valeurs pouvant être prises par B0 (boucle
externe).

Dans le cas de cet exemple : la boucle externe tourne 5


fois, avant que B1 passe d’une valeur à la suivante.

Ici, donc, la LED reliée à RB0 clignote 5 fois, puis la


LED reliée à RB1 clignote 5 fois, puis la LED reliée à RB2 clignote 5
fois.... jusqu’à celle reliée à RB7.

Puis, ça recommence.

Restons sur cet exemple, et étudions-le de plus près.


Cela en vaut la peine, car les boucles FOR.... NEXT sont très utilisées
quand on programme en PicBASIC.
212

LOOP
FOR B0 = 1 TO 5
FOR B1 = 0 TO 7
HIGH B1
PAUSE 10 Le travail...
LOW B1 que doivent faire
PAUSE 500 chacune des valeurs
NEXT B1 de B1, autant de fois...
NEXT B0 .... que chacune des valeurs de B0

GOTO LOOP

Autrement dit :

HIGH 0: PAUSE 10: LOW 0 : PAUSE 500


HIGH 0: PAUSE 10: LOW 0 : PAUSE 500
HIGH 0: PAUSE 10: LOW 0 : PAUSE 500
HIGH 0: PAUSE 10: LOW 0 : PAUSE 500
HIGH 0: PAUSE 10: LOW 0 : PAUSE 500

HIGH 1: PAUSE 10: LOW 1 : PAUSE 500


HIGH 1: PAUSE 10: LOW 1 : PAUSE 500
HIGH 1: PAUSE 10: LOW 1 : PAUSE 500
HIGH 1: PAUSE 10: LOW 1 : PAUSE 500
HIGH 1: PAUSE 10: LOW 1 : PAUSE 500

HIGH 2: PAUSE 10: LOW 2 : PAUSE 500

etc....
jusqu’à 7.

L’importance de NEXT est très grande. Voyons-la au moyen d’un autre


exemple :
On veut allumer toutes les LED du Port B.
Ecrivons le programme suivant :

LOOP FOR B0 = 0 TO 7
HIGH B0
NEXT B0
END
213

Si on exécute ce même programme sans l’instruction NEXT B0,


on constate que seule la LED reliée à RB0 s’allume, et pas les autres.
Ceci parce que l’instruction NEXT B0 incrémente la variable B0
et referme la boucle en fournissant – à chaque tour – une nouvelle valeur (0,
1, 2,.....7) correspondant à différents RB et – par là – à des LED différentes.
214

GOSUB

C’est l’instruction par laquelle on appelle un sous-programme.

Le sous-programme appelé doit impérativement se terminer par


l’instruction RETURN.

L’instruction RETURN, placée à la fin du sous-programme, fait


revenir le programme principal à l’instruction se trouvant juste après
GOSUB.

Ne pas confondre GOSUB avec GOTO qui renvoie – elle aussi –


l’exécution du programme ailleurs, mais – cette fois – sans retour.

SYNTAXE :
GOSUB Label
.
.
.

RETURN

NB : Des paires d’instructions GOSUB..... RETURN peuvent être


imbriquées. Mais sans aller au-delà de 4 niveaux (on ne peut pas imbriquer
plus de 4 paires l’une dans l’autre).

L’exemple qui suit, illustre le fonctionnement de GOSUB et de RETURN.


215

Programme principal

DEBUT
INSTRUCTION 1
INSTRUCTION 2
INSTRUCTION 3
Sous-programme

TEMPO
INSTRUCTION a
INSTRUCTION b
INSTRUCTION c
INSTRUCTION 37 INSTRUCTION d
INSTRUCTION 38 INSTRUCTION e
GOSUB TEMPO RETURN
INSTRUCTION 40
INSTRUCTION 41
FIN
216

GOTO

Renvoie à un autre endroit du programme.

SYNTAXE :
GOTO Label

Repère (adresse) de l’endroit de la mémoire auquel le programme doit se


rendre pour poursuivre son exécution.

EXEMPLE :
GOTO END

(Arrête le programme)
217

HIGH

Cette instruction fait deux choses en même temps :


- après avoir mis en sortie une ligne du Port B (RB), la place aussitôt à
l’état logique haut (1).

SYNTAXE :
HIGH Pin

Numéro de la pin (0..... 7) du Port B


(RB) qu’on veut mettre à l’état haut

EXEMPLE :
HIGH 0
Sort un 1 sur RB0

NB : Seul le numéro de la pin du RB doit être spécifié (exemple : HIGH 7


et non pas HIGH Pin 7), car une instruction ainsi rédigée n’est pas admise,
et conduirait à une exécution erronée du programme.
218

I2Cin

Reçoit des données à partir d’un bus I2C.

SYNTAXE :
I2Cin Contrôle, Adresse, Variable

Nom de la variable (B0... B51) dans laquelle


on veut stocker le résultat de la lecture.

Adresse mémoire dont on veut lire le contenu.

Octet composé de :
- la clé d’accès spécifique au circuit I2C utilisé,
telle qu’elle a été définie par son fabricant (sur 4 bits)
- 1 bit (celui de plus fort poids) désignant la largeur du
bus d’adresses (0 = 8 bits ; 1 = 16 bits)
- 3 bits (ceux de plus faible poids) servant à la sélection
des blocs internes (pages de 256 octets).

Cette instruction fait plusieurs choses de suite :


- sort la clé permettant l’accès au circuit I2C
- va à l’adresse voulue
- lit son contenu
- le stocke dans la variable figurant en argument.

EXEMPLE :
I2Cin %01010000, 12, B0
Lit le contenu de l’adresse 12 et le stocke dans la variable B0.

L’octet Contrôle (%01010000 ou $50) se lit comme ceci :


- le bit de plus fort poids (0) spécifie un bus d’adresse
de 8 bits
- les quatre bits suivants (1010) correspondent à la clé
d’accès définie par le fabricant
- les trois bits de plus faible poids, non utilisés dans ce
type de mémoire, sont mis à zéro (000).
219

Cette instruction permet notamment d’ajouter au PIC une mémoire


EEPROM série au standard I2C (24LC01B, 24LC02B, 24LC04B,
24LC08B, 24LC16B, 24LC32B, 24LC65... toutes les 24 C0x en général)
et de disposer ainsi d’une plus grande taille mémoire.
Bien entendu, ce n’est pas seulement à des EEPROM que le PIC
peut être associé, mais à n’importe quel circuit du standard I2C (capteur de
température, convertisseur A/D, etc...).

Ce tableau donne les clés d’accès des EEPROM les plus courantes :

Modèle Taille mémoire Contrôle Largeur de bus


24LC01B 128 octets %01010xxx 8 bits
24LC02B 256 octets %01010xxx 8 bits
24LC04B 512 octets %01010xxb 8bits
24LC08B 1k octets %01010xbb 8bits
24LC16B 2K octets %01010bbb 8bits
24LC32B 4K octets %11010ddd 16 bits
24LC65 8K octets %11010ddd 16 bits

bbb = bits de sélection du ou des blocs internes (pages)


ddd = bits servant à sélectionner le boîtier
xxx = sans importance
220

Schéma-type de connexion d’un PIC 16F84


avec une EEPROM 24LC01B

Les lignes Data et Clock sont affectées respectivement au Port A0


et au Port A1. Ceci dans le but évident de laisser entièrement disponibles
les 8 bits du Port B.

La ligne Data est bidirectionnelle.


Elle doit comporter une résistance de Pull-up de 4,7 KΩ.
221

I2Cout

Envoie des données sur un bus I2C.

SYNTAXE :
I2Cout Contrôle, Adresse, (Valeur)

Valeur à écrire (00... FF)

Adresse à laquelle on veut écrire.

Octet de contrôle composé de :


- la clé d’accès spécifique au circuit I2C, telle q’elle
a été définie par le fabricant (sur 4 bits) ;
- 1 bit (celui de plus fort poids) désignant la valeur
du bus des adresses (0=8 bits ; 1=16 bits) ;
- 3 bits (ceux de plus faible poids) servant à la sélection
des blocs.
L’écriture d’un octet dans une EEPROM série prend environ 10 ms.
Par conséquent, si on veut écrire plusieurs octets en suivant, il faut
impérativement respecter ce délai sinon, si une opération d’écriture est
encore en route, l’accès à la mémoire est ignoré.
Différent est le cas si, au lieu d’avoir affaire à des mémoires EEPROM, on
a affaire à des composants de la famille I2C ne demandant pas un aussi
long délai entre deux écritures.

EXEMPLE :
I2Cout %01010000, 17, (42)
PAUSE 10
I2Cout %0101000, 125 (B3)
PAUSE 10

On écrit 42 à l’adresse 17. On laisse passer 10 ms pour que


l’opération d’écriture s’achève. Puis on écrit le contenu de la variable B3
à l’adresse 125 et on laisse encore passer 10 ms.
Les lignes DATA et CLOCK sont affectées respectivement à PORTA0 et
à PORTA1. Ceci dans le soucis de laisser entièrement disponibles les 8 bits
Port B. La ligne DATA est bidirectionnelle. Elle doit comporter une
résistance de Pull-up de 4,7 KΩ.
222

If... Then

Cette instruction teste une condition.


Si la condition est vraie, le programme saute au sous-programme
indiqué après Then.

Then est ici une sorte de Goto. C’est pourquoi après Then on doit
impérativement indiquer le nom du sous-programme auquel le programme
doit se rendre.
Si la condition est fausse, le programme continue en séquence et analyse
l’instruction suivante.

SYNTAXE :
IF Comparaison THEN Label

Nom du sous-programme à exécuter si la


condition est vraie.

Ce que l’on veut comparer :


- ceci égal à cela (=)
- ceci inférieur à cela (<)
- ceci supérieur à cela (>)
- ceci supérieur ou égal à cela (>=)
- ceci différent de cela ( <>)

EXEMPLE :
IF Pin0 = 0 THEN OUVERT
IF B0 >=9 THEN PORTE

Si l’interrupteur connecté à la pin 0 du Port A est ouvert (0),


exécute le sous-programme appelé OUVERT.
Si la variable B a une valeur supérieure ou égale à 9, exécute le
sous-programme appelé PORTE.
223

INPUT

Place en entrée l’une des 8 lignes du Port B (RB).

SYNTAXE :
INPUT Pin

Numéro de la pin du Port B (RB) qu’on veut placer en entrée.

EXEMPLE :
INPUT 3

Met RB3 en entrée.

NB : Seul le numéro de la pin doit être noté. C’est à dire : 0.... 7


et non Pin0.... Pin7
224

LET

Avec cette instruction on affecte une valeur à une variable.

EXEMPLE :
LET B0 = 37

Affecte à la variable B0 la valeur 37.


225

LOOKdown

Cherche une valeur (Recherche) dans une liste (Constante, Constante,


Constante...), et fournit en Index sa position dans la liste.

SYNTAXE :
LOOKDOWN Recherche, (Constante, Constante, Constante...), Index

L’instruction compare une variable à une liste de constantes


jusqu’à ce qu’elle trouve une égalité et – dans ce cas – place dans
une variable le numéro du rang de cette valeur.
Si la valeur recherchée est la première de la liste, Index prend la
valeur 0 ; si c’est la deuxième, Index prend la valeur 1, etc..
Si par contre la recherche est infructueuse, aucune action n’a lieu et Index
reste inchangé.

Par exemple : si la liste des Constantes est (3, 12, 14, 27, 9) et la valeur de
Recherche est 14, Index prendra la valeur 2 puisque 14 est la troisième
constante de la liste (le décompte commence à 0).

EXEMPLE :
SERin 1, N2400, B0
LOOKDOWN B0, (″ 0123456789ABCDEF″ ), B1
SERout 0, N2400, (#B1)

Lit les caractères arrivant dans une réception série sur RB1 (pin 1
du Port B), les stocke un à la fois dans la variable B0, et fournit la
position de chacun d’eux dans la variable B1, mise ensuite en
sortie sur RB0 (pin 0 du Port B).
226

LOOKup

Cette instruction permet de récupérer une valeur à partir d’une


table de constantes.
On donne une valeur à Index et on demande à l’instruction de
sauvegarder dans une Variable la valeur correspondant à son rang
dans la liste des variables.
Si Index vaut 0, Variable assume la valeur de la première
constante. Si Index vaut 1, Variable assume la valeur de la
deuxième constante, et ainsi de suite.
Si Index est un nombre supérieur au nombre des constantes, il ne
se passe rien et Variable reste inchangée.

SYNTAXE :
LOOKUP Index, (Constante, Constante, Constante....), Variable

Nom de la variable
dans laquelle on veut
mémoriser la variable
recherchée.

Constantes rangées par rang.

Rang correspondant à la valeur qu’on veut récupérer.

EXEMPLE :
FOR B0 = 0 to 6
LOOKUP B0, (″BONJOUR″), B1
SERout 0, N2400, (B1)
NEXT B0

On donne successivement à B0 les valeurs de 0 à


7 pour récupérer dans la variable B1, l’une après
l’autre, toutes les lettres de BONJOUR,
lesquelles sortent ensuite en série sur RB1.
227

LOW
Cette instruction met à l’état logique bas (0) une ligne (0... 7) du
Port B (RB).

SYNTAXE :
LOW Pin

Numéro de la pin (0... 7) du Port B qu’on veut mettre à l’état bas.

EXEMPLE :
LOW 3

Met à l’état logique bas RB3.

NB : Seul le numéro de la pin de RB doit être spécifié. Exemple : 4,


et non pas Pin 4.
Une instruction mal rédigée conduirait à une exécution erronée du
programme.
228

NAP

Cette instruction met le microcontrôleur en veille pendant le temps


défini par Période.

SYNTAXE :
NAP Période

(0... 7)

0 18 ms
1 36 ms
2 72 ms
30 144 ms
4 288 ms
5 576 ms
6 1.152 ms
7 2.304 ms

Ces durées sont approximatives car dérivées du Watchdog Timer,


piloté par son horloge R/C interne, et donc pouvant différer d’un
microcontrôleur à l’autre...
229

OUTPUT

Cette instruction place en sortie l’une des 8 pins du Port B (RB).

SYNTAXE :
OUTPUT Pin

Numéro de la pin du Port B (RB) qu’on veut placer en sortie.

EXEMPLE :
OUTPUT 3

Met RB3 en sortie.

NB : Seul le numéro de la pin de RB doit être spécifié. Exemple : 3,


et non pas Pin 3.
Une instruction mal rédigée conduirait à une exécution erronée du
programme.
230

PAUSE
Instruction introduisant une temporisation.

SYNTAXE :
PAUSE Période

Durée, exprimée en millisecondes.

Pour un 16F84 cadencé à 4 MHz, l’unité de temps est approximativement


1 milliseconde.

EXEMPLE :
PAUSE 500

Engendre un temporisation de 500 ms (½ seconde).

Contrairement à l’instruction NAP qui fournit des délais


prédéfinis et approximatifs (car issus du Watchdog Timer),
l’instruction PAUSE fournit des délais à la demande et plus
précis (bien qu’encore pas tout à fait exacts, sa précision
dépendant entre autre de celle du quartz et de l’état de
l’alimentation).
231

PEEK

Cette instruction lit le contenu d’une adresse et le stocke


dans une variable.

SYNTAXE :
PEEK Adresse, Variable

Nom de la variable dans laquelle on veut


stocker le résultat de la lecture.

Adresse dont on veut lire le contenu.

EXEMPLE :
PEEK PORTA, B0

On lit le contenu du Port A et on le mémorise dans la


variable B0.

Autre EXEMPLE :
Symbol PORTA = 5
Symbol TRISA = $85
POKE TRISA, 255
PEEK PORTA, B0

Ensuite, on peut continuer comme ceci :

IF BIT0 = 0 THEN......
IF BIT0 = 1 THEN......

On lit le Port A par l’intermédiaire de la variable B0.


Ensuite on peut tester et agir en fonction de l’état de
chaque bit.
232

PINS
Cette instruction met en sortie, sur le Port B, l’octet spécifié après
le signe =

SYNTAXE :
PINS = X X X X X X X X

Octet à spécifier.

EXEMPLES :

1) PINS = $2B
Met la valeur hexadécimale 2B (00101100) sur le Port B.
Ce qui a pour effet de mettre :
le bit 0 à 0
le bit 1 à 0
le bit 2 à 1
le bit 3 à 1
le bit 4 à 0
le bit 5 à 1
le bit 6 à 0
le bit 7 à 0.

2) PINS = B1
Met chacun des bits du Port B à l’état haut ou à l’état bas,
conformément à l’octet se trouvant dans la variable B1.

3) PINS = 255
Met à l’état haut tous les bits du Port B.

4) DIRS = 255 (Port B en sortie)


233

LOOP FOR B1 = 0 TO 255


PINS = B1
PAUSE 500
NEXT B1
GOTO LOOP

END

On affiche sur le Port B toutes les valeurs de 0 à 255


(FOR B1 = 0 TO 255... NEXT B1) à un intervalle de 500 ms.
Puis on recommence indéfiniment.
234

POKE

C’est l’instruction par laquelle on écrit une donnée à l’adresse que l’on
désigne.

SYNTAXE :
POKE Adresse, Donnée

Donnée à écrire.

Adresse à laquelle on veut écrire la donnée.

EXEMPLES :

1) POKE TRISA, 0
Met 0 dans TRISA.

2) SYMBOL PORTA = 5 (Adresse de PORTA)


SYMBOL TRISA = $85 (Adresse de TRISA)

POKE TRISA, 0 (Port A en sortie)


PEEK PORTA, B0 (Copie Port A
dans B0)
BIT1 = 1
BIT2 = 0
etc...
POKE PORTA, B0

END

Ainsi faisant, on copie sur le Port A ce qui


se trouve dans la variable B0.
235

POT

Lit la valeur d’une résistance (potentiomètre, thermistance, jauge de


contrainte, capteur de position ou autre composant résistif) sur l’une
des pins (0..... 7) du Port B.
La valeur de la résistance (pouvant aller de 5 KΩ à 50 KΩ) est
déterminée, en fait, en mesurant le temps de décharge du condensateur
associé à la résistance avec laquelle il forme une cellule R/C.

SYNTAXE :
POT Pin, Echelle, Variable

Nom de la variable dans laquelle on veut


mémoriser le résultat de la mesure. Si Echelle est
positionné à sa valeur optimale, Variable prend une
valeur proche de 0 lorsque le potentiomètre est tourné
sur le minimum, et une valeur proche de 255 lorsque
le potentiomètre est tourné sur le maximum.

(1..... 255) est un facteur de conversion qui dépend des


caractéristiques de la cellule R/C. Sa valeur doit être
déterminée expérimentalement. Pour de grandes constantes
de temps R/C, la valeur d’Echelle doit être petite (le minimum
est 1). Au contraire, pour de petites constantes de temps, la
valeur à donner à Echelle doit être grande (255).

(0....7) Désigne la pin du Port B (RB) sur laquelle on veut lire


la valeur de la résistance.

Pour déterminer au plus juste la valeur qu’il convient de donner à Echelle,


la méthode consiste à la faire évaluer par le PIC lui-même. Pour cela,
réglez d’abord la valeur de la résistance à son maximum, et lisez-la avec
Echelle provisoirement positionnée à 255. Cette valeur (stockée dans
Variable) évaluée par le PIC, est celle que vous pourriez alors donner à
Echelle (valeur optimale).
Evidemment, pas question de s’attendre à lire une valeur précise de
Résistance, exprimée en Ohms !
236

Ici, en définitive, on lit des paliers. Mais la valeur qu’assume tour à tour
Variable chaque fois qu’on tourne l’axe du potentiomètre, renseigne
suffisamment sur la position de l’axe et – par là même – sur la valeur
prise par la résistance, si on connaît sa valeur de butée.

EXEMPLE :
POT 7, 255, B0
SERout 0, N2400, (#B0)

Lit un potentiomètre relié à RB7, mémorise le résultat dans la


variable B0, puis met cette valeur en sortie sur RB0, en mode
série.
Le schéma de branchement est le suivant :
237

PULSin

Mesure la durée d’une impulsion arrivant sur une pin du Port B (RB).
La pin désignée est automatiquement mise en entrée.
NB : La durée est exprimée par unités de 10 µs. Autrement dit : le résultat
de la mesure est à multiplier par 10 pour avoir le nombre de microsecondes
recherché.

SYNTAXE :
PULSin Pin, Etat, Variable

Nom de la variable à 16 bits (donc : de type W) dans


laquelle on veut mémoriser le résultat de la mesure.
Cette variable peut aller de 1 à 65.535 (correspondant
respectivement à :
- 1 x 10 µs = 10 µs
.
.
- 65.535 x 10 µs = 655.350 µs (soit 655,35 ms
ou encore 0,65535 secondes).

( 0 ou 1 )
Définit la partie du signal dont on veut lire la durée :

1 = la partie haute
0 = la partie basse.

( 0... 7 )
Numéro de la pin du Port B (RB) qui reçoit le signal dont on veut
mesurer la durée.
Attention : seul le numéro de la pin doit être noté ( 0..... 7).
238

EXEMPLE :
PULSin 5, 1, W0
Mesure la durée de la partie haute d’une impulsion arrivant sur
RB5 et stocke le résultat dans la variable (à16 bits) W0.

NB : Si aucun front n’est détecté, ou si l’impulsion dure plus


longtemps que 0.65535 seconde, Variable est mise à 0.

Si on définit une variable de type B (variable à 8 bits) au lieu


d’une variable de type W (variable à 16 bits), seuls les 8 bits de
poids faible sont mémorisés.
239

PULSout

Génère - sur une pin du Port B - une impulsion de durée calibrée,


exprimée par unités de 10 µs.
La pin désignée est automatiquement mise en sortie.
Le niveau (haut ou bas) de l’impulsion calibrée mise en sortie,
dépend de l’état de la pin avant l’exécution de cette instruction, car
- lorsque cette instruction survient - elle inverse l’état actuel, pour
marquer un début à partir duquel elle peut calculer la durée.

SYNTAXE :
PULSout Pin, Période

Durée de l’impulsion (de 1 à 65.535) par


pas de 10 µs.
1 correspond à (1x10 µs) soit 10 µs
2 correspond à (2x10 µs) soit 20 µs
.
65.535 correspond à (65.535x10 µs) soit 0.65535 secondes.

(0... 7) Désigne le numéro de la pin du Port B (RB) sur laquelle on


veut sortir l’impulsion calibrée.
Attention : seul le numéro (1, 2, 3..... 7) de la pin doit être noté,
et non pas Pin 1, Pin 2...... Pin 7

EXEMPLE :
PULSout 4, 100
Envoie sur RB4 une impulsion de 1 ms (100x10 µs).
240

PWM
Pulse With Modulation
Modulation par largeur d’impulsions

Exemple de largeurs d’impulsions allant en augmentant


(ici l’état haut MARK devient de plus en plus large) :

Exemple de largeurs d’impulsions allant en diminuant


(ici l’état haut MARK devient de plus en plus court) :

Cette instruction génère sur une pin du Port B (RB) un train d’impulsions
modulées en largeur.
241

La pin désignée est automatiquement mise en sortie mais, sitôt le


cycle terminé, elle est automatiquement remise en entrée.

SYNTAXE :
PWM Pin, Duty, Cycle

Nombre d’impulsions qu’on veut élargir ou retrécir.

Désigne (en pourcentage) le cycle de travail de chaque train


d’impulsions (peut varier de 0% à 255%). C’est le coefficient
d’élargissement ou de retrécissement qu’on veut appliquer aux
impulsions.

Numéro de la pin du Port B (RB) sur laquelle on veut générer le train


d’impulsions PWM.

Une LED commandée par un signal PWM voit sa luminosité s’accroître


progressivement ou diminuer progressivement (selon le mode de
programmation), comme si elle était associée à un variateur, produisant
ainsi une sorte d’effet crépucsulaire.

Moyennant un réseau R/C, cette instruction permet de mettre en place


un convertisseur D/A tout simple :
242

La modulation par largeur d’impulsions (modulation d’impulsions


en durée, ou modulation par nombre d’impulsions dans le temps) est une
technique qui consiste à faire varier la puissance moyenne de sortie, dans le
temps, en agissant sur le rapport cyclique (temps ON / temps de cycle).
Le temps de cycle est un état ON plus un état OFF.

La puissance moyenne du signal diminue (ou augmente) en fonction du


temps.
Le temps de cycle est constant, mais le temps « ON » varie (sa durée
diminue, ou augmente).

Ce type de modulation présente au moins trois avantages : un seul bit de


Port suffit à commander les transitions ON/OFF ; le signal ainsi modulé
réduit la dissipation de puissance (perte de chaleur, par exemple), et peut
commander une charge à puissance variable.

Temps de cycle = un temps « ON » + un temps « OFF ».

Temps « ON »
Rapport cyclique = ---------------------
Temps de cycle

Un exercice pour vous entraîner à utiliser cette instruction consiste à


brancher un voltmètre pour visualiser et mesurer un signal PWM, en y
associant une LED servant (dans une certaine mesure) de confirmation.
Le voltmètre sera un modèle analogique (à aiguille) de préférence à un
modèle digital.
La tension de sortie moyenne est proportionnelle au rapport cyclique et
indépendante du temps de cycle.
Avec un temps de cycle maximum, vous risquez de voir l’aiguille du
voltmètre se déplacer très légèrement.
243

Un autre exercice pourrait consister à faire varier le temps « ON »


et le temps « OFF » en fonction des données d’un tableau.
Avec ces prescriptions, par exemple :

Rapport Temps Temps Temps


cyclique « ON » « OFF » de cycle

0,10 20 180 200


0,20 20 80 100
0,30 30 70 100
0,40 40 60 100
0,50 60 60 120
0,60 90 60 150
0,70 140 60 200
0,80 160 40 200
0,90 180 20 200
1,00 200 0 200
244

RANDOM

Génère un nombre aléatoire sur 16 bits et le stocke dans une


variable de type W (variable de 16 bits, composée de la
juxtapposition de deux variables de 8 bits. Exemple : la variable
W0 est composée de la juxtapposition des variables B0 et B1).

SYNTAXE :
RANDOM Variable

Nom d’un variable de 16 bits (W0.... W25) dans


laquelle le programme va stocker le nombre aléatoire.

EXEMPLE :
RANDOM W0
Génère un nombre aléatoire de 16 bits et le
stocke dans la wariable W0.

NB : Le nombre aléatoire pouvant être généré par cette instruction


peut aller de 1 à 65.535.
Le nombre 0 n’est pas généré.
245

READ

Avec cette instruction on lit une donnée dans la mémoire


EEPROM.
Le résutlat de la lecture est mémorisé dans la variable spécifiée.

SYNTAXE :
READ Adresse, Variable

Nom de la variable (B0... B51) dans laquelle


on veut stocker le résultat de la lecture.

Adresse EEPROM dont on veut lire le contenu.

Rappel : Pour écrire dans cette mémoire on utilise


l’instruction EEPROM.
246

RETURN

C’est l’instruction qui termine tout sous programme.


Un sous programme commence par GOSUB, et doit
obligatoirement se terminer par RETURN.
Une fois le sous programme terminé, cette instruction provoque
le retour au programme principal, à l’instruction se trouvant
just’après le GOSUB ayant appelé le sous programme.
247

REVERSE

Inverse le sens de fonctionnement de la patte spécifiée (0.... 7)


du Port B (RB).
Si elle était une entrée, après cette instruction elle devient une sortie,
et inversement (si elle était une sortie, elle devient une entrée).

SYNTAXE :
REVERSE Pin

Numéro (0.... 7) de la pin du Port B (RB) dont on veut


inverser le sens.

EXEMPLE :
OUTPUT 7
REVERSE 7
Met d’abord RB7 en sortie, puis inverse le sens
et met RB7 en entrée.

NB : Seul le numéro (0.... 7) de la pin du Port B (RB) doit être noté


(REVERSE 0, REVERSE 1,....... REVERSE 7
et non REVERSE Pin0, REVERSE Pin1.....).
248

SERin
Serial Input

Cette instruction permet de recevoir des données sous forme série


asynchrone , par mots de 8 bits, sans parité, avec un seul bit de STOP.
La réception doit avoir lieu en utilisant l’une des pins (0.... 7) du
Port B (RB).

SYNTAXE :
SERIN Pin, Mode, (Qualificateur), Variable

Nom de la variable (B0... B51)


dans laquelle on veut stocker
les données reçues.

A noter entre parenthèses. Ca peut être un seul,


ou plusieurs. Si plusieurs, une virgule doit les
séparer. Il s’agit des informations optionnelles
(formant une sorte de « clé ») qui doivent être
reçues exactement dans l’ordre spécifié, avant
que la ou les données ne soient prises en compte.
Si, lors de la réception de plusieurs
Qualificateurs, un seul ne correspond pas à la clé
à laquelle ils sont comparés un à un, le
processus revient au début, et le programme
reprend à les examiner depuis le premier.
Un Qualificateur peut être une constante, une
variable ou une chaîne de caractères (dans ce
dernier cas, chaque caractère de la chaîne est
traité individuellement, pris en sa valeur
ASCII). Cela sert à sécuriser une transmission.
Très utile notamment dans le cas des
télécommandes, d’alarmes ou d’anti-vol à
distance).
Définit à la fois la vitesse de transmission (Baud Rate) et la
forme des données (TTL vrai ou TTL inversé).
On peut choisir parmi 8 modes possibles, selon les
spécifications du tableau suivant :
249

Symbole Valeur Baud Rate Mode


T2400 0 2400
T1200 1 1200 TTL vrai
T9600 2 9600
T300 3 300
N2400 4 2400
N1200 5 1200 TTL inversé
N9600 6 9600
N300 7 300

Etant donné que les circuits d’interface RS232 (même les plus
économiques) présentent d’excellentes caractéristiques d’entrée/sortie,
les signaux peuvent être gérés par les PIC sans besoin d’un convertisseur
de niveux.
Les signaux présentés en format TTL inversé doivent être utilisés
moyennant une résistance de limitation de courant :

EXEMPLE :
LOOP SERin 7, n1200, B0
IF B0>0 THEN SORTIE
SORTIE POKE Pin3, B0
PAUSE 300
GOTO LOOP
Reçoit un signal série sur RB7, en TTL inversé, à la vitesse de
1200 Bauds, et le stocke dans la variable B0.
Si B0 contient une donnée, elle est envoyée sur la pin 3 du Port A
(RA3). On temporise 300 ms. Puis on recommence avec
l’octet suivant.
250

SERout
Serial Output

Cette instruction permet d’envoyer des données, sous forme série


asynchrone, par mots de 8 bits, sans parité, avec un seul bit de
STOP.
L’émission doit avoir lieu en utilisant l’une des pins (0... 7) du
Port B (RB).

SYNTAXE :
SERout Pin, Mode, (Donnée, Donnée....)

A noter entre parenthèses.


Ca peut être une ou plusieurs.
Si plusieurs, une virgule doit les séparer.
Il s’agit des informations à transmettre.
Ces informations peuvent être des constantes,
des variables ou une chaîne de caractères.
- Une chaîne de caractères est traitée
comme une suite de caractères. Chacun
d’eux est émis individuellement.
- Une valeur numérique (variable ou
constante) est émise sous la forme de
son équivalent ASCII. Ainsi, par
exemple, 13 est un retour chariot et 10
est un saut de ligne.
- Une valeur numérique précédée du
signe # (dièse) est émise sous la forme
de la représentation en ASCII de la
valeur décimale correspondante. Ainsi
par exemple, #123 fera émettre « 1 »,
puis « 2 », puis « 3 ».

Définit à la fois la vitesse de la transmission (Baud


Rate), la forme des données (TTL vrai ou TTL
TTL inversé) et la configuration de l’étage de sortie
(Drain ouvert ou Collecteur ouvert).
On peut choisir parmi 16 modes possibles,
selon les spécifications du tableau suivant :
251

Symbole Valeur Baud Rate Mode


T2400 0 2400
T1200 1 1200 TTL vrai
T9600 2 9600
T300 3 300
N2400 4 2400
N1200 5 1200 TTL inversé
N9600 6 9600
N300 7 300
OT2400 8 2400
OT1200 9 1200 Drain
OT9600 10 9600 ouvert
OT300 11 300
ON2400 1 2400
ON1200 2 1200 Source
ON9600 13 9600 ouvert
ON300 14 300

Pin désigne le numéro (0... 7) de la pin du Port B (RB) que l’on veut
utiliser pour sortir le signal série.

Etant donné que les circuits d’interface RS232 (même les plus
économiques) présentent d’excellentes caractéristiques d’entrée/sortie,
les signaux peuvent être gérés par les PIC sans besoin d’un convertisseur
de niveux.
Les signaux présentés en format TTL inversé doivent être utilisés
moyennant une résistance de limitation de courant :
252

Sur fiche DB9 Sur fiche BD25


RS232 Rx Pin 2 Pin 3
RS233 Masse Pin 5 Pin 7

EXEMPLES :

1) Un seul octet à transmettre :


SERout 6, N2400, (B1)

2) Plusieurs octets à transmettre :


SERout 6, N2400, (B1, B0.....0F....C3)

3) Envoyer sur RB0 la valeur ASCII contenue dans la variable


B0, suivie d’un saut de ligne :
SERout 0, N2400, (#B0, 10)

4) Envoi d’un octet (stocké dans la variable B1) précédé d’une


clé servant de code secret :
SERout 6, N2400, (″S″, ″E″ , ″S″, ″A″, ″M″, ″E″, B1)

Octet
proprement
dit.

Caractères servant de clé


(caractères « secrets »).
Cette façon de coder est particulièrement utile dans le cas
de systèmes d’antivol.
Le récepteur, sans avoir au préalable reçu le mot SESAME,
ne peut mémoriser le mot fourni par B1.
253

SLEEP

Met le PIC en mode veille pendant un certain temps (défini


par Période) exprimé en secondes.
Période est une variable de 16 bits, pouvant aller de 1 à
65.535 (plus de 18 heures) avec une précision qui dépend du
timer interne (celui associé au chien de garde) qui est du type
R/C. Cette précision n’est qu’approximative, et ne doit pas être
utilisée comme référence temporelle absolue.
En plus, il faut savoir que la plus courte Période ne peut être
inférieure à celle du time-out maximum du chien de garde, qui
est de 2,3 secondes.
En mode SLEEP, le microcontrôleur passe en mode basse
consommation (low power).
Lorsque le délai spécifié est écoulé, l’exécution du programme
reprend avec l’instruction suivante.

SYNTAXE :
SLEEP Période

Durée de veille, éxprimée en secondes.

EXEMPLE :
SLEEP 60
Met le µC en veille pendant 1 minute (60 secondes).
254

SOUND

Génère un son sur la pin désignée du Port B (RB).

SYNTAXE :
SOUND Pin, (Note, Durée, Note, Durée,...)

Durée de la note (ms).

Hauteur de la note: - de 1 à 127 = notes audibles


- de 128 à 256 = bruit blanc.

Numéro (0.... 7) de la pin du Port B (RB) sur laquelle on veut


faire sortir le son.

EXEMPLES :

1) SOUND 7, (100, 50)


Génère sur RB7 une note de hauteur 100, pendant 50 ms.

2) SOUND 7, (1, 100, 65, 100, 127, 100)


Génère sur RB7 trois notes : une note grave pendant 100 ms,
suivie d’une note moyenne pendant 100 ms, suivie encore
d’une note aigüe pendant 100 ms.

Le son généré a la forme d’un signal carré.


La Durée et la hauteur de la Note sont à déterminer expérimentalement, car
elles peuvent varier d’un µC à l’autre en fonction notamment de la
fréquence du quartz pilote, mais aussi de la tension d’alimentation, de la
température, etc...

Les paramètres enfermés dans les parenthèses doivent indiquer la note et


sa durée, la note et sa durée, la note et sa durée....
Leur nombre doit être (forcément !) pair.
On peut mettre dans les parenthèses autant de paramètres qu’on veut.
Il y a – bien sûr – une limite : la taille mémoire maximale du PIC !
255

Voici deux façons possibles de raccorder un haut-parleur à


une pin du Port B :
256

TOGLE

Cette instruction inverse l’état logique de l’un des bits (0... 7)


du Port B (RB).

SYNTAXE :
TOGLE Pin

Numéro de la pin (0.... 7) du Port B dont on veut inverser l’état.

EXEMPLE :
LOW 0
TOGLE 0
Dans un premier temps on met RB0 à l’état bas,
puis on inverse l’état de RB0 (RB0 passe
de l’état bas à l’état haut).
257

TRISA

Configure le Port A (en sortie ou en entrée).

Exemples :
1) SYMBOL PORTA = 5
SYMBOL TRISA = $85
POKE TRISA, 0
On configure le Port A en sortie

2) SYMBOL PORTA = 5
SYMBOL TRISA = $85
POKE TRISA, 255
On configure le Port A en entrée
258

WRITE

C’est l’instruction avec laquelle on écrit dans la mémoire EEPROM


de données (Data Memory).

SYNTAXE :
WRITE Adresse, Donnée

Donnée à écrire.

Adresse à laquelle on veut écrire (00.... 3F).

EXEMPLE :
WRITE 6, B0
Ecrit à l’adresse 6 la donnée se trouvant dans la variable B0.

NB : Les données entrent dans la mémoire EEPROM une seule fois


au moment de la programmation du PIC et non pas chaque fois
qu’on exécute le programme.
259

Exemples de programmes
écrits en langage PicBASIC

Voici 17 exemples de programmes écrits en MEL PicBASIC


qu’ils ne faut pas juger au nombre d’instructions, car – ainsi que
je l’ai déjà dit – les programmes écrits en PicBASIC sont souvent
courts, cela étant dû à la puissance de ses instructions.

Ce ne sont que des bases. Ils illustrent le mécanisme de la programmation


en MEL PicBASIC (je rappelle que MEL est l’acronime de MICRO
ENGINERING LABS, la Société qui a développé ce BASIC pour PIC).

Je vous encourage à vous procurer un Editer MEL PicBASIC


et à faire comme moi.
Vous verrez que développer avec ce logiciel devient un jeu d’enfants.

Bonne programmation.
260

Programme 1

Faire clignoter une LED reliée à RB0 (pin 0 du Port B).

LOOP : HIGH 0
PAUSE 1000
LOW 0
PAUSE 1000
GOTO LOOP
END
La LED s’allume pendant 1 seconde (1000 ms), puis s’éteint pendant
1 seconde.
Puis le cycle recommence indéfiniment.

Pour que la LED clignote plus vite, il faut ajuster la durée de PAUSE.
Exemple :
LOOP : HIGH 0
PAUSE 100
LOW 0
PAUSE 100
GOTO LOOP
END
Dans ce cas la LED s’allume pendant 100 ms, puis s’éteint pendant 100 ms.
Puis le cycle recommence indéfiniment.
261

Programme 2

Faire clignoter une LED relée à RB5 (bit 5 du Port B) si l’interrupteur


relié à RA0 (bit 0 du Port A) est à l’état haut.

LOOP : IF PIN 0 = 1 THEN LED


GOTO LOOP
LED : HIGH 5
PAUSE 100
LOW 5
PAUSE 100
GOTO LOOP
END

PAUSE étant ici positionnée à 100, la LED clignote plutôt rapidement.


262

Pour faire clignoter la LED moins rapidement, il suffit de modifier


la valeur de PAUSE :

LOOP : IF PIN 0 = 1 THEN LED


GOTO LOOP
LED : HIGH 5
PAUSE 1000
LOW 5
PAUSE 1000
GOTO LOOP
END
1000 ms = 1 seconde. Ici la LED clignote lentement.

On y remarque deux labels : LOOP et LED. Chacune renvoit à


un sous programme.
Les noms des labels sont suivis du signe : (deux points) :
- LOOP :
- LED :

Dans le premier sous programme on dit :


Si la pin 0 du Port A est à l’état 1, cesse d’exécuter les
instructions en ligne et saute au sous programme LED, sinon
(ligne suivante GOTO LOOP) surveille l’état logique de cette pin.
Si elle est à l’état 0, continue à surveiller.

Dans le deuxième sous programme on dit :


Allume la pin 0 du Port B pendant 1 seconde, puis éteins-la
pendant 1 seconde. Puis recommence la scrutation de l’état de la
Pin 0 du Port A.

Les pins auxquelles le langage MEL PicBASIC fait tacitement référence


sont celle du Port B.
HIGH 5 signifie : met à l’état haut la pin 5 du Port B.
HIGH (mets à l’état haut)
5 (la pin 5 du Port B).
263

Programme 3

Faire clignoter une LED reliée à RB5 (pin 5 du Port B) si les


interrupteurs reliés à RA0 et à RA1 sont fermés.

LOOP : IF Pin 0 = 1 AND Pin 1 = 1 THEN LED


GOTO LOOP
LED : HIGH 5
PAUSE 100
LOW 5
PAUSE 100
GOTO LOOP
END

Si la pin 0 (RA0) et la pin 1 (RA1) du Port A sont à 1, on exécute le


sous programme LED, sinon on continue à surveiller l’état de RA0
et de RA1.

Lorsque les conditions sont remplies, on allume la LED reliée à RB5


(pin 5 du Port B) pendant 100 ms, puis on l’éteint pendant 100 ms.
Puis on revient au début pour voir si les deux interrupteurs sont fermés.
Si Pin0 et Pin1 ne sont pas tous les deux enfoncés, il ne se passe rien
(la LED reste éteinte).
264

Programme 4

Allumer successivement toutes les LED du Port B.

LOOP : FOR B0 = 0 TO 7
HIGH B0
NEXT B0
END
265

Programme 5

Allume et éteint en séquence, une à la fois, toutes les LED du Port B


(de RB0 à RB7), avec un petit intervalle de temps entre chaque.

LOOP : FOR B0 = 0 TO 7
HIGH B0
PAUSE 100
LOW B0
PAUSE 900
NEXT B0
GOTO LOOP
END
266

Programme 6

Faire clignoter simultanément toutes les 8 LED du Port B.

On pourrait certes écrire :


LOOP : HIGH 0
HIGH 1
HIGH 2
HIGH 3
HIGH 4
HIGH 5
HIGH 6
HIGH 7
PAUSE 100
LOW 0
LOW 1
LOW 2
LOW 3
LOW 4
LOW 5
LOW 6
LOW 7
PAUSE 100
GOTO LOOP
END

Pas très beau !


L’utilisation d’une variable simplifie l’écriture :
LOOP : FOR B0 = 0 TO 7
HIGH B0
NEXT B0
PAUSE 100
FOR B0 = 0 TO 7
LOW B0
NEXT B0
PAUSE 100
GOTO LOOP
END
267

Les deux programmes font exactement la même chose, mais le deuxième


utilise beaucoup moins d’instructions.

Faire des économies d’instructions dans un si court programme n’a pas de


sens ; mais cela vaut la peine quand on écrit des programmes longs.
Exercez-vous donc à toujours recourir aux instructions les mieux adaptées.
268

Programme 7

Faire clignoter 5 fois toutes les LED du Port B ensemble.

LOOP : FOR B1 = 0 TO 7
HIGH B1
PAUSE 50
LOW B1
PAUSE 500
NEXT B1
FOR B0 = 1 TO 5
HIGH B1
PAUSE 50
LOW B1
PAUSE 50
NEXT B1
NEXT B0
GOTO LOOP
269

Programme 8

Faire clignoter en séquence, 5 fois chacune, l’une après l’autre


et une à la fois, les 8 LED du Port B, en commençant par la LED
associée à RB1.... jusquà celle associée à RB7. Puis recommencer.

LOOP : FOR B0 = 1 TO 5
FOR B1 = 0 TO 7
HIGH B1
PAUSE 100
LOW B1
PAUSE 500
NEXT B1
NEXT B0
GOTO LOOP
END

Ce programme fait clignoter toutes les LED du Port B (0 à 7) cinq fois,


l’une après l’autre, à un intervalle de demi-seconde, créant l’illusion
d’une LED qui se décale en clignotant.
270

Programme 9

Allumer les 8 LED du Port B en séquence binaire.

DIRS = 255
LOOP : FOR B1 = 0 TO 255
PINS = B1
PAUSE 200
NEXT B1
GOTO LOOP

Dans ce programme :
- DIRS = 255 définit les 8 lignes du Port B comme sorties ;
- Le comptage se fait de 0 à 255 (décimal)
(on pourrait écrire : FOR B1 = %0 TO %11111111
ou aussi : FOR B1 = $0 TO $FF ) ;
- A chaque incrément de la valeur assumée par la variable B1
(de 0 à 255 en décimal) l’instructions PINS = B1 visualise la
valeur courante de B1 ;
- L’instruction PAUSE 200 maintient cette visualisation active
pendant 200 ms.
271

Programme 10

Générer sur RB3 un signal modulé en largeur d’impulsions (PWM)


sous le contrôle de 2 interrupteurs :
- l’un placé sur RA0, faisant augmenter la luminosité de la
LED lorsqu’il est fermé ;
- l’autre placé sur RA1, faisant diminuer la luminosité de la
LED lorsqu’il est fermé.
NB : Un transistor peut être branché sur RB3 pour commander une charge
plus importante, ou un triac pour commander une lampe secteur.

SYMBOL PORTA = 5
SYMBOL TRISA = $85
POKE TRISA, 255
B1 = 127
LOOP : PEEK PORTA, 0
PWM 3, B1, 10
IF Bit 0 = 1 THEN INC
IF Bit 1 = 1 THEN DEC
GOTO LOOP
INC : IF B1 > 250 THEN LOOP
B1 = B1 + 5
GOTO LOOP
DEC : IF B1 < 5 THEN LOOP
B1 = B1 – 5
GOTO LOOP
END

Les trois premières lignes sont des initialisations . On y dit que PORTA est
à l’adresse 5, TRISA est à l’adresse 85, et qu’on veut tous les bits du
Port A en entrée.
B1 = 127 donne à la LED une luminosité initiale moyenne (127 est à la
moitié entre 1 et 256).
PEEK PORTA, 0 lit l’état de RA0.
Puis on définit les paramètres de la PWM, avec un coefficient changeant
de 5% par coup, sur 10 cycles, et si RA0 est à 1 on incrémente la variable
B1 (en appelant le sous programme INC), tandis que si RA1 est à 1, on
décrémente la variable B1 ( en appelant le sous programme DEC).
272

Programme 11

Réaliser une syrène à 2 tons.

LOOP SOUND 7, (10, 100, 50, 100)


GOTO LOOP
END

Ce programme génère sur RB7 un son de hauteur 10 pendant 100 ms,


suivi d’un deuxième de hauteur 50 pendant 100 ms.
Puis on recommence.
273

Programme 12

Générer une mélodie répétitive à 3 notes.

LOOP SOUND 7, (10, 100, 60, 100, 120, 100)


GOTO LOOP
END

Ce programme génère sur RB7 un premier son de hauteur 10 pendant


(environ) 100 ms, puis un deuxième son de hauteur 60 pendant
(approximativement) 100 ms, et enfin un troisième son de hauteur 120
pendant encore (approximativement) 100 ms.
Puis on recommence sans cesse.
274

Programme 13

Générer une mélodie en crescendo de 20 notes jouées en continuation.

LOOP B0 = 0
INC FOR B0 = B0 + 5
SOUND 7, (B0, 100)
NEXT B0
IF B0 > 100 THEN LOOP
GOTO INC
END

La variable B0 prend ici les 20 valeurs : 5


10
15
20
25
30
35
40
45
50
55
60
65
70
75
80
85
90
95
100

qui renvoient à des sons de différente hauteur (en crescendo).


275

Programme 14

Lire l’état de 5 interrupteurs placés sur le Port A et visualiser l’état de


chacun d’eux sur une rangée de 5 LED reliées au Port B.

SYMBOL PORTA = 5
SYMBOL TRISA = $85
POKE TRISA, 255
LOOP : PEEK PORTA, B0
IF Bit0 = 1 THEN ZERO
IF Bit1 = 1 THEN UN
IF Bit2 = 1 THEN DEUX
IF Bit3 = 1 THEN TROIS
IF Bit4 = 1 THEN QUATRE
GOTO LOOP
ZERO : HIGH 0
GOTO LOOP
UN : HIGH 1
GOTO LOOP
DEUX : HIGH 2
GOTO LOOP
TROIS : HIGH 3
GOTO LOOP
QUATRE : HIGH 4
GOTO LOOP
END

Après les initialisations, et après avoir mémorisé le Port A dans la variable


B0, on teste chaque bit qui – s’il est à 1 – renvoie à un sous programme
spécifique qui allume la LED correspondante.
276

Programme 15

Lire l’état de 5 interrupteurs placés sur le Port A et dire lequel d’eux


a été fermé, moyennant l’émission de bips sur un haut-parleur placé
sur RB7 : un seul bip pour informer qu’il s’agit de l’interrupteur n° 1,
deux bips pour le n° 2, et ainsi de suite.. 5 bips pour l’interrupteur n° 5.

SYMBOL PORTA = 5
SYMBOL TRISA = $85
POKE TRISA, 255
LOOP : PEEK PORTA, B0
IF Bit0 = 1 THEN 1_bip
IF Bit1 = 1 THEN 2_bips
IF Bit2 = 1 THEN 3_bips
IF Bit3 = 1 THEN 4_bips
IF Bit4 = 1 THEN 5_bips
GOTO LOOP
1_bip : SOUND 7, (100, 50)
GOTO LOOP
2_bips : SOUND 7, (100, 50, 100, 50)
GOTO LOOP
3_bips : SOUND 7, (100, 50, 100, 50, 100, 50)
GOTO LOOP
4_bips : SOUND 7, (100, 50, 100, 50, 100, 50, 100, 50)
GOTO LOOP
5_bips : SOUND 7, (100, 50, 100, 50, 100, 50, 100, 50, 100, 50)
GOTO LOOP
END

Après les initialisations, et après avoir mémorisé le Port A dans la variable


B0, on teste chaque bit qui – s’il est à 1 – renvoie à un sous programme
spécifique qui émet le nombre de bips correspondant.
Les bips ont tous la même hauteur et la même durée (100, 50).
100 correspond à la hauteur de la note. 50 correspond à sa durée.
277

Programme 16

Transmettre en mode série, à 2400 Bauds, via la pin RB6, un code de 4


bits issu de 4 interrupteurs placés sur le Port A.

SYMBOL PORTA = 5
SYMBOL TRISA = $85
POKE TRISA, 255 (Port A en entrée)
LOOP : PEEK PORTA, B0 (Mémorise le Port A dans B0)
PAUSE 200
SERout , T2400, (B0)
GOTO LOOP
END

- L’instruction PAUSE 200 est nécessaire ici, car le code provient


d’interrupteurs (pouvant générer des rebonds).
- L’instruction SERout 6, T2400, (B0) envoie sur la pin 6 du Port B
le code stocké dans la variable B0, aux normes T2400 (2400 Bauds,
mode TTL vrai).
278

Programme 17

Recevoir en mode série, à 2400 Bauds, un code entrant sur la pin RB6.
Stocker le code reçu dans la variable B0.

LOOP : SERin 6, N2400, B0


IF B0 > 0 THEN CODE_OK
GOTO LOOP
CODE_OK POKE PORTA, B0
END

Le code reçu est stocké dans la variable B0.


L’instruction IF B0 > 0...... sert à détecter l’arrivée d’un code.
Si un code autre que 0 est détecté, alors on le stocke dans B0.
En l’absence de code, on continue à guetter.
279

BIBLE pour
DESASSEMBLER A LA MAIN
Version 1.00

DESSASSEMBLER est le contraire d’ASSEMBLER.


Cette BIBLE n’est donc valable que pour des programmes assemblés,
c’est à dire ayant été écrits en langage ASSEMBLEUR, à extension .hex.
Elle ne s’applique pas à des programmes écrits en BASIC ou dans un
quelconque autre langage.

Lorsque dans un programme en ASSEMBLEUR vous écrivez, par


exemple :
GOTO START
MOVLW 00
MOVWF TRISB
.
.
.
l’Assembleur code ces instructions et fournit les valeurs hexadécimales
suivantes :
2805
3000
0086
.
.
.
2805 veut dire GOTO à l’adresse 05
3000 veut dire MOVLW 00
0086 veut dire MOVWF TRISB....

Il est donc possible de procéder à l’inverse, c’est à dire : partir des codes
hexadécimaux et remonter aux instructions.

Ce travail est généralement confié à un logiciel appelé


DESASSEMBLEUR. Mais, avec un peu de patience, vous pouvez
désassembler un programme à la main, sans besoin d’aucun logiciel, en
vous aidant de ma bible à désassembler à la main, dont vous truvez ici
la première version. C’est une nouveauté MONDIALE.
280

Mais en tout premier lieu, notez bien ces quatre remarques :

1) Les codes hexadécimaux qui ne figurent pas dans cette bible, sont :
- soit inexistants (exemple : 0087)
- soit illégaux ;

2) A côté de chaque code hexadécimal permis, vous trouvez, selon le


cas, ou le seul nom de l’instruction correspondante
(par exemple : 0064 = CLRWDT)
ou le nom de l’instruction et le registre qui lui est associé
(par exemple : 0083 = MOVWF STATUS) ;

3) Certaines instructions hexadécimales peuvent avoir plusieurs


présentations.
C’est pourquoi vous pouvez trouver la même instruction plusieurs fois,
dans plusieurs pages différentes, à plusieurs endroits... (exemple : NOP =
0000 = 0020 = 0040 = 0060).
Il ne s’agit pas d’une erreur, car dans l’encodage de l’instruction NOP (pour
rester dans cet exemple), les bits 5 et 6 peuvent prendre des valeurs
indifférentes. Ce qui conduit à 4 encodages possibles : 0000, 0020, 0040 et
0060.

4) Cette bible est ma première tentative ( en quoi, je pense avoir innové car
- à ma connaissance - il n’existe rien de semblable ni en librairie ni sur le
WEB). C’est pourquoi je vous l’ai présentée comme une nouveauté
MONDIALE.
C’est la version 1.00
J’y ai consacré beaucoup de temps, et j’ai veillé à l’exactitude de chaque
code.
Cependant j’espère que vous me pardonnerez une éventuelle faute de
frappe, une omission, un double-emploi ou une bévue.
N’hésitez pas à me signaler ce qui vous paraît douteux, pour que je puisse
étudier votre proposition, éventuellement corriger, et en distribuer une
nouvelle version.
281

0000 NOP 009B MOVWF 1B


0008 RETURN 009C MOVWF 1C
0009 RETFIE 009D MOVWF 1D
0020 NOP 009E MOVWF 1E
0040 NOP 009F MOVWF 1F
0060 NOP 00A0 MOVWF 20
0062 OPTION 00A1 MOVWF 21
0063 SLEEP 00A2 MOVWF 22
0064 CLWDT 00A3 MOVWF 23
0065 TRIS A 00A4 MOVWF 24
0066 TRIS B 00A5 MOVWF 25
0080 MOVWF INDF 00A6 MOVWF 26
0081 MOVWF TMR0 00A7 MOVWF 27
0082 MOVWF PCL 00A8 MOVWF 28
0083 MOVWF STATUS 00A9 MOVWF 29
0084 MOVWF FSR 00AA MOVWF 2A
0085 MOVWF PORTA 00AB MOVWF 2B
0086 MOVWF PORTB 00AC MOVWF 2C
0088 MOVWF EEDATA 00AD MOVWF 2D
0089 MOVWF EEADR 00AE MOVWF 2E
008A MOVWF PCLAYH 00AF MOVWF 2F
008B MOVWF INTCON 00B0 MOVWF 30
008C MOVWF 0C 00B1 MOVWF 31
008D MOVWF 0D 00B2 MOVWF 32
008E MOVWF 0E 00B3 MOVWF 33
008F MOVWF 0F 00B4 MOVWF 34
0090 MOVWF 10 00B5 MOVWF 35
0091 MOVWF 11 00B6 MOVWF 36
0092 MOVWF 12 00B7 MOVWF 37
0093 MOVWF 13 00B8 MOVWF 38
0094 MOVWF 14 00B9 MOVWF 39
0095 MOVWF 15 00BA MOVWF 3A
0096 MOVWF 16 00BB MOVWF 3B
0097 MOVWF 17 00BC MOVWF 3C
0098 MOVWF 18 00BD MOVWF 3D
0099 MOVWF 19 00BE MOVWF 3E
009A MOVWF 1A 00BF MOVWF 3F
282

00C0 MOVWF 40 0115 CLRW


00C1 MOVWF 41 0116 CLRW
00C2 MOVWF 42 0117 CLRW
00C3 MOVWF 43 0118 CLRW
00C4 MOVWF 44 0119 CLRW
00C5 MOVWF 45 011A CLRW
00C6 MOVWF 46 011B CLRW
00C7 MOVWF 47 011C CLRW
00C8 MOVWF 48 011D CLRW
00C9 MOVWF 49 011E CLRW
00CA MOVWF 4A 011F CLRW
00CB MOVWF 4B 0120 CLRW
00CC MOVWF 4C 0121 CLRW
00CD MOVWF 4D 0122 CLRW
00CE MOVWF 4E 0123 CLRW
00CF MOVWF 4F 0124 CLRW
0100 CLRW 0125 CLRW
0101 CLRW 0126 CLRW
0102 CLRW 0127 CLRW
0103 CLRW 0128 CLRW
0104 CLRW 0129 CLRW
0105 CLRW 012A CLRW
0106 CLRW 012B CLRW
0107 CLRW 012C CLRW
0108 CLRW 012D CLRW
0109 CLRW 012E CLRW
010A CLRW 012F CLRW
010B CLRW 0130 CLRW
010C CLRW 0131 CLRW
010D CLRW 0132 CLRW
010E CLRW 0133 CLRW
010F CLRW 0134 CLRW
0110 CLRW 0135 CLRW
0111 CLRW 0136 CLRW
0112 CLRW 0137 CLRW
0113 CLRW 0138 CLRW
0114 CLRW 0139 CLRW
283

013A CLRW 015F CLRW


013B CLRW 0160 CLRW
013C CLRW 0161 CLRW
013D CLRW 0162 CLRW
013E CLRW 0163 CLRW
013F CLRW 0164 CLRW
0140 CLRW 0165 CLRW
0141 CLRW 0166 CLRW
0142 CLRW 0167 CLRW
0143 CLRW 0168 CLRW
0144 CLRW 0169 CLRW
0145 CLRW 016A CLRW
0146 CLRW 016B CLRW
0147 CLRW 016C CLRW
0148 CLRW 016D CLRW
0149 CLRW 016E CLRW
014A CLRW 016F CLRW
014B CLRW 0170 CLRW
014C CLRW 0171 CLRW
014D CLRW 0172 CLRW
014F CLRW 0173 CLRW
014F CLRW 0174 CLRW
0150 CLRW 0175 CLRW
0151 CLRW 0176 CLRW
0152 CLRW 0177 CLRW
0153 CLRW 0178 CLRW
0154 CLRW 0179 CLRW
0155 CLRW 017A CLRW
0156 CLRW 017B CLRW
0157 CLRW 017C CLRW
0158 CLRW 017D CLRW
0159 CLRW 017E CLRW
015A CLRW 017F CLRW
015B CLRW 0180 CLRF INDF
015C CLRW 0181 CLRF TMR0
015D CLRW 0182 CLRF PCL
015E CLRW 0183 CLRF STATUS
284

0184 CLRF FSR 01A8 CLRF 28


0185 CLRF PORTA 01A9 CLRF 29
0186 CLRF PORTB 01AA CLRF 2A
0188 CLRF EEDATA 01AB CLRF 2B
0189 CLRF EEADR 01AC CLRF 2C
018A CLRF PCLATH 01AD CLRF 2D
018B CLRF INTCON 01AE CLRF 2E
018C CLRF 0C 01AF CLRF 2F
018D CLRF 0D 01B0 CLRF 30
018E CLRF 0E 01B1 CLRF 31
018F CLRF 0F 01B2 CLRF 32
0190 CLRF 10 01B3 CLRF 33
0191 CLRF 11 01B4 CLRF 34
0192 CLRF 12 01B5 CLRF 35
0193 CLRF 13 01B6 CLRF 36
0194 CLRF 14 01B7 CLRF 37
0195 CLRF 15 01B8 CLRF 38
0196 CLRF 16 01B9 CLRF 39
0197 CLRF 17 01BA CLRF 3A
0198 CLRF 18 01BB CLRF 3B
0199 CLRF 19 01BC CLRF 3C
019A CLRF 1A 01BD CLRF 3D
019B CLRF 1B 01BE CLRF 3E
019C CLRF 1C 01BF CLRF 3F
019D CLRF 1D 01C0 CLRF 40
019E CLRF 1E 01C1 CLRF 41
019F CLRF 1F 01C2 CLRF 42
01A0 CLRF 20 01C3 CLRF 43
01A1 CLRF 21 01C4 CLRF 44
01A2 CLRF 22 01C5 CLRF 45
01A3 CLRF 23 01C6 CLRF 46
01A4 CLRF 24 01C7 CLRF 47
01A5 CLRF 25 01C8 CLRF 48
01A6 CLRF 26 01C9 CLRF 49
01A7 CLRF 27 01CA CLRF 4A
285

01CB CLRF 4B 022C SUBWF 2C


01CC CLRF 4C 022D SUBWF 2D
01CD CLRF 4D 022E SUBWF 2E
01CE CLRF 4E 022F SUBWF 2F
01CF CLRF 4F 0230 SUBWF 30
020C SUBWF 0C 0231 SUBWF 31
020D SUBWF 0D 0232 SUBWF 32
020E SUBWF 0E 0233 SUBWF 33
020F SUBWF 0F 0234 SUBWF 34
0210 SUBWF 10 0235 SUBWF 35
0211 SUBWF 11 0236 SUBWF 36
0212 SUBWF 12 0237 SUBWF 37
0213 SUBWF 13 0238 SUBWF 38
0214 SUBWF 14 0239 SUBWF 39
0215 SUBWF 15 023A SUBWF 3A
0216 SUBWF 16 023B SUBWF 3B
0217 SUBWF 17 023C SUBWF 2C
0218 SUBWF 18 023D SUBWF 2D
0219 SUBWF 19 023E SUBWF 3E
021A SUBWF 1A 023F SUBWF 3F
021B SUBWF 1B 0240 SUBWF 40
021C SUBWF 1C 0241 SUBWF 41
021D SUBWF 1D 0242 SUBWF 42
021E SUBWF 1E 0243 SUBWF 43
021F SUBWF 1F 0244 SUBWF 44
0220 SUBWF 20 0245 SUBWF 45
0221 SUBWF 21 0246 SUBWF 46
0222 SUBWF 22 0247 SUBWF 47
0223 SUBWF 23 0248 SUBWF 48
0224 SUBWF 24 0249 SUBWF 49
0225 SUBWF 25 024A SUBWF 4A
0226 SUBWF 26 024B SUBWF 4B
0227 SUBWF 27 024C SUBWF 4C
0228 SUBWF 28 024D SUBWF 4D
0229 SUBWF 29 024E SUBWF 4E
022A SUBWF 2A 024F SUBWF 4F
022B SUBWF 2B 030C DECF 0C
286

030D DECF 0D 0332 DECF 32


030E DECF 0E 0333 DECF 33
030F DECF 0F 0334 DECF 34
0310 DECF 10 0335 DECF 35
0311 DECF 11 0336 DECF 36
0312 DECF 12 0337 DECF 37
0313 DECF 13 0338 DECF 38
0314 DECF 14 0339 DECF 39
0315 DECF 15 033A DECF 3A
0316 DECF 16 033B DECF 3B
0317 DECF 17 033C DECF 3C
0318 DECF 18 033D DECF 3D
0319 DECF 19 033E DECF 3E
031A DECF 1A 033F DECF 3F
031B DECF 1B 0340 DECF 40
031C DECF 1C 0341 DECF 41
031D DECF 1D 0342 DECF 42
031E DECF 1E 0343 DECF 43
031F DECF 1F 0344 DECF 44
0320 DECF 20 0345 DECF 45
0321 DECF 21 0346 DECF 46
0322 DECF 22 0347 DECF 47
0323 DECF 23 0348 DECF 48
0324 DECF 24 0349 DECF 49
0325 DECF 25 034A DECF 4A
0326 DECF 26 034B DECF 4B
0327 DECF 27 034C DECF 4C
0328 DECF 28 034D DECF 4D
0329 DECF 29 034E DECF 4E
032A DECF 2A 034F DECF 4F
032B DECF 2B 040C IORWF 0C
032C DECF 2C 040D IORWF 0D
032D DECF 2D 040E IORWF 0E
032E DECF 2E 040F IORWF 0F
032F DECF 2F 0410 IORWF 10
0330 DECF 30 0411 IORWF 11
0331 DECF 31 0412 IORWF 12
287

0413 IORWF 13 0438 IORWF 38


0414 IORWF 14 0439 IORWF 39
0415 IORWF 15 043A IORWF 3A
0416 IORWF 16 043B IORWF 3B
0417 IORWF 17 043C IORWF 3C
0418 IORWF 18 043D IORWF 3D
0419 IORWF 19 043E IORWF 3E
041A IORWF 2A 043F IORWF 3F
041B IORWF 2B 0440 IORWF 40
041C IORWF 2C 0441 IORWF 41
041D IORWF 2D 0442 IORWF 42
041E IORWF 2E 0443 IORWF 43
041F IORWF 2F 0444 IORWF 44
0420 IORWF 20 0445 IORWF 45
0421 IORWF 21 0446 IORWF 46
0422 IORWF 22 0447 IORWF 47
0423 IORWF 23 0448 IORWF 48
0424 IORWF 24 0449 IORWF 49
0425 IORWF 25 044A IORWF 4A
0426 IORWF 26 044B IORWF 4B
0427 IORWF 27 044C IORWF 4C
0428 IORWF 28 044D IORWF 4D
0429 IORWF 29 044E IORWF 4E
042A IORWF 2A 044F IORWF 4F
042B IORWF 2B 050C ANDWF 0C
042C IORWF 2C 050D ANDWF 0D
042D IORWF 2D 050E ANDWF 0E
042E IORWF 2E 050F ANDWF 0F
042F IORWF 2F 0510 ANDWF 10
0430 IORWF 30 0511 ANDWF 11
0431 IORWF 31 0512 ANDWF 12
0432 IORWF 32 0513 ANDWF 13
0433 IORWF 33 0514 ANDWF 14
0434 IORWF 34 0515 ANDWF 15
0435 IORWF 35 0516 ANDWF 16
0436 IORWF 36 0517 ANDWF 17
0437 IORWF 37 0518 ANDWF 18
288

0519 ANDWF 19 053E ANDWF 3E


051A ANDWF 1A 053F ANDWF 3F
051B ANDWF 1B 0540 ANDWF 40
051C ANDWF 1C 0541 ANDWF 41
051D ANDWF 1D 0542 ANDWF 42
051E ANDWF 1E 0543 ANDWF 43
051F ANDWF 1F 0544 ANDWF 44
0520 ANDWF 20 0545 ANDWF 45
0521 ANDWF 21 0546 ANDWF 46
0522 ANDWF 22 0547 ANDWF 47
0523 ANDWF 23 0548 ANDWF 48
0524 ANDWF 24 0549 ANDWF 49
0525 ANDWF 25 054A ANDWF 4A
0526 ANDWF 26 054B ANDWF 4B
0527 ANDWF 27 054C ANDWF 4C
0528 ANDWF 28 054D ANDWF 4D
0529 ANDWF 29 054E ANDWF 4E
052A ANDWF 2A 054F ANDWF 4F
052B ANDWF 2B 060C XORWF 0C
052C ANDWF 2C 060D XORWF 0D
052D ANDWF 2D 060E XORWF 0E
052E ANDWF 2E 060F XORWF 0F
052F ANDWF 2F 0610 XORWF 10
0530 ANDWF 30 0611 XORWF 11
0531 ANDWF 31 0612 XORWF 12
0532 ANDWF 32 0613 XORWF 13
0533 ANDWF 33 0614 XORWF 14
0534 ANDWF 34 0615 XORWF 15
0535 ANDWF 35 0616 XORWF 16
0536 ANDWF 36 0617 XORWF 17
0537 ANDWF 37 0618 XORWF 18
0538 ANDWF 38 0619 XORWF 19
0539 ANDWF 39 061A XORWF 1A
053A ANDWF 3A 061B XORWF 1B
053B ANDWF 3B 061C XORWF 1C
053C ANDWF 3C 061D XORWF 1D
053D ANDWF 3D 061E XORWF 1E
289

061F XORWF 1F 0644 XORWF 44


0620 XORWF 20 0645 XORWF 45
0621 XORWF 21 0646 XORWF 46
0622 XORWF 22 0647 XORWF 47
0623 XORWF 23 0648 XORWF 48
0624 XORWF 24 0649 XORWF 49
0625 XORWF 25 064A XORWF 4A
0626 XORWF 26 064B XORWF 4B
0627 XORWF 27 064C XORWF 4C
0628 XORWF 28 064D XORWF 4D
0629 XORWF 29 064E XORWF 4E
062A XORWF 2A 064F XORWF 4F
062B XORWF 2B 070C ADDWF 0C
062C XORWF 2C 070D ADDWF 0D
062D XORWF 2D 070E ADDWF 0E
062E XORWF 2E 070F ADDWF 0F
062F XORWF 2F 0710 ADDWF 10
0630 XORWF 30 0711 ADDWF 11
0631 XORWF 31 0712 ADDWF 12
0632 XORWF 32 0713 ADDWF 13
0633 XORWF 33 0714 ADDWF 14
0634 XORWF 34 0715 ADDWF 15
0635 XORWF 35 0716 ADDWF 16
0636 XORWF 36 0717 ADDWF 17
0637 XORWF 37 0718 ADDWF 18
0638 XORWF 38 0719 ADDWF 19
0639 XORWF 39 071A ADDWF 1A
063A XORWF 3A 071B ADDWF 1B
063B XORWF 3B 071C ADDWF 1C
063C XORWF 3C 071D ADDWF 1D
063D XORWF 3D 071E ADDWF 1E
063E XORWF 3E 071F ADDWF 1F
063F XORWF 3F 0720 ADDWF 20
0640 XORWF 40 0721 ADDWF 21
0641 XORWF 41 0722 ADDWF 22
0642 XORWF 42 0723 ADDWF 23
0643 XORWF 43 0724 ADDWF 24
290

0725 ADDWF 25 074A ADDWF 4A


0726 ADDWF 26 074B ADDWF 4B
0727 ADDWF 27 074C ADDWF 4C
0728 ADDWF 28 074D ADDWF 4D
0729 ADDWF 29 074E ADDWF 4E
072A ADDWF 2A 074F ADDWF 4F
072B ADDWF 2B 080C MOVF 0C
072C ADDWF 2C 080D MOVF 0D
072D ADDWF 2D 080E MOVF 0E
072E ADDWF 2E 080F MOVF 0F
072F ADDWF 2F 0810 MOVF 10
0730 ADDWF 30 0811 MOVF 11
0731 ADDWF 31 0812 MOVF 12
0732 ADDWF 32 0813 MOVF 13
0733 ADDWF 33 0814 MOVF 14
0734 ADDWF 34 0815 MOVF 15
0735 ADDWF 35 0816 MOVF 16
0736 ADDWF 36 0817 MOVF 17
0737 ADDWF 37 0818 MOVF 18
0738 ADDWF 38 0819 MOVF 19
0739 ADDWF 39 081A MOVF 1A
073A ADDWF 3A 081B MOVF 1B
073B ADDWF 3B 081C MOVF 1C
073C ADDWF 3C 081D MOVF 1D
073D ADDWF 3D 081E MOVF 1E
073E ADDWF 3E 081F MOVF 1F
073F ADDWF 3F 0820 MOVF 20
0740 ADDWF 40 0821 MOVF 21
0741 ADDWF 41 0822 MOVF 22
0742 ADDWF 42 0823 MOVF 23
0743 ADDWF 43 0824 MOVF 24
0744 ADDWF 44 0825 MOVF 25
0745 ADDWF 45 0826 MOVF 26
0746 ADDWF 46 0827 MOVF 27
0747 ADDWF 47 0828 MOVF 28
0748 ADDWF 48 0829 MOVF 29
0749 ADDWF 49 082A MOVF 2A
291

082B MOVF 2B 084F MOVF 4F


082C MOVF 2C 090C COMF 0C,w
082D MOVF 2D 090D COMF 0D,w
082E MOVF 2E 090E COMF 0E,w
082F MOVF 2F 090F COMF 0F,w
0830 MOVF 30 0910 COMF 10,w
0831 MOVF 31 0911 COMF 11,w
0832 MOVF 32 0912 COMF 12,w
0833 MOVF 33 0913 COMF 13,w
0834 MOVF 34 0914 COMF 14,w
0835 MOVF 35 0915 COMF 15,w
0836 MOVF 36 0916 COMF 16,w
0837 MOVF 37 0917 COMF 17,w
0838 MOVF 38 0918 COMF 18,w
0839 MOVF 39 0919 COMF 19,w
083A MOVF 3A 091A COMF 1A,w
083B MOVF 3B 091B COMF 1B,w
083C MOVF 3C 091C COMF 1C,w
083D MOVF 3D 091D COMF 1D,w
083E MOVF 3E 091E COMF 1E,w
083F MOVF 3F 091F COMF 1F,w
0840 MOVF 40 0920 COMF 20,w
0841 MOVF 41 0921 COMF 21,w
0842 MOVF 42 0922 COMF 22,w
0843 MOVF 43 0923 COMF 23,w
0844 MOVF 44 0924 COMF 24,w
0845 MOVF 45 0925 COMF 25,w
0846 MOVF 46 0926 COMF 26,w
0847 MOVF 47 0927 COMF 27,w
0848 MOVF 48 0928 COMF 28,w
0849 MOVF 49 0929 COMF 29,w
084A MOVF 4A 092A COMF 2A,w
084B MOVF 4B 092B COMF 2B,w
084C MOVF 4C 092C COMF 2C,w
084D MOVF 4D 092D COMF 2D,w
084E MOVF 4E 092E COMF 2E,w
292

092F COMF 2F,w 098F COMF 0F,f


0930 COMF 30,w 0990 COMF 10,f
0931 COMF 31,w 0991 COMF 11,f
0932 COMF 32,w 0992 COMF 12,f
0933 COMF 33,w 0993 COMF 13,f
0934 COMF 34,w 0994 COMF 14,f
0935 COMF 35,w 0995 COMF 15,f
0936 COMF 36,w 0996 COMF 16,f
0937 COMF 37,w 0997 COMF 17,f
0938 COMF 38,w 0998 COMF 18,f
0939 COMF 39,w 0999 COMF 19,f
093A COMF 3A,w 099A COMF 1A,f
093B COMF 3B,w 099B COMF 1B,f
093C COMF 3C,w 099C COMF 1C,f
093D COMF 3D,w 099D COMF 1D,f
093E COMF 3E,w 099E COMF 1E,f
093F COMF 3F,w 099F COMF 1F,f
0940 COMF 40,w 09A0 COMF 20,f
0941 COMF 41,w 09A1 COMF 21,f
0942 COMF 42,w 09A2 COMF 22,f
0943 COMF 43,w 09A3 COMF 23,f
0944 COMF 44,w 09A4 COMF 24,f
0945 COMF 45,w 09A5 COMF 25,f
0946 COMF 46,w 09A6 COMF 26,f
0947 COMF 47,w 09A7 COMF 27,f
0948 COMF 48,w 09A8 COMF 28,f
0949 COMF 49,w 09A9 COMF 29,f
094A COMF 4A,w 09AA COMF 2A,f
094B COMF 4B,w 09AB COMF 2B,f
094C COMF 4C,w 09AC COMF 2C,f
094D COMF 4D,w 09AD COMF 2D,f
094E COMF 4E,w 09AE COMF 2E,f
094F COMF 4F,w 09AF COMF 2F,f
098C COMF 0C,f 09B0 COMF 30,f
098D COMF 0D,f 09B1 COMF 31,f
098E COMF 0E,f 09B2 COMF 32,f
293

09B3 COMF 33,f 0A13 INCF 13,w


09B4 COMF 34,f 0A14 INCF 14,w
09B5 COMF 35,f 0A15 INCF 15,w
09B6 COMF 36,f 0A16 INCF 16,w
09B7 COMF 37,f 0A17 INCF 17,w
09B8 COMF 38,f 0A18 INCF 18,w
09B9 COMF 39,f 0A19 INCF 19,w
09BA COMF 3A,f 0A1A INCF 1A,w
09BB COMF 3B,f 0A1B INCF 1B,w
09BC COMF 3C,f 0A1C INCF 1C,w
09BD COMF 3D,f 0A1D INCF 1D,w
09BE COMF 3E,f 0A1E INCF 1E,w
09BF COMF 3F,f 0A1F INCF 1F,w
09C0 COMF 40,f 0A20 INCF 20,w
09C1 COMF 41,f 0A21 INCF 21,w
09C2 COMF 42,f 0A22 INCF 22,w
09C3 COMF 43,f 0A23 INCF 23,w
09C4 COMF 44,f 0A24 INCF 24,w
09C5 COMF 45,f 0A25 INCF 25,w
09C6 COMF 46,f 0A26 INCF 26,w
09C7 COMF 47,f 0A27 INCF 27,w
09C8 COMF 48,f 0A28 INCF 28,w
09C9 COMF 49,f 0A29 INCF 29,w
09CA COMF 4A,f 0A2A INCF 2A,w
09CB COMF 4B,f 0A3B INCF 2B,w
09CC COMF 4C,f 0A2C INCF 2C,w
09CD COMF 4D,f 0A2D INCF 2D,w
09CE COMF 4E ,f 0A2E INCF 2E,w
09CF COMF 4F,f 0A2F INCF 2F,w
0A0C INCF 0C,w 0A30 INCF 30,w
0A0D INCF 0D,w 0A31 INCF 31,w
0A0E INCF 0E,w 0A32 INCF 32,w
0A0F INCF 0F,w 0A33 INCF 33,w
0A10 INCF 10,w 0A34 INCF 34,w
0A11 INCF 11,w 0A35 INCF 35,w
0A12 INCF 12,w 0A36 INCF 36,w
294

0A37 INCF 37,w 0A97 INCF 17,f


0A38 INCF 38,w 0A98 INCF 18,f
0A39 INCF 39,w 0A99 INCF 19,f
0A3A INCF 3A,w 0A9A INCF 1A,f
0A3B INCF 3B,w 0A9B INCF 1B,f
0A3C INCF 3C,w 0A9C INCF 1C,f
0A3D INCF 3D,w 0A9D INCF 1D,f
0A3E INCF 3E,w 0A9E INCF 1E,f
0A3F INCF 3F,w 0A9F INCF 1F,f
0A40 INCF 40,w 0AA0 INCF 20,f
0A41 INCF 41,w 0AA1 INCF 21,f
0A42 INCF 42,w 0AA2 INCF 22,f
0A43 INCF 43,w 0AA3 INCF 23,f
0A44 INCF 44,w 0AA4 INCF 24,f
0A45 INCF 45,w 0AA5 INCF 25,f
0A46 INCF 46,w 0AA6 INCF 26,f
0A47 INCF 47,w 0AA7 INCF 27,f
0A48 INCF 48,w 0AA8 INCF 28,f
0A49 INCF 49,w 0AA9 INCF 29,f
0A4A INCF 4A,w 0AAA INCF 2A,f
0A4B INCF 4B,w 0AAB INCF 2B,f
0A4C INCF 4C,w 0AAC INCF 2C,f
0A4D INCF 4D,w 0AAD INCF 2D,f
0A4E INCF 4E,w 0AAE INCF 2E,f
0A4F INCF 4F,w 0AAF INCF 2F,f
0A8C INCF 0C,f 0AB0 INCF 30,f
0A8D INCF 0D,f 0AB1 INCF 31,f
0A8E INCF 0E,f 0AB2 INCF 32,f
0A8F INCF 0F,f 0AB3 INCF 33,f
0A90 INCF 10,f 0AB4 INCF 34,f
0A91 INCF 11,f 0AB5 INCF 35,f
0A92 INCF 12,f 0AB6 INCF 36,f
0A93 INCF 13,f 0AB7 INCF 37,f
0A94 INCF 14,f 0AB8 INCF 38,f
0A95 INCF 15f 0AB9 INCF 39,f
0A96 INCF 16,f 0ABA INCF 3A,f
295

0ABB INCF 3B,f 0B1B DECFSZ 1B,w


0ABC INCF 3C,f 0B1C DECFSZ 1C,w
0ABD INCF 3D,f 0B1D DECFSZ 1D,w
0ABE INCF 3E,f 0B1E DECFSZ 1E,w
0ABF INCF 3F,f 0B1F DECFSZ 1F,w
0AC0 INCF 40,f 0B20 DECFSZ 20,w
0AC1 INCF 41,f 0B21 DECFSZ 21,w
0AC2 INCF 42,f 0B22 DECFSZ 22,w
0AC3 INCF 43,f 0B23 DECFSZ 23,w
0AC4 INCF 44,f 0B24 DECFSZ 24,w
0AC5 INCF 45,f 0B25 DECFSZ 25,w
0AC6 INCF 46,f 0B26 DECFSZ 26,w
0AC7 INCF 47,f 0B27 DECFSZ 27,w
0AC8 INCF 48,f 0B28 DECFSZ 28,w
0AC9 INCF 49,f 0B29 DECFSZ 29,w
0ACA INCF 4A,f 0B2A DECFSZ 2A,w
0ACB INCF 4B,f 0B2B DECFSZ 2B,w
0ACC INCF 4C,f 0B2C DECFSZ 2C,w
0ACD INCF 4D,f 0B2D DECFSZ 2D,w
0ACE INCF 4E,f 0B2E DECFSZ 2E,w
0ACF INCF 4F,f 0B2F DECFSZ 2F,w
0B0C DECFSZ 0C,w 0B30 DECFSZ 30,w
0B0D DECFSZ 0D,w 0B31 DECFSZ 31,w
0B0E DECFSZ 0E,w 0B32 DECFSZ 32,w
0B0F DECFSZ 0F,w 0B33 DECFSZ 33,w
0B10 DECFSZ 10,w 0B34 DECFSZ 34,w
0B11 DECFSZ 11,w 0B35 DECFSZ 35,w
0B12 DECFSZ 12,w 0B36 DECFSZ 36,w
0B13 DECFSZ 13,w 0B37 DECFSZ 37,w
0B14 DECFSZ 14,w 0B38 DECFSZ 38,w
0B15 DECFSZ 15,w 0B39 DECFSZ 29,w
0B16 DECFSZ 16,w 0B3A DECFSZ 3A,w
0B17 DECFSZ 17,w 0B3B DECFSZ 3B,w
0B18 DECFSZ 18,w 0B3C DECFSZ 3C,w
0B19 DECFSZ 19,w 0B3D DECFSZ 3D,w
0B1A DECFSZ 1A,w 0B3E DECFSZ 3E,w
296

0B3F DECFSZ 3F,w 0B9F DECFSZ 1F,f


0B40 DECFSZ 40,w 0BA0 DECFSZ 20,f
0B41 DECFSZ 41,w 0BA1 DECFSZ 21,f
0B42 DECFSZ 42,w 0BA2 DECFSZ 22,f
0B43 DECFSZ 43,w 0BA3 DECFSZ 23,f
0B44 DECFSZ 44,w 0BA4 DECFSZ 24,f
0B45 DECFSZ 45,w 0BA5 DECFSZ 25,f
0B46 DECFSZ 46,w 0BA6 DECFSZ 26,f
0B47 DECFSZ 47,w 0BA7 DECFSZ 27,f
0B48 DECFSZ 48,w 0BA8 DECFSZ 28,f
0B49 DECFSZ 49,w 0BA9 DECFSZ 29,f
0B4A DECFSZ 4A,w 0BAA DECFSZ 2A,f
0B4B DECFSZ 4B,w 0BAB DECFSZ 2B,f
0B4C DECFSZ 4C,w 0BAC DECFSZ 2C,f
0B4D DECFSZ 4D,w 0BAD DECFSZ 2D,f
0B4E DECFSZ 4E,w 0BAE DECFSZ 2E,f
0B4F DECFSZ 4F,w 0BAF DECFSZ 2F,f
0B8C DECFSZ 0C,f 0BB0 DECFSZ 30,f
0B8D DECFSZ 0D,f 0BB1 DECFSZ 31,f
0B8E DECFSZ 0E,f 0BB2 DECFSZ 32,f
0B8F DECFSZ 0F,f 0BB3 DECFSZ 33,f
0B90 DECFSZ 10,f 0BB4 DECFSZ 34,f
0B91 DECFSZ 11,f 0BB5 DECFSZ 35,f
0B92 DECFSZ 12,f 0BB6 DECFSZ 36,f
0B93 DECFSZ 13,f 0BB7 DECFSZ 37,f
0B94 DECFSZ 14,f 0BB8 DECFSZ 38,f
0B95 DECFSZ 15,f 0BB9 DECFSZ 39,f
0B96 DECFSZ 16,f 0BBA DECFSZ 3A,f
0B97 DECFSZ 17,f 0BBB DECCFS 3B,f
0B98 DECFSZ 18,f 0BBC DECFES 3C,f
0B99 DECFSZ 19,f 0BBD DECFSZ 3D,f
0B9A DECFSZ 1A,f 0BBE DECFSZ 3E,f
0B9B DECFSZ 1B,f 0BBF DECFSZ 3F,f
0B9C DECFSZ 1C,f 0BC0 DECFSZ 40,f
0B9D DECFSZ 1D,f 0BC1 DECFSZ 41,f
0B9E DECFSZ 1E,f 0BC2 DECFSZ 42,f
297

0BC3 DECFSZ 43,f 0C23 RRF 23,w


0BC4 DECFSZ 44,f 0C24 RRF 24,w
0BC5 DECFSZ 45,f 0C25 RRF 25,w
0BC6 DECFSZ 46,f 0C26 RRF 26,w
0BC7 DECFSZ 47,f 0C27 RRF 27,w
0BC8 DECFSZ 48,f 0C28 RRF 28,w
0BC9 DECFSZ 49,f 0C29 RRF 29,w
0BCA DECFSZ 4A,f 0C2A RRF 2A,w
0BCB DECFSZ 4B,f 0C2B RRF 2B,w
0BCC DECFSZ 4C,f 0C2C RRF 2C,w
0BCD DECFSZ 4D,f 0C2D RRF 2D,w
0BCE DECFSZ 4E,f 0C2E RRF 2E,w
0BCF DECFSZ 4F,f 0C2F RRF 2F,w
0C0C RRF 0C,w 0C30 RRF 30,w
0C0D RRF 0D,w 0C31 RRF 31,w
0C0E RRF 0E,w 0C32 RRF 32,w
0C0F RRF 0F,w 0C33 RRF 33,w
0C10 RRF 10,w 0C34 RRF 34,w
0C11 RRF 11,w 0C35 RRF 35,w
0C12 RRF 12,w 0C36 RRF 36,w
0C13 RRF 13,w 0C37 RRF 37,w
0C14 RRF 14,w 0C38 RRF 38,w
0C15 RRF 15,w 0C39 RRF 39,w
0C16 RRF 16,w 0C3A RRF 3A,w
0C17 RRF 17,w 0C3B RRF 3B,w
0C18 RRF 18,w 0C3C RRF 3C,w
0C19 RRF 19,w 0C3D RRF 3D,w
0C1A RRF 1A,w 0C3E RRF 3E,w
0C1B RRF 1B,w 0C3F RRF 3F,w
0C1C RRF 1B,w 0C40 RRF 40,w
0C1D RRF 1D,w 0C41 RRF 41,w
0C1E RRF 1E,w 0C42 RRF 42,w
0C1F RRF 1F,w 0C43 RRF 43,w
0C20 RRF 20,w 0C44 RRF 44,w
0C21 RRF 21,w 0C45 RRF 45,w
0C22 RRF 22,w 0C46 RRF 46,w
298

0C47 RRF 47,w 0CA7 RRF 27,f


0C48 RRF 48,w 0CA8 RRF 28,f
0C49 RRF 49,w 0CA9 RRF 29,f
0C4A RRF 4A,w 0CAA RRF 2A,f
0C4B RRF 4B,w 0CAB RRF 2B,f
0C4C RRF 4C,w 0CAC RRF 2C,f
0C4D RRF 4D,w 0CAD RRF 2D,f
0C4E RRF 4E,w 0CAE RRF 2E,f
0C4F RRF 4F,w 0CAF RRF 2F,f
0C8C RRF 0C,f 0CB0 RRF 30,f
0C8D RRF 0D,f 0CB1 RRF 31,f
0C8E RRF 0E,f 0CB2 RRF 32,f
0C8F RRF 0F,f 0CB3 RRF 33,f
0C90 RRF 10,f 0CB4 RRF 34,f
0C91 RRF 11,f 0CB5 RRF 35,f
0C92 RRF 12,f 0CB6 RRF 36,f
0C93 RRF 13,f 0CB7 RRF 37,f
0C94 RRF 14,f 0CB8 RRF 38,f
0C95 RRF 15,f 0CB9 RRF 39,f
0C96 RRF 16,f 0CBA RRF 3A,f
0C97 RRF 17,f 0CBB RRF 3B,f
0C98 RRF 18,f 0CBC RRF 3C,f
0C99 RRF 19,f 0CBD RRF 3D,f
0C9A RRF 1A,f 0CBE RRF 3E,f
0C9B RRF 1B,f 0CBF RRF 3F,f
0C9C RRF 1C,f 0CC0 RRF 40,f
0C9D RRF 1D,f 0CC1 RRF 41,f
0C9E RRF 1E,f 0CC2 RRF 42,f
0C9F RRF 1F,f 0CC3 RRF 43,f
0CA0 RRF 20,f 0CC4 RRF 44,f
0CA1 RRF 21,f 0CC5 RRF 45,f
0CA2 RRF 22,f 0CC6 RRF 46 ,f
0CA3 RRF 23,f 0CC7 RRF 47,f
0CA4 RRF 24,f 0CC8 RRF 48,f
0CA5 RRF 25,f 0CC9 RRF 49,f
0CA6 RRF 26,f 0CCA RRF 4A,f
299

0CCB RRF 4B,f 0D2B RLF 2B,w


0CCC RRF 4C,f 0D2C RLF 2C,w
0CCD RRF 4D,f D02D RLF 2D,w
0CCE RRF 4E,f 0D2E RLF 2E,w
0CCF RRF 4F,f 0D2F RLF 2F,w
0D0C RLF 0C,w 0D30 RLF 30,w
0D0D RLF 0D,w 0D31 RLF 31,w
0D0E RLF 0E,w 0D32 RLF 32,w
0D0F RLF 0F,w 0D33 RLF 33,w
0D10 RLF 10,w 0D34 RLF 34,w
0D11 RLF 11,w 0D35 RLF 35,w
0D12 RLF 12,w 0D36 RLF 36,w
0D13 RLF 13,w 0D37 RLF 37,w
0D14 RLF 14,w 0D38 RLF 38,w
0D15 RLF 15,w 0D39 RLF 39,w
0D16 RLF 16,w 0D3A RLF 3A,w
0D17 RLF 17,w 0D3B RLF 3B,w
0D18 RLF 18,w 0D3C RLF 3C,w
0D19 RLF 19,w 0D3D RLF 3D,w
0D1A RLF 1A,w 0D3E RLF 3E,w
0D1B RLF 1B,w 0D3F RLF 3F,w
0D1C RLF 1C,w 0D40 RLF 40,w
0D1D RLF 1D,w 0D41 RLF 41,w
0D1E RLF 1E,w 0D42 RLF 42,w
0D1F RLF 1F,w 0D43 RLF 43,w
0D20 RLF 20,w 0D44 RLF 44,w
0D21 RLF 21,w 0D45 RLF 45,w
0D22 RLF 22,w 0D46 RLF 46,w
0D23 RLF 23,w 0D47 RLF 47,w
0D24 RLF 24,w 0D48 RLF 48,w
0D25 RLF 25,w 0D49 RLF 49,w
0D26 RLF 26,w 0D4A RLF 4A,w
0D27 RLF 27,w 0D4B RLF 4B,w
0D28 RLF 28,w 0D4C RLF 4C,w
0D29 RLF 29,w 0D4D RLF 4D,w
0D2A RLF 2A,w 0D4E RLF 4E,w
300

0D4F RLF 4F,w 0DAF RLF 2F,f


0D8C RLF 0C,f 0DB0 RLF 30,f
0D8D RLF 0D,f 0DB1 RLF 31,f
0D8E RLF 0E,f 0DB2 RLF 32,f
0D8F RLF 0F,f 0DB3 RLF 33,f
0D90 RLF 10,f 0DB4 RLF 34,f
0D91 RLF 11,f 0DB5 RLF 35,f
0D92 RLF 12,f 0DB6 RLF 36,f
0D93 RLF 13,f 0DB7 RLF 37,f
0D94 RLF 14,f 0DB8 RLF 38,f
0D95 RLF 15,f 0DB9 RLF 39,f
0D96 RLF 16,f 0DBA RLF 3A,f
0D97 RLF 17,f 0DBB RLF 3B,f
0D98 RLF 18,f 0DBC RLF 3C,f
0D99 RLF 19,f 0DBD RLF 3D,f
0D9A RLF 1A,f 0DBE RLF 3E,f
0D9B RLF 1B,f 0DBF RLF 3F,f
0D9C RLF 1C,f 0DC0 RLF 40,f
0D9D RLF 1D,f 0DC1 RLF 41,f
0D9E RLF 1E,f 0DC2 RLF 42,f
0D9F RLF 1F,f 0DC3 RLF 43,f
0DA0 RLF 20,f 0DC4 RLF 44,f
0DA1 RLF 21,f 0DC5 RLF 45,f
0DA2 RLF 22,f 0DC6 RLF 46,f
0DA3 RLF 23,f 0DC7 RLF 47,f
0DA4 RLF 24,f 0DC8 RLF 48,f
0DA5 RLF 25,f 0DC9 RLF 49,f
0DA6 RLF 26,f 0DCA RLF 4A,f
0DA7 RLF 27,f 0DCB RLF 4B,f
0DA8 RLF 28,f 0DCC RLF 4C,f
0DA9 RLF 29,f 0DCD RLF 4D,f
0DAA RLF 2A,f 0DCE RLF 4E,f
0DAB RLF 2B,f 0DCF RLF 4F,f
0DAC RLF 2C,f 0E0C SWAPF 0C,w
0DAD RLF 2D,f 0E0D SWAPF 0D,w
0DAE RLF 2E,f 0E0E SWAPF 0E,w
301

0E0F SWAPF 0F,w 0E33 SWAPF 33,w


0E10 SWAPF 10,w 0E34 SWAPF 34,w
0E11 SWAPF 11,w 0E35 SWAPF 35,w
0E12 SWAPF 12,w 0E36 SWAPF 36,w
0E13 SWAPF 13,w 0E37 SWAPF 37,w
0E14 SWAPF 14,w 0E38 SWAPF 38,w
0E15 SWAPF 15,w 0E39 SWAPF 39,w
0E16 SWAPF 16,w 0E3A SWAPF 3A,w
0E17 SWAPF 17,w 0E3B SWAPF 3B,w
0E18 SWAPF 18,w 0E3C SWAPF 3C,w
0E19 SWAPF 19,w 0E3D SWAPF 3D,w
0E1A SWAPF 1A,w 0E3E SWAPF 3E,w
0E1B SWAPF 1B,w 0E3F SWAPF 3F,w
0E1C SWAPF 1C,w 0E40 SWAPF 40,w
0E1D SWAPF 1D,w 0E41 SWAPF 41,w
0E1E SWAPF 1E,w 0E42 SWAPF 42,w
0E1F SWAPF 1F,w 0E43 SWAPF 43,w
0E20 SWAPF 20,w 0E44 SWAPF 44,w
0E21 SWAPF 21,w 0E45 SWAPF 45,w
0E22 SWAPF 22,w 0E46 SWAPF 46,w
0E23 SWAPF 23,w 0E47 SWAPF 47,w
0E24 SWAPF 24,w 0E48 SWAPF 48,w
0E25 SWAPF 25,w 0E49 SWAPF 49,w
0E26 SWAPF 26,w 0E4A SWAPF 4A,w
0E27 SWAPF 27,w 0E4B SWAPF 4B,w
0E28 SWAPF 28,w 0E4C SWAPF 4C,w
0E29 SWAPF 29,w 0E4D SWAPF 4D,w
0E2A SWAPF 2A,w 0E4E SWAPF 4E,w
0E2B SWAPF 2B,w 0E4F SWAPF 4F,f
0E2C SWAPF 2C,w 0E8C SWAPF 0C,f
0E2D SWAPF 2D,w 0E8D SWAPF 0D,f
0E2E SWAPF 2E,w 0E8E SWAPF 0E,f
0E2F SWAPF 2F,w 0E8F SWAPF 0F,f
0E30 SWAPF 30,w 0E90 SWAPF 10,f
0E31 SWAPF 31,w 0E91 SWAPF 11,f
0E32 SWAPF 32,w 0E92 SWAPF 12,f
302

0E93 SWAPF 13,f 0EB7 SWAPF 37,f


0E94 SWAPF 14,f 0EB8 SWAPF 38,f
0E95 SWAPF 15,f 0EB9 SWAPF 39,f
0E96 SWAPF 16,f 0EBA SWAPF 3A,f
0E97 SWAPF 17,f 0EBB SWAPF 3B,f
0E98 SWAPF 18,f 0EBC SWAPF 3C,f
0E99 SWAPF 19,f 0EBD SWAPF 3D,f
0E9A SWAPF 1A,f 0EBE SWAPF 3E,f
0E9B SWAPF 1B,f 0EBF SWAPF 3F,f
0E9C SWAPF 1C,f 0EC0 SWAPF 40,f
0E9D SWAPF 1D,f 0EC1 SWAPF 41,f
0E9E SWAPF 1E,f 0EC2 SWAPF 42,f
0E9F SWAPF 1F,f 0EC3 SWAPF 43,f
0EA0 SWAPF 20,f 0EC4 SWAPF 44,f
0EA1 SWAPF 21,f 0EC5 SWAPF 45,f
0EA2 SWAPF 22,f 0EC6 SWAPF 46,f
0EA3 SWAPF 23,f 0EC7 SWAPF 47,f
0EA4 SWAPF 24,f 0EC8 SWAPF 48,f
0EA5 SWAPF 25,f 0EC9 SWAPF 49,f
0EA6 SWAPF 26,f 0ECA SWAPF 4A,f
0EA7 SWAPF 27,f 0ECB SWAPF 4B,f
0EA8 SWAPF 28,f 0ECC SWAPF 4C,f
0EA9 SWAPF 29,f 0ECD SWAPF 4D,f
0EAA SWAPF 2A,f 0ECE SWAPF 4E,f
0EAB SWAPF 2B,f 0ECF SWAPF 4F,f
0EAC SWAPF 2C,f 0F0C INCFSZ 0C,w
0EAD SWAPF 2D,f 0F0D INCFSZ 0D,w
0EAE SWAPF 2E,f 0F0E INCFSZ 0E,w
0EAF SWAPF 2F,f 0F0F INCFSZ 0F,w
0EB0 SWAPF 30,f 0F10 INCFSZ 10,w
0EB1 SWAPF 31,f 0F11 INCFSZ 11,w
0EB2 SWAPF 32,f 0F12 INCFSZ 12,w
0EB3 SWAPF 33,f 0F13 INCFSZ 13,w
0EB4 SWAPF 34,f 0F14 INCFSZ 14,w
0EB5 SWAPF 35,f 0F15 INCFSZ 15,w
0EB6 SWAPF 36,f 0F16 INCFSZ 16,w
303

0F17 INCFSZ 17,w 0F3B INCFSZ 3B,w


0F18 INCFSZ 18,w 0F3C INCFSZ 3C,w
0F19 INCFSZ 19,w 0F3D INCFSZ 3D,w
0F1A INCFSZ 1A,w 0F3E INCFSZ 3E,w
0F1B INCFSZ 1B,w 0F3F INCFSZ 3F,w
0F1C INCFSZ 1C,w 0F40 INCFSZ 40,w
0F1D INCFSZ 1D,w 0F41 INCFSZ 41,w
0F1E INCFSZ 1E,w 0F42 INCFSZ 42,w
0F1F INCFSZ 1F,w 0F43 INCFSZ 43,w
0F20 INCFSZ 20,w 0F44 INCFSZ 44,w
0F21 INCFSZ 21,w 0F45 INCFSZ 45,w
0F22 INCFSZ 22,w 0F46 INCFSZ 46,w
0F23 INCFSZ 23,w 0F47 INCFSZ 47,w
0F24 INCFSZ 24,w 0F48 INCFSZ 48,w
0F25 INCFSZ 25,w 0F49 INCFSZ 49,w
0F26 INCFSZ 26,w 0F4A INCFSZ 4A,w
0F27 INCFSZ 27,w 0F4B INCFSZ 4B,w
0F28 INCFSZ 28,w 0F4C INCFSZ 4C,w
0F29 INCFSZ 29,w 0F4D INCFSZ 4D,w
0F2A INCFSZ 2A,w 0F4E INCFSZ 4E,w
0F2B INCFSZ 2B,w 0F4F INCFSZ 4F,f
0F2C INCFSZ 2C,w 0F8C INCFSZ 0C,f
0F2D INCFSZ 2D,w 0F8D INCFSZ 0D,f
0F2E INCFSZ 2E,w 0F8E INCFSZ 0E,f
0F2F INCFSZ 2F,w 0F8F INCFSZ 0F,f
0F30 INCFSZ 30,w 0F90 INCFSZ 10,f
0F31 INCFSZ 31,w 0F91 INCFSZ 11,f
0F32 INCFSZ 32,w 0F92 INCFSZ 12,f
0F33 INCFSZ 33,w 0F93 INCFSZ 13,f
0F34 INCFSZ 34,w 0F94 INCFSZ 14,f
0F35 INCFSZ 35,w 0F95 INCFSZ 15,f
0F36 INCFSZ 36,w 0F96 INCFSZ 16,f
0F37 INCFSZ 37,w 0F97 INCFSZ 17,f
0F38 INCFSZ 38,w 0F98 INCFSZ 18,f
0F39 INCFSZ 39,w 0F99 INCFSZ 19,f
0F3A INCFSZ 3A,w 0F9A INCFSZ 1A,f
304

0F9B INCFSZ 1B,f 0FBF INCFSZ 3F,f


0F9C INCFSZ 1C,f 0FC0 INCFSZ 40,f
0F9D INCFSZ 1D,f 0FC1 INCFSZ 41,f
0F9E INCFSZ 1E,f 0FC2 INCFSZ 42,f
0F9F INCFSZ 1F,f 0FC3 INCFSZ 43,f
0FA0 INCFSZ 20,f 0FC4 INCFSZ 44,f
0FA1 INCFSZ 21,f 0FC5 INCFSZ 45,f
0FA2 INCFSZ 22,f 0FC6 INCFSZ 46,f
0FA3 INCFSZ 23,f 0FC7 INCFSZ 47,f
0FA4 INCFSZ 24,f 0FC8 INCFSZ 48,f
0FA5 INCFSZ 25,f 0FC9 INCFSZ 49,f
0FA6 INCFSZ 26,f 0FCA INCFSZ 4A,f
0FA7 INCFSZ 27,f 0FCB INCFSZ 4B,f
0FA8 INCFSZ 28,f 0FCC INCFSZ 4C,f
0FA9 INCFSZ 29,f 0FCD INCFSZ 4D,f
0FAA INCFSZ 2A,f 0FCE INCFSZ 4E,f
0FAB INCFSZ 2B,f 0FCF INCFSZ 4F,f
0FAC INCFSZ 2C,f 1003 BCF STATUS,C
0FAD INCFSZ 2D,f 1005 BCF PARTA,0
0FAE INCFSZ 2E,f 1006 BCF PORTB,0
0FAF INCFSZ 2F,f 100B BCF INTCON,RBIF
0FB0 INCFSZ 30,f 100C BCF 0C,0
0FB1 INCFSZ 31,f 100D BCF 0D,0
0FB2 INCFSZ 32,f 100E BCF 0E,0
0FB3 INCFSZ 33,f 100F BCF 0F,0
0FB4 INCFSZ 34,f 1010 BCF 10,0
0FB5 INCFSZ 35,f 1011 BCF 11,0
0FB6 INCFSZ 36,f 1012 BCF 12,0
0FB7 INCFSZ 37,f 1013 BCF 13,0
0FB8 INCFSZ 38,f 1014 BCF 14,0
0FB9 INCFSZ 39,f 1015 BCF 15,0
0FBA INCFSZ 3A,f 1016 BCF 16,0
0FBB INCFSZ 3B,f 1017 BCF 17,0
0FBC INCFSZ 3C,f 1018 BCF 18,0
0FBD INCFSZ 3D,f 1019 BCF 19,0
0FBE INCFSZ 3E,f 101A BCF 1A,0
305

101B BCF 1B,0 103F BCF 3F,0


101C BCF 1C,0 1040 BCF 40,0
101D BCF 1D,0 1041 BCF 41,0
101E BCF 1E,0 1042 BCF 42,0
101F BCF 1F,0 1043 BCF 43,0
1020 BCF 20,0 1044 BCF 44,0
1021 BCF 21,0 1045 BCF 45,0
1022 BCF 22,0 1046 BCF 46,0
1023 BCF 23,0 1047 BCF 47,0
1024 BCF 24,0 1048 BCF 48,0
1025 BCF 25,0 1049 BCF 49,0
1026 BCF 26,0 104A BCF 4A,0
1027 BCF 27,0 104B BCF 4B,0
1028 BCF 28,0 104C BCF 4C,0
1029 BCF 29,0 104D BCF 4D,0
102A BCF 2A,0 104E BCF 4E,0
102B BCF 2B,0 104F BCF 4F,0
102C BCF 2C,0 1083 BCF STATUS,DC
102D BCF 2D,0 1085 BCF PORTA,1
102E BCF 2E,0 1086 BCF PORTB,1
102F BCF 2F,0 108B BCF INTCON,INTF
1030 BCF 30,0 108C BCF 0C,1
1031 BCF 31,0 108D BCF 0D,1
1032 BCF 32,0 108E BCF 0E,1
1033 BCF 33,0 108F BCF 0F,1
1034 BCF 34,0 1090 BCF 10,1
1035 BCF 35,0 1091 BCF 11,1
1036 BCF 36,0 1092 BCF 12,1
1037 BCF 37,0 1093 BCF 13,1
1038 BCF 38,0 1094 BCF 14,1
1039 BCF 39,0 1095 BCF 15,1
103A BCF 3A,0 1096 BCF 16,1
103B BCF 3B,0 1097 BCF 17,1
103C BCF 3C,0 1098 BCF 18,1
103D BCF 3D,0 1099 BCF 19,1
103E BCF 3E,0 109A BCF 1A,1
306

109B BCF 1B,1 10BF BCF 3F,1


109C BCF 1C,1 10C0 BCF 40,1
109D BCF 1D,1 10C1 BCF 41,1
109E BCF 1E,1 10C2 BCF 42,1
109F BCF 1F,1 10C3 BCF 43,1
10A0 BCF 20,1 10C4 BCF 44,1
10A1 BCF 21,1 10C5 BCF 45,1
10A2 BCF 22,1 10C6 BCF 46,1
10A3 BCF 23,1 10C7 BCF 47,1
10A4 BCF 24,1 10C8 BCF 48,1
10A5 BCF 25,1 10C9 BCF 49,1
10A6 BCF 26,1 10CA BCF 4A,1
10A7 BCF 27,1 10CB BCF 4B,1
10A8 BCF 28,1 10CC BCF 4C,1
10A9 BCF 29,1 10CD BCF 4D,1
10AA BCF 2A,1 10CE BCF 4E,1
10AB BCF 2B,1 10CF BCF 4F,1
10AC BCF 2C,1 1103 BCF STATUS,Z
10AD BCF 2D,1 1105 BCF PORTA,2
10AE BCF 2E,1 1106 BCF PORTB,2
10AF BCF 2F,1 110B BCF INTCON,TOIF
10B0 BCF 30,1 110C BCF 0C,2
10B1 BCF 31,1 110D BCF 0D,2
10B2 BCF 32,1 110E BCF 0E,2
10B3 BCF 33,1 110F BCF 0F,2
10B4 BCF 34,1 1110 BCF 10,2
10B5 BCF 35,1 1111 BCF 11,2
10B6 BCF 36,1 1112 BCF 12,2
10B7 BCF 37,1 1113 BCF 13,2
10B8 BCF 38,1 1114 BCF 14,2
10B9 BCF 39,1 1115 BCF 15,2
10BA BCF 3A,1 1116 BCF 16,2
10BB BCF 3B,1 1117 BCF 17,2
10BC BCF 3C,1 1118 BCF 18,2
10BD BCF 3D,1 1119 BCF 19,2
10BE BCF 3E,1 111A BCF 1A,2
307

111B BCF 1B,2 113F BCF 3F,2


111C BCF 1C,2 1140 BCF 40,2
111D BCF 1D,2 1141 BCF 41,2
111E BCF 1E,2 1142 BCF 42,2
111F BCF 1F,2 1143 BCF 43,2
1120 BCF 20,2 1144 BCF 44,2
1121 BCF 21,2 1145 BCF 45,2
1122 BCF 22,2 1146 BCF 46,2
1123 BCF 23,2 1147 BCF 47,2
1124 BCF 24,2 1148 BCF 48,2
1125 BCF 25,2 1149 BCF 49,2
1126 BCF 26,2 114A BCF 4A,2
1127 BCF 27,2 114B BCF 4B,2
1128 BCF 28,2 114C BCF 4C,2
1129 BCF 29,2 114D BCF 4D,2
112A BCF 2A,2 114E BCF 4E,2
112B BCF 2B,2 114F BCF 4F,2
112C BCF 2C,2 1183 BCF STATUS,PD
112D BCF 2D,2 1185 BCF PORTA,3
112E BCF 2E,2 1186 BCF PORTB,3
112F BCF 2F,2 118B BCF INTCON,RBIE
1130 BCF 30,2 118C BCF 0C,3
1131 BCF 31,2 118D BCF 0D,3
1132 BCF 32,2 118E BCF 0E,3
1133 BCF 33,2 118F BCF 0F,3
1134 BCF 34,2 1190 BCF 10,3
1135 BCF 35,2 1191 BCF 11,3
1136 BCF 36,2 1192 BCF 12,3
1137 BCF 37,2 1193 BCF 13,3
1138 BCF 38,2 1194 BCF 14,3
1139 BCF 39,2 1195 BCF 15,3
113A BCF 3A,2 1196 BCF 16,3
113B BCF 3B,2 1197 BCF 17,3
113C BCF 3C,2 1198 BCF 18,3
113D BCF 3D,2 1199 BCF 19,3
113E BCF 3E,2 119A BCF 1A,3
308

119B BCF 1B,3 11BF BCF 3F,3


119C BCF 1C,3 11C0 BCF 40,3
119D BCF 1D,3 11C1 BCF 41,3
119E BCF 1E,3 11C2 BCF 42,3
119F BCF 1F,3 11C3 BCF 43,3
11A0 BCF 20,3 11C4 BCF 44,3
11A1 BCF 21,3 11C5 BCF 45,3
11A2 BCF 22 ,3 11C6 BCF 46,3
11A3 BCF 23,3 11C7 BCF 47,3
11A4 BCF 24,3 11C8 BCF 48,3
11A5 BCF 25,3 11C9 BCF 49,3
11A6 BCF 26,3 11CA BCF 4A,3
11A7 BCF 27,3 11CB BCF 4B,3
11A8 BCF 28,3 11CC BCF 4C,3
11A9 BCF 29,3 11CD BCF 4D,3
11AA BCF 2A,3 11CE BCF 4E,3
11AB BCF 2B,3 11CF BCF 4F,3
11AC BCF 2C,3 1203 BCF STATUS,TO
11AD BCF 2D,3 1205 BCF PORTA,4
11AE BCF 2E,3 1206 BCF PORTB,4
11AF BCF 2F,3 120B BCF INTCON,INTE
11B0 BCF 30,3 120C BCF 0C,4
11B1 BCF 31,3 120D BCF 0D,4
11B2 BCF 32,3 120E BCF 0E,4
11B3 BCF 33,3 120F BCF 0F,4
11B4 BCF 34,3 1210 BCF 10,4
11B5 BCF 35,3 1211 BCF 11,4
11B6 BCF 36,3 1212 BCF 12,4
11B7 BCF 37,3 1213 BCF 13,4
11B8 BCF 38,3 1214 BCF 14,4
11B9 BCF 39,3 1215 BCF 15,4
11BA BCF 3A,3 1216 BCF 16,4
11BB BCF 3B,3 1217 BCF 17,4
11BC BCF 3C,3 1218 BCF 18,4
11BD BCF 3D,3 1219 BCF 19,4
11BE BCF 3E,3 121A BCF 1A,4
309

121B BCF 1B,4 123F BCF 3F,4


121C BCF 1C,4 1240 BCF 40,4
121D BCF 1D,4 1241 BCF 41,4
121E BCF 1E,4 1242 BCF 42,4
121F BCF 1F,4 1243 BCF 43,4
1220 BCF 20,4 1244 BCF 44,4
1221 BCF 21,4 1245 BCF 45,4
1222 BCF 22,4 1246 BCF 46,4
1223 BCF 23,4 1247 BCF 47,4
1224 BCF 24,4 1248 BCF 48,4
1225 BCF 25,4 1249 BCF 49,4
1226 BCF 26,4 124A BCF 4A,4
1227 BCF 27,4 124B BCF 4B,4
1228 BCF 28,4 124C BCF 4C,4
1229 BCF 29,4 124D BCF 4D,4
122A BCF 2A,4 124E BCF 4E,4
122B BCF 2B,4 124F BCF 4F,4
122C BCF 2C,4 1283 BCF STATUS,RP0
122D BCF 2D,4 1285 BCF PORTA,5
122E BCF 2E,4 1286 BCF PORTB,5
122F BCF 2F,4 128B BCF INTCON,TOIE
1230 BCF 30,4 128C BCF 0C,5
1231 BCF 31,4 128D BCF 0D,5
1232 BCF 32,4 128E BCF 0E,5
1233 BCF 33,4 128F BCF 0F,5
1234 BCF 34,4 1290 BCF 10,5
1235 BCF 35,4 1291 BCF 11,5
1236 BCF 36,4 1292 BCF 12,5
1237 BCF 37,4 1293 BCF 13,5
1238 BCF 38,4 1294 BCF 14,5
1239 BCF 39,4 1295 BCF 15,5
123A BCF 3A,4 1296 BCF 16,5
123B BCF 3B,4 1297 BCF 17,5
123C BCF 3C,4 1298 BCF 18,5
123D BCF 3D,4 1299 BCF 19,5
123E BCF 3E,4 129A BCF 1A,5
310

129B BCF 1B,5 12BF BCF 3F,5


129C BCF 1C,5 12C0 BCF 40,5
129D BCF 1D,5 12C1 BCF 41,5
129E BCF 1E,5 12C2 BCF 42,5
129F BCF 1F,5 12C3 BCF 43,5
12A0 BCF 20,5 12C4 BCF 44,5
12A1 BCF 21,5 12C5 BCF 45,5
12A2 BCF 22,5 12C6 BCF 46,5
12A3 BCF 23,5 12C7 BCF 47,5
12A4 BCF 24,5 12C8 BCF 48,5
12A5 BCF 25,5 12C9 BCF 49,5
12A6 BCF 26,5 12CA BCF 4A,5
12A7 BCF 27,5 12CB BCF 4B,5
12A8 BCF 28,5 12CC BCF 4C,5
12A9 BCF 29,5 12CD BCF 4D,5
12AA BCF 2A,5 12CE BCF 4E,5
12AB BCF 2B,5 12CF BCF 4F,5
12AC BCF 2C,5 1303 BCF STATUS,6
12AD BCF 2D,5 1305 BCF PORTA,6
12AE BCF 2E,5 1306 BCF PORTB,6
12AF BCF 2F,5 130B BCF INTCON,EEIE
12B0 BCF 30,5 130C BCF 0C,6
12B1 BCF 31,5 130D BCF 0D,6
12B2 BCF 32,5 130E BCF 0E,6
12B3 BCF 33,5 130F BCF 0F,6
12B4 BCF 34,5 1310 BCF 10,6
12B5 BCF 35,5 1311 BCF 11,6
12B6 BCF 36,5 1312 BCF 12,6
12B7 BCF 37,5 1313 BCF 13,6
12B8 BCF 38,5 1314 BCF 14,6
12B9 BCF 39,5 1315 BCF 15,6
12BA BCF 3A,5 1316 BCF 16,6
12BB BCF 3B,5 1317 BCF 17,6
12BC BCF 3C,5 1318 BCF 18,6
12BD BCF 3D,5 1319 BCF 19,6
12BE BCF 3E,5 131A BCF 1A,6
311

131B BCF 1B,6 133F BCF 3F,6


131C BCF 1C,6 1340 BCF 40,6
131D BCF 1D,6 1341 BCF 41,6
131E BCF 1E,6 1342 BCF 42,6
131F BCF 1F,6 1343 BCF 43,6
1320 BCF 20,6 1344 BCF 44,6
1321 BCF 21,6 1345 BCF 45,6
1322 BCF 22,6 1346 BCF 46,6
1323 BCF 23,6 1347 BCF 47,6
1324 BCF 24,6 1348 BCF 48,6
1325 BCF 25,6 1349 BCF 49,6
1326 BCF 26,6 134A BCF 4A,6
1327 BCF 27,6 134B BCF 4B,6
1328 BCF 28,6 134C BCF 4C,6
1329 BCF 29,6 134D BCF 4D,6
132A BCF 2A,6 134E BCF 4E,6
132B BCF 2B,6 134F BCF 4F,6
132C BCF 2C,6 1383 BCF STATUS,7
132D BCF 2D,6 1385 BCF PORTA,7
132E BCF 2E,6 1386 BCF PORTB,7
132F BCF 2F,6 138B BCF INTCON,GIE
1330 BCF 30,6 138C BCF 0C,7
1331 BCF 31,6 138D BCF 0D,7
1332 BCF 32,6 138E BCF 0E,7
1333 BCF 33,6 138F BCF 0F,7
1334 BCF 34,6 1390 BCF 10,7
1335 BCF 35,6 1391 BCF 11,7
1336 BCF 36,6 1392 BCF 12,7
1337 BCF 37,6 1393 BCF 13,7
1338 BCF 38,6 1394 BCF 14,7
1339 BCF 39,6 1395 BCF 15,7
133A BCF 3A,6 1396 BCF 16,7
133B BCF 3B,6 1397 BCF 17,7
133C BCF 3C,6 1398 BCF 18,7
133D BCF 3D,6 1399 BCF 19,7
133E BCF 3E,6 139A BCF 1A,7
312

139B BCF 1B,7 13BF BCF 3F,7


139C BCF 1C,7 13C0 BCF 40,7
139D BCF 1D,7 13C1 BCF 41,7
139E BCF 1E,7 13C2 BCF 42,7
139F BCF 1F,7 13C3 BCF 43,7
13A0 BCF 20,7 13C4 BCF 44,7
13A1 BCF 21,7 13C5 BCF 45,7
13A2 BCF 22,7 13C6 BCF 46,7
13A3 BCF 23,7 13C7 BCF 47,7
13A4 BCF 24,7 13C8 BCF 48,7
13A5 BCF 25,7 13C9 BCF 49,7
13A6 BCF 26,7 13CA BCF 4A,7
13A7 BCF 27,7 13CB BCF 4B,7
13A8 BCF 28,7 13CC BCF 4C,7
13A9 BCF 29,7 13CD BCF 4D,7
13AA BCF 2A,7 13CE BCF 4E,7
13AB BCF 2B,7 13CF BCF 4F,7
13AC BCF 2C,7 1405 BSF PORTA,0
13AD BCF 2D,7 1406 BSF PORTB,0
13AE BCF 2E,7 140C BSF 0C,0
13AF BCF 2F,7 140D BSF 0D,0
13B0 BCF 30,7 140E BSF 0E,0
13B1 BCF 31,7 140F BSF 0F,0
13B2 BCF 32,7 1410 BSF 10,0
13B3 BCF 33,7 1411 BSF 11,0
13B4 BCF 34,7 1412 BSF 12,0
13B5 BCF 35,7 1413 BSF 13,0
13B6 BCF 36,7 1414 BSF 14,0
13B7 BCF 37,7 1415 BSF 15,0
13B8 BCF 38,7 1416 BSF 16,0
13B9 BCF 39,7 1417 BSF 17,0
13BA BCF 3A,7 1418 BSF 18,0
13BB BCF 3B,7 1419 BSF 19,0
13BC BCF 3C,7 141A BSF 1A,0
13BD BCF 3D,7 141B BSF 1B,0
13BE BCF 3E,7 141C BSF 1C,0
313

141D BSF 1D,0 1441 BSF 41,0


141E BSF 1E,0 1442 BSF 42,0
141F BSF 1F,0 1443 BSF 43,0
1420 BSF 20,0 1444 BSF 44,0
1421 BSF 21,0 1445 BSF 45,0
1422 BSF 22,0 1446 BSF 46,0
1423 BSF 23,0 1447 BSF 47,0
1424 BSF 24,0 1448 BSF 48,0
1425 BSF 25,0 1449 BSF 49,0
1426 BSF 26,0 144A BSF 4A,0
1427 BSF 27,0 144B BSF 4B,0
1428 BSF 28,0 144C BSF 4C,0
1429 BSF 29,0 144D BSF 4D,0
142A BSF 2A,0 144E BSF 4E,0
142B BSF 2B,0 144F BSF 4F,0
142C BSF 2C,0 1485 BSF PORTA,1
142D BSF 2D,0 1486 BSF PORTB,1
142E BSF 2E,0 148C BSF 0C,1
142F BSF 2F,0 148D BSF 0D,1
1430 BSF 30,0 148E BSF 0E,1
1431 BSF 31,0 148F BSF 0F,1
1432 BSF 32,0 1490 BSF 10,1
1433 BSF 33,0 1491 BSF 11,1
1434 BSF 34,0 1492 BSF 12,1
1435 BSF 35,0 1493 BSF 13,1
1436 BSF 36,0 1494 BSF 14,1
1437 BSF 37,0 1495 BSF 15,1
1438 BSF 38,0 1496 BSF 16,1
1439 BSF 39,0 1497 BSF 17,1
143A BSF 3A,0 1498 BSF 18,1
143B BSF 3B,0 1499 BSF 19,1
143C BSF 3C,0 149A BSF 1A,1
143D BSF 3D,0 149B BSF 1B,1
143E BSF 3E,0 149C BSF 1C,1
143F BSF 3F,0 149D BSF 1D,1
1440 BSF 40,0 149E BSF 1E,1
314

149F BSF 1F,1 14C3 BSF 43,1


14A0 BSF 20,1 14C4 BSF 44,1
14A1 BSF 21,1 14C5 BSF 45,1
14A2 BSF 22,1 14C6 BSF 46,1
14A3 BSF 23,1 14C7 BSF 47,1
14A4 BSF 24,1 14C8 BSF 48,1
14A5 BSF 25,1 14C9 BSF 49,1
14A6 BSF 26,1 14CA BSF 4A,1
14A7 BSF 27,1 14CB BSF 4B,1
14A8 BSF 28,1 14CC BSF 4C,1
14A9 BSF 29,1 14CD BSF 4D,1
14AA BSF 2A,1 14CE BSF 4E,1
14AB BSF 2B,1 14CF BSF 4F,1
14AC BSF 2C,1 1505 BSF PORTA,2
14AD BSF 2D,1 1506 BSF PORTB,2
14AE BSF 2E,1 150C BSF 0C,2
14AF BSF 2F,1 150D BSF 0D,2
14B0 BSF 30,1 150E BSF 0E,2
14B1 BSF 31,1 150F BSF 0F,2
14B2 BSF 32,1 1510 BSF 10,2
14B3 BSF 33,1 1511 BSF 11,2
14B4 BSF 34,1 1512 BSF 12,2
14B5 BSF 35,1 1513 BSF 13,2
14B6 BSF 36,1 1514 BSF 14,2
14B7 BSF 37,1 1515 BSF 15,2
14B8 BSF 38,1 1516 BSF 16,2
14B9 BSF 39,1 1517 BSF 17,2
14BA BSF 3A,1 1518 BSF 18,2
14BB BSF 3B,1 1519 BSF 19,2
14BC BSF 3C,1 151A BSF 1A,2
14BD BSF 3D,1 151B BSF 1B,2
14BE BSF 3E,1 151C BSF 1C,2
14BF BSF 3F,1 151D BSF 1D,2
14C0 BSF 40,1 151E BSF 1E,2
14C1 BSF 41,1 151F BSF 1F,2
14C2 BSF 42,1 1520 BSF 20,2
315

1521 BSF 21,2 1545 BSF 45,2


1522 BSF 22,2 1546 BSF 46,2
1523 BSF 23,2 1547 BSF 47,2
1524 BSF 24,2 1548 BSF 48,2
1525 BSF 25,2 1549 BSF 49,2
1526 BSF 26,2 154A BSF 4A,2
1527 BSF 27,2 154B BSF 4B,2
1528 BSF 28,2 154C BSF 4C,2
1529 BSF 29,2 154D BSF 4D,2
152A BSF 2A,2 154E BSF 4E,2
152B BSF 2B,2 154F BSF 4F,2
152C BSF 2C,2 1585 BSF PORTA,3
152D BSF 2D,2 1586 BSF PORTB,3
152E BSF 2E,2 158B BSF INTCON,RBIE
152F BSF 2F,2 158C BSF 0C,3
1530 BSF 30,2 158D BSF 0D,3
1531 BSF 31,2 158E BSF 0E,3
1532 BSF 32,2 158F BSF 0F,3
1533 BSF 33,2 1590 BSF 10,3
1534 BSF 34,2 1591 BSF 11,3
1535 BSF 35,2 1592 BSF 12,3
1536 BSF 36,2 1593 BSF 13,3
1537 BSF 37,2 1594 BSF 14,3
1538 BSF 38,2 1595 BSF 15,3
1539 BSF 39,2 1596 BSF 16,3
153A BSF 3A,2 1597 BSF 17,3
153B BSF 3B,2 1598 BSF 18,3
153C BSF 3C,2 1599 BSF 19,3
153D BSF 3D,2 159A BSF 1A,3
153E BSF 3E,2 159B BSF 1B,3
153F BSF 3F,2 159C BSF 1C,3
1540 BSF 40,2 159D BSF 1D,3
1541 BSF 41,2 159E BSF 1E,3
1542 BSF 42,2 159F BSF 1F,3
1543 BSF 43,2 15A0 BSF 20,3
1544 BSF 44,2 15A1 BSF 21,3
316

15A2 BSF 22 ,3 15C6 BSF 46,3


15A3 BSF 23,3 15C7 BSF 47,3
15A4 BSF 24,3 15C8 BSF 48,3
15A5 BSF 25,3 15C9 BSF 49,3
15A6 BSF 26,3 15CA BSF 4A,3
15A7 BSF 27,3 15CB BSF 4B,3
15A8 BSF 28,3 15CC BSF 4C,3
15A9 BSF 29,3 15CD BSF 4D,3
15AA BSF 2A,3 15CE BSF 4E,3
15AB BSF 2B,3 15CF BSF 4F,3
15AC BSF 2C,3 1605 BSF PORTA,4
15AD BSF 2D,3 1606 BSF PORTB,4
15AE BSF 2E,3 160B BSF INTCON,INTE
15AF BSF 2F,3 160C BSF 0C,4
15B0 BSF 30,3 160D BSF 0D,4
15B1 BSF 31,3 160E BSF 0E,4
15B2 BSF 32,3 160F BSF 0F,4
15B3 BSF 33,3 1610 BSF 10,4
15B4 BSF 34,3 1611 BSF 11,4
15B5 BSF 35,3 1612 BSF 12,4
15B6 BSF 36,3 1613 BSF 13,4
15B7 BSF 37,3 1614 BSF 14,4
15B8 BSF 38,3 1615 BSF 15,4
15B9 BSF 39,3 1616 BSF 16,4
15BA BSF 3A,3 1617 BSF 17,4
15BB BSF 3B,3 1618 BSF 18,4
15BC BSF 3C,3 1619 BSF 19,4
15BD BSF 3D,3 161A BSF 1A,4
15BE BSF 3E,3 161B BSF 1B,4
15BF BSF 3F,3 161C BSF 1C,4
15C0 BSF 40,3 161D BSF 1D,4
15C1 BSF 41,3 161E BSF 1E,4
15C2 BSF 42,3 161F BSF 1F,4
15C3 BSF 43,3 1620 BSF 20,4
15C4 BSF 44,3 1621 BSF 21,4
15C5 BSF 45,3 1622 BSF 22,4
317

1623 BSF 23,4 1647 BSF 47,4


1624 BSF 24,4 1648 BSF 48,4
1625 BSF 25,4 1649 BSF 49,4
1626 BSF 26,4 164A BSF 4A,4
1627 BSF 27,4 164B BSF 4B,4
1628 BSF 28,4 164C BSF 4C,4
1629 BSF 29,4 164D BSF 4D,4
162A BSF 2A,4 164E BSF 4E,4
162B BSF 2B,4 164F BSF 4F,4
162C BSF 2C,4 1683 BSF STATUS,RP0
162D BSF 2D,4 1685 BSF PORTA,5
162E BSF 2E,4 1686 BSF PORTB,5
162F BSF 2F,4 168B BSF INTCON,T0IE
1630 BSF 30,4 168C BSF 0C,5
1631 BSF 31,4 168D BSF 0D,5
1632 BSF 32,4 168E BSF 0E,5
1633 BSF 33,4 168F BSF 0F,5
1634 BSF 34,4 1690 BSF 10,5
1635 BSF 35,4 1691 BSF 11,5
1636 BSF 36,4 1692 BSF 12,5
1637 BSF 37,4 1693 BSF 13,5
1638 BSF 38,4 1694 BSF 14,5
1639 BSF 39,4 1695 BSF 15,5
163A BSF 3A,4 1696 BSF 16,5
163B BSF 3B,4 1697 BSF 17,5
163C BSF 3C,4 1698 BSF 18,5
163D BSF 3D,4 1699 BSF 19,5
163E BSF 3E,4 169A BSF 1A,5
163F BSF 3F,4 169B BSF 1B,5
1640 BSF 40,4 169C BSF 1C,5
1641 BSF 41,4 169D BSF 1D,5
1642 BSF 42,4 169E BSF 1E,5
1643 BSF 43,4 169F BSF 1F,5
1644 BSF 44,4 16A0 BSF 20,5
1645 BSF 45,4 16A1 BSF 21,5
1646 BSF 46,4 16A2 BSF 22,5
318

16A3 BSF 23,5 16C7 BSF 47,5


16A4 BSF 24,5 16C8 BSF 48,5
16A5 BSF 25,5 16C9 BSF 49,5
16A6 BSF 26,5 16CA BSF 4A,5
16A7 BSF 27,5 16CB BSF 4B,5
16A8 BSF 28,5 16CC BSF 4C,5
16A9 BSF 29,5 16CD BSF 4D,5
16AA BSF 2A,5 16CE BSF 4E,5
16AB BSF 2B,5 16CF BSF 4F,5
16AC BSF 2C,5 1705 BSF PORTA,6
16AD BSF 2D,5 1706 BSF PORTB,6
16AE BSF 2E,5 170B BSF INTCON,EEIE
16AF BSF 2F,5 170C BSF 0C,6
16B0 BSF 30,5 170D BSF 0D,6
16B1 BSF 31,5 170E BSF 0E,6
16B2 BSF 32,5 170F BSF 0F,6
16B3 BSF 33,5 1710 BSF 10,6
16B4 BSF 34,5 1711 BSF 11,6
16B5 BSF 35,5 1712 BSF 12,6
16B6 BSF 36,5 1713 BSF 13,6
16B7 BSF 37,5 1714 BSF 14,6
16B8 BSF 38,5 1715 BSF 15,6
16B9 BSF 39,5 1716 BSF 16,6
16BA BSF 3A,5 1717 BSF 17,6
16BB BSF 3B,5 1718 BSF 18,6
16BC BSF 3C,5 1719 BSF 19,6
16BD BSF 3D,5 171A BSF 1A,6
16BE BSF 3E,5 171B BSF 1B,6
16BF BSF 3F,5 171C BSF 1C,6
16C0 BSF 40,5 171D BSF 1D,6
16C1 BSF 41,5 171E BSF 1E,6
16C2 BSF 42,5 171F BSF 1F,6
16C3 BSF 43,5 1720 BSF 20,6
16C4 BSF 44,5 1721 BSF 21,6
16C5 BSF 45,5 1722 BSF 22,6
16C6 BSF 46,5 1723 BSF 23,6
319

1724 BSF 24,6 1748 BSF 48,6


1725 BSF 25,6 1749 BSF 49,6
1726 BSF 26,6 174A BSF 4A,6
1727 BSF 27,6 174B BSF 4B,6
1728 BSF 28,6 174C BSF 4C,6
1729 BSF 29,6 174D BSF 4D,6
172A BSF 2A,6 174E BSF 4E,6
172B BSF 2B,6 174F BSF 4F,6
172C BSF 2C,6 1785 BSF PORTA,7
172D BSF 2D,6 1786 BSF PORTB,7
172E BSF 2E,6 178B BSF INTCON,GIE
172F BSF 2F,6 178C BSF 0C,7
1730 BSF 30,6 178D BSF 0D,7
1731 BSF 31,6 178E BSF 0E,7
1732 BSF 32,6 178F BSF 0F,7
1733 BSF 33,6 1790 BSF 10,7
1734 BSF 34,6 1791 BSF 11,7
1735 BSF 35,6 1792 BSF 12,7
1736 BSF 36,6 1793 BSF 13,7
1737 BSF 37,6 1794 BSF 14,7
1738 BSF 38,6 1795 BSF 15,7
1739 BSF 39,6 1796 BSF 16,7
173A BSF 3A,6 1797 BSF 17,7
173B BSF 3B,6 1798 BSF 18,7
173C BSF 3C,6 1799 BSF 19,7
173D BSF 3D,6 179A BSF 1A,7
173E BSF 3E,6 179B BSF 1B,7
173F BSF 3F,6 179C BSF 1C,7
1740 BSF 40,6 179D BSF 1D,7
1741 BSF 41,6 179E BSF 1E,7
1742 BSF 42,6 179F BSF 1F,7
1743 BSF 43,6 17A0 BSF 20,7
1744 BSF 44,6 17A1 BSF 21,7
1745 BSF 45,6 17A2 BSF 22,7
1746 BSF 46,6 17A3 BSF 23,7
1747 BSF 47,6 17A4 BSF 24,7
320

17A5 BSF 25,7 17C9 BSF 49,7


17A6 BSF 26,7 17CA BSF 4A,7
17A7 BSF 27,7 17CB BSF 4B,7
17A8 BSF 28,7 17CC BSF 4C,7
17A9 BSF 29,7 17CD BSF 4D,7
17AA BSF 2A,7 17CE BSF 4E,7
17AB BSF 2B,7 17CF BSF 4F,7
17AC BSF 2C,7 1803 BTFSC STATUS,C
17AD BSF 2D,7 1805 BTFSC PORTA,0
17AE BSF 2E,7 1806 BTFSC PORTB,0
17AF BSF 2F,7 180B BTFSC INTCON,0
17B0 BSF 30,7 180C BTFSC 0C,0
17B1 BSF 31,7 180D BTFSC 0D,0
17B2 BSF 32,7 180E BTFSC 0E,0
17B3 BSF 33,7 180F BTFSC 0F,0
17B4 BSF 34,7 1810 BTFSC 10,0
17B5 BSF 35,7 1811 BTFSC 11,0
17B6 BSF 36,7 1812 BTFSC 12,0
17B7 BSF 37,7 1813 BTFSC 13,0
17B8 BSF 38,7 1814 BTFSC 14,0
17B9 BSF 39,7 1815 BTFSC 15,0
17BA BSF 3A,7 1816 BTFSC 16,0
17BB BSF 3B,7 1817 BTFSC 17,0
17BC BSF 3C,7 1818 BTFSC 18,0
17BD BSF 3D,7 1819 BTFSC 19,0
17BE BSF 3E,7 181A BTFSC 1A,0
17BF BSF 3F,7 181B BTFSC 1B,0
17C0 BSF 40,7 181C BTFSC 1C,0
17C1 BSF 41,7 181D BTFSC 1D,0
17C2 BSF 42,7 181E BTFSC 1E,0
17C3 BSF 43,7 181F BTFSC 1F,0
17C4 BSF 44,7 1820 BTFSC 20,0
17C5 BSF 45,7 1821 BTFSC 21,0
17C6 BSF 46,7 1822 BTFSC 22,0
17C7 BSF 47,7 1823 BTFSC 23,0
17C8 BSF 48,7 1824 BTFSC 24,0
321

1825 BTFSC 25,0 1849 BTFSC 49,0


1826 BTFSC 26,0 184A BTFSC 4A,0
1827 BTFSC 27,0 184B BTFSC 4B,0
1828 BTFSC 28,0 184C BTFSC 4C,0
1829 BTFSC 29,0 184D BTFSC 4D,0
182A BTFSC 2A,0 184E BTFSC 4E,0
182B BTFSC 2B,0 184F BTFSC 4F,0
182C BTFSC 2C,0 1883 BTFSC STATUS,DC
182D BTFSC 2D,0 1885 BTFSC PORTA,1
182E BTFSC 2E,0 1886 BTFSC PORTB,1
182F BTFSC 2F,0 188B BTFSC INTCON,INTF
1830 BTFSC 30,0 188C BTFSC 0C,1
1831 BTFSC 31,0 188D BTFSC 0D,1
1832 BTFSC 32,0 188E BTFSC 0E,1
1833 BTFSC 33,0 188F BTFSC 0F,1
1834 BTFSC 34,0 1890 BTFSC 10,1
1835 BTFSC 35,0 1891 BTFSC 11,1
1836 BTFSC 36,0 1892 BTFSC 12,1
1837 BTFSC 37,0 1893 BTFSC 13,1
1838 BTFSC 38,0 1894 BTFSC 14,1
1839 BTFSC 39,0 1895 BTFSC 15,1
183A BTFSC 3A,0 1896 BTFSC 16,1
183B BTFSC 3B,0 1897 BTFSC 17,1
183C BTFSC 3C,0 1898 BTFSC 18,1
183D BTFSC 3D,0 1899 BTFSC 19,1
183E BTFSC 3E,0 189A BTFSC 1A,1
183F BTFSC 3F,0 189B BTFSC 1B,1
1840 BTFSC 40,0 189C BTFSC 1C,1
1841 BTFSC 41,0 189D BTFSC 1D,1
1842 BTFSC 42,0 189E BTFSC 1E,1
1843 BTFSC 43,0 189F BTFSC 1F,1
1844 BTFSC 44,0 18A0 BTFSC 20,1
1845 BTFSC 45,0 18A1 BTFSC 21,1
1846 BTFSC 46,0 18A2 BTFSC 22,1
1847 BTFSC 47,0 18A3 BTFSC 23,1
1848 BTFSC 48,0 18A4 BTFSC 24,1
322

18A5 BTFSC 25,1 18C9 BTFSC 49,1


18A6 BTFSC 26,1 18CA BTFSC 4A,1
18A7 BTFSC 27,1 18CB BTFSC 4B,1
18A8 BTFSC 28,1 18CC BTFSC 4C,1
18A9 BTFSC 29,1 18CD BTFSC 4D,1
18AA BTFSC 2A,1 18CE BTFSC 4E,1
18AB BTFSC 2B,1 18CF BTFSC 4F,1
18AC BTFSC 2C,1 1903 BTFSC STATUS,Z
18AD BTFSC 2D,1 1905 BTFSC PORTA,2
18AE BTFSC 2E,1 1906 BTFSC PORTB,2
18AF BTFSC 2F,1 190B BTFSC INTCON,T0IF
18B0 BTFSC 30,1 190C BTFSC 0C,2
18B1 BTFSC 31,1 190D BTFSC 0D,2
18B2 BTFSC 32,1 190E BTFSC 0E,2
18B3 BTFSC 33,1 190F BTFSC 0F,2
18B4 BTFSC 34,1 1910 BTFSC 10,2
18B5 BTFSC 35,1 1911 BTFSC 11,2
18B6 BTFSC 36,1 1912 BTFSC 12,2
18B7 BTFSC 37,1 1913 BTFSC 13,2
18B8 BTFSC 38,1 1914 BTFSC 14,2
18B9 BTFSC 39,1 1915 BTFSC 15,2
18BA BTFSC 3A,1 1916 BTFSC 16,2
18BB BTFSC 3B,1 1917 BTFSC 17,2
18BC BTFSC 3C,1 1918 BTFSC 18,2
18BD BTFSC 3D,1 1919 BTFSC 19,2
18BE BTFSC 3E,1 191A BTFSC 1A,2
18BF BTFSC 3F,1 191B BTFSC 1B,2
18C0 BTFSC 40,1 191C BTFSC 1C,2
18C1 BTFSC 41,1 191D BTFSC 1D,2
18C2 BTFSC 42,1 191E BTFSC 1E,2
18C3 BTFSC 43,1 191F BTFSC 1F,2
18C4 BTFSC 44,1 1920 BTFSC 20,2
18C5 BTFSC 45,1 1921 BTFSC 21,2
18C6 BTFSC 46,1 1922 BTFSC 22,2
18C7 BTFSC 47,1 1923 BTFSC 23,2
18C8 BTFSC 48,1 1924 BTFSC 24,2
323

1925 BTFSC 25,2 1949 BTFSC 49,2


1926 BTFSC 26,2 194A BTFSC 4A,2
1927 BTFSC 27,2 194B BTFSC 4B,2
1928 BTFSC 28,2 194C BTFSC 4C,2
1929 BTFSC 29,2 194D BTFSC 4D,2
192A BTFSC 2A,2 194E BTFSC 4E,2
192B BTFSC 2B,2 194F BTFSC 4F,2
192C BTFSC 2C,2 1983 BTFSC STATUS,PD
192D BTFSC 2D,2 1985 BTFSC PORTA,3
192E BTFSC 2E,2 1986 BTFSC PORTB,3
192F BTFSC 2F,2 198B BTFSC INTCON,RBIE
1930 BTFSC 30,2 198C BTFSC 0C,3
1931 BTFSC 31,2 198D BTFSC 0D,3
1932 BTFSC 32,2 198E BTFSC 0E,3
1933 BTFSC 33,2 198F BTFSC 0F,3
1934 BTFSC 34,2 1990 BTFSC 10,3
1935 BTFSC 35,2 1991 BTFSC 11,3
1936 BTFSC 36,2 1992 BTFSC 12,3
1937 BTFSC 37,2 1993 BTFSC 13,3
1938 BTFSC 38,2 1994 BTFSC 14,3
1939 BTFSC 39,2 1995 BTFSC 15,3
193A BTFSC 3A,2 1996 BTFSC 16,3
193B BTFSC 3B,2 1997 BTFSC 17,3
193C BTFSC 3C,2 1998 BTFSC 18,3
193D BTFSC 3D,2 1999 BTFSC 19,3
193E BTFSC 3E,2 199A BTFSC 1A,3
193F BTFSC 3F,2 199B BTFSC 1B,3
1940 BTFSC 40,2 199C BTFSC 1C,3
1941 BTFSC 41,2 199D BTFSC 1D,3
1942 BTFSC 42,2 199E BTFSC 1E,3
1943 BTFSC 43,2 199F BTFSC 1F,3
1944 BTFSC 44,2 19A0 BTFSC 20,3
1945 BTFSC 45,2 19A1 BTFSC 21,3
1946 BTFSC 46,2 19A2 BTFSC 22 ,3
1947 BTFSC 47,2 19A3 BTFSC 23,3
1948 BTFSC 48,2 19A4 BTFSC 24,3
324

19A5 BTFSC 25,3 19C9 BTFSC 49,3


19A6 BTFSC 26,3 19CA BTFSC 4A,3
19A7 BTFSC 27,3 19CB BTFSC 4B,3
19A8 BTFSC 28,3 19CC BTFSC 4C,3
19A9 BTFSC 29,3 19CD BTFSC 4D,3
19AA BTFSC 2A,3 19CE BTFSC 4E,3
19AB BTFSC 2B,3 19CF BTFSC 4F,3
19AC BTFSC 2C,3 1A03 BTFSC STATUS,TO
19AD BTFSC 2D,3 1A05 BTFSC PORTA,4
19AE BTFSC 2E,3 1A06 BTFSC PORTB,4
19AF BTFSC 2F,3 1A0B BTFSC INTCON,INTE
19B0 BTFSC 30,3 1A0C BTFSC 0C,4
19B1 BTFSC 31,3 1A0D BTFSC 0D,4
19B2 BTFSC 32,3 1A0E BTFSC 0E,4
19B3 BTFSC 33,3 1A0F BTFSC 0F,4
19B4 BTFSC 34,3 1A10 BTFSC 10,4
19B5 BTFSC 35,3 1A11 BTFSC 11,4
19B6 BTFSC 36,3 1A12 BTFSC 12,4
19B7 BTFSC 37,3 1A13 BTFSC 13,4
19B8 BTFSC 38,3 1A14 BTFSC 14,4
19B9 BTFSC 39,3 1A15 BTFSC 15,4
19BA BTFSC 3A,3 1A16 BTFSC 16,4
19BB BTFSC 3B,3 1A17 BTFSC 17,4
19BC BTFSC 3C,3 1A18 BTFSC 18,4
19BD BTFSC 3D,3 1A19 BTFSC 19,4
19BE BTFSC 3E,3 1A1A BTFSC 1A,4
19BF BTFSC 3F,3 1A1B BTFSC 1B,4
19C0 BTFSC 40,3 1A1C BTFSC 1C,4
19C1 BTFSC 41,3 1A1D BTFSC 1D,4
19C2 BTFSC 42,3 1A1E BTFSC 1E,4
19C3 BTFSC 43,3 1A1F BTFSC 1F,4
19C4 BTFSC 44,3 1A20 BTFSC 20,4
19C5 BTFSC 45,3 1A21 BTFSC 21,4
19C6 BTFSC 46,3 1A22 BTFSC 22 ,4
19C7 BTFSC 47,3 1A23 BTFSC 23,4
19C8 BTFSC 48,3 1A24 BTFSC 24,4
325

1A25 BTFSC 25,4 1A49 BTFSC 49,4


1A26 BTFSC 26,4 1A4A BTFSC 4A,4
1A27 BTFSC 27,4 1A4B BTFSC 4B,4
1A28 BTFSC 28,4 1A4C BTFSC 4C,4
1A29 BTFSC 29,4 1A4D BTFSC 4D,4
1A2A BTFSC 2A,4 1A4E BTFSC 4E,4
1A2B BTFSC 2B,4 1A4F BTFSC 4F,4
1A2C BTFSC 2C,4 1A83 BTFSC STATUS,RP0
1A2D BTFSC 2D,4 1A85 BTFSC PORTA,5
1A2E BTFSC 2E,4 1A86 BTFSC PORTB,5
1A2F BTFSC 2F,4 1A8B BTFSC INTCON,T0IE
1A30 BTFSC 30,4 1A8C BTFSC 0C,5
1A31 BTFSC 31,4 1A8D BTFSC 0D,5
1A32 BTFSC 32,4 1A8E BTFSC 0E,5
1A33 BTFSC 33,4 1A8F BTFSC 0F,5
1A34 BTFSC 34,4 1A90 BTFSC 10,5
1A35 BTFSC 35,4 1A91 BTFSC 11,5
1A36 BTFSC 36,4 1A92 BTFSC 12,5
1A37 BTFSC 37,4 1A93 BTFSC 13,5
1A38 BTFSC 38,4 1A94 BTFSC 14,5
1A39 BTFSC 39,4 1A95 BTFSC 15,5
1A3A BTFSC 3A,4 1A96 BTFSC 16,5
1A3B BTFSC 3B,4 1A97 BTFSC 17,5
1A3C BTFSC 3C,4 1A98 BTFSC 18,5
1A3D BTFSC 3D,4 1A99 BTFSC 19,5
1A3E BTFSC 3E,4 1A9A BTFSC 1A,5
1A3F BTFSC 3F,4 1A9B BTFSC 1B,5
1A40 BTFSC 40,4 1A9C BTFSC 1C,5
1A41 BTFSC 41,4 1A9D BTFSC 1D,5
1A42 BTFSC 42,4 1A9E BTFSC 1E,5
1A43 BTFSC 43,4 1A9F BTFSC 1F,5
1A44 BTFSC 44,4 1AA0 BTFSC 20,5
1A45 BTFSC 45,4 1AA1 BTFSC 21,5
1A46 BTFSC 46,4 1AA2 BTFSC 22,5
1A47 BTFSC 47,4 1AA3 BTFSC 23,5
1A48 BTFSC 48,4 1AA4 BTFSC 24,5
326

1AA5 BTFSC 25,5 1AC9 BTFSC 49,5


1AA6 BTFSC 26,5 1ACA BTFSC 4A,5
1AA7 BTFSC 27,5 1ACB BTFSC 4B,5
1AA8 BTFSC 28,5 1ACC BTFSC 4C,5
1AA9 BTFSC 29,5 1ACD BTFSC 4D,5
1AAA BTFSC 2A,5 1ACE BTFSC 4E,5
1AAB BTFSC 2B,5 1ACF BTFSC 4F,5
1AAC BTFSC 2C,5 1B05 BTFSC PORTA,6
1AAD BTFSC 2D,5 1B06 BTFSC PORTB,6
1AAE BTFSC 2E,5 1B0B BTFSC INTCON,EEIE
1AAF BTFSC 2F,5 1B0C BTFSC 0C,6
1AB0 BTFSC 30,5 1B0D BTFSC 0D,6
1AB1 BTFSC 31,5 1B0E BTFSC 0E,6
1AB2 BTFSC 32,5 1B0F BTFSC 0F,6
1AB3 BTFSC 33,5 1B10 BTFSC 10,6
1AB4 BTFSC 34,5 1B11 BTFSC 11,6
1AB5 BTFSC 35,5 1B12 BTFSC 12,6
1AB6 BTFSC 36,5 1B13 BTFSC 13,6
1AB7 BTFSC 37,5 1B14 BTFSC 14,6
1AB8 BTFSC 38,5 1B15 BTFSC 15,6
1AB9 BTFSC 39,5 1B16 BTFSC 16,6
1ABA BTFSC 3A,5 1B17 BTFSC 17,6
1ABB BTFSC 3B,5 1B18 BTFSC 18,6
1ABC BTFSC 3C,5 1B19 BTFSC 19,6
1ABD BTFSC 3D,5 1B1A BTFSC 1A,6
1ABE BTFSC 3E,5 1B1B BTFSC 1B,6
1ABF BTFSC 3F,5 1B1C BTFSC 1C,6
1AC0 BTFSC 40,5 1B1D BTFSC 1D,6
1AC1 BTFSC 41,5 1B1E BTFSC 1E,6
1AC2 BTFSC 42,5 1B1F BTFSC 1F,6
1AC3 BTFSC 43,5 1B20 BTFSC 20,6
1AC4 BTFSC 44,5 1B21 BTFSC 21,6
1AC5 BTFSC 45,5 1B22 BTFSC 22,6
1AC6 BTFSC 46,5 1B23 BTFSC 23,6
1AC7 BTFSC 47,5 1B24 BTFSC 24,6
1AC8 BTFSC 48,5 1B25 BTFSC 25,6
327

1B26 BTFSC 26,6 1B4A BTFSC 4A,6


1B27 BTFSC 27,6 1B4B BTFSC 4B,6
1B28 BTFSC 28,6 1B4C BTFSC 4C,6
1B29 BTFSC 29,6 1B4D BTFSC 4D,6
1B2A BTFSC 2A,6 1B4E BTFSC 4E,6
1B2B BTFSC 2B,6 1B4F BTFSC 4F,6
1B2C BTFSC 2C,6 1B85 BTFSC PORTA,7
1B2D BTFSC 2D,6 1B86 BTFSC PORTB,7
1B2E BTFSC 2E,6 1B8B BTFSC INTCON,GIE
1B2F BTFSC 2F,6 1B8C BTFSC 0C,7
1B30 BTFSC 30,6 1B8D BTFSC 0D,7
1B31 BTFSC 31,6 1B8E BTFSC 0E,7
1B32 BTFSC 32,6 1B8F BTFSC 0F,7
1B33 BTFSC 33,6 1B90 BTFSC 10,7
1B34 BTFSC 34,6 1B91 BTFSC 11,7
1B35 BTFSC 35,6 1B92 BTFSC 12,7
1B36 BTFSC 36,6 1B93 BTFSC 13,7
1B37 BTFSC 37,6 1B94 BTFSC 14,7
1B38 BTFSC 38,6 1B95 BTFSC 15,7
1B39 BTFSC 39,6 1B96 BTFSC 16,7
1B3A BTFSC 3A,6 1B97 BTFSC 17,7
1B3B BTFSC 3B,6 1B98 BTFSC 18,7
1B3C BTFSC 3C,6 1B99 BTFSC 19,7
1B3D BTFSC 3D,6 1B9A BTFSC 1A,7
1B3E BTFSC 3E,6 1B9B BTFSC 1B,7
1B3F BTFSC 3F,6 1B9C BTFSC 1C,7
1B40 BTFSC 40,6 1B9D BTFSC 1D,7
1B41 BTFSC 41,6 1B9E BTFSC 1E,7
1B42 BTFSC 42,6 1B9F BTFSC 1F,7
1B43 BTFSC 43,6 1BA0 BTFSC 20,7
1B44 BTFSC 44,6 1BA1 BTFSC 21,7
1B45 BTFSC 45,6 1BA2 BTFSC 22,7
1B46 BTFSC 46,6 1BA3 BTFSC 23,7
1B47 BTFSC 47,6 1BA4 BTFSC 24,7
1B48 BTFSC 48,6 1BA5 BTFSC 25,7
1B49 BTFSC 49,6 1BA6 BTFSC 26,7
328

1BA7 BTFSC 27,7 1BCB BTFSC 4B,7


1BA8 BTFSC 28,7 1BCC BTFSC 4C,7
1BA9 BTFSC 29,7 1BCD BTFSC 4D,7
1BAA BTFSC 2A,7 1BCE BTFSC 4E,7
1BAB BTFSC 2B,7 1BCF BTFSC 4F,7
1BAC BTFSC 2C,7 1C03 BTFSS STATUS,C
1BAD BTFSC 2D,7 1C05 BTFSS PORTA,0
1BAE BTFSC 2E,7 1C06 BTFSS PORTB,0
1BAF BTFSC 2F,7 1C0B BTFSS INTCON,0
1BB0 BTFSC 30,7 1C0C BTFSS 0C,0
1BB1 BTFSC 31,7 1C0D BTFSS 0D,0
1BB2 BTFSC 32,7 1C0E BTFSS 0E,0
1BB3 BTFSC 33,7 1C0F BTFSS 0F,0
1BB4 BTFSC 34,7 1C10 BTFSS 10,0
1BB5 BTFSC 35,7 1C11 BTFSS 11,0
1BB6 BTFSC 36,7 1C12 BTFSS 12,0
1BB7 BTFSC 37,7 1C13 BTFSS 13,0
1BB8 BTFSC 38,7 1C14 BTFSS 14,0
1BB9 BTFSC 39,7 1C15 BTFSS 15,0
1BBA BTFSC 3A,7 1C16 BTFSS 16,0
1BBB BTFSC 3B,7 1C17 BTFSS 17,0
1BBC BTFSC 3C,7 1C18 BTFSS 18,0
1BBD BTFSC 3D,7 1C19 BTFSS 19,0
1BBE BTFSC 3E,7 1C1A BTFSS 1A,0
1BBF BTFSC 3F,7 1C1B BTFSS 1B,0
1BC0 BTFSC 40,7 1C1C BTFSS 1C,0
1BC1 BTFSC 41,7 1C1D BTFSS 1D,0
1BC2 BTFSC 42,7 1C1E BTFSS 1E,0
1BC3 BTFSC 43,7 1C1F BTFSS 1F,0
1BC4 BTFSC 44,7 1C20 BTFSS 20,0
1BC5 BTFSC 45,7 1C21 BTFSS 21,0
1BC6 BTFSC 46,7 1C22 BTFSS 22,0
1BC7 BTFSC 47,7 1C23 BTFSS 23,0
1BC8 BTFSC 48,7 1C24 BTFSS 24,0
1BC9 BTFSC 49,7 1C25 BTFSS 25,0
1BCA BTFSC 4A,7 1C26 BTFSS 26,0
329

1C27 BTFSS 27,0 1C4B BTFSS 4B,0


1C28 BTFSS 28,0 1C4C BTFSS 4C,0
1C29 BTFSS 29,0 1C4D BTFSS 4D,0
1C2A BTFSS 2A,0 1C4E BTFSS 4E,0
1C2B BTFSS 2B,0 1C4F BTFSS 4F,0
1C2C BTFSS 2C,0 1C83 BTFSS STATUS,DC
1C2D BTFSS 2D,0 1C85 BTFSS PORTA,1
1C2E BTFSS 2E,0 1C86 BTFSS PORTB,1
1C2F BTFSS 2F,0 1C8B BTFSS INTCON,INTF
1C30 BTFSS 30,0 1C8C BTFSS 0C,1
1C31 BTFSS 31,0 1C8D BTFSS 0D,1
1C32 BTFSS 32,0 1C8E BTFSS 0E,1
1C33 BTFSS 33,0 1C8F BTFSS 0F,1
1C34 BTFSS 34,0 1C90 BTFSS 10,1
1C35 BTFSS 35,0 1C91 BTFSS 11,1
1C36 BTFSS 36,0 1C92 BTFSS 12,1
1C37 BTFSS 37,0 1C93 BTFSS 13,1
1C38 BTFSS 38,0 1C94 BTFSS 14,1
1C39 BTFSS 39,0 1C95 BTFSS 15,1
1C3A BTFSS 3A,0 1C96 BTFSS 16,1
1C3B BTFSS 3B,0 1C97 BTFSS 17,1
1C3C BTFSS 3C,0 1C98 BTFSS 18,1
1C3D BTFSS 3D,0 1C99 BTFSS 19,1
1C3E BTFSS 3E,0 1C9A BTFSS 1A,1
1C3F BTFSS 3F,0 1C9B BTFSS 1B,1
1C40 BTFSS 40,0 1C9C BTFSS 1C,1
1C41 BTFSS 41,0 1C9D BTFSS 1D,1
1C42 BTFSS 42,0 1C9E BTFSS 1E,1
1C43 BTFSS 43,0 1C9F BTFSS 1F,1
1C44 BTFSS 44,0 1CA0 BTFSS 20,1
1C45 BTFSS 45,0 1CA1 BTFSS 21,1
1C46 BTFSS 46,0 1CA2 BTFSS 22,1
1C47 BTFSS 47,0 1CA3 BTFSS 23,1
1C48 BTFSS 48,0 1CA4 BTFSS 24,1
1C49 BTFSS 49,0 1CA5 BTFSS 25,1
1C4A BTFSS 4A,0 1CA6 BTFSS 26,1
330

1CA7 BTFSS 27,1 1CCB BTFSS 4B,1


1CA8 BTFSS 28,1 1CCC BTFSS 4C,1
1CA9 BTFSS 29,1 1CCD BTFSS 4D,1
1CAA BTFSS 2A,1 1CCE BTFSS 4E,1
1CAB BTFSS 2B,1 1CCF BTFSS 4F,1
1CAC BTFSS 2C,1 1D03 BTFSS STATUS,Z
1CAD BTFSS 2D,1 1D05 BTFSS PORTA,2
1CAE BTFSS 2E,1 1D06 BTFSS PORTB,2
1CAF BTFSS 2F,1 1D0B BTFSS INTCON,T0IF
1CB0 BTFSS 30,1 1D0C BTFSS 0C,2
1CB1 BTFSS 31,1 1D0D BTFSS 0D,2
1CB2 BTFSS 32,1 1D0E BTFSS 0E,2
1CB3 BTFSS 33,1 1D0F BTFSS 0F,2
1CB4 BTFSS 34,1 1D10 BTFSS 10,2
1CB5 BTFSS 35,1 1D11 BTFSS 11,2
1CB6 BTFSS 36,1 1D12 BTFSS 12,2
1CB7 BTFSS 37,1 1D13 BTFSS 13,2
1CB8 BTFSS 38,1 1D14 BTFSS 14,2
1CB9 BTFSS 39,1 1D15 BTFSS 15,2
1CBA BTFSS 3A,1 1D16 BTFSS 16,2
1CBB BTFSS 3B,1 1D17 BTFSS 17,2
1CBC BTFSS 3C,1 1D18 BTFSS 18,2
1CBD BTFSS 3D,1 1D19 BTFSS 19,2
1CBE BTFSS 3E,1 1D1A BTFSS 1A,2
1CBF BTFSS 3F,1 1D1B BTFSS 1B,2
1CC0 BTFSS 40,1 1D1C BTFSS 1C,2
1CC1 BTFSS 41,1 1D1D BTFSS 1D,2
1CC2 BTFSS 42,1 1D1E BTFSS 1E,2
1CC3 BTFSS 43,1 1D1F BTFSS 1F,2
1CC4 BTFSS 44,1 1D20 BTFSS 20,2
1CC5 BTFSS 45,1 1D21 BTFSS 21,2
1CC6 BTFSS 46,1 1D22 BTFSS 22,2
1CC7 BTFSS 47,1 1D23 BTFSS 23,2
1CC8 BTFSS 48,1 1D24 BTFSS 24,2
1CC9 BTFSS 49,1 1D25 BTFSS 25,2
1CCA BTFSS 4A,1 1D26 BTFSS 26,2
331

1D27 BTFSS 27,2 1D4B BTFSS 4B,2


1D28 BTFSS 28,2 1D4C BTFSS 4C,2
1D29 BTFSS 29,2 1D4D BTFSS 4D,2
1D2A BTFSS 2A,2 1D4E BTFSS 4E,2
1D2B BTFSS 2B,2 1D4F BTFSS 4F,2
1D2C BTFSS 2C,2 1D83 BTFSS STATUS,PD
1D2D BTFSS 2D,2 1D85 BTFSS PORTA,3
1D2E BTFSS 2E,2 1D86 BTFSS PORTB,3
1D2F BTFSS 2F,2 1D8B BTFSS INTCON,RBIE
1D30 BTFSS 30,2 1D8C BTFSS 0C,3
1D31 BTFSS 31,2 1D8D BTFSS 0D,3
1D32 BTFSS 32,2 1D8E BTFSS 0E,3
1D33 BTFSS 33,2 1D8F BTFSS 0F,3
1D34 BTFSS 34,2 1D90 BTFSS 10,3
1D35 BTFSS 35,2 1D91 BTFSS 11,3
1D36 BTFSS 36,2 1D92 BTFSS 12,3
1D37 BTFSS 37,2 1D93 BTFSS 13,3
1D38 BTFSS 38,2 1D94 BTFSS 14,3
1D39 BTFSS 39,2 1D95 BTFSS 15,3
1D3A BTFSS 3A,2 1D96 BTFSS 16,3
1D3B BTFSS 3B,2 1D97 BTFSS 17,3
1D3C BTFSS 3C,2 1D98 BTFSS 18,3
1D3D BTFSS 3D,2 1D99 BTFSS 19,3
1D3E BTFSS 3E,2 1D9A BTFSS 1A,3
1D3F BTFSS 3F,2 1D9B BTFSS 1B,3
1D40 BTFSS 40,2 1D9C BTFSS 1C,3
1D41 BTFSS 41,2 1D9D BTFSS 1D,3
1D42 BTFSS 42,2 1D9E BTFSS 1E,3
1D43 BTFSS 43,2 1D9F BTFSS 1F,3
1D44 BTFSS 44,2 1DA0 BTFSS 20,3
1D45 BTFSS 45,2 1DA1 BTFSS 21,3
1D46 BTFSS 46,2 1DA2 BTFSS 22 ,3
1D47 BTFSS 47,2 1DA3 BTFSS 23,3
1D48 BTFSS 48,2 1DA4 BTFSS 24,3
1D49 BTFSS 49,2 1DA5 BTFSS 25,3
1D4A BTFSS 4A,2 1DA6 BTFSS 26,3
332

1DA7 BTFSS 27,3 1DCB BTFSS 4B,3


1DA8 BTFSS 28,3 1DCC BTFSS 4C,3
1DA9 BTFSS 29,3 1DCD BTFSS 4D,3
1DAA BTFSS 2A,3 1DCE BTFSS 4E,3
1DAB BTFSS 2B,3 1DCF BTFSS 4F,3
1DAC BTFSS 2C,3 1E03 BTFSS STATUS,TO
1DAD BTFSS 2D,3 1E05 BTFSS PORTA,4
1DAE BTFSS 2E,3 1E06 BTFSS PORTB,4
1DAF BTFSS 2F,3 1E0B BTFSS INTCON,INTE
1DB0 BTFSS 30,3 1E0C BTFSS 0C,4
1DB1 BTFSS 31,3 1E0D BTFSS 0D,4
1DB2 BTFSS 32,3 1E0E BTFSS 0E,4
1DB3 BTFSS 33,3 1E0F BTFSS 0F,4
1DB4 BTFSS 34,3 1E10 BTFSS 10,4
1DB5 BTFSS 35,3 1E11 BTFSS 11,4
1DB6 BTFSS 36,3 1E12 BTFSS 12,4
1DB7 BTFSS 37,3 1E13 BTFSS 13,4
1DB8 BTFSS 38,3 1E14 BTFSS 14,4
1DB9 BTFSS 39,3 1E15 BTFSS 15,4
1DBA BTFSS 3A,3 1E16 BTFSS 16,4
1DBB BTFSS 3B,3 1E17 BTFSS 17,4
1DBC BTFSS 3C,3 1E18 BTFSS 18,4
1DBD BTFSS 3D,3 1E19 BTFSS 19,4
1DBE BTFSS 3E,3 1E1A BTFSS 1A,4
1DBF BTFSS 3F,3 1E1B BTFSS 1B,4
1DC0 BTFSS 40,3 1E1C BTFSS 1C,4
1DC1 BTFSS 41,3 1E1D BTFSS 1D,4
1DC2 BTFSS 42,3 1E1E BTFSS 1E,4
1DC3 BTFSS 43,3 1E1F BTFSS 1F,4
1DC4 BTFSS 44,3 1E20 BTFSS 20,4
1DC5 BTFSS 45,3 1E21 BTFSS 21,4
1DC6 BTFSS 46,3 1E22 BTFSS 22 ,4
1DC7 BTFSS 47,3 1E23 BTFSS 23,4
1DC8 BTFSS 48,3 1E24 BTFSS 24,4
1DC9 BTFSS 49,3 1E25 BTFSS 25,4
1DCA BTFSS 4A,3 1E26 BTFSS 26,4
333

1E27 BTFSS 27,4 1E4B BTFSS 4B,4


1E28 BTFSS 28,4 1E4C BTFSS 4C,4
1E29 BTFSS 29,4 1E4D BTFSS 4D,4
1E2A BTFSS 2A,4 1E4E BTFSS 4E,4
1E2B BTFSS 2B,4 1E4F BTFSS 4F,4
1E2C BTFSS 2C,4 1E83 BTFSS STATUS,RP0
1E2D BTFSS 2D,4 1E85 BTFSS PORTA,5
1E2E BTFSS 2E,4 1E86 BTFSS PORTB,5
1E2F BTFSS 2F,4 1E8B BTFSS INTCON,T0IE
1E30 BTFSS 30,4 1E8C BTFSS 0C,5
1E31 BTFSS 31,4 1E8D BTFSS 0D,5
1E32 BTFSS 32,4 1E8E BTFSS 0E,5
1E33 BTFSS 33,4 1E8F BTFSS 0F,5
1E34 BTFSS 34,4 1E90 BTFSS 10,5
1E35 BTFSS 35,4 1E91 BTFSS 11,5
1E36 BTFSS 36,4 1E92 BTFSS 12,5
1E37 BTFSS 37,4 1E93 BTFSS 13,5
1E38 BTFSS 38,4 1E94 BTFSS 14,5
1E39 BTFSS 39,4 1E95 BTFSS 15,5
1E3A BTFSS 3A,4 1E96 BTFSS 16,5
1E3B BTFSS 3B,4 1E97 BTFSS 17,5
1E3C BTFSS 3C,4 1E98 BTFSS 18,5
1E3D BTFSS 3D,4 1E99 BTFSS 19,5
1E3E BTFSS 3E,4 1E9A BTFSS 1A,5
1E3F BTFSS 3F,4 1E9B BTFSS 1B,5
1E40 BTFSS 40,4 1E9C BTFSS 1C,5
1E41 BTFSS 41,4 1E9D BTFSS 1D,5
1E42 BTFSS 42,4 1E9E BTFSS 1E,5
1E43 BTFSS 43,4 1E9F BTFSS 1F,5
1E44 BTFSS 44,4 1EA0 BTFSS 20,5
1E45 BTFSS 45,4 1EA1 BTFSS 21,5
1E46 BTFSS 46,4 1EA2 BTFSS 22,5
1E47 BTFSS 47,4 1EA3 BTFSS 23,5
1E48 BTFSS 48,4 1EA4 BTFSS 24,5
1E49 BTFSS 49,4 1EA5 BTFSS 25,5
1E4A BTFSS 4A,4 1EA6 BTFSS 26,5
334

1EA7 BTFSS 27,5 1ECB BTFSS 4B,5


1EA8 BTFSS 28,5 1ECC BTFSS 4C,5
1EA9 BTFSS 29,5 1ECD BTFSS 4D,5
1EAA BTFSS 2A,5 1ECE BTFSS 4E,5
1EAB BTFSS 2B,5 1ECF BTFSS 4F,5
1EAC BTFSS 2C,5 1F05 BTFSS PORTA,6
1EAD BTFSS 2D,5 1F06 BTFSS PORTB,6
1EAE BTFSS 2E,5 1F0B BTFSS INTCON,EEIE
1EAF BTFSS 2F,5 1F0C BTFSS 0C,6
1EB0 BTFSS 30,5 1F0D BTFSS 0D,6
1EB1 BTFSS 31,5 1F0E BTFSS 0E,6
1EB2 BTFSS 32,5 1F0F BTFSS 0F,6
1EB3 BTFSS 33,5 1F10 BTFSS 10,6
1EB4 BTFSS 34,5 1F11 BTFSS 11,6
1EB5 BTFSS 35,5 1F12 BTFSS 12,6
1EB6 BTFSS 36,5 1F13 BTFSS 13,6
1EB7 BTFSS 37,5 1F14 BTFSS 14,6
1EB8 BTFSS 38,5 1F15 BTFSS 15,6
1EB9 BTFSS 39,5 1F16 BTFSS 16,6
1EBA BTFSS 3A,5 1F17 BTFSS 17,6
1EBB BTFSS 3B,5 1F18 BTFSS 18,6
1EBC BTFSS 3C,5 1F19 BTFSS 19,6
1EBD BTFSS 3D,5 1F1A BTFSS 1A,6
1EBE BTFSS 3E,5 1F1B BTFSS 1B,6
1EBF BTFSS 3F,5 1F1C BTFSS 1C,6
1EC0 BTFSS 40,5 1F1D BTFSS 1D,6
1EC1 BTFSS 41,5 1F1E BTFSS 1E,6
1EC2 BTFSS 42,5 1F1F BTFSS 1F,6
1EC3 BTFSS 43,5 1F20 BTFSS 20,6
1EC4 BTFSS 44,5 1F21 BTFSS 21,6
1EC5 BTFSS 45,5 1F22 BTFSS 22,6
1EC6 BTFSS 46,5 1F23 BTFSS 23,6
1EC7 BTFSS 47,5 1F24 BTFSS 24,6
1EC8 BTFSS 48,5 1F25 BTFSS 25,6
1EC9 BTFSS 49,5 1F26 BTFSS 26,6
1ECA BTFSS 4A,5 1F27 BTFSS 27,6
335

1F28 BTFSS 28,6 1F4C BTFSS 4C,6


1F29 BTFSS 29,6 1F4D BTFSS 4D,6
1F2A BTFSS 2A,6 1F4E BTFSS 4E,6
1F2B BTFSS 2B,6 1F4F BTFSS 4F,6
1F2C BTFSS 2C,6 1F85 BTFSS PORTA,7
1F2D BTFSS 2D,6 1F86 BTFSS PORTB,7
1F2E BTFSS 2E,6 1F8B BTFSS INTCON,GIE
1F2F BTFSS 2F,6 1F8C BTFSS 0C,7
1F30 BTFSS 30,6 1F8D BTFSS 0D,7
1F31 BTFSS 31,6 1F8E BTFSS 0E,7
1F32 BTFSS 32,6 1F8F BTFSS 0F,7
1F33 BTFSS 33,6 1F90 BTFSS 10,7
1F34 BTFSS 34,6 1F91 BTFSS 11,7
1F35 BTFSS 35,6 1F92 BTFSS 12,7
1F36 BTFSS 36,6 1F93 BTFSS 13,7
1F37 BTFSS 37,6 1F94 BTFSS 14,7
1F38 BTFSS 38,6 1F95 BTFSS 15,7
1F39 BTFSS 39,6 1F96 BTFSS 16,7
1F3A BTFSS 3A,6 1F97 BTFSS 17,7
1F3B BTFSS 3B,6 1F98 BTFSS 18,7
1F3C BTFSS 3C,6 1F99 BTFSS 19,7
1F3D BTFSS 3D,6 1F9A BTFSS 1A,7
1F3E BTFSS 3E,6 1F9B BTFSS 1B,7
1F3F BTFSS 3F,6 1F9C BTFSS 1C,7
1F40 BTFSS 40,6 1F9D BTFSS 1D,7
1F41 BTFSS 41,6 1F9E BTFSS 1E,7
1F42 BTFSS 42,6 1F9F BTFSS 1F,7
1F43 BTFSS 43,6 1FA0 BTFSS 20,7
1F44 BTFSS 44,6 1FA1 BTFSS 21,7
1F45 BTFSS 45,6 1FA2 BTFSS 22,7
1F46 BTFSS 46,6 1FA3 BTFSS 23,7
1F47 BTFSS 47,6 1FA4 BTFSS 24,7
1F48 BTFSS 48,6 1FA5 BTFSS 25,7
1F49 BTFSS 49,6 1FA6 BTFSS 26,7
1F4A BTFSS 4A,6 1FA7 BTFSS 27,7
1F4B BTFSS 4B,6 1FA8 BTFSS 28,7
336

1FA9 BTFSS 29,7 1FCD BTFSS 4D,7


1FAA BTFSS 2A,7 1FCE BTFSS 4E,7
1FAB BTFSS 2B,7 1FCF BTFSS 4F,7
1FAC BTFSS 2C,7 2004 CALL 004
1FAD BTFSS 2D,7 2005 CALL 005
1FAE BTFSS 2E,7 2006 CALL 006
1FAF BTFSS 2F,7 2007 CALL 007
1FB0 BTFSS 30,7 2008 CALL 008
1FB1 BTFSS 31,7 2009 CALL 009
1FB2 BTFSS 32,7 200A CALL 00A
1FB3 BTFSS 33,7 200B CALL 00B
1FB4 BTFSS 34,7 200C CALL 00C
1FB5 BTFSS 35,7 200D CALL 00D
1FB6 BTFSS 36,7 200E CALL 00E
1FB7 BTFSS 37,7 200F CALL 00F
1FB8 BTFSS 38,7 2010 CALL 010
1FB9 BTFSS 39,7 2011 CALL 011
1FBA BTFSS 3A,7 2012 CALL 012
1FBB BTFSS 3B,7 2013 CALL 013
1FBC BTFSS 3C,7 2014 CALL 014
1FBD BTFSS 3D,7 2015 CALL 015
1FBE BTFSS 3E,7 2016 CALL 016
1FBF BTFSS 3F,7 2017 CALL 017
1FC0 BTFSS 40,7 2018 CALL 018
1FC1 BTFSS 41,7 2019 CALL 019
1FC2 BTFSS 42,7 201A CALL 01A
1FC3 BTFSS 43,7 201B CALL 01B
1FC4 BTFSS 44,7 201C CALL 01C
1FC5 BTFSS 45,7 201D CALL 01D
1FC6 BTFSS 46,7 201E CALL 01E
1FC7 BTFSS 47,7 201F CALL 01F
1FC8 BTFSS 48,7 2020 CALL 020
1FC9 BTFSS 49,7 2021 CALL 021
1FCA BTFSS 4A,7 2022 CALL 022
1FCB BTFSS 4B,7 2023 CALL 023
1FCC BTFSS 4C,7 2024 CALL 024
337

2025 CALL 025 2049 CALL 049


2026 CALL 026 204A CALL 04A
2027 CALL 027 204B CALL 04B
2028 CALL 028 204C CALL 04C
2029 CALL 029 204D CALL 04D
202A CALL 02A 204E CALL 04E
202B CALL 02B 204F CALL 04F
202C CALL 02C 2050 CALL 050
202D CALL 02D 2051 CALL 051
202E CALL 02E 2052 CALL 052
202F CALL 02F 2053 CALL 053
2030 CALL 030 2054 CALL 054
2031 CALL 031 2055 CALL 055
2032 CALL 032 2056 CALL 056
2033 CALL 033 2057 CALL 057
2034 CALL 034 2058 CALL 058
2035 CALL 035 2059 CALL 059
2036 CALL 036 205A CALL 05A
2037 CALL 037 205B CALL 05B
2038 CALL 038 205C CALL 05C
2039 CALL 039 205D CALL 05D
203A CALL 03A 205E CALL 05E
203B CALL 03B 205F CALL 05F
203C CALL 03C 2060 CALL 060
203D CALL 03D 2061 CALL 061
203E CALL 03E 2062 CALL 062
203F CALL 03F 2063 CALL 063
2040 CALL 040 2064 CALL 064
2041 CALL 041 2065 CALL 065
2042 CALL 042 2066 CALL 066
2043 CALL 043 2067 CALL 067
2044 CALL 044 2068 CALL 068
2045 CALL 045 2069 CALL 069
2046 CALL 046 206A CALL 06A
2047 CALL 047 206B CALL 06B
2048 CALL 048 206C CALL 06C
338

206D CALL 06D 2091 CALL 091


206E CALL 06E 2092 CALL 092
206F CALL 06F 2093 CALL 093
2070 CALL 070 2094 CALL 094
2071 CALL 071 2095 CALL 095
2072 CALL 072 2096 CALL 096
2073 CALL 073 2097 CALL 097
2074 CALL 074 2098 CALL 098
2075 CALL 075 2099 CALL 099
2076 CALL 076 209A CALL 09A
2077 CALL 077 209B CALL 09B
2078 CALL 078 209C CALL 09C
2079 CALL 079 209D CALL 09D
207A CALL 07A 209E CALL 09E
207B CALL 07B 209F CALL 09F
207C CALL 07C 20A0 CALL 0A0
207D CALL 07D 20A1 CALL 0A1
207E CALL 07E 20A2 CALL 0A2
207F CALL 07F 20A3 CALL 0A3
2080 CALL 080 20A4 CALL 0A4
2081 CALL 081 20A5 CALL 0A5
2082 CALL 082 20A6 CALL 0A6
2083 CALL 083 20A7 CALL 0A7
2084 CALL 084 20A8 CALL 0A8
2085 CALL 085 20A9 CALL 0A9
2086 CALL 086 20AA CALL 0AA
2087 CALL 087 20AB CALL 0AB
2088 CALL 088 20AC CALL 0AC
2089 CALL 089 20AD CALL 0AD
208A CALL 08A 20AE CALL 0AE
208B CALL 08B 20AF CALL 0AF
208C CALL 08C 20B0 CALL 0B0
208D CALL 08D 20B1 CALL 0B1
208E CALL 08E 20B2 CALL 0B2
208F CALL 08F 20B3 CALL 0B3
2090 CALL 090 20B4 CALL 0B4
339

20B5 CALL 0B5 20D9 CALL 0D9


20B6 CALL 0B6 20DA CALL 0DA
20B7 CALL 0B7 20DB CALL 0DB
20B8 CALL 0B8 20DC CALL 0DC
20B9 CALL 0B9 20DD CALL 0DD
20BA CALL 0BA 20DE CALL 0DE
20BB CALL 0BB 20DF CALL 0DF
20BC CALL 0BC 20E0 CALL 0E0
20BD CALL 0BD 20E1 CALL 0E1
20BE CALL 0BE 20E2 CALL 0E2
20BF CALL 0BF 20E3 CALL 0E3
20C0 CALL 0C0 20E4 CALL 0E4
20C1 CALL 0C1 20E5 CALL 0E5
20C2 CALL 0C2 20E6 CALL 0E6
20C3 CALL 0C3 20E7 CALL 0E7
20C4 CALL 0C4 20E8 CALL 0E8
20C5 CALL 0C5 20E9 CALL 0E9
20C6 CALL 0C6 20EA CALL 0EA
20C7 CALL 0C7 20EB CALL 0EB
20C8 CALL 0C8 20EC CALL 0EC
20C9 CALL 0C9 20ED CALL 0ED
20CA CALL 0CA 20EE CALL 0EE
20CB CALL 0CB 20EF CALL 0EF
20CC CALL 0CC 20F0 CALL 0F0
20CD CALL 0CD 20F1 CALL 0F1
20CE CALL 0CE 20F2 CALL 0F2
20CF CALL 0CF 20F3 CALL 0F3
20D0 CALL 0D0 20F4 CALL 0F4
20D1 CALL 0D1 20F5 CALL 0F5
20D2 CALL 0D2 20F6 CALL 0F6
20D3 CALL 0D3 20F7 CALL 0F7
20D4 CALL 0D4 20F8 CALL 0F8
20D5 CALL 0D5 20F9 CALL 0F9
20D6 CALL 0D6 20FA CALL 0FA
20D7 CALL 0D7 20FB CALL 0FB
20D8 CALL 0D8 20FC CALL 0FC
340

20FD CALL 0FD 2121 CALL 121


20FE CALL 0FE 2122 CALL 122
20FF CALL 0FF 2123 CALL 123
2100 CALL 100 2124 CALL 124
2101 CALL 101 2125 CALL 125
2102 CALL 102 2126 CALL 126
2103 CALL 103 2127 CALL 127
2104 CALL 104 2128 CALL 128
2105 CALL 105 2129 CALL 129
2106 CALL 106 212A CALL 12A
2107 CALL 107 212B CALL 12B
2108 CALL 108 212C CALL 12C
2109 CALL 109 212D CALL 12D
210A CALL 10A 212E CALL 12E
210B CALL 10B 212F CALL 12F
210C CALL 10C 2130 CALL 130
210D CALL 10D 2131 CALL 131
210E CALL 10E 2132 CALL 132
210F CALL 10F 2133 CALL 133
2110 CALL 110 2134 CALL 134
2111 CALL 111 2135 CALL 135
2112 CALL 112 2136 CALL 136
2113 CALL 113 2137 CALL 137
2114 CALL 114 2138 CALL 138
2115 CALL 115 2139 CALL 139
2116 CALL 116 213A CALL 13A
2117 CALL 117 213B CALL 13B
2118 CALL 118 213C CALL 13C
2119 CALL 119 213D CALL 13D
211A CALL 11A 213E CALL 13E
211B CALL 11B 213F CALL 13F
211C CALL 11C 2140 CALL 140
211D CALL 11D 2141 CALL 141
211E CALL 11E 2142 CALL 142
211F CALL 11F 2143 CALL 143
2120 CALL 120 2144 CALL 144
341

2145 CALL 145 2169 CALL 169


2146 CALL 146 216A CALL 16A
2147 CALL 147 216B CALL 16B
2148 CALL 148 216C CALL 16C
2049 CALL 149 216D CALL 16D
214A CALL 14A 216E CALL 16E
201B CALL 14B 216F CALL 16F
214C CALL 14C 2170 CALL 170
214D CALL 14D 2171 CALL 171
214E CALL 14E 2172 CALL 172
214F CALL 14F 2173 CALL 173
2150 CALL 150 2174 CALL 174
2151 CALL 151 2175 CALL 175
2152 CALL 152 2176 CALL 176
2153 CALL 153 2177 CALL 177
2154 CALL 154 2178 CALL 178
2155 CALL 155 2179 CALL 179
2156 CALL 156 217A CALL 17A
2157 CALL 157 217B CALL 17B
2158 CALL 158 217C CALL 17C
2159 CALL 159 217D CALL 17D
215A CALL 15A 217E CALL 17E
215B CALL 15B 217F CALL 17F
215C CALL 15C 2180 CALL 180
215D CALL 15D 2181 CALL 181
215E CALL 15E 2182 CALL 182
215F CALL 15F 2183 CALL 183
2160 CALL 160 2184 CALL 184
2161 CALL 161 2185 CALL 185
2162 CALL 162 2186 CALL 186
2163 CALL 163 2187 CALL 187
2164 CALL 164 2188 CALL 188
2165 CALL 165 2189 CALL 189
2166 CALL 166 218A CALL 18A
2167 CALL 167 218B CALL 18B
2168 CALL 168 218C CALL 18C
342

218D CALL 18D 21B1 CALL 1B1


218E CALL 18E 21B2 CALL 1B2
218F CALL 18F 21B3 CALL 1B3
2190 CALL 190 21B4 CALL 1B4
2191 CALL 191 21B5 CALL 1B5
2192 CALL 192 21B6 CALL 1B6
2193 CALL 193 21B7 CALL 1B7
2194 CALL 194 21B8 CALL 1B8
2195 CALL 195 21B9 CALL 1B9
2196 CALL 196 21BA CALL 1BA
2197 CALL 197 21BB CALL 1BB
2198 CALL 198 21BC CALL 1BC
2199 CALL 199 21BD CALL 1BD
219A CALL 19A 21BE CALL 1BE
219B CALL 19B 21BF CALL 1BF
219C CALL 19C 21C0 CALL 1C0
219D CALL 19D 21C1 CALL 1C1
219E CALL 19E 21C2 CALL 1C2
219F CALL 19F 21C3 CALL 1C3
21A0 CALL 1A0 21C4 CALL 1C4
21A1 CALL 1A1 21C5 CALL 1C5
21A2 CALL 1A2 21C6 CALL 1C6
21A3 CALL 1A3 21C7 CALL 1C7
21A4 CALL 1A4 21C8 CALL 1C8
21A5 CALL 1A5 21C9 CALL 1C9
21A6 CALL 1A6 21CA CALL 1CA
21A7 CALL 1A7 21CB CALL 1CB
21A8 CALL 1A8 21CC CALL 1CC
21A9 CALL 1A9 21CD CALL 1CD
21AA CALL 1AA 21CE CALL 1CE
21AB CALL 1AB 21CF CALL 1CF
21AC CALL 1AC 21D0 CALL 1D0
21AD CALL 1AD 21D1 CALL 1D1
21AE CALL 1AE 21D2 CALL 1D2
21AF CALL 1AF 21D3 CALL 1D3
21B0 CALL 1B0 21D4 CALL 1D4
343

21D5 CALL 1D5 21F9 CALL 1F9


21D6 CALL 1D6 21FA CALL 1FA
21D7 CALL 1D7 21FB CALL 1FB
21D8 CALL 1D8 21FC CALL 1FC
21D9 CALL 1D9 21FD CALL 1FD
21DA CALL 1DA 21FE CALL 1FE
21DB CALL 1DB 21FF CALL 1FF
21DC CALL 1DC 2200 CALL 200
21DD CALL 1DD 2201 CALL 201
21DE CALL 1DE 2202 CALL 202
21DF CALL 1DF 2203 CALL 203
21E0 CALL 1E0 2204 CALL 204
21E1 CALL 1E1 2205 CALL 205
21E2 CALL 1E2 2206 CALL 206
21E3 CALL 1E3 2207 CALL 207
21E4 CALL 1E4 2208 CALL 208
21E5 CALL 1E5 2209 CALL 209
21E6 CALL 1E6 220A CALL 20A
21E7 CALL 1E7 220B CALL 20B
21E8 CALL 1E8 220C CALL 20C
21E9 CALL 1E9 220D CALL 20D
21EA CALL 1EA 220E CALL 20E
21EB CALL 1EB 220F CALL 20F
21EC CALL 1EC 2210 CALL 210
21ED CALL 1ED 2211 CALL 211
21EE CALL 1EE 2212 CALL 212
21EF CALL 1EF 2213 CALL 213
21F0 CALL 1F0 2214 CALL 214
21F1 CALL 1F1 2215 CALL 215
21F2 CALL 1F2 2216 CALL 216
21F3 CALL 1F3 2217 CALL 217
21F4 CALL 1F4 2218 CALL 218
21F5 CALL 1F5 2219 CALL 219
21F6 CALL 1F6 221A CALL 21A
21F7 CALL 1F7 221B CALL 21B
21F8 CALL 1F8 221C CALL 21C
344

221D CALL 21D 2241 CALL 241


221E CALL 21E 2242 CALL 242
221F CALL 21F 2243 CALL 243
2220 CALL 220 2244 CALL 244
2221 CALL 221 2245 CALL 245
2222 CALL 222 2246 CALL 246
2223 CALL 223 2247 CALL 247
2224 CALL 224 2248 CALL 248
2225 CALL 225 2249 CALL 249
2226 CALL 226 224A CALL 24A
2227 CALL 227 224B CALL 24B
2228 CALL 228 224C CALL 24C
2229 CALL 229 224D CALL 24D
222A CALL 22A 224E CALL 24E
222B CALL 22B 224F CALL 24F
222C CALL 22C 2250 CALL 250
222D CALL 22D 2251 CALL 251
222E CALL 22E 2252 CALL 252
222F CALL 22F 2253 CALL 253
2230 CALL 230 2254 CALL 254
2231 CALL 231 2255 CALL 255
2232 CALL 232 2256 CALL 256
2233 CALL 233 2257 CALL 257
2234 CALL 234 2258 CALL 258
2235 CALL 235 2259 CALL 259
2236 CALL 236 225A CALL 25A
2237 CALL 237 225B CALL 25B
2238 CALL 238 225C CALL 25C
2239 CALL 239 225D CALL 25D
223A CALL 23A 225E CALL 25E
223B CALL 23B 225F CALL 25F
223C CALL 23C 2260 CALL 260
223D CALL 23D 2261 CALL 261
223E CALL 23E 2262 CALL 262
223F CALL 23F 2263 CALL 263
2240 CALL 240 2264 CALL 264
345

2265 CALL 265 2289 CALL 289


2266 CALL 266 228A CALL 28A
2267 CALL 267 228B CALL 28B
2268 CALL 268 228C CALL 28C
2269 CALL 269 228D CALL 28D
226A CALL 26A 228E CALL 28E
226B CALL 26B 228F CALL 28F
226C CALL 26C 2290 CALL 290
226D CALL 26D 2291 CALL 291
226E CALL 26E 2292 CALL 292
226F CALL 26F 2293 CALL 293
2270 CALL 270 2294 CALL 294
2271 CALL 271 2295 CALL 295
2272 CALL 272 2296 CALL 296
2273 CALL 273 2297 CALL 297
2274 CALL 274 2298 CALL 298
2275 CALL 275 2299 CALL 299
2276 CALL 276 229A CALL 29A
2277 CALL 277 229B CALL 29B
2278 CALL 278 229C CALL 29C
2279 CALL 279 229D CALL 29D
227A CALL 27A 229E CALL 29E
227B CALL 27B 229F CALL 29F
227C CALL 27C 22A0 CALL 2A0
227D CALL 27D 22A1 CALL 2A1
227E CALL 27E 22A2 CALL 2A2
227F CALL 27F 22A3 CALL 2A3
2280 CALL 280 22A4 CALL 2A4
2281 CALL 281 22A5 CALL 2A5
2282 CALL 282 22A6 CALL 2A6
2283 CALL 283 22A7 CALL 2A7
2284 CALL 284 22A8 CALL 2A8
2285 CALL 285 22A9 CALL 2A9
2286 CALL 286 22AA CALL 2AA
2287 CALL 287 22AB CALL 2AB
2288 CALL 288 22AC CALL 2AC
346

22AD CALL 2AD 22D1 CALL 2D1


22AE CALL 2AE 22D2 CALL 2D2
22AF CALL 2AF 22D3 CALL 2D3
22B0 CALL 2B0 22D4 CALL 2D4
22B1 CALL 2B1 22D5 CALL 2D5
22B2 CALL 2B2 22D6 CALL 2D6
22B3 CALL 2B3 22D7 CALL 2D7
22B4 CALL 2B4 22D8 CALL 2D8
22B5 CALL 2B5 22D9 CALL 2D9
22B6 CALL 2B6 22DA CALL 2DA
22B7 CALL 2B7 22DB CALL 2DB
22B8 CALL 2B8 22DC CALL 2DC
22B9 CALL 2B9 22DD CALL 2DD
22BA CALL 2BA 22DE CALL 2DE
22BB CALL 2BB 22DF CALL 2DF
22BC CALL 2BC 22E0 CALL 2E0
22BD CALL 2BD 22E1 CALL 2E1
22BE CALL 2BE 22E2 CALL 2E2
22BF CALL 2BF 22E3 CALL 2E3
22C0 CALL 2C0 22E4 CALL 2E4
22C1 CALL 2C1 22E5 CALL 2E5
22C2 CALL 2C2 22E6 CALL 2E6
22C3 CALL 2C3 22E7 CALL 2E7
22C4 CALL 2C4 22E8 CALL 2E8
22C5 CALL 2C5 22E9 CALL 2E9
22C6 CALL 2C6 22EA CALL 2EA
22C7 CALL 2C7 22EB CALL 2EB
22C8 CALL 2C8 22EC CALL 2EC
22C9 CALL 2C9 22ED CALL 2ED
22CA CALL 2CA 22EE CALL 2EE
22CB CALL 2CB 22EF CALL 2EF
22CC CALL 2CC 22F0 CALL 2F0
22CD CALL 2CD 22F1 CALL 2F1
22CE CALL 2CE 22F2 CALL 2F2
22CF CALL 2CF 22F3 CALL 2F3
22D0 CALL 2D0 22F4 CALL 2F4
347

22F5 CALL 2F5 2319 CALL 319


22F6 CALL 2F6 231A CALL 31A
22F7 CALL 2F7 231B CALL 31B
22F8 CALL 2F8 231C CALL 31C
22F9 CALL 2F9 231D CALL 31D
22FA CALL 2FA 231E CALL 31E
22FB CALL 2FB 231F CALL 31F
22FC CALL 2FC 2320 CALL 320
22FD CALL 2FD 2321 CALL 321
22FE CALL 2FE 2322 CALL 322
22FF CALL 2FF 2323 CALL 323
2300 CALL 300 2324 CALL 324
2301 CALL 301 2325 CALL 325
2302 CALL 302 2326 CALL 326
2303 CALL 303 2327 CALL 327
2304 CALL 304 2328 CALL 328
2305 CALL 305 2329 CALL 329
2306 CALL 306 232A CALL 32A
2307 CALL 307 232B CALL 32B
2308 CALL 308 232C CALL 32C
2309 CALL 309 232D CALL 32D
230A CALL 30A 232E CALL 32E
230B CALL 30B 232F CALL 32F
230C CALL 30C 2330 CALL 330
230D CALL 30D 2331 CALL 331
230E CALL 30E 2332 CALL 332
230F CALL 30F 2333 CALL 333
2310 CALL 310 2334 CALL 334
2311 CALL 311 2335 CALL 335
2312 CALL 312 2336 CALL 336
2313 CALL 313 2337 CALL 337
2314 CALL 314 2338 CALL 338
2315 CALL 315 2339 CALL 339
2316 CALL 316 233A CALL 33A
2317 CALL 317 233B CALL 33B
2318 CALL 318 233C CALL 33C
348

233D CALL 33D 2361 CALL 361


233E CALL 33E 2362 CALL 362
233F CALL 33F 2363 CALL 363
2340 CALL 340 2364 CALL 364
2341 CALL 341 2365 CALL 365
2342 CALL 342 2366 CALL 366
2343 CALL 343 2367 CALL 367
2344 CALL 344 2368 CALL 368
2345 CALL 345 2369 CALL 369
2346 CALL 346 236A CALL 36A
2347 CALL 347 236B CALL 36B
2348 CALL 348 236C CALL 36C
2349 CALL 349 236D CALL 36D
234A CALL 34A 236E CALL 36E
234B CALL 34B 236F CALL 36F
234C CALL 34C 2370 CALL 370
234D CALL 34D 2371 CALL 371
234E CALL 34E 2372 CALL 372
234F CALL 34F 2373 CALL 373
2350 CALL 350 2374 CALL 374
2351 CALL 351 2375 CALL 375
2352 CALL 352 2376 CALL 376
2353 CALL 353 2377 CALL 377
2354 CALL 354 2378 CALL 378
2355 CALL 355 2379 CALL 379
2356 CALL 356 237A CALL 37A
2357 CALL 357 237B CALL 37B
2358 CALL 358 237C CALL 37C
2359 CALL 359 237D CALL 37D
235A CALL 35A 237E CALL 37E
235B CALL 35B 237F CALL 37F
235C CALL 35C 2380 CALL 380
235D CALL 35D 2381 CALL 381
235E CALL 35E 2382 CALL 382
235F CALL 35F 2383 CALL 383
2360 CALL 360 2384 CALL 384
349

2385 CALL 385 23A9 CALL 3A9


2386 CALL 386 23AA CALL 3AA
2387 CALL 387 23AB CALL 3AB
2388 CALL 388 23AC CALL 3AC
2389 CALL 389 23AD CALL 3AD
238A CALL 38A 23AE CALL 3AE
238B CALL 38B 23AF CALL 3AF
238C CALL 38C 23B0 CALL 3B0
238D CALL 38D 23B1 CALL 3B1
238E CALL 38E 23B2 CALL 3B2
238F CALL 38F 23B3 CALL 3B3
2390 CALL 390 23B4 CALL 3B4
2391 CALL 391 23B5 CALL 3B5
2392 CALL 392 23B6 CALL 3B6
2393 CALL 393 23B7 CALL 3B7
2394 CALL 394 23B8 CALL 3B8
2395 CALL 395 23B9 CALL 3B9
2396 CALL 396 23BA CALL 3BA
2397 CALL 397 23BB CALL 3BB
2398 CALL 398 23BC CALL 3BC
2399 CALL 399 23BD CALL 3BD
239A CALL 39A 23BE CALL 3BE
239B CALL 39B 23BF CALL 3BF
239C CALL 39C 23C0 CALL 3C0
239D CALL 39D 23C1 CALL 3C1
239E CALL 39E 23C2 CALL 3C2
239F CALL 39F 23C3 CALL 3C3
23A0 CALL 3A0 23C4 CALL 3C4
23A1 CALL 3A1 23C5 CALL 3C5
23A2 CALL 3A2 23C6 CALL 3C6
23A3 CALL 3A3 23C7 CALL 3C7
23A4 CALL 3A4 23C8 CALL 3C8
23A5 CALL 3A5 23C9 CALL 3C9
23A6 CALL 3A6 23CA CALL 3CA
23A7 CALL 3A7 23CB CALL 3CB
23A8 CALL 3A8 23CC CALL 3CC
350

23CD CALL 3CD 23F1 CALL 3F1


23CE CALL 3CE 23F2 CALL 3F2
23CF CALL 3CF 23F3 CALL 3F3
23D0 CALL 3D0 23F4 CALL 3F4
23D1 CALL 3D1 23F5 CALL 3F5
23D2 CALL 3D2 23F6 CALL 3F6
23D3 CALL 3D3 23F7 CALL 3F7
23D4 CALL 3D4 23F8 CALL 3F8
23D5 CALL 3D5 23F9 CALL 3F9
23D6 CALL 3D6 23FA CALL 3FA
23D7 CALL 3D7 23FB CALL 3FB
23D8 CALL 3D8 23FC CALL 3FC
23D9 CALL 3D9 23FD CALL 3FD
23DA CALL 3DA 23FE CALL 3FE
23DB CALL 3DB 23FF CALL 3FF
23DC CALL 3DC 2800 GOTO 000
23DD CALL 3DD 2801 GOTO 001
23DE CALL 3DE 2802 GOTO 002
23DF CALL 3DF 2803 GOTO 003
23E0 CALL 3E0 2804 GOTO 004
23E1 CALL 3E1 2805 GOTO 005
23E2 CALL 3E2 2806 GOTO 006
23E3 CALL 3E3 2807 GOTO 007
23E4 CALL 3E4 2808 GOTO 008
23E5 CALL 3E5 2809 GOTO 009
23E6 CALL 3E6 280A GOTO 00A
23E7 CALL 3E7 280B GOTO 00B
23E8 CALL 3E8 280C GOTO 00C
23E9 CALL 3E9 280D GOTO 00D
23EA CALL 3EA 280E GOTO 00E
23EB CALL 3EB 280F GOTO 00F
23EC CALL 3EC 2810 GOTO 010
23ED CALL 3ED 2811 GOTO 011
23EE CALL 3EE 2812 GOTO 012
23EF CALL 3EF 2813 GOTO 013
23F0 CALL 3F0 2814 GOTO 014
351

2815 GOTO 015 2839 GOTO 039


2816 GOTO 016 283A GOTO 03A
2817 GOTO 017 283B GOTO 03B
2818 GOTO 018 283C GOTO 03C
2819 GOTO 019 283D GOTO 03D
281A GOTO 01A 283E GOTO 03E
281B GOTO 01B 283F GOTO 03F
281C GOTO 01C 2840 GOTO 040
281D GOTO 01D 2841 GOTO 041
281E GOTO 01E 2842 GOTO 042
281F GOTO 01F 2843 GOTO 043
2820 GOTO 020 2844 GOTO 044
2821 GOTO 021 2845 GOTO 045
2822 GOTO 022 2846 GOTO 046
2823 GOTO 023 2847 GOTO 047
2824 GOTO 024 2848 GOTO 048
2825 GOTO 025 2849 GOTO 049
2826 GOTO 026 284A GOTO 04A
2827 GOTO 027 284B GOTO 04B
2828 GOTO 028 284C GOTO 04C
2829 GOTO 029 284D GOTO 04D
282A GOTO 02A 284E GOTO 04E
282B GOTO 02B 284F GOTO 04F
282C GOTO 02C 2850 GOTO 050
282D GOTO 02D 2851 GOTO 051
282E GOTO 02E 2852 GOTO 052
282F GOTO 02F 2853 GOTO 053
2830 GOTO 030 2854 GOTO 054
2831 GOTO 031 2855 GOTO 055
2832 GOTO 032 2856 GOTO 056
2833 GOTO 033 2857 GOTO 057
2834 GOTO 034 2858 GOTO 058
2835 GOTO 035 2859 GOTO 059
2836 GOTO 036 285A GOTO 05A
2837 GOTO 037 285B GOTO 05B
2838 GOTO 038 285C GOTO 05C
352

285D GOTO 05D 2881 GOTO 081


285E GOTO 05E 2882 GOTO 082
285F GOTO 05F 2883 GOTO 083
2860 GOTO 060 2884 GOTO 084
2861 GOTO 061 2885 GOTO 085
2862 GOTO 062 2886 GOTO 086
2863 GOTO 063 2887 GOTO 087
2864 GOTO 064 2888 GOTO 088
2865 GOTO 065 2889 GOTO 089
2866 GOTO 066 288A GOTO 08A
2867 GOTO 067 288B GOTO 08B
2868 GOTO 068 288C GOTO 08C
2869 GOTO 069 288D GOTO 08D
286A GOTO 06A 288E GOTO 08E
286B GOTO 06B 288F GOTO 08F
286C GOTO 06C 2890 GOTO 090
286D GOTO 06D 2891 GOTO 091
286E GOTO 06E 2892 GOTO 092
286F GOTO 06F 2893 GOTO 093
2870 GOTO 070 2894 GOTO 094
2871 GOTO 071 2895 GOTO 095
2872 GOTO 072 2896 GOTO 096
2873 GOTO 073 2897 GOTO 097
2874 GOTO 074 2898 GOTO 098
2875 GOTO 075 2899 GOTO 099
2876 GOTO 076 289A GOTO 09A
2877 GOTO 077 289B GOTO 09B
2878 GOTO 078 289C GOTO 09C
2879 GOTO 079 289D GOTO 09D
287A GOTO 07A 289E GOTO 09E
287B GOTO 07B 289F GOTO 09F
287C GOTO 07C 28A0 GOTO 0A0
287D GOTO 07D 28A1 GOTO 0A1
287E GOTO 07E 28A2 GOTO 0A2
287F GOTO 07F 28A3 GOTO 0A3
2880 GOTO 080 28A4 GOTO 0A4
353

28A5 GOTO 0A5 28C9 GOTO 0C9


28A6 GOTO 0A6 28CA GOTO 0CA
28A7 GOTO 0A7 28CB GOTO 0CB
28A8 GOTO 0A8 28CC GOTO 0CC
28A9 GOTO 0A9 28CD GOTO 0CD
28AA GOTO 0AA 28CE GOTO 0CE
28AB GOTO 0AB 28CF GOTO 0CF
28AC GOTO 0AC 28D0 GOTO 0D0
28AD GOTO 0AD 28D1 GOTO 0D1
28AE GOTO 0AE 28D2 GOTO 0D2
28AF GOTO 0AF 28D3 GOTO 0D3
28B0 GOTO 0B0 28D4 GOTO 0D4
28B1 GOTO 0B1 28D5 GOTO 0D5
28B2 GOTO 0B2 28D6 GOTO 0D6
28B3 GOTO 0B3 28D7 GOTO 0D7
28B4 GOTO 0B4 28D8 GOTO 0D8
28B5 GOTO 0B5 28D9 GOTO 0D9
28B6 GOTO 0B6 28DA GOTO 0DA
28B7 GOTO 0B7 28DB GOTO 0DB
28B8 GOTO 0B8 28DC GOTO 0DC
28B9 GOTO 0B9 28DD GOTO 0DD
28BA GOTO 0BA 28DE GOTO 0DE
28BB GOTO 0BB 28DF GOTO 0DF
28BC GOTO 0BC 28E0 GOTO 0E0
28BD GOTO 0BD 28E1 GOTO 0E1
28BE GOTO 0BE 28E2 GOTO 0E2
28BF GOTO 0BF 28E3 GOTO 0E3
28C0 GOTO 0C0 28E4 GOTO 0E4
28C1 GOTO 0C1 28E5 GOTO 0E5
28C2 GOTO 0C2 28E6 GOTO 0E6
28C3 GOTO 0C3 28E7 GOTO 0E7
28C4 GOTO 0C4 28E8 GOTO 0E8
28C5 GOTO 0C5 28E9 GOTO 0E9
28C6 GOTO 0C6 28EA GOTO 0EA
28C7 GOTO 0C7 28EB GOTO 0EB
28C8 GOTO 0C8 28EC GOTO 0EC
354

28ED GOTO 0ED 2911 GOTO 111


28EE GOTO 0EE 2912 GOTO 112
28EF GOTO 0EF 2913 GOTO 113
28F0 GOTO 0F0 2914 GOTO 114
28F1 GOTO 0F1 2915 GOTO 115
28F2 GOTO 0F2 2916 GOTO 116
28F3 GOTO 0F3 2917 GOTO 117
28F4 GOTO 0F4 2918 GOTO 118
28F5 GOTO 0F5 2919 GOTO 119
28F6 GOTO 0F6 291A GOTO 11A
28F7 GOTO 0F7 291B GOTO 11B
28F8 GOTO 0F8 291C GOTO 11C
28F9 GOTO 0F9 291D GOTO 11D
28FA GOTO 0FA 291E GOTO 11E
28FB GOTO 0FB 291F GOTO 11F
28FC GOTO 0FC 2920 GOTO 120
28FD GOTO 0FD 2921 GOTO 121
28FE GOTO 0FE 2922 GOTO 122
28FF GOTO 0FF 2923 GOTO 123
2900 GOTO 100 2924 GOTO 124
2901 GOTO 101 2925 GOTO 125
2902 GOTO 102 2926 GOTO 126
2903 GOTO 103 2927 GOTO 127
2904 GOTO 104 2928 GOTO 128
2905 GOTO 105 2929 GOTO 129
2906 GOTO 106 292A GOTO 12A
2907 GOTO 107 292B GOTO 12B
2908 GOTO 108 292C GOTO 12C
2909 GOTO 109 292D GOTO 12D
290A GOTO 10A 292E GOTO 12E
290B GOTO 10B 292F GOTO 12F
290C GOTO 10C 2930 GOTO 130
290D GOTO 10D 2931 GOTO 131
290E GOTO 10E 2932 GOTO 132
290F GOTO 10F 2933 GOTO 133
2910 GOTO 110 2934 GOTO 134
355

2935 GOTO 135 2959 GOTO 159


2936 GOTO 136 295A GOTO 15A
2937 GOTO 137 295B GOTO 15B
2938 GOTO 138 295C GOTO 15C
2939 GOTO 139 295D GOTO 15D
293A GOTO 13A 295E GOTO 15E
293B GOTO 13B 295F GOTO 15F
293C GOTO 13C 2960 GOTO 160
293D GOTO 13D 2961 GOTO 161
293E GOTO 13E 2962 GOTO 162
293F GOTO 13F 2963 GOTO 163
2940 GOTO 140 2964 GOTO 164
2941 GOTO 141 2965 GOTO 165
2942 GOTO 142 2966 GOTO 166
2943 GOTO 143 2967 GOTO 167
2944 GOTO 144 2968 GOTO 168
2945 GOTO 145 2969 GOTO 169
2946 GOTO 146 296A GOTO 16A
2947 GOTO 147 296B GOTO 16B
2948 GOTO 148 296C GOTO 16C
2949 GOTO 149 296D GOTO 16D
294A GOTO 14A 296E GOTO 16E
294B GOTO 14B 296F GOTO 16F
294C GOTO 14C 2970 GOTO 170
294D GOTO 14D 2971 GOTO 171
294E GOTO 14E 2972 GOTO 172
294F GOTO 14F 2973 GOTO 173
2950 GOTO 150 2974 GOTO 174
2951 GOTO 151 2975 GOTO 175
2952 GOTO 152 2976 GOTO 176
2953 GOTO 153 2977 GOTO 177
2954 GOTO 154 2978 GOTO 178
2955 GOTO 155 2979 GOTO 179
2956 GOTO 156 297A GOTO 17A
2957 GOTO 157 297B GOTO 17B
2958 GOTO 158 297C GOTO 17C
356

297D GOTO 17D 29A1 GOTO 1A1


297E GOTO 17E 29A2 GOTO 1A2
297F GOTO 17F 29A3 GOTO 1A3
2980 GOTO 180 29A4 GOTO 1A4
2981 GOTO 181 29A5 GOTO 1A5
2982 GOTO 182 29A6 GOTO 1A6
2983 GOTO 183 29A7 GOTO 1A7
2984 GOTO 184 29A8 GOTO 1A8
2985 GOTO 185 29A9 GOTO 1A9
2986 GOTO 186 29AA GOTO 1AA
2987 GOTO 187 29AB GOTO 1AB
2988 GOTO 188 29AC GOTO 1AC
2989 GOTO 189 29AD GOTO 1AD
298A GOTO 18A 29AE GOTO 1AE
298B GOTO 18B 29AF GOTO 1AF
298C GOTO 18C 29B0 GOTO 1B0
298D GOTO 18D 29B1 GOTO 1B1
298E GOTO 18E 29B2 GOTO 1B2
298F GOTO 18F 29B3 GOTO 1B3
2990 GOTO 190 29B4 GOTO 1B4
2991 GOTO 191 29B5 GOTO 1B5
2992 GOTO 192 29B6 GOTO 1B6
2993 GOTO 193 29B7 GOTO 1B7
2994 GOTO 194 29B8 GOTO 1B8
2995 GOTO 195 29B9 GOTO 1B9
2996 GOTO 196 29BA GOTO 1BA
2997 GOTO 197 29BB GOTO 1BB
2998 GOTO 198 29BC GOTO 1BC
2999 GOTO 199 29BD GOTO 1BD
299A GOTO 19A 29BE GOTO 1BE
299B GOTO 19B 29BF GOTO 1BF
299C GOTO 19C 29C0 GOTO 1C0
299D GOTO 19D 29C1 GOTO 1C1
299E GOTO 19E 29C2 GOTO 1C2
299F GOTO 19F 29C3 GOTO 1C3
29A0 GOTO 1A0 29C4 GOTO 1C4
357

29C5 GOTO 1C5 29E9 GOTO 1E9


29C6 GOTO 1C6 29EA GOTO 1EA
29C7 GOTO 1C7 29EB GOTO 1EB
29C8 GOTO 1C8 29EC GOTO 1EC
29C9 GOTO 1C9 29ED GOTO 1ED
29CA GOTO 1CA 29EE GOTO 1EE
29CB GOTO 1CB 29EF GOTO 1EF
29CC GOTO 1CC 29F0 GOTO 1F0
29CD GOTO 1CD 29F1 GOTO 1F1
29CE GOTO 1CE 29F2 GOTO 1F2
29CF GOTO 1CF 29F3 GOTO 1F3
29D0 GOTO 1D0 29F4 GOTO 1F4
29D1 GOTO 1D1 29F5 GOTO 1F5
29D2 GOTO 1D2 29F6 GOTO 1F6
29D3 GOTO 1D3 29F7 GOTO 1F7
29D4 GOTO 1D4 29F8 GOTO 1F8
29D5 GOTO 1D5 29F9 GOTO 1F9
29D6 GOTO 1D6 29FA GOTO 1FA
29D7 GOTO 1D7 29FB GOTO 1FB
29D8 GOTO 1D8 29FC GOTO 1FC
29D9 GOTO 1D9 29FD GOTO 1FD
29DA GOTO 1DA 29FE GOTO 1FE
29DB GOTO 1DB 29FF GOTO 1FF
29DC GOTO 1DC 2A00 GOTO 200
29DD GOTO 1DD 2A01 GOTO 201
29DE GOTO 1DE 2A02 GOTO 202
29DF GOTO 1DF 2A03 GOTO 203
29E0 GOTO 1E0 2A04 GOTO 204
29E1 GOTO 1E1 2A05 GOTO 205
29E2 GOTO 1E2 2A06 GOTO 206
29E3 GOTO 1E3 2A07 GOTO 207
29E4 GOTO 1E4 2A08 GOTO 208
29E5 GOTO 1E5 2A09 GOTO 209
29E6 GOTO 1E6 2A0A GOTO 20A
29E7 GOTO 1E7 2A0B GOTO 20B
29E8 GOTO 1E8 2A0C GOTO 20C
358

2A0D GOTO 20D 2A31 GOTO 231


2A0E GOTO 20E 2A32 GOTO 232
2A0F GOTO 20F 2A33 GOTO 233
2A10 GOTO 210 2A34 GOTO 234
2A11 GOTO 211 2A35 GOTO 235
2A12 GOTO 212 2A36 GOTO 236
2A13 GOTO 213 2A37 GOTO 237
2A14 GOTO 214 2A38 GOTO 238
2A15 GOTO 215 2A39 GOTO 239
2A16 GOTO 216 2A3A GOTO 23A
2A17 GOTO 217 2A3B GOTO 23B
2A18 GOTO 218 2A3C GOTO 23C
2A19 GOTO 219 2A3D GOTO 23D
2A1A GOTO 21A 2A3E GOTO 23E
2A1B GOTO 21B 2A3F GOTO 23F
2A1C GOTO 21C 2A40 GOTO 240
2A1D GOTO 21D 2A41 GOTO 241
2A1E GOTO 21E 2A42 GOTO 242
2A1F GOTO 21F 2A43 GOTO 243
2A20 GOTO 220 2A44 GOTO 244
2A21 GOTO 221 2A45 GOTO 245
2A22 GOTO 222 2A46 GOTO 246
2A23 GOTO 223 2A47 GOTO 247
2A24 GOTO 224 2A48 GOTO 248
2A25 GOTO 225 2A49 GOTO 249
2A26 GOTO 226 2A4A GOTO 24A
2A27 GOTO 227 2A4B GOTO 24B
2A28 GOTO 228 2A4C GOTO 24C
2A29 GOTO 229 2A4D GOTO 24D
2A2A GOTO 22A 2A4E GOTO 24E
2A2B GOTO 22B 2A4F GOTO 24F
2A2C GOTO 22C 2A50 GOTO 250
2A2D GOTO 22D 2A51 GOTO 251
2A2E GOTO 22E 2A52 GOTO 252
2A2F GOTO 22F 2A53 GOTO 253
2A30 GOTO 230 2A54 GOTO 254
359

2A55 GOTO 255 2A79 GOTO 279


2A56 GOTO 256 2A7A GOTO 27A
2A57 GOTO 257 2A7B GOTO 27B
2A58 GOTO 258 2A7C GOTO 27C
2A59 GOTO 259 2A7D GOTO 27D
2A5A GOTO 25A 2A7E GOTO 27E
2A5B GOTO 25B 2A7F GOTO 27F
2A5C GOTO 25C 2A80 GOTO 280
2A5D GOTO 25D 2A81 GOTO 281
2A5E GOTO 25E 2A82 GOTO 282
2A5F GOTO 25F 2A83 GOTO 283
2A60 GOTO 260 2A84 GOTO 284
2A61 GOTO 261 2A85 GOTO 285
2A62 GOTO 262 2A86 GOTO 286
2A63 GOTO 263 2A87 GOTO 287
2A64 GOTO 264 2A88 GOTO 288
2A65 GOTO 265 2A89 GOTO 289
2A66 GOTO 266 2A8A GOTO 28A
2A67 GOTO 267 2A8B GOTO 28B
2A68 GOTO 268 2A8C GOTO 28C
2A69 GOTO 269 2A8D GOTO 28D
2A6A GOTO 26A 2A8E GOTO 28E
2A6B GOTO 26B 2A8F GOTO 28F
2A6C GOTO 26C 2A90 GOTO 290
2A6D GOTO 26D 2A91 GOTO 291
2A6E GOTO 26E 2A92 GOTO 292
2A6F GOTO 26F 2A93 GOTO 293
2A70 GOTO 270 2A94 GOTO 294
2A71 GOTO 271 2A95 GOTO 295
2A72 GOTO 272 2A96 GOTO 296
2A73 GOTO 273 2A97 GOTO 297
2A74 GOTO 274 2A98 GOTO 298
2A75 GOTO 275 2A99 GOTO 299
2A76 GOTO 276 2A9A GOTO 29A
2A77 GOTO 277 2A9B GOTO 29B
2A78 GOTO 278 2A9C GOTO 29C
360

2A9D GOTO 29D 2AC1 GOTO 2C1


2A9E GOTO 29E 2AC2 GOTO 2C2
2A9F GOTO 29F 2AC3 GOTO 2C3
2AA0 GOTO 2A0 2AC4 GOTO 2C4
2AA1 GOTO 2A1 2AC5 GOTO 2C5
2AA2 GOTO 2A2 2AC6 GOTO 2C6
2AA3 GOTO 2A3 2AC7 GOTO 2C7
2AA4 GOTO 2A4 2AC8 GOTO 2C8
2AA5 GOTO 2A5 2AC9 GOTO 2C9
2AA6 GOTO 2A6 2ACA GOTO 2CA
2AA7 GOTO 2A7 2ACB GOTO 2CB
2AA8 GOTO 2A8 2ACC GOTO 2CC
2AA9 GOTO 2A9 2ACD GOTO 2CD
2AAA GOTO 2AA 2ACE GOTO 2CE
2AAB GOTO 2AB 2ACF GOTO 2CF
2AAC GOTO 2AC 2AD0 GOTO 2D0
2AAD GOTO 2AD 2AD1 GOTO 2D1
2AAE GOTO 2AE 2AD2 GOTO 2D2
2AAF GOTO 2AF 2AD3 GOTO 2D3
2AB0 GOTO 2B0 2AD4 GOTO 2D4
2AB1 GOTO 2B1 2AD5 GOTO 2D5
2AB2 GOTO 2B2 2AD6 GOTO 2D6
2AB3 GOTO 2B3 2AD7 GOTO 2D7
2AB4 GOTO 2B4 2AD8 GOTO 2D8
2AB5 GOTO 2B5 2AD9 GOTO 2D9
2AB6 GOTO 2B6 2ADA GOTO 2DA
2AB7 GOTO 2B7 2ADB GOTO 2DB
2AB8 GOTO 2B8 2ADC GOTO 2DC
2AB9 GOTO 2B9 2ADD GOTO 2DD
2ABA GOTO 2BA 2ADE GOTO 2DE
2ABB GOTO 2BB 2ADF GOTO 2DF
2ABC GOTO 2BC 2AE0 GOTO 2E0
2ABD GOTO 2BD 2AE1 GOTO 2E1
2ABE GOTO 2BE 2AE2 GOTO 2E2
2ABF GOTO 2BF 2AE3 GOTO 2E3
2AC0 GOTO 2C0 2AE4 GOTO 2E4
361

2AE5 GOTO 2E5 2B09 GOTO 309


2AE6 GOTO 2E6 2B0A GOTO 30A
2AE7 GOTO 2E7 2B0B GOTO 30B
2AE8 GOTO 2E8 2B0C GOTO 30C
2AE9 GOTO 2E9 2B0D GOTO 30D
2AEA GOTO 2EA 2B0E GOTO 30E
2AEB GOTO 2EB 2B0F GOTO 30F
2AEC GOTO 2EC 2B10 GOTO 310
2AED GOTO 2ED 2B11 GOTO 311
2AEE GOTO 2EE 2B12 GOTO 312
2AEF GOTO 2EF 2B13 GOTO 313
2AF0 GOTO 2F0 2B14 GOTO 314
2AF1 GOTO 2F1 2B15 GOTO 315
2AF2 GOTO 2F2 2B16 GOTO 316
2AF3 GOTO 2F3 2B17 GOTO 317
2AF4 GOTO 2F4 2B18 GOTO 318
2AF5 GOTO 2F5 2B19 GOTO 319
2AF6 GOTO 2F6 2B1A GOTO 31A
2AF7 GOTO 2F7 2B1B GOTO 31B
2AF8 GOTO 2F8 2B1C GOTO 31C
2AF9 GOTO 2F9 2B1D GOTO 31D
2AFA GOTO 2FA 2B1E GOTO 31E
2AFB GOTO 2FB 2B1F GOTO 31F
2AFC GOTO 2FC 2B20 GOTO 320
2AFD GOTO 2FD 2B21 GOTO 321
2AFE GOTO 2FE 2B22 GOTO 322
2AFF GOTO 2FF 2B23 GOTO 323
2B00 GOTO 300 2B24 GOTO 324
2B01 GOTO 301 2B25 GOTO 325
2B02 GOTO 302 2B26 GOTO 326
2B03 GOTO 303 2B27 GOTO 327
2B04 GOTO 304 2B28 GOTO 328
2B05 GOTO 305 2B29 GOTO 329
2B06 GOTO 306 2B2A GOTO 32A
2B07 GOTO 307 2B2B GOTO 32B
2B08 GOTO 308 2B2C GOTO 32C
362

2B2D GOTO 32D 2B51 GOTO 351


2B2E GOTO 32E 2B52 GOTO 352
2B2F GOTO 32F 2B53 GOTO 353
2B30 GOTO 330 2B54 GOTO 354
2B31 GOTO 331 2B55 GOTO 355
2B32 GOTO 332 2B56 GOTO 356
2B33 GOTO 333 2B57 GOTO 357
2B34 GOTO 334 2B58 GOTO 358
2B35 GOTO 335 2B59 GOTO 359
2B36 GOTO 336 2B5A GOTO 35A
2B37 GOTO 337 2B5B GOTO 35B
2B38 GOTO 338 2B5C GOTO 35C
2B39 GOTO 339 2B5D GOTO 35D
2B3A GOTO 33A 2B5E GOTO 35E
2B3B GOTO 33B 2B5F GOTO 35F
2B3C GOTO 33C 2B60 GOTO 360
2B3D GOTO 33D 2B61 GOTO 361
2B3E GOTO 33E 2B62 GOTO 362
2B3F GOTO 33F 2B63 GOTO 363
2B40 GOTO 340 2B64 GOTO 364
2B41 GOTO 341 2B65 GOTO 365
2B42 GOTO 342 2B66 GOTO 366
2B43 GOTO 343 2B67 GOTO 367
2B44 GOTO 344 2B68 GOTO 368
2B45 GOTO 345 2B69 GOTO 369
2B46 GOTO 346 2B6A GOTO 36A
2B47 GOTO 347 2B6B GOTO 36B
2B48 GOTO 348 2B6C GOTO 36C
2B49 GOTO 349 2B6D GOTO 36D
2B4A GOTO 34A 2B6E GOTO 36E
2B4B GOTO 34B 2B6F GOTO 36F
2B4C GOTO 34C 2B70 GOTO 370
2B4D GOTO 34D 2B71 GOTO 371
2B4E GOTO 34E 2B72 GOTO 372
2B4F GOTO 34F 2B73 GOTO 373
2B50 GOTO 350 2B74 GOTO 374
363

2B75 GOTO 375 2B99 GOTO 399


2B76 GOTO 376 2B9A GOTO 39A
2B77 GOTO 377 2B9B GOTO 39B
2B78 GOTO 378 2B9C GOTO 39C
2B79 GOTO 379 2B9D GOTO 39D
2B7A GOTO 37A 2B9E GOTO 39E
2B7B GOTO 37B 2B9F GOTO 39F
2B7C GOTO 37C 2BA0 GOTO 3A0
2B7D GOTO 37D 2BA1 GOTO 3A1
2B7E GOTO 37E 2BA2 GOTO 3A2
2B7F GOTO 37F 2BA3 GOTO 3A3
2B80 GOTO 380 2BA4 GOTO 3A4
2B81 GOTO 381 2BA5 GOTO 3A5
2B82 GOTO 382 2BA6 GOTO 3A6
2B83 GOTO 383 2BA7 GOTO 3A7
2B84 GOTO 384 2BA8 GOTO 3A8
2B85 GOTO 385 2BA9 GOTO 3A9
2B86 GOTO 386 2BAA GOTO 3AA
2B87 GOTO 387 2BAB GOTO 3AB
2B88 GOTO 388 2BAC GOTO 3AC
2B89 GOTO 389 2BAD GOTO 3AD
2B8A GOTO 38A 2BAE GOTO 3AE
2B8B GOTO 38B 2BAF GOTO 3AF
2B8C GOTO 38C 2BB0 GOTO 3B0
2B8D GOTO 38D 2BB1 GOTO 3B1
2B8E GOTO 38E 2BB2 GOTO 3B2
2B8F GOTO 38F 2BB3 GOTO 3B3
2B90 GOTO 390 2BB4 GOTO 3B4
2B91 GOTO 391 2BB5 GOTO 3B5
2B92 GOTO 392 2BB6 GOTO 3B6
2B93 GOTO 393 2BB7 GOTO 3B7
2B94 GOTO 394 2BB8 GOTO 3B8
2B95 GOTO 395 2BB9 GOTO 3B9
2B96 GOTO 396 2BBA GOTO 3BA
2B97 GOTO 397 2BBB GOTO 3BB
2B98 GOTO 398 2BBC GOTO 3BC
364

2BBD GOTO 3BD 2BE1 GOTO 3E1


2BBE GOTO 3BE 2BE2 GOTO 3E2
2BBF GOTO 3BF 2BE3 GOTO 3E3
2BC0 GOTO 3C0 2BE4 GOTO 3E4
2BC1 GOTO 3C1 2BE5 GOTO 3E5
2BC2 GOTO 3C2 2BE6 GOTO 3E6
2BC3 GOTO 3C3 2BE7 GOTO 3E7
2BC4 GOTO 3C4 2BE8 GOTO 3E8
2BC5 GOTO 3C5 2BE9 GOTO 3E9
2BC6 GOTO 3C6 2BEA GOTO 3EA
2BC7 GOTO 3C7 2BEB GOTO 3EB
2BC8 GOTO 3C8 2BEC GOTO 3EC
2BC9 GOTO 3C9 2BED GOTO 3ED
2BCA GOTO 3CA 2BEE GOTO 3EE
2BCB GOTO 3CB 2BEF GOTO 3EF
2BCC GOTO 3CC 2BF0 GOTO 3F0
2BCD GOTO 3CD 2BF1 GOTO 3F1
2BCE GOTO 3CE 2BF2 GOTO 3F2
2BCF GOTO 3CF 2BF3 GOTO 3F3
2BD0 GOTO 3D0 2BF4 GOTO 3F4
2BD1 GOTO 3D1 2BF5 GOTO 3F5
2BD2 GOTO 3D2 2BF6 GOTO 3F6
2BD3 GOTO 3D3 2BF7 GOTO 3F7
2BD4 GOTO 3D4 2BF8 GOTO 3F8
2BD5 GOTO 3D5 2BF9 GOTO 3F9
2BD6 GOTO 3D6 2BFA GOTO 3FA
2BD7 GOTO 3D7 2BFB GOTO 3FB
2BD8 GOTO 3D8 2BFC GOTO 3FC
2BD9 GOTO 3D9 2BFD GOTO 3FD
2BDA GOTO 3DA 2BFE GOTO 3FE
2BDB GOTO 3DB 2BFF GOTO 3FF
2BDC GOTO 3DC 3000 MOVLW 00
2BDD GOTO 3DD 3001 MOVLW 01
2BDE GOTO 3DE 3002 MOVLW 02
2BDF GOTO 3DF 3003 MOVLW 03
2BE0 GOTO 3E0 3004 MOVLW 04
365

3005 MOVLW 05 3029 MOVLW 29


3006 MOVLW 06 302A MOVLW 2A
3007 MOVLW 07 302B MOVLW 2B
3008 MOVLW 08 302C MOVLW 2C
3009 MOVLW 09 302D MOVLW 2D
300A MOVLW 0A 302E MOVLW 2E
300B MOVLW 0B 302F MOVLW 2F
300C MOVLW 0C 3030 MOVLW 30
300D MOVLW 0D 3031 MOVLW 31
300E MOVLW 0E 3032 MOVLW 32
300F MOVLW 0F 3033 MOVLW 33
3010 MOVLW 10 3034 MOVLW 34
3011 MOVLW 11 3035 MOVLW 35
3012 MOVLW 12 3036 MOVLW 36
3013 MOVLW 13 3037 MOVLW 37
3014 MOVLW 14 3038 MOVLW 38
3015 MOVLW 15 3039 MOVLW 39
3016 MOVLW 16 303A MOVLW 3A
3017 MOVLW 17 303B MOVLW 3B
3018 MOVLW 18 303C MOVLW 3C
3019 MOVLW 19 303D MOVLW 3D
301A MOVLW 1A 303E MOVLW 3E
301B MOVLW 1B 303F MOVLW 3F
301C MOVLW 1C 3040 MOVLW 40
301D MOVLW 1D 3041 MOVLW 41
301E MOVLW 1E 3042 MOVLW 42
301F MOVLW 1F 3043 MOVLW 43
3020 MOVLW 20 3044 MOVLW 44
3021 MOVLW 21 3045 MOVLW 45
3022 MOVLW 22 3046 MOVLW 46
3023 MOVLW 23 3047 MOVLW 47
3024 MOVLW 24 3048 MOVLW 48
3025 MOVLW 25 3049 MOVLW 49
3026 MOVLW 26 304A MOVLW 4A
3027 MOVLW 27 304B MOVLW 4B
3028 MOVLW 28 304C MOVLW 4C
366

304D MOVLW 4D 3071 MOVLW 71


304E MOVLW 4E 3072 MOVLW 72
304F MOVLW 4F 3073 MOVLW 73
3050 MOVLW 50 3074 MOVLW 74
3051 MOVLW 51 3075 MOVLW 75
3052 MOVLW 52 3076 MOVLW 76
3053 MOVLW 53 3077 MOVLW 77
3054 MOVLW 54 3078 MOVLW 78
3055 MOVLW 55 3079 MOVLW 79
3056 MOVLW 56 307A MOVLW 7A
3057 MOVLW 57 307B MOVLW 7B
3058 MOVLW 58 307C MOVLW 7C
3059 MOVLW 59 307D MOVLW 7D
305A MOVLW 5A 307E MOVLW 7E
305B MOVLW 5B 307F MOVLW 7F
305C MOVLW 5C 3080 MOVLW 80
305D MOVLW 5D 3081 MOVLW 81
305E MOVLW 5E 3082 MOVLW 82
305F MOVLW 5F 3083 MOVLW 83
3060 MOVLW 60 3084 MOVLW 84
3061 MOVLW 61 3085 MOVLW 85
3062 MOVLW 62 3086 MOVLW 86
3063 MOVLW 63 3087 MOVLW 87
3064 MOVLW 64 3088 MOVLW 88
3065 MOVLW 65 3089 MOVLW 89
3066 MOVLW 66 308A MOVLW 8A
3067 MOVLW 67 308B MOVLW 8B
3068 MOVLW 68 308C MOVLW 8C
3069 MOVLW 69 308D MOVLW 8D
306A MOVLW 6A 308E MOVLW 8E
306B MOVLW 6B 308F MOVLW 8F
306C MOVLW 6C 3090 MOVLW 90
306D MOVLW 6D 3091 MOVLW 91
306E MOVLW 6E 3092 MOVLW 92
306F MOVLW 6F 3093 MOVLW 93
3070 MOVLW 70 3094 MOVLW 94
367

3095 MOVLW 95 30B9 MOVLW B9


3096 MOVLW 96 30BA MOVLW BA
3097 MOVLW 97 30BB MOVLW BB
3098 MOVLW 98 30BC MOVLW BC
3099 MOVLW 99 30BD MOVLW BD
309A MOVLW 9A 30BE MOVLW BE
309B MOVLW 9B 30BF MOVLW BF
309C MOVLW 9C 30C0 MOVLW C0
309D MOVLW 9D 30C1 MOVLW C1
309E MOVLW 9E 30C2 MOVLW C2
309F MOVLW 9F 30C3 MOVLW C3
30A0 MOVLW A0 30C4 MOVLW C4
30A1 MOVLW A1 30C5 MOVLW C5
30A2 MOVLW A2 30C6 MOVLW C6
30A3 MOVLW A3 30C7 MOVLW C7
30A4 MOVLW A4 30C8 MOVLW C8
30A5 MOVLW A5 30C9 MOVLW C9
30A6 MOVLW A6 30CA MOVLW CA
30A7 MOVLW A7 30CB MOVLW CB
30A8 MOVLW A8 30CC MOVLW CC
30A9 MOVLW A9 30CD MOVLW CD
30AA MOVLW AA 30CE MOVLW CE
30AB MOVLW AB 30CF MOVLW CF
30AC MOVLW AC 30D0 MOVLW D0
30AD MOVLW AD 30D1 MOVLW D1
30AE MOVLW AE 30D2 MOVLW D2
30AF MOVLW AF 30D3 MOVLW D3
30B0 MOVLW B0 30D4 MOVLW D4
30B1 MOVLW B1 30D5 MOVLW D5
30B2 MOVLW B2 30D6 MOVLW D6
30B3 MOVLW B3 30D7 MOVLW D7
30B4 MOVLW B4 30D8 MOVLW D8
30B5 MOVLW B5 30D9 MOVLW D9
30B6 MOVLW B6 30DA MOVLW DA
30B7 MOVLW B7 30DB MOVLW DB
30B8 MOVLW B8 30DC MOVLW DC
368

30DD MOVLW DD 3401 RETLW 01


30DE MOVLW DE 3402 RETLW 02
30DF MOVLW DF 3403 RETLW 03
30E0 MOVLW E0 3404 RETLW 04
30E1 MOVLW E1 3405 RETLW 05
30E2 MOVLW E2 3406 RETLW 06
30E3 MOVLW E3 3407 RETLW 07
30E4 MOVLW E4 3408 RETLW 08
30E5 MOVLW E5 3409 RETLW 09
30E6 MOVLW E6 340A RETLW 0A
30E7 MOVLW E7 340B RETLW 0B
30E8 MOVLW E8 340C RETLW 0C
30E9 MOVLW E9 340D RETLW 0D
30EA MOVLW EA 340E RETLW 0E
30EB MOVLW EB 340F RETLW 0F
30EC MOVLW EC 3410 RETLW 10
30ED MOVLW ED 3411 RETLW 11
30EE MOVLW EE 3412 RETLW 12
30EF MOVLW EF 3413 RETLW 13
30F0 MOVLW F0 3414 RETLW 14
30F1 MOVLW F1 3415 RETLW 15
30F2 MOVLW F2 3416 RETLW 16
30F3 MOVLW F3 3417 RETLW 17
30F4 MOVLW F4 3418 RETLW 18
30F5 MOVLW F5 3419 RETLW 19
30F6 MOVLW F6 341A RETLW 1A
30F7 MOVLW F7 341B RETLW 1B
30F8 MOVLW F8 341C RETLW 1C
30F9 MOVLW F9 341D RETLW 1D
30FA MOVLW FA 341E RETLW 1E
30FB MOVLW FB 341F RETLW 1F
30FC MOVLW FC 3420 RETLW 20
30FD MOVLW FD 3421 RETLW 21
30FE MOVLW FE 3422 RETLW 22
30FF MOVLW FF 3423 RETLW 23
3400 RETLW 00 3424 RETLW 24
369

3425 RETLW 25 3449 RETLW 49


3426 RETLW 26 344A RETLW 4A
3427 RETLW 27 344B RETLW 4B
3428 RETLW 28 344C RETLW 4C
3429 RETLW 29 344D RETLW 4D
342A RETLW 2A 344E RETLW 4E
342B RETLW 2B 344F RETLW 4F
342C RETLW 2C 3450 RETLW 50
342D RETLW 2D 3451 RETLW 51
342E RETLW 2E 3452 RETLW 52
342F RETLW 2F 3453 RETLW 53
3430 RETLW 30 3454 RETLW 54
3431 RETLW 31 3455 RETLW 55
3432 RETLW 32 3456 RETLW 56
3433 RETLW 33 3457 RETLW 57
3434 RETLW 34 3458 RETLW 58
3435 RETLW 35 3459 RETLW 59
3436 RETLW 36 345A RETLW 5A
3437 RETLW 37 345B RETLW 5B
3438 RETLW 38 345C RETLW 5C
3439 RETLW 39 345D RETLW 5D
343A RETLW 3A 345E RETLW 5E
343B RETLW 3B 345F RETLW 5F
343C RETLW 3C 3460 RETLW 60
343D RETLW 3D 3461 RETLW 61
343E RETLW 3E 3462 RETLW 62
343F RETLW 3F 3463 RETLW 63
3440 RETLW 40 3464 RETLW 64
3441 RETLW 41 3465 RETLW 65
3442 RETLW 42 3466 RETLW 66
3443 RETLW 43 3467 RETLW 67
3444 RETLW 44 3468 RETLW 68
3445 RETLW 45 3469 RETLW 69
3446 RETLW 46 346A RETLW 6A
3447 RETLW 47 346B RETLW 6B
3448 RETLW 48 346C RETLW 6C
370

346D RETLW 6D 3491 RETLW 91


346E RETLW 6E 3492 RETLW 92
346F RETLW 6F 3493 RETLW 93
3470 RETLW 70 3494 RETLW 94
3471 RETLW 71 3495 RETLW 95
3472 RETLW 72 3496 RETLW 96
3473 RETLW 73 3497 RETLW 97
3474 RETLW 74 3498 RETLW 98
3475 RETLW 75 3499 RETLW 99
3476 RETLW 76 349A RETLW 9A
3477 RETLW 77 349B RETLW 9B
3478 RETLW 78 349C RETLW 9C
3479 RETLW 79 349D RETLW 9D
347A RETLW 7A 349E RETLW 9E
347B RETLW 7B 349F RETLW 9F
347C RETLW 7C 34A0 RETLW A0
347D RETLW 7D 34A1 RETLW A1
347E RETLW 7E 34A2 RETLW A2
347F RETLW 7F 34A3 RETLW A3
3480 RETLW 80 34A4 RETLW A4
3481 RETLW 81 34A5 RETLW A5
3482 RETLW 82 34A6 RETLW A6
3483 RETLW 83 34A7 RETLW A7
3484 RETLW 84 34A8 RETLW A8
3485 RETLW 85 34A9 RETLW A9
3486 RETLW 86 34AA RETLW AA
3487 RETLW 87 34AB RETLW AB
3488 RETLW 88 34AC RETLW AC
3489 RETLW 89 34AD RETLW AD
348A RETLW 8A 34AE RETLW AE
348B RETLW 8B 34AF RETLW AF
348C RETLW 8C 34B0 RETLW B0
348D RETLW 8D 34B1 RETLW B1
348E RETLW 8E 34B2 RETLW B2
348F RETLW 8F 34B3 RETLW B3
3490 RETLW 90 34B4 RETLW B4
371

34B5 RETLW B5 34D9 RETLW D9


34B6 RETLW B6 34DA RETLW DA
34B7 RETLW B7 34DB RETLW DB
34B8 RETLW B8 34DC RETLW DC
34B9 RETLW B9 34DD RETLW DD
34BA RETLW BA 34DE RETLW DE
34BB RETLW BB 34DF RETLW DF
34BC RETLW BC 34E0 RETLW E0
34BD RETLW BD 34E1 RETLW E1
34BE RETLW BE 34E2 RETLW E2
34BF RETLW BF 34E3 RETLW E3
34C0 RETLW C0 34E4 RETLW E4
34C1 RETLW C1 34E5 RETLW E5
34C2 RETLW C2 34E6 RETLW E6
34C3 RETLW C3 34E7 RETLW E7
34C4 RETLW C4 34E8 RETLW E8
34C5 RETLW C5 34E9 RETLW E9
34C6 RETLW C6 34EA RETLW EA
34C7 RETLW C7 34EB RETLW EB
34C8 RETLW C8 34EC RETLW EC
34C9 RETLW C9 34ED RETLW ED
34CA RETLW CA 34EE RETLW EE
34CB RETLW CB 34EF RETLW EF
34CC RETLW CC 34F0 RETLW F0
34CD RETLW CD 34F1 RETLW F1
34CE RETLW CE 34F2 RETLW F2
34CF RETLW CF 34F3 RETLW F3
34D0 RETLW D0 34F4 RETLW F4
34D1 RETLW D1 34F5 RETLW F5
34D2 RETLW D2 34F6 RETLW F6
34D3 RETLW D3 34F7 RETLW F7
34D4 RETLW D4 34F8 RETLW F8
34D5 RETLW D5 34F9 RETLW F9
34D6 RETLW D6 34FA RETLW FA
34D7 RETLW D7 34FB RETLW FB
34D8 RETLW D8 34FC RETLW FC
372

34FD RETLW FD 3821 IORLW 21


34FE RETLW FE 3822 IORLW 22
34FF RETLW FF 3823 IORLW 23
3800 IORLW 00 3824 IORLW 24
3801 IORLW 01 3825 IORLW 25
3802 IORLW 02 3826 IORLW 26
3803 IORLW 03 3827 IORLW 27
3804 IORLW 04 3828 IORLW 28
3805 IORLW 05 3829 IORLW 29
3806 IORLW 06 382A IORLW 2A
3807 IORLW 07 382B IORLW 2B
3808 IORLW 08 382C IORLW 2C
3809 IORLW 09 382D IORLW 2D
380A IORLW 0A 382E IORLW 2E
380B IORLW 0B 382F IORLW 2F
380C IORLW 0C 3830 IORLW 30
380D IORLW 0D 3831 IORLW 31
380E IORLW 0E 3832 IORLW 32
380F IORLW 0F 3833 IORLW 33
3810 IORLW 10 3834 IORLW 34
3811 IORLW 11 3835 IORLW 35
3812 IORLW 12 3836 IORLW 36
3813 IORLW 13 3837 IORLW 37
3814 IORLW 14 3838 IORLW 38
3815 IORLW 15 3839 IORLW 39
3816 IORLW 16 383A IORLW 3A
3817 IORLW 17 383B IORLW 3B
3818 IORLW 18 383C IORLW 3C
3819 IORLW 19 383D IORLW 3D
381A IORLW 1A 383E IORLW 3E
381B IORLW 1B 383F IORLW 3F
381C IORLW 1C 3840 IORLW 40
381D IORLW 1D 3841 IORLW 41
381E IORLW 1E 3842 IORLW 42
381F IORLW 1F 3843 IORLW 43
3820 IORLW 20 3844 IORLW 44
373

3845 IORLW 45 3869 IORLW 69


3846 IORLW 46 386A IORLW 6A
3847 IORLW 47 386B IORLW 6B
3848 IORLW 48 386C IORLW 6C
3849 IORLW 49 386D IORLW 6D
384A IORLW 4A 386E IORLW 6E
384B IORLW 4B 386F IORLW 6F
384C IORLW 4C 3870 IORLW 70
384D IORLW 4D 3871 IORLW 71
384E IORLW 4E 3872 IORLW 72
384F IORLW 4F 3873 IORLW 73
3850 IORLW 50 3874 IORLW 74
3851 IORLW 51 3875 IORLW 75
3852 IORLW 52 3876 IORLW 76
3853 IORLW 53 3877 IORLW 77
3854 IORLW 54 3878 IORLW 78
3855 IORLW 55 3879 IORLW 79
3856 IORLW 56 387A IORLW 7A
3857 IORLW 57 387B IORLW 7B
3858 IORLW 58 387C IORLW 7C
3859 IORLW 59 387D IORLW 7D
385A IORLW 5A 387E IORLW 7E
385B IORLW 5B 387F IORLW 7F
385C IORLW 5C 3880 IORLW 80
385D IORLW 5D 3881 IORLW 81
385E IORLW 5E 3882 IORLW 82
385F IORLW 5F 3883 IORLW 83
3860 IORLW 60 3884 IORLW 84
3861 IORLW 61 3885 IORLW 85
3862 IORLW 62 3886 IORLW 86
3863 IORLW 63 3887 IORLW 87
3864 IORLW 64 3888 IORLW 88
3865 IORLW 65 3889 IORLW 89
3866 IORLW 66 388A IORLW 8A
3867 IORLW 67 388B IORLW 8B
3868 IORLW 68 388C IORLW 8C
374

388D IORLW 8D 38B1 IORLW B1


388E IORLW 8E 38B2 IORLW B2
388F IORLW 8F 38B3 IORLW B3
3890 IORLW 90 38B4 IORLW B4
3891 IORLW 91 38B5 IORLW B5
3892 IORLW 92 38B6 IORLW B6
3893 IORLW 93 38B7 IORLW B7
3894 IORLW 94 38B8 IORLW B8
3895 IORLW 95 38B9 IORLW B9
3896 IORLW 96 38BA IORLW BA
3897 IORLW 97 38BB IORLW BB
3898 IORLW 98 38BC IORLW BC
3899 IORLW 99 38BD IORLW BD
389A IORLW 9A 38BE IORLW BE
389B IORLW 9B 38BF IORLW BF
389C IORLW 9C 38C0 IORLW C0
389D IORLW 9D 38C1 IORLW C1
389E IORLW 9E 38C2 IORLW C2
389F IORLW 9F 38C3 IORLW C3
38A0 IORLW A0 38C4 IORLW C4
38A1 IORLW A1 38C5 IORLW C5
38A2 IORLW A2 38C6 IORLW C6
38A3 IORLW A3 38C7 IORLW C7
38A4 IORLW A4 38C8 IORLW C8
38A5 IORLW A5 38C9 IORLW C9
38A6 IORLW A6 38CA IORLW CA
38A7 IORLW A7 38CB IORLW CB
38A8 IORLW A8 38CC IORLW CC
38A9 IORLW A9 38CD IORLW CD
38AA IORLW AA 38CE IORLW CE
38AB IORLW AB 38CF IORLW CF
38AC IORLW AC 38D0 IORLW D0
38AD IORLW AD 38D1 IORLW D1
38AE IORLW AE 38D2 IORLW D2
38AF IORLW AF 38D3 IORLW D3
38B0 IORLW B0 38D4 IORLW D4
375

38D5 IORLW D5 38F9 IORLW F9


38D6 IORLW D6 38FA IORLW FA
38D7 IORLW D7 38FB IORLW FB
38D8 IORLW D8 38FC IORLW FC
38D9 IORLW D9 38FD IORLW FD
38DA IORLW DA 38FE IORLW FE
38DB IORLW DB 38FF IORLW FF
38DC IORLW DC 3900 ANDLW 00
38DD IORLW DD 3901 ANDLW 01
38DE IORLW DE 3902 ANDLW 02
38DF IORLW DF 3903 ANDLW 03
38E0 IORLW E0 3904 ANDLW 04
38E1 IORLW E1 3905 ANDLW 05
38E2 IORLW E2 3906 ANDLW 06
38E3 IORLW E3 3907 ANDLW 07
38E4 IORLW E4 3908 ANDLW 08
38E5 IORLW E5 3909 ANDLW 09
38E6 IORLW E6 390A ANDLW 0A
38E7 IORLW E7 390B ANDLW 0B
38E8 IORLW E8 390C ANDLW 0C
38E9 IORLW E9 390D ANDLW 0D
38EA IORLW EA 390E ANDLW 0E
38EB IORLW EB 390F ANDLW 0F
38EC IORLW EC 3910 ANDLW 10
38ED IORLW ED 3911 ANDLW 11
38EE IORLW EE 3912 ANDLW 12
38EF IORLW EF 3913 ANDLW 13
38F0 IORLW F0 3914 ANDLW 14
38F1 IORLW F1 3915 ANDLW 15
38F2 IORLW F2 3916 ANDLW 16
38F3 IORLW F3 3917 ANDLW 17
38F4 IORLW F4 3918 ANDLW 18
38F5 IORLW F5 3919 ANDLW 19
38F6 IORLW F6 391A ANDLW 1A
38F7 IORLW F7 391B ANDLW 1B
38F8 IORLW F8 391C ANDLW 1C
376

391D ANDLW 1D 3941 ANDLW 41


391E ANDLW 1E 3942 ANDLW 42
391F ANDLW 1F 3943 ANDLW 43
3920 ANDLW 20 3944 ANDLW 44
3921 ANDLW 21 3945 ANDLW 45
3922 ANDLW 22 3946 ANDLW 46
3923 ANDLW 23 3947 ANDLW 47
3924 ANDLW 24 3948 ANDLW 48
3925 ANDLW 25 3949 ANDLW 49
3926 ANDLW 26 394A ANDLW 4A
3927 ANDLW 27 394B ANDLW 4B
3928 ANDLW 28 394C ANDLW 4C
3929 ANDLW 29 394D ANDLW 4D
392A ANDLW 2A 394E ANDLW 4E
392B ANDLW 2B 394F ANDLW 4F
392C ANDLW 2C 3950 ANDLW 50
392D ANDLW 2D 3951 ANDLW 51
392E ANDLW 2E 3952 ANDLW 52
392F ANDLW 2F 3953 ANDLW 53
3930 ANDLW 30 3954 ANDLW 54
3931 ANDLW 31 3955 ANDLW 55
3932 ANDLW 32 3956 ANDLW 56
3933 ANDLW 33 3957 ANDLW 57
3934 ANDLW 34 3958 ANDLW 58
3935 ANDLW 35 3959 ANDLW 59
3936 ANDLW 36 395A ANDLW 5A
3937 ANDLW 37 395B ANDLW 5B
3938 ANDLW 38 395C ANDLW 5C
3939 ANDLW 39 395D ANDLW 5D
393A ANDLW 3A 395E ANDLW 5E
393B ANDLW 3B 395F ANDLW 5F
393C ANDLW 3C 3960 ANDLW 60
393D ANDLW 3D 3961 ANDLW 61
393E ANDLW 3E 3962 ANDLW 62
393F ANDLW 3F 3963 ANDLW 63
3940 ANDLW 40 3964 ANDLW 64
377

3965 ANDLW 65 3989 ANDLW 89


3966 ANDLW 66 398A ANDLW 8A
3967 ANDLW 67 398B ANDLW 8B
3968 ANDLW 68 398C ANDLW 8C
3969 ANDLW 69 398D ANDLW 8D
396A ANDLW 6A 398E ANDLW 8E
396B ANDLW 6B 398F ANDLW 8F
396C ANDLW 6C 3990 ANDLW 90
396D ANDLW 6D 3991 ANDLW 91
396E ANDLW 6E 3992 ANDLW 92
396F ANDLW 6F 3993 ANDLW 93
3970 ANDLW 70 3994 ANDLW 94
3971 ANDLW 71 3995 ANDLW 95
3972 ANDLW 72 3996 ANDLW 96
3973 ANDLW 73 3997 ANDLW 97
3974 ANDLW 74 3998 ANDLW 98
3975 ANDLW 75 3999 ANDLW 99
3976 ANDLW 76 399A ANDLW 9A
3977 ANDLW 77 399B ANDLW 9B
3978 ANDLW 78 399C ANDLW 9C
3979 ANDLW 79 399D ANDLW 9D
397A ANDLW 7A 399E ANDLW 9E
397B ANDLW 7B 399F ANDLW 9F
397C ANDLW 7C 39A0 ANDLW A0
397D ANDLW 7D 39A1 ANDLW A1
397E ANDLW 7E 39A2 ANDLW A2
397F ANDLW 7F 39A3 ANDLW A3
3980 ANDLW 80 39A4 ANDLW A4
3981 ANDLW 81 39A5 ANDLW A5
3982 ANDLW 82 39A6 ANDLW A6
3983 ANDLW 83 39A7 ANDLW A7
3984 ANDLW 84 39A8 ANDLW A8
3985 ANDLW 85 39A9 ANDLW A9
3986 ANDLW 86 39AA ANDLW AA
3987 ANDLW 87 39AB ANDLW AB
3988 ANDLW 88 39AC ANDLW AC
378

39AD ANDLW AD 39D1 ANDLW D1


39AE ANDLW AE 39D2 ANDLW D2
39AF ANDLW AF 39D3 ANDLW D3
39B0 ANDLW B0 39D4 ANDLW D4
39B1 ANDLW B1 39D5 ANDLW D5
39B2 ANDLW B2 39D6 ANDLW D6
39B3 ANDLW B3 39D7 ANDLW D7
39B4 ANDLW B4 39D8 ANDLW D8
39B5 ANDLW B5 39D9 ANDLW D9
39B6 ANDLW B6 39DA ANDLW DA
39B7 ANDLW B7 39DB ANDLW DB
39B8 ANDLW B8 39DC ANDLW DC
39B9 ANDLW B9 39DD ANDLW DD
39BA ANDLW BA 39DE ANDLW DE
39BB ANDLW BB 39DF ANDLW DF
39BC ANDLW BC 39E0 ANDLW E0
39BD ANDLW BD 39E1 ANDLW E1
39BE ANDLW BE 39E2 ANDLW E2
39BF ANDLW BF 39E3 ANDLW E3
39C0 ANDLW C0 39E4 ANDLW E4
39C1 ANDLW C1 39E5 ANDLW E5
39C2 ANDLW C2 39E6 ANDLW E6
39C3 ANDLW C3 39E7 ANDLW E7
39C4 ANDLW C4 39E8 ANDLW E8
39C5 ANDLW C5 39E9 ANDLW E9
39C6 ANDLW C6 39EA ANDLW EA
39C7 ANDLW C7 39EB ANDLW EB
39C8 ANDLW C8 39EC ANDLW EC
39C9 ANDLW C9 39ED ANDLW ED
39CA ANDLW CA 39EE ANDLW EE
39CB ANDLW CB 39EF ANDLW EF
39CC ANDLW CC 39F0 ANDLW F0
39CD ANDLW CD 39F1 ANDLW F1
39CE ANDLW CE 39F2 ANDLW F2
39CF ANDLW CF 39F3 ANDLW F3
39D0 ANDLW D0 39F4 ANDLW F4
379

39F5 ANDLW F5 3A19 XORLW 19


39F6 ANDLW F6 3A1A XORLW 1A
39F7 ANDLW F7 3A1B XORLW 1B
39F8 ANDLW F8 3A1C XORLW 1C
39F9 ANDLW F9 3A1D XORLW 1D
39FA ANDLW FA 3A1E XORLW 1E
39FB ANDLW FB 3A1F XORLW 1F
39FC ANDLW FC 3A20 XORLW 20
39FD ANDLW FD 3A21 XORLW 21
39FE ANDLW FE 3A22 XORLW 22
39FF ANDLW FF 3A23 XORLW 23
3A00 XORLW 00 3A24 XORLW 24
3A01 XORLW 01 3A25 XORLW 25
3A02 XORLW 02 3A26 XORLW 26
3A03 XORLW 03 3A27 XORLW 27
3A04 XORLW 04 3A28 XORLW 28
3A05 XORLW 05 3A29 XORLW 29
3A06 XORLW 06 3A2A XORLW 2A
3A07 XORLW 07 3A2B XORLW 2B
3A08 XORLW 08 3A2C XORLW 2C
3A09 XORLW 09 3A2D XORLW 2D
3A0A XORLW 0A 3A2E XORLW 2E
3A0B XORLW 0B 3A2F XORLW 2F
3A0C XORLW 0C 3A30 XORLW 30
3A0D XORLW 0D 3A31 XORLW 31
3A0E XORLW 0E 3A32 XORLW 32
3A0F XORLW 0F 3A33 XORLW 33
3A10 XORLW 10 3A34 XORLW 34
3A11 XORLW 11 3A35 XORLW 35
3A12 XORLW 12 3A36 XORLW 36
3A13 XORLW 13 3A37 XORLW 37
3A14 XORLW 14 3A38 XORLW 38
3A15 XORLW 15 3A39 XORLW 39
3A16 XORLW 16 3A3A XORLW 3A
3A17 XORLW 17 3A3B XORLW 3B
3A18 XORLW 18 3A3C XORLW 3C
380

3A3D XORLW 3D 3A61 XORLW 61


3A3E XORLW 3E 3A62 XORLW 62
3A3F XORLW 3F 3A63 XORLW 63
3A40 XORLW 40 3A64 XORLW 64
3A41 XORLW 41 3A65 XORLW 65
3A42 XORLW 42 3A66 XORLW 66
3A43 XORLW 43 3A67 XORLW 67
3A44 XORLW 44 3A68 XORLW 68
3A45 XORLW 45 3A69 XORLW 69
3A46 XORLW 46 3A6A XORLW 6A
3A47 XORLW 47 3A6B XORLW 6B
3A48 XORLW 48 3A6C XORLW 6C
3A49 XORLW 49 3A6D XORLW 6D
3A4A XORLW 4A 3A6E XORLW 6E
3A4B XORLW 4B 3A6F XORLW 6F
3A4C XORLW 4C 3A70 XORLW 70
3A4D XORLW 4D 3A71 XORLW 71
3A4E XORLW 4E 3A72 XORLW 72
3A4F XORLW 4F 3A73 XORLW 73
3A50 XORLW 50 3A74 XORLW 74
3A51 XORLW 51 3A75 XORLW 75
3A52 XORLW 52 3A76 XORLW 76
3A53 XORLW 53 3A77 XORLW 77
3A54 XORLW 54 3A78 XORLW 78
3A55 XORLW 55 3A79 XORLW 79
3A56 XORLW 56 3A7A XORLW 7A
3A57 XORLW 57 3A7B XORLW 7B
3A58 XORLW 58 3A7C XORLW 7C
3A59 XORLW 59 3A7D XORLW 7D
3A5A XORLW 5A 3A7E XORLW 7E
3A5B XORLW 5B 3A7F XORLW 7F
3A5C XORLW 5C 3A80 XORLW 80
3A5D XORLW 5D 3A81 XORLW 81
3A5E XORLW 5E 3A82 XORLW 82
3A5F XORLW 5F 3A83 XORLW 83
3A60 XORLW 60 3A84 XORLW 84
381

3A85 XORLW 85 3AA9 XORLW A9


3A86 XORLW 86 3AAA XORLW AA
3A87 XORLW 87 3AAB XORLW AB
3A88 XORLW 88 3AAC XORLW AC
3A89 XORLW 89 3AAD XORLW AD
3A8A XORLW 8A 3AAE XORLW AE
3A8B XORLW 8B 3AAF XORLW AF
3A8C XORLW 8C 3AB0 XORLW B0
3A8D XORLW 8D 3AB1 XORLW B1
3A8E XORLW 8E 3AB2 XORLW B2
3A8F XORLW 8F 3AB3 XORLW B3
3A90 XORLW 90 3AB4 XORLW B4
3A91 XORLW 91 3AB5 XORLW B5
3A92 XORLW 92 3AB6 XORLW B6
3A93 XORLW 93 3AB7 XORLW B7
3A94 XORLW 94 3AB8 XORLW B8
3A95 XORLW 95 3AB9 XORLW B9
3A96 XORLW 96 3ABA XORLW BA
3A97 XORLW 97 3ABB XORLW BB
3A98 XORLW 98 3ABC XORLW BC
3A99 XORLW 99 3ABD XORLW BD
3A9A XORLW 9A 3ABE XORLW BE
3A9B XORLW 9B 3ABF XORLW BF
3A9C XORLW 9C 3AC0 XORLW C0
3A9D XORLW 9D 3AC1 XORLW C1
3A9E XORLW 9E 3AC2 XORLW C2
3A9F XORLW 9F 3AC3 XORLW C3
3AA0 XORLW A0 3AC4 XORLW C4
3AA1 XORLW A1 3AC5 XORLW C5
3AA2 XORLW A2 3AC6 XORLW C6
3AA3 XORLW A3 3AC7 XORLW C7
3AA4 XORLW A4 3AC8 XORLW C8
3AA5 XORLW A5 3AC9 XORLW C9
3AA6 XORLW A6 3ACA XORLW CA
3AA7 XORLW A7 3ACB XORLW CB
3AA8 XORLW A8 3ACC XORLW CC
382

3ACD XORLW CD 3AF1 XORLW F1


3ACE XORLW CE 3AF2 XORLW F2
3ACF XORLW CF 3AF3 XORLW F3
3AD0 XORLW D0 3AF4 XORLW F4
3AD1 XORLW D1 3AF5 XORLW F5
3AD2 XORLW D2 3AF6 XORLW F6
3AD3 XORLW D3 3AF7 XORLW F7
3AD4 XORLW D4 3AF8 XORLW F8
3AD5 XORLW D5 3AF9 XORLW F9
3AD6 XORLW D6 3AFA XORLW FA
3AD7 XORLW D7 3AFB XORLW FB
3AD8 XORLW D8 3AFC XORLW FC
3AD9 XORLW D9 3AFD XORLW FD
3ADA XORLW DA 3AFE XORLW FE
3ADB XORLW DB 3AFF XORLW FF
3ADC XORLW DC 3C00 SUBLW 00
3ADD XORLW DD 3C01 SUBLW 01
3ADE XORLW DE 3C02 SUBLW 02
3ADF XORLW DF 3C03 SUBLW 03
3AE0 XORLW E0 3C04 SUBLW 04
3AE1 XORLW E1 3C05 SUBLW 05
3AE2 XORLW E2 3C06 SUBLW 06
3AE3 XORLW E3 3C07 SUBLW 07
3AE4 XORLW E4 3C08 SUBLW 08
3AE5 XORLW E5 3C09 SUBLW 09
3AE6 XORLW E6 3C0A SUBLW 0A
3AE7 XORLW E7 3C0B SUBLW 0B
3AE8 XORLW E8 3C0C SUBLW 0C
3AE9 XORLW E9 3C0D SUBLW 0D
3AEA XORLW EA 3C0E SUBLW 0E
3AEB XORLW EB 3C0F SUBLW 0F
3AEC XORLW EC 3C10 SUBLW 10
3AED XORLW ED 3C11 SUBLW 11
3AEE XORLW EE 3C12 SUBLW 12
3AEF XORLW EF 3C13 SUBLW 13
3AF0 XORLW F0 3C14 SUBLW 14
383

3C15 SUBLW 15 3C39 SUBLW 39


3C16 SUBLW 16 3C3A SUBLW 3A
3C17 SUBLW 17 3C3B SUBLW 3B
3C18 SUBLW 18 3C3C SUBLW 3C
3C19 SUBLW 19 3C3D SUBLW 3D
3C1A SUBLW 1A 3C3E SUBLW 3E
3C1B SUBLW 1B 3C3F SUBLW 3F
3C1C SUBLW 1C 3C40 SUBLW 40
3C1D SUBLW 1D 3C41 SUBLW 41
3C1E SUBLW 1E 3C42 SUBLW 42
3C1F SUBLW 1F 3C43 SUBLW 43
3C20 SUBLW 20 3C44 SUBLW 44
3C21 SUBLW 21 3C45 SUBLW 45
3C22 SUBLW 22 3C46 SUBLW 46
3C23 SUBLW 23 3C47 SUBLW 47
3C24 SUBLW 24 3C48 SUBLW 48
3C25 SUBLW 25 3C49 SUBLW 49
3C26 SUBLW 26 3C4A SUBLW 4A
3C27 SUBLW 27 3C4B SUBLW 4B
3C28 SUBLW 28 3C4C SUBLW 4C
3C29 SUBLW 29 3C4D SUBLW 4D
3C2A SUBLW 2A 3C4E SUBLW 4E
3C2B SUBLW 2B 3C4F SUBLW 4F
3C2C SUBLW 2C 3C50 SUBLW 50
3C2D SUBLW 2D 3C51 SUBLW 51
3C2E SUBLW 2E 3C52 SUBLW 52
3C2F SUBLW 2F 3C53 SUBLW 53
3C30 SUBLW 30 3C54 SUBLW 54
3C31 SUBLW 31 3C55 SUBLW 55
3C32 SUBLW 32 3C56 SUBLW 56
3C33 SUBLW 33 3C57 SUBLW 57
3C34 SUBLW 34 3C58 SUBLW 58
3C35 SUBLW 35 3C59 SUBLW 59
3C36 SUBLW 36 3C5A SUBLW 5A
3C37 SUBLW 37 3C5B SUBLW 5B
3C38 SUBLW 38 3C5C SUBLW 5C
384

3C5D SUBLW 5D 3C81 SUBLW 81


3C5E SUBLW 5E 3C82 SUBLW 82
3C5F SUBLW 5F 3C83 SUBLW 83
3C60 SUBLW 60 3C84 SUBLW 84
3C61 SUBLW 61 3C85 SUBLW 85
3C62 SUBLW 62 3C86 SUBLW 86
3C63 SUBLW 63 3C87 SUBLW 87
3C64 SUBLW 64 3C88 SUBLW 88
3C65 SUBLW 65 3C89 SUBLW 89
3C66 SUBLW 66 3C8A SUBLW 8A
3C67 SUBLW 67 3C8B SUBLW 8B
3C68 SUBLW 68 3C8C SUBLW 8C
3C69 SUBLW 69 3C8D SUBLW 8D
3C6A SUBLW 6A 3C8E SUBLW 8E
3C6B SUBLW 6B 3C8F SUBLW 8F
3C6C SUBLW 6C 3C90 SUBLW 90
3C6D SUBLW 6D 3C91 SUBLW 91
3C6E SUBLW 6E 3C92 SUBLW 92
3C6F SUBLW 6F 3C93 SUBLW 93
3C70 SUBLW 70 3C94 SUBLW 94
3C71 SUBLW 71 3C95 SUBLW 95
3C72 SUBLW 72 3C96 SUBLW 96
3C73 SUBLW 73 3C97 SUBLW 97
3C74 SUBLW 74 3C98 SUBLW 98
3C75 SUBLW 75 3C99 SUBLW 99
3C76 SUBLW 76 3C9A SUBLW 9A
3C77 SUBLW 77 3C9B SUBLW 9B
3C78 SUBLW 78 3C9C SUBLW 9C
3C79 SUBLW 79 3C9D SUBLW 9D
3C7A SUBLW 7A 3C9E SUBLW 9E
3C7B SUBLW 7B 3C9F SUBLW 9F
3C7C SUBLW 7C 3CA0 SUBLW A0
3C7D SUBLW 7D 3CA1 SUBLW A1
3C7E SUBLW 7E 3CA2 SUBLW A2
3C7F SUBLW 7F 3CA3 SUBLW A3
3C80 SUBLW 80 3CA4 SUBLW A4
385

3CA5 SUBLW A5 3CC9 SUBLW C9


3CA6 SUBLW A6 3CCA SUBLW CA
3CA7 SUBLW A7 3CCB SUBLW CB
3CA8 SUBLW A8 3CCC SUBLW CC
3CA9 SUBLW A9 3CCD SUBLW CD
3CAA SUBLW AA 3CCE SUBLW CE
3CAB SUBLW AB 3CCF SUBLW CF
3CAC SUBLW AC 3CD0 SUBLW D0
3CAD SUBLW AD 3CD1 SUBLW D1
3CAE SUBLW AE 3CD2 SUBLW D2
3CAF SUBLW AF 3CD3 SUBLW D3
3CA0 SUBLW B0 3CD4 SUBLW D4
3CB1 SUBLW B1 3CD5 SUBLW D5
3CB2 SUBLW B2 3CD6 SUBLW D6
3CB3 SUBLW B3 3CD7 SUBLW D7
3CB4 SUBLW B4 3CD8 SUBLW D8
3CB5 SUBLW B5 3CD9 SUBLW D9
3CB6 SUBLW B6 3CDA SUBLW DA
3CB7 SUBLW B7 3CDB SUBLW DB
3CB8 SUBLW B8 3CDC SUBLW DC
3CB9 SUBLW B9 3CDD SUBLW DD
3CBA SUBLW BA 3CDE SUBLW DE
3CBB SUBLW BB 3CDF SUBLW DF
3CBC SUBLW BC 3CE0 SUBLW E0
3CBD SUBLW BD 3CE1 SUBLW E1
3CBE SUBLW BE 3CE2 SUBLW E2
3CBF SUBLW BF 3CE3 SUBLW E3
3CC0 SUBLW C0 3CE4 SUBLW E4
3CC1 SUBLW C1 3CE5 SUBLW E5
3CC2 SUBLW C2 3CE6 SUBLW E6
3CC3 SUBLW C3 3CE7 SUBLW E7
3CC4 SUBLW C4 3CE8 SUBLW E8
3CC5 SUBLW C5 3CE9 SUBLW E9
3CC6 SUBLW C6 3CEA SUBLW EA
3CC7 SUBLW C7 3CEB SUBLW EB
3CC8 SUBLW C8 3CEC SUBLW EC
386

3CED SUBLW ED 3E11 ADDLW 11


3CEE SUBLW EE 3E12 ADDLW 12
3CEF SUBLW EF 3E13 ADDLW 13
3CF0 SUBLW F0 3E14 ADDLW 14
3CF1 SUBLW F1 3E15 ADDLW 15
3CF2 SUBLW F2 3E16 ADDLW 16
3CF3 SUBLW F3 3E17 ADDLW 17
3CF4 SUBLW F4 3E18 ADDLW 18
3CF5 SUBLW F5 3E19 ADDLW 19
3CF6 SUBLW F6 3E1A ADDLW 1A
3CF7 SUBLW F7 3E1B ADDLW 1B
3CF8 SUBLW F8 3E1C ADDLW 1C
3CF9 SUBLW F9 3E1D ADDLW 1D
3CFA SUBLW FA 3E1E ADDLW 1E
3CFB SUBLW FB 3E1F ADDLW 1F
3CFC SUBLW FC 3E20 ADDLW 20
3CFD SUBLW FD 3E21 ADDLW 21
3CFE SUBLW FE 3E22 ADDLW 22
3CFF SUBLW FF 3E23 ADDLW 23
3E00 ADDLW 00 3E24 ADDLW 24
3E01 ADDLW 01 3E25 ADDLW 25
3E02 ADDLW 02 3E26 ADDLW 26
3E03 ADDLW 03 3E27 ADDLW 27
3E04 ADDLW 04 3E28 ADDLW 28
3E05 ADDLW 05 3E29 ADDLW 29
3E06 ADDLW 06 3E2A ADDLW 2A
3E07 ADDLW 07 3E2B ADDLW 2B
3E08 ADDLW 08 3E2C ADDLW 2C
3E09 ADDLW 09 3E2D ADDLW 2D
3E0A ADDLW 0A 3E2E ADDLW 2E
3E0B ADDLW 0B 3E2F ADDLW 2F
3E0C ADDLW 0C 3E30 ADDLW 30
3E0D ADDLW 0D 3E31 ADDLW 31
3E0E ADDLW 0E 3E32 ADDLW 32
3E0F ADDLW 0F 3E33 ADDLW 33
3E10 ADDLW 10 3E34 ADDLW 34
387

3E35 ADDLW 35 3E59 ADDLW 59


3E36 ADDLW 36 3E5A ADDLW 5A
3E37 ADDLW 37 3E5B ADDLW 5B
3E38 ADDLW 38 3E5C ADDLW 5C
3E39 ADDLW 39 3E5D ADDLW 5D
3E3A ADDLW 3A 3E5E ADDLW 5E
3E3B ADDLW 3B 3E5F ADDLW 5F
3E3C ADDLW 3C 3E60 ADDLW 60
3E3D ADDLW 3D 3E61 ADDLW 61
3E3E ADDLW 3E 3E62 ADDLW 62
3E3F ADDLW 3F 3E63 ADDLW 63
3E40 ADDLW 40 3E64 ADDLW 64
3E41 ADDLW 41 3E65 ADDLW 65
3E42 ADDLW 42 3E66 ADDLW 66
3E43 ADDLW 43 3E67 ADDLW 67
3E44 ADDLW 44 3E68 ADDLW 68
3E45 ADDLW 45 3E69 ADDLW 69
3E46 ADDLW 46 3E6A ADDLW 6A
3E47 ADDLW 47 3E6B ADDLW 6B
3E48 ADDLW 48 3E6C ADDLW 6C
3E49 ADDLW 49 3E6D ADDLW 6D
3E4A ADDLW 4A 3E6E ADDLW 6E
3E4B ADDLW 4B 3E6F ADDLW 6F
3E4C ADDLW 4C 3E70 ADDLW 70
3E4D ADDLW 4D 3E71 ADDLW 71
3E4E ADDLW 4E 3E72 ADDLW 72
3E4F ADDLW 4F 3E73 ADDLW 73
3E50 ADDLW 50 3E74 ADDLW 74
3E51 ADDLW 51 3E75 ADDLW 75
3E52 ADDLW 52 3E76 ADDLW 76
3E53 ADDLW 53 3E77 ADDLW 77
3E54 ADDLW 54 3E78 ADDLW 78
3E55 ADDLW 55 3E79 ADDLW 79
3E56 ADDLW 56 3E7A ADDLW 7A
3E57 ADDLW 57 3E7B ADDLW 7B
3E58 ADDLW 58 3E7C ADDLW 7C
388

3E7D ADDLW 7D 3EA1 ADDLW A1


3E7E ADDLW 7E 3EA2 ADDLW A2
3E7F ADDLW 7F 3EA3 ADDLW A3
3E80 ADDLW 80 3EA4 ADDLW A4
3E81 ADDLW 81 3EA5 ADDLW A5
3E82 ADDLW 82 3EA6 ADDLW A6
3E83 ADDLW 83 3EA7 ADDLW A7
3E84 ADDLW 84 3EA8 ADDLW A8
3E85 ADDLW 85 3EA9 ADDLW A9
3E86 ADDLW 86 3EAA ADDLW AA
3E87 ADDLW 87 3EAB ADDLW AB
3E88 ADDLW 88 3EAC ADDLW AC
3E89 ADDLW 89 3EAD ADDLW AD
3E8A ADDLW 8A 3EAE ADDLW AE
3E8B ADDLW 8B 3EAF ADDLW AF
3E8C ADDLW 8C 3EB0 ADDLW B0
3E8D ADDLW 8D 3EB1 ADDLW B1
3E8E ADDLW 8E 3EB2 ADDLW B2
3E8F ADDLW 8F 3EB3 ADDLW B3
3E90 ADDLW 90 3EB4 ADDLW B4
3E91 ADDLW 91 3EB5 ADDLW B5
3E92 ADDLW 92 3EB6 ADDLW B6
3E93 ADDLW 93 3EB7 ADDLW B7
3E94 ADDLW 94 3EB8 ADDLW B8
3E95 ADDLW 95 3EB9 ADDLW B9
3E96 ADDLW 96 3EBA ADDLW BA
3E97 ADDLW 97 3EBB ADDLW BB
3E98 ADDLW 98 3EBC ADDLW BC
3E99 ADDLW 99 3EBD ADDLW BD
3E9A ADDLW 9A 3EBE ADDLW BE
3E9B ADDLW 9B 3EBF ADDLW BF
3E9C ADDLW 9C 3EC0 ADDLW C0
3E9D ADDLW 9D 3EC1 ADDLW C1
3E9E ADDLW 9E 3EC2 ADDLW C2
3E9F ADDLW 9F 3EC3 ADDLW C3
3EA0 ADDLW A0 3EC4 ADDLW C4
389

3EC5 ADDLW C5 3EE9 ADDLW E9


3EC6 ADDLW C6 3EEA ADDLW EA
3EC7 ADDLW C7 3EEB ADDLW EB
3EC8 ADDLW C8 3EEC ADDLW EC
3EC9 ADDLW C9 3EED ADDLW ED
3ECA ADDLW CA 3EEE ADDLW EE
3ECB ADDLW CB 3EEF ADDLW EF
3ECC ADDLW CC 3EF0 ADDLW F0
3ECD ADDLW CD 3EF1 ADDLW F1
3ECE ADDLW CE 3EF2 ADDLW F2
3ECF ADDLW CF 3EF3 ADDLW F3
3ED0 ADDLW D0 3EF4 ADDLW F4
3ED1 ADDLW D1 3EF5 ADDLW F5
3ED2 ADDLW D2 3EF6 ADDLW F6
3ED3 ADDLW D3 3EF7 ADDLW F7
3ED4 ADDLW D4 3EF8 ADDLW F8
3ED5 ADDLW D5 3EF9 ADDLW F9
3ED6 ADDLW D6 3EFA ADDLW FA
3ED7 ADDLW D7 3EFB ADDLW FB
3ED8 ADDLW D8 3EFC ADDLW FC
3ED9 ADDLW D9 3EFD ADDLW FD
3EDA ADDLW DA 3EFE ADDLW FE
3EDB ADDLW DB 3EFF ADDLW FF
3EDC ADDLW DC
3EDD ADDLW DD
3EDE ADDLW DE
3EDF ADDLW DF
3EE0 ADDLW E0
3EE1 ADDLW E1
3EE2 ADDLW E2
3EE3 ADDLW E3
3EE4 ADDLW E4
3EE5 ADDLW E5
3EE6 ADDLW E6
3EE7 ADDLW E7
3EE8 ADDLW E8
390

LEXIQUE
391

Adresse
Prenez une longue rue, avec une infinité de maisons toutes pareilles.
Ce qui les différencie est le numéro figurant au-dessus de chaque porte
(l’adresse).

De même, dans un système à mémoires, chaque emplacement (que dans les


µC PIC on appelle registre ou ile) est rangé l’un à côté de l’autre.
Ce qui les différencie est le numéro de la position qu’ils occupent dans
l’espace mémoire dans lequel ils sont rangés.
Ce numéro de position s’appelle adresse.

Assemblage
Après avoir écrit un programme source, il faut l’assembler.
L’assemblage est une étape importante dans la phase de développement
d’un programme.
La tâche de l’assembleur est de traduire le programme source en langage
machine (programme objet), de construire la table des symboles utilisée par
le programme, d’indiquer les éventuelles erreurs et de les compter.

Directives d’assemblage
Les directives d’assemblage sont des instructions que l’on donne
exclusivement à l’assembleur. Elles ne sont pas traduites en langage
machine.
Les directives d’assemblage permettent entre autres :
392

- l’affectation de symboles et d’étiquettes à des valeurs


numériques (EQU...)
- la gestion de la mémoire et l’implantation du programme
objet (ORG...)
- la définition de constantes et de textes codés en ASCII
- de définir la partie du programme à assembler et les programmes
qu’il convient d’inclure dans la phase d’assemblage (INCLUDE,
END...)
L’assemblage terminé, les directives d’assemblage ne jouent plus aucun
rôle.

Digit Carry
Le Digit Carry est l’un des flags du registre d’état.
C’est l’indicateur que l’on appelle retenue auxiliaire, ou retenue
intermédiaire ; c’est à dire le débordement du quartet de poids faible d’un
octet sur son quartet de poids fort.

Par exemple, soit à additionner 9 + 9 (décimal), soit :

Quartets de Quartets de
poids fort poids faible

0000 1001
+ 0000 1001
_________________
= 0001 0010
↑←↓

La retenue s’est propagée.


Elle met à 1 l’indicateur de retenue intermédiaire.
393

Environnement de Développement Intégré


I. D. E. Integrated Development Environment (Environnement de
Développement Intégré).
On appelle Environnement de Développement Intégré l’ensemble
des fenêtres et palettes se trouvant immédiatement à la disposition de
l’utilisateur pour mener à bien une application.
C’est un programme qui regroupe en une seule entité plusieurs modules,
représentant l’ensemble des outils dont on a besoin, ou dont on pourrait
avoir besoin au cours d’un travail.
A titre d’exemple, MPLAB, dans son I. D. E. comprend :
- un Editeur
- un Assembleur
- un Débogueur
- un Simulateur et
- un Programmateur.

Include
Cette instruction inclut un fichier source dans un programme pour que
celui-ci s’y ajoute.
Cela revient à copier son contenu dans un listing, sans qu’il soit nécessaire
de réécrire une à une toutes les instructions qui le composent.
Exemple : INCLUDE « P16F84.INC »
On peut inclure un ou plusieurs fichiers, en faisant chaque fois appel à
l’instruction INCLUDE.
INCLUDE est une instruction qui s’adresse à l’assembleur ou au
compilateur.
L’effet produit par l’instruction INCLUDE est exactement le même que
celui qu’on obtiendrait si l’on écrivait – à l’endroit où celle-ci figure dans le
programme – toutes les lignes du fichier inséré.
Les instructions INCLUDE peuvent être imbriquées jusqu’à 6 niveaux.
Le nom du fichier peut être écrit de deux façons :
394

- soit précédé par le signe < et terminé par le signe >


- soit précédé par le signe ″ et terminé par le signe ″
Si le fichier à inclure ne se trouve pas dans le même environnement dans
lequel on se trouve, un chemin d’accès doit lui être expressément indiqué.
L’ordre en est le suivant : nom du répertoire, nom du dossier, nom du
fichier.

Interruption
Une interruption est un événement externe, qui se produit à un instant
aléatoire, sans préavis, qui demande au µC d’abandonner ce qu’il est en
train de faire, et de diriger toute son attention ailleurs.

Autrement dit, une interruption est la possibilité d’interrompre à tout


moment le déroulement du programme principal, pour permettre au µC de
prendre en compte un événement dont la fréquence est aléatoire mais dont
l’importance est plus grande que celle de la tâche qu’il est occupé à traiter.
Dès lors, le µC termine l’exécution de l’instruction qu’il a en cours,
mémorise l’adresse suivante (pour y revenir ensuite), et se branche à un
sous-programme (sous-programme d’interruption) pour effectuer des
opérations prioritaires.
Une fois que le sous-programme d’interruption a été traité, le
microcontrôleur revient au programme principal.

Les interruptions peuvent être masquables ou non masquables.

Si elles sont masquables, elles n’arrêtent pas forcément le µC.


C’est le programmeur qui examine leur importance et qui décide.
Si plusieurs interruptions peuvent surgir en même temps, c’est le
programmeur qui leur affecte un degré de priorité, et juge sur ce que le
processeur doit faire.

Par contre, les interruptions non masquables arrêtent le processeur sans


conditions.
395

Pile (Stack)
La pile (Stack) est une zone de la mémoire RAM dans laquelle sont
mémorisées les adresses de retour chaque fois qu’on fait appel à une
instruction CALL, c’est à dire chaque fois que le programme arrête
l’exécution séquentielle des instructions et se débranche pour aller exécuter
les instructions contenues dans un sous-programme.

La pile du µC 16F84 peut mémoriser jusqu’à 8 adresses.


En fait, tout en disposant d’un bus interne de 13 lignes et pouvant, par
conséquent, adresser jusqu'à 1 1111 1111 1111 (1FFF)
la pile du 16F84 est bridée à 11 1111 1111 ( 3FF)
du fait que ce modèle de microcontrôleur est limité à 1K de mémoire.

Comme la pile ne possède que 8 emplacements, il est évident qu’on peut


imbriquer jusqu’à 8 appels à sous-programme, en sachant que
malheureusement il n'existe aucun flag avertissant que la pile est pleine.
D’où la nécessité de la surveiller, au risque de constater de drôles
d’anomalies, car ces 8 cases mémoire sont disposées comme en anneau, de
telle sorte que si l’on enregistrait un 9ème appel à sous-programme, la 9ème
valeur d’adresse prendrait la place de la première, avec toutes les
conséquences qu’on peut imaginer.

La pile est adressée par un compteur spécial appelé Pointeur de Pile.

Program Counter (EEPROM)


Le Program Counter est un compteur dont la tâche est d’adresser la
mémoire dans laquelle sont logées les instructions du programme.
C’est l’organe qui fournit au programme les adresses de la mémoire où se
trouvent les instructions à exécuter.
En règle générale ces adresses sont successives, se suivent l’une après
l’autre sans discontinuer. Sauf lorsque dans un programme figurent les
instructions CALL et GOTO. Dans ces cas le programme n’exécute pas
396

l’instruction rangée juste après la précédente, mais il se branche ailleurs,


aiguillé par le PC qui, lui-même, obéit alors aux ordres de CALL et GOTO.

Du fait que le 16F84 possède une mémoire de programme de 1K


instructions, le PC (Program Counter) de ce µC utilise un bus de 10 lignes
dont l’étendue va de l’adresse 000 jusqu’à l’adresse 3FF (1.024 adresses
au total, dont les cinq premières réservées) :
11 1111 1111 (en binaire)
3 F F ( en hexa )

NB : Bien que cela ne concerne pas le 16F84, il est bon de savoir


que le Program Counter de certains modèles de PIC est organisé en deux
bytes : l’un fournissant la partie basse de l’adresse, l’autre fournissant la
partie haute.
Alors que les adresses de la partie basse sont disponibles en
permanence, celles de la partie haute sont fournies par le registre PCLATH
(Program Counter Latch).

Le vecteur de RESET
A la mise sous tension, avant d’obéir à l’une quelconque des instructions du
programmeur, le µC obéit à une instruction pré-définie par son fabricant,
que personne ne peut ni supprimer ni modifier.
Cette instruction est l’instruction RESET.

Elle oblige tout programme à démarrer obligatoirement à partir de l’adresse


000 .

En ce sens l’instruction RESET est un vecteur : le µC s’y rend, dirigé par


une force suprême (celle qu’exerce sur lui le programme résident).

Un Reset peut avoir lieu :


1) en coupant l’alimentation générale ;
2) en mettant à la masse, même fugitivement, la patte MCLR ;
3) en activant le timer du Watch Dog (chien de garde intégré).
397

L’exécution de tout programme doit donc impérativement commencer à


partir de l’adresse 000.

En programmation, la directive qui force le programme à démarrer de


l’emplacement 000 est ORG.
On écrit : ORG 000

Watch Dog Timer


Le Watch Dog Timer (timer chien de garde) est un chrono cadencé par un
oscillateur RC se trouvant à l’intérieur du µC et ne demandant aucun
composant externe, indépendant de l’horloge qui pilote le µC .
Sa caractéristique principale est que chaque fois qu’il arrive au bout du
comptage, il génère une interruption.
D’où la nécessité de régulièrement le mettre à zéro avant qu’il n’atteigne la
fin du comptage.
Utilisé seul (sans pré-diviseur) il a une période de 18 millisecondes. S’il est
précédé par le pré-diviseur, sa période dépend du taux de division qu’on lui
a imposé, et peut aller jusqu’à 2,3 secondes.
398

Sommaire
Copyright............................................................................... Page 2
Dédicace............................................................................... Page 3
Avant-propos........................................................................ Page 5
Du contrôleur au microcontrôleur........................................ Page 7
Le microcontrôleur 16F84................................................... Page 8
- Présentation générale...................................................... Page 8
- Brochage du PIC 16F84................................................. Page 9
- Le cortège des invariants................................................ Page 10
- Pilotage par quartz.......................................................... Page 11
- Pilotage par oscillateur RC........................................ Page 12
Les Entrées/Sorties.............................................................. Page 13
Organisation de la mémoire du PIC 16F84......................... Page 14
Les registres spéciaux.......................................................... Page 23
- EEADR........................................................................... Page 24
- EECON1......................................................................... Page 25
- EECON2......................................................................... Page 26
- EEDATA........................................................................ Page 27
- FSR File Select Register)............................................... Page 28
- INTCON (INTerrupt CONtrol)...................................... Page 29
- OPTION.......................................................................... Page 33
- PCL (Program Counter Low)......................................... Page 36
- PCLATH Program Counter LATch High)..................... Page 37
- PORTA-PORTB............................................................ Page 38
- STATUS Registre d’état).............................................. Page 40
- TMR0 (Timer 0)............................................................. Page 42
- TRISA-TRISB............................................................... Page 43
La Programmation............................................................... Page 44
- Différentes façons de programmer................................. Page 44
Avantages et inconvénients de la programmation en
langage ASSEMBLEUR................................................ Page 45
Avantages et inconvénients de la programmation en
langage BASIC............................................................... Page 46
Les outils nécessaires pour programmer en
langage ASSEMBLEUR................................................. Page 47
Les outils nécessaires pour programmer en
langage BASIC............................................................... Page 48
Structure d’un programme................................................... Page 49
Canevas d’un programme.................................................... Page 50
399

Programmation en langage ASSEMBLEUR....................... Page 51


Les instructions du 16F84.................................................... Page 52
- Classement par lettre alphabétique................................. Page 54
- Classement par genre...................................................... Page 56
- Classement par type....................................................... Page 58
- Classement par ordre croissant d’encodage.................. Page 60
- ADDLW........................................................................ Page 61
- ADDWF........................................................................ Page 62
- ANDLW........................................................................ Page 64
- ANDWF........................................................................ Page 66
- BCF............................................................................... Page 68
- BSF............................................................................... Page 70
- BTFSC............................................................................. Page 72
- BTFSS............................................................................. Page 74
- CALL.............................................................................. Page 76
- CLRF.............................................................................. Page 78
- CLRW............................................................................. Page 79
- CLRWDT....................................................................... Page 80
- COMF............................................................................ Page 81
- DECF............................................................................. Page 83
- DECFSZ........................................................................ Page 84
- GOTO............................................................................ Page 86
- INCF.............................................................................. Page 87
- INCFSZ......................................................................... Page 88
- IORLW.......................................................................... Page 90
- IORWF.......................................................................... Page 92
- MOVF........................................................ ................... Page 94
- MOVLW..................................................... .................. Page 96
- MOVWF...................................................... . ............... Page 97
- NOP.............................................................. ................ Page 98
- OPTION..................................................... .................. Page 99
- RETFIE........................................................................ Page 100
- RETLW......................................................................... Page 101
- RETURN....................................................................... Page 102
- RLF................................................................................ Page 103
- RRF............................................................................... Page 105
- SLEEP........................................................................... Page 107
- SUBLW......................................................................... Page 108
- SUBWF......................................................................... Page 109
- SWAPF.......................................................................... Page 110
- TRIS.............................................................................. Page 111
400

- XORLW........................................................................ Page 113


- XORWF........................................................................ Page 115
Encodage des instructions.................................................. Page 117
- Signification des lettres utilisées pour
l’encodage des instructions............................................ Page 117
Exemples de programmes écrits en langage
ASSEMBLEUR............................................................ Page 118
- Programme 1................................................................ Page 118
- Organigramme.................................................. Page 118
- Fichier à extension .asm................................... Page 119
- Fichier à extension .hex.................................... Page 120
- Programme 2................................................................ Page 121
- Organigramme.................................................. Page 121
- Fichier à extension .asm................................... Page 122
- Fichier à extension .hex.................................... Page 124
- Programme 3............................................................... Page 125
- Organigramme.................................................. Page 125
- Fichier à extension .asm................................... Page 126
- Fichier à extension .hex.................................... Page 129
- Programme 4.................................................................. Page 130
- Organigramme.................................................... Page 130
- Fichier à extension .asm..................................... Page 131
- Fichier à extension .hex...................................... Page 133
- Programme 5.................................................................. Page 134
-Fichier à extension .asm...................................... Page 134
- Programme 6.................................................................. Page 137
-Fichier à extension .asm...................................... Page 137
- Programme 7.................................................................. Page 140
-Fichier à extension .asm...................................... Page 140
MPLAB............................................................................... Page 143
- Qu’est-ce que MPLAB.................................................. Page 143
- Comment obtenir MPLAB............................................ Page 145
- Caractéristiques requises par le PC pour l’installation
de MPLAB.................................................................... Page 146
- Comment installer MPLAB.......................................... Page 147
- Comment désinstaller MPLAB..................................... Page 157
- Comment démarrer avec MPLAB................................ Page 158
Première étape : création du projet..................................... Page 160
- Créer un projet.............................................................. Page 160
- Comment créer un projet.............................................. Page 161
Deuxième étape : écriture du programme source............... Page 165
401

Troisième étape : conversion du programme source en


programme objet.......................................................... Page 169
Quatrième étape : correction des erreurs............................ Page 176
Cinquième étape : simulation du programme..................... Page 177
- Mode pas à pas.............................................................. Page 178
- Mode Step Over............................................................ Page 181
- Mode exécution automatique........................................ Page 183
- Ouverture de fenêtres.................................................... Page 184
Programmation en langage BASIC................................ Page 187
- Symbol................................................................ Page 189
- Les variables de type B et W.............................. Page 190
- Les variables de bit............................................. Page 191
- Dénomination des lignes de PORTS.................. Page 192
- Configuration des bits de chaque Port................ Page 193
- Port A................................................... Page 193
- Port B................................................... Page 194
- Lecture des Ports................................................ Page 195
- Les Constantes................................................... Page 196
- Les Labels.......................................................... Page 197
- Les Commentaires............................................. Page 198
Le set d’instructions du MEL PicBASIC........................... Page 199
- Classement par ordre alphabétique.................... Page 200
- Classement par genre......................................... Page 201
- BRANCH............................................ Page 202
- BUTTON............................................ Page 203
- CALL................................................... Page 205
- DEBUG............................................... Page 206
- DIRS.................................................... Page 207
- EEPROM............................................ Page 208
- END..................................................... Page 209
- FOR...NEXT........................................ Page 210
- GOSUB................................................ Page 214
- GOTO.................................................. Page 216
- HIGH................................................... Page 217
- I2Cin.................................................... Page 218
- I2Cout.................................................. Page 221
- If... Then.............................................. Page 222
- INPUT................................................. Page 223
- LET...................................................... Page 224
- LOOKdown…..................................... Page 225
- LOOKup.............................................. Page 226
402

- LOW.................................................... Page 227


- NAP..................................................... Page 228
- OUTPUT............................................. Page 229
- PAUSE................................................ Page 230
- PEEK................................................... Page 231
- PINS.................................................... Page 232
- POKE.................................................. Page 234
- POT..................................................... Page 235
- PULSin................................................ Page 237
- PULSout.............................................. Page 239
- PWM................................................... Page 240
- RANDOM........................................... Page 244
- READ.................................................. Page 245
- RETURN............................................. Page 246
- REVERSE............................................ Page 247
- SERin................................................... Page 248
- SERout................................................. Page 250
- SLEEP.................................................. Page 253
- SOUND................................................ Page 254
- TOGLE................................................ Page 256
- TRISA.................................................. Page 257
- WRITE................................................. Page 258
Exemples de programmes écrits en langage PicBASIC..... Page 259
- Programme 1................................................................. Page 260
- Programme 2................................................................. Page 261
- Programme 3................................................................. Page 263
- Programme 4................................................................. Page 264
- Programme 5................................................................. Page 265
- Programme 6................................................................. Page 266
- Programme 7................................................................. Page 268
- Programme 8................................................................. Page 269
- Programme 9................................................................. Page 270
- Programme 10............................................................... Page 271
- Programme 11............................................................... Page 272
- Programme 12............................................................... Page 273
- Programme 13............................................................... Page 274
- Programme 14............................................................... Page 275
- Programme 15............................................................... Page 276
- Programme 16............................................................... Page 277
- Programme 17…........................................................... Page 278
BIBLE pour désassembler à la main..............................…. Page 279
403

Lexique............................................................................... Page 390


- Adresse......................................................................... Page 391
- Assemblage................................................................... Page 391
- Directives d’assemblage............................................... Page 391
- Digit Carry.................................................................... Page 392
- Environnement de Développement Intégré.................. Page 393
- Include.......................................................................... Page 393
- Interruption............................................................... ... Page 394
- Pile (Stack)................................................................... Page 395
- Program Counter (EEPROM)....................................... Page 395
- Le vecteur de Reset....................................................... Page 396
- Watch Dog Timer......................................................... Page 397
Sommaire.......................................................................... Page 398

Você também pode gostar