< < 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