<
< R E S T A U R A T I O N
<
IDP "CARTES A DISQUE"
IDP "P. FRANCONNET"
IDP "RELEASE 21/08/80"
TABLE
ZERO: EQU $
<
< I M P L A N T A T I O N ...
<
XIMPL: VAL '3000 < ADRESSE D'IMPLANTATION.
$EQU $+XIMPL
<
< A T T E N T I O N ! ! !
<
< L'ADRESSE D'IMPLANTATION DOIT TENIR COMPTE
< DU FAIT QUE CE PROGRAMME UTILISE DES ADRESSES D'OCTETS
< ET QUE PAR CONSEQUENT TOUS SES BUFFERS DOIVENT RESIDER
< EN ADRESSES BASSES (<=32K).
<
QUANTA: VAL 1 < QUANTA=NB SECTEURS PHYSIQUES
< POUR 1 SECTEUR LOGIQUE (SGF)
< CAR ON TRAVAILLE FORCEMENT SUR DKF.
NSPDK3: VAL '25
NSPDK2: VAL NSPDK3-1
LPAC: VAL 128 < LONG PAGE VIRT SI CARTES
LCCI: VAL 80 < COMPATIBILITE CMS5.
NBCOL: VAL LCCI < NOMBRE DE COLONNES CARTE
< ATTENTION: CECI N'EST PAS UN PARAMETRE
PILE: DZS 36 < PILE POUR 'K'.
<
< BUFFERS.
<
BC: DZS NBCOL < BUFFER CARTE
FBC: EQU $ < FIN BUFFER CARTE
<
BUDK: DZS QUANTA*128 < BUFFER DKF/DKM.
FBUDK: EQU $ < FIN DU BUFFER DK.
<
< PAGE VIRTUELLE.
<
PAGE: DZS LPAC
FPAGE: EQU $ < FIN DE PAGE.
<
< TABLES POUR PUNCH
<
MSK1: BYTE 'FF;'E0;'FC;'FF;'80;'F0;'FE;'FF;'C0;'F8;'FF
SHF1: BYTE 8;0;16-3;16-6;2;16-1;16-4;16-7;1;16-2;16-5
SHF2: BYTE 0;5;2;0;7;4;1;0;6;3;0
<
< P A R A M E T R E S C M S 5.
<
NLS
NIL: EQU ZERO < ELEMENT INDIQUANT UNE ADRESSE VIDE.
< (PAR EXEMPLE CHAINAGE DE FILE D'ATTENTE
< 'TETE' ET 'QUEUE' VIDE,...).
NOCMO:: VAL 2 < NOMBRE D'OCTETS PAR MOT.
NBITOC:: VAL 8 < NOMBRE DE BITS DANS UN OCTET,
NBITMO:: VAL NBITOC*NOCMO < NOMBRE DE BITS DANS UN MOT.
BIT:: VAL 1
B:: VAL 1 < PARCEQUE LE PREMIER BIT D'UN MOT
< A LE RANG 0...
ZERO1: WORD 0
D:: VAL $-ZERO1 < LONGUEUR D'UN MOT !!!
$EQU ZERO1
P:: VAL D < PASSAGE A UN ELEMENT PRECEDENT.
Z:: VAL 1 < POUR CE QUI COMMENCE A 0...
I:: VAL 1 < POUR LES INCREMENTATIONS/DECREMENTATIONS.
E:: VAL 1 < POUR LES DIVISIONS PAR EXCES (Y+X-E/X).
S:: VAL BIT < POUR LES DECALAGES D'UN CRAN.
K:: VAL '0000 < POUR CLEARER, RAZER,...
L:: VAL 0 < RANG DU BIT DE GAUCHE ('LEFT') D'UN MOT.
O:: VAL ZERO-ZERO < ELEMENT COURANT,...
PAGE
<
<
< D E F I N I T I O N S G E N E R A L E S :
<
<
<
<
< PROVERBE SHADOKK :
<
< "POURQUOI FAIRE SIMPLE, QUAND ON PEUT FAIRE COMPLIQUE ???!!?
<
< EN EFFET, CERTAINS TROUVERONT CERTAINES
< DEFINITIONS LUXUEUSES, MAIS J'AI ESSAYE
< ICI, DE NE JAMAIS FAIRE APPARAITRE DE
< CONSTANTES, OU D'OBJETS DONT LA DEFINITION
< N'AIT ETE FAITE AVEC LE PLUS DE RIGUEUR
< POSSIBLE; DE PLUS, A CHAQUE FOIS QUE
< CELA EST POSSIBLE, DES VERIFICATIONS "CONTEX-
< TUELLES" ONT ETE INTRODUITES (PAR EXEMPLE,
< DE NON RECOUVREMENT DE MASQUES).
< AINSI, J'ESPERE QUE LE RESTE DU SYSTEME
< NE DEPENDRA QUE DE CES DEFINITIONS, ET QUE
< LEUR MODIFICATION SE FERA DANS LA CONTINUITE...
<
<
PAGE
<
<
< C O N S T A N T E S G E N E R A L E S
< D E N O M B R E :
<
<
BITX:: VAL L < RANG DU BIT D'INDEXATION.
BASE10:: VAL 10 < BASE DECIMALE,
BASE16:: VAL 16 < BASE HEXA-DECIMALE.
NBITCX:: VAL BASE16=K < NOMBRE DE BITS CONTENUS DANS
< UN CHIFFRE HEXA-DECIMAL.
LK:: VAL BIT>10 < VALEUR DU FACTEUR MULTIPLICATIF 'K'.
UMEM:: VAL 2 < LES TAILLES MEMOIRES SONT EXPRIMEES
< EN UNITE DE DOUBLE-MOTS (2).
XWOR%1: VAL LK/UMEM < 1K DANS CETTE UNITE...
MEMORK:: VAL 32 < TAILLE EN K-MOTS DE LA MEMOIRE
< ALLOUABLE.
MEMORY:: VAL MEMORK < LA MEMOIRE ALLOUABLE FAIT 32K,
MEMORY: VAL MEMORY*XWOR%1 < SOIT (...) DOUBLE-MOTS.
< LA MEMOIRE.
XX64K:: VAL 64 < LONGUEUR DE LA MEMOIRE ACCESSIBLE EN
< ADRESSAGE DIRECT, ET PAR LA MEME, DONNE
< LA TAILLE DU SYSTEME...
PLK:: VAL LK < LONGUEUR DU PLUS PETIT ESPACE MEMOIRE
< ALLOUABLE A UN UTILISATEUR.
<
<
< P A R T I T I O N D E L A M E M O I R E :
<
<
DOLA1:: VAL '0000 < '$' INITIAL DE LA MEMOIRE BASSE.
XWOR%1: VAL UMEM=K < POUR AVOIR UNE ADRESSE-MOT,
DOLA2:: VAL MEMORY>XWOR%1 < '$' INITIAL DE LA MEMOIRE HAUTE.
DOLAR1: VAL DOLA1 < INITIALISATION DU '$' BAS COURANT,
DOLAR2: VAL DOLA2 < INITIALISATION DU '$' HAUT COURANT.
PAGE
<
<
< C O N S T A N T E S G E N E R A L E S
< D U S Y S T E M E :
<
<
IJIJDX:: VAL I < TRANSLATION DES INDEX LORS
< DE L'UTILISATION DES INSTRUCTIONS
< 'JIX' ET 'JDX'.
DEPILE:: VAL D < TRANSLATION NEGATIVE A DONNER
< AUX ADRESSES DE PILE AFIN DE PRENDRE
< EN COMPTE LA GESTION QUI EST FAITE
< PAR LES INSTRUCTIONS 'PSR' ET 'PLR'.
NMBUSM:: VAL 8 < NOMBRE MAXIMUM DE BUS MEMOIRE.
NMPROB:: VAL 4 < NOMBRE MAXIMUM DE PROCESSEURS
< PAR BUS MEMOIRE (UN PROCESSEUR
< POUVANT ETRE UN SOLAR-40, UN
< SOLAR-65, UN IOP, OU ENFIN
< UN CBM-P.
NMPROC:: VAL NMBUSM*NMPROB < NOMBRE MAXIMUM DE PROCESSEURS.
NMTS:: VAL 128 < NOMBRE MAXIMUM DE TACHES
< SOFTWARES DANS LE SYSTEME.
NMTH:: VAL 16 < NOMBRE MAXIMUM DE TACHES
< HARDWARES DANS LE SYSTEME,
< NON COMPRIS LE DEFAUT SECTEUR !!!
NTS0:: VAL 0 < NUMERO DE LA PREMIERE TACHE SOFT,
NTH0:: VAL 0 < NUMERO DE LA PREMIERE TACHE HARD.
IF 2*NBITMO-NMPROC,,XWOR%,XWOR%
IF A T T E N T I O N : IL Y A TROP DE
IF PROCESSEURS POUR QUE LEUR LISTE
IF TIENNE SUR 2 MOTS (OU DANS LES 2
IF REGISTRES 'A' ET 'B') !!!
XWOR%: VAL 0
NMSVC:: VAL BIT>NBITOC < NOMBRE MAXIMUM DE 'SVC'.
NMSVCM:: VAL NMSVC < NOMBRE MAXIMUM DE 'SVC' EXECUTABLES
< EN MODE MAITRE.
NMSVCS:: VAL NMSVC < NOMBRE MAXIMUM DE 'SVC' EXECUTABLES
< EN MODE ESCLAVE.
PAGE
<
<
< C O N V E N T I O N S G E N E R A L E S :
<
<
NEXIST:: VAL NIL-ZERO < EXPRIME LA NON EXISTENCE,...
EXIST:: VAL BIT)NEXIST < EXPRIME L'EXISTENCE...
PAGE
<
<
< C O N S T A N T E S G E N E R A L E S
< D E M A S Q U E S :
<
<
MFFFF:: VAL -1 < -1='FFFF : UTILISE POUR COMPLEMENT.
N:: VAL -MFFFF < POUR CALCULER DES MASQUES A PARTIR
< DE CONSTANTES QUI SONT DES PUISSAN-
< CES DE 2.
M1FFF:: VAL '1FFF
M0FFF:: VAL '0FFF
M7FFF:: VAL '7FFF
M007F:: VAL '007F
M003F:: VAL '003F
M001F:: VAL '001F
M000F:: VAL '000F
M0007:: VAL '0007
M0003:: VAL '0003
M0001:: VAL '0001
M8000:: VAL '8000
M07FF:: VAL '07FF
ME000:: VAL 'E000
MOCD:: VAL 0 < MASQUE D'ACCES A L'OCTET DROIT
< D'UN MOT.
DO NBITOC
MOCD: VAL MOCD>BIT?BIT < GENERATION BIT A BIT DE 'MOCD'.
MOCG:: VAL MOCD>NBITOC < MASQUE D'ACCES A L'OCTET
< GAUCHE D'UN MOT.
M00FF:: VAL MOCD
MFF00:: VAL MOCG
MMOT:: VAL '0000 < MASQUE RECOUVRANT UN MOT.
DO NBITMO
MMOT: VAL MMOT>BIT?BIT < GENERATION BIT A BIT DE 'MMOT'.
IF MMOT-MFFFF,,XWOR%,
IF ATTENTION : IL VA SE PASSER DES CHOSES !!!
XWOR%: VAL 0
PAGE
<
<
< C O N S T A N T E S G E N E R A L E S
< D E D E C A L A G E :
<
<
DOCD:: VAL MOCD=K < DECALAGE D'ACCES A L'OCTET
< DROIT D'UN MOT.
DOCG:: VAL MOCG=K < DECALAGE D'ACCES A L'OCTET
< GAUCHE D'UN MOT.
PAGE
<
<
< D E F I N I T I O N D E S
< C O D E S A S C I I :
<
<
KNUL:: VAL '00 < CONTROL-SHIFT-P.
KSOH:: VAL '01 < CONTROL-A.
KSTX:: VAL '02 < CONTROL-B.
KETX:: VAL '03 < CONTROL-C.
KEOT:: VAL '04 < CONTROL-D.
KENQ:: VAL '05 < CONTROL-E.
KACK:: VAL '06 < CONTROL-F.
KBEL:: VAL '07 < CONTROL-G.
KBS:: VAL '08 < CONTROL-H (BACK-SPACE).
KHT:: VAL '09 < CONTROL-I (TAB).
KLF:: VAL '0A < CONTROL-J (LINE-FEED).
KVT:: VAL '0B < CONTROL-K.
KFF:: VAL '0C < CONTROL-L.
KCR:: VAL '0D < CONTROL-M (RETURN).
KSO:: VAL '0E < CONTROL-N.
KSI:: VAL '0F < CONTROL-O.
KDLE:: VAL '10 < CONTROL-P.
KDC1:: VAL '11 < CONTROL-Q.
KDC2:: VAL '12 < CONTROL-R.
KDC3:: VAL '13 < CONTROL-S.
KDC4:: VAL '14 < CONTROL-T.
KNAK:: VAL '15 < CONTROL-U.
KSYN:: VAL '16 < CONTROL-V.
KETB:: VAL '17 < CONTROL-W.
KCAN:: VAL '18 < CONTROL-X.
KEM:: VAL '19 < CONTROL-Y.
KSUB:: VAL '1A < CONTROL-Z.
KESC:: VAL '1B < CONTROL-SHIFT-K.
KFS:: VAL '1C < CONTROL-SHIFT-L.
KGS:: VAL '1D < CONTROL-SHIFT-M.
KRS:: VAL '1E < CONTROL-SHIFT-M.
KUS:: VAL '1F < CONTROL-SHIFT-O.
KSP:: VAL " " < SPACE.
KPE:: VAL "!" < !
KDQ:: VAL '22 < "
KDIESE:: VAL "#" < #
KDOLAR:: VAL "$" < $
KPC:: VAL '25 < POUR-CENT.
KET:: VAL "&" < &
KQUOTE:: VAL "'" < '
KPG:: VAL "(" < (
KPD:: VAL ")" < )
KSTAR:: VAL "*" < *
KPLUS:: VAL "+" < +
KVIR:: VAL "," < ,
KMOINS:: VAL "-" < -
KPOINT:: VAL "." <.
KSLASH:: VAL "/" < /
KZERO:: VAL "0" < 0
KUN:: VAL "1" < 1
KDEUX:: VAL "2" < 2
KTROIS:: VAL "3" < 3
KQUATR:: VAL "4" < 4
KCINQ:: VAL "5" < 5
KSIX:: VAL "6" < 6
KSEPT:: VAL "7" < 7
KHUIT:: VAL "8" < 8
KNEUF:: VAL "9" < 9
KDP:: VAL ":" < ::
KPV:: VAL ";" < ;
KINF:: VAL "<" < <
KEGAL:: VAL "=" < =
KSUP:: VAL ">" < >
KPI:: VAL "?" < ?
KAROND:: VAL '40 < @
KA:: VAL "A" < A
KB:: VAL "B" < B
KC:: VAL "C" < C
KD:: VAL "D" < D
KE:: VAL "E" < E
KF:: VAL "F" < F
KG:: VAL "G" < G
KH:: VAL "H" < H
KI:: VAL "I" < I
KJ:: VAL "J" < J
KK:: VAL "K" < K
KL:: VAL "L" < L
KM:: VAL "M" < M
KN:: VAL "N" < N
KO:: VAL "O" < O
KP:: VAL "P" < P
KQ:: VAL "Q" < Q
KR:: VAL "R" < R
KS:: VAL "S" < S
KT:: VAL "T" < T
KU:: VAL "U" < U
KV:: VAL "V" < V
KW:: VAL "W" < W
KX:: VAL "X" < X
KY:: VAL "Y" < Y
KZ:: VAL "Z" < Z
KCG:: VAL "[" < [
KASLSH:: VAL "\" < \
KCD:: VAL "]" < ]
KCHAP:: VAL "^" < ^
KSOUL:: VAL "_" < _
KAPO:: VAL '60 < APOSTROPHE.
KMINUS:: VAL '20 < CONSTANTE DE PASSAGE DES
< MAJUSCULES AUX MINUSCULES.
KAM:: VAL KA+KMINUS < A
KBM:: VAL KB+KMINUS < B
KCM:: VAL KC+KMINUS < C
KDM:: VAL KD+KMINUS < D
KEMI:: VAL KE+KMINUS < E
KFM:: VAL KF+KMINUS < F
KGM:: VAL KG+KMINUS < G
KHM:: VAL KH+KMINUS < H
KIM:: VAL KI+KMINUS < I
KJM:: VAL KJ+KMINUS < J
KKM:: VAL KK+KMINUS < K
KLM:: VAL KL+KMINUS < L
KMM:: VAL KM+KMINUS < M
KNM:: VAL KN+KMINUS < N
KOM:: VAL KO+KMINUS < O
KPM:: VAL KP+KMINUS < P
KQM:: VAL KQ+KMINUS < Q
KRM:: VAL KR+KMINUS < R
KSM:: VAL KS+KMINUS < S
KTM:: VAL KT+KMINUS < T
KUM:: VAL KU+KMINUS < U
KVM:: VAL KV+KMINUS < V
KWM:: VAL KW+KMINUS < W
KXM:: VAL KX+KMINUS < X
KYM:: VAL KY+KMINUS < Y
KZM:: VAL KZ+KMINUS < Z
KACCOG:: VAL '7B < ACCOLADE GAUCHE.
KDPBIS:: VAL '7C < 'DEUX POINTS' BIZARRES...
KACCOD:: VAL '7D < ACCOLADE DROITE.
KALTM:: VAL KACCOD < FABULEUX ALT-MODE !!!
KSINUS:: VAL '7E < PETIT BOUT DE SINUSOIDE...
KDEL:: VAL '7F < RUBOUT.
KRUBOU:: VAL KDEL < RUBOUT.
K6D:: VAL '6D < EXTENSION CR+LF...
KINEX:: VAL 'FF < CARACTERE INEXISTANT.
KEON:: VAL KEOT < CARACTERE DE FIN DE NOM...
KBREAK:: VAL KNUL < LE CODE DU 'BREAK' EST CELUI DU 'NULL'.
IF KBREAK-0,,XWOR%,
IF ATTENTION : IL Y A DES TAS DE TESTS DANS
IF 'HDLVIS' QUI NE VONT PAS MARCHER ('JAE',...) !!!
XWOR%: VAL 0
PAGE
<
<
< N U M E R O D E C O M P T E
< D U S Y S T E M E :
<
<
XK1:: VAL KDP < LE NUMERO DE COMPTE
XK2:: VAL KS < DU SYSTEME
XK3:: VAL KY < EST DEFINI
XK4:: VAL KS < PAR 4 CARACTERES.
PAGE
<
<
< G E N E R A T I O N D Y N A M I Q U E
< D E C A R T E S :
<
<
< FONCTION :
< LES CONSTANTES SUIVANTES PERMET-
< TENT LA GENERATION DYNAMIQUE DE CAR-
< TES EN DEFINISSANT LE FORMAT DES
< CARTES STANDARD (K, 9, 21, 37) AINSI
< QUE LES DEUXIEMES OPERANDES DE L'OPE-
< RATEUR '='.
<
<
<
< DEFINITION DES FONCTIONS DISPONIBLES
< EN TANT QUE DEUXIEME OPERANDE DE '=' :
<
KOLGET:: VAL 'F1 < DEUXIEME OPERANDE DE L'OPERATEUR '='
< DEMANDANT L'ACCES AU CARACTERE COURANT
< DE LA CARTE "DYNAMIQUE" DONT L'INDEX
< EST LE PREMIER OPERANDE.
KOLSTO:: VAL 'F2 < DEUXIEME OPERANDE DE L'OPERATEUR '='
< DEMANDANT DE METTRE DANS LA CARTE
< "DYNAMIQUE" LE CARACTERE CONTENU DANS
< L'OCTET LIBRE DE CE DEUXIEME OPERANDE
< A L'INDEX DONNE PAR LE PREMIER
< OPERANDE (VOIR LE MASQUE 'KOLC' POUR LA
< DEFINITION DU CARACTERE A INSERER).
KOLMOV:: VAL 'F3 < FONCTION PERMETTANT DE DEPLACER
< UNE CHAINE DE CARACTERES D'INDEX
< INITIAL DEFINI PAR 'KOLMOE' VERS
< L'INDEX FINAL DEFINI PAR 'KOLMOR'
< DANS LE PREMIER OPERANDE DE '=',
< ET SUR UNE LONGUEUR DEFINI PAR
< PAR 'KOLMOL' DANS LE DEUXIEME
< OPERANDE.
KOLTES:: VAL 'F4 < FONCTION PERMETTANT DE RECHERCHER
< LE CARACTERE DEFINI PAR LE MASQUE 'KOLC'
< DANS LA CHAINE DEFINIE PAR SON
< INDEX DE PREMIER CARACTERE (MASQUE
< 'KOLTED' DU PREMIER OPERANDE), ET
< PAR LE PREMIER CARACTERE NE LUI
< APPARTENANT PAS MASQUE 'KOLTEF' DU
< PREMIER OPERANDE) ; LE RESULTAT EST
< L'INDEX DE LA PREMIERE OCCURENCE DU
< CARACTERE, OU BIEN L'INDEX DE FIN DANS
< LES AUTRES CAS...
<
< DEFINITION DES MASQUES DU PREMIER OPERANDE :
<
KOLMOE:: VAL MFF00 < DEFINITION DE L'EMETTEUR LORS
< D'UN DEPLACEMENT DE CHAINE PAR
< LA FONCTION 'KOLMOV'.
KOLMOR:: VAL M00FF < DEFINITION DU RECEPTEUR LORS
< D'UN DEPLACEMENT DE CHAINE PAR
< LA FONCTION 'KOLMOV'.
KOLTED:: VAL MFF00 < DEFINITION DE L'INDEX DU PREMIER
< CARACTERE D'UNE CHAINE DANS LA
< FONCTION 'KOLTES'.
KOLTEF:: VAL M00FF < DEFINITION DE L'INDEX DU PREMIER
< CARACTERE N'APPARTENANT PLUS A UNE
< CHAINE DANS LA FONCTION 'KOLTES'.
<
< DEFINITION DES MASQUES DE DEUXIEME OPERANDE :
<
KOLF:: VAL MFF00 < DEFINITION DE LA FONCTION DEMANDEE ::
< PAR EXEMPLE : 'KOLGET', 'KOLSTO' OU
< BIEN 'KOLMOV'...
KOLMOL:: VAL M00FF < DEFINITION DU NOMBRE DE CARACTERES A
< DEPLACER PAR LA FONCTION 'KOLMOV'.
KOLC:: VAL M00FF < DEFINITION DU CARACTERE A INSERER
< DANS LA CARTE DYNAMIQUE PAR LA
< FONCTION 'KOLSTO', AINSI QUE DU CARAC-
< TERE A TESTER LORS DE LA FONCTION
< 'KOLTES'.
PAGE
<
<
< D E F I N I T I O N D E S C H A M P S :
<
<
< DEFINITION :
< UN 'CHAMP' EST UNE ZONE DE UN
< OU PLUSIEURS BITS CONTENUE DANS
< UN MOT MACHINE ; UN CHAMP SERA
< TOUJOURS DEFINI PAR UN MASQUE,
< ET SON POSITIONNEMENT SE FERA
< TOUJOURS A L'AIDE D'UNE VALEUR
< CADREE A DROITE DANS LE MOT
< MACHINE.
<
<
< GENERATION :
< PAR LES FONCTIONS 'FMASK' ET
< 'FVAL' DE L'ASSEMBLEUR LA PRE-
< MIERE PERMET DE DEFINIR UN MASQUE
< COURANT (PREMIER OPERANDE DE '='),
< LA SECONDE, DONNE LA VALEUR A INSE-
< RER DANS LE MASQUE COURANT (PREMIER
< OPERANDE DE '='), PUIS FAIT UN CUMUL
< (PAR UN 'OU') SUR UNE VALEUR COURANTE,
< QUI EST ENSUITE AFFECTEE A L'EXPRESSION
< COURANTE...
<
<
FOMASK:: VAL 'F5 < FONCTION DE DEFINITION DU MASQUE
< COURANT : CELUI-CI SERA LA PARTIE
< GAUCHE DE L'OPERATEUR '='.
FOVAL:: VAL 'F6 < FONCTION D'INSERTION DE LA VALEUR
< DANS LE MASQUE COURANT, ET DE CUMUL ;
< LA VALEUR EST L'OPERANDE GAUCHE DE
< L'OPERATEUR '='.
<
< GENERATION DES OPERANDES DROITS DE '=' :
<
XWOR%1: VAL KOLF=K < POUR CADRER LA FONCTION :
FMASK:: VAL FOMASK>XWOR%1 < 'DEFINITION D'UN MASQUE'.
FVAL:: VAL FOVAL>XWOR%1 < 'CADRAGE D'UNE VALEUR SUIVANT UN MASQUE'.
PAGE
<
<
< F O N C T I O N S C O M P L E T E S D E
< G E N E R A T I O N D E C A R T E S :
<
<
< NOTA :
< CES FONCTIONS 'FCXXX' S'UTILISERONT
< POUR GENERER D'AUTRES FONCTIONS AVEC
< CETTE FOIS DES ARGUMENTS, ET CECI DE
< LA FACON SUIVANTE :
<
<XXX: VAL <EXPRESSION AVEC 'FMASK', 'FVAL',...>?FCXXX
<
<
FCGET:: VAL KOLF=FMASK+KOLGET=FVAL
< ACCES A UN OCTET.
FCSTO:: VAL KOLF=FMASK+KOLSTO=FVAL
< RANGEMENT D'UN OCTET.
FCMOV:: VAL KOLF=FMASK+KOLMOV=FVAL
< MOUVEMENT D'UNE CHAINE D'OCTETS.
FCTES:: VAL KOLF=FMASK+KOLTES=FVAL
< RECHERCHE D'UN OCTET DANS UNE CHAINE.
PAGE
<
<
< D E F I N I T I O N D ' U N E C A R T E :
<
<
0 @1 2 3 L
XWOR%1: VAL 0 < DEBUT PRESUME D'UNE CARTE,
XWOR%2: VAL 80 < FIN PRESUMEE D'UNE CARTE...
XWOR%3: VAL KOLTED=FMASK+XWOR%1=FVAL+KOLTEF=FMASK+XWOR%2=FVAL
XWOR%4: VAL KOLC=FMASK+KZERO=FVAL?FCTES
KOL0:: VAL XWOR%3=XWOR%4 < DEFINITION DE LA ZONE 'ETIQUETTE' DES
< LIGNES A ASSEMBLER.
XWOR%4: VAL KOLC=FMASK+KUN=FVAL?FCTES
KOL1:: VAL XWOR%3=XWOR%4 < DEFINITION DE LA ZONE 'COMMANDE'.
XWOR%4: VAL KOLC=FMASK+KDEUX=FVAL?FCTES
KOL2:: VAL XWOR%3=XWOR%4 < DEFINITION DE LA ZONE 'ARGUMENT.
XWOR%4: VAL KOLC=FMASK+KTROIS=FVAL?FCTES
KOL3:: VAL XWOR%3=XWOR%4 < DEFINITION DE LA ZONE 'ARGUMENT'.
XWOR%4: VAL KOLC=FMASK+KL=FVAL?FCTES
KOLON:: VAL XWOR%3=XWOR%4+1 < LONGUEUR D'UNE CARTE A ASSEMBLER.
IF XWOR%1-KOL0,XWOR%,XWOR%,
IF ATTENTION : ARGUMENTS DE BASE MAUVAIS !!!
XWOR%: VAL 0
IF XWOR%2-KOL0-KOLON,,XWOR%,XWOR%
IF ATTENTION : ARGUMENTS DE BASE MAUVAIS !!!
XWOR%: VAL 0
PAGE
<
<
< I N D E X D ' I T E R A T I O N :
<
<
KOLDO:: VAL 'F8 < CETTE FONCTION PERMET DE RECUPERER
< L'INDEX COURANT D'UNE ITERATION
< PORTANT SUR TOUTE INSTRUCTION
< AUTRE QU'UN 'EOT' ; SI UN 'DO N'
< A ETE EXECUTE, ELLE RENVERRA LES
< VALEURS N-1, N-2,..., 2, 1, 0
< AUXQUELLES AURONT ETE AJOUTEES
< LA PARTIE GAUCHE DE L'OPERATEUR "=",
< AINSI QUE L'OCTET QUI SUIT LA
< FONCTION ELLE-MEME.
KOLDOF:: VAL 'F9 < CETTE FONCTION EST IDENTIQUE A LA
< FONCTION 'KOLDO', MAIS PORTE SUR
< LES ITERATIONS INTERRESSANTS LES
< INSTRUCTIONS 'EOT'...
<
< DEFINITION DES FONCTIONS COMPLETES (SI NECESSAIRE) :
<
FCDO:: VAL KOLF=FMASK+KOLDO=FVAL
< AJOUTE A LA VALEUR DE L'EXPRESSION
< SITUEE A GAUCHE DE "=" L'INDEX COURANT
< DES ITERATIONS SUR INSTRUCTIONS DIF-
< FERENTES DE 'EOT'.
FCDOF:: VAL KOLF=FMASK+KOLDOF=FVAL
< AJOUTE A LA VALEUR DE L'EXPRESSION
< SITUEE A GAUCHE DE "=" L'INDEX COURANT
< DES ITERATIONS SUR 'EOT'.
PAGE
<
<
< D E F I N I T I O N D E S F O N C T I O N S
< D E T E S T D E S S Y M B O L E S :
<
<
< FONCTION :
< CETTE FONCTION DE L'ASSEMBLEUR 'FOSYMB'
< PERMET, LUI TRANSMETTANT UN SYMBOLE PAR
< L'INTERMEDIAIRE D'UNE CARTE DYNAMIQUE,
< DE SAVOIR SI CE SYMBOLE EXISTE, ET SI
< OUI, DE QUEL TYPE IL EST, ET QUEL EST
< SON MODE DE REFERENCE.
< DE PLUS, LES SOUS-FONCTIONS RECEMMENT
< INTRODUITES ('FSXXXX') PERMETTENT DE
< CHANGER LE DESCRIPTEUR D'UN SYMBOLE,
< AUTORISANT PAR EXEMPLE LA MISE A
< L'ETAT 'INDEFINI' D'UN SYMBOLE TRANS-
< LATABLE DEJA DEFINI, ET DONC AINSI
< SA REDEFINITION ULTERIEURE ; CETTE
< APPLICATION S'ECRIRA PAR EXEMPLE :
<
<XXX: VAL MSYMBN?MSYMBM=FMASK+MSYMBN=FVAL(K+YYY=FOSYMM
< (OU 'YYY' DESIGNE UNE VARIABLE DEFINIE
< A L'AIDE DES MASQUES 'MSYMBI' ET 'MSYMBL'
< PRECISANT LA POSITION DU SYMBOLE DANS LA
< CARTE DYNAMIQUE COURANTE)
<
< AUTRE EXEMPLE: ON POURRA RENDRE
< UN SYMBOLE QUELCONQUE EQUIVALENT AU
< COMPTEUR D'ASSEMBLAGE "$" EN ECRIVANT :
<XXX: VAL MSYMBM=FMASK(K+YYY=FOSYMM
< (OU 'YYY' A LE MEME SENS QUE CI DESSUS,
< ET CONCERNE LE SYMBOLE A RENDRE
< EQUIVALENT AU "$").
<
<
< NOTA IMPORTANT :
< BIEN EVIDEMMENT, LA PLUS GRANDE
< PRUDENCE SERA REQUISE LORS DE L'UTI-
< LISATION DE CES FONCTIONS !!!
<
<
FOSYMB:: VAL 'F7 < FONCTION DE GESTION D'UN SYMBOLE.
<
< DEFINITION DES SOUS-FONCTIONS :
<
FSSYMT:: VAL '00 < PERMET DE TESTER L'ETAT DU SYMBOLE.
FSSYMM:: VAL '01 < PERMET DE MODIFIER L'ETAT D'UN
< SYMBOLE ARGUMENT (CARTE DYNAMIQUE).
<
< DEFINITION DES MASQUES DE DEUXIEME OPERANDE DE "=" :
<
KOLSYM:: VAL M00FF < DEFINITION DE LA SOUS-FONCTION.
<
< DEFINITION DES FONCTIONS COMPLETES :
<
XWOR%1: VAL KOLF=FMASK+FOSYMB=FVAL
FOSYMT:: VAL KOLSYM=FMASK+FSSYMT=FVAL?XWOR%1
< FONCTION DE TEST DE L'ETAT
< DU SYMBOLE ARGUMENT.
FOSYMM:: VAL KOLSYM=FMASK+FSSYMM=FVAL?XWOR%1
< FONCTION DE MODIFICATION DE L'ETAT
< DU SYMBOLE ARGUMENT.
FCSYMT:: VAL FOSYMT < DEFINITION DES
FCSYMM:: VAL FOSYMM < FONCTIONS-SYNONYMES.
<
< DEFINTION DES MASQUES DU PREMIER OPERANDE DE "=" :
<
MSYMBI:: VAL MFF00 < DEFINITION DE L'INDEX DU PREMIER CARAC-
< TERE DU SYMBOLE DANS LA ZONE DYNAMIQUE.
MSYMBL:: VAL M00FF < DEFINITION DU NOMBRE DE CARACTERES
< DU SYMBOLE.
<
< RESULTAT : LA VALEUR RENVOYEE (A LAQUELLE A ETE
< AJOUTEE L'OCTET SUIVANT LA FONCTION 'FOSYMB'
< DANS LE DEUXIEME OPERANDE DE "=") EST LA
< SUPERPOSITION D'UN CERTAIN NOMBRE DE MASQUES
< DEFINIS CI-APRES ; ON NOTERA ENFIN QU'UNE
< VALEUR NULLE CORRESPOND A UN SYMBOLE INEXISTANT...
<
MSYMBX:: VAL '8000 < CE MASQUE INDIQUE QU'UNE INDEXATION A
< ETE DEMANDEE SUR CE SYMBOLE ALORS
< QU'IL N'EST PAS ENCORE DEFINI.
MSYMB1:: VAL '4000 < CE MASQUE, LORSQU'IL EST PRESENT
< INDIQUE QUE LE SYMBOLE N'A ETE
< REFERENCE EN AVANT QU'UNE SEULE
< FOIS ; POUR LES REFERENCES EN
< AVANT SUIVANTES, IL EST ABSENT,
< AINSI QU'APRES SA DEFINITION.
MSYMBS:: VAL '3F00 < CE MASQUE DONNE LE NUMERO DE SECTION
< LORSQUE LE SYMBOLE EXISTE (DEFINI), ET
< EST TRANSLATABLE ; UN NUMERO NUL
< EST RENVOYE DANS LES AUTRES CAS...
MSYMBN:: VAL '0080 < CE MASQUE SIGNIFIE QUE LE SYMBOLE
< A ETE REFERENCE SANS ETRE ENCORE
< DEFINI (IL SERA DONC TRANSLATABLE).
MSYMBA:: VAL '0040 < CE MASQUE INDIQUE QUE LE SYMBOLE A
< ETE DEFINI DE MANIERE ABSOLUE (DONC
< PAR UNE DIRECTIVE 'VAL').
MSYMBR:: VAL '0020 < CE MASQUE INDIQUE QUE LE SYMBOLE
< A ETE REFERENCE PAR UNE DIREC-
< TIVE 'REF'.
MSYMBD:: VAL '0010 < CE MASQUE INDIQUE QUE LE SYMBOLE
< EST TRANSLATABLE, ET DEJA DEFINI
< DANS UNE 'DSEC'.
MSYMBC:: VAL '0008 < CE MASQUE INDIQUE QUE LE SYMBOLE EST
< DEJA CHAINE (IL EST RENCONTRE ASSOCIE
< AU MASQUE 'MSYMBN').
MSYMBF:: VAL '0004 < CE MASQUE INDIQUE QUE LE SYMBOLE A
< ETE REFERENCE DANS UNE DIRECTIVE 'DEF'.
< (QU'IL SOIT DEFINI, OU REFERENCE
< EN AVANT).
MSYMBM:: VAL '0003 < CE MASQUE DONNE LE NOMBRE DE MOTS
< UTILISES POUR RANGER LE NOM DU
< SYMBOLE ; BIEN QU'INUTILE, CE MASQUE
< DEVRA TOUJOURS ETRE UTILISE LORS
< DES DEFINITIONS DES MASQUES DE MODI-
< FICATION DES ETATS DE SYMBOLES, PUISQU'
< EN EFFET, LES FONCTIONS 'FMASK' ET 'FVAL'
< PROVOQUENT UN CADRAGE A GAUCHE DE LA
< VALEUR FONCTION DE LA POSITION DU
< MASQUE DONNE.
IF MSYMBM=K-0,,XWOR%,
IF A T T E N T I O N : LE MASQUE
IF 'MSYMBM' DOIT ETRE CADRE A DROITE !!!
XWOR%: VAL 0
SYMBX: VAL 0 < CETTE VALEUR EST RENVOYEE LORSQUE LE
< SYMBOLE EST INEXISTANT (NI DEFINI,
< NI REFERENCE...).
PAGE
<
<
< D E F I N I T I O N D E S F O N C T I O N S
< D E C O N V E R S I O N S H E X A - D E C I M A L E S :
<
<
< FONCTION :
< CES FONCTIONS DE L'ASSEMBLEUR,
< PERMETTENT DE CONVERTIR UN CHIFFRE
< ASCI HEXA-DECIMAL EN BINAIRE ('FOCAB'),
< OU BIEN UN OU DEUX CHIFFRES BINAIRES EN
< DEUX CARACTERES ASCI HEXA-DECIMAUX.
< DE PLUS, ELLES PERMETTENT DORENAVANT
< LA CONVERSION D'EXPRESSIONS ABSOLUES
< EN EXPRESSIONS TRANSLATABLES, ET
< INVERSEMENT...
<
<
FOCONV:: VAL 'FA < FONCTION DE CONVERSION.
<
< DEFINITION DES SOUS-FONCTIONS :
<
FSBA:: VAL '00 < CONVERSION DE UN OU DEUX CHIFFRES
< BINAIRE EN DEUX CARACTERES ASCI.
FSAB:: VAL '01 < CONVERSION D'UN CARACTERE ASCI HEXA-
< DECIMAL EN BINAIRE.
FSTA:: VAL '02 < CONVERSION TRANSLATABLE --> ABSOLU,
FSAT:: VAL '03 < CONVERSION ABSOLU --> TRANSLATABLE.
<
< MASQUE DE SOUS-FONCTION :
<
KOLCON:: VAL M00FF < DEFINITION DU MASQUE DE SOUS-FONCTION
< DANS L'OPERANDE DROIT DE "=".
<
< DEFINITION DES FONCTIONS COMPLETES :
<
XWOR%1: VAL KOLF=FMASK+FOCONV=FVAL
FOCBA:: VAL KOLCON=FMASK+FSBA=FVAL?XWOR%1
< CONVERSION DE UN OU DEUX CHIFFRES
< BINAIRES EN DEUX CARACTERES ASCI.
FOCAB:: VAL KOLCON=FMASK+FSAB=FVAL?XWOR%1
< CONVERSION DE UN CARACTERE ASCI
< EN UN NOMBRE BINAIRE.
FCBA:: VAL FOCBA < DEFINITION DES
FCAB:: VAL FOCAB < FONCTIONS-SYNONYMES.
FCTA:: VAL KOLCON=FMASK+FSTA=FVAL?XWOR%1
< FONCTION COMPLETE DE CONVERSION
< TRANSLATABLE --> ABSOLU.
FCAT:: VAL KOLCON=FMASK+FSAT=FVAL?XWOR%1
< FONCTION COMPLETE DE CONVERSION
< ABSOLU --> TRANSLATABLE.
PAGE
<
<
< V A L I D A T I O N D E ' Z E R O ' :
<
<
IF ZERO=FCTA-K,,XWOR%,
IF ATTENTION : TOUT VA MERDER LAMENTABLEMENT !!!
XWOR%: VAL 0
PAGE
<
<
< F O N C T I O N D E R E F E R E N C E
< A U N E I N S T R U C T I O N :
<
<
< FONCTION :
< CETTE FABULEUSE FONCTION PERMET
< D'APPLIQUER A UNE VALEUR CALCULEE
< UNE INSTRUCTION QUELCONQUE DU LANGAGE
< MACHINE.
< ON NOTERA QUE LES REGISTRES DE L'ASSEMBLEUR
< AVANT L'EXECUTION DE CETTE INSTRUCTION
< SONT AINSI POSITIONNES :
< 'A' <-- L'OPERANDE GAUCHE DE "=",
< 'B' <-- 0,
< 'X' <-- 0,
< 'Y' <-- L'OCTET SUIVANT LA FONCTION 'FOINST.
< L'INSTRUCTION A EXECUTER AURA ETE DEFINIE
< PAR SA VALEUR, DANS LA MEME EXPRESSION
< PAR LA FONCTION 'FMASK' (ET OUI !?!?!??).
< APRES EXECUTION, L'ASSEMBLEUR EFFECTUERA
< LES OPERATIONS SUIVANTES :
< 'A' <-- ('A').EOR.('B'),
< 'A' <-- ('A').EOR.('X'),
< PERMETTANT SI L'INSTRUCTION EXECUTEE NE
< MODIFIE QUE L'UN DES 3 REGISTRES 'A',
< 'B' OU 'X' DE RECUPERER CE RESULTAT DANS
< LE REGISTRE 'A', PUIS DANS L'EXPRESSION
< COURANTE EN FAISANT EVENTUELLEMENT UN
< 'EOR' PERMETTANT DE RE-SEPARER LE BON
< RESULTAT.
<
<
FOINST:: VAL 'FB < FONCTION D'EXECUTION DE L'INSTRUCTION
< DONT LE CODE EST DONNE PAR L'OPERANDE
< GAUCHE DE L'OPERATEUR "=".
KOLY:: VAL M00FF < DEFINITION DU MASQUE PERMETTANT
< DE DONNER L'OCTET A METTRE AU PREALABLE
< DANS LE REGISTRE 'Y'.
<
< DEFINITION DE LA FONCTION COMPLETE (SI NECESSAIRE) :
<
FCINST:: VAL KOLF=FMASK+FOINST=FVAL
< EXECUTION DE L'INSTRUCTION DONT LE
< CODE EST DONNE PAR L'OPERANDE GAUCHE
< DE "=", AVEC 'Y' <-- 0.
<
<
< Q U E L Q U E S I N S T R U C T I O N S
< U T I L E S :
<
<
< NOTA :
< LES INSTRUCTIONS DEFINIES CI-DESSOUS
< TRANSFORMENT LE CONTENU DU REGISTRE 'A'
< EN GENERAL ; ON NOTERA POUR 'COSBT',
< 'CORBT' ET 'COIBT', POUR ATTEINDRE
< UN BIT DE RANG DIFFERENT DE '0', IL
< SUFFIT D'AJOUTER CE RANG AU CODE
< DE L'INSTRUCTION...
<
<
PROG
XWOR%1: VAL $-ZERO < SAUVEGARDE DU "$", EN EFFET ON VA
< GENERER DU CODE INUTILE...
SLLS K
COSLLS:: VAL '0000000@@@@ < DECALAGE LOGIQUE A GAUCHE SIMPLE.
SLRS K
COSLRS:: VAL '0000000@@@@ < DECALAGE LOGIQUE A DROITE SIMPLE.
SCLS K
COSCLS:: VAL '0000000@@@@ < DECALAGE CIRCULAIRE A GAUCHE SIMPLE.
SCRS K
COSCRS:: VAL '0000000@@@@ < DECALAGE CIRCULAIRE A DROITE SIMPLE.
SARS K
COSARS:: VAL '0000000@@@@ < DECALAGE ARITHMETIQUE A DROITE SIMPLE.
WORD '1E45
COIDES:: VAL '0000000@@@@ < RECUPERATION DE L'IDENTIFICATEUR
< SYSTEME A L'ASSEMBLAGE ('IDESC').
WORD '1E15
COGETM:: VAL '0000000@@@@ < ACCES ABSOLU A LA MEMOIRE, 'BITX'
< PERMETTANT DE DISCRIMINER LES 'NSP'
< DES ADRESSES MEMOIRE ABSOLUES.
SWBR A,A
COSWBR:: VAL '0000000@@@@ < PERMUTATION DES OCTETS DE 'A'.
SBT L
COSBT:: VAL '0000000@@@@ < MISE A '1' DU BIT '0' DE 'A'.
RBT L
CORBT:: VAL '0000000@@@@ < MISE A '0' DU BIT '0' DE 'A'.
IBT L
COIBT:: VAL '0000000@@@@ < INVERSION DU BIT '0' DE 'A'.
DBT
CODBT:: VAL '0000000@@@@ < MISE DANS LE REGISTRE 'X', DU NUMERO
< DU PREMIER BIT A '1' DANS 'A'.
CMR A,A
COCMR:: VAL '0000000@@@@ < COMPLEMENT LOGIQUE DU REGISTRE 'A'.
<
< ANNULATION DU CODE GENERE :
<
XWOR%2: VAL $-ZERO
XWOR%2: VAL XWOR%2-XWOR%1 < LONGUEUR DU CODE GENERE...
$EQU ZERO+XWOR%1
DZS XWOR%2 < ON LE REMET A '0000, ET ON RECULE :
$EQU ZERO+XWOR%1 < ET VOILA...
PAGE
<
<
< F O N C T I O N S D E ' T M O B T ' :
<
<
FONTB:: VAL 0 < TEST BIT,
FONSB1:: VAL '0@@@@+I < SET BIT AVEC VERIFICATION,
FONRB0:: VAL '0@@@@+I < RESET BIT AVEC VERIFICATION,
FONIB:: VAL '0@@@@+I < INVERSION BIT,
FONRB:: VAL '0@@@@+I < RESET BIT,
FONSB:: VAL '0@@@@+I < SET BIT.
PAGE
<
<
< F O N C T I O N D ' E X E C U T I O N
< D ' U N S O U S - P R O G R A M M E
< G E N E R E D Y N A M I Q U E M E N T :
<
<
< FONCTION :
< CETTE FONCTION AUX POSSIBILITES
< INSOUPCONNEES, PERMET D'EXECUTER
< UN SOUS-PROGRAMME GENERE EN LANGAGE
< BINAIRE DANS LA CARTE DYNAMIQUE ;
< CETTE GENERATION AURA ETE FAITE
< AU PREALABLE A L'AIDE D'APPLICA-
< TIONS DE LA FONCTION 'KOLSTO' QUI
< PERMET DE METTRE UN OCTET QUELCONQUE
< EN UN ENDROIT QUELCONQUE DU CODE
< DE L'ASSEMBLEUR (ET EN PARTICULIER
< DANS LA CARTE DYNAMIQUE).
< CE SOUS-PROGRAMME EST APPELE PAR
< UN 'BSR' EXECUTE PAR L'ASSEMBLEUR,
< L'ADRESSE DU SOUS-PROGRAMME ETANT
< EGALE A L'ADRESSE DE LA CARTE DYNA-
< MIQUE TRANSLATEE DE LA VALEUR DE
< L'OCTET SUIVANT LA FONCTION 'FOEXSP'
< (TOUTES ADRESSES EXPRIMEES EN MOTS).
< DE PLUS, CE SOUS-PROGRAMME RECOIT
< COMME ARGUMENT DANS LE REGISTRE 'A'
< L'OPERANDE GAUCHE DE "=". AU RETOUR
< L'ASSEMBLEUR SUPPOSE QUE LE REGISTRE
< 'A' CONTIENT LE RESULTAT QU'IL AFFECTERA
< A L'EXPRESSION COURANTE.
< BIEN ENTENDU, CE SOUS-PROGRAMME
< DOIT SE TERMINER PAR UN 'RSR'...
<
<
FOEXSP:: VAL 'FC < FONCTION D'EXECUTION D'UN SOUS-
< PROGRAMME DYNAMIQUE.
KOLSP:: VAL M00FF < DEFINITION DU MASQUE PERMETTANT DE
< DONNER LA TRANSLATION A OPERER SUR
< L'ADRESSE DE LA CARTE DYNAMIQUE POUR
< OBTENIR LE POINT D'ENTREE DU SOUS-
< PROGRAMME.
<
< DEFINITION DE LA FONCTION COMPLETE (SI NECESSAIRE) :
<
FCEXSP:: VAL KOLF=FMASK+FOEXSP=FVAL
PAGE
<
<
< P U S H / P U L L :
<
<
< FONCTION :
< CES 2 FONCTIONS COMPLETES PERMETTENT
< D'ATTEINDRE LES FONCTIONS D'EMPILEMENT
< ('PUSH')/DEPILEMENT ('PULL') DE L'ASSEM-
< BLEUR ; LE 'PUSH' PERMET DE SAUVEGARDER
< LA VALEUR DE L'EXPRESSION SITUEE A
< GAUCHE DE "=", ALORS QUE 'PULL' AJOUTE
< A L'EXPRESSION COURANTE L'ENTREE COURANTE
< DE LA PILE (ON NOTERA QUE POUR FAIRE UN
< DEPILEMENT SANS ADDITION, IL SUFFIT QUE
< L'OPERANDE GAUCHE DE "=" AIT UNE VALEUR
< NULLE).
<
<
FOPILE:: VAL 'FE < FONCTION GENERALE D'EMPILEMENT
< ET DE DEPILEMENT.
<
< SOUS-FONCTIONS :
<
FSPUSH:: VAL '00 < EMPILEMENT DE LA PARTIE GAUCHE DE "=".
FSPULL:: VAL '01 < DEPILEMENT, ET ADDITION A LA PARTIE
< GAUCHE DE "=".
FSPEXU:: VAL '02 < DEPILEMENT ; L'OPERANDE GAUCHE DE
< L'OPERATEUR "=" SUBSISTE, ALORS
< QUE LA PARTIE IMMEDIATEMENT A DROITE
< (C'EST-A-DIRE LA FONCTION 'FCPEXU')
< EST REMPLACEE PAR LA VALEUR DEPILEE ;
< L'OPERATEUR "=" EST ENSUITE REINTER-
< PRETE ; AINSI ON 'EXECUTE' LA VALEUR
< DEPILEE...
<
< MASQUE DE SOUS-FONCTION :
<
KOLPIL:: VAL M00FF < LA SOUS-FONCTION EST DONNEE A LA SUITE
< DE LA FONCTION.
<
< DEFINITION DES FONCTIONS COMPLETES :
<
XWOR%1: VAL KOLF=FMASK+FOPILE=FVAL
FOPUSH:: VAL KOLPIL=FMASK+FSPUSH=FVAL?XWOR%1
< EMPILEMENT DE LA PARTIE GAUCHE DE "=".
FOPULL:: VAL KOLPIL=FMASK+FSPULL=FVAL?XWOR%1
< DEPILEMENT, ET ADDITION A LA PARTIE
< GAUCHE DE "=".
FOPEXU:: VAL KOLPIL=FMASK+FSPEXU=FVAL?XWOR%1
< DEPILEMENT, PUIS RE-EXECUTION DE "=",
< AVEC COMME OPERANDE DROIT LA VALEUR
< DEPILEE.
FCPUSH:: VAL FOPUSH < DEFINITION DES
FCPULL:: VAL FOPULL < FONCTIONS-SYNONYMES.
FCPEXU:: VAL FOPEXU
PAGE
<
<
< R E S T E D ' U N E D I V I S I O N :
<
<
< FONCTION :
< CETTE FONCTION PERMET DE RECU-
< PERER LE RESTE DE LA DERNIERE
< DIVISION ENTIERE EFFECTUEE DANS
< L'EXPRESSION COURANTE, OU BIEN
< UNE VALEUR NULLE S'IL N'Y A PAS
< EU DE DIVISION ; CE RESTE EST
< AJOUTE A LA PARTIE GAUCHE DE "=",
< AINSI QU'A L'OCTET SUIVANT L'OCTET
< DE FONCTION.
<
<
FOREST:: VAL 'FD < RESTE D'UNE DIVISION ENTIERE.
<
< DEFINITION DE LA FONCTION COMPLETE (SI NECESSAIRE) :
<
FCREST:: VAL KOLF=FMASK+FOREST=FVAL
PAGE
<
<
< S I G N E D ' U N E E X P R E S S I O N :
<
<
< FONCTION :
< CETTE FONCTION PERMET DE CALCULER
< LE SIGNE DE L'EXPRESSION FIGURANT A
< GAUCHE DE "=" ; CE SIGNE EST DONNE
< PAR UNE VALEUR NUMERIQUE ('SIGN.'),
< AUQUEL EST AJOUTE L'OCTET SUIVANT
< L'OCTET DE FONCTION.
<
<
FOSIGN:: VAL 'FF < SIGNE DE LA PARTIE GAUCHE DE "=".
<
< DEFINITION DE LA FONCTION COMPLETE (SI NECESSAIRE) :
<
FCSIGN:: VAL KOLF=FMASK+FOSIGN=FVAL
<
< DEFINITION NUMERIQUE DU SIGNE :
<
SIGNM:: VAL -1 < L'EXPRESSION FIGURANT A GAUCHE DE "="
< EST NEGATIVE (STRICTEMENT).
SIGN0:: VAL 0 < CETTE EXPRESSION EST NULLE.
SIGNP:: VAL +1 < CETTE EXPRESSION EST STRICTEMENT
< POSITIVE.
PAGE
<
<
< C A R A C T E R E S H E X A - D E C I M A U X :
<
<
HZERO:: VAL 0=FCBA(MOCD < 0,
HNEUF:: VAL BASE10-Z=FCBA(MOCD < 9,
HA:: VAL BASE10=FCBA(MOCD < A,
HF:: VAL BASE16-Z=FCBA(MOCD < F.
<
< C O N F I G U R A T I O N P E R I P H E R I Q U E :
<
XXBRAC:: VAL 4 < INDICATEUR DES ARGUMENTS DE 'SIO' INDI-
< QUANT QUE LE COUPLEUR CORRESPONDANT
< EST IN (0) / HORS (1) RACK...
XWOR%9: VAL COSBT < HORS-RACK A PRIORI...
INRACK: @
<
< TESTONS L'EXISTENCE DU SYMBOLE 'INRACK' ???
< S'IL EXISTE, ON ADMET QUE LES COUPEURS SONT
< IN-RACK, SINON, HORS-RACK :
<
XWOR%1: VAL KOLF=FMASK+KOLTES=FVAL
XWOR%1: VAL KOLC=FMASK+KDP=FVAL?XWOR%1
XWOR%2: VAL KOLTED=FMASK+KOL0=FVAL
XWOR%2: VAL KOLTEF=FMASK+KOL0+KOLON=FVAL?XWOR%2
XWOR%3: VAL XWOR%2=XWOR%1-KOL0 < LONGUEUR DU SYMBOLE 'INRACK'...
XWOR%4: VAL MSYMBI=FMASK+KOL0=FVAL
XWOR%4: VAL MSYMBL=FMASK+XWOR%3=FVAL?XWOR%4
IF XWOR%4=FCSYMT-SYMBX,,XWOR%,
XWOR%9: VAL CORBT < ET BIEN NON, 'IN-RACK'...
IDP "VERSION IN-RACK !"
XWOR%: VAL 0
IF XWOR%9-COSBT,XWOR%,,XWOR%
IDP "VERSION OUT-RACK !"
XWOR%: VAL 0
OFFRAC:: VAL XWOR%9?XXBRAC=FMASK(K=FCINST
< GENERATION DE L'INDICATEUR IN/HORS-RACK,
< SUIVANT QUE LE SYMBOLE 'INRACK' EXISTE
< OU PAS...
<
< LISTE DES COUPLEURS UTILISES.
<
ACCR1:: VAL '10 < LECTEUR DE CARTES 1.
ACCR1: VAL ACCR1+OFFRAC
ACDKF:: VAL '38 < DISQUE A TETES FIXES.
ACDKF: VAL ACDKF+OFFRAC
ACDKM:: VAL '30 < DISQUE A TETES MOBILES.
ACDKM: VAL ACDKM+OFFRAC
ACPUP: VAL '17F0 < PUPITRE.
<
< F O N C T I O N P E R I P H E R I Q U E S :
<
FPHIN:: VAL '0 < ENTREE INFORMATION.
FPHOUT:: VAL '1 < SORTIE INFORMATION.
FPHETA:: VAL '2 < ENTREE ETAT.
FPHCMD:: VAL '3 < SORTIE COMMANDE.
FPHDUM:: VAL '4
FPHSAD:: VAL '5 < SORTIE ADRESSE DISQUE...
FPHETB:: VAL '6 < ENTREE MOT D'ETAT B.
FPHCME:: VAL '7 < SORTIE COMMANDE...
MNUPRO:: VAL '0003 < NUMERO D'UN PROCESSEUR SUR UN
< BUS MEMOIRE DE NUMERO DONNE
< PAR 'MNUBUS' (DONNE PAR 'RDSI'
< DANS A).
MNUBUS:: VAL '001C < NUMERO D'UN BUS MEMOIRE DANS
< LE SYSTEME (DONNE PAR 'RDSI'
< DANS A).
IF MNUBUS?MNUPRO=K-0,,XWOR%,
IF ATTENTION : ETANT DONNEES LES OPERATIONS
IF REALISEES SUR LES NUMEROS DE PROCESSEUR,
IF IL FAUT QUE CE MASQUE SOIT CADRE A DROITE !!!
XWOR%: VAL 0
MSBOOT:: VAL '00E0 < POSITION DU SELECTEUR DE
< BOOTSTRAP (DONNE PAR 'RDSI'
< DANS A).
MTYPRO:: VAL '0300 < TYPE DU PROCESSEUR (DONNE PAR
< 'RDSI' DANS 'A').
<
< D E C A L A G E S A S S O C I E S :
<
DNUPRO:: VAL MNUPRO=K < DECALAGE D'ACCES AU NUMERO
< D'UN PROCESSEUR SUR UN BUS
< MEMOIRE (INSTRUCTION 'RDSI').
DNUBUS:: VAL MNUBUS=K < DECALAGE D'ACCES AU NUMERO
< D'UN BUS MEMOIRE (INSTRUC-
< TION 'RDSI').
DSBOOT:: VAL MSBOOT=K < DECALAGE D'ACCES A LA POSITION
< DU SELECTEUR DE BOOTSTRAP
< (INSTRUCTION 'RDSI').
DTYPRO:: VAL MTYPRO=K < DECALAGE D'ACCES AU TYPE DU
< PROCESSEUR (INSTRUCTION
< 'RDSI').
PAGE
<
<
< P A R A M E T R E S D ' E / S :
<
<
< F O N C T I O N S :
<
<
FGR:: VAL 0 < FONCTION DE LECTURE,
FGW:: VAL 2 < FONCTION D'ECRITURE.
XBITQ:: VAL 12 < BIT INDIQUANT POUR LE 'DKM' LA
< VALEUR A DONNER A 'QUANTA' :
< =1 POUR 1, =3 POUR 0.
FGRQ:: VAL COSBT?XBITQ=FMASK(K+FGR=FCINST
< LECTURE 'DKM' AVEC QUANTA=1.
FGWQ:: VAL COSBT?XBITQ=FMASK(K+FGW=FCINST
< ECRITURE 'DKM' AVEC QUANTA=1.
FGSGNA:: VAL '2 < FONCTION COMMUNE A TOUS LES HANDLERS
< 'SGN' LORSQUE LES <ACN> DOIVENT
< ETRE CONCATENES AUX <NOMS>.
FGSGN:: VAL 'A < FONCTION COMMUNE A TOUS LES HANDLERS
< 'SGN' LORSQU'IL N'Y A PAS DE CONCA-
< TENATION AUTOMATIQUE.
FGSGNN:: VAL -1 < 'ASDEM' D'ACCES AU 'SGN' LORSQUE
< LA <VALEUR> SUIT IMMEDIATEMENT
< LE <NOM>.
FGID:: VAL '2 < FONCTION D'INSERT/DELETE DE 'HDLTRI'.
FGT:: VAL 'A < FONCTION DE TEST DE 'HDLTRI'.
<
<
< P A R A M E T R E S :
<
<
TYPITX:: VAL 1 < INDICATEUR 'INTERRUPTION EXCEPTION'.
TYPITN:: VAL 0 < INDICATEUR 'INTERRUPTION NORMALE'.
BITPAR:: VAL 8 < BIT DE PARITE CARACTERE DANS UN MOT.
PAGE
<
<
< R E G I S T R E D ' E T A T D ' U N
< C O U P L E U R :
<
<
< DEFINITION :
< LE REGISTRE D'ETAT D'UN COUPLEUR
< EST UN REGISTRE ACCESSIBLE A L'AIDE
< D'UNE 'SIO' D'ENTREE ETAT ; LES BITS
< QU'IL CONTIENT SONT DES INDICATEURS
< DE L'ETAT DU COUPLEUR.
<
<
ETADEF:: VAL 0 < SOMME DES INDICATEURS DE DEFAUTS
< REELS (EXCLUE DONC LA FIN D'ECHANGE).
ETACAD:: VAL 1 < ERREUR DE CADENCE EN ENTREE
< COMME EN SORTIE.
ETAPAR:: VAL 2 < INFORMATION INCORRECTE (PARITE,
< CHECKSUM,...).
ETAVIO:: VAL 3 < TENTATIVE DE VIOL (OH,... PROTECTION
< D'ECRITURE,... AH BON...).
ETADOG:: VAL 5 < CHIEN DE GARDE (OUAH, OUAH...) ;
< HEUREUSEMENT, IL EST PAS MECHANT...
ETABRK:: VAL 6 < APPEL OPERATEUR (BREAK,...).
ETAFBS:: VAL 7 < FIN DE BLOC EN SORTIE POUR LES VOIES
< FULL DUPLEX UNIQUEMENT.
ETARIL:: VAL 8 < LE REGISTRE D'INFORMATION EST LIBRE
< EN SORTIE, IL PEUT RECEVOIR LA DONNEE
< SUIVANTE : NE VAUT QUE POUR LES LIGNES
< FULL DUPLEX.
ETAS0:: VAL 11 < UTILISE POUR DKM/DKU POUR LES
< SYNCHRONISATIONS SUR SECTEUR 0...
ETAPIV:: VAL 12 < INFORMATION VALIDE LORS DE L'UTILI-
< SATION DU PUPITRE !!!
ETAFBK:: VAL 13 < FIN DE BLOC EN ENTREE COMME EN SORTIE ;
< MAIS FIN DE BLOC EN ENTREE UNIQUEMENT
< POUR LES LIGNES FULL DUPLEX.
ETANXT:: VAL 14 < EN ENTREE, LE REGISTRE INFORMATION
< CONTIENT LA DONNEE SUIVANTE, ALORS
< QU'EN SORTIE, IL PEUT RECEVOIR LA
< SUIVANTE (LA SIGNIFICATION 'EN
< SORTIE' N'A PAS DE SENS POUR LES
< LIGNES FULL DUPLEX.
ETAOPE:: VAL 15 < LE COUPLEUR EST OPERATIONNEL : IL EST
< PRESENT, SOUS TENSION ET TOUT
< ET TOUT...
<
< DEFINITION DES MASQUES ASSOCIES :
<
XWOR%: VAL NBITMO-B-ETADEF
MTADEF:: VAL BIT>XWOR% < MASQUE ASSOCIE A 'ETADEF'.
XWOR%: VAL NBITMO-B-ETACAD
MTACAD:: VAL BIT>XWOR% < MASQUE ASSOCIE A 'ETACAD'.
XWOR%: VAL NBITMO-B-ETAPAR
MTAPAR:: VAL BIT>XWOR% < MASQUE ASSOCIE A 'ETAPAR'.
XWOR%: VAL NBITMO-B-ETAVIO
MTAVIO:: VAL BIT>XWOR% < MASQUE ASSOCIE A 'ETAVIO'.
XWOR%: VAL NBITMO-B-ETADOG
MTADOG:: VAL BIT>XWOR% < MASQUE ASSOCIE A 'ETADOG'.
XWOR%: VAL NBITMO-B-ETABRK
MTABRK:: VAL BIT>XWOR% < MASQUE ASSOCIE A 'ETABRK'.
XWOR%: VAL NBITMO-B-ETAFBS
MTAFBS:: VAL BIT>XWOR% < MASQUE ASSOCIE A 'ETAFBS'.
XWOR%: VAL NBITMO-B-ETARIL
MTARIL:: VAL BIT>XWOR% < MASQUE ASSOCIE A 'ETARIL'.
XWOR%: VAL NBITMO-B-ETAFBK
MTAFBK:: VAL BIT>XWOR% < MASQUE ASSOCIE A 'ETAFBK'.
XWOR%: VAL NBITMO-B-ETANXT
MTANXT:: VAL BIT>XWOR% < MASQUE ASSOCIE A 'ETANXT'.
XWOR%: VAL NBITMO-B-ETAOPE
MTAOPE:: VAL BIT>XWOR% < MASQUE ASSOCIE A 'ETAOPE'.
<
<
< R E G I S T R E D E C O M M A N D E
< D ' U N C O U P L E U R :
<
<
< DEFINITION :
< LE REGISTRE DE COMMANDE D'UN COUPLEUR
< EST ACCESSIBLE PAR UNE 'SIO' DE SORTIE
< DE COMMANDE, ET PERMET DE REALISER AVEC
< LE COUPLEUR LES OPERATIONS N'IMPLIQUANT
< PAS DE TRANSFERT DE DONNEES.
<
<
COM8:: VAL 8 < UTILISE PAR 'CR' ET 'DKM'...
COM10:: VAL 10 < UTILISE PAR 'DKM'...
COMRW:: VAL 9 < INDIQUE LE SENS D'UN TRANSFERT DE
< DONNEES :
< COMRW=COMR=K : LECTURE D'INFORMATIONS,
< COMRW=COMW=1 : ECRITURE D'INFORMATIONS.
COMR:: VAL 0 < LECTURE D'INFORMATIONS,
COMW:: VAL 1 < ECRITURE D'INFORMATIONS.
COMINI:: VAL 11 < DEMANDE D'INITIALISATION D'UN COUPLEUR.
COMFBK:: VAL 12 < DEMANDE DE FIN DE BLOC.
COMSTR:: VAL 13 < DEMANDE DE LANCEMENT D'UN ECHANGE.
< ('START')
COMTST:: VAL 14 < MISE DU COUPLEUR EN MODE TEST.
COMINT:: VAL 15 < DEMANDE DE VALIDATION DES INTERRUPTIONS.
<
< MASQUES ASSOCIES AUX BITS DU REGISTRE DE COMMANDE :
<
XWOR%: VAL NBITMO-B-COM8
MOM8:: VAL BIT>XWOR% < MASQUE ASSOCIE A 'COM8'.
XWOR%: VAL NBITMO-B-COM10
MOM10:: VAL BIT>XWOR% < MASQUE ASSOCIE A 'COM10'.
XWOR%: VAL NBITMO-B-COMRW
MOMRW:: VAL BIT>XWOR% < MASQUE ASSOCIE A 'COMRW'.
XWOR%: VAL NBITMO-B-COMINI
MOMINI:: VAL BIT>XWOR% < MASQUE ASSOCIE A 'COMINI'.
XWOR%: VAL NBITMO-B-COMFBK
MOMFBK:: VAL BIT>XWOR% < MASQUE ASSOCIE A 'COMFBK'.
XWOR%: VAL NBITMO-B-COMSTR
MOMSTR:: VAL BIT>XWOR% < MASQUE ASSOCIE A 'COMSTR'.
XWOR%: VAL NBITMO-B-COMTST
MOMTST:: VAL BIT>XWOR% < MASQUE ASSOCIE A 'COMTST'.
XWOR%: VAL NBITMO-B-COMINT
MOMINT:: VAL BIT>XWOR% < MASQUE ASSOCIE A 'COMINT'.
<
<
< D E F I N I T I O N D U R E G I S T R E ' S T ' :
<
<
<
<
< D E F I N I T I O N D U R E G I S T R E ' S '
< ( R E G I S T R E E T A T D E T A C H E )
<
<
< FONCTION :
< LE REGISTE 'S' (APPELE 'SS' DANS 'PSTS',
< ET 'HS' DANS 'PSTH') EST UN SOUS-ENSEMBLE
< DU REGISTRE 'ST' D'ETAT DU PROCESSEUR; A
< LA DIFFERENCE DE 'ST', 'S' APPARTIENT A LA
< 'PST' D'UNE TACHE ('PSTIJ' OU 'PSTH').
< 'S' VA ETRE DEFINI BIT A BIT :
<
<
MS:: VAL 0 < BIT DE MODE D'EXECUTION DE LA
< TACHE :
< MS=K : MODE ESCLAVE,
< =1 : MODE MAITRE.
MODMST:: VAL 1 < 'MODE MAITRE' (CF. 'MS').
MODESC:: VAL 0 < 'MODE ESCLAVE' (CF. 'MS').
SVCS:: VAL 1 < SVCS EST MIS A 1 LORSQU'UN 'SVC'
< EST EXECUTE EN MODE ESCLAVE, ET
< EST REMIS A 0 LORSQU'UN 'RSV'
< EST EXECUTE; SVCS S'IL EST A 1
< EN MODE MAITRE PERMET L'ACTIVA-
< TION DE 'DRPS' LORS DE L'EXECUTION
< DES INSTRUCTIONS 'PSR', 'PLR',
< 'BSR', 'RSR', 'SVC' ET 'RSV'.
V:: VAL 6 < V=1 : - S'IL Y A DEBORDEMENT LORS
< D'INSTRUCTIONS ARITHMETIQUES
< SUR DES ENTIERS ALGEBRIQUES
< (DE -32768 A +32767),
< - SI 2 QUANTITES SONT EGALES
< APRES UNE INSTRUCTION DE
< COMPARAISON,
< - LORS D'UN PASSAGE A '0000
< PAR 'IC' OU 'DC'.
C:: VAL 7 < C=1 : - S'IL Y A REPORT LORS D'INS-
< TRUCTIONS ARITHMETIQUES
< SUR DES ENTIERS POSITIFS
< (DE 0 A +65535),
< - SI LE PREMIER TERME D'UNE
< COMPARAISON EST ALGEBRIQUE-
< MENT INFERIEUR AU SECOND (LE
< BIT0 ETANT ALORS LE BIT
< DE SIGNE).
SMST:: VAL COSBT?MS=FMASK(K=FCINST
< REGISTRE 'S' EN MODE MAITRE...
<
<
< C A S D E L A T A C H E A L A R M E :
<
<
MALARM:: VAL MOCD < LE CHAMP 'MALARM' DE LA 'PSTH'
< DE LA TACHE ALARME (TACHE HARWARE 0)
< CONTIENT LE NUMERO DE L'ALARME
< EN CAUSE :
ALMX:: VAL '00 < MEMOIRE INEXISTANTE.
ALPRO:: VAL '01 < PROTECTION 'DRPS' OU 'CDA'.
ALPAR:: VAL '02 < ERREUR DE PARITE HORS DU
< MODE 'DEBUG'.
ALIX:: VAL '03 < INSTRUCTION INEXISTANTE.
ALIP:: VAL '04 < INSTRUCTION PRIVILEGIEE EN
< MODE ESCLAVE.
ALSCH:: VAL '05 < 'RQST', 'WAIT' OU 'QUIT' EXECUTEE
< SOUS NIVEAU HARDWARE.
ALIPIX:: VAL '06 < RECEPTION D'UN 'IPI' DE REVEIL
< INTER-PROCESSEUR.
ALSTEP:: VAL '07 < 'STEP'.
ALARR:: VAL '08 < POINT D'ARRET EN MODE 'DEBUG'.
ALACTD:: VAL '09 < 'ACTD'.
<
<
< D E F I N I T I O N D U R E G I S T R E S T :
< ( R E G I S T R E E T A T P R O C E S S E U R )
<
<
< NOTA IMPORTANT :
< LE REGISTRE 'ST' NE PARTICIPE PAS
< GLOBALEMENT AUX CHANGEMENTS DE CONTEXTES
< GLOBAUX OU PARTIELS; SEULS SES SOUS-
< ENSEMBLES 'SS' ET 'ST' Y PARTICIPENT !!!
<
<
< 'ST' VA ETRE DEFINI BIT A BIT :
<
<
MS: VAL MS < VOIR LE REGISTRE 'S'.
MODMST: VAL MODMST < VOIR LE REGISTRE 'S'.
MODESC: VAL MODESC < VOIR LE REGISTRE 'S'.
SVCS: VAL SVCS < VOIR LE REGISTRE 'S'.
< A T T E N T I O N : DANS CERTAINS
< CAS, 'SVCS' SERA APPELE 'SAUV'
< DANS LE REGISTRE 'ST' : VOIR A
< CE SUJET LA DEFINITION DE 'SCHED' !!!
V: VAL V < VOIR LE REGISTRE 'S'.
C: VAL C < VOIR LE REGISTRE 'S'.
LCM:: VAL 3 < LCM=1 : LES INTERRUPTIONS
< DU CANAL 'LDC' SONT
< MASQUEES.
IPM:: VAL 4 < IPM=1 : LES INTERRUPTIONS
< INTERPROCESSEURS (PAR
< 'IPI') SONT MASQUEES.
IOM:: VAL 5 < IOM=1 : TOUTES LES INTERRUPTIONS
< SONT MASQUEES Y COM-
< PRIS LE DEFAUT SECTEUR,
< MAIS A L'EXCEPTION
< DES 'IPI' !!!
DEBUG:: VAL 8 < DEBUG=1 : LES ERREURS DE
< PARITE MEMOIRE SONT
< INTERPRETEES COMME DES
< POINTS D'ARRET.
MAINT:: VAL 10 < MAINT=1 : LES ERREURS DE PARITE
< SONT IGNOREES...
SCHED:: VAL 11 < SCHED=1 : LE PROCESSEUR A ETE
< INTERROMPU DANS LE
< MICRO-SCHEDULER, ET
< ALORS 'SVCS' SIGNIFIE :
< SVCS=1 : LA SAUVEGARDE DU CONTEXTE
< DE LA TACHE SOFTWARE
< ABANDONNEE N'A PAS ETE
< FAITE (ENCORE DANS LES
< REGISTRES ET DANS LE
< CONTEXTE PARTIEL DE LA
< TACHE HARD COURANTE,
< =K : LA SAUVEGARDE A ETE
< FAITE;
< NOTA : A CETTE OCCASION, ON
< APPELLERA 'SVCS' : 'SAUV' ==>
SAUV:: VAL SVCS < VOIR CE QUI PRECEDE !!!
STOP:: VAL 12 < STOP=1 : LE PROCESSEUR EST A
< L'ETAT ARRET PROGRAMME.
WARNG:: VAL 13 < WARNG=1 : UN DEFAUT SECTEUR EST EN
< COURS DE TRAITEMENT.
POP:: VAL 14 < IL FAUT QUE DEBUG=1; ALORS ::
< POP=1 : LES POINTS D'ARRET
< PROVOQUENT L'ARRET DU
< PROCESSEUR (MISE AU POINT
< PUPITRE),
< =K : LES POINTS D'ARRET
< PROVOQUENT DES ALARMES
< (MISE AU POINT PROGRAMME).
XWOR%: VAL NBITMO-B-IOM
MIOM:: VAL BIT>XWOR% < MASQUE DU BIT 'IOM'.
XWOR%: VAL NBITMO-B-IPM
MIPM:: VAL BIT>XWOR% < MASQUE DU BIT 'IPM'.
XWOR%: VAL NBITMO-B-SVCS
MSVCS:: VAL BIT>XWOR% < MASQUE DU BIT 'SVCS'.
<
<
< P A R A M E T R E S D E C C B :
<
<
BCCBIP:: VAL 0 < BIT DE MOT0 DISCRIMINANT LES 'IPI'
< CANAUX DES 'IPI' INTER-PROCESSEURS.
BCCBCR:: VAL 4 < BIT(MOT0) D'ENTREE DU COMPTE-RENDU.
BCCBBM:: VAL 7 < BIT(MOT0) DISCRIMINANT LES CANAUX
< MOTS(K) DES CANAUX OCTETS(1).
CCBDF:: VAL 1 < BIT SPECIAL "DEFAUT-SECTEUR".
CCBDKM:: VAL 6 < BIT SPECIAL "DISQUE AMOVIBLE".
CCBHDC:: VAL '80 < CODE INDICATEUR D'UN CANAL "HDC".
CCBMDC:: VAL 'C0 < CODE INDICATEUR D'UN CANAL "MDC".
CCBLDC:: VAL '00 < CODE INDICATEUR D'UN CANAL "LDC".
BCCBDC:: VAL 1 < BIT DEFSEC/CLEAR DU COMPTE-RENDU.
BCCBME:: VAL 0 < BIT DEFAUT MEMOIRE DU COMPTE-RENDU.
YY7:: VAL BIT>7 < TAILLE DES SECTEURS DISQUES, DES
< BUFFERS ET DE DIVERSES AUTRES CHOSES...
<
<
< C O N S T A N T E S D I V E R S E S
< D I S Q U E S A M O V I B L E S :
<
XXDK1:: VAL 10 < INCREMENT DE LA LONGUEUR DE LA PILE.
XXDK2:: VAL '4000 < NOMBRE DE MOTS MAX ECHANGEABLES.
XXDK3:: VAL 1 < NUMERO DU JEU DE REGISTRES 'HDC'.
< (EN FAIT ALLOUE DYNAMIQUEMENT...)
XXDK4:: VAL 50 < NOMBRE DE TENTATIVES AUTORISEES SUR UN
< ECHANGE EN ERREUR.
XWOR%1: VAL COSBT?XBITQ=FMASK(K+FGR=FCINST
XWOR%2: VAL COSBT?XBITQ=FMASK(K+FGW=FCINST
XWOR%3: VAL 0
XWOR%3: VAL COSBT?FGR=FMASK(K+XWOR%3=FCINST
XWOR%3: VAL COSBT?FGW=FMASK(K+XWOR%3=FCINST
XWOR%3: VAL COSBT?XWOR%1=FMASK(K+XWOR%3=FCINST
XWOR%3: VAL COSBT?XWOR%2=FMASK(K+XWOR%3=FCINST
XXDK5:: VAL XWOR%3 < LISTE DES FONCTIONS RECONNUES.
<
< ECHANGE
< RAPPELONS QUE L'ECHANGE PEUT SE FAIRE EN PLUSIEURS FOIS
< SI LES SECTEURS A ECHANGER SONT A CHEVAL SUR PLUSIEURS
< CYLINDRE (EN FAIT 2 MAXIMUM PUISQUE LE COMPTE DE MOTS
< MAX EST '3FFF ET QU'IL Y A 'F000 MOTS PAR CYLINDRE)
<
XXDK10:: VAL 1 < NOMBRE DE PUISSANCE DE 2 (A PARTIR DE
< DE 2**0) IGNOREES DANS L'ADRESSE TETE
< LORS DE LA SELECTION D'UNITE.
XXDK12:: VAL 3 < NOMBRE DE PUISSANCE DE 2 (A PARTIR DE
< CELLES QUI SONT IGNOREES) PRISES EN
< COMPTE LORS DE LA SELECTION D'UNITE.
XWOR%1: VAL BIT>XXDK12-BIT>XXDK10)MMOT
XXDK20:: VAL XWOR%1 < MASQUE DE SELECTION DES PUISSANCES UTILES
XXDK11:: VAL 7 < CADRAGE DES PUISSANCE UTILES LORS
< DE LA SELECTION D'UNITE.
XXDK13:: VAL 1 < NUMERO DE 'DKM' ET 'DKU' SUR LEURS
< COUPLEURS RESPECTIFS (PREMIERE UNITE).
XXDK14:: VAL 6 < POSITIONNEMENT DU NUMERO DE CYLINDRE
< LORS DU POSITIONNEMENT DES TETES.
XXDK15:: VAL XXDK14-XXDK10 < POSITION DES PUISSANCES LES PLUS FAIBLES
< LORS DU POSITIONNEMENT DES TETES.
XXDK30:: VAL MOMINI?MOMFBK?MOMSTR
< 'UNIT SELECT SANS IT ET CHECKSUM'.
XXDK31:: VAL MOMINI?MOMFBK?MOMINT
< 'SEEK AVEC IT VALIDEES'.
XXDK32:: VAL MOM8?MOM10?MOMSTR?MOMINT
< 'ECHANGE AVEC CHECKSUM'.
XXDK33:: VAL MOMRW?MOMSTR?MOMINT
< 'BEGIN WRITE'.
XWOR%1: VAL 24 < NOMBRE DE SECTEURS PAR PISTE.
XDKMSP:: VAL XWOR%1 < NOMBRE DE SECTEURS PAR PISTE.
XDKMPC:: VAL 20 < NOMBRE DE PISTES PAR CYLINDRE.
LST
<
< B O X
<
ABOX: VAL 'E < RELAI D'ACCES A 'BOX'.
BOXIPI: EQU $ < BOX'S.
DZS NMBUSM*NMPROB < NOMBRE MAXIMUM DE PROCESSEURS.
<
< S O U S - N I V E A U X D ' I T.
<
< ATTENTION! ILS SONT DEFINIS "BRUTALEMENT", IL
< FAUDRA EVENTUELLEMENT LES METTRE A JOUR!
<
XSNDKF: VAL 0 < SOUS-NIVEAU NORMAL DKF.
XSNDKM: VAL 1 < SOUS-NIVEAU NORMAL DKM.
COMMON
COM: EQU $
CCMP: DZS 1 < COMPTEUR DE COMPACTAGE (EN
< L'OCCURRENCE DECOMPACTAGE)
IPRR1: DZS 1 < INDICATEUR 1ER READ DE 1 CAR SUR
< PAGE VIRTUELLE
IRCARD: DZS 1 < INDICATEUR READ ACTIF/INACTIF
< SUR CARTES
< =0 ACTIF #0 INACTIF
IDKO: DZS 1 < INDICATEUR DK OUTPUT ACTIF/INACTIF
< =0 ACTIF #0 INACTIF
IDKF: DZS 1 < INDICATEUR RESTAURATION SUR DKF/DKM:
< = 1 : DKF (ETAT A PRIORI).
< = 0 : DKM.
NBSECD: DZS 1 < NOMBRE DE SECTEURS AU DUMP DK
NBSECR: EQU NBSECD < NOMBRE DE SECTEURS A LA RESTAURATION DK
LPC: WORD LPAC*2 < LONG OCT PAGE SI CARTES
<
< RELAIS DIVERS
<
AXTRAV: WORD ZERO,X
AOPAG: WORD PAGE-ZERO*2 < ADR OCT DEBUT PAGE VIRTUELLE.
AOFPAG: WORD FPAGE-ZERO*2 < ADR OCT FIN PAGE VIRTUELLE.
PPG: DZS 1 < POINTEUR OCT PAGE VIRTUELLE
< RESTAURATION
ABC: WORD BC < ADR BUFFER CARTE
AXBC: WORD BC,X < ADR X BUFFER CARTE
AFBC: WORD FBC < ADR FIN BUFFER CARTE
AXBCM1: WORD BC-1,X < RELAI INDEXE BC-1
ACHECK: WORD BC+75 < ADRESSE CHECK CARTE
PBC: DZS 1 < POINTEUR BUFFER CARTE
NUMC: DZS 1 < NUMERO CARTE EN COURS
NBM11: DZS 1 < INDEX MODULO 11 POUR LECTURE
< CARACTERE SUR CARTE
AXMSK1: WORD MSK1,X < TABLE PUNCH
AXSHF1: WORD SHF1,X < IDEM
AXSHF2: WORD SHF2,X < IDEM
SUI: WORD '6EC0 < INDICATEURS MOT SUIVANT BUFFER
< PUNCH
DIX: WORD 10
DIXMIL: WORD 10000 < POUR NUM CARTES MODULO 10000
SAVK: DZS 1 < SAUVEGARDE DE 'K' POUR CERTAINES
< REPRISES DELICATES (CARTES).
DATE: DZS 6 < DATE DE DUMP (JJ MM AA HH MM SS).
FDATE: EQU $ < FIN DE ZONE DATE.
ACN: DZS 2 < ACN DE DUMP.
FACN: EQU $ < FIN DE ZONE ACN.
SECT: DZS 1 < ADRESSE SECTEUR COURANTE.
<
< RELAIS SOUS-PROGRAMMES
<
ARSTDK: WORD RSTDK < RESTAURATION DISQUE
ARSTDA: WORD RSTDA < RESTAURATION DE LA DATE DU DUMP.
ARSTAC: WORD RSTAC < RESTAURATION DE L'ACN DU DUMP.
AR1: WORD R1 < READ 1 CAR SUR PAGE VIRTUELLE
ALDC: WORD LDC < LOAD CARACTERE PAGE VIRTUELLE
ARN: WORD RN < READ N CAR SUR PAGE VIRTUELLE
ARPAGE: WORD RPAGE < READ 1 PAGE VIRTUELLE
ARCARD: WORD RCARD < READ CARTE
AR1C: WORD R1C < READ 1 CARACTERE SUR CARTE
ASPDKF: WORD SPDKF < S/P D'ECRITURE SUR DKF.
ASPDKM: WORD SPDKM < S/P D'ECRITURE SUR DKM.
ASPCR1: WORD SPCR1 < S/P DE LECTURE D'UNE CARTE SUR CR1.
ASTOP: WORD SPSTOP < S/P DE STOP PROCESSEUR.
PAGE
LOCAL
<
LOC: EQU $ < LOCAL.
<
< DONNEES RELATIVES AU S/P SPDKF.
<
ACDKB:: VAL ACDKF < ADRESSE COUPLEUR DU DISQUE UTILISE PAR
< LE BOOTSTRAP FHD
BSIOEA: WORD ACDKB+FPHETA < OPERANDE SIO ENTREE ETAT A
BSIOEB: WORD ACDKB+FPHETB < OPERANDE SIO ENTREE ETAT B
BSIOCD: WORD ACDKB+FPHCMD < OPERANDE SIO SORTIE COMMANDE
BSIOSA: WORD ACDKB+FPHCME < OPERANDE SIO SORTIE ADRESSE SECTEUR
BSIOSC: WORD ACDKB+FPHSAD < OPERANDE SIO SORTIE COMPTE DE SECTEURS
<
BCCB0: WORD 0 < CCB MOT 0
XXDK50:: VAL 0 < JEU DE REGISTRES 'HDC' POUR 'DKF',
XXDK51:: VAL XXDK50+I < JEU DE REGISTRES 'HDC' POUR 'DKM'.
BCCB1: BYTE CCBHDC+XSNDKF;XXDK50 < CCB MOT1.
BCCB2: WORD BUDK < CCB MOT 2: ADRESSE MEMOIRE
BCCB3: WORD FBUDK-BUDK < CCB MOT 3: COMPTE DE MOTS
BCCB4: WORD ACDKB+FPHOUT < CCB MOT 4: OPERANDE SIO SORTIE INFO
<
BABIPI: WORD BIPI < RELAI D'ACCES AU S/P 'BIPI'.
BC0800: WORD MIPM < POUR MASK/DEMASK IPI
<
< DONNEES SPECIFIQUES AU S/P SPDKM.
<
BACDKM:: VAL ACDKM < ADRESSE COUPLEUR DU DISQUE AMOVIBLE
< UTILISE PAR LE BOOTSTRAP 'DKM'.
BMSEA: WORD BACDKM+FPHETA < OPERANDE SIO ENTREE ETAT A.
BMSEB: WORD BACDKM+FPHETB < OPERANDE SIO ENTREE ETAT B.
BMSSA: WORD BACDKM+FPHCME < OPERANDE SIO SORTIE ADRESSE.
BMSCD: WORD BACDKM+FPHCMD < OPERANDE SIO SORTIE COMMANDE.
BMPUP: WORD ACPUP+FPHOUT < VISUALISATION AU PUPITRE...
<
<
BMCCB0: WORD COSBT?CCBDKM=FMASK(K=FCINST < CCB DKM MOT0 :
< BIT 6 = DK TETES MOBILES.
BMCCB1: BYTE CCBHDC+XSNDKM;XXDK51 < CCB DKM MOT 1 :
< BITS 0-1 = MODE HDC.
< BITS 2-7 = NIVEAU IT NORMALE.
< BITS 11-15 = NUMERO DU JEU DE
< REGISTRES CANAL UTILISES.
BMCCB2: WORD BUDK < CCB DKM MOT 2 : ADRESSE MEMOIRE.
BMCCB3: WORD FBUDK-BUDK < CCB DKM MOT 3 : COMPTE DE MOTS.
BMCCB4: WORD BACDKM+FPHOUT < CCB DKM MOT 4 : OPERANDE SIO IN/OUT.
BMCCB5: WORD 0 < CCB DKM MOT 5 : HEADER 1 DU PREMIER
< SECTEUR A ECHANGER.
<
<
BMNSPP: WORD XDKMSP < NOMBRE DE SECTEURS PAR PISTE.
BMNPPC: WORD XDKMPC < NOMBRE DE PISTES PAR CYLINDRE.
<
BMSECT: WORD 0 < NUMERO DE SECTEUR.
BMPIST: WORD 0 < NUMERO DE PISTE.
BMCYL: WORD 0 < NUMERO DE CYLINDRE.
<
< DONNEES SPECIFIQUES AU S/P SPCR1.
<
ACCRB:: VAL ACCR1 < ADRESSE COUPLEUR DU LECTEUR DE CARTES
< UTILISE PAR LE BOOTSTRAP CARTES
BCETA: WORD ACCRB+FPHETA < OPERANDE SIO ENTREE MOT D'ETAT
BCCDE: WORD ACCRB+FPHCMD < OPERANDE SIO SORTIE COMMANDE
BCDATA: WORD ACCRB+FPHIN < OPERANDE SIO DATA IN
<
PAGE
PROG
ENTRY1: EQU $
<
< E N T R Y 1 D A N S R E S T ( I N I T I A L E . . . )
<
< INITIALISATIONS
<
LRM C,L,K
WORD COM+'80 < BASE LE COMMON.
WORD LOC+'80 < LOCAL.
WORD PILE-1 < POUR LA PILE.
STZ IPRR1 < PREMIER READ=OUI
RBCL: EQU $
<
< BOUCLE DE RESTAURATION
<
BSR AR1
CPI 'DA < DATE ?
JE RDA1
CPI 'AC < ACN ?
JE RAC1
CPI 'DD < DEBUT DISQUE ?
JE RD1
CPI 0 < IL SUFFIT POUR CE PROGRAMME TRES
< SPECIAL, DE TROUVER UN SEUL 0 POUR
< CONCLURE A LA FIN DE RESTAURATION.
JE RFIN
ERROR: EQU $
BSR ASTOP < CODES NON RECONNUS...
JMP ERROR < !!!
RDA1: EQU $
BSR ARSTDA < RESTAURATION DATE.
JMP RBCLF
RAC1: EQU $ < RESTAURATION DE L'ACN DU DUMP.
BSR ARSTAC
JMP RBCLF
RD1: EQU $
BSR ARSTDK < RESTAURATION DISQUE
RBCLF: EQU $
JMP RBCL < AU SUIVANT
<
< FIN DU PROGRAMME
<
RFIN: EQU $
RFINC: EQU RFIN < RESTAURATION CARTES
< ON S'ASSURE QUE TOUTES
< LES CARTES ONT BIEN ETE LUES
< (ENCHAINEMENTS EVENTUELS DE
< RESTAURATIONS)
RFIN1: EQU $
BSR ARCARD < READ CARD
CPZ IRCARD < READ CARD TOUJOURS ACTIF?
JE RFIN1 < OUI, CONTINUER
<
< FIN : ON FAIT STOP ...
<
RFIN2: EQU $
BSR ASTOP
HALT
JMP RFIN2
PAGE
RSTDK: EQU $
<
< R E S T A U R A T I O N D ' U N D I S Q U E
<
PSR X,Y < SAUVEGARDES
<
BSR AR1 < READ QUANTA DE DUMP
CPI 1 < CE DOIT ETRE OBLIGATOIREMENT 1.
JNE $ < PROBLEME...
<
STZ IDKF
IC IDKF < DK DE RESTAURATION = DKF A PRIORI.
<
BSR AR1 < READ NSP DU DK DE DUMP
CPI NSPDK3 < TEST NSP DK DE DUMP.
JE RSTDK5 < C'EST DKF.
CPI NSPDK2
JNE $ < NI DK2, NI DK3.
STZ IDKF < C'EST DKM.
RSTDK5: EQU $
<
LAD SECT
SLLS 1 < ADRESSE OCTET ADRESSE SECTEUR.
LXI 2 < 2 OCTETS
BSR ARN < READ ADRESSE SECTEUR
BSR ASTOP < POUR PERMETTRE A L'UTILISATEUR DE
< MODIFIER L'ADRESSE SECTEUR DE DEBUT
< DE RESTAURATION, AINSI QUE LE NSP
< DU DISQUE DE RESTAURATION (DKF / DKM),
< (CF INDICATEUR 'IDKF').
<
LAD NBSECD
SLLS 1 < ADRESSE OCTETS NOMBRE DE SECTEURS
LXI 2
BSR ARN < READ NOMBRE DE SECTEURS
<
<
< BOUCLE DE WRITE DE 'NBSECR' SECTEURS SUR DK2 / DK3.
<
BSR ASTOP < POUR PERMETTRE A L'UTILISATEUR
< D'INHIBER OU PAS LA RESTAURATION
< DISQUE (INDICATEUR 'IDKO')
RSTDKF: EQU $ < BOUCLE DE RESTAURATION DK
CPZ NBSECR < NOMBRE DE SECTEURS RESTANT A
< RESTAURER
JE RSTDKD
LRM A,X
WORD BUDK-ZERO*2 < ADRESSE OCTET BUFFER DK.
WORD FBUDK-BUDK*2 < LONGUEUR OCTETS BUFFER DK.
BSR ARN < READ N OCTETS EN PAGE VIRTUELLE
CPZ IDKO < RESTAURATION DK ACTIVE ?
JNE RSTDK4 < NON
LA SECT < ADRESSE SECTEUR COURANT (PARAMETRE
< D'APPEL DES S/P D'ECHANGE DK).
CPZ IDKF < DISCRIMINATION DKF/DKM.
JNE RSTDK3
BSR ASPDKM < C'EST DKM.
JMP RSTDK4
RSTDK3: EQU $
BSR ASPDKF < C'EST DKF.
RSTDK4: EQU $
IC SECT < ADRESSE SECTEUR SUIVANT
DC NBSECR < -1 SUR NOMBRE DE SECTEURS RESTANT
JMP RSTDKF
RSTDKD: EQU $
BSR AR1 < READ DELIMITEUR 'FD
CPI 'FD < QUI SIGNIFIE 'FIN DUMP DISQUE'
JNE $ < PROBLEME...
<
PLR X,Y < RESTAURATIONS
RSR
PAGE
RSTDA: EQU $
<
< R E S T A U R A T I O N D E L A D A T E D U D U M P
<
< CELLE-CI EST STOCKEE DANS LA ZONE 'DATE'
< A TITRE D'INFORMATION.
<
PSR A,X < SAUVEGARDES
LAD DATE
SLLS 1 < ADRESSE OCTET ZONE 'DATE'.
LXI FDATE-DATE*2 < 16 OCTETS (JJ MM AA HH MM SS).
BSR ARN < READ N OCTETS EN PAGE VIRTUELLE.
<
PLR A,X < RESTAURATIONS.
RSR
RSTAC: EQU $
<
< R E S T A U R A T I O N D E L ' A C N D U D U M P
<
< CET ACN EST STOCKE DANS LA ZONE 'ACN' A TITRE
< D'INFORMATION.
<
PSR A,X < SAUVEGARDES.
LAD ACN
SLLS 1 < ADRESSE OCTET ZONE 'ACN'.
LXI FACN-ACN*2 < 4 OCTETS.
BSR ARN < READ N OCTETS EN PAGE VIRTUELLE.
PLR A,X < RESTAURATIONS.
RSR
PAGE
R1: EQU $
<
< R E A D 1 C A R A C T E R E E N P A G E V I R T U E L L E
<
< CE S/P ASSURE LE DECOMPACTAGE, ET RENVOIE LE
< CARACTERE LU DANS LE REGISTRE 'A' (BITS 8-15)
<
PSR X,Y
CPZ IPRR1 < PREMIER APPEL?
JNE R11
< OUI,
IC IPRR1 < BASCULEMENT
LAI -1
STA CCMP < INIT COMPT DE COMPACTAGE
< BIT 0=1 SIGNIFIE EPUISE
<
< INIT SPECIFIQUES AUX
< DIFFERENTS SUPPORTS UTILISES
STZ NUMC < NUMERO CARTE EN COURS
STZ NBM11 < INDEX MODULO 11
STZ IRCARD < READ CARTE ACTIF A PRIORI
LA ACHECK
STA PBC < POINTEUR BUFF CARTES (PROVOQUERA
< APPEL A READ CARD)
BSR ARPAGE < READ 1ERE PAGE
<
<
<
R11: EQU $ < N EME APPEL
LB CCMP < COMPTEUR COMPACTAGE
LY PPG < POINTEUR DE PAGE
<
TBT 16+0 < CONT INVALIDE?
JNC R101
< OUI,REINIT CCMP
BSR ALDC < LOAD COUNT
LR A,B
<
R101: EQU $
TBT 16+8 < COUNT DE CAR REPETITIFS?
JNC R102
< OUI,ON RESTE SUR LE CAR
< ACTERE EN COURS
LR Y,X
LBY &AXTRAV < CAR EN COURS
JMP R103
<
R102: EQU $ < COUNT DE CAR NON-REPETITIFS
BSR ALDC < LOAD CARACTERE SUIVANT
<
R103: EQU $ < MAJ COUNT DE COMPACTAGE
ADRI -1,B
XR A,B
PSR A
ANDI '7F
CPI '7F < EPUISE?
PLR A
JNE R1F
< OUI,FAUT-IL AVANCER D'1 CAR
< IL LE FAUT SI LE COUNT EN
< COURS ETAIT UN COUNT DE CAR
< REPETITIFS
TBT 0
JC R1F
< C'ETAIT UN REPETITIF
PSR A
BSR ALDC < POUR PASSER AU COUNT SUIVANT
PLR A
SBT 0 < SET CCMP EPUISE
<
R1F: EQU $
XR A,B
STB CCMP < CCMP MIS A JOUR
STY PPG < PPG MIS A JOUR
<
PLR X,Y
RSR
<
PAGE
LDC: EQU $
<
< L O A D 1 O C T E T D E P A G E V I R T U E L L E
<
< D A N S 'A' (BITS 8-15)
<
< CE S/P EST APPELE PAR LE S/P 'R1' ET IL LIT BRUTALEMENT
< UN OCTET QUI PEUT ETRE UN COUNT OU UN CARACTERE.
<
LR Y,X
LBY &AXTRAV
ADRI 1,Y
LX AOFPAG
CPR X,Y < ON DEPASSE?
JL LDCF
< OUI, LIRE PAGE SUIVANTE
BSR ARPAGE
LY PPG < REINIT Y POUR R1
LDCF: EQU $
RSR
<
PAGE
RN: EQU $
<
< R E A D N C A R A C T E R E S E N P A G E V I R T U E L L E
<
< ARGUMENTS:
< 'A' = ADRESSE OCTET ZONE DE STOCKAGE DES
< CARACTERES LUS
< 'X' = NOMBRE DE CARACTERES A LIRE
<
< NOTA:
< CE S/P UTILISE LE S/P 'R1'(READ 1 CARACT)
<
PSR A,X,Y
CPZR X < LONGUEUR NULLE?
JE $ < OUI, PROBLEME!
LR A,Y
RN1: EQU $ < BOUCLR DE READ 1 CAR
PSR X < SVG COUNT
BSR AR1 < READ 1 CAR
LR Y,X
STBY &AXTRAV < STOCKAGE CAR
ADRI 1,Y
PLR X
JDX RN1 < BOUCLE
<
PLR A,X,Y
RSR
PAGE
RPAGE: EQU $
<
< R E A D U N E P A G E V I R T U E L L E
<
< ( S U R C R 1 . )
<
PSR A,B,X
LA AOPAG
STA PPG < INIT POINTEUR PAGE
<
RPGC: EQU $ < LECTEUR DE CARTES
BSR AR1C < LIRE 1 CARACT SUR CARTE
LX PPG
STBY &AXTRAV < STORE CAR EN PAGE
IC PPG < +1 SUR POINT PAGE
LA PPG
CP AOFPAG < ON DEPASSE?
JL RPGC < NON,CONTINUER,C'EST BIEN
RPGF: EQU $ < FIN,REINIT PPG ET RETOUR
LA AOPAG
STA PPG
<
PLR A,B,X
RSR
PAGE
R1C: EQU $
<
< R E A D 1 C A R A C T E R E S U R C A R T E
<
< CE SOUS-PROGRAMME PREND 8 BITS A CHAQUE
< APPEL, QU'IL REND DANS 'A' (BITS 8-15),
< SACHANT QU'UNE CARTE CONTIENT 11 BITS UTILES
< PAR COLONNE.
< POUR RECONSTITUER UN CARACTERE QUI PEUT
< ETRE "A CHEVAL" SUR DEUX COLONNES OU MEME
< SUR DEUX CARTES, IL UTILISE LES TABLES
< 'MSK1', 'SHF1', 'SHF2' ET LES BITS PLACES
< DANS 'SUI'.
< LORSQUE LE S/P A BESOIN DE LIRE LA CARTE
< SUIVANTE, IL APPELLE LE S/P 'RCARD'.
<
LA PBC < POINTEUR BUFFER CARTE
CP ACHECK < ON DEPASSE?
JL R1C1
BSR ARCARD < OUI, LIRE UNE CARTE
R1C1: EQU $
LX PBC
LA &AXTRAV < MOT EN COURS BUFFER CARTE
LR A,Y
LX NBM11 < INDEX MODULO 11 EN COURS
LBY &AXSHF1 < SHIFT1
LR A,X
LR Y,A
SCLS 0,X
LR A,Y < Y=MOT.SHIFT1
LX NBM11 < INDEX
LBY &AXMSK1 < MASQUE 1
ANDR A,Y < Y=MOT.SHIFT1.MASK1
LA SUI < INDICATEUR DE PASSAGE AU MOT
< SUIVANT DU BUFFER CARTE
TBT 0,X < PASSER AU MOT SUIVANT?
JNC R1C3
< OUI,
IC PBC < POINTEUR BUFFER CARTE='+1
LA PBC
CP ACHECK < ON DEPASSE?
JL R1C3
BSR ARCARD < OUI, LIRE UNE CARTE
R1C3: EQU $
LX PBC
LB &AXTRAV < MOT BUFFER CARTE
LX NBM11 < INDEX EN COURS MODULO 11
LBY &AXSHF2 < SHIFT2
LR A,X
LR B,A
SCLS 0,X
LR A,B < B=MOT.SHIFT2
LX NBM11
LBY &AXMSK1 < MASK1...
CMR A,A < ...INVERSE...
ANDI '00FF < ...ET NETTOYE
ANDR A,B < B=MOT.SHIFT2.MASK1-INVERSE
ORR Y,B < B=OCTET COMPLET
<
IC NBM11 < INDEX MODULO 11 = '+1
LA NBM11
CPI 11 < ON DEPASSE?
JL R1C2
< OUI,
STZ NBM11 < RAZ NBM11
IC PBC < MOT SUIVANT BUFFER CARTE
R1C2: EQU $
LR B,A
RSR < RETOUR, A(8-15)=OCTET LU
PAGE
RCARD: EQU $
<
< R E A D C A R D
<
< CE SOUS-PROGRAMME LIT UNE CARTE, ET
< ASSURE LES CONTROLES DE "CHECK" ET DE
< SEQUENCE, AINSI QU'UNE REPRISE EVENTUELLE
< DE LA LECTURE SI UNE CARTE EST ERRONEE.
< IL ASSURE LES INITIALISATIONS ET REINITIALISATIONS
< NECESSAIRES ET LA GESTION DE FIN DE DECK.
<
PSR A,Y
LR K,A < ON SAUVE LE K ACTUEL AU
STA SAVK < IL Y AURAIT UNE RELECTURE SUITE A
< ERREUR DE CHECKSUM OU DE NUMEROTATION.
RCD0: EQU $ < POINT D'ENTREE DE RELECTURE
CPZ IRCARD < SSI LECTURE ACTIVE
JNE RCD9
LA ABC < ADRESSE BUFFER CARTE (POUR S/P 'SPCR1').
BSR ASPCR1 < S/P DE LECTURE PHYSIQUE CARTE.
RCD9: EQU $
LA &ABC < 1ER MOT BUFFER
ANDI 'F0 < NETTOYAGE
CPI '70 < FIN PHYSIQUE?
JNE RCD1
< OUI,
IC IRCARD < INHIBITION LECTURE PHYSIQUE
JMP RCDFIN
<
RCD1: EQU $
<
< CONTROLE DU CHECK
<
LA &ACHECK
ANDI 'FFE0 < CHECK NETTOYE
LR A,Y
LXI NBCOL < INIT COUNT
LAI 0
STA &ACHECK < RAZ CHECK
RCD2: EQU $ < BOUCLE DE RECALCUL CHECK
EOR &AXBCM1
JDX RCD2 < BOUCLE
ANDI 'FFE0 < NETTOYAGE CHECK RECALCULE
CPR A,Y < CHECK CORRECT?
JE RCD3
JMP $ < ERREUR DE CHECK: REMETTRE LA DERNIERE
< CARTE DANS LE LECTEUR.
JMP RCDER < VERS RELECTURE
RCD3: EQU $
<
< CONTROLE DE SEQUENCE
<
IC NUMC < NUMERO CARTE EN COURS
LA NUMC
CP DIXMIL < ON ATTEINT 10000 CARTES?
JL RCD8
LAI 1 < OUI,ON REPART A 1
STA NUMC
RCD8: EQU $
<
< CONVERSION DECIMALE DE NUMC
LXI 0
LB NUMC
RCD4: EQU $ < BOUCLE CONVERSION
LAI 0
DV DIX < DIVISION PAR 10
JNV $+2
JMP $ < ....
PSR B < ON EMPILE LE RESTE
ADRI 1,X < COUNT NB CHIFFRES DECIMAUX
JAE RCD5 < QUOTIENT NUL?
< NON, ON CONTINUE
XR A,B
JMP RCD4
RCD5: EQU $
< COMPARAISON DU NB DECIMAL RECALCULE
< AVEC CELUI DU BUFFER CARTE
LA AFBC
NGR X,Y
ADR A,Y < ADRESSE 1ER MOT DE STOCKAGE DE
< LA NUMEROTATION SUR BUFFER CARTE
<
RCD6: EQU $ < BOUCLE COMPAR CHIFFRE PAR CHIFFRE
PLR A < CHIFFRE DECIMAL
PSR X < SVG COUNT
LR A,X
LAI 0
SBT 2,X < SET BIT
LR Y,X
LB &AXTRAV < MOT DU BUFFER
XR A,B
ANDI 'FFF0 < NETTOYAGE
CPR A,B < EGALITE CHIFFRE?
JE RCD7
JMP $ < ERREUR DE SEQUENCE: REMETTRE LA DERNIERE
< CARTE LUE DANS LE LECTEUR.
LA NUMC < NUMERO ATTENDU
CPI 1
JNE $+2
LA DIXMIL
ADRI -1,A
STA NUMC < MISE A JOUR DE 'NUMC'
RCDER: EQU $ < ERREUR DE CHECK OU DE NUMEROTATION
< ON VIENT ICI QUAND LA DERNIERE
< CARTE LUE A ETE REPLACEE DANS LE
< LECTEUR.
LA SAVK < ON RECUPERE 'K' POUR REBOUCLER
LR A,K < SUR LA LECTURE
JMP RCD0 < RELECTURE
RCD7: EQU $
ADRI 1,Y < CHIFFRE SUIVANT
PLR X < RECUP COUNT
JDX RCD6 < AU SUIVANT
<
< CHECK ET NUMEROTATION SONT CORRECTS
< REINITS NECESSAIRES, RESTAURATIONS ET RETOUR
<
RCDFIN: EQU $
LA ABC
STA PBC < POINTEUR BUFFER CARTE
PLR A,Y
RSR
PAGE
SPSTOP: EQU $
<
< S/P DE STOP PROCESSEUR.
<
PSR A,X
LAI K
SBT STOP
SST
HALT
HALT
PLR A,X
RSR
PAGE
SPCR1: EQU $
<
< S/P DE LECTURE D'UNE CARTE (EN PROGRAMME SIMPLE).
<
< ARGUMENTS:
< -'A' = ADRESSE MOT BUFFER CARTE.
<
PSR A,X,W < SAUVEGARDES.
LR A,W < 'W' BASE LE BUFFER CARTE.
SPCR12: EQU $
SIO BCETA < MOT D'ETAT.
TBT ETAOPE < TEST LECTEUR PRET.
JC SPCR11 < PRET.
LAI MOMINI < NON-PRET: FAIRE 'RESET'.
SIO BCCDE
JMP SPCR12 < ET ATTENDRE.
SPCR11: EQU $ < LECTEUR PRET: LANCER L'ECHANGE.
LAI MOMSTR < LECTURE, IT NON VALIDEES.
SIO BCCDE
<
LXI LCCI < EXPLOITATION DES 'LCCI' COLONNES..
SPCR13: EQU $
SIO BCETA < ENTREE MOT D'ETAT.
TBT ETANXT < DATA VALID ?
JNC SPCR13
SIO BCDATA < 'A' (4-15) = COLONNE LUE.
SLLS 4 < 'A' (0-11) = COLONNE LUE.
STA 0,W < STORE MOT OBTENU.
ADRI 1,W < MOT SUIVANT.
JDX SPCR13
<
PLR A,X,W < RESTAURATIONS.
RSR
PAGE
SPDKF: EQU $
<
< S/P D'ECHANGE D'UN SECTEUR DKF.
<
< ARGUMENTS:
< 'A' = ADRESSE SECTEUR.
< 'L' = BASE DU LOCAL.
<
< INFORMATIONS DU 'LOCAL', NOTAMMENT :
< 'BMCCB2' = ADRESSE MEMOIRE BUFFER DKF.
< 'BMCCB3' = LONGUEUR A ECHANGER (1 BLOC DKF).
<
PSR A,B,X,C < SAUVEGARDES.
PSR W < SUITE SAUVEGARDES.
LR A,B < SAVE ADRESSE SECTEUR.
< INITIALISATION DE ADRESSE DE 'BOX' (REGISTRE 'C').
LRM C,W
WORD BOXIPI < ADRESSE DE 'BOX'.
WORD ABOX < ADRESSE DU RELAI DES 'BOX'.
LR C,A
STA 0,W < RELAI DES 'BOX'.
RDSI < READ SYSTEM IDENTIFICATION.
ANDI MNUBUS?MNUPRO < 'A' = NUMERO DU PROCESSEUR.
<
ADR A,C < D'OU L'ADRESSE DE 'BOX'.
LAI MOMINI
SIO BSIOCD < RESET
<
BCARTX: EQU $
SIO BSIOEA < MOT D'ETAT
TBT ETAOPE < PRET?
JNC BCARTX < NON,ATTENDRE
<
LR B,A < ADRESSE SECTEUR
SIO BSIOSA < SORTIE ADRESSE SECTEUR
<
LAI YY7 < A(BIT1 A 8)=CPTE DE SECTEURS
SIO BSIOSC < SORTIE COMPTE DE SECTEURS
<
<
LAD BCCB0 < ADRESSE DU CCB
BSR BABIPI < IPI ETC...
LAI MOMRW?MOMSTR?MOMINT < LANCEMENT ECRITURE, IT VALIDEEES.
SIO BSIOCD
LXI K
HALT
<
PLR W < RESTAURATIONS.
PLR A,B,X,C < SUITE RESTAURATIONS.
RSR
PAGE
SPDKM: EQU $
<
< S/P D'ECHANGE D'UN SECTEUR DKM.
<
< ARGUMENTS:
< 'A' = ADRESSE SECTEUR.
< 'L' = BASE DU LOCAL.
<
< INFORMATIONS DU 'LOCAL', NOTAMMENT :
< 'BMCCB2' = ADRESSE MEMOIRE BUFFER DKM.
< 'BMCCB3' = LONGUEUR A ECHANGER (1 BLOC DKM).
<
PSR A,B,X,C < SAUVEGARDES.
PSR W < SUITE SAUVEGARDES.
PSR A < ADRESSE SECTEUR (INITIALE OU
< DE REPRISE SUR FIN DE CYLINDRE).
< INITIALISATION DE ADRESSE DE 'BOX' (REGISTRE 'C').
LRM C,W
WORD BOXIPI < ADRESSE DE 'BOX'.
WORD ABOX < ADRESSE DU RELAI DES 'BOX'.
LR C,A
STA 0,W < RELAI DES 'BOX'.
RDSI < READ SYSTEM IDENTIFICATION.
ANDI MNUBUS?MNUPRO < 'A' = NUMERO DU PROCESSEUR.
ADR A,C < D'OU L'ADRESSE DE 'BOX'.
BME1: EQU $
<
< TEST DISQUE PRET; SI NON PRET : RESET.
<
SIO BMSEA < 'A'=MOT D'ETAT A.
TBT ETAOPE < DISQUE PRET?
JC BME2 < DISQUE PRET.
LAI MOMINI < DISQUE NON PRET, ON FAIT
SIO BMSCD < UN RESET,
JMP BME1 < ET ON BOUCLE.
BME2: EQU $
<
< CALCUL ADRESSE PHYSIQUE.
<
LAI K
PLR B < ADRESSE SECTEUR.
DV BMNSPP
JV $ < ERREUR.
STB BMSECT < NUMERO DE SECTEUR.
LR A,B
LAI K
DV BMNPPC
JV $ < ERREUR.
STB BMPIST < NUMERO DE PISTE.
STA BMCYL < NUMERO DE CYLINDRE.
<
< SELECTION DE L'UNITE ET POIDS 1 2 ET 3 DE L'ADRESSE TETE.
<
LA BMPIST < NUMERO DE PISTE (OU TETE).
RBT NBITMO-XXDK10
SLLS NBITMO-XXDK12-XXDK10
SLRS NBITMO-XXDK12-XXDK10-XXDK11 < POIDS 1 A 3 DE L'ADRESSE TETE
SBT XXDK13 < UNITE.
SIO BMSSA < SORTIE ADRESSE.
LAI XXDK30 < POUR UNIT SELECT.
SIO BMSCD < UNIT SELECT.
<
< POSITIONNEMENT DES TETES.
<
LBI K
LA BMCYL < NUMERO DE CYLINDRE.
SLLS XXDK14
LR A,Y
LA BMPIST < NUMERO DE PISTE.
ANDI XXDK20 < SELECTION BITS DE POIDS 0 ET 4
SLRD XXDK10 < DE L'ADRESSE TETE.
SLLS NBITMO-XXDK12-XXDK10-XXDK15-XXDK10
SLLD XXDK15+XXDK10
ORR Y,A < POUR SORTIE ADRESSE.
SIO BMSSA < SORTIE ADRESSE.
AD BMSECT < 'A'= HEADER 1 DU PREMIER SECTEUR A
< ECHANGER.
STA BMCCB5 < MOT 5 DU CCB : HEADER 1.
LAI XXDK31 < POUR SEEK.
SIO BMSCD < SEEK.
PSR X < SAUVEGARDE X.
HALT < ATTENDONS QUE LES TETES...
HALT < ...SOIENT POSITIONNEES.
JMP $+1 < PATCH EVENTUEL.
PLR X < RESTAURATION X.
<
< REMPLISSAGE DU CCB ET LANCEMENT DE L'ECHANGE.
<
LAI FBUDK-BUDK < RE-INITIALISATION COMPTE DE MOTS
< (RAZE PAR COMPTE-RENDU).
STA BMCCB3
LA BMCCB0
RBT BCCBCR < RAZ BIT COMPTE RENDU.
STA BMCCB0
<
LRM A
WORD BACDKM+FPHOUT < MOT 4 DU CCB = SIO OUT.
STA BMCCB4 < MOT 4 CCB = OPERANDE SIO.
<
LAD BMCCB0 < ADRESSE DU CCB...
BSR BABIPI < IPI ETC...
LAI XXDK32 < POUR LANCEMENT DE L'ECHANGE.
SIO BMSCD < LANCEMENT ECHANGE.
LR X,A < SAUVEGARDE DE X.
HALT < ATTENTE DE LA FIN...
HALT < ...D'ECHANGE.
LR A,X < RECUPERATION DE 'X'.
<
< RECUPERATION, TEST ET EXPLOITATION DU MOT D'ETAT.
<
SIO BMSEA < 'A' RECOIT MOT D'ETAT A.
JAGE BME3 < OK, ALLONS AU COMPTE RENDU.
TBT ETACAD < CADENCE ?
JC $ < FATAL...
TBT ETAPAR < CHECKSUM ?
JC $ < FATAL...
TBT ETAVIO < VIOL ?
JC $ < FATAL...
TBT ETADOG < CHIEN DE GARDE ?
JC $ < FATAL...
TBT ETAOPE < DISQUE PRET ?
JNC $ < NON, FATAL...
TBT ETABRK < FIN DE CYLINDRE ?
JNC $ < NON, FATAL...
BME3: EQU $
<
< COMPTE RENDU D'ECHANGE.
<
LA BMCCB0
SBT BCCBCR < SET BIT "COMPTE RENDU"
STA BMCCB0
LAD BMCCB0 < ADRESSE DU CCB.
BSR BABIPI < IPI ETC...
<
LA BMCCB3 < MOT 3 DU CCB...
JANE $ < DEFAUT...
<
PLR W < RESTAURATIONS.
PLR A,B,X,C < SUITE RESTAURATIONS.
RSR
PAGE
<
<
< E N V O I D E S ' I P I ' :
<
<
< CE PETIT S/P EST UTILISE PAR LES BOOTSTRAPS
< POUR FAIRE DES 'IPI'.
<
< ARGUMENTS:
<
< 'A'=ADRESSE DU CCB.
< 'C'=ADRESSE DE LA 'BOX'.
<
< DETRUIT 'A'.
<
<
BIPI: EQU $
STA O,C < STOCKAGE ADRESSE CCB DANS 'BOX'
IPI
LA BC0800 < POUR DEMASK DES 'IPI'
RST < DEMASK 'IPI'.
BIPI1: EQU $
CPZ O,C < TEST 'BOX'=K.
JNE BIPI1 < ATTENTE.
LA BC0800 < POUR MASK 'IPI'.
SST < MASK 'IPI'.
RSR
LST
NDS
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.