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-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2022-2024.