<        S I S   C M S 5   10
         PAGE
         PAGE
<
<
<        E N T R Y   A U T O R I S A T I O N   ' A L T - M O D E '  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME EST APPELE
<                    PAR LA GRAMMAIRE DU 'CCI' ; IL
<                    PERMET DE REVEILLER UN UTILISA-
<                    TEUR APRES UNE COMMANDE "!W...".
<
<
WAKUP:   EQU         $
         BSR         ASMMK           <<<< MASQUAGE GENERAL DES IT
         LA          IDESC-DCTESC,W
         RBT         IDESCA          < AUTORISATION DES 'ALT-MODE'.
         STA         IDESC-DCTESC,W
         BSR         ASMDK           <<<< DEMASQUAGE GENERAL DES IT
         RSR                         < RETOUR AU CCI.
         PAGE
<
<
<        P A T C H   M A N U E L   D E   L ' E S P A C E
<        M E M O I R E   D E   L ' E S C L A V E  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME EST APPELE
<                    PAR LA GRAMMAIRE DU 'CCI' A LA
<                    SUITE DE LA COMMANDE "!P" ; CETTE
<                    COMMANDE, EN PLUS DE BLOQUER LE
<                    SYSTEME, REND RESIDENT EN MEMOIRE
<                    MAITRE L'ESPACE MEMOIRE DE L'UTI-
<                    LISATEUR L'AYANT FRAPPEE.
<                      LA COMMANDE "!P" AVAIT ETE
<                    INTRODUITE POUR DES RAISONS HIS-
<                    TORIQUES, DU TEMPS OU LES SEULS
<                    PATCHES D'UN PROGRAMME NE POU-
<                    VAIENT QUE PASSER PAR LE PUPI-
<                    TRE...
<
<
<        I N I T I A L I S A T I O N   D U   P A T C H  :
<
<
<        ARGUMENT :
<                    (W)=ADRESSE DCT(ESCLAVE).
<
<
<        P A T C H   M A N U E L  :
<
<
<        ARGUMENT :
<                    (W)=ADRESSE DCT(ESCLAVE).
<
<
PATCH:   EQU         $
         BSR         ASYSER          < P A T C H   M A N U E L ...
<
<
<        E N T R Y   D E B U G   U T I L I S A T E U R  :
<
<
IPATCH:  EQU         $               < BLOCAGE DU SWAPPING ESCLAVE.
PATCHD:  EQU         $
         LA          FSERV-DCTESC,W  < LA ROUTINE DE FIN DE SERVICE
                                     < EST-ELLE DEJA POSITIONNEE ???
         JAE         Z1160           < NON, C'EST BON...
<
< CAS OU FSERV EST DEJA POSITIONNEE :
<
         CP          AABORT          < 2 ALT-MODES ONT-ILS ETE FRAPPES
                                     < PENDANT LE DEBUG ???
         JE          Z1160           < OUI, ON VA LES IGNORER...
         CP          AGOBPE          < 1 ALT-MODE A-T'IL ETE FRAPPE ???
         JE          Z1160           < OUI, IL EST IGNORE...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
< DEBLOCAGE DU SWAPPING ESCLAVE EN FIN DE SERVICE :
<
Z1160:   EQU         $
         LA          AISWAP
         STA         FSERV-DCTESC,W  < (RE-)POSITIONNEMENT DE FSERV.
         RSR
         CALL        #SISP CMS5 DOL1#
<
<
<        I N V E R S I O N   D U   B L O C A G E /
<        D E B L O C A G E   D U   S W A P P I N G  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME EST APPELE
<                    EN FIN DE SERVICE, A LA DEMAN-
<                    DE DU 'CCI', ET INVERSE L'ETAT
<                    DE BLOCAGE/DEBLOCAGE DU SWAPPING
<                    DE L'UTILISATEUR.
<
<
<        ARGUMENT :
<                    (W)=ADRESSE DEMSER.
<
<
ISWAP:   EQU         $
         BSR         ASMMK           <<<< MASQUAGE GENERAL DES IT
         LA          DEMSWP-DEMSER+XXNSP,W
         IBT         BINNSP          < INVERSION DU BLOCAGE/DEBLOCAGE.
         STA         DEMSWP-DEMSER+XXNSP,W
         STZ         FSERV-DEMSER,W  < RAZ DE LA ROUTINE DE FIN
                                     < DE SERVICE.
         BSR         ASMDK           <<<< DEMASQUAGE GENERAL DES IT
         RSR
         CALL        #SISP CMS5 DOL2#
         PAGE
<
<
<        D C T - T E L E T Y P E   D E   S E R V I C E  :
<
<
         CALL        #SISP CMS5 CHECK#
         CALL        #SISP CMS5 DOL1#
DCTTYS:  EQU         $
PSTTYS:  WORD        K;K;K;K;COM+DEPCS;DCTTYS;NIL;PILTYS;HANDLR;SMST;SO;SE
       #@ASCI        " TYS"          < #SISP CMS5 ASCI#
         WORD        XIOID0          < IOID.
         WORD        NFILTR
         WORD        FILTRS
         WORD        XTALOC          < ETALOC.
         WORD        XXLOC0          < SEMLOC.
         DZS         LSEM
         WORD        NIL             < TETE.
         WORD        NIL             < QUEUE.
         WORD        XXCHV0          < SCHVID.
         DZS         LSEM
         WORD        XXSIT0          < SIT.
         DZS         LSEM
         WORD        SPHEX0          < SPHEX.
         DZS         LSEM
         WORD        HDLTYS          < ES.
         WORD        ITTYS           < RIT.
         WORD        K;K             < ETAT.
         WORD        COSBT?B0SIT=FMASK(K=FCINST < BITSEM :
                                     < B0SIT=1 : REVEIL SI DEFSEC ET SI
                                     < BETA(SIT)<0
         WORD        XXNTRY;TRYVID
         WORD        K               < HSTATS.
XWOR%2:  VAL         2
         WORD        XWOR%2          < TESTO#0 : TIME-OUT A TESTER...
         WORD        COSBT?FGW=FMASK(K=FCINST
         WORD        XFONBA          < DCTFUP ("ALTITUDES" DES FONCTIONS).
<
<
<        Z O N E   V A R I A B L E  :
<
<
VARTYS:  EQU         $
         IF          VARTYS-DCTTYS-DCTFIX,,XEIF%,
         IF          ATTENTION : LA ZONE FIXE DE LA 'DCT' EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
<
< ARGUMENTS DES 'SIO' :
<
         WORD        ACTTY1?FPHCMD   < ARGUMENT DE SIO SORTIE COMMANDE
OPTYS::  VAL         $-D-VARTYS
         WORD        ACTTY1?FPHETA   < ARGUMENT SIO ENTREE MOT D'ETAT
ETATYS:: VAL         $-D-VARTYS
         WORD        ACTTY1?FPHOUT   < ARGUMENT SIO SORTIE INFORMATION
SORTYS:: VAL         $-D-VARTYS
<
< RELAIS DIVERS :
<
         WORD        NILX            < RELAI VERS LE BUFFER COURANT.
BUFTYS:: VAL         $-D-VARTYS
         WORD        DATE,X          < RELAI INDEXE VERS LA DATE/HEURE.
DATYS::  VAL         $-D-VARTYS
         WORD        TYSM1           < @ROUTINE D'ENVOI MESSAGE 1.
ATYSM1:: VAL         $-D-VARTYS
         WORD        TYSM2           < ROUTINE D'ENVOI DE MESSAGE 2.
ATYSM2:: VAL         $-D-VARTYS
<
< MESSAGES DIVERS :
<
MOTOR::  VAL         $-VARTYS        < MISE EN ROUTE DU MOTEUR.
         BYTE        W;KNUL
METYS::  VAL         $-VARTYS        < MESSAGE INITIAL VERS TTYS "!!".
XXTYS3:: VAL         6               < NOMBRE DE CARACTERES IMPRIMABLES,
XXTYS1:: VAL         4               < NOMBRE DE 'NULL'S LES PRECEDANT.
         NTRN
XXTYS1:  VAL         XXTYS1+NOCMO-E/NOCMO*NOCMO+NOCMO-Z
         TRN
         BYTE        XXTYS1+XXTYS3;KNUL  < LONGUEUR ; PREMIER CARACTERE.
         NTRN
         DO          XXTYS1/NOCMO
         BYTE        KNUL;KNUL       < MISE EN ROUTE DU MOTEUR...
         TRN
XWOR%1:  VAL         $-ZERO          < SAUVEGARDE DU '$'...
         BYTE        KCR;KLF;KPE;KPE;KNUL;KNUL < MESSAGE PROPREMENT DIT...
XWOR%2:  VAL         $-ZERO          < '$' APRES...
         IF          XWOR%2-XWOR%1*NOCMO-XXTYS3,,XEIF%,
         IF          ATTENTION : 'XXTYS3' EST MAUVAIS !!!
XEIF%:   VAL         ENDIF
X22::    VAL         HNAME-DCT0
ESCTYS:: VAL         $-VARTYS-X22
       #@ASCI        " US "          < #SISP CMS5 ASCI#
                                     < IDENTIFICATION DU NIVEAU DES
                                     < DES ESCLAVES.
         WORD        NILK
RGCC::   VAL         $-D-VARTYS      < RANG DU CARACTERE EN COURS DANS
                                     < LE BUFFER MESSAGE
         WORD        NILK
NCREST:: VAL         $-D-VARTYS      < NOMBRE DE CARACTERES RESTANT A
                                     < EMETTRE POUR LE MESSAGE EN COURS
<
<
<        P I L E  :
<
<
         CALL        #SISP CMS5 DOL2#
PILTYS:  EQU         $-DEPILE
XWPILE:  VAL         LPILEH+10
         CALL        #SISP CMS5 GENPIL2#
         CALL        #SISP CMS5 CHECK#
         PAGE
<
<
<        H A N D L E R   D E   G E S T I O N   D E
<        L A   T E L E T Y P E   D E   S E R V I C E  :
<
<
<        FONCTION :
<                      CE HANDLER EST CHARGE DE L'EMISSION/RECEPTION
<                    DES MESSAGES DE TTYS. AVANT TOUTE EMISSION DE
<                    DE MESSAGE (SI DEMANDE), LE HANDLER EMET VERS L'OPERATEUR
<                    TEUR UN MESSAGE '!!' PRECEDE DE 'RC''LF', ET
<                    SUIVIT DU NOM DU DEMANDEUR DU MESSAGE, PAR
<                    EXEMPLE :
<                                    !!LP1...
<
<                      ENSUITE 2 POSSIBILITES :
<                    1- AMDEM=K : LE HANDLER ARRETE LA SON TRAVAIL,
<                    2- AMDEM#0 : ECRITURE DU MESSAGE ARGUMENT.
<
<
         USE         W,DEM0
         USE         L,DCT0
HDLTYS:  EQU         $
<
< INITIALISATION DE LA TTYS :
<
         LAI         MOMINI          < MOT DE COMMANDE "RESET",
         SIO         VAR+OPTYS       < SIO DE COMMANDE :
                                     < AINSI, LES IT NE SONT PAS VALIDEES
                                     < POUR L'INSTANT MAIS CA NE DURERA PAS...
<
< ENVOI DES MESSAGE D'EN-TETE :
<
         LAD         VAR+MOTOR       < (A)=ADRESSE DU MESSAGE DE MISE EN ROUTE
                                     <     DU MOTEUR,
         SBT         BITX            < BIT D'INDEXATION.
         STA         VAR+BUFTYS      < GENERATION DU RELAI INDIRECT
         BSR         VAR+ATYSM2      < ET MISE EN ROUTE DU MOTEUR...
XWOR%9:  VAL         I+I
         LXI         XWOR%9
         BSR         ADODO           < ET ON FAIT UN PETIT DODO AFIN D'ATTENDRE
                                     < QUE LE MOTEUR TOURNE...
         LAD         VAR+METYS       < (A)=@EN-TETE DES MESSAGES OPERATEUR
         SBT         BITX            < BIT D'INDEXATION.
         STA         VAR+BUFTYS      < GENERATION DU RELAI INDIRECT
                                     < INDEXE VERS L'EN-TETE.
         BSR         VAR+ATYSM2      < ENVOI DE '!!'.
<
< ENVOI DE LA DATE ET DE L'HEURE :
<
         LA          VAR+DATYS       < ACCES AU RELAI INDEX DATE/HEURE.
         STA         VAR+BUFTYS      < GENERATION DU RELAI VERS LE
                                     < BUFFER TYS COURANT.
         LBI         LKDATE          < NBRE DE CARACTERES DU MESSAGE
                                     < DE DATE/HEURE.
         LXI         K               < INDEX 1ER CARACTERE DE LA DATE.
         BSR         VAR+ATYSM1      < ENVOI DE LA DATE ET DE L'HEURE.
<
< ENVOI DE L'IDENTIFICATEUR DU DEMANDEUR :
<
         LA          ARGDEM+ETADEM   < (A)=NSP DU DEMANDEUR.
         CPI         NSPACT          < EST-CE LE NIVEAU ESCLAVE (PAR
                                     < HANDLER DE SERVICE INTERPOSE...)
         JE          E875            < OUI.
<
< CAS D'UN HANDLER SYSTEME :
<
         LR          A,X             < (X)=NSP DU HANDLER SYSTEME
                                     <     DEMANDEUR DE TTYS (TTY1).
         PSR         L
         BSR         ACADCT          < (A)=@DCT-DEMANDEUR (X).
         PLR         L
         JMP         E860
<
< CAS D'UN ESCLAVE DEMANDEUR :
<
E875:    EQU         $
         LAD         VAR+ESCTYS      < DANS LE CAS OU @DCT=K, C'EST
                                     < LE NIVEAU ESCLAVE QUI APPELLE
                                     < PAR HANDLER DE SERVICE INTERPOSE.
E860:    EQU         $
         ADRI        HNAME-DCT0,A    < (A)=@NOM DU DEMANDEUR.
         SBT         BITX            < BIT D'INDEXATION.
         STA         VAR+BUFTYS      < GENERATION DU RELAI INDIRECT
                                     < INDEXE VERS L'IDENTIFICATEUR
                                     < DU DEMANDEUR.
         BSR         VAR+ATYSM2      < ENVOI IDENTIFICATEUR.
<
< E/S TTYS PROPREMENT DITE :
<
         LA          ARGDEM+AMDEM    < UN ECHANGE EST-IL REELLEMENT
                                     < DEMANDE ???
         JAE         E827            < NON, ON ARRETE LA...
<
< PREPARATION DE L'E/S :
<
         BSR         AMEM            < RENVOIE :
                                     < (A)=RELAI INDIRECT INDEXE VERS
                                     <     LE BUFFER DEMANDEUR,
                                     < (X)=K OU 1 SUIVANT QUE LE 1ER
                                     <     OCTET EST GAUCHE OU DROIT.
         STA         VAR+BUFTYS      < GENERATION DU RELAI VERS LE
                                     < BUFFER DEMANDEUR.
         LB          ARGDEM+CODEM    < (B)=COMPTE OCTET SUPPOSE VALIDE.
         CPZR        B
         JG          SYSR91          < OK.
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      METTRE UN BON 'CODEM'...
<
SYSR91:  EQU         $
         LA          ARGDEM+OPDEM    < TEST DU SENS DE L'ECHANGE.
         CPI         FGW
         JE          SYSR92          < C'EST UNE ECRITURE, OK.
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
SYSR92:  EQU         $
<
<        E N V O I   D ' U N   M E S S A G E  :
<
         BSR         VAR+ATYSM1      < ENVOI DU MESSAGE DEMANDEUR.
<
< SORTIE DU HANDLER :
<
E827:    EQU         $
<
< RAZ DE L'ETAT :
<
         STZ         ETAT0
         RSR
<
<
<        E N V O I   D E   M E S S A G E S   S U R   T T Y S  :
<
<
<
<        M E S S A G E 1  :
<
<
<        ARGUMENTS :
<                    (B)=COMPTE OCTETS,
<                    (X)=RANG DU 1ER OCTET DANS LE BUFFER,
<                    BUFTYS=ADRESSE DU BUFFER DU MESSAGE.
<
<
TYSM1:   EQU         $
<
<        NOTA :
<                      ON VALIDE LES INTERRUPTIONS 'TTYS'
<                    ENTRE CHAQUE CARACTERE, CAR EN EFFET,
<                    LE 'RECOVERY' PEUT PASSER ENTRE CHAQUE
<                    CARACTERE...
<
         STX         VAR+RGCC        < RANG CARACTERE EN COURS (INDEX).
XXTYS2:: VAL         2               < INCREMENT TRES UTILE DU NOMBRE D'OCTETS
                                     < REEL DU MESSAGE...
         IF          XXTYS2,,XEIF%,
         ADRI        XXTYS2,B        < UTILE ??!?!???!
XEIF%:   VAL         ENDIF
         STB         VAR+NCREST      < NOMBRE DE CARACTERES RESTANT A ECHANGER.
<
< BOUCLE CARACTERE PAR CARACTERE :
<
TYSM1A:  EQU         $
         LAI         MOMRW?MOMSTR    < MOT DE COMMANDE 'VALIT OUT',
         SIO         VAR+OPTYS       < SIO DE COMMANDE : LES IT SONT VALIDEES...
         BSR         ACSWIT          < ON ATTEND L'INTERRUPTION ; ON RAPPELLE
                                     < QUE C'EST DANS LA TACHE HARDWARE ASSO-
                                     < CIEE QUE SE FONT LES 'SIO' D'ECHANGE,
                                     < AINSI QUE L'INCREMENTATION DE 'RGCC',
                                     < ET LA DECREMENTATION DE 'NCREST'.
         CPZ         VAR+NCREST      < TEST DU COMPTE DE CARACTERE RESIDUEL ???
         JG          TYSM1A          < L'INTERRUPTION EST ARRIVEE, MAIS, CE
                                     < N'EST PAS ENCORE LA FIN D'ECHANGE...
<
< SORTIE :
<
         RSR                         < L'IT EST ARRIVEE ET C'EST LA FIN
                                     < DE L'ECHANGE.
<
<
<        M E S S A G E 2  :
<
<
<        ARGUMENTS :
<                    BUFTYS=ADRESSE DU BUFFER DU MESSAGE,
<                    OCTET0(MESSAGE)=COMPTE D'OCTETS.
<
<
TYSM2:   EQU         $
         LXI         K               < INDEX D'ACCES AU COMPTE
                                     < D'OCTETS DU MESSAGE.
         LBY         &VAR+BUFTYS     < COMPTE D'OCTETS
         CPI         HZERO           < TEST DU COMPTE D'OCTETS : SI CELUI-CI
                                     < EST INFERIEUR AU CODE DU "0", IL EST
                                     < PRIS TEL QUEL, SINON, IL EST CONSIDERE
                                     < COMME ETANT EXPRIME EN ASCI, ET DONC
                                     < CONVERTI...
         JL          E835XX          < (A)=COMPTE D'OCTETS REELS...
         ANDI        BIT>NBITCX-N    < ON NE CONSERVE QUE LES BITS 12-15.
E835XX:  EQU         $
         LR          A,B             < (B)=LONGUEUR DU MESSAGE
XXTYS4:: VAL         MOCG=K/NBITOC   < LES NOMS DE 'HDL' COMMENCENT SUR
                                     < L'OCTET1 ET NON L'OCTET0.
         LXI         XXTYS4          < (X)=RANG DU 1ER CARACTERE DU MESSAGE
         BSR         VAR+ATYSM1      < ENVOI DU MESSAGE A TTYS.
         RSR
<
<
<        I N T E R R U P T I O N S   T T Y S  :
<
<
<        ARGUMENTS:
<                    (B)=0 : SOUS-NIVEAU NORMAL,
<                       =1 : SOUS-NIVEAU D'EXCEPTION.
<
<                    VAR+BUFTYS : RELAI INDEXE VERS LE MESSAGE A EMETTRE,
<                    VAR+RGCC   : INDEX DU CARACTERE COURANT,
<                    VAR+NCREST : NOMBRE DE CARACTERES ENCORE A EMETTRE.
<
<
<        TRAITEMENT:
<
<                    1 - POUR UN SOUS-NIVEAU NORMAL :
<                    ON EMET LE CARACTERE COURANT, ON
<                    INCREMENTE 'RGCC' ET ON DECREMEN-
<                    TE 'NCREST'.
<
<                    2 - POUR UN SOUS-NIVEAU D'EXCEP-
<                    TION : ON LIT LE MOT D'ETAT POUR
<                    FAIRE RETOMBER LE SOUS-NIVEAU.
<
<                      DANS LES DEUX CAS, ON REVEILLE
<                    BIEN ENTENDU LE 'HANDLER'...
<
<
<        RAPPEL:
<                      LE SOUS-NIVEAU NORMAL RESTE DEMANDEUR JUSQU'A
<                    L'EXECUTION D'UN SIO D'ECHANGE.
<                      LE SOUS-NIVEAU EXCEPTION RESTE DEMANDEUR JUSQU'A
<                    L'EXECUTION D'UN SIO D'ENTREE MOT D'ETAT.
<
<
ITTYS:   EQU         $
         CPZR        B               < ALORS SOUS-NIVEAU NORMAL OU EXCEPTION ???
         JNE         E835            < SOUS-NIVEAU D'EXCEPTION...
<
< SOUS-NIVEAU NORMAL,
< ON VA ECHANGER UN CARACTERE :
<
         DC          VAR+NCREST      < NOMBRE DE CARACTERES RESTANT...
         LA          VAR+NCREST      < NOMBRE DE CARACTERES RESTANT,
         CPI         XXTYS2          < EST-ON SUR LES CARACTERES RESIDUELS ???
         JGE         E835X           < NON, LE MESSAGE PROPREMENT DIT...
         JAGE        E835Y           < OUI, ET CE SONT DES 'NULL'S...
         LAI         MOMINI          < C'EST FINI, ON FAIT 'RESET'...
         SIO         VAR+OPTYS
         JMP         E834            < VERS LE TEST DE L'ECHANGE EN COURS...
E835Y:   EQU         $
         LAI         KNUL            < (A)=CARACTERE A EMETTRE='NULL'.
         JMP         E835Z           < ALLONS EMETTRE...
E835X:   EQU         $
         LX          VAR+RGCC        < RANG CARACTERE EN COURS,
         LBY         &VAR+BUFTYS     < (A)=CARACTERE A EMETTRE...
E835Z:   EQU         $
         SIO         VAR+SORTYS      < SORTIE DU CARACTERE COURANT...
         IC          VAR+RGCC        < ET PASSAGE AU CARACTERE SUIVANT...
         JMP         E834            < VERS LA SORTIE...
<
< SOUS-NIVEAU D'EXCEPTION :
<
E835:    EQU         $
         SIO         VAR+ETATYS      < ENTREE DU MOT D'ETAT :
         TBT         ETACAD          < TEST DE 'FORMAT ERROR' ???
         JNC         SYSR93          < NON, OK...
         BSR         ASYSER          < E R R E U R   F A T A L E ...
SYSR93:  EQU         $
         TBT         ETABRK          < TEST DE L'ERREUR DE CADENCE ???
         JNC         SYSR94          < NON, OK...
         BSR         ASYSER          < E R R E U R   F A T A L E ...
SYSR94:  EQU         $
<
< FIN DE TRAITEMENT :
<
E834:    EQU         $
         BSR         ATEC            < Y A-T-IL UN ECHANGE EN COURS?
         JE          E8341           < NON NE RIEN FAIRE, C'EST UNE INTERRUP-
                                     < TION PARASITE...
         BSR         ARVHDL          < OUI, DANS LES DEUX CAS, ON REVEILLE LE
                                     < HANDLER 'HDLTYS'...
E8341:   EQU         $
         RSR
         PAGE
<
<
<        M E S S A G E   D E   ' J E '   E T   ' E J '
<                    V E R S   ' T Y S '  :
<
<
<        ARGUMENTS :
<                    (W)=ADRESSE DEMANDE VERS 'TYS',
<                    (Y)=ADRESE DCT(PERIPHERIQUE-IN).
<
<
MJEEJ:   EQU         $
         LR          Y,A             < (A)=ADRESSE DE LA 'DCT' DU PERIPHERIQUE
                                     <     D'ENTREE (DIT "IN"),
         SLLS        NOCMO=K         < ET CONVERSION EN UNE ADRESSE-OCTET.
X21::    VAL         HNAME-DCT0
X21:     VAL         X21*NOCMO+XXTYS4
         ADRI        X21,A           < (A)=ADRESSE-OCTET DU NOM DU PERIPHERI-
                                     <     QUE "IN".
         STA         ARGDEM+AMDEM    < ET MISE DANS LA DEMANDE A TTYS.
         BSR         ACHAND          < ENVOI DE LA DEMANDE SUR TTYS.
         BSR         ACHANW          < ATTENTE DE LA FIN DE SORTIE DU
                                     < MESSAGE DE JE SUR TTYS.
         RSR
         PAGE
<
<
<        C O N S T A N T E S   B A N D E S   M A G N E T I Q U E S  :
<
<
PILEMT:: VAL         20              < INCREMENT DE GENERATION DE LA PILE
                                     < DU DEROULEUR DE BANDES MAGNETIQUES.
XXMT1::  VAL         200             < DETECTEUR DE TIME-OUT : IL EST TRES
                                     < GRAND PARCE QUE LA BANDE EST LONGUE !!!
XXMT3::  VAL         4               < SOUS-DETECTEUR DE TIME-OUT UTILISE PAR
                                     < 'MTLAN' LORS D'OPERATION DONT ON
                                     < CONNAIT LA DUREE...
XXMT4::  VAL         6               < INCREMENT DU SOUS-DETECTEUR DE TIME-OUT ;
                                     < EN EFFET, SI L'ON SE TROUVE EN TIME-OUT
                                     < ON SE TROUVE EN GENERAL SUR UNE PARTIE
                                     < VIERGE DE BANDE MAGNETIQUE ; SOIT 'L'
                                     < LA LONGUEUR QU'ON A AINSI PARCOURU ;
                                     < LA FONCTION SUIVANTE PEUT ELLE AUSSI
                                     < SE METTRE EN TIME-OUT. IL FAUT DONC
                                     < QUE PROGRESSEIVEMENT LE DETECTEUR
                                     < AUGMENTE D'AMPLITUDE AFIN QU'UNE
                                     < FONCTION ALLANT DANS L'AUTRE SENS AIT
                                     < LE TEMPS DE PARCOURIR AU MOINS 'L' (DANS
                                     < LE CAS D'UN SEUL TIME-OUT), AFIN DE
                                     < SORTIR DE LA ZONE VIERGE...
         IF          XXMT4-XXMT3,,,XEIF%
         IF          ATTENTION, L'INCREMENT DOIT ETRE DE DUREE
         IF          SUPERIEUR A LA VALEUR DE BASE !!!
XEIF%:   VAL         ENDIF
XNMT0::  VAL         K               < NUMERO DE L'UNITE DE DEROULEUR SUR
                                     < LE COULPEUR 'MT1',
XUNMT0:: VAL         '6000           < EMPLCAEMENT DE CE NUMERO POUR LA
                                     < FONCTION 'F5',
XUBMT0:: VAL         0               < BIT SELECTIONNANT POUR 'F5' LA DENSITE
                                     < D'ENREGISTREMENT : 0=1600 BPI ET SINON
                                     < 1=800 BPI,
XWOR%1:  VAL         XUNMT0=K
XWOR%2:  VAL         XNMT0>XWOR%1    < CADRAGE DU NUMERO D'UNITE,
XUMT0::  VAL         CORBT?XUBMT0=FMASK(K?XWOR%2=FCINST
                                     < ARGUMENT DE LA FONCTION 'F5' : 1600 BPI
                                     < SUR L'UNITE 0...
<
< FONCTIONS D'ACCES AU HANDLER 'MT1' :
<
XFMTR::  VAL         FGR             < FONCTION DE LECTURE SEQUENTIELLE.
XFMTW::  VAL         FGW             < FONCTION D'ECRITURE SEQUENTIELLE.
XFMTAD:: VAL         XBITQ           < BIT DISCRIMINANT LES ACCES SEQUENTIELS
                                     < DES ACCES DIRECTS ; ON PREND 'XBITQ',
                                     < AFIN DE POUVOIR ECHANGER 'DKU' ET 'MT1'..
XFMTRA:: VAL         COSBT?XFMTAD=FMASK(K?XFMTR=FCINST
                                     < FONCTION DE LECTURE A ACCES DIRECT.
XFMTWA:: VAL         COSBT?XFMTAD=FMASK(K?XFMTW=FCINST
                                     < FONCTION D'ECRITURE A ACCES DIRECT.
XFMTRW:: VAL         '03             < FONCTION DE REMBOBINAGE ('REWIND').
XFMTTM:: VAL         '04             < FONCTION D'ECRITURE D'UN 'TAPE-MARK'.
XFMTPO:: VAL         '05             < FONCTION D'ACCES AU NUMERO DE BLOC
                                     < COURANT SUR LA BANDE.
XFMTFB:: VAL         '06             < POSITIONNEMENT DE LA BANDE DERRIERE
                                     < LE PROCHAIN 'TAPE-MARK'.
XFMINI:: VAL         '07             < FONCTION TRES SPECIALE, QUI N'A D'INTERET
                                     < QU'APRES LE "!ASSIGN X=MT1", ET QUI
                                     < SUPPRIME LE REMBOBINAGE QUI LE SUIT
                                     < LORS DU PREMIER ECHANGE...
XFMATV:: VAL         '0B             < DEMANDE D'ACCES A 'MEMTV' LORS DES
                                     < ENTREES-SORTIES, PLUTOT QU'A L'ESPACE
                                     < UTILISATEUR...
XFMA0::  VAL         '0C             < DEMANDE D'ACCES A L'ESPACE UTILISATEUR
                                     < LORS DES ENTREES-SORTIES (IL S'AGIT LA
                                     < DE L'ETAT INITIAL...).
XWOR%3:  VAL         K
XWOR%3:  VAL         COSBT?XFMTR=FMASK(K?XWOR%3=FCINST
XWOR%3:  VAL         COSBT?XFMTW=FMASK(K?XWOR%3=FCINST
XWOR%3:  VAL         COSBT?XFMTRA=FMASK(K?XWOR%3=FCINST
XWOR%3:  VAL         COSBT?XFMTWA=FMASK(K?XWOR%3=FCINST
XWOR%3:  VAL         COSBT?XFMTRW=FMASK(K?XWOR%3=FCINST
XWOR%3:  VAL         COSBT?XFMTTM=FMASK(K?XWOR%3=FCINST
XWOR%3:  VAL         COSBT?XFMTPO=FMASK(K?XWOR%3=FCINST
XWOR%3:  VAL         COSBT?XFMTFB=FMASK(K?XWOR%3=FCINST
XWOR%3:  VAL         COSBT?XFMINI=FMASK(K?XWOR%3=FCINST
XWOR%3:  VAL         COSBT?XFMATV=FMASK(K?XWOR%3=FCINST
XWOR%3:  VAL         COSBT?XFMA0=FMASK(K?XWOR%3=FCINST
XXMT2::  VAL         XWOR%3          < LISTE DES FONCTIONS RECONNUES.
<*******************************************************************************
XWOR%F:  VAL         XFMTR
XFMTR:  @VAL         '0@@@@          < FONCTION DE LECTURE SEQUENTIELLE 'MT'.
         CALL        #SISP CMS5 GEN CTE#
<*******************************************************************************
<*******************************************************************************
XWOR%F:  VAL         XFMTW
XFMTW:  @VAL         '0@@@@          < FONCTION D'ECRITURE SEQUENTIELLE 'MT'.
         CALL        #SISP CMS5 GEN CTE#
<*******************************************************************************
<*******************************************************************************
XWOR%F:  VAL         XFMTRA
XFMTRA: @VAL         '0@@@@          < FONCTION DE LECTURE ALEATOIRE 'MT'.
         CALL        #SISP CMS5 GEN CTE#
<*******************************************************************************
<*******************************************************************************
XWOR%F:  VAL         XFMTWA
XFMTWA: @VAL         '0@@@@          < FONCTION D'ECRITURE ALEATOIRE 'MT'.
         CALL        #SISP CMS5 GEN CTE#
<*******************************************************************************
<*******************************************************************************
XWOR%F:  VAL         XFMTRW
XFMTRW: @VAL         '0@@@@          < FONCTION DE REMBOBINAGE 'MT'.
         CALL        #SISP CMS5 GEN CTE#
<*******************************************************************************
<*******************************************************************************
XWOR%F:  VAL         XFMTTM
XFMTTM: @VAL         '0@@@@          < FONCTION D'ECRITURE D'UN 'TAPE-MARK'.
         CALL        #SISP CMS5 GEN CTE#
<*******************************************************************************
<*******************************************************************************
XWOR%F:  VAL         XFMTPO
XFMTPO: @VAL         '0@@@@          < FONCTION D'ACCES AU NUMERO DE BLOC.
         CALL        #SISP CMS5 GEN CTE#
<*******************************************************************************
<*******************************************************************************
XWOR%F:  VAL         XFMTFB
XFMTFB: @VAL         '0@@@@          < POSITIONNEMENT DERRIERE UN 'TAPE-MARK'.
         CALL        #SISP CMS5 GEN CTE#
<*******************************************************************************
<*******************************************************************************
XWOR%F:  VAL         XFMINI
XFMINI: @VAL         '0@@@@          < SUPPRESSION DE 'RW' APRES "!ASSIGN".
         CALL        #SISP CMS5 GEN CTE#
<*******************************************************************************
<*******************************************************************************
XWOR%F:  VAL         XFMATV
XFMATV: @VAL         '0@@@@          < DEMANDE D'ACCES A 'MEMTV'.
         CALL        #SISP CMS5 GEN CTE#
<*******************************************************************************
<*******************************************************************************
XWOR%F:  VAL         XFMA0
XFMA0:  @VAL         '0@@@@          < DEMANDE DE RETOUR A L'ESPACE UTILISATEUR.
         CALL        #SISP CMS5 GEN CTE#
<*******************************************************************************
<
< "ALTITUDE" DES FONCTIONS :
<
XWOR%3:  VAL         K
XWOR%3:  VAL         COSBT?XFMTR=FMASK(K?XWOR%3=FCINST
XWOR%3:  VAL         COSBT?XFMTW=FMASK(K?XWOR%3=FCINST
XWOR%3:  VAL         COSBT?XFMTRA=FMASK(K?XWOR%3=FCINST
XWOR%3:  VAL         COSBT?XFMTWA=FMASK(K?XWOR%3=FCINST
XWOR%3:  VAL         COSBT?XFMTRW=FMASK(K?XWOR%3=FCINST
XWOR%3:  VAL         COSBT?XFMTTM=FMASK(K?XWOR%3=FCINST
XWOR%3:  VAL         COSBT?XFMTPO=FMASK(K?XWOR%3=FCINST
XWOR%3:  VAL         COSBT?XFMTFB=FMASK(K?XWOR%3=FCINST
XWOR%3:  VAL         COSBT?XFMINI=FMASK(K?XWOR%3=FCINST
XWOR%3:  VAL         COSBT?XFMATV=FMASK(K?XWOR%3=FCINST
XWOR%3:  VAL         COSBT?XFMA0=FMASK(K?XWOR%3=FCINST
XXMTUP:: VAL         XWOR%3          < LISTE DES ALTITUDES PAR FONCTION...
<
< FORMAT DE LA COMMANDE DE CHARGEMENT :
<
MTREV::  VAL         0               < BIT DE SENS (0=AVANT, 1=ARRIERE).
MTWCCM:: VAL         1               < ECRITURE D'UN ENREGISTREMENT.
MTWFM::  VAL         2               < ECRITURE D'UN 'TAPE-MARK'.
MTGAP::  VAL         3               < INSCIPTION D'UN 'GAP'.
MTFSR::  VAL         4               < SAUT EN AVANT.
MTRCC::  VAL         5               < LECTURE D'UN ENREGISTREMENT.
MTCLR::  VAL         6               < CLEAR...
MTREW::  VAL         7               < REMBOBINAGE.
MTOFL::  VAL         8               < MISE OFF-LINE.
MTSTM::  VAL         9               < SAUT DE 'TAPE-MARK'.
MTTHR1:: VAL         11              < LECTURE SEUIL HAUT, PERMET LA VALIDATION
                                     < D'UNE ECRITURE...
MTTHR2:: VAL         12              < LECTURE SEUIL BAS...
MTEDIT:: VAL         13              < PERMET LES ENREGISTREMENTS EN MODE "EDIT"
MTTRD::  VAL         14              < FONCTION DE MAINTENANCE ET DE DIAGNOSTIC,
                                     < QUI PERMET L'ACCES AUX POSTAMBULES...
MTSTSP:: VAL         15              < UTILISE POUR LES SAUTS...
<
< DIFFERENTES COMMANDES DE CHARGEMENT (POUR 'MTF7') :
<
XWOR%1:  VAL         K
XWOR%1:  VAL         COSBT?MTRCC=FMASK(K?XWOR%1=FCINST
XWOR%1:  VAL         COSBT?MTTRD=FMASK(K?XWOR%1=FCINST
MT0402:: VAL         XWOR%1          < 'TEST READ FORWARD' : TEST EN LECTURE
                                     < VANT (POUR LA MAINTENANCE).
XWOR%1:  VAL         K
XWOR%1:  VAL         COSBT?MTRCC=FMASK(K?XWOR%1=FCINST
MT0400:: VAL         XWOR%1          < 'READ FORWARD' : LECTURE AVANT D'UN BLOC.
XWOR%1:  VAL         K
XWOR%1:  VAL         COSBT?MTREV=FMASK(K?XWOR%1=FCINST
XWOR%1:  VAL         COSBT?MTRCC=FMASK(K?XWOR%1=FCINST
MT8400:: VAL         XWOR%1          < 'READ REVERSE' : LECTURE ARRIERE D'UN
                                     < BLOC.
XWOR%1:  VAL         K
XWOR%1:  VAL         COSBT?MTWCCM=FMASK(K?XWOR%1=FCINST
MT4000:: VAL         XWOR%1          < 'WRITE ONE RECORD' : ECRITURE D'UN BLOC
                                     < DANS LE SENS AVANT.
XWOR%1:  VAL         K
XWOR%1:  VAL         COSBT?MTWCCM=FMASK(K?XWOR%1=FCINST
XWOR%1:  VAL         COSBT?MTEDIT=FMASK(K?XWOR%1=FCINST
MT4004:: VAL         XWOR%1          < 'WRITE EDIT ONE RECORD' : ECRITURE
                                     < D'UN BLOC DANS LE SENS AVANT DANS LE
                                     < MODE EDITION.
XWOR%1:  VAL         K
XWOR%1:  VAL         COSBT?MTFSR=FMASK(K?XWOR%1=FCINST
MT0800:: VAL         XWOR%1          < 'SPACE FORWARD ONE RECORD' : SAUT AVANT
                                     < D'UN BLOC.
XWOR%1:  VAL         K
XWOR%1:  VAL         COSBT?MTFSR=FMASK(K?XWOR%1=FCINST
XWOR%1:  VAL         COSBT?MTSTSP=FMASK(K?XWOR%1=FCINST
MT0801:: VAL         XWOR%1          < 'SPACE FORWARD N RECORDS' : SAUT EN AVANT
                                     < DE N BLOCS.
XWOR%1:  VAL         K
XWOR%1:  VAL         COSBT?MTFSR=FMASK(K?XWOR%1=FCINST
XWOR%1:  VAL         COSBT?MTSTM=FMASK(K?XWOR%1=FCINST
XWOR%1:  VAL         COSBT?MTSTSP=FMASK(K?XWOR%1=FCINST
MT0841:: VAL         XWOR%1          < 'SPACE FORWARD ONE TAPE-MARK' : SAUT EN
                                     < AVANT D'UN 'TAPE-MARK'.
XWOR%1:  VAL         K
XWOR%1:  VAL         COSBT?MTREV=FMASK(K?XWOR%1=FCINST
MT8000:: VAL         XWOR%1          < 'SPACE REVERSE ONE RECORD' : SAUT EN
                                     < ARRIERE D'UN BLOC.
XWOR%1:  VAL         K
XWOR%1:  VAL         COSBT?MTREV=FMASK(K?XWOR%1=FCINST
XWOR%1:  VAL         COSBT?MTSTSP=FMASK(K?XWOR%1=FCINST
MT8001:: VAL         XWOR%1          < 'SPACE REVERSE N RECORDS' : SAUT EN
                                     < ARRIERE DE 'N' BLOCS.
XWOR%1:  VAL         K
XWOR%1:  VAL         COSBT?MTREV=FMASK(K?XWOR%1=FCINST
XWOR%1:  VAL         COSBT?MTSTM=FMASK(K?XWOR%1=FCINST
XWOR%1:  VAL         COSBT?MTSTSP=FMASK(K?XWOR%1=FCINST
MT8041:: VAL         XWOR%1          < 'SPACE REVERSE ONE TAPE-MARK' : SAUT EN
                                     < ARRIERE D'UN 'TAPE-MARK'.
XWOR%1:  VAL         K
XWOR%1:  VAL         COSBT?MTREV=FMASK(K?XWOR%1=FCINST
XWOR%1:  VAL         COSBT?MTEDIT=FMASK(K?XWOR%1=FCINST
MT8004:: VAL         XWOR%1          < 'SPACE REVERSE EDIT MODE' : SAUT EN
                                     < ARRIERE D'UN BLOC EN MODE EDIT.
XWOR%1:  VAL         K
XWOR%1:  VAL         COSBT?MTWFM=FMASK(K?XWOR%1=FCINST
MT2000:: VAL         XWOR%1          < 'WRITE TAPE-MARK' : ECRITURE D'UN 'TAPE-
                                     < MARK'.
XWOR%1:  VAL         K
XWOR%1:  VAL         COSBT?MTGAP=FMASK(K?XWOR%1=FCINST
MT1000:: VAL         XWOR%1          < 'ERASE THREE INCHES GAP' : INSCRIPTION
                                     < D'UN GAP DE 3 POUCES.
XWOR%1:  VAL         K
XWOR%1:  VAL         COSBT?MTWFM=FMASK(K?XWOR%1=FCINST
XWOR%1:  VAL         COSBT?MTGAP=FMASK(K?XWOR%1=FCINST
MT3000:: VAL         XWOR%1          < 'ERASE THREE INCHES GAP AND WRITE ONE
                                     < TAPE-MARK'.
XWOR%1:  VAL         K
XWOR%1:  VAL         COSBT?MTWCCM=FMASK(K?XWOR%1=FCINST
XWOR%1:  VAL         COSBT?MTGAP=FMASK(K?XWOR%1=FCINST
MT5000:: VAL         XWOR%1          < 'ERASE THREE INCHES GAP AND WRITE ONE
                                     < RECORD'.
XWOR%1:  VAL         K
XWOR%1:  VAL         COSBT?MTREW=FMASK(K?XWOR%1=FCINST
MT0100:: VAL         XWOR%1          < 'REWIND'.
XWOR%1:  VAL         K
XWOR%1:  VAL         COSBT?MTOFL=FMASK(K?XWOR%1=FCINST
MT0080:: VAL         XWOR%1          < 'OFF-LINE'.
XWOR%1:  VAL         K
XWOR%1:  VAL         COSBT?MTREW=FMASK(K?XWOR%1=FCINST
XWOR%1:  VAL         COSBT?MTOFL=FMASK(K?XWOR%1=FCINST
MT0180:: VAL         XWOR%1          < 'REWIND THEN OFF-LINE'.
XWOR%1:  VAL         K
XWOR%1:  VAL         COSBT?MTCLR=FMASK(K?XWOR%1=FCINST
MT0200:: VAL         XWOR%1          < 'CLEAR'.
<
< FORMAT DE LA COMMANDE DE LANCEMENT :
<
MTL11::  VAL         11
MTL12::  VAL         12
MTL13::  VAL         13
MTL15::  VAL         15
<
< DIFFERENTES COMMANDES DE LANCEMENT (POUR 'MTF3') :
<
XWOR%1:  VAL         K
XWOR%1:  VAL         COSBT?MTL11=FMASK(K?XWOR%1=FCINST
MT0010:: VAL         XWOR%1          < COMMANDE 'CLEAR POGRAMME'.
XWOR%1:  VAL         K
XWOR%1:  VAL         COSBT?MTL13=FMASK(K?XWOR%1=FCINST
XWOR%1:  VAL         COSBT?MTL15=FMASK(K?XWOR%1=FCINST
MT0005:: VAL         XWOR%1          < COMMANDE 'LANCEMENT FONCTION'.
XWOR%1:  VAL         K
XWOR%1:  VAL         COSBT?MTL12=FMASK(K?XWOR%1=FCINST
XWOR%1:  VAL         COSBT?MTL15=FMASK(K?XWOR%1=FCINST
MT0009:: VAL         XWOR%1          < COMMANDE 'FIN DE BLOC'.
<
< FORMAT DU MOT D'ETAT 'A' (ON DISPOSE DEJA
< DES BITS 'ETAOPE', 'ETAFBK', 'ETAVIO',
< 'ETAPAR', 'ETACAD' ET 'ETADEF') :
<
ETMT10:: VAL         10              < DOIT ETRE A 0 ET INDIQUE 1600 BPI...
ETMT9::  VAL         9               < DONNE LA PARITE DU NOMBRE D'OCTETS LUS
                                     < DANS UN BLOC.
ETMT8::  VAL         ETARIL          < ETMT8=1 : ON VIENT DE DETECTER LE STICKER
                                     < DE FIN DE BANDE EN MARCHE AVANT.
ETMT7::  VAL         ETAFBS          < ETMT7=1 : LE DEROULEUR EST EN DEBUT
                                     < DE BANDE.
ETMT6::  VAL         ETABRK          < ETMT6=1 LORSQUE :
                                     < - ON VIENT D'ECRIRE UN 'TAPE-MARK',
                                     < - ON VIENT DE SAUTER UN 'TAPE-MARK',
                                     < - ON VIENT DE LIRE UN 'TAPE-MARK'.
ETMT5::  VAL         ETADOG          < INDIQUE QUE LA COMMANDE EST REJETEE
                                     < PARCE QUE :
                                     < - LE DEROULEUR EST OFF-LINE,
                                     < - UN REMBOBINAGE EST EN COURS,
                                     < - UN RETOUR ARRIERE EST DEMANDE ALORS
                                     <   QU'ON EST AU DEBUT DE BANDE,
                                     < - ON VEUT ECRIRE SUR UNE BANDE PROTEGEE.
ETMT4::  VAL         4               < ETMT4=0 : LE DEROULEUR NE PEUT RECEVOIR
                                     <           AUCUN ORDRE, ON TROUVE DONC
                                     <           ICI LE SIGNAL.NOT.OCCAR.
<
< 'ETAT' LORSQUE LA DEMANDE
< COURANTE EST ABORTEE :
<
XETATX:: VAL         XTOSIT-I        < VALEUR DONNEE A 'ETAT0' LORSQUE LA DEMAN-
                                     < DE COURANTE (LONGUE EN GENERAL) A ETE
                                     < ABORTEE VIA SON BIT 'XBABOR'...
<
< LISTE DES ERREURS RECONNUES :
<
<*******************************************************************************
ERMT1::  VAL         '41             < ECRITURE D'UN 'TAPE-MARK' IMPOSSIBLE :
                                     < LA BANDE EST SUREMENT DEFECTUEUSE...
ERMT2::  VAL         '0@@@@+I        < UNE ADRESSE-OCTET IMPAIRE OU UNE LONGUEUR
                                     < EN OCTETS IMPAIRES SONT DONNEES.
ERMT3::  VAL         '0@@@@+I        < L'ECHANGE DEMANDE EST TROP LONG.
ERMT4::  VAL         '0@@@@+I        < UNE ECRITURE EST DEMANDEE SUR UNE
                                     < BANDE PROTEGEE.
ERMT5::  VAL         '0@@@@+I        < UNE ECRITURE/LECTURE EST IMPOSSIBLE : LA
                                     < BANDE EST SUREMENT DEFECTUEUSE, OU BIEN
                                     < UN 'TAPE-MARK' A ETE DETECTE...
ERMT6::  VAL         '0@@@@+I        < TIME-OUT...
ERMT7::  VAL         '0@@@@+I        < ERREUR DE PARITE OU DE CADENCE.
ERMT8::  VAL         '0@@@@+I        < ON A TROUVE PLUS DE 2**15 BLOCS SUR
                                     < LA BANDE...
ERMT9::  VAL         '0@@@@+I        < LE NUMERO DE BLOC DEMANDE DANS 'ASDEM'
                                     < EST SUPERIEUR A 2**15...
ERMT10:: VAL         '0@@@@+I        < FIN DE BANDE RENCONTREE LORS D'UNE
                                     < ENTREE-SORTIE.
ERMT11:: VAL         '0@@@@+I        < COMMANDE REFUSEE LORSQUE LA BANDE EST
                                     < EN FIN DE BANDE...
ERMT12:: VAL         '0@@@@+I        < COMMANDE 'XFMINI' NE SUIVANT PAS LE
                                     < "!ASSIGN X=MT1" IMMEDIATEMENT...
ERMT13:: VAL         '0@@@@+I        < UNE ENTREE-SORTIE EST DEMANDEE SUR
                                     < 'MEMTV', ALORS QUE 'DKU' EST ASSIGNE ;
                                     < A NOTER QUE 'DKU' PEUT ETRE ASSIGNE A
                                     < L'UTILISATEUR QUI S'EST ASSIGNE 'MT1',
                                     < ON AGIT AINSI PARCE QUE C'EST PLUS
                                     < SIMPLE ; CETTE ERREUR EST INTRODUITE
                                     < AFIN D'ASSURER LA PROTECTION DE
                                     < 'MEMTV' PAR "!ASSIGN N=DKU"...
ERMT14:: VAL         '0@@@@+I        < LA DEMANDE COURANTE A ETE ABORTEE VIA
                                     < SON BIT 'XBABOR'...
<*******************************************************************************
<*******************************************************************************
XWOR%F:  VAL         ERMT5
ERMT5:  @VAL         '0@@@@          < CODE D'ERREUR : 'TAPE-MARK' RECONTRE.
         CALL        #SISP CMS5 GEN CTE#
<*******************************************************************************
         PAGE
<
<
<        D C T   B A N D E   M A G N E T I Q U E   1  :
<
<
         CALL        #SISP CMS5 CHECK#
         CALL        #SISP CMS5 DOL1#
DCTMT1:  EQU         $
PSTMT1:  WORD        K;K;K;K;COM+DEPCS;DCTMT1;NIL;PILMT1;HANDLR;SMST;SO;SE
       #@ASCI        " MT1"          < #SISP CMS5 ASCI#
         WORD        XIOID0          < IOID : METTRE 'NSPLP1;NOUSER', AU CAS
                                     < OU L'ON VOUDRAIT ENTRER DES TRAVAUX A
                                     < PARTIR DE 'MT1'...
        @!L :ACN*
         IF          KOL1=FCGET-KCCI,,XEIF%,
         IF          ATTENTION : IL FAUT UN "!" EN TETE DE LA CARTE !!!
XEIF%:   VAL         ENDIF
XWOR%1:  VAL         KOLTED=FMASK+KOL1=FVAL
XWOR%1:  VAL         KOLTEF=FMASK+KOL0+KOLON=FVAL?XWOR%1
XWOR%2:  VAL         KOLF=FMASK+KOLTES=FVAL
XWOR%2:  VAL         KOLC=FMASK+KSTAR=FVAL?XWOR%2
XWOR%3:  VAL         XWOR%1=XWOR%2   < RECHERCHE DU LIMITEUR ","...
         IF          XWOR%3-KOL0-KOLON,XEIF%,,
         IF          ATTENTION : IL MANQUE LE LIMITEUR "*" !!!
XEIF%:   VAL         ENDIF
XLPLOG:: VAL         XWOR%3-KOL1+Z   < LONGUEUR EN OCTETS DE LA CARTE !L.
XWOR%4:  VAL         NOCMO=K
XWOR%5:  VAL         -XWOR%4
         IF          XLPLOG>XWOR%5>XWOR%4-XLPLOG,,XEIF%,
         IF          ATTENTION : LA LONGUEUR DE !L :ACN<EOT> DOT ETRE
         IF          PAIRE SI L'ON VEUT DES JOBS ENTRANT SUR 'MT1' !!!
XEIF%:   VAL         ENDIF
         WORD        NFILTR
         WORD        FILTRS
         WORD        XTALOC          < ETALOC=XTALOC : 'MT1' N'EST PAS PARTA-
                                     < GEABLE...
         WORD        XXLOC0
         DZS         LSEM
         WORD        NIL             < TETE.
         WORD        NIL             < QUEUE.
         WORD        XXCHV0          < SCHVID.
         DZS         LSEM
         WORD        XXSIT0          < SIT.
         DZS         LSEM
         WORD        SPHEX0          < SPHEX.
         DZS         LSEM
         WORD        HDLMT
         WORD        ITMT
         WORD        K;K             < ETAT
         WORD        COSBT?B0SIT=FMASK(K=FCINST < BITSEM
         WORD        XXNTRY;TRYVID   < NTRIES & FRTRY.
         WORD        K               < HSTATS.
         WORD        XXMT1           < TESTO#0 : TIME-OUT A TESTER...
         WORD        XXMT2           < LISTE DES FONCTIONS AUTORISEES.
         WORD        XXMTUP          < LISTE DES "ALTITUDES" DES FONCTIONS.
<
<
<        Z O N E   V A R I A B L E  :
<
<
VARMT:   EQU         $
VARMT1:  EQU         $
         IF          VARMT-DCTMT1-DCTFIX,,XEIF%,
         IF          ATTENTION : LA ZONE FIXE DE LA 'DCT' EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
<
< POUR INITIALISER LE DEROULEUR :
<
         WORD        K
INIMT::  VAL         $-D-VARMT       < INIMT=K : UN "!ASSIGN" A ETE EMIS, ET
                                     <           AUCUNE COMMANDE NE LA ENCORE
                                     <           SUIVI...
                                     < INIMT#0 : CA Y EST, LA PREMIERE COMMANDE
                                     <           SUIVANT LE "!ASSIGN" EST
                                     <           ARRIVEE...
<
< OPERANDES DES 'SIO' D'ACCES AU DEROULEUR :
<
         WORD        ACMT1?FPHIN
MTF0::   VAL         $-D-VARMT       < FONCTION D'ENTREE INFORMATION.
         WORD        ACMT1?FPHOUT
MTF1::   VAL         $-D-VARMT       < FONCTION DE SORTIE INFORMATION 1.
         WORD        ACMT1?FPHETA
MTF2::   VAL         $-D-VARMT       < FONCTION D'ENTREE DU MOT D'ETAT 'A'.
         WORD        ACMT1?FPHCMD
MTF3::   VAL         $-D-VARMT       < FONCTION DE SORTIE DE COMMANDE DE
                                     < LANCEMENT.
         WORD        ACMT1?FPHDUM
MTF4::   VAL         $-D-VARMT       < FONCTION DE TEST...
         WORD        ACMT1?FPHSAD
MTF5::   VAL         $-D-VARMT       < FONCTION DE SORTIE D'INFORMATION 2.
         WORD        ACMT1?FPHETB
MTF6::   VAL         $-D-VARMT       < FONCTION D'ENTREE DU MOT D'ETAT 'B'.
         WORD        ACMT1?FPHCME
MTF7::   VAL         $-D-VARMT       < FONCTION DE SORTIE DE COMMANDE DE
                                     < CHARGEMENT.
<
< 'CCB' D'ACCES AU DEROULEUR DE BANDE :
<
         WORD        K
EXADMT:: VAL         $-D-VARMT       < POUR INITIALISER 'CCBMT0',
         WORD        K
ADMT::   VAL         $-D-VARMT       < POUR INITIALISER 'CCBMT2'.
CCBMT::  VAL         $-VARMT         < 'CCB' D'ACCES AU DEROULEUR DE BANDES.
         WORD        K
CCBMT0:: VAL         $-D-VARMT       < MOT 0
         BYTE        CCBHDC?XSNMT1;0
                                     < MOT 1 :
                                     < BIT0 : MODE 'HDC',
                                     < BIT1-7 : NUMERO DU NIVEAU D'INTERRUPTION
                                     <          NORMALE,
                                     < BIT11-15 : NUMERO DU JEU DE REGISTRES.
                                     <           'HDC' ALLOUES.
         WORD        NIL
CCBMT2:: VAL         $-D-VARMT       < MOT 2 : ADRESE-MOT DU BUFFER.
         WORD        NILK
CCBMT3:: VAL         $-D-VARMT       < MOT 3 : COMPTE DE MOTS.
         WORD        ACMT1
CCBMT4:: VAL         $-D-VARMT       < MOT 4 : ADRESSE DU COUPLEUR.
         WORD        NILK
NOCTMT:: VAL         $-D-VARMT       < NOMBRE D'OCTETS REELLEMENT ECHANGES,
                                     < FUTUR 'CODEM'...
<
< CONSTANTES GENERALES :
<
         WORD        '3FF0
LMMT::   VAL         $-D-VARMT       < LONGUEUR MAXIMALE D'UN ECHANGE EXPRIMEE
                                     < EN MOTS.
<
< SOUS-DETECTEUR DE TIME-OUT :
<
         WORD        XXMT3
SDTOMT:: VAL         $-D-VARMT       < SOUS-DETECTEUR DE TIME-OUT : CELUI-CI
                                     < PROGRESSE EN FONCTION DE LA RENCONTRE
                                     < DE TIME-OUT...
<
< RELAIS :
<
         WORD        HDLMTO
ADLMTO:: VAL         $-D-VARMT       < SORTIE NORMALE DE 'HDLMT'.
         WORD        HDLMTE
ADLMTE:: VAL         $-D-VARMT       < SORTIE EN ERREUR DE 'HDLMT'.
         WORD        MTREB
AMTREB:: VAL         $-D-VARMT       < SOUS-PROGRAMME DE REMBOBINAGE ET DE
                                     < REINITIALISATION DU DEROULEUR.
         WORD        MTDEF
AMTDEF:: VAL         $-D-VARMT       < REINITIALISATION SUITE A UN MALHEUREUX
                                     < DEFAUT SECTEUR...
         WORD        MTLAN
AMTLAN:: VAL         $-D-VARMT       < LANCEMENT D'UNE OPERATION DE COURTE
                                     < DUREE ET ATTENTE DE L'INTERRUPTION DE
                                     < FIN AVEC TEST DU DEFAUT SECTEUR, ET
                                     < DETECTION DES PETITS TIME-OUT...
<
< COMMANDES DE CHARGEMENT :
<
         WORD        MT0100
FT0100:: VAL         $-D-VARMT       < FONCTION DE REMBOBINAGE.
         WORD        MT4000
FT4000:: VAL         $-D-VARMT       < FONCTION 'WRITE ONE RECORD'.
         WORD        MT2000
FT2000:: VAL         $-D-VARMT       < FONCTION 'WRITE ONE TAPE MARK'.
         WORD        MT0400
FT0400:: VAL         $-D-VARMT       < FONCTION 'READ FORWARD ONE RECORD'.
         WORD        MT0200
FT0200:: VAL         $-D-VARMT       < FONCTION 'CLEAR'.
         WORD        MT0800
FT0800:: VAL         $-D-VARMT       < FONCTION 'SPACE FORWARD ONE RECORD'.
         WORD        MT8000
FT8000:: VAL         $-D-VARMT       < FONCTION 'SPACE REVERSE ONE RECORD'.
<
< DEMANDE D'ACCES A 'TTYS' LORSQUE LE DEROULEUR
< DE BANDES MAGNETIQUE N'EST PAS OPERATIONNEL :
<
         BYTE        NSPTYS;XDSYM
TYSMT1:: VAL         $-D-VARMT       < DEMANDE D'ACCES A 'TTYS' DEPUIS 'MT1'.
         WORD        FGW             < ECRITURE...
         DZS         LDEM0+VARMT-$+TYSMT1
XXTMT2:: VAL         4               < TEMPORISATION ENTRE 2 ENVOIS A 'TTYS'.
         WORD        MTOPER
AMTOPE:: VAL         $-D-VARMT       < SOUS-PROGRAMME D'APPEL DE L'OPERATEUR
                                     < LORSQUE LE DEROULEUR N'EST PAS OPERA-
                                     < TIONNEL...
<
< POSITION DES TETES SUR LA BANDE :
<
         WORD        K
ADBMT::  VAL         $-D-VARMT       < NUMERO DU BLOC COURANT ; CELUI-CI NE
                                     < PREND PAS EN COMPTE LES EVENTUELS
                                     < 'TAPE-MARK' RENCONTRES...
         WORD        MTPOS
AMTPOS:: VAL         $-D-VARMT       < SOUS-PROGRAMME DE POSITIONNEMENT
                                     < DE LA BANDE SUR LE BLOC DEMANDE.
                                     < (VOIR LE BIT 'XFMTAD')
<
<
<        P I L E  :
<
<
         CALL        #SISP CMS5 DOL2#
PILMT1:  EQU         $-DEPILE
XWPILE:  VAL         LPILEH+PILEMT
         CALL        #SISP CMS5 GENPIL2#
         CALL        #SISP CMS5 CHECK#
         PAGE
<
<
<        H A N D L E R   D  E   G E S T I O N   D E S   D E R O U L E U R S
<                    D E   B A N D E S   M A G N E T I Q U E S  :
<
<
<        FONCTION :
<                      CE HANDLER PREND EN CHARGE LA
<                    GESTION REENTRANTE DU OU DES DEROULEURS
<                    DE BANDES MAGNETIQUES GERES PAR LE
<                    SYSTEME CMS5.
<
<
<        FONCTIONS D'ACCES :
<                    XFMTR='00  : LECTURE SEQUENTIELLE,
<                    XFMTW='02  : ECRITURE SEQUENTIELLE,
<                    XFMTRA='08 : LECTURE EN ACCES DIRECT,
<                    XFMTWA='0A : ECRITURE EN ACCES DIRECT (?!??!?!),
<                    XFMTRW='03 : REMBOBINAGE,
<                    XFMTTM='04 : ECRITURE D'UN 'TAPE-MARK',
<                    XFMTPO='05 : ACCES A L'ADRESSE COURANTE DANS 'BOX'.
<                    XFMTFB='06 : POSITIONNEMENT DERRIERE LE PROCHAIN
<                                 'TAPE-MARK'.
<                    XFMINI='07 : NE PAS FAIRE DE 'REWIND' INITIAL
<                                 APRES LE "!ASSIGN X=MT1" ; CETTE
<                                 FONCTION DOIT ETRE LA PREMIERE
<                                 RECUE APRES LE "!ASSIGN", SINON,
<                                 ELLE EST REFUSEE.
<                    XFMATV='0B : LES ENTREES-SORTIES CONCERNERONT 'MEMTV',
<                                 (SAUF SI 'DKU' EST ASSIGNE, AUQUEL CAS
<                                 LES ENTREES-SORTIES SERONT REFUSEES AU
<                                 FUR ET A MESURE) ; A NOTER QU'ALORS
<                                 QUE 'AMDEM' RELATIVISEE DANS L'ESPACE
<                                 MEMOIRE UTILISATEUR DESIGNE ALORS UN
<                                 MORCEAU DE 'MEMTV'...
<                    XFMA0='0C  :  LES ENTREES-SORTIES CONCERNERONT L'ESPACE
<                                 MEMOIRE UTILISATEUR (ETAT INITIAL).
<
<
<        NOTA SUR LE "!ASSIGN" :
<                      EN GENERAL, APRES UN "!ASSIGN"
<                    SUR UN DEROULEUR DE BANDES, UNE
<                    SEQUENCE D'INITIALISATION PAR
<                    'REWIND' A LIEU LORS DE L'EXECUTION
<                    DE LA PREMIERE FONCTION INCIDENTE,
<                    SAUF SI CELLE-CI EST 'XFMINI'...
<
<
<        ARGUMENT :
<                    (L)=ADRESSE DE LA 'DCTMT',
<                    (W)=ADRESSE DE LA DEMANDE.
<
<
<        RESULTAT :
<                    BOX=NOMBRE DE CARACTERES ECHANGES DANS LE CAS D'UNE
<                        ENTREE-SORTIE NORMALEMENT TERMINEE,
<                       =NUMERO DE BLOC COURANT ('ADBMT') POUR TOUTES LES
<                        ERREURS RENCONTREES, LORS DE L'ECRITURE D'UN
<                        'TAPE-MARK', D'UN REMBOBINAGE ET DE LA
<                        FONCTION 'XFMTPO'.
<
<
<        NOTA :
<                      'HDLMT' N'EXPLOITE PAS LE
<                    CONTENU DE 'A' QUI DONNE LE
<                    'NSPTYP' DE LA DEMANDE...
<
<
         USE         L,DCT0
         USE         W,DEM0
HDLMT:   EQU         $
<
< TEST PRELIMINAIRE DU DEROULEUR :
<
HDLMT2:  EQU         $
         LAI         XUMT0
         SIO         VAR+MTF5        < SELECTION DE L'UNITE DE BANDES,
         LAI         MT0010
         SIO         VAR+MTF3        < ON FAIT A PRIORI UN 'CLEAR PROGRAMME'...
         SIO         VAR+MTF2        < ET ENTREE DU MOT D'ETAT 'A' :
         STA         ETAT0           < QUE L'ON MEMORISE...
         TBT         ETAOPE          < ALORS EST-IL OPERATIONNEL ???
         JC          HDLMT1          < OUI, OK...
         BSR         VAR+AMTOPE      < NON, ON AVERTIT L'OPERATEUR...
         JMP         HDLMT2          < ET ON RETESTE...
<
< CAS D'UN DEROULEUR OPERATIONNEL :
<
HDLMT1:  EQU         $
<
<
<        I N I T I A L I S A T I O N   ? ? ?
<        E T   C H A N G E M E N T   D E S   E S P A C E S
<        M E M O I R E   A C C E D E   ( ' M E M T V ' )  :
<
<
         LA          ARGDEM+OPDEM    < (A)=FONCTION DEMANDEE :
         CPI         XFMINI          < EST-CE L'INHIBITION DU 'REWIND' INITIAL
                                     < SUITE A "!ASSIGN" ???
         JNE         HDLMU1          < NON...
         LAI         ERMT12          < OUI, ON CONSIDERE A PRIORI QU'ELLE NE
                                     < SUIT PAS IMMEDIATEMENT LE "!ASSIGN"...
         CPZ         VAR+INIMT       < LE SUIT-ELLE EN REALITE ???
         JNE         HDLMTL          < ET BIEN NON, IL Y A EU AU MOINS UNE
                                     < AUTRE COMMANDE ENTRE "!ASSIGN" ET LA
                                     < FONCTION 'XFMINI', (A)=CODE D'ERREUR...
         IC          VAR+INIMT       < OK, ELLE EST LA PREMIERE, ON FAIT COMME
                                     < SI LA SEQUENCE D'INITIALISATION ETAIT
                                     < EFFECTUEE...
         JMP         HDLMTM          < ET C'EST TOUT, ON SORT AVEC LA 'BOX'...
HDLMU1:  EQU         $
<
< NE SERAIT-CE PAS LE CHANGEMENT
< D'ESPACE MEMOIRE ACCEDE :
<
         LBI         XEXA0           < (B)=ACCES A L'ESPACE UTILISATEUR A PRIORI
         CPI         XFMA0           < ALORS ???
         JE          HDLMU3          < OUI, ACCES A L'ESPACE UTILISATEUR...
         LBI         XEXATV          < NON, (B)=ACCES A 'MEMTV',
         CPI         XFMATV          < ALORS ???
         JNE         HDLMU4          < NON, IL S'AGIT D'UNE AUTRE FONCTION...
HDLMU3:  EQU         $               < CAS DES FONCTIONS 'XFMA0' ET 'XFMATV' :
         STB         VAR+EXADMT      < POUR INITIALISER CORRECTEMENT LE MOT 0
                                     < DU 'CCB' DE 'MT'...
         JMP         HDLMTM          < ET C'EST TOUT, ON SORT AVEC LA 'BOX'...
<
< CAS DES AUTRES FONCTIONS :
<
HDLMU4:  EQU         $
         CPZ         VAR+INIMT       < DANS LE CAS DES AUTRES FONCTIONS (DIFFE-
                                     < RENTES DE 'XFMINI'), FAUT-IL INITIALISER,
                                     < C'EST-A-DIRE SUIT-ON LE "!ASSIGN" ???
         JNE         HDLMU2          < NON...
         BSR         VAR+AMTREB      < OUI, ON FAIT UNE SEQUENCE D'INITIALI-
                                     < SATION PAR 'REWIND',
         JNC         HDLMTP          < PAS DE CHANCE, "TIME-OUT", ON SORT
                                     < EN ERREUR SANS AVOIR FAIT LA SEQUENCE
                                     < D'INITIALISATION...
         IC          VAR+INIMT       < OK, TOUT S'EST BIEN PASSE ; ON MEMORISE
                                     < QUE L'INITIALISATION EST FAITE, ET ON
                                     < PASSE A LA FONCTION DEMANDEE...
HDLMU2:  EQU         $
<
<
<        T E S T   D E   L A   F O N C T I O N  :
<
<
         LA          ARGDEM+OPDEM    < (A)=FONCTION DEMANDEE :
         CPI         XFMTRW          < EST-CE LE REMBOBINAGE ???
         JE          HDLMT7          < FONCTION DE REMBOBINAGE.
         CPI         XFMTPO          < EST-CE L'ACCES A LA POSITION ???
         JE          HDLMTM          < OUI...
         LB          ETAT0
         TBT         NBITMO+ETMT8    < EST-ON EN FIN DE BANDE ???
         JNC         HDLMTY          < NON, ALLONS FAIRE CE QUI EST DEMANDE...
         LAI         ERMT11          < ERREUR 'COMMANDE REFUSEE EN FIN DE
                                     < BANDE'.
         JMP         HDLMTL          < VERS LA SORTIE EN ERREUR...
HDLMTY:  EQU         $
         CPI         XFMTFB          < EST-CE UN POSITIONNEMENT DERRIERE LE
                                     < PROCHAIN 'TAPE-MARK' ???
         JE          HDLMB1          < OUI...
         CPI         XFMTTM          < EST-CE L'ECRITURE D'UN 'TAPE-MARK'.
         JNE         HDLMT3          < NON, DONC IL S'AGIT D'UNE ENTREE-SORTIE..
<
<
<        E C R I T U R E   D ' U N   ' T A P E - M A R K '  :
<
<
HDLMT8:  EQU         $
         LA          VAR+FT2000
         SIO         VAR+MTF7        < CHARGEMENT DE LA FONCTION 'WRITE
                                     < TAPE-MARK',
         LAI         MT0005
         SIO         VAR+MTF3        < ET LANCEMENT DE CETTE FONCTION...
         BSR         ACSWIT          < ATTENTE DE FIN D'OPERATION :
         BSR         ATHDS           < EST-CE UNE FIN VERITABLE, OU BIEN EST-CE
                                     < UN DEFAUT SECTEUR ???
         JNC         HDLMTV          < OK, PAS DE DEFAUT SECTEUR...
         BSR         VAR+AMTDEF      < REINITIALISATION GENERALE LORS D'UN
                                     < DEFAUT SECTEUR,
         JMP         HDLMT2          < ET ON RECOMMENCE...
HDLMTV:  EQU         $
         LA          ETAT0           < NON, UNE FIN NORMALE :
         CPI         XTOSIT          < EST-CE UN TIME-OUT ???
         JE          HDLMTP          < OUI...
         TBT         ETAVIO          < NON, Y-A-T'IL EU VIOL ???
         JC          ADLMTD          < OUI, OH QUEL SCANDALE !!!
         TBT         ETAOPE          < NON, LE DEROULEUR EST-IL OPERATIONNEL ???
         JC          HDLMTJ          < OUI...
         BSR         VAR+AMTOPE      < NON, ON AVERTIT L'OPERATEUR...
         JMP         HDLMT8          < ET ON ITERE L'OPERATION...
HDLMTJ:  EQU         $
         TBT         ETMT6           < L'ECRITURE DU 'TAPE-MARK' A-T'ELLE
                                     < ETE FAITE ???
         LAI         ERMT1           < NON A PRIORI...
         JNC         HDLMTL          < EFFECTIVEMENT, LA BANDE EST SUREMENT
                                     < MAUVAISE : AU DEMANDEUR DE DECIDER...
<
<
<        P O S I T I O N   C O U R A N T E   E T   S O R T I E S  :
<
<
HDLMTM:  EQU         $
         LX          VAR+ADBMT
         BSR         ASTBOX          < 'BOX' RECOIT EVENTUELLEMENT LE NUMERO
                                     < DE BLOC COURANT DANS LE CAS DE LA
                                     < FNCTION DE REMBOBINAGE, DE LA FONCTION
                                     < D'ECRITURE D'UN 'TAPE-MARK', ET ENFIN
                                     < DE LA FONCTION 'XFMTPO'...
         BR          VAR+ADLMTO      < SORTIE NORMALE DE 'HDLMT'...
HDLMTL:  EQU         $
         BR          VAR+ADLMTE      < SORTIE EN ERREUR DE 'HDLMT'...
<
<
<        P O S I T I O N N E M E N  T   D E R R I E R E   L E
<        P R O C H A I N   ' T A P E - M A R K '  :
<
<
HDLMB1:  EQU         $
         BSR         VAR+AMTPOS      < POSITIONNEMENT...
         JC          HDLMB2          < CAS DES DEFAUTS (TIME-OUT, FIN DE
                                     < BANDE,...).
         JMP         HDLMTM          < OK, ON EST DERRIERE UN 'TAPE-MARK'...
<
<
<        F O N C T I O N   D E   R E M B O B I N A G E  :
<
<
HDLMT7:  EQU         $
         BSR         VAR+AMTREB      < REINITIALISATION DU DEROULEUR...
         JNC         HDLMTP          < ET BIEN, IL Y A TIME-OUT !!!
         JMP         HDLMTM          < TOUT S'EST BIEN PASSE...
<
<
<        T R A I T E M E N T   D E S   T I M E - O U T  :
<
<
HDLMTP:  EQU         $
         LAI         XUMT0
         SIO         VAR+MTF5        < RESELECTION DE L'UNITE...
         LAI         MT0009
         SIO         VAR+MTF3        < COMMANDE 'FIN DE BLOC' POUR LE CANAL...
         SIO         VAR+MTF2        < (A)=MOT D'ETAT :
         TBT         ETAOPE          < LE DEROULEUR EST-IL OPERATIONNEL ???
         JNC         HDLMTW          < NON, ON LE LAISSE TEL QUEL...
         LA          VAR+FT0200
         SIO         VAR+MTF7        < OUI, IL N'EST DONC PAS EN REMBOBINAGE,
                                     < ET ON ESSAYE DE FAIRE UN 'CLEAR' DESSUS..
         LAI         MT0005
         SIO         VAR+MTF3        < LANCEMENT DU 'CLEAR'...
         LAI         MT0010
         SIO         VAR+MTF3        < ON FAIT A PRIORI UN 'CLEAR PROGRAMME'...
         LA          ARGDEM+OPDEM
         TBT         XFMTAD          < EST-ON SUR UNE FONCTION AVEC POSI-
                                     < TIONNEMENT ???
         JC          HDLMTW          < OUI, ON RESTE DONC OU L'ON EST AFIN
                                     < QUE LA 'BOX' RECOIVE LE NUMERO DU
                                     < BLOC COURANT, ET DEFINISSE DONC AINSI
                                     < LA FIN LOGIQUE DE LA BANDE : C'EST DONC
                                     < UNE METHODE SIMPLE POUR LA CONNAITRE
                                     < (DEMANDER LA LECTURE EN ACCES DIRECT
                                     < DU BLOC 2**15...).
         BSR         VAR+AMTREB      < NON, ON FORCE ALORS UN REMBOBINAGE...
HDLMTW:  EQU         $
         LAI         ERMT6
         JMP         HDLMTL          < PROVISOIREMENT, ON SORT EN ERREUR ; EN
                                     < EFFET JE NE SAIS PAS TRES BIEN QUOI
                                     < FAIRE D'AUTRE ???!!?!
<
<
<        A U T R E S   F O N C T I O N S  :
<
<
HDLMT3:  EQU         $
         TBT         XFMTAD          < EST-CE UN ACCES DIRECT ???
         JNC         HDLMTS          < NON...
         CPZ         ARGDEM+ASDEM    < OUI, ALORS VALIDONS 'ASDEM' :
         JGE         HDLMTS          < OK, ELLE EST POSITIVE OU NULLE...
         LAI         ERMT9           < ET BIEN NON, ELLE NE PEUT ETRE NEGATIVE,
                                     < SOUS PEINE DE COMPLIQUER LES TESTS DE
                                     < POSITION SUR LA BANDE...
         JMP         HDLMTL          < VERS LA SORTIE EN ERREUR...
HDLMTS:  EQU         $
<
<
<        F O N C T I O N   D E   L E C T U R E / E C R I T U R E  :
<
<
HDLMTT:  EQU         $
<
< RECUPERATION DES ARGUMENTS :
<
         LA          NSPTYP
         TBT         TYPAD           < 'AMDEM' EST-IL UNE ADRESSE MOT ???
         LA          ARGDEM+AMDEM
         JC          HDLMTA          < OUI, (A)=ADRESSE-MOT DU BUFFER.
         SLRS        NOCMO=K         < NON, CONVERSION EN UNE ADRESSE MOT.
         JC          HDLMT9          < ERREUR : L'ADDRESSE OCTET ETAIT IMPAIRE !
HDLMTA:  EQU         $
         STA         VAR+ADMT        < MISE EN PLACE DE L'ADRESSE MOT DU
                                     < BUFFER DANS L'EXTENSION DU 'CCB'...
         LA          VAR+EXADMT      < (A)=VALEUR D'INITIALISATION DE 'CCB0',
         CPI         XEXATV          < EST-CE L'ACCES A 'MEMTV' ???
         JNE         HDLMU5          < NON, OK...
         PSR         X,L             < OUI :
         LXI         NSPDKU
         BSR         ACADCT          < (A)=(L)=ADRESSE DE 'DCTDKU',
         CPZ         ETALOC          < 'DKU' EST-IL LOUE ???
         PLR         X,L
         LAI         ERMT13          < (A)=CODE D'ERREUR A PRIORI...
         JL          HDLMTE          < EFFECTIVEMENT, 'DKU' EST DEJA LOUE (IL
                                     < EST PEUT-ETRE D'AILLEURS ASSIGNE A CET
                                     < UTILISATEUR QUI POSSEDE LE DEROULEUR DE
                                     < BANDES...) ; DANS CE CAS L'ACCES A
                                     < 'MEMTV' EST REFUSE POUR GARANTIR SON
                                     < INTEGRITE...
         LA          ARGDEM+ETADEM
         CPI         NSPACT          < EST-CE BIEN UN UTILISATEUR QUI EST
                                     < DEMANDEUR DE L'ACCES A 'MEMTV' ???
         JNE         HDLMU5          < NON, ON LAISSE 'CCBMT2' INTACT...
XWOR%5:  VAL         NOCMO=K         < (EN EFFET, LES TRANSLATIONS D'ADRESSE
                                     < AU NIVEAU DE 'HDLSVC' SE FONT SUR
                                     < DES ADRESSES D'OCTETS...)
XWOR%1:  VAL         -DADR           < OUI, ON REFAIT DE L'ADRESSE ABSOLUE
                                     < UNE ADRESSE RELATIVE...
         RDOE                        < (A)=(SLO),
         SLLS        XWOR%1+XWOR%5   < (A)=(SLO) MODULO 32K (EN OCTETS),
         SLRS        XWOR%5          < (A)=(SLO) MODULO 32K (EN MOTS),
         SB          VAR+ADMT        < LES ADRESSES MEMOIRES D'ENTREES-SORTIES
                                     < ETANT TRANSLATEES ET ABSOLUTISEES RELA-
                                     < TIVEMENT A DES PAGES DE 32K, ON A :
         NGR         A,A             < (A)=ADRESSE MEMOIRE PRECISEE DANS UNE
                                     <     PAGE DE 32K,
         ADRI        -SLOESC,A       < (N'OUBLIONS PAS L'EN-TETE DE L'ESPACE
                                     < MEMOIRE UTILISATEUR...)
XWOR%4:  VAL         YY7*TZPROG      < YY7*TZPROG DONNE LA TAILLE EN MOTS DE
                                     < L'ESPACE MEMOIRE UTILISATEUR MAX...
XWOR%2:  VAL         XWOR%4=K
XWOR%2:  VAL         NBITMO-B-XWOR%2
         RBT         XWOR%2          < (A)=ADRESSE MEMOIRE PRECISEE DANS UNE
                                     <     PAGE DE 16K MOTS (TAILLE MAXIMALE
                                     <     DE L'ESPACE UTILISATEUR).
XWOR%3:  VAL         MEMTV0>XWOR%1   < ADRESSE DE 'MEMTV' MODULO 64K...
         IF          XWOR%3-K,,XEIF%,
         ADRI        XWOR%3,A        < TRANSLATION DANS 'MEMTV'...
XEIF%:   VAL         ENDIF
         STA         VAR+ADMT        < ON OBTIENT AINSI L'ADRESSE DE L'ECHANGE
                                     < RELATIVEMENT A 'MEMTV' (A NOTER QUE
                                     < LE BUFFER DANS L'ESPACE UTILISATEUR
                                     < QUE DESIGNE AUSSI CETTE ADRESSE SI ON
                                     < ENLEVE L'EXTENSION 'CCBMAE' NE SERT A
                                     < RIEN...
         NTRN
         IF          XWOR%4+LK-E/LK-RTLIMA,XEIF%,,
         IF          ATTENTION : IL FAUT RAJOUTER DES TESTS
         IF          DE VIOLATION DE 'MEMTV' !!!
XEIF%:   VAL         ENDIF
         TRN
HDLMU5:  EQU         $
         LA          ARGDEM+CODEM    < (A)=NOMBRE D'OCTETS A ECHANGER :
         SLRS        NOCMO=K         < ET CONVERSION EN UN NOMBRE DE MOTS,
         JC          HDLMT9          < ERREUR : LA LONGUEUR OCTETS EST IMPAIRE !
         CP          VAR+LMMT        < N'EST-ELLE PAS TROP GRANDE ???
         JG          HDLMTB          < ET OUI, ERREUR !!!
         STA         VAR+CCBMT3      < MISE EN PLACE DU NOMBRE DE MOTS A
                                     < ECHANGER DANS LE 'CCB'.
<
< DISCRIMINATION DU SENS DE L'OPERATION :
<
         LA          ARGDEM+OPDEM    < (A)=FONCTION DEMANDEE :
         LB          VAR+MTF0        < (B)='READ' A PRIORI,
         LX          VAR+FT0400      < (X)='FONCTION READ FORWARD' A PRIORI.
XWOR%1:  VAL         FGW?FGR=K
         TBT         NBITMO-B-XWOR%1 < ALORS, ENTREE OU SORTIE ???
         JNC         HDLMTC          < 0 : 'READ'...
         LB          VAR+MTF1        < (B)='WRITE',
         LX          VAR+FT4000      < (X)='FONCTION WRITE FORWARD'.
         LA          ETAT0           < IL S'AGIT D'UNE ECRITURE,
         TBT         ETAVIO          < ALORS LA BANDE NE SERAIT-ELLE PAS
                                     < PROTEGEE (ANNEAU ENLEVE) ???
ADLMTD:  JC          HDLMTD          < OUI, ERREUR !!!
                                     < (ET RELAI VERS 'HDLMTD')
HDLMTC:  EQU         $
         STB         VAR+CCBMT4      < MISE EN PLACE DE LA FONCTION ET DE
                                     < L'ADRESSE DU COUPLEUR DANS LE 'CCB'...
         BSR         VAR+AMTPOS      < POSITIONNEMENT EVENTUEL (SUIVANT LE
                                     < BIT 'XFMTAD' DE 'OPDEM') DE LA BANDE...
                                     < (NOTA : C'EST UN SOUS-PROGRAMME POUR
                                     < EVITER DES PROBLEMES DE 'JMP'...)
HDLMB2:  JC          HDLMTZ          < ERREUR 'FIN DE BANDE LORS D'UN
                                     < ACCES DIRECT...
                                     < (ET RELAI)
                                     < ATTENTION : CE PEUT ETRE AUSSI UN TIME-
                                     < OUT (VOIR EN EFFET LA VALEUR DE
                                     < 'XTOSIT' QUI CONTIENT 'ETMT8') !!!
<
< ALLOCATION DU JEU DE REGISTRES 'HDC' :
<
         PSR         X
         LAD         VAR+CCBMT
         SVC         SVCM4           < ALLOCATION D'UN JEU DE REGISTRES 'HDC',
                                     < ET MISE DANS LE 'CCB'...
         PLR         X
<
< LANCEMENT DE L'ECHANGE :
<
HDLMTF:  EQU         $
         LAI         XUMT0
         SIO         VAR+MTF5        < ON RESELECTIONNE LE COUPLEUR, AU CAS
                                     < OU ON BOUCLERAIT ICI SUR UN DEFAUT
                                     < SECTEUR.
         LAD         VAR+CCBMT       < (A)=ADRESSE DU 'CCB',
         PSR         X
         SVC         SVCM6           < ADRESSE SUR 20 BITS DANS LE 'CCB'...
         PLR         X
         BSR         ASDIPI          < 'CCB' QUE L'ON ENVOIE A 'PROIOP'...
         LR          X,A             < (A)=FONCTION DE LECTURE OU D'ECRITURE,
         BSR         VAR+AMTLAN      < LANCEMENT DE LA FONCTION, ET ATTENTE
                                     < DE FIN AVEC DETECTION DU DEFAUT SECTEUR
                                     < ET DES PETITS TIME-OUT...
         JNC         HDLMTU          < OK, IL N'Y A PAS EU DE DEFAUT SECTEUR...
         BSR         VAR+AMTDEF      < IL Y A EU UN DEFAUT SECTEUR, ON PROCEDE
                                     < DONC A UNE REINITIALISATION GENERALE...
         JMP         HDLMTF          < ET ON RECOMMENCE...
HDLMTU:  EQU         $
<
< ACCES AU COMPTE-RENDU D'ECHANGE :
<
         LA          VAR+CCBMT0
         SBT         BCCBCR
         STA         VAR+CCBMT0      < GENERATION D'UN 'CCB' DE COMPTE-RENDU,
         LAD         VAR+CCBMT       < (A)=ADRESSE DU 'CCB' DE COMPTE-RENDU,
         BSR         ASDIPI          < QUE L'ON ENVOIE A 'PROIOP'...
         LA          VAR+CCBMT3      < (A)=INDICATION SUR LE COMPTE RESIDUEL...
         JAGE        HDLMTN          < OK...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      REGARDER LES 2 PREMIERS BITS DE 'A' !!!
<
HDLMTN:  EQU         $
         TBT         BCCBDC          < EST-CE LE DEFSEC/CLEAR ???
         JC          HDLMTF          < OUI, ON ITERE SUR UN DEFAUT SECTEUR...
         SLLS        NOCMO=K         < CONVERSION DU NOMBRE DE MOTS RESIDUELS
                                     < EN UN NOMBRE D'OCTETS RESIDUELS,
         SB          ARGDEM+CODEM    < AUX QUELS ON RETRANCHE LE NOMBRE
                                     < D'OCTETS DEMANDE, CE QUI DONNE :
         NGR         A,X             < (X)=NOMBRE D'OCTETS REELLEMENT LUS,
         STX         VAR+NOCTMT      < ET MEMORISATION POUR ASSURER LA COMPA-
                                     < TIBILITE AVEC 'CR' ET 'VIS'...
         BSR         ASTBOX          < QUE L'ON TRANSMET EVENTUELLEMENT PAR
                                     < LA 'BOX' DE LA DEMANDE...
<
< RELEASE DU JEU DE REGISTRES 'HDC' :
<
         PSR         X
         LAD         VAR+CCBMT
         SVC         SVCM5           < DESALLOCATION DU JEU DE REGSITRES 'HDC'
                                     < UTILISES DANS L'ECHANGE PRECEDENT...
         PLR         X
<
< TEST DES CONDITIONS DE RETOUR :
<
HDLMTZ:  EQU         $
         LA          ETAT0           < (A)=MOT D'ETAT 'A' OBTENU LORS DE
                                     < L'INTERRUPTION D'EXCEPTION...
         CPI         XTOSIT          < EST-CE UN TIME-OUT ???
         JE          HDLMTP          < OUI...
         CPI         XETATX          < EST-CE UN ABORT PAR 'XBABOR' ???
         JE          HDLMT4          < OUI...
         TBT         ETAOPE          < NON, LE DEROULEUR EST-IL OPERATIONNEL ???
         JC          HDLMTI          < OUI, OK...
         BSR         VAR+AMTOPE      < NON, ON AVERTIT L'OPERATEUR...
         JMP         HDLMTT          < ET ON RETENTE...
HDLMTI:  EQU         $
         TBT         ETMT8           < EST-ON EN FIN DE BANDE ???
         JC          HDLMTX          < OUI, ERREUR...
         TBT         ETADEF          < EST-CE UNE ERREUR DE PARITE/CADENCE ???
         JC          HDLMTQ          < OUI...
         TBT         ETAFBK          < LA FONCTION A-T'ELLE ETAIT REMPLIE ???
         JNC         HDLMTK          < NON, ERREUR !!!
                                     < (LA BANDE EST MAUVAISE PAR EXEMPLE...)
<
< MISE A JOUR DE LA POSITION SUR LA BANDE :
<
         IC          VAR+ADBMT       < COMPTAGE DU BLOC QUI VIENT D'ETRE LU
                                     < OU ECRIT...
         JLE         HDLMTR          < ET BIEN NON, CELA FAIT TROP !!!
         LA          VAR+NOCTMT
         STA         ARGDEM+CODEM    < MISE A JOUR DU 'CODEM' AVEC LE NOMBRE
                                     < D'OCTETS REELLEMENT ECHANGES, AFIN D'ETRE
                                     < COMPTATIBLE AVEC 'CR' ET 'VIS'...
         JMP         HDLMTO          < OK, C'EST BON, ON SORT...
<
< RETOURS EN ERREUR :
<
HDLMT9:  EQU         $
         LAI         ERMT2           < ERREUR 'IMPARITE SUR UNE ADRESSE OU
                                     < UN COMPTE OCTETS'.
         JMP         HDLMTE          < VERS LA SORTIE EN ERREUR...
HDLMTB:  EQU         $
         LAI         ERMT3           < ERREUR 'ECHANGE TROP LONG'.
         JMP         HDLMTE          < VERS LA SORTIE EN ERREUR...
HDLMTD:  EQU         $
         LAI         ERMT4           < ERREUR 'BANDE PROTEGEE EN ECRITURE'.
         JMP         HDLMTE          < VERS LA SORTIE EN ERREUR...
HDLMTK:  EQU         $
         LAI         ERMT5           < ERREUR 'BANDE MAUVAISE' (EN FAIT, IL
                                     < S'AGIT EN GENERAL D'UN "TAPE-MARK"...).
         JMP         HDLMTE          < VERS LA SORTIE EN EREUR...
HDLMTQ:  EQU         $
         BSR         VAR+AMTREB      < ET ON FORCE UN REMBOBINAGE...
         LAI         ERMT7           < ERREUR 'PARITE/CADENCE'.
         JMP         HDLMTE          < VERS LA SORTIE EN ERREUR...
HDLMTR:  EQU         $
         LAI         ERMT8           < ERREUR 'TROP DE BLOCS SUR LA BANDE'.
         JMP         HDLMTE          < VERS LA SORTIE EN ERREUR...
HDLMT4:  EQU         $
         LAI         ERMT14          < ERREUR : LA DEMANDE COURANTE EST ABORTEE
                                     < VIA SON BIT 'XBABOR'...
         BSR         VAR+AMTREB      < ET ON FORCE UN REMBOBINAGE...
         JMP         HDLMTE          < VERS LA SORTIE EN ERREUR...
HDLMTX:  EQU         $
         BSR         VAR+AMTREB      < ON FORCE UN REMBOBINAGE...
                                     < (AFIN DE NE PAS DECHARGER LA BANDE !!!)
         LAI         ERMT10          < ERREUR 'FIN BANDE LORS D'UNE E/S'.
         JMP         HDLMTE          < VERS LA SORTIE EN ERREUR...
<
<
<        S O R T I E   O K  :
<
<
HDLMTO:  EQU         $
         STZ         ETAT0           < ON INDIQUE AINSI QUE TOUT EST BON...
<
<
<        S O R T I E  :
<
<
HDLMT6:  EQU         $
<
< PREPARATION DE LA GESTION DES TIME-OUT :
<
         LBI         XXMT3           < (B)=VALEUR DE BASE A PRIORI...
         LA          ETAT0
         CPI         ERMT6           < VIENT-ON DE SOUFFRIR D'UN TIME-OUT ???
         JNE         HDLMB3          < NON, DONC ON SE MET SUR LA VALEUR DE
                                     < BASE DU SOUS-DETECTEUR DE TIME-OUT...
         LB          VAR+SDTOMT      < OUI :
         ADRI        XXMT4,B         < ON AUGMENTE LE SOUS-DETECTEUR COURANT,
                                     < AFIN D'AVOIR EN PARTICULIER LE TEMPS
                                     < AU PROCHAIN COUP DE REVENIR DANS UNE
                                     < ZONE NON VIERGE DE LA BANDE...
HDLMB3:  EQU         $
         STB         VAR+SDTOMT      < PROCHAIN SOUS-DETECTEUR DE TIME-OUT...
<
< SORTIE GENERALE :
<
         RSR
<
<
<        S O R T I E   E N   E R R E U R  :
<
<
HDLMTE:  EQU         $
         STA         ETAT0           < 'A' DONNE UN CODE D'ERREUR...
         LX          VAR+ADBMT
         BSR         ASTBOX          < TRANSMISSION EVENTUELLE DU NUMERO DE
                                     < BLOC COURANT 'ADBMT' A CHAQUE ERREUR
                                     < RENCONTREE.
         JMP         HDLMT6          < ET ON SORT...
         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
<        S U R   D E R O U L E U R   D E   B A N D E S  :
<
<
<        FONCTION :
<                      CE MODULE EST APPELE LORS DELA
<                    RECEPTION D'UNE INTERRUPTION SUR UN
<                    DEROULEUR DE BANDES MAGNETIQUES ;
<                    IL RECUPERE ALORS LES MOTS D'ETAT
<                    'A' ET 'B' ET REVEILLE (EN GENERAL)
<                    LE HANDLER ASSOCIE...
<
<
<        ARGUMENT :
<                    (B)=0 : IL S'AGIT D'UNE INTERRUPTION NORMALE !!!
<                     =1 : IL S'AGIT D'UNE INTERRUPTION D'EXCEPTION,
<                          ET C'EST EN FAIT CELA QUI EST NORMAL...
<
<
ITMT:    EQU         $
         CPZR        B               < ALORS NORMAL OU EXCEPTION ???
         JNE         ITMT1           < OK, EXCEPTION...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      COMPRENDRE COMMENT UNE INTERRUPTION
<                    NORMALE PEUT ARRIVER JUSQU'AU SOFT !!!
<
ITMT1:   EQU         $
         SIO         VAR+MTF2
         STA         ETAT0           < ENTREE DU MOT D'ETAT 'A',
         SIO         VAR+MTF6
         STA         ETAT1           < ET DU MOT D'ETAT 'B'...
         BSR         ATEC            < Y-A-T'IL UN ECHANGE EN COURS ???
         JE          ITMT2           < NON, C'EST TOUT...
         BSR         ARVHDL          < OUI, ON REVEILLE DONC LE HANDLER
                                     < ASSOCIE QUI POURRA TESTER LES MOTS
                                     < D'ETAT 'A' ET 'B'.
ITMT2:   EQU         $
         RSR
         PAGE
<
<
<        A V E R T I S S E M E N T   O P E R A T E U R  :
<
<
<        FONCTION :
<                      CE MODULE SE CONTENTE D'ALERTER
<                    L'OPERATEUR VIA 'TTYS', PUIS LUI FAIT
<                    FAIRE UN PETIT DODO, ET C'EST TOUT...
<
<
MTOPER:  EQU         $
         PSR         A,X
         LAD         VAR+TYSMT1
         XR          A,W             < (W)=ADRESSE DE LA DEMANDE, ET
                                     < (A)=SAUVEGARDE DU 'W' ANTERIEUR.
         BSR         ACHAND          < ENVOI DE LA DEMANDE,
         BSR         ACHANW          < ATTENTE DE FIN D'EMISSION 'TTYS'...
         LR          A,W             < ET ENFIN, RESTAURE 'W'...
         LXI         XXTMT2
         BSR         ADODO           < ET UN PETIT DODO... EN ATTENDANT QUE
                                     < TOUT S'ARRANGE...
         PLR         A,X
         RSR
         PAGE
<
<
<        A C C E S   D I R E C T   S U R   L A   B A N D E  :
<
<
<        FONCTION :
<                      ETANT DONNE LE NUMERO DE BLOC COURANT
<                    'ADBMT' SUR LA BANDE, CE SOUS-PRO-
<                    GRAMME PERMET SI CELA EST DEMANDE
<                    PAR LE BIT 'XFMTAD' DE 'OPDEM' DE
<                    POSITIONNER LA BANDE SUR UN BLOC DE
<                    NUMERO DONNE PAR 'OPDEM' ; POUR DES
<                    RAISONS DE SIMPLICITE, LES NUMEROS
<                    DE BLOCS SONT SUR 15 BITS, AFIN D'ETRE
<                    POSITIFS...
<                      ON PROCEDE PAR DES SAUTS DE 1 BLOC,
<                    SACHANT QUE LES 'TAPE-MARKS' NE SONT
<                    PAS COMPTABILISES...
<
<
<        RESULTAT :
<                    CARY=1 : LA FIN DE BANDE A ETE RENCONTREE LORS
<                             D'UN ACCES DIRECT ; IL PEUT AUSSI
<                             S'AGIR D'UN TIME-OUT OU BIEN ENFIN
<                             D'UNE DEMANDE D'ABORT VIA 'XBABOR'...
<
<
MTPOS:   EQU         $
         PSR         A,B,X,Y
         LA          ARGDEM+OPDEM    < (A)=FONCTION DEMANDEE :
         CPI         XFMTFB          < EST-CE UN POSITIONNEMENT DERRIERE LE
                                     < PROCHAIN 'TAPE-MARK' ???
         JE          MTPOSD          < OUI...
         TBT         XFMTAD          < EST-CE UN ACCES DIRECT ???
         JNC         MTPOS1          < NON, DONC IL S'AGIT DU MODE SEQUENTIEL,
                                     < ON N'A DONC PAS A SE POSITIONNER...
MTPOSD:  EQU         $
<
< CAS OU IL FAUT SE POSITIONNER :
<
MTPOSB:  EQU         $
         LA          ARGDEM+ASDEM    < (A)=NUMERO DU BLOC DEMANDE,
         SB          VAR+ADBMT       < (A)=BLOC DEMANDE-BLOC COURANT, CE QUI
                                     <     DONNE DONC L'AMPLITUDE DU SAUT...
         JAE         MTPOS2          < UN VRAI MIRACLE, ON Y EST DEJA...
         LY          VAR+FT0800      < ET BIEN NON : (Y)=FONCTION 'SPACE FORWARD
                                     < ONE RECORD' A PRIORI...
         LBI         I               < POUR INCREMENTER...
         JAG         MTPOS3          < EFFECTIVEMENT IL FAUT ALLER DE L'AVANT...
         LY          VAR+FT8000      < ET BIEN NON, (Y)=FONCTION 'SPACE REVERSE
                                     < ONE RECORD',
         LBI         -I              < POUR DECREMENTER...
         NGR         A,A             < ET ABSOLUTISATION DE L'AMPLITUDE...
MTPOS3:  EQU         $
         LR          A,X             < (X)=NOMBRE DE BLOCS (NON COMPTES LES
                                     <     'TAPE-MARKS') A SAUTER...
<
< POSITIONNEMENT PAR SAUTS UNITAIRES :
<
MTPOS4:  EQU         $
         LA          NSPTYP          < ACCES AU 'NSPTYP' DE LA BANDE :
         TBT         XBABOR          < UN ABORT EST-IL DEMANDE ???
         JC          MTPOSX          < OUI, ON ARRETE LA...
         LR          Y,A             < (A)=FONCTION 'SPACE FORWARD/REVERSE
                                     <     ONE RECORD',
         BSR         VAR+AMTLAN      < LANCEMENT DE LA FONCTION, ET ATTENTE
                                     < DE FIN AVEC DETECTION DU DEFAUT SECTEUR
                                     < ET DES PETITS TIME-OUT...
         JNC         MTPOSA          < OK, IL N'Y A PAS EU DE DEFAUT SECTEUR...
         BSR         VAR+AMTREB      < ET OUI, MON PAUVRE MONSIEUR, IL EST DONC
                                     < PLUS PRUDENT DE TOUT RECOMMENCER...
         JMP         MTPOSB          < VERS LE CALCUL DE L'AMPLITUDE...
MTPOSA:  EQU         $
         LA          ETAT0           < IL N'Y A PAS EU DE DEFAUT SECTEUR :
         CPI         XTOSIT          < EST-CE UN TIME-OUT...
         JE          MTPOS2          < OUI (MAIS CE TEST EST EN FAIT REDONDANT
                                     < AVEC CELUI DE 'ETMT8')...
         IF          COSBT?ETMT8=FMASK(K?XTOSIT=FCINST-XTOSIT,,XEIF%,
         IF          ATTENTION : 'XTOSIT' NE CONTIENT PAS LE
         IF          BIT 'ETMT8', DONC LES TESTS QUI SUIVENT
         IF          VONT MERDER !!! VOIR EN PARTICULIER
         IF          LE 'JC HDLMTZ'...
XEIF%:   VAL         ENDIF
         TBT         ETAOPE          < LE DEROULEUR EST-IL OPERATIONNEL ???
         JC          MTPOS9          < OUI, OK...
         BSR         VAR+AMTOPE      < NON, AVERTISSONS...
         JMP         MTPOS4          < ET RETENTONS...
MTPOS9:  EQU         $
         TBT         ETMT8           < A-T'ON RENCONTRE LA FIN DE BANDE ???
         JC          MTPOS2          < OUI, ON ARRETE LA...
         TBT         ETMT7           < ET LE DEBUT DE BANDE ???
         JNC         MTPOSC          < NON PLUS, OK...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      COMPRENDRE COMMENT ON A PU
<                    TOMBER SUR LE DEBUT DE BANDE,
<                    ALORS QUE C'EST IMPOSSIBLE !!!
<                    (VOIR 'ADBMT' ET 'ASDEM')
<                      EN FAIT, SEUL UN REMBOBINAGE
<                    MANUEL (ET DISCRET...) DE LA
<                    BANDE PEUT L'EXPLIQUER !!!
<
         JMP         MTPOS2          < ET ON ARRETE AUSSI...
MTPOSC:  EQU         $
         TBT         ETMT6           < MAIS, N'A-T'ON PAS SAUTE UN 'TAPE-MARK' ?
         JC          MTPOS5          < ET OUI, ON NE LE COMPTE PAS COMME
                                     < BLOC DE DONNEES...
         LA          VAR+ADBMT       < NON, DONC ON COMPTABILISE LE BLOC
                                     < QUE L'ON A SAUTE :
         ADR         B,A             < EN AVANT OU EN ARRIERE...
         STA         VAR+ADBMT
         JAGE        MTPOS7          < OK...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      COMPRENDRE COMMENT LE NUMERO DE
<                    BLOC COURANT A PU DEVENIR NEGATIF
<                    SOIT PAR DECREMENTATION, SOIT PAR
<                    DEBORDEMENT LORS D'UNE INCREMENTATION !!!
<
MTPOS7:  EQU         $
         JMP         MTPOS6
MTPOS5:  EQU         $
         LA          ARGDEM+OPDEM
         CPI         XFMTFB          < S'AGIT'IL D'UN POSITIONNEMENT DERRIERE
                                     < LE PROCHAIN 'TAPE-MARK' ???
         JE          MTPOS2          < OUI, LA FONCTION EST DONC REMPLIE...
         ADRI        I,X             < NON, DANS LE CAS OU UN 'TAPE-MARK' A ETE
                                     < SAUTE, IL FAUT L'IGNORER, ET DONC FAIRE
                                     < UNE ITERATION DE PLUS...
         CPZR        X               < VALIDATION...
         JG          MTPOS8          < OK...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      COMPRENDRE, MAIS EN FAIT, LA
<                    BANDE PEUT ETRE PLEINE DE 'TAPE-MARKS' !!!
<
MTPOS8:  EQU         $
MTPOS6:  EQU         $
         JDX         MTPOS4          < VERS LE SAUT DU BLOC SUIVANT EVENTUEL...
MTPOS2:  EQU         $
MTPOS1:  EQU         $
         LA          ETAT0
         TBT         ETMT8           < ET ON POSITIONNE LE 'CARY' SUR L'INDI-
                                     < CATEUR DE FIN DE BANDE...
         PLR         A,B,X,Y
         RSR                         < ET C'EST TOUT...
<
< CAS DES ABORTS DU POSI-
< TIONNEMENT VIA 'XBABOR' :
<
MTPOSX:  EQU         $
         LAI         XETATX
         IF          COSBT?ETMT8=FMASK(K?XETATX=FCINST-XETATX,,XEIF%,
         IF          ATTENTION : 'XETATX' NE CONTIENT PAS LE
         IF          BIT 'ETMT8', DONC LES TESTS QUI SUIVENT
         IF          VONT MERDER !!! VOIR EN PARTICULIER
         IF          LE 'JC HDLMTZ'...
XEIF%:   VAL         ENDIF
         STA         ETAT0           < ON DONNE A 'ETAT0' UNE VALEUR SPECIALE
                                     < MEMORISANT CET ABORT...
         JMP         MTPOS2          < ET ON SORT COMME POUR UN TIME-OUT...
         PAGE
<
<
<        L A N C E M E N T   D ' U N E   F O N C T I O N
<        E T   A T T E N T E   D E   F I N  :
<
<
<        FONCTION :
<                      CE MODULE LANCE UNE FONCTION
<                    ARGUMENT, GEREE PAR INTERRUPTION
<                    DONT ON SAIT QU'ELLE SERA RELATIVEMENT
<                    BREVE (LECTURE/ECRITURE D'UN BLOC
<                    OU SAUT D'UN SEUL BLOC). IL ATTEND
<                    LA FIN DE CETTE FONCTION EN AYANT
<                    MIS EN PLACE UN DETECTEUR DE PETITS
<                    TIME-OUT ; ENFIN, IL REGARDE SI UN
<                    DEFAUT SECTEUR N'EST PAS APPARU...
<
<
<        ARGUMENT :
<                    (A)=FONCTION A LANCER.
<
<
<        RESULTAT :
<                    (CARY)=1 : UN DEFAUT SECTEUR EST APPARU.
<
<
MTLAN:   EQU         $
         PSR         A,B
         SIO         VAR+MTF7        < CHARGEMENT DE LA FONCTION ARGUMENT (A),
         LA          TESTO
         LB          TIMOUT
         PSR         A,B             < SAUVEGARDE DE 'TESTO' ET 'TIMOUT'
                                     < COURANTS...
         LA          VAR+SDTOMT
         STA         TESTO           < MISE EN PLACE DU DETECTEUR DE
         STA         TIMOUT          < TIME-OUT DE COURTES DUREES...
         LAI         MT0005
         SIO         VAR+MTF3        < PUIS LANCEMENT DE LA FONCTION ARGUMENT...
         BSR         ACSWIT          < ET ENFIN, ATTENTE DE L'INTERRUPTION...
         PLR         A,B
         STB         TIMOUT          < RESTAURATION DU 'TIMOUT' ET
         STA         TESTO           < DU 'TESTO' ANTERIEURS...
         BSR         ATHDS           < MAIS, EST-CE UNE FIN VERITABLE, OU
                                     < BIEN UN DEFAUT SECTEUR ???
         PLR         A,B
         RSR
         PAGE
<
<
<        R E I N I T I A L I S A T I O N   D U   D E R O U L E U R
<                    P A R   R E M B O B I N A G E  :
<
<
<        FONCTION :
<                      CE MODULE REPOSITIONNE LE DEROULEUR
<                    EN DEBUT DE BANDE ET REMET A 0 LE
<                    NUMERO DE BLOC COURANT...
<
<
<        RESULTAT :
<                    LE 'CARY' EST POSITIONNE TEL QUE :
<                    JC  <REMBOBINAGE OK>,
<                    JNC <TIME-OUT>.
<
<
MTREB:   EQU         $
         PSR         A
MTREB7:  EQU         $
         STZ         VAR+ADBMT       < POSITIONNEMENT DU NUMERO DE BLOC
                                     < COURANT EN DEBUT DE BANDE.
         LA          VAR+FT0100
         SIO         VAR+MTF7        < CHARGEMENT DE LA FONCTION 'REWIND',
         LAI         MT0005
         SIO         VAR+MTF3        < ET LANCEMENT DE CETTE FONCTION...
<
< ATTENTE DE FIN DE REMBOBINAGE :
<
         LAI         XUMT0
         SIO         VAR+MTF5        < RESELECTION DE L'UNITE 0 (ON NE SAIT
                                     < JAMAIS AVEC LA SEMS...).
         LA          VAR+FT0200
         SIO         VAR+MTF7        < CHARGEMENT DE LA FONCTION 'CLEAR',
         LAI         MT0005
         SIO         VAR+MTF3        < ET LANCEMENT DE CETTE FONCTION...
         BSR         ACSWIT          < ATTENTE DE L'INTERRUPTION DE FIN DE
                                     < REMBOBINAGE GENEREE GRACE AU 'CLEAR'...
         BSR         ATHDS           < EST-CE UNE FIN VERITABLE OU BIEN UN
                                     < DEFAUT SECTEUR ???
         JC          MTREB7          < LORS D'UN DEFAUT SECTEUR, ON ITERE
                                     < L'OPERATION DE REMBOBINAGE...
         LA          ETAT0           < LORS D'UNE FIN VERITABLE, ON REGARDE
                                     < COMMENT CELA S'EST-IL PASSE :
         CPI         XTOSIT          < EST-CE UN TIME-OUT ???
         JE          MTREBP          < OUI...
         TBT         ETMT7           < NON, ALORS EST-ON AU DEBUT DE BANDE ???
         JC          MTREBM          < OUI, ON EST BON...
         BSR         VAR+AMTOPE      < NON, BIZARRE BIZZARE ???!?!?!
         JMP         MTREB7          < APRES AVOIR AVERTIT L'OPERATEUR, ON
                                     < RECOMMENCE CETTE OPERATION...
<
< CAS DU TIME-OUT :
<
MTREBP:  EQU         $
         RBT         ETMT7           < ON FAIT COMME SI ON N'ETAIT PAS EN
                                     < DEBUT DE BANDE (CE QUI EST D'AILLEURS
                                     < SUREMENT VRAI)...
<
< SORTIE DU MODULE :
<
MTREBM:  EQU         $
         TBT         ETMT7           < POUR LE TEST EN RETOUR PERMETTANT
                                     < DE SAVOIR S'IL Y A EU TIME-OUT...
         PLR         A
         RSR
         PAGE
<
<
<        R E I N I T I A L I S A T I O N   S U I T E   A   U N
<                    D E F A U T   S E C T E U R  :
<
<
<        FONCTION :
<                      LORS D'UNE OPERATION ECRIVANT OU LISANT
<                    LA BANDE, SI UN DEFAUT SECTEUR EST DETECTE,
<                    ON REVIENT EN DEBUT DE BANDE (ET DONC ON
<                    REMET A 0 LE NUMERO DE BLOC COURANT), ET
<                    SE REPOSITIONNE SUR LE BLOC COURANT D'AVANT
<                    LE DEFAUT SECTEUR...
<
<
MTDEF:   EQU         $
         PSR         A,B
<
< REINITIALISATION DU COUPLEUR :
<
         LAI         MT0010
         SIO         VAR+MTF3        < COMMANDE 'CLEAR PROGRAMME'.
         LAI         XUMT0
         SIO         VAR+MTF5        < SELECTION DE L'UNITE...
<
< REPOSITIONNEMENT DE LA BANDE :
<
         LA          ARGDEM+OPDEM
         LB          ARGDEM+ASDEM
         PSR         A,B             < SAUVEGARDE DE 'OPDEM' ET 'ASDEM'...
         SBT         XFMTAD          < ON FORCE A PRIORI LE BIT D'ACCES
                                     < DIRECT DE 'OPDEM',
         LB          VAR+ADBMT
         STB         ARGDEM+ASDEM    < ON FAIT COMME SI LE BLOC COURANT ETAIT
         STA         ARGDEM+OPDEM    < LE BLOC DEMANDE EN ACCES DIRECT...
                                     < (ASTUCE SUPER !!!)
         BSR         VAR+AMTREB      < ON REVIENT EN DEBUT DE BANDE, CE QUI EST
                                     < QUELQUE CHOSE D'ABSOLU...
         BSR         VAR+AMTPOS      < ET ON SE REPOSITIONNE SUR LE BLOC
                                     < COURANT D'AVANT LE DEFAUT SECTEUR...
         JNC         MTDEF1          < OK, PAS DE FIN DE BANDE...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      COMPRENDRE CE QUE L'ON FAIT EN FIN DE BANDE !!!
<
MTDEF1:  EQU         $
         PLR         A,B
         STB         ARGDEM+ASDEM    < ET ENFIN, ON RESTAURE 'ASDEM',
         STA         ARGDEM+OPDEM    < ET 'OPDEM'...
         PLR         A,B
         RSR                         < ET C'EST TOUT...
         PAGE
<
<
<        I N I T I A L I S A T I O N   D ' U N   D E R O U L E U R
<        D E   B A N D E S   M A G N E T I Q U E S   L O R S   D E
<        L A   R E C E P T I O N   D ' U N   ! A S S I G N  :
<
<
<        FONCTION :
<                      LORS DE LA RECEPTION D'UN !ASSIGN
<                    RELATIF A UN DEROULEUR DE BANDES MA-
<                    GNETIQUES DANS LE 'CCI', ON LE REINITIA-
<                    LISE EN MEMORISANT CETTE ASSIGNATION
<                    ET EN ATTENDANT LA PREMIERE FONCTION
<                    RECUE PAR LE HANDLER POUR FAIRE UN
<                    'REWIND' SAUF S'IL S'AGIT DE LA
<                    FONCTION 'XFMINI' QUI L'INHIBE...
<
<
<        ARGUMENT :
<                    (B)='NSP' DU DEROULEUR DE BANDES EN CAUSE,
<                    (L)=ADRESSE DE LA 'DCT' DE SERVICE ACTUEL-
<                        LEMENT UTILISEE.
<
<
MTINI:   EQU         $
         PSR         X,L
         LR          B,X             < (X)='NSP' DU DEROULEUR DEMANDE,
         BSR         ACADCT          < (A)=L=ADRESSE DE SA 'DCT'.
                                     < NOTA : IL NE S'AGIT PAS D'UNE PHASE
                                     <        CRITIQUE, CAR EN EFFET SI ON EST
                                     <        ICI C'EST QUE LE DEROULEUR EST
                                     <        ASSIGNE PAR CET UTILISATEUR, ET
                                     <        DONC LE HANDLER ASSOCIE NE PEUT
                                     <        ETRE ACTIF SIMULTANEMENT !!!
         STZ         VAR+INIMT       < INIMT=K : MEMORISATION D'UNE SEQUENCE
                                     <           D'INITIALISATION A EFFECTUER...
         LAI         XEXA0
         STA         VAR+EXADMT      < ACCES A L'ESPACE UTILISATEUR A PRIORI...
         PLR         X,L
         RSR                         < ET RETOUR...



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