TABLE
ZERO: EQU $
DZS '10 <POUR CMS4
WORD DEB
WORD DEBEFF
PROG
DEB: EQU $
LRP L
BR -1,L
<
PAGE
<
<
<
< E T A T S D E L ' A N A L Y S E
<
<
EPO: VAL 0 <PARENTHES OUVRANTE OU DEB ANALYSE
EPF: VAL 1 <PARENTHESE FERMANTE
ECD: VAL 2 <CONSTANTE DECIMALE
ECH: VAL 3 <CONSTANTE HEXA
ECB: VAL 4 <CONSTANTE BINAIRE
ECA: VAL 5 <CONSTANTE ASCI
EV1: VAL 6 <VARIABLE 1ER MEMBRE
EV2: VAL 7 <VARIABLE 2ND MEMBRE
EOP: VAL 8 <OPERATEUR
EF1: VAL 9 <FIN 1ER MEMBRE
EPP: VAL 10 <POST O-PERATEUR
EFT: VAL 11 <FIN DE TRAVAIL
EER: VAL 12 <ERREUR
<
< NOTA: EPP EST PEU DIFFERENT DE EPO
<
<
< T Y P E C A R A C T E R E E N C O U R S
<
AC: VAL '1 <CARACTERES A C
BDF: VAL '2 <CARACTERES B D F
LL: VAL '4 <CARACTERE L
BA: VAL '8 <DELIMITEUR ASCI "
BB: VAL '10 <BASE BINAIRE %
BH: VAL '20 <BASE HEXA '
C01: VAL '40 <CHIFFRES 0 1
C29: VAL '80 <CHIFFRES 2 3 ... 9
EG: VAL '100 <SIGNE =
EOT: VAL '200 <EOT (OU CTRLD)
OP: VAL '400 <OPERATEUR
PO: VAL '800 <PARENTHESE OUVRANTE
PF: VAL '1000 <PARENTHESE FERMANTE
SP: VAL '2000 <ESPACE
AU: VAL '4000 <AUTRE CARACTERE
<
<
<
AF: VAL AC+BDF <CARACTERES A B C D E F
ACL: VAL AC+LL <CARACTERS A C L
C09: VAL C01+C29 <CHIFFRES 0...9
C0F: VAL C09+AF <CHIFFRES 0...F
<
< OPERATEURS
<
PLUS: VAL "+" <ADDITION
MOINS: VAL "-" <SOUSTRACTION
MULT: VAL "*" <MULTIPLICATION
DIV: VAL "/" <DIVISION, QUOTIENT
REST: VAL "\" <DIVISION, RESTE
SHFTL: VAL "<" <SHIFT LEFT
SHFTR: VAL ">" <SHIFT RIGHT
OR: VAL "@" <OU LOGIQUE
AND: VAL "&" <ET LOGIQUE
EOR: VAL "#" <OU EXCLUSIF
<
<
<
< P A R A M E T R E S
<
NMNIV: VAL 10 <NB MAX NIVEAUX DE PARENTHESES
LMVC: VAL 32 <LONGUEUR MAX VARIABLE OU CSTE
< <EN FORMAT EXTERNE
LMMSG: VAL 90 <LONGUEUR MAX MESSABE EN PROVE
< <NANCE DE L'UTILISATEUR
<
LTBNV: VAL 90 <LONGUEUR MAX TABLR DES NOMS DE
<VARIABLES, ELLE EST DE LA FORME:
<"NOM1"'FF"NOM2"'FF...
<..."NOMN"'FF'00
NMAXV: VAL 25 <NB MAX DE VARIABLES POUR LA TABLE
<DES VALEURS: TVV
PAGE
TABLE
<
< TABLE DES ADRESSES DES TABLES POUR CHAQUE ETAT
<
TBET: EQU $
WORD TEPO <ETAT PRENTHESE OUVRANTE
WORD TEPF <ETAT PARENTHESE FERMANTE
WORD TECD <ETAT CSTE DECIMALE
WORD TECH <ETAT CSTE HEXA
WORD TECB <ETAT CSTE BINAIRE
WORD TECA <ETAT CSTE ASCI
WORD TEV1 <ETAT VARIABLE 1ER MEMBRE
WORD TEV2 <ETAT VARIABLE 2ND MEMBRE
WORD TEOP <ETAT OPERATEUR
WORD TEF1 <ETAT FIN MEMBRE 1
WORD TEPP <ETAT POST O-PERATEUR
<
< TABLE DE BRANCHEMENT EN FONCTION DE L'ETAT ET DU
< CARACTERE EN COURS
<
< CHAQUE POSTE DE LA TABLE CONTIENT ADRESSE DE
< BRANCHEMENT ET TYPES DE CARACTERES ASSOCIES
<
< POUR CHAQUE ETAT LA TABLE SE TERMINE PAR UN MOT A ZERO
<
TEPO: EQU $ <ETAT PO (PARENTHESE OUVRANTE)
WORD INOP;OP
TEPP: EQU $ <ETAT PP (POST O-PERATEUR)
WORD INV1;ACL+BDF+AU
WORD INCA;BA
WORD INCB;BB
WORD INCH;BH
WORD INCD;C09
WORD TRPO;PO
WORD ANACAL;SP
WORD -EPO
TEPF: EQU $ <ETAT PF (PARENTHESE FERMANTE)
WORD TRF1;EG
WORD INOP;OP
WORD TRPF;PF
WORD ANACAL;SP
WORD -EPF
TECD: EQU $ <ETAT CD (CSTE DECIMALE)
WORD TRCD;C09
WORD ECDEG;EG
WORD ECDOP;OP
WORD ECDPF;PF
WORD ANACAL;SP
WORD -ECD
TECH: EQU $ <ETAT CH (CSTE HEXA)
WORD TRCH;C0F
WORD ECHEG;EG
WORD ECHOP;OP
WORD ECHPF;PF
WORD ANACAL;SP
WORD -ECH
TECB: EQU $ <ETAT CB (CSTE BINAIRE)
WORD TRCB;C01
WORD ECBEG;EG
WORD ECBOP;OP
WORD ECBPF;PF
WORD ANACAL;SP
WORD -ECB
TECA: EQU $ <ETAT CA (CSTE ASCI)
WORD ECABA;BA
WORD TRCA;'FFFF
TEV1: EQU $ <ETAT V1 (VAR MEMBRE 1)
WORD TRV1;ACL+BDF+C09+AU
WORD EV1EG;EG
WORD EV1OP;OP
WORD EV1PF;PF
WORD ANACAL;SP
WORD -EV1
TEV2: EQU $ <ETAT V2 (VAR MEMBRE 2)
WORD TRV2;ACL+BDF+C09+AU
WORD EV2CD;EOT
WORD ANACAL;SP
WORD -EV2
TEOP: EQU $ <ETAT OP (OPERATEUR)
WORD EOPACL;ACL
WORD ANACAL;SP
WORD -EOP
TEF1: EQU $ <ETAT F1 (FIN MEMBRE 1)
WORD INV2;ACL+BDF+AU
WORD TRFM;EOT
WORD ANACAL;SP
WORD -EF1
<
< TABLE CORRESPONDANCE CARACTERES/TYPE UTILISEE
< PAR LE SP TRCAR
<
TCAR: EQU $-" "
WORD SP;AU;BA;OP < ESPACE ! " #
WORD AU;BB;OP;BH < $ % & '
WORD PO;PF;OP;OP < ( ) * +
WORD AU;OP;AU;OP < , - . /
WORD C01;C01;C29;C29 < 0 1 2 3
WORD C29;C29;C29;C29 < 4 5 6 7
WORD C29;C29;AU;AU < 8 9 : ;
WORD OP;EG;OP;AU < < = > ?
WORD OP;AC;BDF;AC < @ A B C
WORD BDF;BDF;BDF < D E F
<
< TABLES DES NOMS DE VARIABLES ET DES VALEURS DE VARIABLES
<
TNV: DZS LTBNV <TABLE DES NOMS DE VARIABLES
<DE LA FORME: "NOM1"'FF"NOM2"'FF...
<..."NOMN"'FF'00
TNVF: EQU $ <FIN TABLE TNV
TVV: DZS NMAXV*2 <TABLE DES VALEURS (2 MOTS PAR VALEUR)
<
<
< PILES
<
PREG: DZS 80 <REGISTRES (PAR K)
PR: DZS NMNIV+1*2 <PILE DES RESULTATS
POP: DZS NMNIV+4 <PILE DES OPERATEURS(PUSH/PULL)
<
< AUTRES ZONES
<
VCC: DZS LMVC/2+1 <VARIABLE OU CSTE EN COURS
MSG: DZS LMMSG/2+1 <MESSAGE EN ENTRDEE
< MESSAGE D'ERREUR
ER: ASCI " ER "
CODR: DZS 3 <CODE ERREUR
< REPONSE
REP: ASCI " "
REPH: DZS 5 <RESULTAT EN HEXA
ASCI " "
BYTE '22
REPA: DZS 2 <RESULTAT EN ASCI
BYTE '22;'0D;'0A
REPB: DZS 20 <RESULTAT EN BINAIRE
ASCI " "
REPD: DZS 3 <RESULTAT EN DECIMAL
ASCI " "
LREPD: VAL $-REPD
LREPF: VAL 8
REPF: DZS LREPF <RESULTAT EN FLOTTANT
IREPDF: EQU $ < POUR REINITIALISER 'REPD' ET 'REPF'...
DO $-REPD
WORD " "
LREPDF: VAL $-IREPDF
<
MES0: BYTE '0D;'0A;">" <DEMANDE A L'UTILISATEUR
<
PAGE
COMMON
COMCAL: EQU $
WORD 0 < POUR LE BLOC FLOTTANT...
<
< C O N S T A N T E S
<
< CONSTANTES DIVERSES
<
DIX: WORD 10
PDIX: DZS 1 <PUISSANCES DE 10
TEOT: WORD EOT <TYPE CARACT EOT
TOP: WORD OP <TYPE OPERATEUR
TLL: WORD LL <TYPE LL
TAU: WORD AU <TYPE AUTRE
LNF:: VAL 2 < LONGUEUR MOTS D'UN NOMBRE FLOTTANT.
EFL10E: WORD 10 < DIX ENTIER.
EFLDIX: FLOAT 10.0
EFL1SD: FLOAT 0.1
EFLUN: FLOAT 1.0
EFLT1: DZS LNF < ZONE DE TRAVAIL 1.
EFLSDX: DZS 1 < SIGNE DE X ARGUMENT:
< = 0 : X >= 0,
< < 0 : X < 0.
EFLPUI: DZS 1 < PUISSANCE DE 10 DU NOMBRE.
EFLREL: DZS 1 < RELAI D'ACCES A LA ZONE D'EDITION.
EFLX: WORD '8000 < RELAI D'ADRESSAGE OCT
<
< ARGUMENTS POUR SVC
<
DEM1: WORD '0202 <ENVOI CARACTERE ">"
WORD MES0-ZERO*2
WORD 3
<
DEM2: WORD '0101 <LECTURE EXPRESSION
WORD MSG-ZERO*2
WORD LMMSG
<
DEM3: WORD '0001 <RETOUR CCI INTERACTIF
<
DEM4: WORD '0202 <ENVOI REPONSE UL 2
WORD REP-ZERO*2
WORD 0
<
DEM5: WORD '0202 <ENVOI MESSAGE D'ERREUR
WORD ER-ZERO*2
WORD 0
<
< R E S E R V A T I O N S
<
PCC: DZS 1 <POINTEUR CARACT EN COURS
NC: DZS 1 <NIVEAU PARENTHESES EN COURS
PPR: DZS 1 <POINTEUR PILE DES RESULTATS
ETAT: DZS 1 <ETAT DE L'ANALYSE
PCVCC: DZS 1 <POINTEUR EN COUS VAR OU CSTE
< <EN COURS
LMVCC: DZS 1 <LONG MAX ..ETC...
LVCC: DZS 1 <LONGUEUR COURANTE ...ETC...
RGVC: DZS 1 <RANG VARIABLE EN COURS DANS TABLE
<DES NOMS (TNV) TBLE DES VALEURS (TVV)
PCTNV: DZS 1 <POINTEUR COURANT TABLE DES NOMS
<
< R E L A I S
<
AOCT: WORD ZERO,X <ADRESSE OCTET
AOVCC: WORD VCC-ZERO*2 <ADR OCT VAR OU CSTE EN COUS
AOCODR: WORD CODR-ZERO*2 <ADR OCTET CODE ERREUR
AOREPH: WORD REPH-ZERO*2 <ADR OCT REPONSE HEXA
AOREPB: WORD REPB-ZERO*2 <ADR OCT REPONSE BINAIRE
AOREPD: WORD REPD-ZERO*2 <ADR OCT REPONSE DECIMALE
AOREPF: WORD REPF-ZERO*2 <ADR OCTET REPONSE FLOTTANTE
AOREPA: WORD REPA-ZERO*2 <ADR OCT REPONSE ASCI
AXREPA: WORD REPA,X <REPONSE ASCI
AOTNV: WORD TNV-ZERO*2 <ADR OCT TABLE NOMS DE VARIABLES
AOTNVF: WORD TNVF-ZERO*2 <ADR OCT FIN DE CETTE TABLE
AXTVV: WORD TVV,X <RELAI TABLE DES VALEURS
ATBET: WORD TBET,X <TABLE BRANCH SELON ETAT EN COURS
APREG: WORD PREG-1 <PILE UTILISABLE AVEC K
APR: WORD PR,X <PILE DES RESULTATS
APO: WORD POP <PILE DES OPERATEURS
ATCAR: WORD TCAR,X <TAB DES CARACT (CF SP TRCAR)
AANACA: WORD ANACAL
AERR: WORD ERR
ATRCAR: WORD TRCAR
AINOP: WORD INOP
ATRCA: WORD TRCA
ATRCD: WORD TRCD
ATRPF: WORD TRPF
ATRF1: WORD TRF1
ATRFM: WORD TRFM
ACDB: WORD CDB
ACBD: WORD CBD
AEFL: WORD EFL
EFLADA: WORD EFLDA < EDITION DE L'EXPOSANT.
EFLAST: WORD EFLST < STOCKAGE D'UN OCTET EN ZONE D'EDITION.
ACHB: WORD CHB
ACBB: WORD CBB
ACADR: WORD CADR
AOPER: WORD OPER
ACLV1: WORD CLV1
ACLV2: WORD CLV2
AEDITR: WORD EDITR
AEDHB: WORD EDHB
ACLN: WORD CLN
AV16: WORD V16
ARCHV: WORD RCHV <RECHERCHE VARIABLE
AINSV: WORD INSV <INSTALLATION VARIABLE
ADEB2: WORD DEB2 <ADR RETOUR SI ALT-MODE
<
PROG
<
< I N I T I A L I S A T I O N S G L O B A L E S
<
< BASE DU COMMON
<
WORD COMCAL+128
DEBEFF: EQU $ <POINT D'ENTREE EFFECTIF
LRP C
LY -1,C
LR Y,C
<
< PILE GEREE PAR K
<
LA APREG
LR A,K
<
< TABLE DES NOMS DE VARIABLES: ON MET LE DELIMITEUR DE FIN '00
< EN TETE
<
LAI 0
LX AOTNV
STBY &AOCT
<
< ADRESSE BRANCHEMENT SI ALT-MODE
<
LA ADEB2
WORD '1EB5
<
< INTERROGATION UTILISATEUR
<
DEB2: EQU $
LRM A,B,X
WORD IREPDF
WORD REPD
WORD LREPDF
MOVE < REINITIALISATION DE 'REPD' ET 'REPDF'...
LAD DEM1
SVC 0
JE LEC
LBI 1
ACTD
<
< LECTURE MESSAGE
<
LEC: EQU $
LAD DEM2
SVC 0
JE TSTFIN
LBI 2
ACTD
<
< TEST FIN
<
TSTFIN: EQU $
LX DEM2+1
LBY &AOCT
CPI '04 <1ER CARACT=EOT?
JNE INIT
LAD DEM3 <OUI, RETOUR CCI
SVC 0
JMP DEB2
INIT: EQU $
<
< INITIALISATIONS ANALYSE SYNTAXIQUE ET CALCUL
<
< ADRESSE CARACTERE EN COURS (ADR OCTET)
<
LA DEM2+1
ADRI -1,A
STA PCC <POINTEUR CARACT EN COURS
<
< PILE DES OPERATEURS ET NIVEAU EN COURS
<
LAI NMNIV+3
SWBR A,A
ORI 1
STA &APO <PILE UTILISANT PUSH/PULL
LY APO
LAI 0
PUSH <OPERATEUR NEUTRE AU NIVEAU
<EN COURS (NIVEAU ZERO)
<
STZ NC <NIVEAU EN COURS = 0
<
< PILE DES RESULTATS: DEUX MOTS PAR
< POSTE DE LA TABLE (RESULT.SUR 2 MOTS)
<
LA APR
STA PPR <POINTEUR PILE RESULTATS
LXI 0
STZ &PPR <RAZ 1ER MOT NIVEAU 0
LXI 1
STZ &PPR <IDEM 2EME MOT NIVEAU ZERO
<
< REINIT K (ON PEUT ETRE SORTI EN ERREUR AVEC PILE NON VIDE)
<
LA APREG
LR A,K
<
< ETAT ANALYSE: ETAT INITIAL=EPO (ETAT
< PARENTHESE OUVRANTE)
<
LAI EPO
STA ETAT
PAGE
<
<
< ANALYSE ET CALCUL
<
ANACAL: EQU $
LA ETAT
CPI EFT <FIN DE TRAVAIL?
JNE A01
LAD DEM4 <OUI,ENVOI REPONSE...
SVC 0
JE DEB2 <...+ CARACTERE ">"
LBI 4
ACTD
A01: EQU $
CPI EER <ETAT ERREUR?
JNE A02
LAD DEM5 <OUI, ENVOI MESSAGE...
SVC 0
JE DEB2 <...+CARACTERE ">"
LBI 5
ACTD
A02: EQU $ <DERNIER CARACTERE ATTEINT?
LA PCC <POINT. CAR. EN COURS
SB DEM2+1 < - ADR. DEB
CPI LMMSG <LONG MAX MSG
JL A03 <PLUS PETIT?
LBI 10 <NON, ERREUR
BR AERR
A03: EQU $ <CONTINUER ANALYSE
IC PCC <POINTEUR CARACT EN COURS='+1
LX PCC
LBY &AOCT <A=CARACT.EN COURS
BSR ATRCAR <ET TYPE CARACTERE-->B
LX ETAT
LY &ATBET <ADR. TABLE ETAT EN COURS,
<1ER POSTE
A05: EQU $ <DETERMINATION DE L'DRESSE
<A LAQUELLE ON DOIT SE BRANCHER
<PAR BALAYAGE DE LA TABLE DE
<L'ETAT EN COURS
LR Y,W <ADR POSTE EN COURS
LA 0,W
JAG A04 <SI ADR <=0 , CAS ERREUR
LR A,B <NUMERO MESS. D'ERREUR
BR AERR < ---> ERREUR
A04: EQU $
LA 1,W <TYPES CARACT. AUTORISES
ANDR B,A <LE TYPE EN COURS CONVIENT?
JAE A06 <NON, CONTINUER BALAYAGE
BR 0,W <OUI, BRANCHEMENT
A06: EQU $
ADRI 2,Y <POSTE SUIVANT
JMP A05 <BOUCLE
<
PAGE
<
< ETAT=ECD(CSTE DECIMALE) ...
<
ECDEG: EQU $ <...ET SIGNE =
BSR ACDB <CONV DECIM.-->BIN. ET OPERATION
BR ATRF1 <TRAITEMENT FIN MEMBRE 1
<
ECDOP: EQU $ <...ET OPERATEUR
BSR ACDB <CONV. DEC.--->BIN. ET OPERATION
BR AINOP <INIT OPERATEUR
<
ECDPF: EQU $ <...ET PARENTH. FERMANTE
BSR ACDB <CONV DEC-->BIN ET OPERATION
BR ATRPF <TRAITEMENT PARENTH. FERMANTE
<
< ETAT=ECH(CSTE HEXA) ...
<
ECHEG: EQU $ <...ET SIGNE =
BSR ACHB <CONV HEXA-->BIN. ET OPER.
BR ATRF1 <TRAIT. FIN 1ER MEMBRE
<
ECHOP: EQU $ <...ET OPERATEUR
BSR ACHB <CONV HEXA-->BIN ET OPER.
BR AINOP <INIT OPERATEUR
<
ECHPF: EQU $ <...ET PARENTH. FERMANTE
BSR ACHB <CONV HEXA-->BIN. ET OPER.
BR ATRPF <TRAIT. PARENTH. FERMANTE
<
< ETAT=ECB(CSTE BINAIRE) ...
<
ECBEG: EQU $ <...ET SIGNE =
BSR ACBB <CONVERSION ET OPERATION
BR ATRF1 <TRAIT. FIN MEMBRE 1
<
ECBOP: EQU $ <...ET OPERATEUR
BSR ACBB <CONVERSION ET OPERATION
BR AINOP <INIT OPERATEUR
<
ECBPF: EQU $ <... ET PARENTHESE FERMANTE
BSR ACBB <CONVERSION ET OPERATION
BR ATRPF <TRAIT. PARENTH. FERMANTE
<
<
< ETAT ECA(CSTE ASCI)...
<
ECABA: EQU $ <... ET DELIMITEUR "
<PROBLEME DES DOUBLEMENTS
<DE DELIMITEUR "
LX PCC <POINTEUR CARACT. EN COURS
ADRI 1,X
LBY &AOCT
CPI '22 <CARACT. SUIV. = " ?
JNE A08
BR ATRCA <OUI, CARACT. EN COURS N'EST
<PAS UN DELIMITEUR, IL EST PRIS
<COMME CAR. ASCI
A08: EQU $
ADRI -2,X
LBY &AOCT
CPI '22 <CARACT. PRECEDENT = " ?
JE A09
<NON, DONC CAR. EN COURS EST
<UN DELIMITEUR
LAI EPF <ETAT=PARENTH. FERMANTE(FICTIF)
STA ETAT
BSR ACADR <CADRAGE+OPERATION
A09: EQU $
BR AANACA <RETOUR ANALYSE
<
< ETAT EV1(VARIABLE 1ER MEMBRE)...
<
EV1EG: EQU $ <...ET SIGNE =
BSR ACLV1 <CLOSE VAR. ET OPERATION
BR ATRF1 <TRAIT. FIN 1ER MEMBRE
<
EV1OP: EQU $ <...ET OPERATEUR
BSR ACLV1 <CLOSE VAR. ET OPERATION
BR AINOP <INIT. OPERATEUR
<
EV1PF: EQU $ <...ET PARENTH. FERMANTE
BSR ACLV1 <CLOSE VARIABLE ET OPERATION
BR ATRPF <TRAIT. PARENTH. FERMANTE
<
< ETAT=EV2 (VARIABLE 2ND MEMBRE) ...
<
EV2CD: EQU $ <... ET CAR=EOT (CTRLD)
BSR ACLV2 <CLOSE VAR 2ND MEMBRE
BR ATRFM <TRAITEMENT FIN DE MESSAGE
<
< ETAT=EOP(OPERATEUR) ET CAR. = A,C,L
<
EOPACL: EQU $
LY APO <ADR. PILE OPERATEURS
PULL <OPERATEUR EN COURS-->A
XR A,B
LX PCC <CARACT. EN COOURS...
LBY &AOCT <...DANS A
ORR B,A <OPERATEUR COMPLET-->A
PUSH <STOCKAGE OPERATEUR
LAI EPO <ETAT=PARENTH.OUVRANTE(FICTIF)
STA ETAT
BR AANACA <RETOUR ANALYSE
<
INCD: EQU $ <INIT CSTE DECIMALE
LAI ECD <ETAT=ECD(CSTE DECIMALE)
LXI 5 <LONGUEUR MAX
JMP IN
INCH: EQU $ <INIT CSTE HEXA
LAI ECH <ETAT=ECH(CSTE HEXA)
LXI 8 <LONGUEUR MAX
JMP IN
INCA: EQU $ <INIT CSTE ASCI
LAI ECA <ETAT=ECA(CSTE ASCI)
LXI 4 <LONGUEUR MAX
JMP IN
INCB: EQU $ <INIT CSTE BINAIRE
LAI ECB <ETAT=CSTE BIN.)
LXI 32 <LONGUEUR MAX
JMP IN
INV1: EQU $ <INIT VAR. 1ER MEMBRE
LAI EV1 <ETAT=EV1(VAR.1ER MEMBRE)
LXI LMVC <LONGUEUR MAX
JMP IN
INV2: EQU $ <INIT VAR. 2ND MEMBRE
LAI EV2 <ETAT=EV2(VAR 2ND MEMBRE)
LXI LMVC <LONGUEUR MAX
IN: EQU $
STA ETAT <STOCKAGE ETAT
STX LMVCC <STOCKAGE LONGUEUR MAX
LXI 0 <INIT...
STX LVCC <...LONG. VAR. OU CSTE EN COURS
LA AOVCC <ADR OCT. ZONE DE STOCKAGE...
STA PCVCC <..VAR/CSTE EN COURS->PCVCC
LA ETAT <SI ETAT...
CPI ECD <...=CSTE DECIMALE
JE TRCD
CPI EV1 <...OU VARIABLE 1ER MEMBRE
JE TRV1
CPI EV2 <...OU VARIABLE 2ND MEMBRE
JE TRV2
<ALORS ON STOCKE LE 1ER CARACTERE
<SINON...
BR AANACA <...RETOUR DIRECT A ANALYSE
<
INOP: EQU $
< INIT OPERATEUR:STIOCKAGE DANS LA PILE PO,AU NIVEAU EN COURS.
< SI C'EST UN OPERATEUR A 2 CARACTERES (SHIFT), ALORS
< ON RESTE EN ETAT OPERATEUR;SINON ON PASSE A L'ETAT EPP
<
LX PCC <CAR. EN COURS...
LBY &AOCT <...DANS A
SWBR A,B <..ET B (A GAUCHE)
CPI SHFTL
JE INOP2
CPI SHFTR
JE INOP2
LAI EPP <ETAT=POST O-PERATEUR
JMP INOP1
INOP2: EQU $ <OPERATEUR A 2 CARACTERES
LAI EOP <ETAT=OPERATEUR
INOP1: EQU $
STA ETAT <STOCKAGE ETAT
<
< STOCKAGE DE L'OPERATEUR AU NIV EN COURS
<
LR B,A
LY APO
PULL
LR B,A
PUSH
BR AANACA <RETOUR ANALYSE
PAGE
< TRAITEMENT VARIABLE OU CONSTANTE EN COURS
< (STOCKAGE CARACTERE EN COURS AVEC CONTROLE LONGUEUR
< PAR RAPPORT A LA LONGUEUR MAX: LMVCC)
<
TRCD: EQU $ <CONSTANTE DECIMALE
TRCH: EQU $ <CONSTANTE HEXA
TRCA: EQU $ <CONSTANTE ASCI
TRCB: EQU $ <CONSTANTE BINAIRE
TRV1: EQU $ <VARIABLE 1ER MEMBRE
TRV2: EQU $ <VARIABLE 2ND MEMBRE
LX PCC <CARACTERE EN COURS...
LBY &AOCT <...DANS A
LX PCVCC <POINTEUR COURANT
STBY &AOCT <STOCKAGE DANS VCC
IC PCVCC <PCVCC='+1
LA PCVCC
SB AOVCC <CALCUL LONGUEUR COURANTE
CP LMVCC <LONGUEUR CORRECTE?
JLE TRC1
LBI 30 <NON, ERREUR
BR AERR
TRC1: EQU $ <OUI,
STA LVCC <STORE LONGUEUR..
BR AANACA <...ET RETOUR ANALYSE
CLV1: EQU $
<
< CLOSE VARIABLE 1ER MEMBRE ET OPERATION
<
BSR ARCHV <RECHERCHE VARIABLE
CPZR W <ELLE EXISTE?
JE CLV11 <NON, ERREUR
BSR AOPER <OUI, VALEUR EST DANS A B
<ON PEUT EFFECTUER L'OPERATION
RSR <RETOUR
CLV11: EQU $ <VARIABLE INEXISTANTE
LBI 40
BR AERR <--->ERREUR
CLV2: EQU $
<
< CLOSE VARIABLE SECOND MEMBRE:
< INSTALLATION SI ELLE N'EXISTE PAS ENCORE
< ET AFFECTATION DE VALEUR
<
BSR ARCHV <RECHERCHE VARIABLE
CPZR W <ELLE EXISTE?
JNE CLV21 <OUI
BSR AINSV <NON, ALORS ON L'INSTALLE
CLV21: EQU $ <AFFECTATION DE VALEUR
LA RGVC <RANG
SLLS 1 <RANG*2...
LR A,W <...DANS W
LXI 0
LA &PPR <1ER MOT VALEUR...
LR W,X
STA &AXTVV <...>VALEUR(1)
LXI 1
LA &PPR <1ER MOT VALEUR...
ADRI 1,W
LR W,X
STA &AXTVV <...--->VALEUR(2)
RSR <RETOUR
<
< TRAITEMENT PARENTHESE OUVRANTE
< ETAT=PARENTHESE OUVRANTE
< INCREMENTATION VERIF. NIVEAU EN COURS (NC)
< EMPILEMT OPERATEUR NEUTRE DS PIL OPERAT. (PO)
< EMPILEMENT RESULT. NUL DS PILE RESULTATS (PR)
<
TRPO: EQU $
LAI EPO
STA ETAT <ETAT=EPO(PRENTH. OUVR.)
<
< PILE DES OPERATEURS
<
IC NC <NIVEAU EN COURS='+1
LA NC
CPI NMNIV <NIVEAU MAX ATTEINT?
JLE P01 <NON, EMPILER
LBI 20 <OUI, ERREUR
BR AERR
P01: EQU $
LAI 0
LY APO
PUSH <EMPILEMENT OPERATEUR NEUTRE
<
< PILE DES RESULTATS
<
IC PPR <POINT. PILE RESULT.='+!
IC PPR < " " " '+1
<2 MOTS PAR NIVEAU!
LXI 0
STZ &PPR <RESULTAT NUL 1ER MOT
LXI 1
STZ &PPR <RESULTAT NUL 2ND MOT
BR AANACA
<
< TRAITEMENT PARENTHESE FERMANTE
< ETAT=PARENTHESE FERMANTE
< DECREM. ET VERIF. NIVEAU EN COURS(NC)
< OPERATION
<
TRPF: EQU $
LAI EPF
STA ETAT <ETAT=PARENTH. FERMANTE
<
LA NC <NIVEAU EN COURS
JAG PF1 <CORRECT?
LBI 21 <NON, ERREUR
BR AERR
PF1: EQU $
LY APO <PASSAGE AU NIVEAU INFERIEUR...
PULL <...SUR PILE DES OPERATEURS
LXI 0
LA &PPR <CHARGEMENT A ET B AVEC
LXI 1 <RESULTAT NIVEAU EN COURS
LB &PPR
DC PPR <DECREMENTATION DE 2...
DC PPR <DU POINTEUR PILE RESUL.
DC NC <NIVEAU EN COURS='-1
BSR AOPER <OPERATION
BR AANACA <RETOUR ANALYSE
<
< TRAITEMENT FIN DE 1ER MEMBRE
< ETAT=FIN 1ER MEMBRE
< VERIF NIVEAU EN COURS (NC=0)
<
TRF1: EQU $
LAI EF1
STA ETAT <ETAT=FIN 1ER MEMBRE
<
LA NC <NIVEAU EN COURS...
JAE F11 <..NUL?
LBI 22 <NON, ERREUR
BR AERR
F11: EQU $
BR AANACA <RETOUR ANALYSE
<
< TRAITEMENT FIN DE MESSAGE
< ....
< ....
TRFM: EQU $
LAI EFT
STA ETAT <ETAT=FIN DE TRAVAIL
BSR AEDITR <EDITION REPONSE EN DECIMAL HEXA. ET BIN.
<T BINAIRE
BR AANACA <RETOUR ANALYSE
<
PAGE
<
< S/P T R C A R TRAITEMENT CARACTERE
<
< CE S/P DETERMINE LE TYPE DU CARACTERE EN COURS
<
< EN ENTREE A=CARACTERE EN COURS
<
< EN SORTIE A=INCHANGE
< B=TYPE CARACTERE
<
< LE TRAITEMENT UTILISE LA TACLE DE CORRESPONDANCE
< CARACTERE/TYPE TCAR POUR LA PLUPART DES CARACTERES
<
TRCAR: EQU $
CPI '04 <EOT?
JE T05
CPI '0D <OU RETURN ?
JNE T01
T05: EQU $ <CTRLD OU RETURN
LB TEOT <TYPE=EOT
JMP T99
T01: EQU $
CPI "\"
JNE T02
LB TOP <TYPE OPERATEUR
JMP T99
T02: EQU $
CPI " "
JL T03
CPI "F"
JG T03
LR A,X
LB &ATCAR <CHARGEMENT DU TYPE
JMP T99
T03: EQU $
CPI "L"
JNE T04
LB TLL <TYPE LL
JMP T99
T04: EQU $
LB TAU <TYPE AUTRE
T99: EQU $
RSR
PAGE
EDITR: EQU $
<
< EDITION DU RESULTAT EN DECIMAL HEXADECIMAL BINAIRE ET ASCI
<
LXI 0
LA &PPR <1ER MOT RESULTAT
STA &AXREPA <PREPARATION EDITION ASCI
LXI 1
LB &PPR <2ND MOT RESULTAT
STB &AXREPA <PREPARATION EDITION ASCI
<
< EN DECIMAL
<
LY AOREPD <ADR OCT REPONSE DECIMALE
BSR ACBD <CONVERSION-EDITION
ADRI REPD-REP+LREPF+LREPD*2,X <CALCUL LONGUEUR
STX DEM4+2
<
< EN FLOTTANT :
<
LY AOREPF <ADR OCT REPONSE FLOTTANTE
BSR AEFL <CONVERSION-EDITION
<
< EN HEXADECIMAL
<
LY AOREPH <ADR OCT REPONSE HEXA
STY PCVCC <...DANS POINTEUR
LXI 4 <NB DE SHIFT POU EDHB
LYI 4*2+1 <LONG. ZONE D'EDITION
BSR AEDHB <CONVERSION-EDITION
<
< EN BINAIRE
<
LY AOREPB <ADR OCT. REPONSE BINAIRE...
STY PCVCC <...DANS POINTEUR
LXI 1 <NB DE SHIFT POUR EDHB
LYI 4*8+7 <LONG. ZONE D'EDITION
BSR AEDHB <CONVERSION-EDITION
<
< EN ASCI (LES CARACTERES NON-COMPRIS EMTRE
< '20 ET '5F SOT REMPLACES PAR
< DES BLANCS
<
LA AOREPA
STA PCVCC <ADR OCT 1ER CAR
LXI 4 <INIT COUNT
CAA1: EQU $
LR X,W <SVG COUNT
LX PCVCC
LBY &AOCT <CAR EN COURS...
CPI '20
JL CAA2
CPI '5F
JLE CAA3
CAA2: EQU $ <...COMPRIS ENTRE '20 ET '5F
LAI '20 <--->REMPLACE PAR BLANC
STBY &AOCT
CAA3: EQU $
IC PCVCC <CAR SUIVANT
LR W,X <RESTAUR COUNT
JDX CAA1 <BOUCLE
RSR <RETOUR
PAGE
<
< S/P C B D CONVERSION BINAIRE-->DECIMAL
<
< EN ENTREE A B NOMBRE A CONVERTIR
< Y=ADR OCTETZONE DE STOKAGE RESULTAT
<
< EN SORTIE A B Y INCHANGES
< X=LONGUEUR OCTETS RESULTAT
<
< NOTA: LE NOMBRE OBTENU EST PRECEDE D'UNE "*" S'IL ETAIT TROP GRAND
CBD: EQU $
PSR A,B,Y
EORR W,W
CPI -1 <A='FFFF ?
JE CBDN <OUI, VOIR SI B NEGATIF
JANE CBDP <NON, PROBLEME
XR A,B <B EST-IL ...
JAGE CBDOK <...POSITIF?ALORS OK
CBDP: EQU $ <PROBLEME, METTRE * DEVANT LE NOMBRE
LAI "*"
JMP CBDOK2
CBDN: EQU $
XR A,B <B EST-IL...
JAL CBDOK <...NEGATIF? ALORS OK
JMP CBDP <...PROBLEME
CBDOK: EQU $
LAI " " <NE RIEN METTRE DEVANT LE NOMBRE
CBDOK2: EQU $
LR Y,X <ADR OCT ZONE EDITION...
ADRI -1,X <... -1
STBY &AOCT <STORE "*" 0U " "
PLR A,B,Y
PSR A,B,Y
TBT 15+1 <NB NEGATIF?
JNC CBD2 <NON
ADRI 1,W <OUI, W POSITIONNE A 1
NGR B,B <INVERSION
CBD2: EQU $
LXI 0 <COUNT NB CHIFFRES DECIMAUX
CBD5: EQU $ <BOUCLE SUR DIVISIONS PAR 10
LAI 0
DV DIX
JNV CBD3 <DIVISION IMPOSSIBLE?
LBI 'D <OUI, RETOUR CCI
ACTD
CBD3: EQU $
PSR B <PUSH LE RESTE DE LA DIVISION
ADRI 1,X <COUNT NB CIFFRES DECIMAUX
JAE CBD4 <QUOTIENT NUL?
XR A,B <NON, UN CONTINUE
JMP CBD5
CBD4: EQU $ <STCKAGE NB DECIMAL DANS ZONE
<D'ADRESSE OCTET (Y)
LR X,B <SVG LONG. DANS B
LR W,A <SIGNE
JAE CBD6 <NB POSITIF, PAS DE SIGNE
<NB NEGATIF, STOCKE SIGNE
ADRI 1,B <LONGUEUR='+1
LAI "-"
XR X,Y
STBY &AOCT
XR X,Y
ADRI 1,Y <ADR STOCKAGE='+1
CBD6: EQU $ <BOUCLE DE STOCKAGE DES CHIFFRES
<DECIMAUX
PLR A <PULL CHIFFRE
ORI '30
XR X,Y
STBY &AOCT <STORE CHIFFRE ETENDU
XR X,Y
ADRI 1,Y <ADR=ADR+1
JDX CBD6 <BOUCLE STOCKAGE
LR B,X <LONGUEUR-->X
PLR A,B,Y <RESTAURATION
RSR
PAGE
<
< E F L : E D I T I O N D ' U N N O M B R E F L O T T A N T.
<
< ARGUMENT:
< - 'A'-'B' = NOMBRE FLOTTANT A EDITER.
< - 'Y' = ADRESSE OCTET D'EDITION.
<
< RESULTAT:
< - LE NOMBRE EST EDITE SOUS LA FORME [-]0.XXXXXXX [-]ENN
<
< ATTENTION:
< - PREVOIR PAS MAL DE MOTS DANS SA PILE !
<
<
< LA METHODE UTILISEE EST LA SUIVANTE:
<
< - ON TRAVAILLE AVEC LA VALEUR ABSOLUE DE X.
< - ON DETERMINE SON ORDRE DE GRANDEUR, C'EST-A-DIRE QU'ON CHERCHE
< N TEL QUE : 10**N <= X <= 10**(N+1)
< - ON DIVISE X PAR 10**(N+1) --> U AVEC 0 <= U < 1, PUIS ON
< DETERMINE LES DECIMALES DE U EN FAISANT DES MULTIPLICATIONS PAR 10
< AVEC ARRONDI PUIS SOUSTRACTION A U' DU CHIFFRE OBTENU.....
< AUTANT DE FOIS QUE NECESSAIRE.
<
EFL: EQU $
<
< SAUVEGARDES ET INITIALISATIONS.
<
PSR A,B,X,Y
PSR W
STY EFLREL < RELAI OCTET D'ACCES A LA ZONE D'EDITION.
< SIGNE DE X ARGUMENT.
STZ EFLSDX < X POSITIF OU NUL A PRIORI.
FCAZ
JGE EFL1
DC EFLSDX < X NEGATIF.
LYI "-" < PLACER LE SIGNE MOINS.
BSR EFLAST
EFL1: EQU $
LYI "0" < PLACER LE ZERO.
BSR EFLAST
LYI "." < ET LE POINT DECIMAL.
BSR EFLAST
FABS < ON TRAVAILLE AVEC X > 0.
STZ EFLPUI < PUISSANCE NULLE A PRIORI.
FCAZ < ET ON ELIMINE TOUT DE SUITE LE NUL.
JNE EFL7
LYI "0"
BSR EFLAST
JMP EFL9
EFL7: EQU $
LRM W < ON FERA DES MULTIPLICATIONS PAR 10
WORD EFLDIX < A PRIORI.
LYI 1 < PUISSANCES POSITIVES A PRIORI.
FCAM EFLUN
JGE EFL2
ADRI EFL1SD-EFLDIX,W < MULTIPLICATIONS PAR 0.1.
LYI -1 < PUISSANCES NEGATIVES...
EFL2: EQU $
<
< EVALUATION DE L'ORDRE DE GRANDEUR DU NOMBRE.
<
PSR A,B
FLD EFLUN
FST EFLT1 < TRAV1 = 1.
PLR A,B
LXI 0 < PUISSANCE DE 10 COURANTE.
EFL4: EQU $
CPZR Y < PIUSSANCES POSITIVES / NEGATIVES ?
JL EFL3
< ON TRAVAILLE EN PUISSANCES DE 10 POSITIVES.
FCAM EFLT1
JL EFL5 < VU.
EFL6: EQU $
< PASSER A LA PUISSANCE DE 10 SUIVANTE.
PSR A,B
FLD EFLT1
FMP 0,W
JNCV $+2
ACTD
FST EFLT1
PLR A,B
ADR Y,X < NOUVELLE PUISSANCE COURANTE.
JMP EFL4
EFL3: EQU $
< ON TRAVAILLE EN PUISSANCES DE 10 NEGATIVES.
FCAM EFLT1
JL EFL6 < ESSAYER PLUS PETIT.
PSR A,B
FLD EFLT1 < REVENIR UN PEU EN ARRIERE...
FMP EFLDIX
FST EFLT1
ADRI 1,X < PUISSANCE DE 10 RETENUE.
PLR A,B
EFL5: EQU $
STX EFLPUI < PUISSANCE RETENUE.
FDV EFLT1 < DIVISER X PAR 10 ** (N+1) --> U.
FST EFLT1 < ON A ICI : 0 <= U < 1.
<
< DETERMINATION DES DECIMALES DE U.
<
LXI 8 < ON NE SORT QUE 8 DECIMALES.
EFL8: EQU $
FCAZ
JE EFL9 < TERMINE.
FMP EFLDIX
FST EFLT1
FIX
LR A,Y
ADRI "0",Y
BSR EFLAST < STOCKER LA DECIMALE...
FLT
FNEG
FAD EFLT1
JDX EFL8 < DECIMALE SUIVANTE SVP.
EFL9: EQU $
< IL RESTE A EDITER L'EXPOSANT.
LYI " "
BSR EFLAST
LYI "E"
BSR EFLAST
LY EFLREL
LA EFLPUI
BSR EFLADA < EDITION DES 2 CHIFFRES DE L'EXPOSANT.
<
< RETOUR :
<
PLR W
PLR A,B,X,Y
RSR
<
< S T O C K A G E D ' U N C A R A C T E R E E N Z O N E
<
< D ' E D I T I O N.
<
EFLST: EQU $
PSR A,X
LX EFLREL
LR Y,A
STBY &EFLX
IC EFLREL
PLR A,X
RSR
PAGE
<
< C O N V E R S I O N - E D I T I O N E N D E C I M A L
<
< F O R M A T A S C I D ' U N N O M B R E B I N A I R E
<
< C O N T E N U D A N S ' A '.
<
< ARGUMENTS:
< - 'A' = NOMBRE EN BINAIRE.
< - 'Y' = ADRESSE OCTET D'EDITION DE CE NOMBRE
<
< ATTENTION:
< CE S/P EST SPECIALISE DANS L'EDITION DE L'EXPOSANT
< D'UN NOMBRE FLOTTANT, AUSSI N'ACCEPTE-T-IL QUE DES
< NOMBRES TENANT SUR 2 CHIFFRES DECIMAUX AU MAXIMUM.
<
EFLDA: EQU $
CPI 99 < VALIDATION.
JLE $+2
ACTD
PSR A,B,X,Y < SAUVEGARDES.
PSR W
<
XR Y,W
LYI " " < SI POSITIF, PAS DE SIGNE.
JAGE $+2
LYI "-" < NOMBRE NEGATIF, SIGNE MOINS.
XR Y,W < 'W' CONTIENT LE SIGNE.
<
LXI 2 < 2 CHIFFRES MAXI.
EFLDA1: EQU $
SARD 16
DV EFL10E
CPZR B < TEST SIGNE DU RSTE.
JGE $+2
NGR B < CHIFFRE POSITIF.
ADRI "0",B < POUR EDITION FUTURE.
PSR B < PUSH CHIFFRE COURANT.
JDX EFLDA1
PSR W < PUSH SIGNE.
<
LXI 3 < SIGNE PLUS 2 CHIFFRES.
EFLDA2: EQU $
LR X,W < SAVE COUNT.
LR Y,X < INDEX COURANT.
PLR A < PULL SIGNE / CHIFFRE COURANT.
STBY &EFLX < STOCKAGE SIGNE / CHIFFRE.
LR W,X < RECUPERATION COUNT.
ADRI 1,Y < INDEX CHIFFRE SUIVANT.
JDX EFLDA2
<
PLR W < RESTAURATIONS.
PLR A,B,X,Y
RSR
PAGE
EDHB: EQU $
< EDITION RESULTAT EN FORMAT HEXADECIMAL OU BINAIRE
< EN ENTREE A B RESULTAT A EDITER
< X NOMBRE DE SHIFT
< Y LONGUEUR TOTALE APRES CONVERSION (Y COMPRIS LES BLANCS
< BLANC TOUS LES 4 CARACTERES)
< PCVCC ADR.OCTET ZONE D'EDITION
<
< EN SORTIE A B X INCHANGES
< Y DETRUIT
< PCVCC,LVCC DETRUITS
<
STZ LVCC <RAZ LONG. COURANTE
PSR A,B
PSR X <NB DE SHIFT
LR Y,X <INIT COUNT DE BOUCLE
<
EDHB1: EQU $ <BOUCLE
LR X,Y <SVG. COUNT
PLR X <LECT. ...
PSR X <..ET SVG NB SHIFT
SCLD 0,X
XR A,B
LR A,W <SVG. DE A
LR X,A <NB DE SHIFT...
CPI 1 <... =1 ? (BINAIRE)
JE EDHB2
LXI '0F <NON,DONC GARDER 4 BITS
JMP EDHB4
EDHB2: EQU $ <OUI,DONC BINAIRE...
LXI '01 <GARDER 1 SEUL BIT
EDHB4: EQU $
LR W,A <RECUP. DE A
ANDR X,A <SELECT 1 OU 4 BITS
CPI 9 <CHIFFRE>9 ?
JLE EDHB3
ADRI '7,A <OUI, LUI AJOUTER 7(PUIS 30)
EDHB3: EQU $
ADRI '30,A
LX PCVCC <POINTEUR
STBY &AOCT <STORE CARACT.
IC PCVCC <POINTEUR='+1
IC LVCC <LONG.='+1
LA LVCC
ANDI '03
JANE EDHB5 <LONG. MULTIPLE DE 4 ?
LAI " " <OUI,INTERCALER UN BLANC
LX PCVCC
STBY &AOCT <STORE BLANC
IC PCVCC <POINTEUR='+1
ADRI -1,Y <COUNT='-1
EDHB5: EQU $
LR W,A <RECUP. A
XR A,B
LR Y,X <RECUP COUNT
JDX EDHB1 <BOUCLE
<
PLR X
PLR A,B
RSR <RETOUR
<
<
< CONTROLE LONGUEUR VARIABLE OU CSTE NON-NULLE
<
CLN: EQU $
LA LVCC <LONG. VAR OU CSTE EN COURS
JAG CLN1
LBI 31 <LONG. NULLE ERREUR
BR AERR
CLN1: EQU $ <LONGUEUR NON NULLE...
RSR <...RETOUR
<
<
< S/P E R R PREPARATION MESSAGE D'ERREUR
<
< EN ENTREE B=NUMERO MESSAGE D7ERREUR
<
< EN SORTIE MESSAGE D'ERREUR EN ZONE REPONSE
< ETAT=ETAT ERREUR
<
ERR: EQU $
LAI EER
STA ETAT <ETAT=EER (ERREUR)
LAI 0
CPZR B <NUM. DE MESSAGE ...
JGE ERR1 <...POSITIF OU NUL?
LAI -1 <NON, A=-1 (POUR S/P CBD)
ERR1: EQU $
LY AOCODR <ADR OCT CODE ERREUR APRES CONVERS.
BSR ACBD <CONVERSION BIN-->DECIMAL
ADRI CODR-ER*2,X <LONGUEUR DU MESSAGE
STX DEM5+2 <STOCKAGE LONGUEUR
BR AANACA <RETOUR ANALYSE
<
<
<
PAGE
OPER: EQU $
<
< OPERATION: <RESULT. NIV. NC>= ' .<OPERATEUR NIV. NC.>. <A B>
<
PSR A,B <SAUVEGARDE NOMBRE EN COURS
LXI 1
LY &PPR <2ND MOT RESULTAT NIVEAU NC
LXI 0
LX &PPR <1ER MOT RESULTAT NIVEAU NC
<
< SELECTION DE L'OPERATEUR
<
LR Y,W <SAUVEGARDE Y
LY APO <PILE OPERATEURS
PULL <OPERATEUR--->A
PUSH
LR W,Y <RESTAURATION Y
JAE OPERN <OPERATEUR NEUTRE
LR A,B
SLRS 8 <CARACTERE GAUGHE DE L'OPERATEUR
XR A,B
ANDI 'FF <CARACTERE DROIT DE L'OPERATEUR
XR A,B
CPI PLUS
JE OPLUS <ADDITION
CPI MOINS
JE OMOINS <SOUSTRACTION
CPI SHFTL
JE OSHFTL <SHIFT LEFT
CPI SHFTR
JE OSHFTR <SHIFT RIGHT
CPI OR
JE OOR <OU LOGIQUE
CPI AND
JE OAND <ET LOGIQUE
CPI EOR
JE OEOR <OU EXCLUSIF
CPI MULT
JE OMULT <MULTIPLICATION
JMP ODR <DIVISION/RESTE
<
OPERN: EQU $ <OPERATEUR NEUTRE, SIMPLE STOCKAGE
PLR A,B <RECUP NOMBRE EN COURS
OPSTK: EQU $ <STOCKAGE RESULTAT EN PILE RESULT. (PR)
LXI 0
STA &PPR <1ER MOT RESULTAT
LXI 1
STB &PPR <2ND MOT RESULTAT
RSR <RETOUR
<
<
OOR: EQU $ <OPERATEUR OU LOGIQUE
PLR A,B <RECUP NOMBRE EN COURS
ORR X,A
ORR Y,B
JMP OPSTK <STOCKAGE
<
OAND: EQU $ <OPERATEUR ET LOGIQUE
PLR A,B <RECUP NOMBRE EN COURS
ANDR X,A
ANDR Y,B
JMP OPSTK <STOCKAGE
<
OEOR: EQU $ <OPERATEUR OU EXCLUSIF
PLR A,B <RECUP NOMBRE EN COURS
EORR X,A
EORR Y,B
JMP OPSTK <STOCKAGE
OSHFTL: EQU $ <SHIFT LEFT
LR B,W <SVG NATURE SHIFT (A,C,L)
PLR A,B <RECUP NB EN COURS
JAL SERR <NB SHIFT NEGATIF -->ERREUR
PSR X,Y <SVG RESULT. NIV. NC
LR B,X <NB DE SHIFT
LR W,A <NATURE SHIFT...
CPI "A"
JE SAL <...ARITHMETIQUE
CPI "C"
JE SCL <...CIRCULAIRE
CPI "L"
JE SLL <...LOGIQUE
ACTD
SAL: EQU $ <SAL ASSIMILE A SLL
SLL: EQU $ <LOGICAL LEFT
PLR A,B <RECUP. XY--->AB
SLLD 0,X
JMP OPSTK <STOCKAGE
SCL: EQU $ <CIRCULARY LEFT
PLR A,B <RECUP. XY--->AB
SCLD 0,X
JMP OPSTK <STOCKAGE
OSHFTR: EQU $ <SHIFT RIGHT
LR B,W <SVG NATURE SHIFT (A,C,L)
PLR A,B <RECUP NB EN COURS
JAL SERR <NB SHIFT NEGATIF -->ERREUR
PSR X,Y <SVG RESULT. NIV. NC
LR B,X <NB DE SHIFT
LR W,A <NATURE SHIFT...
CPI "A"
JE SAR <...ARITHMETIQUE
CPI "C"
JE SCR <...CIRCULAIRE
CPI "L"
JE SLR <...LOGIQUE
ACTD
SAR: EQU $ <ARITHMETICAL RIGHT
PLR A,B <RECUP. XY--->AB
SARD 0,X
JMP OPSTK <STOCKAGE
SCR: EQU $ <CIRCULARY RIGHT
PLR A,B <RECUP. XY--->AB
SCRD 0,X
JMP OPSTK <STOCKAGE
SLR: EQU $ <LOGICAL RIGHT
PLR A,B <RECUP XY--->AB
SLRD 0,X
JMP OPSTK <STOCKAGE
SERR: EQU $ <NOMBRE DE SHIFT NEGATIF: ERREUR
LBI 34
BR AERR
OPLUS: EQU $ <ADDITION AB=XY+AB
PLR A,B <RECUP NB EN COURS
ADR Y,B <POIDS FAIBLES
JNC PL1 <CARRY?
ADCR A <OUI,LE REPORTER
JNV PL1 <PAS D'OVERFLOW APRES REPORT?
JMP PLER <SINON, ERREUR
PL1: EQU $
ADR X,A <POIDS FORTS
JNV OPSTK <PAS D'OVERFLOW-->STOCKAGE
JMP PLER <SINON, ERREUR
OMOINS: EQU $ <SOUSTRACTION AB=XY-AB
PLR A,B <RECUP NB EN COURS
SBR B,Y <POIDS FAIBLES
JNC MO1 <PAS DE CARRY?
SBCR X <SI,LE REPORTER
JNV MO1 <PAS D'OVERFLOW APRES REPORT?
JMP MOER <OUI, ERREUR
MO1: EQU $
SBR A,X <POIDS FORTS
JV MOER <SI OVERFLOW -->ERREUR
LR X,A <SINON, RESULTAT DANS A ...
LR Y,B <...ET B
JMP OPSTK <STOCKAGE
PLER: EQU $ <ERREUR SUR ADDITION
LBI 35
BR AERR
MOER: EQU $ <ERREUR SUR SOUSTRACTION
LBI 36
BR AERR
<
<
<
ODR: EQU $ <DIVISION,RESTE
LR A,W <SVG. OPERATEUR
BSR AV16 <VERIF NB EN COURS TIENT SUR 1 MOT
<AV16 DEPILE A ET B
CPZR B <DIVISEUR NUL ?
JNE ODR1
LBI 38 <OUI,ERREUR
BR AERR
ODR1: EQU $
LR X,A <DIVIDENDE 1ER MOT
LXI 0
STB &PPR <STORE DIVISEUR
LR Y,B <DIVIDENDE 2ND MOT
DV &PPR
JNV ODR2 <OVERFLOW?
LBI 39 <OUI,ERREUR
BR AERR
ODR2: EQU $
XR A,W <RECUP OPERATEUR
CPI DIV <DIVISION?
JNE OREST
LR W,B <OUI, QUOTIENT-->B
OREST: EQU $ <RESTE DANS B
<IL FAUT ETENDRE LE SIGNE
<DU RESULT. A A
TBT 16 <RESULT. NEGATIF?
JNC ODR3
LAI -1
JMP OPSTK <STOCKAGE
ODR3: EQU $
LAI 0 <RESULT. POSITIF
JMP OPSTK <STOCKAGE
OMULT: EQU $ <MULTIPLICATION (AB=XY*AB)
BSR AV16 <VERIFICATION : NB EN COURS
<DOIT TENIR SUR 1 MOT
<(V16 DEPILE A ET B)
PSR A,B
PSR X,Y <MULTIPLICANDE
BSR AV16 <IDEM
PLR A,B <MULTIPLICATEUR
LR Y,A <MULTIPLICANDE
LXI 0
STB &PPR <STORE MULTIPLCATEUR
MP &PPR
JMP OPSTK <STOCKAGE
<
CHB: EQU $
< CONVERSION NB EN HEXA ( 'AB4E.. ) EN BINAIRE DANS A B
< ET OPERATION (SP OPER)
<
BSR ACLN <VERIF LONGEUR NON-NULLE
LBI 4 <NB DE SHIFT POUR CVHB
JMP CVHB
CBB: EQU $
< CONVERSION DE NB BINAIRE ( %0110011....) EN BINAIRE
< DANS A B ET OPERATION (SP OPER)
<
BSR ACLN <VERIF LONGUEUR NON NULLE
LBI 1 <NB DE SHIFT POUR CVHB
CVHB: EQU $
LA AOVCC <ADRESSE CONSTANTE...
STA PCVCC <...DANS POINTEUR
LX LVCC <LONGUEUR CSTE A CONVERTIR
LAI 0
PSR A
PSR A <INIT A ZERO
CVHB1: EQU $ <BOUCLE TRAITEMENT 1 CARACT.
LR X,Y <SVG COUNT POUR BOUCLE (JDX)
LX PCVCC <CARACT. EN COURS...
LBY &AOCT <...DANS A
CPI "A" <CHIFFRE ...
JL CVHB2 <...INFERIEUR A "A" ?
ADRI 9,A <NON, AJOUTER 9
CVHB2: EQU $
ANDI '0F <ON GARDE LES 4 BITS DE DROITE
LR A,W <SVG CHIFFRE EN COURS
LR B,X <NB DE SHIFT
PLR A,B
SLLD 0,X <SHIFT
XR A,B
ORR W,A <INSERTION DU CHIFFRE
XR A,B
PSR A,B <STOCKAGE
LR X,B <SVG NB DE SHIFT
IC PCVCC <POINTEUR='+1
XR X,Y <RECUP COUNT
JDX CVHB1 <BOUCLE
<
PLR A,B
BSR AOPER <OPERATION
RSR <RETOUR
CDB: EQU $
<
< CONVERSION NOMBRE DECIMAL EXTERNE--->BINAIRE DANS A B
< LE NOMBRE DOIT TENIR DANS UN REGISTRE. IL EST PLACE DANS B
< LE SIGNE EST ETENDU A A
<
DC PCVCC <POINTEUR-1...
LX PCVCC <...DANS X (DERNIER CHIFFRE)
LBY &AOCT <DERN. CHIFFRE, ON NE GARDE...
ANDI '0F <...QUE LES 4 BITS DROITE...
LR A,W <...DANS W
LA LVCC <LONGUEUR...
ADRI -1,A <... RESTANTE...
JAE CDB3 <...NULLE?
<NON,CONTINUER CONVERSION PAR
<BOUCLE
LX LVCC
ADRI -1,X <INIT COUNT
LAI 1
STA PDIX <INIT PUISSANCE
CDB1: EQU $ <BOUCLE
LR X,Y <SAUVEGARDE COUNT
LA PDIX
MP DIX <CALCUL PUISSANCE
STB PDIX
DC PCVCC <POINTEUR='-1
LX PCVCC <CHIFFRE EN COURS...
LBY &AOCT < --->A
ANDI '0F <4 BITS DE DROITE
MP PDIX <ELEVATION PUISSANCE
JANE CDB2 <DEPASSEMENT?
XR A,B
JAL CDB2 <DEPASSEMENT?
ADR A,W <NON, CUMUL
JCV CDB2 <DEPASSEMENT?
LR Y,X <NON, RECUP. COUNT...
JDX CDB1 <...ET BOUCLE
CDB3: EQU $ <STOCKAGE RESULTAT
LAI 0 <DANS A ET...
LR W,B <B
BSR AOPER <OPERATION
RSR <RETOUR
CDB2: EQU $ <DEPASSEMENT, ON VA EN ERREUR
LBI 33
BR AERR
CADR: EQU $
<
< CADRAGE CSTE ASCI, STOCKAGE DANS AB (NOMBRE EN COURS)
< ET OPERATION
<
BSR ACLN <VERIF LONGUEUR NON NULLE
LAI 4
LY LVCC <LONGUEUR (NON NULLE)
SBR Y,A
SLLS 3
LR A,X <X=(4-LONGUEUR)*8
LA AOVCC <ADR. OCTET CSTE ASCI
SLRS 1 <ADR MOT
XR L,W
LR A,L
LA 0,L <CSTE ASCI NON CADREE...
LB 1,L <...DANS AB
XR L,W
SLRD 0,X <CADRAGE
BSR AOPER <OPERATION
RSR <RETOUR
V16: EQU $
<
< VERIFICATION QU'UN NOMBRE SUR 2 MOTS PEUT TENIR
< SUR 1 MOT; SINON, ERREUR
<
PLR L <ADRESSE RETOUR
PLR A,B
CPI -1 <A='FFFF ?
JE AV2 <OUI, VOIR SI B NEGATIF
JAE AV1 <A=0, VOIR SI B POSITIF
JMP AVER <ERREUR
AV1: EQU $
TBT 16 <B POSITIF?
JNC AVOK <OUI, OK
JMP AVER <NON, ERREUR
AV2: EQU $
TBT 16 <B NEGATIF?
JC AVOK <OUI, OK
AVER: EQU $ <ERREUR
LBI 37
BR AERR
AVOK: EQU $
PSR L <ADRESSE RETOUR
RSR <RETOUR
PAGE
RCHV: EQU $
<
< RECHERCHE VARIABLE EN TABLE DES NOMS DE VAR. (TNV)
< ET, SI ELLE EXISTE ON VA CHERCHER SA VALEUR EN TABLE
< DES VALEURS (TVV) ET ON LA MET DANS A B
<
< EN ENTREE
<
< VCC/LVCC/PCVCC: VAR. EN COURS/LONGUEUR/POINTEUR COURANT
<
< EN SORTIE
<
< VCC/LVCC/PCVCC: INCHANGES
< SI LA VARIABLE EXISTE:
< W=1
< AB=SA VALEUR, RGVC=SON RANG (DE 0 A N)
< PCTN, POINTEUR COURANT TABLE DES NOMS TNV POINTE
< SUR LE DERN. CAR. DU NOM + 2 (C'EST '00 SI LA VAR. EST
< EST LA DERNIERE DE LA TABLE)
< SI LA VARIABLE N'EXISTE PAS
< W=0
< PCTN POINTE SUR DELIMITEUR DE FIN DE TABLE '00
<
< RAPPEL: LA TABLE A LA STRUCTURE SUIVANTE:
< "NOM1"'FF"NOM2"'FF....."NOMN"'FF'00
<
<
< INITIALISATIONS
<
LX PCVCC
PSR X <SAUVEGARDE POINTEUR DE VCC
LAI 'FF <DELIMITATION...
STBY &AOCT <..VAR. EN COURS
STZ RGVC <RANG=0
LA AOTNV
STA PCTNV <POINTEUR COURANT TABLE TNV
RCHVT: EQU $ <BOUCLE RECHERCHE VARIABLE
LX PCTNV
LBY &AOCT
JANE RCHVT1 <FIN DE TABLE?
EORR W,W <OUI, RECHERCHE INFRUCTUEUSE
JMP RCHVF <-->FIN
RCHVT1: EQU $
< RECHERCHE VAR. PAR COMPARAISON VAR. VCC
< AVEC VAR. EN COURS TABLE (TNV, POINTEUR PCTNV)
LY PCTNV <SVG PCTNV
LX LVCC
ADRI 1,X <LONGUEUR COMPARAISON
LA AOVCC
STA PCVCC <POINTE SUR 1ER CAR. VARIABLE VCC
RCHVT2: EQU $ <BOUCLE COMPARAISON NIV. CARACTERE
LR X,W <SVG COUNT
LX PCTNV
LBY &AOCT
LR A,B <CAR. EN COURS TNV
LX PCVCC
LBY &AOCT <CAR. EN COURS VCC
CPR A,B <EGALITE CARACTERE?
JNE RCHVT3 <NON,SORTIE BOUCLE CARACTERE
IC PCVCC <CAR. SUIVANT
IC PCTNV <CAR. SUIVANT
LR W,X <RESTAUR. COUNT
JDX RCHVT2 <BOUCLE CARACTERE
<
< EGALITE! RECHERCHE FRUCTUEUSE
LAI 1
LR A,W <W=1 EXISTENCE
JMP LOADV <LOAD VALEUR VAR. DANS A B
RCHVT3: EQU $ <INEGALITE!
STY PCTNV <RESTAUR. PCTNV
RCHVT4: EQU $ <RECHERCHE DELIMITEUR 'FF
ADRI 1,Y
LR Y,X
LBY &AOCT
CPI 'FF
JNE RCHVT4
STY PCTNV
IC PCTNV <POINTE SUR 1ER CAR. DU NOM
<SUIVANT (OU '00 SI FIN !)
IC RGVC <RANG=+1
JMP RCHVT <BOUCLE RECHERCHE
LOADV: EQU $ <LOAD VALEUR
LA RGVC <RANG...
SLLS 1 <... *2
LR A,X
LA &AXTVV <1ER MOT VALEUR
ADRI 1,X
LB &AXTVV <2ND MOT VALEUR
RCHVF: EQU $ <FIN DU S/P
PLR X
STX PCVCC <RESTAURATION PCVCC
RSR <RETOUR
PAGE
INSV: EQU $
<
< INSTALLATION VARIABLE DANS LA TABLE DES NOMS DE VAR. TNV
<
< EN ENTREE
<
< VCC/LVCC/PCVCC: VARIABLE/LONGUEUR/POINTEUR
< PCTNV: POINTE SUR FIN TABLE TNV ('00)
< RGVC: RANG DE LA DERN. VAR. DE TNV
<
< EN SORTIE
<
< VARIABLE INSTALLEE
< PCVCC DETRUIT
< PCTNV POINTE SUR FIN DE TNV ('00)
< RGVC='+1 RANG DE LA VAR. QUE L'ON VIENT D'INSTALLER
<
< ERREURS: CAPACITE TNV/CAPACITE TVV
<
<
< VERIF CAPACITE TABLES
<
< TABLE DES NOMS DE VAR. (TNV)
<
LA PCTNV <POINTEUR...
AD LVCC <...+LONGUEUR...
ADRI 2,A <...+DELIM'FF+DELIM'00...
CP AOTNVF <... >ADR. FIN TNV ?
JL INSV1
LBI 41 <OUI, ERREUR CAPACITE TNV
BR AERR
INSV1: EQU $
<
< TABLE DES VALEURS (TVV)
<
LA RGVC
ADRI 1,A <A=RANG+1
CPI NMAXV <RANG>= NB MAX VAR. ?
JL INSV2
LBI 42 <OUI, ERREUR CAPACITE TVV
BR AERR
INSV2: EQU $
LA AOVCC
STA PCVCC <1ER CAR. VAR. A INSTALLER
LX LVCC <LONGUEUR DU NOM...
ADRI 1,X <...+1 POUR DELIM. DE FIN 'FF
INSV3: EQU $ <BOUCLE STOCKAGE
LR X,W <SVG COUNT
LX PCVCC
LBY &AOCT <CARACT. EN COURS...
LX PCTNV
STBY &AOCT <...--->TABLE TNV
IC PCVCC <CARACT. SUIV.
IC PCTNV <CARACT. SUIV.
LR W,X <RESTAUR. COUNT
JDX INSV3 <BOUCLE
LX PCTNV
LAI 0
STBY &AOCT <DELIMITEUR DE FIN DE TABLE
RSR <RETOUR
END
Copyright © Jean-François COLONNA, 2022-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2022-2024.