NMPROC:  VAL         "DG"            < NOM DU PROCESSEUR.
         IDP         "DG - RELEASE 01/06/1979"
         IDP         "JOHN F. COLONNA"
         EOT         #SIP DEF PROCESSEUR#
         PROG
         WORD        IMAGE           < ENTRY POINT DU GENERATEUR.
         WORD        0
PIMAGE:  EQU         $               < P='12 !!!
         LRP         L
         BR          -2,L            < ENTRY DANS LE PROCESSEUR.
         EOT         #SIP DEFINITION ITEM#
ITEM1:   EQU         ZERO+PILE-LTNI  < @ITEM1.
ITEM2:   EQU         ZERO+PILE-LTNI-LTNI
         PAGE
<
<
<        L O C A L  :
<
<
         LOCAL
LOC:     EQU         $
<
< BUFFER ET MESSAGES :
<
NOMSEG:  WORD        0               < SEGMENT INVALIDE INITIALEMENT.
SEGSGN:  DZS         4               < SEGMENT GRAPHIQUE COURANT.
LONSEG:  VAL         $-NOMSEG*2
SEG:     EQU         SEGSGN
SEG1:    DZS         4               < SAUVEGARDE ET CUMUL SEGMENT.
ORIG:    DZS         4               < 1ER SEGMNT D'UNE ITERATION (POUR
                                     < 'EDSO' ET 'EDSE').
REP:     WORD        0               < REPONSE DE REDUCTION.
M1:      BYTE        9;'6D
         ASCI        "EDITION?"
M2:      BYTE        13;'6D
         ASCI        "DEPLACEMENT="
MX:      BYTE        2;'6D
         ASCI        "X="
MY:      BYTE        2;'6D
         ASCI        "Y="
MK:      BYTE        2;'6D
         ASCI        "K="
MC:      BYTE        1;0             < EDITION DU CODE GENERE.
M3:      BYTE        21;'6D
         ASCI        "REDUCTION #SEGMENTS?"
M4:      BYTE        14;'6D
         ASCI        "TRACE POINTS? "
M5:      BYTE        3;'6D
         ASCI        "A="
M6:      BYTE        3;'6D
         ASCI        "B="
<
< LISTES DE REMPLACEMENT DE 'A' ET 'B' :
<
LAB:     VAL         10              < NBRE DE CARACTERES MAX.
RA:      DZS         LAB/2
         BYTE        '04;0           < GARDE-FOU.
RB:      DZS         LAB/2
         BYTE        '04;0           < GARDE-FOU.
<
< DEMANDES A CMS4 :
<
DEMREP:  WORD        '0101           < LECTURE DU FACTEUR DE REDUCTION.
         WORD        REP-ZERO*2
         WORD        1               < 1 CARACTERE.
DEMA:    WORD        '0101           < ENTREE DES REMPLACANTS DE A.
         WORD        RA-ZERO*2
         WORD        LAB
DEMB:    WORD        '0101           < ENTREE DES REMPLACANTS DE B.
         WORD        RB-ZERO*2
         WORD        LAB
DEMOUT:  WORD        '0202           < EDITION MESSAGE.
         WORD        0               < @OCTET DU MESSAGE.
         WORD        0               < LONGUEUR DU MESSAGE.
ERASE:   WORD        '0205           < EFFAEMENT ECRAN VISU.
DERASE:  EQU         ERASE
DEMGS:   WORD        '0008           < ACCES A LA ZDC.
         WORD        NOMSEG-ZERO*2
         WORD        LONSEG
         WORD        'FFC0
DELGS:   WORD        '000A           < ECRITURE DANS LA ZDC.
         WORD        NOMSEG-ZERO*2
         WORD        SEGSGN-NOMSEG*2
         WORD        'C000
DEMCCI:  WORD        '0001           < DEMANDE DE RETOUR AU CCI.
DEMSGN:  WORD        '8402           < DEMANDE SGN OVERLAY.
         WORD        BRANCH-ZERO*2
         WORD        ZERO-BRANCH+PILE-LTNI-LTNI*2
         WORD        -1
<
< RELAIS DIVERS :
<
AGOGE:   WORD        GOGE            < RETOUR A 'GE'.
AOVL:    WORD        OVL             < CHARGEMENT DES OVERLAYS.
APRINT:  WORD        PRINT           < EDITION D'UN MESSAGE.
AENTER:  WORD        ENTER           < ENTREE REPONSE OUI/NON.
ASTOKA:  WORD        STOKA           < PRIMITIVE 'A'.
ASTOKB:  WORD        STOKB           < PRIMITIVE 'B'.
ASTOK:   WORD        STOK            < GENERATION DU CODE DANS ITEM1.
AENTC:   WORD        ENTC            < ENTREE D'UNE CONSTANTE X/Y/K.
ACONV:   WORD        CONV            < CONVERSION BINAIRE-->ASCI.
AMCV:    WORD        MCV             < DETERMINATION DES DEPLACEMENTS 1/2/3/4.
ADIVIS:  WORD        DIVIS
AGETS:   WORD        GETS            < ACCES A UN SEGMENT EN ZDC.
AEDSO:   WORD        EDSO            < GENERATION ORIGINE SEGMENT.
AEDSE:   WORD        EDSE            < GENRATION EXTREMITE SEGMENT.
AEDSEG:  WORD        EDSEG           < GENERATION ITERATION SEGMENT.
AITEM:   WORD        ZERO+PILE-LTNI+LTN,X
APILE:   WORD        PILE-1
ARAB:    WORD        0               < RELAI INDEXE VERS RA OU RB.
AMESS:   WORD        0               < VARIABLE DE ENTER.
<
< CONSTANTES :
<
KIN:     WORD        -1              < COMPTEUR DES ENTREES DANS 'VG'.
NGE:     ASCI        "GE"            < NOM DU PROCESSEUR DE RETOUR.
IEG:     WORD        0               < INDEX COURANT ITEM.
KSEG:    WORD        0               < COMPTEUR DE SEGMENTS.
NITER:   WORD        0               < ITERATION DES DEPLACEMENTS CV.
QK:      WORD        0               < QK=QUOTIENT(KSEG/35),
RK:      WORD        0               < RK=RESTE(KSEG/35).
KX:      WORD        0               < CONSTANTE X DE GR.
KY:      WORD        0               < CONSTANTE Y DE GR.
KK:      WORD        0               < CONSTANTE K DE GR.
CKX:     WORD        0               < KX ASCI,
CKY:     WORD        0               < KY ASCI,
CKK:     WORD        0               < KK ASCI.
CV:      DZS         2               < CURSEUR VIRTUEL.
DX:      WORD        0
DY:      WORD        0
DX1:     WORD        0
DY1:     WORD        0
X:       VAL         1               < COORDONNEE X.
Y:       VAL         0               < COORDONNEE Y.
CAR1:    WORD        0               < INDEX DU 1ER CARACTERE GENERE.
IEDIT:   WORD        0               < 0=EDITION DU CODE GENERE.
ALITEM:  WORD        NBCAR*NBLIG     < NBRE DE CARACTERES D'UN ITEM.
CTTE:    WORD        0               < VARIABLE TEMPORAIRE.
WORK1:   WORD        0               < VARIABLE TEMPORAIRE.
WORK2:   WORD        0               < VARIABLE TEMPORAIRE.
C35:     WORD        "Z"-"A"+10      < VALEUR BINAIRE DU 'Z' DE GR.
NQ:      WORD        0               < QUOTIENT D'UNE DIVISION,
NR:      WORD        0               < RESTE DE LA MEME DIVISION.
NPAS:    WORD        0               < NPAS=NQ*C35+NR.
IOPT:    WORD        0               < 0 : REDUIRE SI POSSIBLE LE NBRE DE SEGMEN
                                     < MENTS.
ISOL:    WORD        0               < 1 : GENERE LES SEQUENCES
                                     < DU TYPE 'AB' (SEGMENT=POINT).
<
< PILE DE TRAVAIL :
<
STACK:   DZS         20
         PAGE
         PROG
<
<
<        E M I S S I O N   D ' U N   M E S S A G E  :
<
<
<        FONCTION :
<                      EDITER UN MESSAGE ; DE PLUS SI
<                    LE DEMANDEUR EST SOUS :SYS ,
<                    CETTE ROUTINE STABILISE L'IMAGE
<                    VIDEO COURANTE.
<
<
<        ARGUMENT :
<                    A=@MOT DU MESSAGE.
<
<
PRINT:   EQU         $
         PSR         X
         LR          A,C             < C=@MOT DU MESSAGE.
         ADR         A,A
         ADRI        1,A             < A=@OCTET DU MESSAGE.
         STA         DEMOUT+1        < MAJ DE DEMOUT.
         LBY         0,C             < A=LONGUEUR DU MESSAGE.
         STA         DEMOUT+2        < MAJ DE DEMOUT.
         LAD         DEMOUT
         SVC         0               < EMISSION MESSAGE.
         PLR         X
         RSR
<
<
<        E N T R E E   R E P O N S E  :
<
<
<        ARGUMENT :
<                    A=@MESSAGE.
<
<
<        RESULTAT :
<                    B=0 SI OUI,
<                      1 SI NON, ET DE PLUS
<                    LES CODES CONDITIONS SONT POSITIONNES PAR 'CPZR B'.
<
<
ENTER1:  EQU         $
         LA          AMESS           < RESTAURE A=@MESSAGE.
ENTER:   EQU         $
         STA         AMESS           < SAVE @MESSAGE.
         BSR         APRINT          < ENVOI DU MESSAGE.
         LAD         DEMREP
         SVC         0
         LBY         REP             < ANALYSE DE LA REPONSE ENTREE.
         LBI         0               < OUI A PRIORI.
         CPI         "O"
         JE          ENTER2          < OUI.
         CPI         "N"
         JNE         ENTER1          < RIEN COMPRIS...
         LBI         1               < NON.
ENTER2:  EQU         $
         CPZR        B               < TEST EN RETOUR.
         RSR
         PAGE
<
<
<        G E N E R A T I O N   D U   C O D E  :
<
<
<        ARGUMENT :
<                    A=CARACTERE A INSERER,
<                    IEG=INDEX D'INSERTION.
<
<
<        RESULTAT :
<                    IEG<--(IEG)+1
<
<
STOK:    EQU         $
         PSR         A,X
         LX          IEG             < X=INDEX D'INSERTION.
         STBY        &AITEM          < GENERATION.
         IC          IEG             < MAJ DE L'INDEX COURANT.
         CPZ         IEDIT           < FAUT-IL EDITER ???
         JNE         STOK1           < NON.
         SBT         7               < OUI, MISE EN PLACE D'UN
         STA         MC              < LONGUEUR=1 DEVANT LE CARACTERE.
         LAD         MC
         BSR         APRINT          < EDITION DU CODE GENERE.
STOK1:   EQU         $
         PLR         A,X
         RSR
<
<
<        G E N E R A T I O N   D E   ' A '   O U   ' B '  :
<
<
STOKA:   EQU         $
         LBI         "A"             < CAS OU RA EST VIDE..
         LAD         RA
         JMP         STOK2
STOKB:   EQU         $
         LBI         "B"             < CAS OU RB EST VIDE.
         LAD         RB
STOK2:   EQU         $
         SBT         0               < BIT D'INDEXATION.
         STA         ARAB            < GENERATION DU RELAI VERS RA/RB.
         PSR         X
         LXI         0               < DEPART SUR L'OCTET0 DE RA/RB.
STOK3:   EQU         $
         LBY         &ARAB           < A=OCTET COURANT DE REMPLACEMENT.
         CPI         '04             < EOT ???
         JE          STOK4           < OUI, FINI...
         CPI         '0D             < RC ???
         JE          STOK4           < OUI, FINI...
         CPI         " "             < CODE AFFICHABLE ???
         JGE         STOK5           < OUI, OK.
         ADRI        '40,A           < NON, ON LE CONVERTIT EN CARACTERE
         SBT         8               < MIS EN EXPOSANT !!!
STOK5:   EQU         $
         BSR         ASTOK           < GENERATION DU CODE.
         ADRI        1,X             < AU CARACTERE SUIVANT.
         JMP         STOK3
<
< FIN D'EXPLORATION :
<
STOK4:   EQU         $
         CPZR        X               < S'EST-ON ARRETE SUR L'OCTET0 ???
         JG          STOK6           < NON, RIEN A FAIRE...
         LR          B,A             < OUI, IL FAUT GENERE 'A' OU 'B'...
         BSR         ASTOK
STOK6:   EQU         $
         PLR         X
         RSR
         PAGE
<
<
<        E N T R E E   D ' U N E   C O N S T A N T E  :
<
<
<        ARGUMENT :
<                    A=@MESSAGE A EMETTRE.
<
<
<        RESULTAT :
<                    A=CONSTANTE EN BINAIRE,
<                    B=CONSTANTE EN ASCI.
<
<
ENTC1:   EQU         $
         LR          Y,A             < RESTAURE A=@MESSAGE.
ENTC:    EQU         $
         LR          A,Y             < SAVE Y=@MESSAGE.
         BSR         APRINT          < ENVOI DU MESSAGE.
         PSR         X
         LAD         DEMREP
         SVC         0               < LECTURE DE LA CONSTANTE.
         PLR         X
         LBY         REP             < A=CONSTANTE EN ACI,
         LR          A,B             < SAVE B=CONSTANTE ASCI.
         CPI         "Z"             < VALIDAION SUPERIEURE...
         JG          ENTC1           < ERREUR, ON REDEMANDE.
         ADRI        -"0",A          < DECODAGE.
         JALE        ENTC1           < ERREUR, ON REDEMANDE.
         CPI         9               < VALIDATION 0-9.
         JLE         ENTC2           < OK...
         ADRI        -"A"+"9"+1,A    < DECODAGE SUITE.
         CPI         9               < VALIDATION A-Z.
         JLE         ENTC1           < ERREUR, ON REDEMANDE.
ENTC2:   EQU         $
         RSR                         < ET C'EST TOUT...
         PAGE
<
<
<        C O N V E R S I O N   A S C I  :
<
<
<        ARGUMENT :
<                    A=VALEUR BINAIRE A CONVERTIR.
<
<
<        RESULTAT :
<                    A=CONSTANTE ASCI 0-9 OU A-Z.
<
<
CONV:    EQU         $
         ADRI        "0",A           < CODAGE.
         CPI         "9"             < VALIDATION 0-9.
         JLE         CONV1           < OK.
         ADRI        "A"-"9"-1,A     < CODAGE SUITE.
CONV1:   EQU         $
         RSR                         < ET C'EST TOUT...
         PAGE
<
<
<        A C C E S   S E G M E N T   Z D C  :
<
<
<        RESULTAT :
<                    A=0 SI 'OAB'.
<
<
GETS:    EQU         $
         LAD         DEMGS
LOOP11:  EQU         $
         SVC         0
         CPZ         NOMSEG          < SEGMENT VALIDE ???
         JE          LOOP11          < NON, ON ATTEND...
         STZ         NOMSEG          < OUI, ON L'ACQUITTE.
         LAD         DELGS
         SVC         0
         LA          SEG+0+X
         OR          SEG+0+Y
         OR          SEG+2+X
         OR          SEG+2+Y         < TEST DE FIN...
         RSR
         PAGE
<
<
<        G E N E R A T I O N   S E G M E N T  :
<
<
<        FONCTION :
<                      GENERE UN SEGMENT SUIVANT LES
<                    FORMES A,B,1,2,3,4.
<
<
EDSO:    EQU         $
<
< GENERATION DE X(ORIGINE) :
<
         LA          ORIG+0+X
         SB          CV+X            < A=DELTA(Z).
         LB          KX              < B=KX.
         LYI         "1"             < Y="1".
         BSR         AMCV            < GENERATION DEPLACEMENTS "1"/"3".
         STA         WORK1           < SAVE CONDITIONS DE RETOUR.
<
< GENERATION DE Y(ORIGINE) :
<
         LA          ORIG+0+Y
         SB          CV+Y            < A=DELTA(Z).
         LB          KY              < B=KY.
         LYI         "2"             < Y="2".
         BSR         AMCV            < GENERATION DEPLACEMENTS "2"/"4".
         OR          WORK1           < A-T'ON GENERE POUR L'ORIGINE ???
         JAE         LOOP12          < NON, RIEN A AJOUTER...
         BSR         ASTOKA
LOOP12:  EQU         $
         RSR
EDSE:    EQU         $
<
< GENERATION DE X(EXTEMITE) :
<
         LA          ORIG+2+X
         SB          CV+X            < A=DELTA(Z).
         LB          KX              < B=KX.
         LYI         "1"             < Y="1".
         BSR         AMCV            < GENERATION DEPLACEMENTS "1"/"3".
         STA         WORK1           < SAVE CONDITIONS DE RETOUR.
         JAE         LOOP14          < LE 'CV' NE S'EST PAS DEPLACE...
         LA          ORIG+2+X        < OUI, DEPLACONS
         ADR         B,A             < 'ORIG' DE LA
         STA         ORIG+2+X        < MEME QUANTITE (B)...
LOOP14:  EQU         $
<
< GENERATION DE Y(EXTREMITE) :
<
         LA          ORIG+2+Y
         SB          CV+Y            < A=DELTA(Z).
         LB          KY              < B=KY.
         LYI         "2"             < Y="2".
         BSR         AMCV            < GENERATION DEPLACEMENTS "2"/"4".
         JAE         LOOP15          < PAS DE DEPLACEMENT VERTICAL.
         XR          A,B
         AD          ORIG+2+Y        < DEPLACONS 'ORIG' DE LA MEME
         STA         ORIG+2+Y        < QUE 'CV' (B).
         LR          B,A             < RESTAURE A...
LOOP15:  EQU         $
         OR          ISOL            < FAUT-IL GENERER LES CAS 'AB' ???
         OR          WORK1           < A-T'ON DEPLACE LE CV ???
         JAE         LOOP13          < NON, RIEN A FAIRE...
         BSR         ASTOKB
LOOP13:  EQU         $
         RSR
<
<
<        I T E R A T I O N   S E G M E N T  :
<
<
EDSEG:   EQU         $
         CPZ         IOPT            < OPTIMISE-T'ON ???
         JNE         LOOP7           < NON...
         LX          SEG1+2+X        < OUI, IL FAUT DONC
         LY          SEG1+2+Y        < CHANGER L'EXTREMITE
         STX         ORIG+2+X        < DE ORIG.
         STY         ORIG+2+Y
LOOP7:   EQU         $
         LAI         1
         STA         NITER           < 1 ITERATION SUR CV.
         BSR         AEDSO           < ORIGINE SEGMENT.
<
< RESTE-T'IL QUELQUE CHOSE A FAIRE ???
<
         LA          ORIG+2+X
         SB          CV+X            < A=DELTA(X),
         LB          KX              < B=KX.
         BSR         ADIVIS          < A=ABSVAL(DELTA(X))/KX.
         STA         WORK2           < SAVE LE QUOTIENT.
         LA          ORIG+2+Y
         SB          CV+Y            < A=DELTA(Y),
         LB          KY              < B=KY.
         BSR         ADIVIS          < A=ABSVAL(DELTA(Y))/KY.
         OR          WORK2           < SOMMATION DES 2 RESULTATS.
         OR          ISOL            < FAUT-IL GENERER LES POINTS ???
         JAE         EDSEG4          < LE SEGMENT A CONSTRUIRE EST
                                     < INDETERMINE ('AB').
         LA          KSEG            < A=COMPTEUR DE SEGMENTS IDENTIQUES.
         JAE         $               < E R R E U R   P R O G R A M M E.
         SARD        16              < EXTENSION 32 BITS.
         DV          C35
         STA         QK              < QUOTIENT,
         STB         RK              < RESTE.
         JAE         EDSEG1          < QUOTIENT=0, VERS LE RESTE.
         CPI         1
         JG          EDSEG2          < QUOTIENT>1.
<
< CAS QUOTIENT=1 :
<
         LAI         '25
         BSR         ASTOK           < %
         LAI         "Z"
         BSR         ASTOK           < %Z
         LAI         "("
         BSR         ASTOK           < %Z(
         LA          C35
         STA         NITER           < C35 ITERATIONS SUR CV.
         BSR         AEDSE           < %Z(SEG
         JMP         EDSEG3
<
< CAS QUOTIENT>1 :
<
EDSEG2:  EQU         $
         LAI         '25
         BSR         ASTOK           < %
         LA          QK
         BSR         ACONV
         BSR         ASTOK           < %Q
         LAI         "("
         BSR         ASTOK           < %Q(
         LAI         '25
         BSR         ASTOK           < %Q(%
         LAI         "Z"
         BSR         ASTOK           < %Q(%Z
         LAI         "("
         BSR         ASTOK           < %Q(%Z(
         LA          C35
         MP          QK
         STB         NITER           < QK*C35 ITERATIONS SUR CV.
         BSR         AEDSE           < %Q(%Z(SEG
         LAI         ")"
         BSR         ASTOK           < %Q(%Z(SEG)
EDSEG3:  EQU         $
         LAI         ")"
         BSR         ASTOK           < %Z(SEG) OU %Q(%Z(SEG))
<
< TRAITEMENT DU RESTE :
<
EDSEG1:  EQU         $
         LA          RK
         JAE         EDSEG4          < RESTE=0.
         STA         NITER           < RK ITERATIONS SUR CV.
         CPI         1
         JG          EDSEG5
<
< CAS RESTE=1 :
<
         BSR         AEDSE           < SEG
         JMP         EDSEG4
<
< CAS RESTE>1 :
<
EDSEG5:  EQU         $
         LAI         '25
         BSR         ASTOK           < %
         LA          RK
         BSR         ACONV
         BSR         ASTOK           < %R
         LAI         "("
         BSR         ASTOK           < %R(
         BSR         AEDSE           < %R(SEG
         LAI         ")"
         BSR         ASTOK           < %R(SEG)
<
< FIN DE GENERATION :
<
EDSEG4:  EQU         $
         RSR
         PAGE
<
<
<        D I V I S I O N  :
<
<
<        ARGUMENT :
<                    A=DIVIDENDE,
<                    B=DIVISEUR.
<
<
<        RESULTAT :
<                    A=QUOTIENT DE ABSVAL(DIVIDENDE) PAR
<                      EXCES OU PAR DEFAUT.
<                    Y <-- (Y)+2 SI DIVIDENDE<0.
<
<
DIVIS:   EQU         $
         STB         CTTE            < SAVE CTTE=KX OU KY.
         JAG         MCV2            < DELTA(Z)>0 : (Y) EST BON.
         NGR         A,A             < DELTA(Z)<0 : ON PREND
                                     < ABSVAL(DELTA(Z)),
         ADRI        2,Y             < "1"/"2" --> "3"/"4".
MCV2:    EQU         $
         SARD        16              < EXTENSION 32 BITS DE
                                     < ABSVAL(DELTA(Z)).
         DV          CTTE            < DIVISONS PAR LE PAS DX/DY.
         ADR         B,B             < AFIN D'ETRE COMPATIBLE
                                     < AVEC G2.G3/GV.
         XR          A,B
         CP          CTTE
         JL          MCV3            < DIVISION PAR DEFAUT,
         ADRI        1,B             < DIVISION PAR EXCES.
MCV3:    EQU         $
         LR          B,A             < A=NBRE D'ITERATIONS DE (Y).
         RSR
         PAGE
<
<
<        G E N E R A T I O N   D E P L A C E M E N T S  :
<
<
<        ARGUMENT :
<                    A=Z(SEG)-Z(CV), Z ETANT L'UNE DES COORDONNEES X/Y,
<                    B=(KX) OU (KY) SUIVANT X/Y.
<                    Y="1" OU "2" SUIVANT X/Y.
<
<
<        RESULTAT :
<                    A=0 SI RIEN N'A ETE GENERE.
<                    B=VALEUR DU DEPLACEMENT DE 'CV' SI A#0.
<
<
MCV:     EQU         $
         JAE         MCV1            < DELTA(Z)=0, RIEN A FAIRE...
         BSR         ADIVIS          < CALCUL DU NBRE D'ITERATIONS DE (Y)
                                     < DANS LE REGISTRE A.
         STA         NPAS            < ET SAVE (A).
         JAE         MCV1            < (A) EST NUL A (CTTE) PRES, DONC
                                     < RIEN A FAIRE...
<
< GENERATION DU CODE :
<
         SARD        16              < EXTENSION 32 BITS.
         DV          C35             < DIVISION PAR 'Z'.
         STA         NQ              < SAVE LE QUOTIENT,
         STB         NR              < ET SAVE LE RESTE.
         JAE         MCV4            < QUOTIENT=0, ALLONS TRAITER
                                     < LE RESTE.
<
< TRAITEMENT DU QUOTIENT :
<
         LAI         '25
         BSR         ASTOK           < %
         LAI         "Z"
         BSR         ASTOK           < %Z
         LAI         "("
         BSR         ASTOK           < %Z(
         LA          NQ
         CPI         5               < TEST DU QUOTIENT PAR RAPPORT A 5.
         JLE         MCV5            < NQ<=5, PAS D'ITERATIONS.
<
< CAS DU QUOTIENT >5 :
<
         LAI         '25
         BSR         ASTOK           < %Z(%
         LA          NQ
         BSR         ACONV           < CONVERSION ASCI DE NQ.
         BSR         ASTOK           < %Z(%Q
         LAI         "("
         BSR         ASTOK           < %Z(%Q(
         LR          Y,A             < CARACTERE A ITERER.
         BSR         ASTOK           < %Z(%Q(Y
         LAI         ")"
         BSR         ASTOK           < %Z(%Q(Y)
         JMP         MCV6            < VERS LA FIN DU QUOTIENT.
<
< CAS DU QUOTIENT <=5 :
<
MCV5:    EQU         $
         LR          A,X             < X=NBRE D'ITERATIONS DE (Y).
         LR          Y,A             < A=CARACTERE A GENERER.
MCV7:    EQU         $
         BSR         ASTOK           < %Z(Y..Y
         JDX         MCV7
MCV6:    EQU         $
         LAI         ")"
         BSR         ASTOK           < %Z(%Q(Y)) OU %Z(Y..Y)
<
< TRAITEMENT DU RESTE :
<
MCV4:    EQU         $
         LA          NR
         JAE         MCV9            < RESTE NUL, RIEN A FAIRE...
         CPI         5               < TEST DE NR PAR RAPPORT A 5.
         JLE         MCV8            < NR<=5 : PAS D'ITERATION.
<
< CAS DU RESTE >5 :
<
         LAI         '25
         BSR         ASTOK           < %
         LA          NR
         BSR         ACONV           < CONVERSION ASCI DE NR.
         BSR         ASTOK           < %R
         LAI         "("
         BSR         ASTOK           < %R(
         LR          Y,A             < A=CARACTERE A ITERER.
         BSR         ASTOK           < %R(Y
         LAI         ")"
         BSR         ASTOK           < %R(Y)
         JMP         MCV9            < VERS LE CALCUL DE CV.
<
< CAS DU RESTE<=5 :
<
MCV8:    EQU         $
         LR          A,X             < X=NBRE D'ITERATIONS DE (Y).
         LR          Y,A             < A=CARACTERE A ITERER.
MCV10:   EQU         $
         BSR         ASTOK           < Y..Y
         JDX         MCV10
<
< MISE A JOUR DE CV :
<
MCV9:    EQU         $
         LA          NPAS            < DEPLACEMENT VIRTUEL EN
                                     < UNITE (CTTE).
         MP          CTTE            < B=DEPLACEMENT REEL EN POINTS.
         LR          B,A
         MP          NITER           < ITERATIONS SUR CV.
         LR          Y,A             < A=TYPE DU DEPLACEMENT "1"/"2"/"3"/"4".
         CPI         "2"             < EST-IL POSITIF (X>0, OU Y>0) ???
         JLE         MCV11           < OUI : "1" OU "2".
         NGR         B,B             < NON : "3" OU "4", IL FAUT INVERSER
                                     < LE DEPLACEMENT REEL.
MCV11:   EQU         $
         TBT         15              < EST-IL SUR X OU SUR Y ???
         JC          MCV12           < IMPAR ("1" OU "3") : SUR X.
<
< DEPLACEMENTS SUR Y :
<
         LA          CV+Y
         ADR         B,A
         STA         CV+Y
         JMP         MCV13
<
< DEPLACEMENT SUR X :
<
MCV12:   EQU         $
         LA          CV+X
         ADR         B,A
         STA         CV+X
<
< SORTIE :
<
MCV13:   EQU         $
         LAI         1               < A#0 : AU MPOINS UN DEPLACEMENT
                                     < DE GENERE.
MCV1:    EQU         $               < A=0 : ON N'A PAS BOUGE...
         RSR
         PAGE
<
<
<        R E T O U R   A   G E  :
<
<
GOGE:    EQU         $
         LA          APILE
         LR          A,K             < REINITIALISATION DE K SUR
                                     < LA PILE DE SODOME.
<
< CHARGEMENT DE L'OVERLAY 'GE' :
<
         LA          NGE
         STA         0,W             < MISE EN PLACE DU NOM DE 'GE'
                                     < EN TETE DE LA BRANCHE.
         LAI         '06
         STBY        DEMSGN          < NVP DE LOAD SOUS :SYS.
E101:    EQU         $
         LAD         DEMSGN          < A=@DEMSGN ; W=@BRANCH.
         BSR         AOVL            < TENTATIVE D'OVERLAY.
         LAD         DEMCCI
         SVC         0               < SI OVERLAY IMPOSSIBLE , ON
                                     < FAIT UN RETOUR AU CCI.
         JMP         E101            < PUIS NOUVELLE TENTATIVE SI !GO.
         PAGE
<
<
<        G E N E R A T E U R   D E   P R O G R A M M E
<        G R A P H I Q U E   C O M P A C T E  :
<
<
<        FONCTION :
<                      CE PROCESSEUR, LORSQU'IL LUI RESTE
<                    SUFFISAMENT EE PLACE DANS L'ITEM1
<                    RECUPERE UN SEGMENT EN ZDC, ET EN DEDUIT
<                    UN DEPLACEMENT OPTIMISE DU TYPE G2/G3...
<
<
         WORD        LOC+'80
IMAGE:   EQU         $
         LRP         L
         LA          -1,L
         LR          A,L             < INITIALISATION DE L.
         LAD         STACK-1
         LR          A,K             < INITIALISATION DE K.
         IC          KIN             < COMPTAGE DES ENTRIES.
         JG          GOGE            < ABORT SI ALT-MODES...
<
< INITIALISATION DE L'ITEM :
<
         LXI         IINDIC-LTN*2
         LBY         &AITEM          < A=TYPE DE L'ITEM1.
         JAE         E40             < L'ITEM EST VIDE...
         ORI         '10             < AFIN DE TESTER SIMULTANEMENT
                                     < 'D' ET 'T'.
         CPI         "T"             < EST-CE 'T' OU 'D' ???
         JNE         GOGE            < NON, ON ABORTE...
<
< INITIALISATION DE L'EN-TETE :
<
E40:     EQU         $
         LAI         "T"
         STBY        &AITEM          < TYPE 'TEXTE'.
         LXI         LRITEM-LTN
         LA          ALITEM
         STA         &AITEM          < LONGUEUR DU CORPS DE L'ITEM.
<
< MISE DE L'ITEM1 A 'SPACE' :
<
         LXI         0
E3:      EQU         $
         LAI         " "
         STBY        &AITEM
         ADRI        1,X
         LR          X,A
         CP          ALITEM
         JL          E3
<
< FAUT-IL EDITER LE CODE GENERE ???
<
         LAD         M1
         BSR         AENTER
         STB         IEDIT
<
< GENERATION DES CAS 'AB' ???
<
         LAD         M4
         BSR         AENTER
         IBT         15+16           < INVERSION DE LA REPONSE.
         STB         ISOL            < 1=OUI !!!
<
< REMPLACEMENTS DE 'A' ET 'B' :
<
         LAD         M5
         BSR         APRINT
         LAD         DEMA
         SVC         0
         LAD         M6
         BSR         APRINT
         LAD         DEMB
         SVC         0
<
< REDUCTION DU NBRE DE SEGMENTS :
<
         LAD         M3
         BSR         AENTER
         STB         IOPT
<
< DEPLACEMENT INITIAL 'CAR1' :
<
         LAD         M2
         BSR         AENTC
         STA         CAR1            < CAR1>0 !!!
<
< ENTREE DES COEFFICIENTS K/X/Y :
<
         LAD         MK
         BSR         AENTC
         STA         KK
         STB         CKK
         LAD         MX
         BSR         AENTC
         STA         KX
         STB         CKX
         LAD         MY
         BSR         AENTC
         STA         KY
         STB         CKY
<
< CALCUL DES COEFFICIENTS REELS :
<
         LA          KX
         MP          KK
         STB         KX              < KX.
         LA          KY
         MP          KK
         STB         KY              < KY.
<
< FAUT-IL EFFACER L'ECRAN ???
<
         CPZ         IEDIT
         JNE         E5              < NON.
         LAD         DERASE
         SVC         0               < OUI.
E5:      EQU         $
<
< BLOCAGE DES 'CAR1' PREMIERS MOTS :
<
         LX          CAR1
         LAI         " "
E4:      EQU         $
         BSR         ASTOK
         JDX         E4
<
< DEBUT DU PROGRAMME GRAPHIQUE :
<
         LAI         "K"
         BSR         ASTOK           < K
         LA          CKK
         BSR         ASTOK           < KK
         LAI         "X"
         BSR         ASTOK           < KKX
         LA          CKX
         BSR         ASTOK           < KKXX
         LAI         "Y"
         BSR         ASTOK           < KKXXY
         LA          CKY
         BSR         ASTOK           < KKXXYY
         BSR         ASTOKA
<
<
<        R E C U P E R A T I O N   D E S   S E G M E N T S  :
<
<
         BSR         AGETS           < RECUPERATION 1ER SEGMENT.
         JAE         GOGE            < DES LE DEBUT 'OAB' !!!
         JMP         LOOP1           < VERS L'INITIALISATION DU PROCESSUS.
<
<        S E G M E N T S   S U I V A N T S  :
<
LOOP:    EQU         $
         LA          ALITEM
         SB          IEG             < A=PLACE ENCORE DISPONIBLE.
         CPI         14+14+LAB*2+12
         JLE         GOGE            < PAS SUFFISANT, ON ARRETE...
         BSR         AGETS           < OK, ON PREND LE SEGMENT
                                     < COURANT DE LA ZDC...
         JANE        LOOP2
         BSR         AEDSEG          < ON EDITE SI 'OAB'.
         JMP         GOGE            < PUIS ON ARRETE...
<
< COMPARAISON DE SEG ET SEG1 :
<
LOOP2:   EQU         $
         LA          SEG1+2+X
         CP          SEG+0+X
         JNE         LOOP3           < NON CONSECUTIFS.
         LA          SEG1+2+Y
         CP          SEG+0+Y
         JNE         LOOP3           < NON CONSECUTIFS.
         LA          SEG1+2+X
         SB          SEG1+0+X
         STA         DX1
         LA          SEG1+2+Y
         SB          SEG1+0+Y
         STA         DY1
         LA          SEG+2+X
         SB          SEG+0+X
         STA         DX
         LA          SEG+2+Y
         SB          SEG+0+Y
         STA         DY
         JAE         LOOP20          < DY=0.
         CPZ         DY1
         JE          LOOP20          < DY1=0.
         EOR         DY1             < SIGNES DE DY ET DY1 ???
         JAL         LOOP3           < PAS LA MEME DIRECTION.
LOOP20:  EQU         $
         LA          DX
         JAE         LOOP21          < DX=0.
         CPZ         DX1
         JE          LOOP21          < DX1=0.
         EOR         DX1             < SIGNES DE DX ET DX1 ???
         JAL         LOOP3           < PAS LA MEME DIRECTION.
LOOP21:  EQU         $
         LA          DY
         MP          DX1             < DY*DX1.
         LR          A,X
         LR          B,Y
         LA          DX
         MP          DY1             < DX*DY1.
         CPR         A,X
         JNE         LOOP3           < NON COLINEAIRES :
         CPR         B,Y
         JNE         LOOP3           < NON COLINEAIRES.
<
< CAS OU SEG ET SEG1 SONT COLINEAIRES, CONSECUTIFS, ET DE MEME DIRECTION :
<
         CPZ         IOPT            < FAUT-IL OPTIMISER ???
         JE          LOOP4           < OUI...
         LA          DX
         CP          DX1
         JNE         LOOP3           < DX#DX1 : SEG#SEG1.
         LA          DY
         CP          DY1
         JNE         LOOP3           < DY#DY1 : SEG#SEG1.
<
< CAS OU SEG ET SEG1 SONT CUMULABLES :
<
         IC          KSEG            < ON COMPTE LES SEGMENTS.
         JMP         LOOP6           < VERS LE DEPLACEMENT DE SEG1.
                                     < (A CAUSE DES TESTS QUI
                                     < PRECEDENT...)
LOOP4:   EQU         $
         LA          DX
         OR          DY
         JAE         LOOP23          < SEG EST INDETERMINE.
         LA          DX1
         OR          DY1             < DX1.OR.DY1
         JANE        LOOP22          < SEG1 EST DETERMINE.
LOOP23:  EQU         $
         CPZ         ISOL            < FAUT-IL GENERER LES POINTS ???
         JNE         LOOP3           < OUI, ALLONS-Y POUR SEG1.
LOOP22:  EQU         $
         LX          SEG+2+X         < LORSQU'ON OPTIMISE, L'EXTREMITE
         LY          SEG+2+Y         < DE SEG, DEVIENT LA
         STX         SEG1+2+X        < NOUVELLE EXTREMITE
         STY         SEG1+2+Y        < DE SEG1.
         JMP         LOOP            < AU SUIVANT...
<
< CAS OU SEG ET SEG1 NE SONT PAS CUMULABLES :
<
LOOP3:   EQU         $
         BSR         AEDSEG          < ON EDITE SEG1,
<
< RE-INITIALISATION DU PROCESSUS :
<
LOOP1:   EQU         $
         LAI         1
         STA         KSEG            < KSEG <-- 1.
         LAD         ORIG
         LR          A,B             < B=@ORIG.
         LAD         SEG             < A=@SEG.
         LXI         4               < 4 MOTS A DEPLACER.
         MOVE                        < ORIG <-- (SEG).
LOOP6:   EQU         $
         LAD         SEG1
         LR          A,B             < B=@SEG1.
         LAD         SEG             < A=@SEG.
         LXI         4               < 4 MOTS A DEPLACER.
         MOVE                        < SEG1 <-- (SEG).
         JMP         LOOP            < AU SUIVANT...
<
<
<        I M P L A N T A T I O N  :
<
<
X12:     EQU         ZERO+PILE-LTNI-LTNI
X10:     VAL         X12-$
ZEROV:   EQU         ZERO+X10        < ERREUR D'ASSEMBLEGE SI
                                     < MAUVAISE IMPLANTATION.
         DZS         X10+1
         EOT         #SIP GEN PROCESSEUR#



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.