<***********************************************************************
<*                                                                     *
<*                                                                     *
<*       C H A R G E U R   T R A N S L A T E U R                       *
<*       A U T O T R A N S L A T A B L E   L O A D.                    *
<*                                                                     *
<*       CE CHARGEUR CHARGE UN PROGRAMME DANS UNE PARTITION            *
<*       MINIMUM DE LONGUEUR 'LGINI' (MOINS SA LONGUEUR 'LGCHGM').     *
<*       SI LE PROGRAMME EST TROP GROS, IL SE DEPLACE DE 'LGDEPL'.     *
<*       LE MAXIMUM ACTUEL IMPOSE PAR LE SYSTEME EST DE 8K.            *
<*       L'UNITE DE LECTURE DU BINAIRE PORTE LE NUMERO 'NOUNIT'.       *
<*       LA VERSION LDDK CHARGE EN ABSOLU SUR DISQUE                   *
<*       ELLE DEMANDE LE NUMERO DE DISQUE(2 OU 3),                     *
<*       L'ADRESSE DE DEBUT DE CHARGEMENT, L'ADRESSE DE FIN            *
<*       POUR VERIFICATION, ET UNE ADRESSE DE TRANSLATION              *
<*       PERMETTANT UN CHARGEMENT DECALE.                              *
<*                                                                     *
<*       MESSAGES D'ERREURS :                                          *
<*           - 0X : ERREUR SYSTEME OU ASSEMBLEUR                       *
<*               - '01 : ERREUR LORS DE LA LECTURE DU BINAIRE          *
<*           - 1X : ERREURS DUES A L'ASSEMBLEUR                        *
<*               - '11 : NUMERO DE COMMANDE ERRONNEE                   *
<*               - '12 : COMMANDE ABSOLUE EN TRANSLATABLE              *
<*               - '13 : ERREUR DE CHECKSUM                            *
<*           - 2X : ERREUR DE PROGRAMMATION                            *
<*               -'21 : ADRESSE GENEREE DANS UNE INSTRUCTION > 32K     *
<*               - '22 : ADRESSE DE CHARGEMENT > 32K                   *
<*               - '23 : PROGRAMME DEPASSANT LA PARTITION MEMOIRE MAXI *
<*           - 3X : ERREUR CHARGEMENT DISQUE                           *
<*               -'31 : DEPASSEMENT @ FIN CHARGEMENT                   *
<*                                                                     *
<*                                                                     *
<***********************************************************************
         PAGE
MEMDSK:  VAL         1              < CHARGEMENT SUR DISQUE
                                    < MEMDSK,M100,M100,
MEMDSK:  VAL         0              < CHARGEMENT EN MEMOIRE
                                    < MEMDSK,,,M100
         IF          MEMDSK,,,M100
         IDP         "LOAD - RELEASE 15/05/1977"
M100:    VAL         0
         IF          MEMDSK,M100,M100,
         IDP         "LDDK - RELEASE 15/05/1977"
M100:    VAL         0
         IDP         "SERGE SOUZEAU"
         PAGE
<***********************************************************************
<*                                                                     *
<*       RESERVATION DE PLACE POUR LE PROGRAMME A CHARGER.             *
<*                                                                     *
<***********************************************************************
         TABLE
<***********************************************************************
<*                                                                     *
<*       VALEURS IMPORTANTES.                                          *
<*                                                                     *
<***********************************************************************
NOUNIT:  VAL         '03             <  UNITE DE LECTURE BINAIRE
         IF          MEMDSK,,,M100
LGINI:   VAL         '800            <  LONGUEUR INITIALE PARTITION
LGDEPL:  VAL         '800            <  LONGUEUR DU DEPLACEMENT
LGCHGM:  VAL         '22A            <  LONGUEUR DU CHARGEUR
SPROG:   VAL         LGINI-LGCHGM-'15 < PLACE INITIALEMENT LIBRE
M100:    VAL         0
<***********************************************************************
<*                                                                     *
<*       INTERFACE AVEC CMS4.                                          *
<*                                                                     *
<***********************************************************************
ZERO:    EQU         $               <  ZERO TRANSLATABLE DU PROGRAMME
         DZS         'C
DITEM:   EQU         $
         IF          MEMDSK,,,M100
         ASCI        "LOAD"
M100:    VAL         0
         IF          MEMDSK,M100,M100,
         ASCI        "LDDK"
M100:    VAL         0
         BYTE        '04;'D0
DBCHIT:  EQU         $
         WORD        SIZE
         WORD        PLOAD
<***********************************************************************
<*                                                                     *
<*       ENTREE DANS LE PROCESSEUR.                                    *
<*                                                                     *
<***********************************************************************
         WORD        LOAD
         PROG
PLOAD:   EQU         $
         LRP         L
         BR          -1,L
         IF          MEMDSK,,,M100
<***********************************************************************
<*                                                                     *
<*       ZONE RESERVEE POUR CHARGER LE PROGRAMME.                      *
<*                                                                     *
<***********************************************************************
         DZS         SPROG
M100:    VAL         0
         IF          MEMDSK,M100,M100,
BUFSOR:  DZS         128
M100:    VAL         0
         PAGE
<***********************************************************************
<*                                                                     *
<*       COMMON.                                                       *
<*                                                                     *
<***********************************************************************
         COMMON
TOUDEB:  EQU         $
BUFFER:  DZS         40              <  BUFFER D'ECRITURE DES MESSAGES
BUFBIN:  DZS         41              <  BUFFER D'ENTREE DU BINAIRE
                                     <  (+1 A CAUSE DE L'INTERFACE SGF)
INDEX:   WORD        80              <  INDEX BUFFER BINAIRE
KSTORE:  DZS         20              <  PILE POUR K
CHKSUM:  DZS         1               <  CHECKSUM
ABSMOD:  WORD        -1              <  INDICATEUR TRANSLATABLE-ABSOLU
ADSTOC:  DZS         2               <  QUADRUPLET 'AU FRAIS'
PAFINI:  DZS         1               <  RELAI POUR SUITE DE COMMANDE
FINMOD:  DZS         1               <  INDICATEUR DE FIN DE MODULE
CPTLOD:  DZS         1               <  COMPTEUR DE REPEAT LOAD
OPNBO:   BYTE        NOUNIT;'05      <  OPEN-OLD ENREGISTREMENT
         WORD        1               <  CLE=1.0
         WORD        0
CCI:     WORD        1               <  RETOUR AU CCI SI  ERREUR
IOCBIN:  BYTE        NOUNIT;'08      <  LECTURE MODE SAVE
         DZS         1
         WORD        82              <  (+2 RESERVES POUR LE SGF)
IOCBL:   WORD        '0202           <  SORTIE LISTING
         DZS         1
         WORD        0
         IF          MEMDSK,M100,M100,
MESDSK:  BYTE        '6D;"D"         < MESSAGE N0 DISQUE
         ASCI        "K="
MESAD1:  BYTE        '6D;"@"         < MESSAGE @ DEBUT
         ASCI        " DEBUT ="
MESAD2:  BYTE        '6D;"@"         < MESSAGE @ FIN
         ASCI        " FIN ="
MESTRA:  BYTE        '6D;"T"         < @ TRANS
         ASCI        "RANS ="
DSKMES:  WORD        '0202           < ENVOI DES MESSAGES
         WORD        MESDSK-ZERO*2
         WORD        4
AD1MES:  WORD        '0202
         WORD        MESAD1-ZERO*2
         WORD        10
AD2MES:  WORD        '0202
         WORD        MESAD2-ZERO*2
         WORD        8
TRAMES:  WORD        '0202
         WORD        MESTRA-ZERO*2
         WORD        8
RELBEN:  WORD        BUFFER+2,X
HEXDEC:  WORD        SPHEXA          < SP CONVERSION CARAC.-BINAIRE
DEMDSK:  WORD        '0101           < DEMANDE N0 DISQUE
         WORD        BUFFER-ZERO*2
         WORD        1
DEMADR:  WORD        '0101           < DEMANDE ADRESSE DISQUE
         WORD        BUFFER-ZERO*2
         WORD        4
ASSDSK:  WORD        '0003           < DEMANDE ASSIGNATION DISQUE
         WORD        '0400
DSKDEB:  WORD        0               < @ DEBUT
DSKFIN:  WORD        0               < @ FIN
ADDTRA:  WORD        0               < @ TRANS
UNFFF:   WORD        '1FFF
LIRDSK:  WORD        '0400           < LECTURE DISQUE
         WORD        BUFSOR-ZERO*2
         WORD        256
         WORD        0
ECRDSK:  WORD        '0402           < ECRITURE DISQUE
         WORD        BUFSOR-ZERO*2
         WORD        256
         WORD        0
ADISK:   WORD        BUFSOR,X        < RELAI VERS BUFFER
LIRMOT:  WORD        LECMOT          < SP DE LECTURE(DISQUE)
ECRMOT:  WORD        PLAMOT          < SP D'ECRITURE UN MOT(DISQUE)
SWRITE:  WORD        WRITED          < SP D'ECRITURE DISQUE
M100:    VAL         0
         IF          MEMDSK,,,M100
<***********************************************************************
<*                                                                     *
<*       ZONE COMPRENANT DES ADRESSES RELATIVES A INCREMENTER          *
<*       LORS DE LA TRANSLATION DU CHARGEUR.                           *
<*       ACCMOD DOIT TOUJOURS ETRE LE DERNIER.                         *
<*                                                                     *
<***********************************************************************
ADEBCM:  EQU         $               <  DEBUT ZONE A TRANSLATER
MAXMEM:  WORD        TOUDEB          <  LIMITE DU PROGRAMME
M100:    VAL         0
ADLANC:  WORD        DEBPG           <  DEBUT DU PROGRAMME CHARGE
RELBUF:  WORD        BUFBIN+1,X      <  RELAI BUFFER BINAIRE BIT INDEX
SORMES:  WORD        ENTMOT          <  SP DE SORTIE QUESTIONS
MERCLF:  WORD        MSGRC           <  SP DE SORTIE DE CR-LF
MESER:   WORD        MSGERR          <  SP DE SORTIE D'ERREURS
BANDEF:  WORD        FINBAN
LITQ:    WORD        SPLITQ          <  SP DE LECTURE 1 QUADRUPLET
AUFRAI:  WORD        ADSTOC+2,X      <  QUADRUPLET 'AU FRAIS'
TABCDE:  WORD        TABAIG,X        <  AIGUILLAGE SUIVANT COMMANDE
TABAIG:  WORD        DEBUT           <  CHARGER EN
         WORD        SUITE           <  CHARGER A LA SUITE SANS TRANSL.
         WORD        LANCT           <  ADRESSE DE LANCEMENT
         WORD        REPEAT          <  REPEAT LOAD
         WORD        CHECK           <  FIN BANDE ET CHECKSUM
         WORD        COMENT          <  COMMENTAIRE
         WORD        PACDE           <  SUITE DE COMMANDE
         WORD        TRANSL          <  CHARGER A LA SUITE EN TRANS.
         WORD        REMADR          <  REMONTER CHAINE ADRESSES
         WORD        DEPADR          <  DEPLACEMENT SUR ADRESSE
         WORD        LECTUR          <  DEBUT DE PST
         WORD        NSECT           <  NOM DE SECTION
         WORD        ENT             <  ENTRY
         WORD        REMJMP          <  DEF. DE REF. AVANT RELATIVE
TRANSB:  WORD        BTRANS          <  SP DE TRANSLATION DE B
RANGB:   WORD        VERIFW          <  SP RANGE B EN VERIFIANT ADRESSE
NEWCHG:  WORD        AUTMOD          <  RELANCE DU MODULE
AREMA2:  WORD        REMAD2          <  SUITE DE COMMANDE CHAINE
ADEPA2:  WORD        DEPAD2          <  SUITE DE COMMANDE DEPLACEMENT
ADRFAT:  WORD        RFATAL          <  TRAITEMENT ERREUR FATALE
ADLECT:  WORD        LECTUR          <  LECTURE DE QUADRUPLETS
ASECT2:  WORD        SECT2           <  SUITE DE COMMANDE NOM
ARJMP2:  WORD        REMJM2          <  SUITE DE COM. REF. AVANT REL.
SORCAR:  WORD        PRECAR          <  SORTIE DE 3 CARACTERES
SORADR:  WORD        ECRADR          <  SORTIE ADRESSE
SORHEX:  WORD        BUFFER+3,X      <  POUR ADRESSE RELATIVE
         IF          MEMDSK,,,M100
AZERCH:  WORD        ZEROCH          <  ADRESSE DE MISE A ZERO CHARGEUR
ADDEBX:  WORD        TOUDEB,X        <  DEBUT DE MISE A ZERO
AFINZ:   WORD        FINZER          <  FIN DE MISE A ZERO DU CHARGEUR
ACCMOD:  WORD        AFINCM,X        <  FIN DE MODIFICATION
                                     <  LORS DU DEPLACEMENT DU CHARGEUR
AFINCM:  EQU         $               <  FIN DE ZONE A TRANSLATER
<***********************************************************************
<*                                                                     *
<*       FIN DE ZONE D'ADRESSES A TRANSLATER.                          *
<*                                                                     *
<***********************************************************************
ADDEB:   WORD        TOUDEB          <  DEBUT DU CHARGEUR
NBCMOD:  VAL         AFINCM-ADEBCM   <  NB D'ADRESSES A MODIFIER
DEUXK:   WORD        LGDEPL          <  LONGUEUR DU DEPLACEMENT
DEBCHG:  VAL         TOUDEB-ZERO
LGLOAD:  WORD        LGINI-DEBCHG-16 <  LONGUEUR DU CHARGEUR
LGZERO:  DZS         1               <  LONGUEUR A METTRE A ZERO
M100:    VAL         0
ADINIT:  DZS         1               <  DEBUT CHARGEMENT D'UN MODULE
         IF          MEMDSK,,,M100
LGPART:  WORD        LGINI           <  LONGUEUR DE LA PARTITION
ALLOC:   WORD        '0004           <  RESERVATION INITIALE
         WORD        0
         DZS         1
M100:    VAL         0
RCLF:    WORD        '0D0A           <  CR-LF
ERREUR:  ASCI        "ERU "          <  MESSAGE D'ERREUR
START:   ASCI        "RUN "          <  MESSAGE RUN
TRENTE:  WORD        '3030
NB7FFF:  WORD        '7FFF
BLQ:     ASCI        " '"
MCLOS:   ASCI        "!CLOSE"        < !CLOSE
         BYTE        '04;0
DEMCLO:  WORD        '0002           < DEMANDE DE "!CLOSE"
         DZS         1
         WORD        80
         PAGE
<***********************************************************************
<*                                                                     *
<*       C H A R G E U R .                                             *
<*                                                                     *
<*       INITIALISATION DU CHARGEUR.                                   *
<*                                                                     *
<***********************************************************************
         PROG
         WORD        TOUDEB+128
LOAD:    EQU         $
         LRP         C               < INITIALISATION DE LA BASE C
         LA          -1,C
         LR          A,C
         IF          MEMDSK,,,M100
         LAI         -1              < RENDRE ALT-MODE INEFFECTIF
         WORD        '1EB5
M100:    VAL         0
         LAD         KSTORE-1        <  INITIALISATION DE K
         LR          A,K
         LAD         MCLOS           < INITIALISATION ADRESSE CLOSE
         SLLS        1
         STA         DEMCLO+1
         LAD         BUFBIN          <  INIT. ADRESSES BUFFERS
         SLLS        1
         STA         IOCBIN+1
         LAD         BUFFER
         SLLS        1
         STA         IOCBL+1
         IF          MEMDSK,,,M100
         LA          LGPART          <  INIT. DEMANDE MEMOIRE
         SLLS        1
         STA         ALLOC+2
         LA          AFINZ           <  INIT. LGZERO
         SB          MAXMEM
         STA         LGZERO
M100:    VAL         0
         EORR        W               <  ADRESSE DEBUT CHARGEMENT
         BSR         MERCLF          <  ENVOI DE CRT CHARGEMENT
         LAD         DEMCLO          < !CLOSE
         SVC         0
         BR          BANDEF
<***********************************************************************
<*                                                                     *
<*       OUVERTURE DU FICHIER CONTENANT LE MODULE A CHARGER.           *
<*                                                                     *
<***********************************************************************
AUTMOD:  EQU         $
         IF          MEMDSK,M100,M100,
DDSK1:   EQU         $
         LBY         ASSDSK+1        < N0 DISQUE=0
         STZ         ASSDSK+1
         STBY        ASSDSK+1
         LAD         DSKMES          < N0 DISQUE
         SVC         0
         LAD         DEMDSK
         SVC         0
         LA          BUFFER          < VERIFICATION
         SLRS        8
         ADRI        -'30,A
         CPI         2
         JE          DDSK2
         CPI         3
         JNE         DDSK1
DDSK2:   EQU         $
         ADRI        '22,A           < PLACER
         AD          ASSDSK+1        < DANS ASSIGN DISQUE
         STA         ASSDSK+1
         LAD         AD1MES          < @ DEBUT
         SVC         0
         LAD         DEMADR
         SVC         0
         BSR         HEXDEC
         JANE        DDSK1
         LR          B,A             < VERIFICATION
         JAL         DDSK1
         CP          UNFFF
         JG          DDSK1
         STB         DSKDEB          < PLACER
         STB         LIRDSK+3
         STB         ECRDSK+3
         LAD         AD2MES          < @ FIN
         SVC         0
         LAD         DEMADR
         SVC         0
         BSR         HEXDEC
         JANE        DDSK1
         LR          B,A             < VERIFICATION
         JAL         DDSK1
         CP          UNFFF
         JG          DDSK1
         STB         DSKFIN
         LR          B,A             < VERIFICATION
         CP          DSKDEB
         JLE         DDSK1
         LAD         TRAMES          < @ TRANS
         SVC         0
         LAD         DEMADR
         SVC         0
         BSR         HEXDEC
         JANE        DDSK1
         STB         ADDTRA
         LAI         '1B             < CHANGER LE ALT-MODE
         WORD        '1EA5
         LAD         ASSDSK          < ASSIGNER LE DISQUE
         SVC         0
         LA          DSKDEB         < MISE A ZERO ESPACE DISQUE
         STA         ECRDSK+3
ECRZER:  EQU         $
         LAD         ECRDSK
         SVC         0
         IC          ECRDSK+3
         LA          ECRDSK+3
         CP          DSKFIN
         JL          ECRZER
M100:    VAL         0
         LAD         OPNBO           <  OUVERTURE DU FICHIER BINAIRE
         SVC         0               <  DANS LE MODE OPEN-OLD-ENREGIS-
                                     <  TREMENT
         JE          RELANS          <  GO ON SI OPEN OK
<***********************************************************************
<*                                                                     *
<*       SORTIE EN ERREUR DU LOAD.                                     *
<*                                                                     *
<***********************************************************************
HORTEN:  EQU         $
         IF          MEMDSK,M100,M100,
         LBY         ASSDSK+1        < DESASSIGNER LE DISQUE
         STZ         ASSDSK+1
         STBY        ASSDSK+1
         LAD         ASSDSK
         SVC         0
M100:    VAL         0
         LAD         CCI             <  RETOUR AU CCI
         SVC         0
         JMP         $-1
<***********************************************************************
<*                                                                     *
<*       ERREUR FATALE.                                                *
<*                                                                     *
<***********************************************************************
RFATAL:  EQU         $
         XR          A,K             <  REINITIALISATION DE K
         LAD         KSTORE-1
         XR          A,K
         BSR         MESER           <  SORTIE DU MESSAGE D'ERREUR
         JMP         HORTEN
         PAGE
<***********************************************************************
<*                                                                     *
<*       DEBUT DU CHARGEMENT.                                          *
<*       COMMANDE 'A3 POUR TRANSLATABLE,                               *
<*       SINON, C'EST EN ABSOLU.                                       *
<*                                                                     *
<***********************************************************************
RELANS:  EQU         $
         BSR         LITQ            <  LECTURE 1ER QUADRUPLET
         CPI         'A3             <  MODULE TRANSLATABLE ?
         JNE         ANALIZ          <  SI ABSOLU, ABSMOD=-1
         IC          ABSMOD          <  SI TRANSLATABLE, ABSMOD=0
<***********************************************************************
<*                                                                     *
<*       LECTURE DES QUADRUPLETS ET ANALYSE D'UNE COMMANDE.            *
<*                                                                     *
<***********************************************************************
LECTUR:  EQU         $
         BSR         LITQ            <  LECTURE D'UN QUADRUPLET
ANALIZ:  EQU         $
         ANDI        3               <  COMMANDE ABSOLU OU TRANSLATABLE
         JAE         ABSOL
         CPI         2               <  COMMANDE TRANSLATABLE
         JNE         ERCMDE
         CPZ         ABSMOD
         JL          PATRAN
         LBY         ADSTOC          <  NUMERO DE LA COMMANDE
         ANDI        '1C
         ADRI        '18,A
NUMCDE:  EQU         $               <  AIGUILLAGE SUIVANT COMMANDE
         SLRS        2
         LR          A,X
         BR          &TABCDE
ABSOL:   EQU         $               <  COMMANDE ABSOLUE
         LBY         ADSTOC
         ANDI        '1C
         CPI         '14
         JLE         NUMCDE
ERCMDE:  EQU         $               <  NUMERO COMMANDE ERRONNE
         LAI         '11
         BR          ADRFAT
PATRAN:  EQU         $               <  COMMANDE ABSOLUE EN TRANSLATAB.
         LAI         '12
         BR          ADRFAT
         PAGE
<***********************************************************************
<*                                                                     *
<*       'A0 - CHARGER EN.                                             *
<*       POSITIONNER W.                                                *
<*                                                                     *
<***********************************************************************
DEBUT:   EQU         $
         BSR         TRANSB          <  ADRESSE RELATIVE DEBUT PARTITIO
         LR          B,W
         JMP         LECTUR
         PAGE
<***********************************************************************
<*                                                                     *
<*       '24 - CHARGER A LA SUITE SANS TRANSLATER.                     *
<*       RANGER A LA SUITE EN TENANT COMPTE DU REPEAT LOAD.            *
<*                                                                     *
<***********************************************************************
SUITE:   EQU         $
         BSR         RANGB           <  RANGEMENT DE L'INFORMATION
         ADRI        1,W
         DC          CPTLOD          <  REPEAT LOAD?
         JG          SUITE
         STZ         CPTLOD          <  REMISE A ZERO DU REPEAT LOAD
         JMP         LECTUR
         PAGE
<***********************************************************************
<*                                                                     *
<*       '28 - ADRESSE DE LANCEMENT.                                   *
<*       RELEVER L'ADRESSE.                                            *
<*                                                                     *
<***********************************************************************
LANCT:   EQU         $
         BSR         TRANSB          <  ADRESSE RELATIVE DEBUT PARTITIO
         STB         &ADLANC
         IC          FINMOD          <  FIN DE MODULE=1
         JMP         LECTUR
         PAGE
<***********************************************************************
<*                                                                     *
<*       'AC - REPEAT LOAD.                                            *
<*       POSITIONNER LE COMPTEUR.                                      *
<*                                                                     *
<***********************************************************************
REPEAT:  EQU         $
         STB         CPTLOD
         BR          ADLECT
         PAGE
<***********************************************************************
<*                                                                     *
<*       '30 - CHECKSUM ET FIN DE BANDE.                               *
<*       VERIFICATION DU CHECKSUM ET FIN DE CHARGEMENT.                *
<*                                                                     *
<***********************************************************************
CHECK:   EQU         $
         LA          CHKSUM          <  VERIFICATION
         CPR         B,A
         JNE         FAUSUM
         IF          MEMDSK,M100,M100,
         BSR         SWRITE          < ECRIRE DERNIER SECTEUR
         LBY         ASSDSK+1        < DESASSIGNER LE DISQUE
         STZ         ASSDSK+1
         STBY        ASSDSK+1
         LAD         ASSDSK
         SVC         0
M100:    VAL         0
         LA          OPNBO           <  MISE EN MODE CLOSE-SAVE DE LE
         LR          A,Y             <  SAUVER L'ETAT ACTUEL
         ORI         2               <  DEMANDE 'OPNBO'
         STA         OPNBO
         LAD         OPNBO           <  FERMETURE EN SAVE DE
         SVC         0               <  L'ENREGISTREMENT
         STY         OPNBO           <  RESTAURER L'ETAT INITIAL
         LAD         DEMCLO          < !CLOSE
         SVC         0
         CPZ         FINMOD          <  FIN DE MODULE?
         JE          FINBAN          <  FIN DE BANDE UNIQUEMENT
         LA          &ADLANC
         JAL         FINBAN          <  FIN DE MODULE SANS LANCEMENT
         LAD         START           <  IMPRESSION ADRESSE LANCEMENT
         BSR         SORMES
         LA          &ADLANC
         BSR         SORADR
         IF          MEMDSK,,,M100
         BR          AZERCH          <  REMETTRE LE CHARGEUR A ZERO
M100:    VAL         0
         IF          MEMDSK,M100,M100,
         LAD         CCI             < RETOUR CCI
         SVC         0
         JMP         $-1
M100:    VAL         0
<***********************************************************************
<*                                                                     *
<*       FIN DE BANDE - RETOUR AU MONITEUR.                            *
<*                                                                     *
<***********************************************************************
FINBAN:  EQU         $
         LR          W,A             <  DEBUT MODULE SUIVANT
         STA         ADINIT
         LAD         CCI             <  RETOUR MONITEUR
         SVC         0
         STZ         CHKSUM          <  REINITIALISER LES VALEURS DE
         LAI         80              <  DEPART DES VARIABLES
         STA         INDEX
         LAI         -1
         STA         ABSMOD
         STZ         FINMOD
         STZ         CPTLOD
         BR          NEWCHG          <  TRAITER LE MODULE SUIVANT
<***********************************************************************
<*                                                                     *
<*       ERREUR DANS LE CHECKSUM.                                      *
<*                                                                     *
<***********************************************************************
FAUSUM:  EQU         $
         LAI         '13
         BR          ADRFAT
         PAGE
<***********************************************************************
<*                                                                     *
<*       'B4 - COMMENTAIRE.                                            *
<*       L'ECRIRE.                                                     *
<*                                                                     *
<***********************************************************************
COMENT:  EQU         $
         BSR         SORCAR
         BR          ADLECT
         PAGE
<***********************************************************************
<*                                                                     *
<*       '22 - SUITE DE COMMANDE.                                      *
<*       SE REBRANCHER A LA COMMANDE CONCERNEE.                        *
<*                                                                     *
<***********************************************************************
PACDE:   EQU         $
         BR          PAFINI
         PAGE
<***********************************************************************
<*                                                                     *
<*       'A6 - CHARGER A LA SUITE EN TRANSLATANT.                      *
<*       TRANSLATER ET ALLER CHARGER.                                  *
<*                                                                     *
<***********************************************************************
TRANSL:  EQU         $
         BSR         TRANSB          <  ADRESSE RELATIVE DEBUT PARTITIO
         JMP         SUITE
         PAGE
<***********************************************************************
<*                                                                     *
<*       'AA - REMONTER UNE CHAINE D'ADRESSES.                         *
<*       MEMORISATION DE L'ADRESSE DE DEBUT DE CHAINE.                 *
<*                                                                     *
<***********************************************************************
REMADR:  EQU         $
         PSR         W               <  PROTEGER W
         BSR         TRANSB          <  ADRESSE RELATIVE DEBUT PARTITIO
         LR          B,W             <  MEMORISER L'ADRESSE
         LA          AREMA2          <  PREPARER LA SUITE DE COMMANDE
STAPAF:  EQU         $
         STA         PAFINI
         BR          ADLECT
<***********************************************************************
<*                                                                     *
<*       SUITE DE COMMANDE CHAINE.                                     *
<*       REMONTER LA CHAINE POUR Y PLACER LA VALEUR.                   *
<*                                                                     *
<***********************************************************************
REMAD2:  EQU         $
         BSR         TRANSB          <  ADRESSE RELATIVE DEBUT PARTITIO
         IF          MEMDSK,,,M100
         LA          0,W             <  PRELEVER LE 1ER MAILLON
M100:    VAL         0
         IF          MEMDSK,M100,M100,
         BSR         LIRMOT
M100:    VAL         0
         JAL         BIT01           <  PRELEVER SON BIT D'INDEX
         RBT         16
         JMP         BIT00
BIT01:   EQU         $
         SBT         16
         RBT         0
BIT00:   EQU         $
         IF          MEMDSK,,,M100
         STB         0,W             <  PLACER LA VALEUR D'ADRESSE
M100:    VAL         0
         IF          MEMDSK,M100,M100,
         BSR         ECRMOT
M100:    VAL         0
         CP          NB7FFF          <  FIN DE CHAINE?
         JE          PLRW
         LR          A,W             <  NON - POURSUIVRE
         JMP         REMAD2
         PAGE
<***********************************************************************
<*                                                                     *
<*       '2E - DEPLACEMENT SUR ADRESSE.                                *
<*       MEMORISATION DE L'ADRESSE.                                    *
<*                                                                     *
<***********************************************************************
DEPADR:  EQU         $
         PSR         W               <  PROTEGER W
         BSR         TRANSB          <  ADRESSE RELATIVE DEBUT PARTITIO
         LR          B,W             <  PRELEVER L'ADRESSE A MODIFIER
         LA          ADEPA2          <  PREPARER LA SUITE DE COMMANDE
         JMP         STAPAF
<***********************************************************************
<*                                                                     *
<*       SUITE DE COMMANDE DEPLACEMENT.                                *
<*       MODIFICATION DE LA VALEUR.                                    *
<*                                                                     *
<***********************************************************************
DEPAD2:  EQU         $
         IF          MEMDSK,,,M100
         LA          0,W             <  PRELEVER L'ADRESSE A MODIFIER
M100:    VAL         0
         IF          MEMDSK,M100,M100,
         BSR         LIRMOT
M100:    VAL         0
         LR          A,Y             <  LA PRESERVER POUR BIT D'INDEX
         RBT         0
         ADR         A,B             <  MODIFICATION
         JNV         ADNORM
         LAI         '21             <  ADRESSE GENEREE > 32K
         BR          ADRFAT
ADNORM:  EQU         $
         CPR         Y,A             <  RESTAURER LE BIT D'INDEX
         JE          $+2
         SBT         16
         IF          MEMDSK,,,M100
         STB         0,W             <  RANGER LA VALEUR MODIFIEE
M100:    VAL         0
         IF          MEMDSK,M100,M100,
         BSR         ECRMOT
M100:    VAL         0
<***********************************************************************
<*                                                                     *
<*       RESTAURER W.                                                  *
<*                                                                     *
<***********************************************************************
PLRW:    EQU         $
         PLR         W
         BR          ADLECT
         PAGE
<***********************************************************************
<*                                                                     *
<*       '36 - NOM DE SECTION.                                         *
<*       IMPRESSION DU DEBUT DU NOM.                                   *
<*                                                                     *
<***********************************************************************
NSECT:   EQU         $
         BSR         MERCLF          <  IMPRESSION DE CR-LF
         BSR         SORCAR          <  IMPRESSION DES TROIS PREMIERS
                                     <  CARACTERES DU NOM
         LA          ASECT2          <  PREPARER LA SUITE DE NOM
         JMP         STAPAF
<***********************************************************************
<*                                                                     *
<*       SUITE DE COMMANDE NOM.                                        *
<*       IMPRESSION DE LA FIN DE NOM ET DE L'ADRESSE DE DEBUT.         *
<*                                                                     *
<***********************************************************************
SECT2:   EQU         $
         BSR         SORCAR          <  IMPRESSION DE FIN DE NOM
         LR          W,A             <  IMPRESSION DE ADRESSE IMPLANTA.
         BSR         SORADR
         BR          ADLECT
         PAGE
<***********************************************************************
<*                                                                     *
<*       '3A - COMMANDE ENT.                                           *
<*       COMMANDE INUTILISEE.                                          *
<*                                                                     *
<***********************************************************************
ENT:     EQU         $
         LA          ADLECT
         JMP         STAPAF
         PAGE
<***********************************************************************
<*                                                                     *
<*       'BE - REFERENCE EN AVANT RELATIVE.                            *
<*       PRELEVER LE PREMIER MAILLON.                                  *
<*                                                                     *
<***********************************************************************
REMJMP:  EQU         $
         PSR         W               <  PROTEGER W
         BSR         TRANSB          <  ADRESSE RELATIVE DEBUT PARTITIO
         LR          B,W             <  RELEVER LE 1ER MAILLON
         LA          ARJMP2          <  PREPARER LA SUITE DE COMMANDE
         JMP         STAPAF
<***********************************************************************
<*                                                                     *
<*       SUITE DE REFERENCE AVANT RELATIVE.                            *
<*       MODIFICATION SUR LA CHAINE.                                   *
<*                                                                     *
<***********************************************************************
REMJM2:  EQU         $
         BSR         TRANSB          <  ADRESSE RELATIVE DEBUT PARTITIO
         LR          B,A             <  A=REF. EN AVANT
         SBR         W,A             <  DIFFERENCE D'ADRESSE
         IF          MEMDSK,,,M100
         LB          0,W             <  PRELEVER MAILLON SUIVANT
M100:    VAL         0
         IF          MEMDSK,M100,M100,
         PSR         A
         BSR         LIRMOT
         LR          A,B
         PLR         A
M100:    VAL         0
         SCRD        8               <  FABRICATION DU MOT DEFINITIF
         SWBR        B
         IF          MEMDSK,,,M100
         STB         0,W             <  RANGEMENT DE LA VALEUR
M100:    VAL         0
         IF          MEMDSK,M100,M100,
         BSR         ECRMOT
M100:    VAL         0
         SWBR        A               <  AD. RELATIVE MAILLON SUIVANT
         SBR         A,W             <  AD. ABSOLUE DU MAILLON SUIVANT
         JANE        REMJM2          <  CHAINE FINIE PAR 0
         JMP         PLRW
         PAGE
<***********************************************************************
<*                                                                     *
<*       LECTURE D'UN QUADRUPLET.                                      *
<*       FORME D'UN QUADRUPLET :                                       *
<*       -----------------------------------------                     *
<*       I  P I  . I  + I  X I  X I  X I  X I  X I                     *
<*       -----------------------------------------                     *
<*       I  P I  + I 12 I 13 I 14 I 15 I  + I  . I                     *
<*       -----------------------------------------                     *
<*       I  P I  + I  6 I  7 I  8 I  9 I 10 I 11 I                     *
<*       -----------------------------------------                     *
<*       I  P I  + I  0 I  1 I  2 I  3 I  4 I  5 I                     *
<*       -----------------------------------------                     *
<*       AVEC : - P  PARITE DE L'OCTET                                 *
<*              - .  BIT A 0                                           *
<*              - +  BIT A 1                                           *
<*              - XXXXX  VALEUR DE LA COMMANDE                         *
<*              - 15,14,ETC  BIT DE LA VALEUR.                         *
<*                                                                     *
<***********************************************************************
SPLITQ:  EQU         $
         LYI         0               <  POUR SIGNALER 1ER CARACTERE
         LXI         -4              <  NB CARACTERE
         PSR         B,X,Y           <  PROTEGER LES REGISTRES DE TRAV.
         LAI         80              <  DOIT-ON RELIRE?
         CP          INDEX
         JNE         PAVID
         LAD         IOCBIN          <  LECTURE
         SVC         0
         JNE         NOPAIR          <  ERREUR DANS LE SGF
         STZ         INDEX
PAVID:   EQU         $
         LX          INDEX           <  PRELEVER LE BYTE SUIVANT
         LBY         &RELBUF
         IC          INDEX
         PLR         B,X,Y           <  RESTAURER LES REGISTRES
         STBY        &AUFRAI
         CPZR        Y               <  1ER CARACTERE(COMMANDE)?
         JNE         STOCK
         ANDI        '60             <  SI BLANC, RELIRE
         CPI         '20
         JNE         SPLITQ+2
         ADRI        1,Y             <  1ER CARACTERE TROUVE
STOCK:   EQU         $
         JIX         SPLITQ+2        <  PRELEVER LES 3 AUTRES CARAC.
         LBY         ADSTOC
         CPI         '30             <  DOIT-ON LE RENTRER DANS CHECKSU
         JE          PACHEK
         LA          CHKSUM          <  CALCUL CHECKSUM
         AD          ADSTOC
         ADCR        A
         AD          ADSTOC+1
         ADCR        A
         STA         CHKSUM
PACHEK:  EQU         $
         LXI         -3              <  A=COMMANDE, B=INFO
         LBY         &AUFRAI
         SLRD        6
         JIX         $-2
         LBY         ADSTOC
         RSR
NOPAIR:  EQU         $               <  ERREUR DE PARITE
         LAI         '01
         BR          ADRFAT
         PAGE
<***********************************************************************
<*                                                                     *
<*       TRANSLATION DE L'ADRESSE CONTENUE DANS B.                     *
<*                                                                     *
<***********************************************************************
BTRANS:  EQU         $
         LR          B,A
         AD          ADINIT          <  TRANSLATION
         LR          A,B
         RSR
         PAGE
<***********************************************************************
<*                                                                     *
<*       RANGEMENT DE B AVEC DEPLACEMENT DU CHARGEUR SI NECESSAIRE.    *
<*                                                                     *
<***********************************************************************
VERIFW:  EQU         $
         LR          W,A             <  ADRESSE>32K?
         JAGE        WNORM
         LAI         '22
         BR          ADRFAT
WNORM:   EQU         $               <  ADRESSE DANS LE CHARGEUR?
         IF          MEMDSK,,,M100
         CP          MAXMEM
         JGE         DEPLAC
         STB         0,W             <  NORMAL. PLACER LA VALEUR
M100:    VAL         0
         IF          MEMDSK,M100,M100,
         BSR         ECRMOT
M100:    VAL         0
         RSR
         IF          MEMDSK,,,M100
<***********************************************************************
<*                                                                     *
<*       DEPLACEMENT DU CHARGEUR.                                      *
<*                                                                     *
<***********************************************************************
DEPLAC:  EQU         $
         PSR         B,X,Y           <  PROTEGER LES REGISTRES DE TRAV.
         LA          DEUXK           <  MODIF DE LA TAILLE DE LA DEMAND
         SLLS        1
         AD          ALLOC+2
         STA         ALLOC+2
         LAD         ALLOC           <  DEMANDER 2K
         SVC         0
         JE          PAGOBT
         LAI         '23             <  MEMOIRE NON OBTENUE
         BR          ADRFAT
PAGOBT:  EQU         $
         LXI         -NBCMOD         <  NB ADRESSES A MODIFIER
                                     <  DANS LE COMMON
MODCOM:  EQU         $
         LA          &ACCMOD         <  MODIFICATION
         AD          DEUXK
         STA         &ACCMOD
         JIX         MODCOM
         LA          DEUXK           <  MODIFIER LES ADRESSES DE BYTES
         SLLS        1
         AD          IOCBIN+1
         STA         IOCBIN+1
         LA          DEUXK
         SLLS        1
         AD          IOCBL+1
         STA         IOCBL+1
         LA          DEUXK
         SLLS        1
         AD          DEMCLO+1
         STA         DEMCLO+1
         LA          ADDEB           <  RECOPIE DU CHARGEUR
         AD          DEUXK
         LR          A,B
         LA          ADDEB
         LX          LGLOAD
         MOVE
         LA          DEUXK           <  MODIFIER LES REGISTRES DE BASE
         ADR         A,K
         ADR         A,L
         ADR         A,C
         ADRI        1,A
         ADRP        A               <  ALLER DANS LE NOUVEAU CHARGEUR
         LX          DEUXK           <  MISE A 0 DES 2K LIBERES
         NGR         X
MEMZER:  EQU         $
         STZ         &ADDEBX
         JIX         MEMZER
         LA          ADDEB           <  MODIF. DE ADRESSE DEBUT CHARG.
         AD          DEUXK
         STA         ADDEB
         PLR         B,X,Y           <  RESTAURER LES REGISTRES
         STB         0,W             <  PLACER LA VALEUR
         PLR         A               <  MODIFIER ADRESSE DE RETOUR
         AD          DEUXK
         PSR         A
         RSR
M100:    VAL         0
         PAGE
         IF          MEMDSK,M100,M100,
<***********************************************************************
<*                                                                     *
<*       LECTURE D'UN MOT POINTE PAR W DANS A.                         *
<*                                                                    *
<***********************************************************************
LECMOT:  EQU         $
         LR          W,A             < @ DANS SECTEUR
         AD          ADDTRA
         ANDI        '7F
         LR          A,X
         LR          W,A             < N0 SECTEUR
         AD          ADDTRA
         SLRS        7
         AD          DSKDEB          < VERIFICATION LIMITE
         CP          DSKFIN
         JGE         ERRDSK
         CP          LIRDSK+3        < RESIDENT?
         JNE         LRMT1
         LA          &ADISK          < OUI - LIRE LE MOT
         RSR
LRMT1:   EQU         $
         PSR         X               < NON - ECRIRE SECTEUR COURANT
         PSR         A
         BSR         SWRITE
         PLR         A               < LIRE BON SECTEUR
         STA         LIRDSK+3
         LAD         LIRDSK
         SVC         0
         PLR         X               < LIRE LE MOT
         LA          &ADISK
         RSR
<***********************************************************************
<*                                                                     *
<*       ECRITURE D'UN MOT POINTE PAR W CONTENU DANS B.                *
<*                                                                     *
<***********************************************************************
PLAMOT:  EQU         $
         PSR         A               < @ DANS SECTEUR
         LR          W,A
         AD          ADDTRA
         ANDI        '7F
         LR          A,X
         LR          W,A             < N0 SECTEUR
         AD          ADDTRA
         SLRS        7
         AD          DSKDEB          < VERIFICATION LIMITE
         CP          DSKFIN
         JGE         ERRDSK
         CP          LIRDSK+3        < RESIDENT?
         JNE         PLMT1
         STB         &ADISK          < OUI - PLACER LE MOT
         PLR         A
         RSR
PLMT1:   EQU         $
         PSR         X               < NON - ECRIRE SECTEUR COURANT
         PSR         A
         BSR         SWRITE
         PLR         A               < LIRE BON SECTEUR
         STA         LIRDSK+3
         LAD         LIRDSK
         SVC         0
         PLR         X               < PLACER LE MOT
         STB         &ADISK
         PLR         A
         RSR
ERRDSK:  EQU         $
         LAI         '31             < ERREUR DISQUE
         BR          ADRFAT
<***********************************************************************
<*                                                                     *
<*       CONVERSION DE 4 CARACTERES EN BINAIRE(DANS B)                 *
<*                                                                     *
<***********************************************************************
SPHEXA:  EQU         $
         LXI         -4
HEXA1:   EQU         $
         LBY         &RELBEN         < TRAITER UN CARACTERE
         ADRI        -'30,A
         CPI         9
         JLE         HEXA2
         ADRI        -7,A
HEXA2:   EQU         $
         JAL         HEXA3           < VERIFIC@ATION
         CPI         'F
         JG          HEXA3
         SLLS        12
         SCLD        4
         JIX         HEXA1
         LAI         0
         RSR
HEXA3:   EQU         $
         LAI         1
         RSR
<***********************************************************************
<*                                                                     *
<*       SP D'ECRITURE SUR DISQUE                                      *
<*                                                                     *
<***********************************************************************
WRITED:  EQU         $
         LA          LIRDSK+3
         STA         ECRDSK+3
         LAD         ECRDSK
         SVC         0
         RSR
M100:    VAL         0
         PAGE
<***********************************************************************
<*                                                                     *
<*       IMPRESSION DU CONTENU DE A.                                   *
<*                                                                     *
<***********************************************************************
ECRADR:  EQU         $
         SLRD        16              <  PREPARER LE DECOUPAGE PAR 4 BIT
         LXI         -4
CARSUI:  EQU         $
         SLLD        4               <  ISOLER 4 BITS
         ADRI        '30,A           <  CARACTERE IMPRIMABLE
         CPI         '39
         JLE         $+2
         ADRI        7,A
         STBY        &SORHEX         <  MISE DANS LE BUFFER
         LAI         0
         JIX         CARSUI
         STZ         &SORHEX
         LA          BLQ             <  METTRE '
         STA         BUFFER
         JMP         SORTI6
<***********************************************************************
<*                                                                     *
<*       SORTIE DE TROIS CARACTERES.                                   *
<*                                                                     *
<***********************************************************************
PRECAR:  EQU         $
         LA          ADSTOC          <  PLACER 3 CARAC. DANS LE BUFFER
         LB          ADSTOC+1
         SLLD        8
         STA         BUFFER
         STB         BUFFER+1
         JMP         SORTI3
<***********************************************************************
<*                                                                     *
<*       SORTIE D'UN MESSAGE SUIVANT LE NOMBRE DE CARACTERES.          *
<*                                                                     *
<***********************************************************************
SORTI6:  EQU         $
         LXI         6               <  6 CARACTERES
         JMP         $+2
SORTI3:  EQU         $
         LXI         3               <  3 CARACTERES
         STX         IOCBL+2
         LXI         0               <  X=0  LOG LISTING
         JMP         APIOCS
MSGRC:   EQU         $               <  SORTIE DE RC-LF
         LXI         2
         STX         IOCBL+2
         LXI         0
         JMP         RETLF
MSGERR:  EQU         $               <  SORTIE D'UN MESSAGE
         LXI         8
         STX         IOCBL+2
         LXI         1               <  X=1  ERROR LISTING
         SLRD        4               <  NUMERO ERREUR
         SLLS        4
         SLLD        4
         AD          TRENTE
         STA         BUFFER+3
         LAD         ERREUR
         JMP         INBUF4
ENTMOT:  EQU         $               <  PREPARATION DU MESSAGE
         LXI         6
         STX         IOCBL+2
         LXI         0
INBUF4:  EQU         $
         XR          A,W
         LB          0,W
         STB         BUFFER+1
         LB          1,W
         STB         BUFFER+2
         XR          A,W
RETLF:   EQU         $               <  CR-LF
         LA          RCLF
         STA         BUFFER
APIOCS:  EQU         $               <  IMPRESSION
         LAD         IOCBL
         SVC         0
         RSR
         PAGE
         IF          MEMDSK,,,M100
<***********************************************************************
<*                                                                     *
<*       MISE A ZERO DU CHARGEUR EN FIN DE TRAITEMENT.                 *
<*                                                                     *
<***********************************************************************
ZEROCH:  EQU         $
         LA          ADLANC          <EMPILER L'ADRESSE DE LANCEMENT
         LR          A,K
         LA          ADDEB           <  MISE A ZERO
         LR          A,B
         ADRI        1,A
         LX          LGZERO
FINZER:  EQU         $
         STZ         &AFINZ
         MOVE
         LAI         '12             < RESTAURER LE ALT-MODE
         WORD        '1EB5
         ADRI        1,K             <  RETOUR AU CCI POUR
         LR          K,A             <  DEBUG EVENTUEL
         SVC         0
         ADRI        -1,K
         RSR                         <  LANCEMENT DU PROGRAMME
M100:    VAL         0
DEBPG:   WORD        0
         WORD        1               <  RETOUR AU CCI
FITEM:   EQU         $
LGIT:    VAL         FITEM-DBCHIT*2
SIZE:    EQU         ZERO+LGIT
         PAGE
<***********************************************************************
<*                                                                     *
<*       GENERATION DU CHARGEUR EN TANT QUE ITEM.                      *
<*                                                                     *
<***********************************************************************
         LOCAL
LONGR:   VAL         FITEM-DITEM
DEMSGN:  WORD        '8402           < DEMANDE GENERATION
         WORD        DITEM-ZERO*2
         WORD        LONGR*2
         WORD        6
         PROG
         WORD        DEMSGN+128
         WORD        TOUDEB+128
GENERE:  EQU         $
         LRP         L               < INITIALISATIONS DES BASES
         LR          L,C
         LA          -2,L
         LR          A,L
         LA          -1,C
         LR          A,C
         LAD         KSTORE-1
         LR          A,K
DEM:     EQU         $
         LAD         DEMSGN
         SVC         0
         JE          FIN
         LAD         CCI
         SVC         0
         JMP         DEM
FIN:     EQU         $
         LAD         CCI
         SVC         0
         JMP         FIN
         END         GENERE



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