PAGE
         IDP         "DRIVER GPI32 MODE CANAL"
         IDP         "AUTHOR : JOHN F. COLONNA"
         IDP         "LABORATORY : LACTAMME (X-CNET)"
         IDP         "DATE : 14 MARS 1982"
<
<
<        D R I V E R   M O D E   C A N A L   G P I 3 2  :
<
<
<        FONCTION :
<                      CE DRIVER STANDARD COMPATIBLE 'IOCS'
<                    EST DESTINE A GERER UN 'GPI32' PILOTANT
<                    UNE IMPRIMANTE ELECTROSTATIQUE BENSON.
<
<
         ENT         LOCBEN
         ENT         DRVBEN
NBITMO:  VAL         16              < NOMBRE DE BITS PAR MOT...
NTS:     VAL         128             < NOMBRE DE TACHES SOFTWARES...
NOCMO:   VAL         2               < NOMBRE D'OCTETS PAR MOT (ET OUI, DES
                                     < FOIS QU'UN 32 BITS APPARAISSE !!???!??!).
NOCMOK:  VAL         1               < ATTENTION : NOCMO=2**NOCMOK...
E:       VAL         1               < POUR FAIRE DES DIVISIONS PAR EXCES...
K:       VAL         0               < POUR CLEARER...
NBITOC:  VAL         NBITMO/NOCMO    < NOMBRE DE BITS PAR OCTET (IL Y A PEU DE
                                     < CHANCE QUE CELA CHANGE, MAIS OU BIEN ON
                                     < PARAMETRE, OU BIEN ON NE PARAMETRE PAS..)
MOCD:    VAL         '00FF           < POUR ATTEINDRE L'OCTET DROIT DE 'A'.
I:       VAL         1               < POUR INCREMENTER...
BINDEX:  VAL         0               < BIT D'INDEX DANS UN MOT.
         PAGE
<
<
<        T U P   S T A N D A R D  :
<
<
         DSEC        TUP
<
< DONNEES DE CONVERSION DES OCTETS EN MOTS :
<
SAVSLO:  WORD        0               < SAUVEGARDE DE 'SLO',
SAVSLE:  WORD        0               < DE 'SLE',
SAVX:    WORD        0               < ET ENFIN DE 'X'...
SAVY:    WORD        0               < SANS OUBLIER 'Y'...
SFONC:   WORD        0               < SAUVEGARDE DE 'FONC',
SADMEM:  WORD        0               < SAUVEGARDE DE 'ADMEM',
SCONT:   WORD        0               < SAUVEGARDE DE 'CONTOC'.
IBUF:    WORD        0               < ET SON INDEX COURANT...
<
< 'TUP' PROPREMENT DITE :
<
STATUS:  WORD        0               < ETAT DU PERIPHERIQUE CODE SUR UN CERTAIN
                                     < NOMBRE DE BITS :
SATTCH:  VAL         0               < L'UNITE EST "SUPER-ATTACHEE",
ATTCH:   VAL         1               < L'UNITE EST "ATTACHEE",
SPEC:    VAL         2               < BIT LIBRE POUR UN USAGE SPECIAL,
SPOOL:   VAL         3               < L'ECHANGE COURANT UTILISE LE POOL-BUFFER,
BITENC:  VAL         4               < UN ECHANGE EST EN COURS,
BITDEF:  VAL         5               < UN DEFAUT A EU LIEU AU COURS DE L'ECHANGE
                                     < COURANT, OBLIGEANT A L'ABANDONNER,
CNL:     VAL         6               < LE PERIPHERIQUE FONCTIONNE EN MODE CANAL,
SINDIC:  VAL         7               < INDICATEUR CARACTERISANT LA 'FU' EN
                                     < ECHANGE SUR LA 'PU'.
DIVERS:  VAL         '00FF           < BITS SPECIFIQUES...
MODEFO:  WORD        0               < MOT D'ETAT DE L'UNITE PHYSIQUE.
                                     < CE MOT CONTIENT ENTRE AUTRES BITS :
DEFO:    VAL         0               < UNITE PHYSIQUE EN DEFAUT,
COUP4:   VAL         1               < INDICATION 4 BREAKS,
COUP1:   VAL         2               < INDICATION 1 BREAK,
VNOOP:   VAL         5               < COUPLEUR NON OPERATIONNEL,
VAL1:    VAL         13              < SIGNAL 'VAL1' (DOIT ETRE A 0),
BUSY1:   VAL         15              < SIGNAL .NOT.'BUSY1' (DOIT ETRE A 1).
FUVOIE:  WORD        0               < OCTET GAUCHE=NUMERO DE 'FU' EN COURS
                                     <              D'ECHANGE,
                                     < OCTET DROIT =INUTILISE...
INDRIV:  WORD        0               < ADRESSE DU DRIVER (CHARGE LORS DE LA
                                     < CONFIGURATION DU SYSTEME).
ECHDRV:  WORD        0               < ADRESSE DU MODULE DE L'ENTRETIEN DE
                                     < L'ECHANGE (INUTILISE EN CANAL...).
BASEL:   WORD        0               < VALEUR DE LA BASE 'L' DU DRIVER : CETTE
                                     < VALEUR EST FIXEE A LA CONFIGURATION DU
                                     < SYSTEME.
VALSLO:  WORD        0               < VALEUR DU REGISTRE 'SLO' DU DEMANDEUR
                                     < DE L'ECHANGE,
VALSLE:  WORD        0               < VALEUR DU REGISTRE 'SLE' DU DEMANDEUR
                                     < DE L'ECHANGE.
ADIOCB:  WORD        0               < ADRESSE DE L'IOCB DE L'ECHANGE EN COURS,
                                     < IL EST A NOTER QUE CETTE ADRESSE, EST
                                     < SOIT ABSOLUE, SOIT TRANSLATABLE, ET
                                     < QU'IL N'EST PAS TOUJOURS TRES FACILE
                                     < DE FAIRE LA DISTINCTION !!!
FONC:    WORD        0               < MOT DE FONCTION, CORRESPONDANT EN FAIT
                                     < AU PREMIER MOT DU 'CCB' ; SON FORMAT
                                     < EST LE SUIVANT :
CR:      VAL         4               < BIT INDIQUANT (A 1) QU'UN COMPTE-RENDU
                                     < EST DEMANDE,
B:       VAL         7               < BIT INDIQUANT (A 0) QU'IL S'AGIT D'UN
                                     < CANAL MOT,
NIO:     VAL         '0030           < NUMERO DU PROCESSEUR D'ENTREES-SORTIES
                                     < (POSITIONNE A LA CONFIGURATION DU
                                     < SYSTEME),
MAE:     VAL         '000F           < EXTENSION D'ADRESSE AU DELA DE 64K...
NMAE:    VAL         'FFF0           < NMAE=MAE.EOR.'FFFF
DADR:    VAL         4               < AMPLITUDE DES DECALAGES DE CALCUL DES
                                     < EXTENSIONS D'ADRESSE, ET DE (SLO,SLE).
FADR:    VAL         16              < FADR=2**DADR
CONTEX:  WORD        0               < DEUXIEME MOT DU 'CCB' ; SON FORMAT EST
                                     < LE SUIVANT :
DC:      VAL         'C000           < TYPE DU CANAL :
                                     < 00=LDC,
                                     < 11=MDC,
                                     < 10=HDC.
ITN:     VAL         '7F00           < NIVEAU D'INTERRUPTION NORMALE (VALEUR
                                     < DEFINIE A LA CONFIGURATION DU SYSTEME),
CONNEX:  VAL         '00F0           < 0000=COUPLEUR STANDARD,
CCN:     VAL         '000F           < NUMERO DE CONTEXTE HARDWARE (EN MODE
                                     < CANAL 'HDC').
ADMEM:   WORD        0               < TROISIEME MOT DU 'CCB' ; IL DONNE LES
                                     < POIDS FAIBLES DE L'ADRESSE MEMOIRE
                                     < DU BUFFER CONCERNE.
CONTOC:  WORD        0               < QUATRIEME MOT DU 'CCB' ; IL DONNE LE
                                     < NOMBRE DE MOTS SUR LEQUEL PORTE L'ECHAN-
                                     < GE (MALGRE SON NOM...).
SENS:    VAL         0               < LE BIT 'SENS' DE 'CONTOC' INDIQUE LE
                                     < SENS DE L'ECHANGE (ICI, TOUJOURS UNE
                                     < SORTIE...).
ADPERI:  WORD        0               < CINQUIEME MOT DU 'CCB' ; IL DONNE
                                     < L'ADRESSE PHYSIQUE DU COUPLEUR (VALEUR
                                     < FIXEE A LA CONFIGURATION DU SYSTEME).
FPERI:   VAL         'FFF8           < EMPLACEMENT DE LA FONCTION DANS 'ADPERI',
                                     < PRISE DANS LA LISTE SUIVANTE :
FWRITE:  VAL         '0001           < ECRITURE,
FFONC:   VAL         '0003           < SORTIE FONCTION,
FCMDE:   VAL         '0007           < SORTIE COMMANDE.
F0:      VAL         0               < FONCTION FIN DE BLOC ET INHIBITION IT OUT
F3:      VAL         3               < COMMANDE D'ACTIVATION DES INTERRUPTIONS.
TABCOD:  WORD        0               < ADRESSE DE LA TABLE DES CODES D'ARRET,
                                     < INUTILISEE ICI...
TYPECH:  WORD        0               < CARACTERISATION DE L'ECHANGE ; CE MOT
                                     < EST DECOUPE EN BITS :
PLUS64:  VAL         0               < ECHANGE AVEC INTERFACE SYSTEME,
CDA:     VAL         1               < ECHANGE AVEC UN BUFFER EN 'CDA',
SPOOL1:  VAL         2               < ECHANGE AVEC UTILISATION DU POOL-BUFFER,
CDA64:   VAL         3               < ECHANGE AVEC INTERFACE SYSTEME OU
                                     < BUFFER EN CDA (?!??!?!?),
TCARRY:  VAL         4               < APPELANT EN MODE MAITRE,
VERCDA:  VAL         5               < VERIFICATION D'UNE ADRESSE EN 'CDA',
TSVCS:   VAL         6               < VALEUR DU BIT 'SVCS' DU REGISTRE 'ST'
                                     < A L'INITIALISATION DE L'ECHANGE,
INDIC:   VAL         7               < TYPE D'ADRESSAGE (0=ADRESSAGE D'UN IOCB,
                                     < (1=ADRESSAGE D'UN BUFFER),
FSP:     VAL         8               < L'ECHANGE EN COURS EST UNE FONCTION
                                     < SPECIALE (SI 1),
ERFUSU:  VAL         15              < UNITE NON GEREE PAR'IOCS'...
SUPATT:  WORD        0               < SEMAPHORE PRIVE DE "SUPER-ATTACHEMENT",
SEMATT:  WORD        0               < SEMAPHORE PRIVE D'"ATTACHEMENT",
SEMGEN:  WORD        0               < SEMAPHORE D'EXCLUSION D'ACCES A CETTE
                                     < RESSOURCE,
FILSEM:  DZS         NTS/NBITMO      < ET SA FILE D'ATTENTE...
LTUP:    VAL         $-STATUS        < LONGUEUR DE LA 'TUP' DU 'GPI32'...
         PAGE
<
<
<        C O M M O N   D ' I O C S  :
<
<
         DSEC        COMIOC
COMMUN:  EQU         $+128
         DZS         36
AMASK:   WORD        MASK            < MASQUAGE DES INTERRUPTIONS,
ADMASK:  WORD        DMASK           < ET DEMASQUAGE...
         DZS         12
AIPLIB:  WORD        IPLIB           < S/P DE LIBERATION DU CANAL.
AIPINI:  WORD        IPINI           < S/P D'INITIALISATION DU CANAL.
         DZS         5
AETAPE:  WORD        ETAPU           < S/P DE LECTURE DU MOT D'ETAT REEL.
         DZS         3
ALIBCN:  WORD        LIBCN
         DZS         6
AINTUP:  WORD        INITP
         DZS         11
ASPCCN:  WORD        SPCCN           < S/P DE GESTION DES REGISTRES 'HDC'.
         PAGE
<
<
<        L O C A L   D U   D R I V E R   R E E N T R A N T  :
<
<
         LOCAL
<
< INTERFACE DU DRIVER AVEC LE
< MONDE EXTERIEUR (LES 2 MOTS
< QUI SUIVENT DOIVENT ETRE LES
< PREMIERS MOTS GENERES) :
<
LOCBEN:  EQU         $+128
         WORD        DRVBEN          < POINT D'ENTREE DU DRIVER,
         BYTE        0;LTUP          < LONGUEUR DE LA 'TUP'.
<
< RELAIS DE SOUS-PROGRAMMES, ET
< DES DIFFERENTS MODULES COMPO-
< SANT LE DRIVER :
<
AFPUSI:  WORD        FPUSI1          < ACCES AU MOT D'ETAT DU COUPLEUR.
AAIGUI:  WORD        AIGUIL,X        < RELAI D'ACCES VERS LES MODULES DU
                                     < DRIVER :
AIGUIL:  WORD        FPUSI;INITIA;FPOS;ECHDP;FCLEAR;FKILL
ADEFO1:  WORD        DEFO1           < DEFAUT A L'INITIALISATION DE L'ECHANGE.
<
< DONNEES DE CONVERSION DES OCTETS EN MOTS :
<
ABUF:    WORD        BUF,X           < RELAI VERS LE BUFFER DE CONVERSION,
LBUF:    VAL         132+8*NOCMO     < LONGUEUR MAXIMALE DU BUFFER DE CONVER-
                                     < SION, CE QUI IMPLIQUE :
                                     < CONTOC<=(LBUF/NOCMO)...
LMAX:    WORD        LBUF/NOCMO      < POUR VALIDER 'CONTOC'...
<
< ZONE DE PATCH :
<
PATCHL:  EQU         $
         DZS         2
<
< BUFFER DE CONVERSION DES OCTETS EN MOTS :
<
GRAPH0:  VAL         'FFFF           < VALEUR ATTENDUE DANS LE BUFFER ARGUMENT
                                     < SUR 'LGRAPH' MOTS POUR QU'IL S'AGISSE
                                     < D'UNE DEMANDE D'ACTIVATION DU GRAPHWARE.
IGRAPH:  WORD        'BFFF;'BF1F;'BFFF;'BF17
LGRAPH:  VAL         $-IGRAPH        < DONNEES A ENVOYER POUR ACTIVER LE GRAPH-
                                     < WARE EN MODE GRAPHIQUE.
BUF:     DZS         LBUF            < QUEL DOMMAGE...
         PROG
         USE         C,COMMUN
         USE         L,LOCBEN
         USE         W,STATUS
         PAGE
<
<
<        D R I V E R   G E R A N T   U N   C O U P L E U R
<        ' G P I 3 2 '   C O N N E C T E   A   U N E
<        I M P R I M A N T E   E L E C T R O S T A T I Q U E
<                    B E N S O N  :
<
<
<        FONCTION :
<                      CE DRIVER ECRIT AUX NORMES 'IOCS'
<                    PERMET LA GESTION D'UN 'GPI32' EN
<                    MODE CANAL COUPLE A UNE IMPRIMANTE
<                    ELECTROSTATIQUE BENSON ; IL TRANSMET
<                    LES MOTS ARGUMENTS EN LEUR FAISANT
<                    SUBIR LE DECOUPAGE EN 2 MOTS INVERSES
<                    BIT A BIT SUR L'OCTET DE DROITE ; DE
<                    PLUS, LORSQUE LE BUFFER ARGUMENT
<                    FAIT 'LGRAPH' (=4) MOTS DE LONG, ET
<                    QUE CHACUN DE CES MOTS CONTIENT 'IBUF'
<                    (='FFFF), LE DRIVER 'DRVBEN' L'INTER-
<                    PRETE COMME UNE DEMANDE D'ACTIVATION
<                    DU GRAPHWARE.
<
<
<        NOTA IMPORTANT :
<                      LES ECHANGES SONT TRONQUES A LBUF/NOCMO MOTS !!!
<
<
DRVBEN:  EQU         $
         BR          &AAIGUI         < ALLONS VERS LE MODULE SPECIFIQUE (X).
<
< ZONE DE PATCH :
<
PATCH2:  EQU         $
         DZS         8
<
< CODES DE RETOUR PAR LE REGISTRE 'X' :
<
VALX0:   VAL         0               < ECHANGE EN COURS,
VALX1:   VAL         1               < RENVOI DU MOT D'ETAT DANS 'A',
VALX2:   VAL         2               < DEFAUT DU COUPLEUR,
VALX3:   VAL         3               < DEFAUT DE FONCTIONNEMENT DU CANAL,
VALX6:   VAL         6               < FIN DE FONCTION SPECIALE.
         PAGE
<
<
<        E N T R E E   D U   M O T   D ' E T A T  :
<
<
FPUSI:   EQU         $               < ENTREE AVEC (X)=0.
         LA          STATUS          < ACCES A L'ETAT COURANT :
         TBT         BITENC          < Y-A-T'IL UN ECHANGE EN COURS ???
         JNC         FPUSI1          < NON...
<
< CAS OU IL Y A UN ECHANGE EN COURS :
<
         LAI         0
         SBT         DEFO
         JMP         FPUSI2          < VERS LA SORTIE AVEC (A) NE CONTENANT
                                     < QUE LE BIT 'DEF0' A 1...
<
< CAS OU IL N'Y A PAS D'ECHANGE EN COURS :
<
FPUSI1:  EQU         $
         BSR         AETAPE          < ACCES AU MOT D'ETAT PHYSIQUE DU
                                     < COUPLEUR DANS 'A',
         SLRD        NBITMO          < A=0, ET B=MOT D'ETAT PHYSIQUE...
         TBT         NBITMO+BUSY1    < TEST DE .NOT.BUSY1 ???
         JNC         FPUSI3          < .NOT.BUSY1=0 : IL Y A UN DEFAUT...
         TBT         NBITMO+VAL1     < .NOT.BUSY1=1, TESTONS 'VAL1' ???
         JNC         FPUSI2          < .NOT.BUSY1=1 ET VAL1=0, OK...
<
< DEFAUT PHYSIQUE DU COUPLEUR :
< (VOIR 'VAL1' ET/OU .NOT.BUSY1)
<
FPUSI3:  EQU         $
         SBT         VNOOP           < ON POSITIONNE LE BIT 'VNOOP' DANS 'A',
                                     < INDIQUANT AINSI LA NON OPERATIONNALITE
                                     < DU COUPLEUR...
<
< COUPLEUR OK, ET RETOUR :
<
FPUSI2:  EQU         $
         LXI         VALX1           < X INDIQUE QUE 'A' CONTIENT 'MODEFO'...
         RSR
         PAGE
<
<
<        I N I T I A L I S A T I O N   D E   L ' E C H A N G E  :
<
<
INITIA:  EQU         $               < APPEL AVEC (X)=1.
         BSR         AFPUSI          < ACCES AU MOT D'ETAT DANS 'A',
         JAE         INIT8           < OK...
         BR          ADEFO1          < ET BIEN, IL Y A UN DEFAUT, ON VA DONC
                                     < ABORTER L'ECHANGE...
INIT8:   EQU         $
<
< CAS OU L'ETAT DU COUPLEUR EST BON :
<
         LA          CONTOC
         RBT         SENS            < A PRIORI...
         STA         CONTOC
<
< CONVERSION DES OCTETS EN MOTS :
<
         RDOE
<
<
<        A T T E N T I O N  :
<                      ENTRE 'RDOE' ET 'WOE', ETANT DONNE
<                    QUE LE BIT 'SVCS' PEUT ETRE A 1, ON NE
<                    PEUT UTILISER LA PILE, SOUS PEINE D'AVOIR
<                    UNE VIOLATION MEMOIRE, LE (SLO,SLE)
<                    QUE L'ON CALCULE N'ENCADRANT QUE LE
<                    BUFFER !!!
<
<
         STA         SAVSLO          < SAUVEGARDE DE (SLO,SLE) COURANTS...
         STB         SAVSLE          < (SANS PILE !!!)
         LB          FONC            < (B)=FONC,
         STB         SFONC           < ET SAUVEGARDE...
         LA          ADMEM           < (A)=ADMEM,
         STA         SADMEM          < ET SAUVEGARDE...
         SCRD        DADR            < (A)='SLO' BASANT LE BUFFER ARGUMENT,
         LR          B,Y             < ET SAUVEGARDE DU FUTUR DEPLACEMENT PAR
                                     < RAPPORT A 'SLO'...
         LRM         B
         WORD        LBUF/NOCMO+FADR-E/FADR
         ADR         A,B             < (B)='SLE' CLOTURANT LE BUFFER ARGUMENT,
         WOE                         < ENCADREMENT DU BUFFER ARGUMENT PAR LES
                                     < REGISTRES (SLO,SLE).
         LR          Y,B
         LAI         K
         SLLD        DADR
         LR          A,Y             < (Y)=DEPLACEMENT PAR RAPPORT A 'SLO'
                                     < PERMETTANT D'ATTEINDRE LE PREMIER MOT
                                     < DU BUFFER ARGUMENT.
         STZ         IBUF            < INITIALISATION DE L'INDEX DE 'BUF'.
         LA          CONTOC          < (A)=NOMBRE D'OCTETS ARGUMENTS A ECHANGER,
         STA         SCONT           < ET SAUVEGARDE...
         ADRI        NOCMO-E,A       < POUR CALCULER UN NOMBRE DE MOTS...
         SLRS        NOCMOK          < (A)=NOMBRE DE MOTS A ECLATER...
<
< ACTIVATION EVENTUELLE DU GRAPHWARE :
<
         CPI         LGRAPH          < (CONTOC)='LGRAPH' ???
         JNE         INIT4           < NON, C'EST LE FONCTIONNEMENT NORMAL...
         LR          A,X             < (X)=NOMBRE DE MOTS A TESTER...
         STY         SAVY            < ET SAUVEGARDE DE 'Y'...
INIT5:   EQU         $
         LAR                         < (A)=MOT COURANT DU BUFFER,
         CPI         GRAPH0          < EST-CE UNE DEMANDE D'INITIALISATION ???
         JNE         INIT6           < NON...
         ADRI        I,Y             < PEUT-ETRE, ALLONS VOIR LE MOT SUIVANT...
         JDX         INIT5           < S'IL EXISTE...
         LRM         A,B,X           < AYANT TROUVE UNE DEMANDE D'ACTIVATION
                                     < DU GRAPHWARE :
         WORD        IGRAPH;BUF;LGRAPH
         STX         CONTOC
         MOVE                        < ON INITIALISE LE BUFFER A ENVOYER...
         JMP         INIT7           < ET ON VA L'ENVOYER...
<
< MODE NORMAL TRANSPARENT :
<
INIT6:   EQU         $
         LY          SAVY            < ON RESTAURE 'Y',
         LAI         LGRAPH          < ET 'A'...
INIT4:   EQU         $
         LX          LMAX            < (X)=POUR VALIDER 'CONTOC',
         CPR         X,A             < ALORS ???
         JG          INIT2           < (X)=LE MAX ECHANGEABLE...
         LR          A,X             < OK, (X)=NOMBRE DE MOTS DEMANDES...
INIT2:   EQU         $               < (X)=MAX(CONTOC,LBUF/NOCMO)=NOMBRE
                                     < D'ITERATIONS A EFFECTUER POUR LA
                                     < CONVERSION DES MOTS EN OCTETS...
INIT3:   EQU         $               < BOUCLE DE CONVERSION : ON VA METTRE
                                     < CHAQUE OCTET ARGUMENT DANS UN MOT DE
                                     < 'BUF' (QUEL GACHIS...) :
         STX         SAVX            < SAUVEGARDE DU DECOMPTE DES ITERATIONS.
                                     < (SANS PILE !!!)
         LX          IBUF            < (X)=INDEX COURANT DE 'BUF',
         LAR                         < (A)=MOT COURANT DU BUFFER ARGUMENT DE
                                     < DEPLACEMENT (Y) PAR RAPPORT A 'SLO'...
         SLRD        NBITOC          < (A)=OCTET GAUCHE=PREMIER OCTET, ET
                                     < (B)=SAUVEGARDE DU DEUXIEME OCTET...
         EORI        MOCD            < ET EN PLUS, IL FAUT INVERSER...
         STA         &ABUF           < ET ENFIN, RANGEMENT DE L'OCTET GAUCHE
                                     < DANS 'BUF'.
         ADRI        I,X             < PROGRESSION DE L'INDEX...
         LAI         K
         SLLD        NBITOC          < (A)=OCTET DROIT,
         EORI        MOCD            < INVERSION,
         STA         &ABUF           < ET MISE DANS 'BUF'...
         ADRI        I,X             < PROGRESSION DE L'INDEX,
         STX         IBUF            < ET SAUVEGARDE...
         LX          SAVX            < RESTAURATION DU DECOMPTE DES ITERATIONS,
         ADRI        I,Y             < PASSAGE AU MOT SUIVANT DU BUFFER,
         JDX         INIT3           < S'IL EXISTE...
INIT7:   EQU         $
         LA          ABUF
         RBT         BINDEX
         STA         ADMEM           < C'EST 'BUF' QU'ON VA ECHANGER...
         LA          FONC
         ANDI        NMAE
         STA         FONC            < ET IL EST EN MEMOIRE BASSE...
         LA          SAVSLO
         LB          SAVSLE
<
<
<        A T T E N T I O N  :
<                      ON PEUT REUTILISE LA PILE
<                    ETANT DONNE QUE L'ON A RESTAURE
<                    LES REGISTRES (SLO,SLE) ARGUMENTS.
<
<
         WOE                         < ET ENFIN, RESTAURATION DE (SLO,SLE)...
<
< TRANSMISSION DES ARGUMENTS AU CANAL :
<
         LA          ADPERI
         ANDI        FPERI
         ORI         FWRITE
         STA         ADPERI          < MISE DE LA FONCTION D'ECRITURE.
         BSR         ASPCCN          < ALLOCATION D'UN JEU DE REGISTRES CANAUX
                                     < DANS LE CAS DU CANAL 'HDC'...
         LB          STATUS
         SBT         NBITMO+SPEC
         STB         STATUS          < ON MEMORISE L'ALLOCATION EVENTUELLE D'UN
                                     < JEU DE REGISTRES 'HDC'.
         BSR         AIPINI          < ET ENVOI DE 'IPI' AU CANAL...
         LA          SFONC
         STA         FONC            < RESTAURATION DE 'FONC' INITIAL,
         LA          SADMEM
         STA         ADMEM           < AINSI QUE DE 'ADMEM',
         LA          SCONT
         STA         CONTOC          < ET ENFIN DE 'CONTOC'...
         JNC         INIT1           < OK, L'INITIALISATION S'EST BIEN PASSE...
<
< CAS D'UN DEFAUT CANAL LORS DE L'INITIALISATION :
<
DEFO3:   EQU         $
         LXI         VALX3           < X=DEFAUT FONCTIONNEMENT CANAL...
         RSR
<
< OK, LE LANCEMENT DE L'ECHANGE S'EST BIEN FAIT :
<
INIT1:   EQU         $
         BSR         AMASK           < MASQUAGE DES INTERRUPTIONS,
         LA          ADPERI
         ANDI        FPERI
         ORI         FCMDE
         STA         ADPERI          < MISE EN MODE SORTIE COMMANDE...
         LAI         F3
         SIO         ADPERI          < ET LANCEMENT DE L'ECHANGE, PAR AUTORISA-
                                     < TION DES INTERRUPTIONS NORMALES DU
                                     < CANAL...
         BSR         ADMASK          < DEMASQUAGE DES INTERRUPTIONS...
         LA          ADPERI
         ANDI        FPERI
         STA         ADPERI          < ET ON CLEAR...
<
< FIN DE L'INITIALISATION DE L'ECHANGE :
<
         LR          Y,A
         LXI         VALX0           < X=ECHANGE EN COURS...
         RSR
         PAGE
<
<
<        F O N C T I O N   S P E C I A L E  :
<
<
FPOS:    EQU         $               < APPEL AVEC : (X)=2...
         LXI         VALX6           < X=FIN DE FONCTION SPECIALE...
         RSR
         PAGE
<
<
<        T R A I T E M E N T   D E S   I N T E R R U P T I O N S
<                    D E   P R O G R A M M E  :
<
<
ECHDP:   EQU         $               < APPEL AVEC : (X)=3...
         BSR         AFPUSI          < RENVOIE :
                                     < A=MOT D'ETAT 'PU',
                                     < B=MOT D'ETAT REEL,
                                     < X=VALX1.
         PSR         A               < SAVE LE MOT D'ETAT 'PU'...
         LA          ADPERI
         ANDI        FPERI
         ORI         FCMDE
         STA         ADPERI          < MISE EN MODE SORTIE FONCTION,
         LAI         F0
         SIO         ADPERI          < ET ON INHIBE LES INTERRUPTIONS OUT...
         LA          ADPERI
         ANDI        FPERI
         ORI         FFONC
         STA         ADPERI          < MISE EN MODE SORTIE COMMANDE,
         LAI         F0
         SIO         ADPERI          < ON ENVOIE UNE SIO DE FIN DE BLOC, QUI
                                     < A POUR EFFET (APRES LECTURE DU MOT
                                     < D'ETAT' D'INHIBER LES INTERRUPTIONS
                                     < NORMALE DU CANAL...
         LA          ADPERI
         ANDI        FPERI
         STA         ADPERI          < ET ON CLEAR...
         PLR         A               < RESTAURE LE MOT D'ETAT 'PU'...
         JAE         ECHDP1          < OK, TOUT S'EST BIEN PASSE...
<
< CAS DES DEFAUTS RENCONTRES EN FIN D'ECHANGE :
<
         BSR         AIPLIB          < LIBERATION DU CANAL,
         JC          DEFO3           < ET ENCORE UN, AU NIVEAU DU CANAL...
DEFO1:   EQU         $
         LB          STATUS
         SBT         NBITMO+BITDEF
         STB         STATUS          < ON LE MEMORISE DANS 'STATUS'...
         LR          A,Y
         JMP         FKILL1          < ET ON ABORTE...
<
< TRAITEMENT DE LA FIN D'ECHANGE :
<
ECHDP1:  EQU         $
         LXI         VALX6           < X=INDICATION DE FIN D'ECHANGE...
         BSR         AIPLIB          < ET ENFIN, ON FAIT LE COMPTE-RENDU...
         JC          DEFO3           < ET BIEN, IL Y A U DEFAUT CANAL !!!
         CPZ         CONTOC          < OK, COMMENT EST LE COMPTE DE MOTS
                                     < RESIDUEL ???
         JNE         DEFO3           < NON NUL, C'EST DONC UN DEFAUT CANAL...
         JMP         LIBCTX          < OK, ON VA LIBERER LE CANAL...
         PAGE
<
<
<        I N I T I A L I S A T I O N   D E   L ' U N I T E
<                    P H Y S I Q U E  :
<
<
FCLEAR:  EQU         $               < APPEL AVEC : (X)=4.
         BSR         AMASK           < MASQUAGE DES INTERRUPTIONS.
         BSR         AINTUP          < INITIALISATION DE LA 'TUP' :
                                     < SEMATT <-- 1,
                                     < SUPATT <-- 1,
                                     < SEMGEN <-- 1.
         BSR         ADMASK          < DEMASQUAGE DES INTERRUPTIONS.
         RSR
         PAGE
<
<
<        A B O R T   D ' U N   E C H A N G E  :
<
<
FKILL:   EQU         $               < APPEL AVEC : (X)=5.
         LXI         VALX2           < RETOUR AVEC : X=DEFAUT COUPLEUR...
FKILL1:  EQU         $
         LR          Y,A
         RSR
         PAGE
<
<
<        L I B E R A T I O N   D U   C A N A L  :
<
<
LIBCTX:  EQU         $
         LB          STATUS
         TBT         NBITMO+SPEC     < Y-A-T'IL EU INITIALISATION ???
         JNC         LIBCTY          < NON, RIEN A FAIRE...
         RBT         NBITMO+SPEC     < OUI,
         STB         STATUS
         BSR         ALIBCN          < ON LIBERE...
LIBCTY:  EQU         $
         RSR
         END



Copyright © Jean-François Colonna, 2022-2022.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2022-2022.