PAGE
IDP "EDIT - RELEASE 14/08/1974"
IDP "JOHN F. COLONNA"
<
<
< P R O C E S S E U R D ' E D I T I O N D E P A G E :
<
<
< FONCTION : CE PROCESSSEUR DANS SA VERSION PROVISOIRE
< A A SA CHARGE L'EDITION D'UNE PAGE AU SENS DE
< L'EDITEUR DE TEXTE CLASSIQUE , MAIS OU L'ON A
< RAJOUTE UNE 2EME DIMENSION : C'EST LA PAGE.
< IL GERE DONC UNE MATRICE QUI CONTIENT LA PAGE
< QUE L'ON EDITE.
<
<
< POSSIBILITES : L'EDITION SE FAIT PAR MOUVEMENT DU
< CURSEUR DANS LES 4 DIRECTIONS N,S,W,E (!!!!) ,
< AVEC LES TOUCHES SUIVANTES :
< N : CTRL-K ,
< S : LF OU CTRL-J ,
< W : CTRL-H ,
< E : CTRL-I.
< LES MOUVEMENTS DU CURSEUR N'AFFECTE PAS LES
< CARACTERES DE LA PAGE ; LORSQU'ENSUITE ON FRAPPE
< DES CARACTERE STANDARDS , ILS SONT INSERES
< A LA POSITION COURANTE DU CURSEUR . A NOTER QUE LE
< MARGIN RIGHT A ETE SUPPRIME.
< LA SUPPRESSION DE CARACTERES SE FAIT AVEC LA
< BARRE 'SPACE' (ET C'EST LA SA DIFFERENCE AVEC
< CTRL-I.....).
<
<
NBCAR: VAL 74 < NBRE DE CARACTERES PAR LIGNE.
NBLIG: VAL 35 < NBRE DE LIGNES PAR PAGE.
<
<
PROG
DZS 'B
ASCI "ED " < NOM DU PROCESSEUR : 'ED '.
BYTE '04;'D0 < <EOT>-'P'+'80.
WORD '1F00 < TAILLE OCTETS POUR CALLP.
WORD PEDIT < @DE LANCEMENT DE EDIT POUR CALLP.
WORD LEDITP+'80 < ADRESSE DU LOCAL DU PROCESSEUR.
<
< E N T R Y D U P R O C E S S E U R :
<
PEDIT: EQU $
LRP L
LA -1,L
LR A,L < L=@LOCAL DU PROCESSEUR.
WORD '8580 < BRANCHEMENT SUR '80,L ...
PAGE
<
<
< L O C A L D E L ' E D I T E U R :
<
<
LOCAL
LEDITP: EQU $
WORD EDITP < ADRESSE DU POINT D'ENTREE DU
< PROCESSEUR.
POINTC: DZS 3 < A T T E N T I O N : DOIT ETRE
< A UNE ADRESSE IMPAIRE (CF.
< LES INVERSIONS X ET Y EN
< GRAPHIQUE) !!!!!!!!!!!!!
RESTAR: WORD -1 < RESTAR=-1 : LE CHARGEMENT
< A EU LIEUR ;
< RESTAR=0 : APRES CHARGEMENT ,
< PERMET DONC DE RE-
< RENTRER SUITE A UN
< 'ALT-MODE'.
<
< D E M A N D E S A D R E S S E E S A M S P :
<
CHOME: WORD '0202 < ENVOI DU CURSEUR EN 'HOME'.
WORD MHOME < ASTUCE ....!!??9!?
WORD 1 < 1 CARACTERE (''HOME'').
ERASE: WORD '0205 < ERASE SCREEN.
CARTE: WORD '0A00 < ENTREE DE LIGNES ENTIERES
< SUR NVP=10.
WORD 0
WORD 80 < ET NON PAS 'NBCAR' , ET CECI
< A CAUSE DU MICRO-CANAL ....
MESGI: WORD '0100 < ENTREE D'1 CARACTERE SANS ECHO.
WORD MESG
WORD 1
MESGO: WORD '0202 < ECHO EVENTUEL DU CARACTERE LU.
WORD MESG
WORD 1
LIGN: WORD '0202 < EDITION D'UNE LIGNE DE LA PAGE.
WORD 0
WORD NBCAR
CCI: WORD '0001 < RETOUR AU CCI EN FIN D'EDITION.
OG: WORD '0203 < OPEN GRAPHIQUE.
CG: WORD '0204 < CLOSE GRAPHIQUE.
WG: WORD '020A < ECRITURE GRAPHIQUE.
WORD COORD
WORD 4 < ENVOI DES COORDONEES DU CURSEUR
< ALPHA-NUMERIQUE.
CU: WORD '0106 < MISE EN FONCTION DU CURSEUR
< GRAPHIQUE.
WORD 0;0
LG: WORD '0109 < LECTURE DES COORDONNEES DU
< CURSEUR GRAPHIQUE.
WORD POINTC
WORD 6 < 6 OCTETS A LIRE.
LTAGR: VAL '140 < NBRE MAX DE SEGMENTS
< AUTORISES LORS D'UNE EDITION
< GRAPHIQUE.
SPAGE: WORD '0002 < POUR OPERATIONS SUR L'ARBRE
< DU SYSTEME.
WORD PAGE
X40: VAL 8*LTAGR
X40: VAL 80-NBCAR+X40 < A CAUSE DE 'CARTE' QUI LIT 80
< CARACTERES PAR LIGNE DE PAGE ?!!!
WORD NBCAR*NBLIG+X40
X40: VAL X40-80+NBCAR < RESTAURE X40=8*LTAGR.
WORD -1 < VALEUR SUIT IMMEDIATEMENT NOM.
SCATAL: WORD '0002 < POUR DEMANDE CATALOGUE DES NOMS.
WORD 0 < @OCTET DU NOM.
WORD 0 < LONGUEUR DU NOM.
WORD -1 < VALEUR SUIT IMMEDIATEMENT NOM.
PUNCH: WORD '0B02 < ECRITURE SUR NVP=11 (CU COUPLE
< A LA PERFORATRICE.
WORD 0 < @-OCTET DE BPUNCH.
WORD 2 < 1 MOT D'INFORMATION A ENVOYER.
SLEEP: WORD '0005 < FONCTION DE MISE EN SOMMEIL
< EDIT LORS DU PUNCH DES CARTES.
WORD 0
WORD 4 < 4 SECONDES DE SOMMEIL.
<
< C O N S T A N T E S D E L ' E D I T E U R :
<
AFEDIT: WORD FEDIT,X < RELAI VERS LA TABLE DE COMMANDE
< DE L'EDITEUR.
COG: WORD TCOG,X < RELAI DE LA TABLE DES FONCTIONS
< GRAPHIQUES.
ATCOD: WORD TCOD,X < TABLE DE CODAGE ASCI EN CODE
< CARTE (COMPATIBLE LECTEUR DE
< DE CARTES).
ADPAGE: WORD PAGE < @PAGE ALPHA-NUMERIQUE.
APAGE: WORD 0 < RELAI DE TRAVAIL SUR UNE LIGNE
< DE LA PAGE.
ATAGR: WORD TAGR < @TABLE DES SEGMENTS.
ALTAGR: WORD LTAGR < NBRE D'ENTREES DE TAGR.
<
REPEAT: BYTE 0;"?" < VALEUR INITIALE.
DOG: WORD 0 < COMPTEUR DE REPEATS EN ALPHA-
< NUMERIQUE DANS LE MODE CTRL-A.
< DOG=0 : PAS DE REPEAT EN COURS ,
< DOG<0 : REPEAT A L'INFINI.
< DOG>0 : REPEAT 'DOG' FOIS.
PKC: WORD 0 < RANG 1ER CARACTERE DE LA CHAINE
< COURANTE.
DKC: WORD 0 < RANG DU DERNIER CARACTERE DE
< LA CHAINE COURANTE.
IMOV: WORD 0 < INCREMENT/DECREMENT LORS DU MOVE
< D'UNE CHAINE .(+1/-1).
VAR: WORD 0 < DESTINE AUX EFFACEMENTS SEGMENT.
BPUNCH: EQU VAR < BUFFER DE PUNCH.
VARY: WORD 0 < CTTE DE TRANSLATION DE Y.
LASTP: EQU VARY < DERNIER CARACTERE PUNCHE.
VARX: WORD 0 < CTTE DE TRANSLATION DE X.
GRAFP: WORD -1 < SI <0 : GRAPHIQUE INTERACTIF ,
< SI >=0 : DONNE L'INDEX DE LA
< COMMANDE COURANTE
< GRAPHIQUE DANS 'PAGE'.
LGRAFP: VAL 10 < LONGUEUR DE LA PILE DES GRAFP.
SGRAFP: BYTE LGRAFP;0
DZS LGRAFP+1 < ZONE D'EMPILEMENT DES GRAFP.
CTRL: WORD 0 < CTRL=0 : CAS GENERAL ,
< CTRL=-'40 : LA COMMANDE GRAPHIQUE
< SUIVANTE SERA
< CONSIDEREE COMME
< UN CTRL-XXX.
SCALE: WORD 2 < FACTEUR D'ECHELLE INITIAL.
SCAL13: WORD 0 < SI #0 : INVERSION DE '1' ET '3'.
SCAL24: WORD 0 < SI #0 : INVERSION DE '2' ET '4'.
SCAL56: WORD 0 < SI #0 : 2NVERSION DE '5' ET '6'.
SCALXY: WORD 0 < SI #0 : INVERSION DE X ET DE Y.
FIS: BYTE 0;'3E < '>' IMPLICITE.
KNUMER: WORD '1000 < NUMERATEUR D'UN RAPPORT.
KDENOM: WORD '1000 < DENOMINATEUR D'UN RAPPORT.
SUP: WORD 0 < INDICATEUR DE POSITION HAUTE
< SUR UNE LIGNE :
< SUP=0 : LE CARACTERE SUIVANT
< SERA SUR LA LIGNE ,
< SUP='80 : LE CARACTERE SUIVANT
< SERA 10 POINTS AU-
< DESSUS DE LA LIGNE.
MEMO: WORD 0 < LE BIT0 INDIQUE S'IL FAUT
< MEMORISER UN SEGEMENT (0) ,
< OU PAS (1).
YC: WORD 0 < Y DU CENTRE DU CERCLE.
XC: WORD 0 < X DU CENTRE DU CERCLE.
YK: WORD 0
XK: WORD 0
<
ASVC: WORD ESVC < APPEL DE MSP.
ABELL: WORD BELL < ENVOI D'UNE 'BELL' A L'UTILISATEUR
ASAVEK: WORD SAVEK < SAVE CARACTERE EN VUE DES REPEAT.
ASP1: WORD SP1 < ROUTINE DE RAZ DE LA PAGE ALPHA.
ASP2: WORD SP2 < ROUTINE DE MAJ DE SCATAL.
ADIV: WORD DIV < UTILISE POUR LES CERCLES.
AINIP: WORD INIP < INITIALISATION DE LA PAGE.
AE40: WORD E40 < ERREUR EDITEUR GRAPHIQUE.
AE42: WORD E42 < BOUCLE DE L'EDITEUR GRAPHIQUE.
ACTAGR: WORD CTAGR < CLEAR TABLE DES SEGMENTS.
AGRAFP: WORD PGRAFP < ROUTINE DE CALCUL DE Y=@SGRAFP.
ASEEKS: WORD SEEKS < RECHERCHE SEGMENT DANS TAGR.
AMPC: WORD MPC
AROTAT: WORD ROTAT < ROTATION D'UN POINT.
ATRANS: WORD TRANS < TRANSLATION D'UN POINT.
AHOMOT: WORD HOMOT < @ROUTINE HOMOTHETIE 1 POINT.
ASP: WORD 0 < ROTATION OU TRANSLATION 1 POINT.
ATSE: WORD TSE < TEST DE SORTIE DE L'ECRAN.
ALOOP: WORD LOOP < RETOUR A LA BOUCLE DE L'EDITEUR.
<
C37: WORD NBCAR/2 < CONSTANTE MULTIPLICATIVE.
C74: WORD NBCAR < CONSTANTE DE DIVISION.
N3574: WORD NBCAR*NBLIG < NBRE DE CARACTERES PAR ECRAN.
X41: VAL NBCAR*NBLIG/2
NMPP: WORD X41-1 < NBRE DEMOTS D'UNE PAGE-1.
C1024: WORD 1024
R: WORD 61*524
RS2: WORD 61*524/2
COS: WORD 60*524 < COS(DTETA)=COS/R.
SIN: WORD 11*524 < SIN(DTETA)=SIN/R.
DIF: WORD 1*524 < DIF=R-COS.
<
< B U F F E R S E T M E S S A G E S :
<
MESG: BYTE '00;'07 < CARACTERE UTILISATEUR-'BELL'.
MHOME: BYTE '60;0 < PSEUDO-CARACTERE 'HOME'.
COORD: DZS 4 < ENVOI DES COORDONNEES
< DU CURSEUR ALPHA-NUMERIQUE OU
< OU DES COORDONNEES
< D'UN SEGMENT.
SEGC: EQU COORD < 4 MOTS CONTENANT LES COOR-
< DONNEES DU SEGMENT COURANT.
SEGV: DZS 2
MRCLF: BYTE '0D;'0A
PILE: DZS 20 < PILE DE L'EDITEUR.
PAGE
<
< T A B L E D E C O M M A N D E :
<
FEDIT: EQU $
WORD EERR < 0 ,
WORD AC < CTRL-A : REPEAT DU CARACTERE
< PRECEDENT UN NBRE DE FOIS EGAL
< A LA VALEUR REPRESENTEE PAR LE
< CARACTERE QUI SUIVRA MOINS 1.
WORD CACN < CTRL-B : CATALOGUE DES ACNS.
WORD CATAL < CTRL-C : CATALOGUE DES NOMS.
WORD STK < CTRL-D : <EON> , INSERE DANS
< LA PAGE , COMME UN AUTRE CARACTERE
WORD EDIT < CTRL-E : EDITION DE LA PAGE
< COURANTE.
WORD FIN < CTRL-F : RETOUR AU CCI ,
WORD GRAPH < '7 : CTRL-G : PASSAGE EN MODE
< GRAPHIQUE.
WORD HC < CTRL-H : CURSEUR W ,
WORD IC < CTRL-I : CURSEUR E ,
WORD LF < LF : CURSEUR S ,
WORD KC < CTRL-K : CURSEUR N ,
WORD LC < 'C : CTRL-L : DESIGNATION DU
< 1ER CARACTERE DE
< CHAINE COURANTE.
WORD RC < RETOUR-CHARRIOT ,
WORD NC < 'E : CTRL-N : DESIGNATION DE
< LA NOUVELLE ORIGINE
< DE LA CHAINE
< COURANTE.
WORD OC < 'F : CTRL-O : POSITION HAUTE.
WORD PC < ENTREE CARTES SUR NVP=10.
WORD QC < '11 : CTRL-Q : QULEQUE-SOIT.
WORD INIP < CTRL-R : REINITIALISATION DE LA
< PAGE ,
WORD EERR < '13 : USAGE INTERDIT , CF. LE
< CTRL-X-OFF.
WORD TPAGE < TC : APPEL PAGE SOUS <ACNESC>.
WORD SYSPAG < UC : APPEL PAGE SOUS :SYS.
WORD EERR < CTRL-V : CF. TABULATION CMS4.
WORD WPAGE < WC : SAUVEGARDE PAGE SUR DK.
WORD DPAGE < XC : DELETE PAGE SUR DK.
WORD YCD < '19 : CTRL-Y : SIGNE DIFFERENT.
WORD ZC < '1A : CTRL-Z : REPEAT CARACTERE.
WORD KCS < '1B : CTRL-SHIFT-K : IL N'EXISTE
< PAS.
WORD LCS < '1C : CTRL-SHIFT-L : DESIGNATION
< DU DERNIER
< CARACTERE DE
< LA CHAINE
< COURANTE.
WORD MCS < '1D : CTRL-SHIFT-M : IL EXISTE.
WORD NCS < '1E : CTRL-SHIFT-N : FLECHE
< DROITE.
WORD OCS < CTRL-SHIFT-O : PERFORATION
< DE LA PAGE COURANTE SUR NVP=11.
WORD STK < TOUS LES AUTRES CARACTERES SONT
< RANGES A L'EMPLACEMENT DU CURSEUR
< DANS LA PAGE COURANTE.
WORD EERR < '21 : FAUX CARACTERE D'ERREUR.
PAGE
<
< T A B L E D E C O M M A N D E G R A P H I Q U E :
<
TCOG: EQU $
WORD F13 < MODE NORMAL '1' ET '3'.
< ('!').
WORD F24 < MODE NORMAL DE '2' ET '4'.
< ('"').
WORD F31 < INVERSION DE '1' ET '3'.
< ('#').
WORD F42 < INVERSION DE '2' ET '4'.
< ('$').
WORD F56 < MODE NORMAL DE '5' ET '6'.
< ('%').
WORD F65 < INVERSION DE '5' ET '6'.
< ('&').
WORD E40
WORD FOUVR < SCALE<--(SCALE)+6.
< ('(').
WORD FFERM < SCALE<--(SCALE)-6.
< (')').
WORD FSTAR < RETOURS AUX MODES NORMAUX : CF.
< F13 & F24 & F56 & FXY.
WORD FPLUS < SCALE<--(SCALE)+1 , 1 SI >128.
< ('+').
WORD E40
WORD FMOINS < SCALE<--(SCALE)-1 , 128 SI =0.
< ('-').
WORD E40
WORD FCTRL < TRANSFORMATION DE LA COMMANDE
< GRAPHIQUE SUIVANTE EN UN CTRL-XXX.
< ('/').
WORD F0 < X<--0 ; Y<--0.
WORD F1 < X<--(X)+SCALE.
WORD F2 < Y<--(Y)+SCALE.
WORD F3 < X<--(X)-SCALE.
WORD F4 < Y<--(Y)-SCALE.
WORD F5 < X<--(X)+3*SCALE/4 ,
< Y<--(Y)+SCALE/4.
WORD F6 < X<--(X)-3*SCALE/4 ,
< Y<--(Y)-SCALE/4.
WORD F7 < SCALE<--4.
WORD F8 < SCALE<--8.
WORD F9 < SCALE<--16.
WORD F2P < DESIGNATION D'UN PROGRAMME
< GRAPHIQUE.
WORD E40
WORD FINF < MISE EN MODE '<'.
WORD E40
WORD FSUP < MISE EN MODE '>'.
WORD FYX < INVERSION DE X ET DE Y.
< ('?').
WORD FXY < MODE NORMAL DE X ET DE Y.
< ('@').
WORD FA < DESIGNATION 1ER POINT SEGMENT.
WORD FB < DESIGNATION 2EME POINT SEGMENT.
WORD FC < TRACE DU CERCLE COURANT.
WORD FD < AFFICHAGE TOUS SEGMENTS (DESSIN).
WORD FE < EFFACEMENT SEGMENT DESIGNE.
WORD FF < RETOUR A L'ALPHA-NUMERIQUE.
WORD FG < EDITION DE LA GRILLE.
WORD FH < HOMOTETHIE TABLE DES SEGMENTS.
WORD FI < RAPPORT D'HOMOTETHIE<1.
WORD FJ < MISE EN MODE GRAPHIQUE PROGRAMME.
WORD FK < 2EME POINT D'UN SEGMENT (ETOILE).
WORD FL < TRACER CERCLE DANS LE SENS TRIGO.
WORD FM < MODE MEMORISATION DES SEGMENTS.
WORD FN < MODE NON MEMORISATION SEGMENTS.
WORD FO < DESIGNATION CENTRE DU CERCLE.
WORD FP < RAPPORT D'HOMOTHETIE=-1 (SYM.).
WORD FQ < ROTATION TABLE DES SEGMENTS.
WORD FR < TRACER ANTI-TRIGO D'UN CERCLE.
WORD FS < DESIGNATION DU SEGMENT COURANT.
WORD FT < TRANSLATION DU SEGMENT COURANT.
WORD FU < RAPPORT D'HOMOTETHIE>1.
WORD FV < TRANSLATION TABLE DES SEGMENTS.
WORD FW < DESSIN COUBE !?!?!?!?!
WORD FX < EFFACEMENT DE L'ECRAN.
WORD FY < FIN DU MODE GRAPHIQUE PROGRAMME.
WORD FZ < RAZ DE LA TABLE DES SEGMENTS.
NCOG: VAL $-TCOG < NBRE DE FONCTIONS GRAPHIQUES.
PAGE
<
<
< T A B L E D E C O D A G E C A R T E S :
<
<
< FORMAT :
< BIT0-11=CODE 12 BITS DE PERFORATION ,
< BIT14=1 : CARACTERE NUMERIQUE ,
< BIT15=1 : CARACTERE ALPHA-BETIQUE.
<
<
TCOD: EQU $-'20+1
WORD '2121 < EOT 4 (TRANSPOSE EN 1F)
WORD '0000 < 'SPACE 20
WORD '4821 < ! 21
WORD '0061 < " 22
WORD '0421 < # 23
WORD '4421 < $ 24
WORD '2222 < % 25
WORD '8001 < & 26
WORD '0121 < ' 27
WORD '8121 < ( 28
WORD '4121 < ) 29
WORD '4222 < * 2A
WORD '80A1 < + 2B
WORD '2421 < , 2C
WORD '4002 < - 2D
WORD '8421 < . 2E
WORD '3002 < / 2F
WORD '2001 < 0 30
WORD '1001 < 1 31
WORD '0801 < 2 32
WORD '0401 < 3 33
WORD '0201 < 4 34
WORD '0101 < 5 35
WORD '0081 < 6 36
WORD '0041 < 7 37
WORD '0021 < 8 38
WORD '0011 < 9 39
WORD '0821 < : 3A
WORD '40A1 < ; 3B
WORD '8222 < < 3C
WORD '00A1 < = 3D
WORD '20A1 < > 3E
WORD '2061 < ? 3F
WORD '0222 < @ 40
WORD '9002 < A 41
WORD '8802 < B 42
WORD '8402 < C 43
WORD '8202 < D 44
WORD '8102 < E 45
WORD '8082 < F 46
WORD '8042 < G 47
WORD '8022 < H 48
WORD '8012 < I 49
WORD '5002 < J 4A
WORD '4802 < K 4B
WORD '4402 < L 4C
WORD '4202 < M 4D
WORD '4102 < N 4E
WORD '4082 < O 4F
WORD '4042 < P 50
WORD '4022 < Q 51
WORD '4012 < R 52
WORD '2802 < S 53
WORD '2402 < T 54
WORD '2202 < U 55
WORD '2102 < V 56
WORD '2082 < W 57
WORD '2042 < X 58
WORD '2022 < Y 59
WORD '2012 < Z 5A
PAGE
<
<
< R O U T I N E S D E L ' E D I T E U R :
<
<
PROG
PAGE
<
<
< S A U V E G A R D E D E S C A R A C T E R E S
< E N V U E D ' E V E N T U E L S R E P E A T S :
<
<
< ARGUMENT :
< A=CARACTERE.
<
<
SAVEK: EQU $
STA REPEAT < SAVE CARACTERE COURANT EN VUE
< D'UN EVENTUEL REPEAT.
RSR
PAGE
<
<
< P E R F O R A T I O N D E L A P A G E
< C O U R A N T E S U R N V P = 1 1 :
<
<
< FONCTION :
< AYANT HABILEMENT CONNECTE LA PERFO
< HONEYWELL BULL SUR LE T1600 PAR
< L'INTERMEDIAIRE D'UN COUPLEUR
< UNIVERSEL , ON A LA POSSIBILITE DE
< SAUVEGARDER LA PAGE COURANTE SUR
< CARTES (QUEL PROGRES...).
< ON PUNCHE 35 LIGNES , OU BIEN ON
< S'ARRETE LORS DE LA RENCONTRE D'UN
< 'EOT' EN COLONNE 74.
<
<
OCS: EQU $
LA ADPAGE
SBT 0
STA APAGE < GENERATION D'UN RELAI VERS LA
< PAGE COURANTE.
LXI 0 < INDEX CARACTERE COURANT DANS
< LA PAGE.
LBI NBLIG < B=NBRE DE CARTES MAX A PUNCHER.
E410: EQU $
LYI NBCAR < Y=NBRE DE CARACTERES D'UNE
< LIGNE DE PAGE.
E411: EQU $
LBY &APAGE < A=CARACTERE COURANT A PUNCHER.
STA LASTP < ET SAVE IT IN LASTP.
CPI "Z"
JLE E408 < OK , CODE RECONNU.
LAI '20 < NON : REMPLCE PAR 'SPACE'.
E408: EQU $
CPI 4 < EST-CE 'EOT' ?????
JNE E409 < NON.
<
< TRAITEMENT SPECIAL DE L''EOT' :
<
LAI '20-1 < L''EOT' EST CONVERTI EN '1F.
STZ LASTP < MEMORISONS 'EOT' PAR LASTP=0.
E409: EQU $
PSR X
LR A,X < X=CODE ASCI DU CARACTERE.
LA &ATCOD < A=CODE DE PERFORATION.
PLR X
STA BPUNCH < MISE DU CARACTERE DANS LE
< BUFFER DE PERFORATION.
LAD PUNCH
BSR ASVC < ENVOI D'UN CARACTERE A LA PERFO.
JANE E291 < RETOUR EN ERREUR : NVP NON
< ASSIGNE , ....
ADRI 1,X < CARACTERE SUIVANT.
ADRI -1,Y < DECOMPTE DES CARACTERES SUR
< LA LIGNE COURANTE.
CPZR Y
JNE E411 < LA LIGNE EST INCOMPLETE.
<
< CAS OU UNE LIGNE COMPLETE A ETE ENVOYEE ,
< COMPLETONS LA CARTE PAR 6 CARACTERES 'SPACE' :
< (A NOTER QUE L'ON ENVOIE SYSTEMATIQUEMENT
< 80 CARACTERES POUR EVITER LES PROBLEMES
< DE SATURATION DE LA PERFO)
<
LYI 80-NBCAR < NBRE DE 'SPACE' A ENVOYER.
STZ BPUNCH < BPUNCH='0000=CODE DU 'SPACE'.
E412: EQU $
LAD PUNCH
BSR ASVC < ENVOI D'UN 'SPACE'.
ADRI -1,Y
CPZR Y
JNE E412 < TOUS LES 'SPACE' N'ONT PAS
< ETE ENVOYES.
<
< LA CARTE A ETE EJECTEE AU CARACTERE 80 ,
< PASSONS A LA LIGNE SUIVANTE :
<
CPZ LASTP < TEST DU DERNIER CARACTERE CODE.
JE E291 < C'ETAIT UN 'EOT' EN COLONNE 74.
< ON ARRETE DONC LA LA PERFO.
ADRI -1,B < SINON , DECOMPTE DES LIGNES
< RESTANT A PUNCHER.
LAD SLEEP
BSR ASVC < MISE EN SOMMEIL POUR
< 4 SECONDES (TEMPS DE PUNCH D'UNE
< CARTE ...
CPZR B
JNE E410 < IL EN RESTE.
JMP E291 < 35 LIGNES ONT ETE PUNCHEES.
PAGE
<
<
< C R E A T I O N D ' U N E L I G N E
< A L P H A - N U M E R I Q U E A P A R T I R
< D U N V P = 1 0 :
<
<
< FONCTION :
< CE MODULE LIT UN PAQUET DE CARTES
< SUR NVP=10 , ET L'IMPLANTE DANS LA PAGE
< ALPHA-NUMERIQUE COURANTE ; L'OPERATION
< SE TERMINE A LA 35EME CARTE OU SUR
< LA 1ERE CARTE CONTENANT UN 'EOT'
< EN COLONNE 74.
<
<
PC: EQU $
LY ADPAGE
LR Y,B
ADRI -1,Y < Y CONTIENT UNE ADRESSE MOT
< QUI PERMETTRA D'ATTEINDRE LE
< DERNIER CAREACTERE DE CHAQUE
< LIGNE.
ADR B,B < B=@OCTET DU BUFFER INITIAL.
LXI NBLIG < NBRE MAX DE CARTES A LIRE.
E290: EQU $
STB CARTE+1 < MAJ DE LA DEMANDE AVEC L'@
< OCTET DU BUFFER COURANT.
LAD CARTE
BSR ASVC
JANE E291 < ABANDON SUR ERREUR.
ADRI NBCAR,B < PROGRESSION DE L'@OCTET DU
< BUFFER COURANT.
ADRI NBCAR/2,Y < Y=@MOT DES 2 DERNIERS CARACTERES
< DE LA LIGNE QUE L'ON VIENT
< DE CREER.
STY APAGE < GENERATION DU RELAI.
LA &APAGE
ANDI 'FF < ACCES AU DERNIER CARACTERE DE
< LA LIGNE QUE L'ON VIENT DE CREER.
CPI '04 < EST-CE 'EOT' ????
JE E291 < OUI , ARRET DE L'OPERATION ,
< ET RENVOI HOME DU CURSEUR.
JDX E290 < CARTE SUIVANTE ....
E291: EQU $
BSR ABELL < AVERTISSEMENT DE FIN D'OPERATION.
JMP E72 < ARRET SUR LA 35EME CARTE ET
< RENVOI HOME DU CURSEUR.
PAGE
<
< T R A I T E M E N T D U C T R L - K :
<
< FONCTION : CETTE ROUTINE TRAITE LES
< DEPLACEMENTS 'N' DU CURSEUR (LIGNE UP).
<
KC: EQU $
BSR ASAVEK < EN VUE D'UN EVENTUEL REPEAT.
LAI 0 < PAS D'ECHO A PRIORI.
CPZR Y < LE CURSEUR EST-IL DEJA SUR
< LA 1ERE LIGNE DE L'ECRAN ???
JE E280 < OUI , IL Y RESTE (CF. LE HARD).
< (ET SUPPRESSION D'UN EVENTUEL
< REPEAT EN COURS ?!?!?!)
ADRI -1,Y < LE CURSEUR REMONTE D'UNE LIGNE
< DANS LA PAGE DANS LE CAS OU IL
< N'ETAIT PAS SUR LA 1ERE LIGNE.
E1: EQU $
LAD MESGO < DEMANDE DU CARACTERE CTRL-K.
E2: EQU $
BR ALOOP < RETOUR A LA BOUCLE DE L'EDITEUR.
<
< T R A I T E M E N T D U R E T O U R - C H A R R I O T :
<
RC: EQU $
LXI 0 < RETOUR EN TETE DE LIGNE.
JMP E1 < ALLONS DEMANDER L'ECHO DU CR.
<
< T R A I T E M E N T D U C T R L - H :
<
< FONCTION : CETTE ROUTINE TRAITE LES DEPLACEMENTS 'W'
< DU CURSEUR.
<
HC: EQU $
CPZR X < EST-ON DEJA EN DEBUT DE
< LIGNE ???? SI OUI , IL FAUT
< INTERDIRE LE CTRL-H , CAR UNE
< ERREUR
< HARD SUR LES TEKTRO FAIT QU'UN
< CTRL-H EN DEBUT DE LIGNE RAMENE
< SUR L'AVANT-DERNIER CARACTERE
< DE LA LIGNE , LE DERNIER
< DEVENANT INACCESSIBLE !!!
JE E280 < ENVOI D'UNE 'BELL' SANS ECHO.
< (ET SUPPRESSION D'UN EVENTUEL
< REPEAT EN COURS !!!).
ADRI -1,X < SINON , LE CURSEUR RECULE D'UNE
< POSITION.
BSR ASAVEK < EN VUE D'UN EVENTUEL REPEAT.
JMP E1 < VERS L'ECHO DU CTRL-H.
<
< T R A I T E M E N T D U C T R L - I :
<
< FONCTION : CETTE ROUTINE GERE LES DEPLACEMENTS
< 'E' DU CURSEUR.
<
IC: EQU $
BSR ASAVEK < EN VUE D'UN EVENTUEL REPEAT.
IC1: EQU $ < ENTREE POUR 'STK'.
ADRI 1,X < DEPLACEMENT D'UNE POSITION A
< DROITE DU CURSEUR.
LR X,A
CPI NBCAR < LE CURSEUR ETAIT-IL DEJA EN
< BOUT DE LIGNE ??
JL E1 < NON , ALLONS REDEMANDER L'ECHO
< DU CTRL-I.
LXI 0 < DANS LE CAS OU LE CURSEUR ETAIT
< DEJA EN BOUT DE LIGNE , ON FAIT
< COMME LE HARD : RC+LF.
JMP LF1 < APRES LE R/C (X=0) , LE LF ....
<
<
< M I S E E N P O S I T I O N H A U T E :
<
<
OC: EQU $
LAI '80 < POUR FAIRE MONTER LE BIT0
< DU CARACTERE SUIVANT.
STA SUP
JMP E24 < VERS LA BOUCLE DE L'EDITEUR
< SANS ECHO.
<
< T R A I T E M E N T D E S L I N E - F E E D :
<
< FONCTION : CETTE ROUTINE TRAITE LES CARACTERES
< 'LF' ET A A SA CHARGE D'EVITER QUE LA VISU NE
< FASSE UN MARGIN RIGHT , PUISQU'ALORS REGNE UNE
< VERITABLE PANIQUE AU AU POINT DE VUE GESTION DE LA
< POSITION DU CURSEUR ....
<
LF: EQU $
BSR ASAVEK < EN VUE D'UN EVENTUEL REPEAT.
LF1: EQU $ < ENTREE POUR 'IC'.
ADRI 1,Y < PASSAGE A LA LIGNE SUIVANTE.
LR Y,A
CPI NBLIG < LE CURSEUR ETAIT-IL DEJA SUR LA
< DERNIERE LIGNE DE LA PAGE ??
JL E1 < NON , ALLONS DEMANDER L'ECHO
< DU LF , ON NE RISQUE RIEN ....
LBY MESG < ACCES AU CARACTERE ENVOYE
< PAR L'UTILISATEUR.
CPI 'A < EST-CE LE LINE-FEED ????
JE E72 < OUI , RIEN A FAIRE ...
<
< CAS OU ON SIMULE UN LF EN BOUT DE PAGE :
<
LAD MESGO
BSR ASVC < ECHO DU CARACTERE , AVANT DE
< REVENIR HOME ......
E72: EQU $
LAD CHOME < DANS LE CAS OU ON ETAIT DEJA EN
< BAS DE PAGE , ON VA REPOSITIONNER
< LE CURSEUR DANS LA POSITION HOME.
JMP E14 < ALLONS REINITIALISER LES COOR-
< DONNEES DU CURSEUR.
PAGE
<
<
< R A N G E M E N T D E S C A R A C T E R E S :
<
<
< FONCTION : CETTE ROUTINE RANGE DANS LA MATRICE
< REPRESENTANT LA PAGE COURANTE LES
< CARACTERES QUI NE SONT PAS DES CARACTERES
< DE CONTROLE DE L'EDITEUR . LES CARACTERES DE CODE
< SUPERIEURS SUPERIEURS A '1F SONT RANGES DONC
< A LA POSITION COURANTE DU CURSEUR.
<
STK: EQU $
LR Y,A
MP C37 < B=NUMERO DE LIGNE(Y)*37.
LA ADPAGE < A=@PAGE ALPHA-NUMERIQUE.
ADR B,A < A=@LIGNE COURANTE DE LA PAGE.
SBT 0 < BIT D'INDEXATION.
STA APAGE < GENERATION DU RELAI D'ACCES A
< LA LIGNE COURANTE.
LBY MESG < A=CARACTERE STANDARD DE
< L'UTILISATEUR.
TBT 9 < EST-CE UN CARACTERE COMPOSITE ???
JNC E30 < NON ,OK ....
TBT 10 < EST-CE UN CARACTERE COMPOSITE ???
JC E29 < OUI , IL FAUT DONC TESTER LE X
< DU CURSEUR.
E30: EQU $
OR SUP < MISE EN PLACE DE L+ POSITION
< HAUTE EVENTUELLEMENT.
STZ SUP < RAZ DE L'INDICATEUR DE POSITION
< HAUTE.
STBY &APAGE < QUE L'ON RANGE DANS LA MATRICE
< DANS LA POSITION (X,Y) SOIT
< CELLE DU CURSEUR.
BSR ASAVEK < EN VUE D'UN EVENTUEL REPEAT.
JMP IC1 < PUIS ENSUITE TOUT SE PASSE COMME
< SI L'ON TRAITAIT UN CTRL-I .....
<
< CAS DES CARACTERES COMPOSITES :
< UNE ANOMALIE DU CTRL-H , ET LE FAIT
< QU'IL NE FASSE PAS REMONTER A LA LIGNE
< PRECEDENTE LORSQU'ON L'EXECUTE ALORS QU'ON
< EST EN DEBUT DE LIGNE , OBLIGE A INTERDIRE
< LES CARACTERES COMPOSITES DANS LA CASE
< 73 (DERNIER CARACTERE) DE CHAQUE LIGNE.
<
E29: EQU $
XR A,X
CPI NBCAR-1 < TEST DU X DU CURSEUR.
XR A,X
JNE E30 < ON N'EST PAS EN BOUT DE LIGNE ,
< LE CARACTERE COMPOSITE EST DONC
< ACCEPTABLE.
<
< CAS D'UN CARACTERE COMPOSITE EN BOUT DE LIGNE :
<
E280: EQU $ < ENTRY 'CTRL-H' ERRONNES.
STZ DOG < SUPPRESSION DE L'EVENTUEL
< REPEAT EN COURS.
BSR ABELL < MESSAGE ERREUR A L'UTILISATEUR.
JMP E24 < BOUCLE DE L'EDITEUR SANS ECHO.
PAGE
<
<
< R E P E A T C A R A C T E R E :
<
<
< FONCTION :
< CTRL-Z PERMET DE REPETER LE DERNIER
< CARACTERE STANDARD ENTRE DANS L'EDITEUR.
< LA REPETITION SE POURSUIT JUSQU'A CE QUE
< L'UTILISATEUR ENVOIE UN CTRL-X-OFF.
< CTRL-A PERMET LA REPETITION DU CARACTERE
< PRECEDENT UN NBRE DE FOIS EGAL A LA VALEUR
< REPRESENTEE PAR LE CARACTERE QUI SUIT LE CTRL-A
< (SOIT '1'=1,'2'=2,...'A'=10,'B'=11,...) MOINS 1 ,
< AINSI :
< '*<CTRL-A>3'='***'.
<
<
ZC: EQU $ < ENTRY 'REPEAT A L'INFINI'.
LAI -1 < AFIN DE METTRE DOG<0.
JMP E400
AC: EQU $ < ENTRY 'REPEAT 'DOG' FOIS'.
< A NOTER : AU PASSAGE DE 'LOOP' ,
< ON FAIT -1 SUR DOG ....(OK).
LAD MESGI < AFIN DE LIRE UN CARACTERE.
BSR ASVC < LECTURE D'UN CARACTERE.
LBY MESG < A=CARACTERE LU , DONT LE CODE
< EST LE NBRE DE REPETITIONS
< A FAIRE +1.
ADRI -'30,A < CONVERSION BINAIRE.
JALE EERR < VALIDATION.
CPI 9 < DISCRMINATION CHIFFRES/LETTRES.
JLE E402 < C'EST UN CHIFFRE , OK.
ADRI -'41+'39+1,A < CAS DES LETTRES.
E402: EQU $
E400: EQU $ < TRONC COMMUN A AC ET ZC.
STA DOG < MISE EN PLACE DE DOG.
LA REPEAT < A=CARACTERE A REPETER.
STBY MESG < QUE L'ON MET DANS MESG COMME
< SI ON L'AVAIT LU ....
JMP E24 < VERS LA BOUCLE DE EDIT SANS
< ECHO EVIDEMMENT.
PAGE
<
<
< E R R E U R S U T I L I S A T E U R :
<
<
EERR: EQU $
BSR ABELL < ENVOI D'UNE 'BELL' SUPPLEMENTAIRE
E24: EQU $
LAI 0 < SUPPRESSION DE L'ECHO.
BR ALOOP < RETOUR A LA BOUCLE DE L'EDITEUR.
<
<
< E N V O I D ' U N E B E L L :
<
<
<
<
< RESULTAT :
< A=CONDITION DE RETOUR DU MSP ('13 SI CTRL-X-OFF).
BELL: EQU $
LAD MESGO
IC MESGO+1 < L'ADRESSE BUFFER DE MESG
< PROGRESSS DE 1 POUR ACCEDER
< A LA 'BELL'.
BSR ASVC < ENVOI DE LA 'BELL'.
DC MESGO+1 < RETOUR SUR LE CARACTERE
< DE L'UTILISATEUR.
RSR
PAGE
<
<
< M O U V E M E N T D E C H A I N E S
< D E C A R A C T E R E S :
<
<
< PHILOSOPHIE :
< ON DISPOSE D'UNE CHAINE COURANTE DONT LE 1ER
< CARACTERE EST DESIGNE PAR CTRL-L , ET LE
< DERNIER PAR CTRL-SHIFT-L . ENSUITE LA COMMANDE
< CTRL-N PERMET DE DEPLACER CETTE CHAINE
< EN PRECISANT SA NOUVELLE ORIGINE . LES POSITIONS
< DES CARACTERES SONT TOUJOURS DONNEES PAR LA
< POSITION COURANTE DU CURSEUR . A NOTER QUE
< LES DEPLACEMENTS DE CHAINES PEUVENT ETRE
< EN RECOUVREMENT AVANT/ARRIERE.
<
<
<
< T R A I T E M E N T D E C T R L - L :
<
LC: EQU $
LR Y,A < A=Y DU CURSEUR.
MP C74
ADR X,B < B=RANG DU 1ER CARACTERE DE LA
< CHAINE COURANTE.
STB PKC < ET SAVE IT.
JMP E24 < GO BACK TO EDITOR LOOP ET CECI
< SANS ECHO.
<
< T R A I T E M E N T D E C T R L - S H I F T - L :
<
LCS: EQU $
LR Y,A < A=Y DU CURSEUR.
MP C74
ADR X,B < B=RANG DU DERNIER CARACTERE DE
< LA CHAINE COURANTE.
STB DKC < ET SAVE IT.
JMP E24 < VERS LA BOUCLE DE L'EDITEUR
< SANS ECHO.
<
< T R A I T E M E N T D E C T R L - N :
<
NC: EQU $
LA DKC
SB PKC < A=LONGUEUR-1 DE LA CHIANE
< COURANTE.
JAGE E25 < OK , LE 1ER CARACTERE PRECEDE
< OU RECOUVRE LE DERNIER CARACTERE.
<
< CAS DES DEMANDES ERRONNEES :
<
BSR ABELL < ENVOI D'1NE 'BELL' D'ERREUR.
JMP E24 < BOUCLE EDITEUR , SANS ECHO.
<
< CAS DES DEMANDES CORRECTES :
<
E25: EQU $
PSR X,Y < SAVE COORDONNEE DU CURSEUR.
< ON A ICI :
< A=LONGUEUR-1 DE LA CHAINE COURANTE ,
< (X,Y)=COORDONNEE DU CURSEUR.
XR A,Y < Y=LONGUEUR-1 ; A=Y DU CURSEUR.
MP C74
ADR B,X < X=RANG DE LA NOUVELLE ORIGINE
< DE LA CHAINE COURANTE.
LR Y,B < B=LONGUEUR-1.
LY PKC < Y=RANG DU 1ER CARACTERE.
< ON A ICI :
< B=LONGUEUR-1 DE LA CHAINE SOURCE ,
< X=RANG 1ER CARACTERE DE LA CHAINE DESTINATION ,
< Y=RANG 1ER CARACTERE DE LA CHAINE SOURCE.
<
< CHOIX DU SENS DE DEPLACEMENT :
<
LAI 1 < SENS CROISSANT A PRIORI.
CPR X,Y < TEST DE LA POSITION RELATIVE
< DES CHAINES SOURCES ET DESTINA-
< TION.
JE E27 < ELLES SONT CONFONDUES : RIEN
< A FAIRE.
JG E26 < LA CHAINE DESTINATION EST AVANT
< LA CHAINE SOURCE.
<
< CAS OU LA CHAINE DESTINATION EST APRES LA CHAINE SOURCE :
< DANS CE CAS , IL FAUT PROCEDER A L'ENVERS ,
< EN COMMENCANT PAR LE DERNIER CARACTERE.
<
ADR B,X < X=RANG DERNIER CARACTERE DE LA
< CHAINE DE DESTINATION.
ADR B,Y < Y=RANG DERNIER CARACTERE
< DE LA CHAINE SOURCE.
LAI -1 < ON SE DEPLACERA PAR VALEUR
< DECROISSANTE D'INDEX.
E26: EQU $
STA IMOV < SAVE INCREMENT/DECREMENT DES
< INDEX X & Y (+1/-1).
LA ADPAGE
SBT 0
STA APAGE < GENERATION D'UN RELAI INDEXE
< INDIRECT VERS LA PAGE COURANTE.
<
< BOUCLE DE MOUVEMENT :
<
E28: EQU $
XR X,Y < X=INDEX SOURCE.
LBY &APAGE < ACCES A LA CHAINE SOURCE.
XR X,Y < X=INDEX DESTINATION.
TBT 9
JNC E33 < CARACTERE STANDARD.
TBT 10
JNC E33 < CARACTERE STANDARD.
<
< CAS DES CARACTERES COMPOSITES :
<
PSR A,B
LAI 0
LR X,B < INDEX COURANT DANS LA PAGE.
DV C74 < LE RESTE (B) DONNE L'INDEX
< DU CARACTERE COMPOSITE DANS LA
< LIGNE COURANTE.
LR B,A
CPI NBCAR-1 < EST-ON EN BOUT DE LIGNE ???
PLR A,B
JNE E33 < NON , OK LE CARACTERE COMPOSITE
< EST DEPLACER COMME LES AUTRES.
<
< CAS D'UN CARACTERE COMPOSITE ARRIVANT EN
< BOUT DE LIGNE (73) , ON LE REMPLACE PAR '?' :
<
LAI '3F < MISE DE '?' A LA PLACE.
E33: EQU $
STBY &APAGE < RANGEMENT DE LA CHAINE DESTINATION.
LA IMOV < ACCES A L'INCREMENT/DECREMENT.
ADR A,X < X=X+-1.
ADR A,Y < Y=Y+-1.
LR X,A
CP N3574 < TEST DE L'INDEX DE DESTINATION :
< EVITER DE TOMBER HORS DE LA
< PAGE PAR VALEUR SUPERIEURES.
JGE E27 < DEBORDEMENT : LES CARACTERES
< SUIVANTS SONT IGNORES.
ADRI -1,B < DECREMENTATION DE LA LONGUEUR.
CPZR B
JGE E28 < IL EN RESTE A DEPLACER.
<
< C'EST LA FIN :
<
E27: EQU $
PLR X,Y < RESTAURE LES COORDONNEES
< DU CURSEUR.
JMP E24 < RETOUR A LA BOUCLE D'EDITION
< SANS ECHO EVIDEMMENT ......
PAGE
<
<
< I N I T I A L I S A T I O D E L A P A G E :
<
<
INIP: EQU $
BSR ASP1 < RAZ DE LA PAGE ALPHA.
<
< ERASE DE L'ECRAN DE LA VISU :
<
LAD ERASE
BSR ASVC < ERASE.
LAI 0 < ON NE DEMANDE EVIDEMMENT PAS
< D'ECHO.
<
< R E I N I T I A L I S A T I O N D E S
< C O O R D O N N E E S D U C U R S E U R :
<
E14: EQU $
LXI 0 < CORRDONNEE X DU CURSEUR=0 ,
LYI 0 < CORRDONNEE Y DU CURSEUR=0.
BR ALOOP < RETOUR A LA BOUCLE DE L'EDITEUR.
PAGE
<
<
< S O R T I E D E L ' E D I T E U R :
<
<
FIN: EQU $
LAD CCI
BSR ASVC < RETOUR AU CCI.
LAD CHOME < ET RENVOI DU CURSEUR HOME.
JMP E14
PAGE
<
<
< E D I T I O N D E L A P A G E C O U R A N T E :
<
<
EDIT: EQU $
LAD ERASE
BSR ASVC < EFFACEMENT DE L'ECRAN.
LYI NBLIG < Y=NBRE DE LIGNES A EDITER.
LA ADPAGE
SBT 0
E12: EQU $
STA APAGE < GENERATION DU RELAI D'ACCES
< A LALIGNE COURANTE DANS LA
< PAGE.
SLLS 1 < A=@OCTET DE A LIGNE COURANTE.
STA LIGN+1 < MAJ DE LA DEMANDE A MSP.
LXI NBCAR-1 < NBRE DE CARACTERES MOINS 1
< DANS LA LIGNE.
E57: EQU $
LBY &APAGE < ON PARCOURS LA LIGNE A L'ENVERS
< DE FACON A TROUVER LE 1ER
< CARACTERE QUI NE SOIT PAS
< UN 'SPACE'.
CPI '20 < EST-CE 'SPACE' ...???
JNE E58 < NON , ON ARRETE L'EXPLORATION
< DE LA LIGNE A REBROUSSE POLI
< AU 1ER CARACTERE NON BLANC.
ADRI -1,X < DANS LE CAS DU 'SPACE' , ON
< CONTINUE A REMONTER LA LIGNE.
CPZR X
JGE E57 < OK , IL Y A ENCORE DES
< CARACTERES DANS LA LIGNE COURANTE
<
< CAS D'UNE LIGNE VIDE :
<
JMP E59 < ON NE VA QU'ENVOYER RC+LF.
<
< CAS D'UNE LIGNE NON VIDE :
<
E58: EQU $
< ON A ICI :
< X=RANG DU 1ER CARACTERE NON BLANC.
ADRI 1,X < X=NBRE DE CARACTERES UTILES
< SUR LA LIGNE COURANTE.
STX LIGN+2 < GENERATION DU COMPTE D'OCTETS
< DANS LA DEMANDE A MSP ..
STX VAR < AU CAS OU UNE EDITION PAR
< CARACTERES SUIVRAIT ...
<
< CHOIX ENTRE L'EDITION HAUTE ET L'EDITION BASSE :
<
E63: EQU $
ADRI -1,X
LBY &APAGE
TBT 8 < ON REGARDE SI LA LIGNE
< CONTIENT AU MOINS UN CARACTERE
< EN POSITION HAUTE ????
JC EDITK < OUI , ON S'ARRETE SUR LUI , ET
< ON VA EDITER LA LIGNE CARACTERE
< PAR CARACTERE.
CPZR X
JG E63 < CARACTERE PRECEDENT.
<
< EDITION DE LA LIGNE :
<
LAD LIGN
BSR ASVC < ECRITURE DE LA LIGNE.
JGE E22 < DANS LE CAS OU L'UTILISATEUR
< ENVOIE UN CTRL-X-OFF , ON
< ABANDONNE L'EDITION.
LA LIGN+2 < A=COMPTE D'OCTETS.
E64: EQU $
CPI NBCAR < LA LIGNE ETAIT-ELLE PLEINE ????
JE E60 < OUI , RIEN A FAIRE.
<
< CAS D'UNE LIGNE INCOMPLETE , ON
< ENVOIE UN RC+LF POUR PASSER A LA LIGNE
< SUIVANTE :
<
E59: EQU $
LAD MRCLF < A=@MOT DU MESSAGE RC+LF.
SLLS 1
STA LIGN+1 < MISE EN PLACE DE L'ADRESSE OCTE
< DU MESSAGE RC+LF.
LAI 2
STA LIGN+2 < MISE EN PLACE DU COMPTE OCTETS.
LAD LIGN
BSR ASVC < ENVOI DU RC+LF.
JGE E22 < ABANDON SI CTRL-X-OFF RECU.
<
< PASSAGE A LA LIGNE SUIVANTE :
<
E60: EQU $
LA APAGE
ADRI NBCAR/2,A < @MOT DE LA LIGNE SUIVANTE.
ADRI -1,Y < NBRE DE LIGNES RESTANTES.
CPZR Y
JG E12 < PASSAGE A LA SUIVANTE.
E22: EQU $
LAD CHOME < POUR L'ENVOI HOME DU CURSEUR.
JMP E14 < ALLONS ENVOYER HOME LE CURSEUR
< ALPHA-NUMERIQUE , ET RE-INITIA-
< LISER SES COORDONNEES.
PAGE
<
<
< E D I T I O N D E L A L I G N E C O U R A N T E
< P A R C A R A C T E R E S E N T E N A N T
< C O M P T E D E L A P O S I T I O N H A U T E :
<
<
EDITK: EQU $
<
< INITIALISATION DE L'EDITION :
<
PSR Y
STY COORD < FUTUR Y DU CURSEUR.
LA APAGE < RECUPERATION DE L'ADRESSE MOT
< DE LA LIGNE COURANTE DANS
< LA PAGE.
SLLS 1 < CONVERSION DE L'ADRESSE DE LA
< PAGE EN UNE ADRESSE D'OCTETS.
STA LIGN+1
LAI 1
STA LIGN+2 < ON VA EDITER LA PAGE CARACTERE
< PAR CARACTERE !!!!!!
LAI " "
STBY MESG
LXI 0 < INDEX DU 1ER CARACTERE.
<
< BOUCLE DE L'EDITION :
<
E19: EQU $
LBY &APAGE < ACCES A 1 CARACTERE.
TBT 8 < TEST DU BIT DE POSITION HAUTE.
JC E20 < LE CARACTERE DOIT ETRE EDITE
< EN POSITION HAUTE.
<
< CAS D'UN CARACTERE SUR LA LIGNE :
<
LAD LIGN
BSR ASVC < ENVOI DU CARACTERE.
< UN CTRL-X-OFF A-T'IL ETE RECU
< PENDANT L'EDITION DE LA PAGE ???
JGE E65 < OUI , ABANDON DE L'EDITION.
E21: EQU $
<
< PASSAGE AU CARACTERE SUIVANT :
<
IC LIGN+1 < PROGRESSION DE L'ADDRESSE
< OCTET DU BUFFER.
ADRI 1,X < INDEX DU CARACTERE SUIVANT.
LR X,A
CP VAR < A-T'ON ATTEINT LE DERNIER CARAC-
< TERE SIGNIFICATIF DE LA LIGNE
< COURANTE ????
JL E19 < NON , CONTINUONS ....
PLR Y
JMP E64 < OK , PASSAGE A LA LIGNE
< SUIVANTE SANS OUBLIER L'EVENTUEL
< RC+LF.
<
< ABANDON D'UNE EDITION SUITE A UN CTRL-X-OFF :
<
E65: EQU $
PLR Y
JMP E22 < VERS L'ABANDON DE L'EDITION DE
< LA PAGE.
<
< CAS D'UN CARACTERE EN POSITION HAUTE :
<
E20: EQU $
LR A,Y < SAVE LE CODE DU CARACTERE.
ANDI '7F < RAZ DU BIT0 DU CARACTERE.
STBY &APAGE < POUR PLAIRE AUX VISUS.
STX COORD+1 < FUTUR X DU CURSEUR.
LAI 14 < UN CARACTERE OCCUPE 14 POINTS
< EN LARGEUR.
MP COORD+1
STB COORD+1 < B=X GRAPHIQUE DU CURSEUR.
LAI 22 < UN CARACTERE OCCUPE 22 POINTS
< EN HAUTEUR.
MP COORD
ADRI 10,B < B=Y GRAPHIQUE DU CURSEUR ,
< AUGMENTE DE 10 POUR PASSER EN
< POSITION HAUTE.
LA COORD
XR A,B < SAVE COORD DANS B.
STA COORD
< ON A DONC ICI :
< COORD=Y GRAPHIQUE DU CURSEUR ,
< COORD+1=X GRAPHIQUE DU CURSEUR EN POSITION HAUTE.
LAD OG
BSR ASVC < MISE EN GRAPHIQUE DE LA VISU.
LAD WG
BSR ASVC < ENVOI DES COORDONNEES HAUTES
< DU CURSEUR , POUR LE REPOSITIONNER
LAD CG
BSR ASVC < RETOUR EN ALPHA-NUMERIQUE , LE
< CURSEUR EST MAINTENANT EN
< POSITION HAUTE.
LAD LIGN
BSR ASVC < ECRITURE DU CARACTERE EN
< POSITION HAUTE.
LR Y,A
STBY &APAGE < RESTAURE LE CARACTERE DANS LA
< PAGE COURANTE.
LA COORD
ADRI -10,A < RESTAURATION DE LA POSITION
< NORMALE DU CURSEUR AVANT
< ECRITURE DU CARACTERE.
STA COORD
LAD OG
BSR ASVC < RETOUR EN GRAPHIQUE.
LAD WG
BSR ASVC < RESTAURE CURSEUR AVANT ECRITURE
< DU CARACTERE.
LAD CG
BSR ASVC < RETOUR EN ALPHANUMERIQUE.
LAD MESGO
BSR ASVC < POUR REPOSITIONNEMENT CORRECT
< DU CURSEUR DERRIERE LE CARACTERE.
STB COORD < RESTAURE LE NUMERO DE LIGNE (+35)
JMP E21 < AU SUIVANT .....
PAGE
<
<
< T R A I T E M E N T D E S C A R A C T E R E S
< E X T E N S I O N C O M P O S I T E S :
<
<
MCS: EQU $ < IL EXISTE.
LAI '62
JMP E17
QC: EQU $ < QUELQUE-SOIT.
LAI '63
JMP E17
NCS: EQU $ < FLECHE DROITE.
LAI '67
JMP E17
KCS: EQU $ < IL N'EXISTE PAS.
LAI '6A
JMP E17
YCD: EQU $ < SIGNE DIFFERENT.
LAI '6C
E17: EQU $
STBY MESG < LE CARACTERE EXTENSION EST MIS
< DANS MESG COMME SI L'UTILISATEUR
< L'AVAIT ENVOYE.
JMP E18 < FAISONS COMME SI L'ON AVAIT
< RECU CE CODE ETENDU DE
< L'UTILISATEUR.
PAGE
<
<
< A P P E L D E C M S 4 :
<
<
< ARGUMENT :
< A=@TABLE DES ARGUMENTS.
<
<
< RESULTAT :
< A=CONDITIONS D'EXECUTION ET DE RETOUR.
< (EN PARTICULIER SI A='13 OU '93 , UN CTRL-X-OFF
< A ETE RECU PENDANT L'OPERATION).
< CARY=POSITIONNE EN FONCTION DE LA POSITION DE (A)
< PAR RAPPORT A '13 POUR TEST EN RETOUR.
<
ESVC: EQU $
PSR X < SAVE COORDONNEE X DU CURSEUR.
SVC 0 < APPEL DE MSP
LR X,A < RENVOI DES CONDITIONS DANS A.
PLR X
CPI '13 < UN CTRL-X-OFF A-T'IL ETE RECU
< PENDANT L'EXECUTION DU SVC.
RSR
PAGE
<
<
< E D I T E U R D E P A G E :
<
<
< CONVENTIONS DE L'EDITEUR :
< 1- MARGIN RIGHT EST SUPPRIME ,
< 2- COORDONNEE DU CURSEUR :
< X=COORDONNEE X DU CURSEUR ,
< Y=COORDONNEE Y DU CURSEUR.
<
<
EDITP: EQU $
<
< INITIALISATION DE LA PILE DE L'EDITEUR :
<
LAD PILE
LR A,K
<
< MISE EN ADRESSE OCTET DES ADRESSES DE BUFFERS :
<
LAD POINTC
SLLS 1
STA LG+1
LAD COORD
SLLS 1
STA WG+1
LAD MESG
SLLS 1
STA MESGI+1
STA MESGO+1
LAD MHOME
SLLS 1
STA CHOME+1
LA ADPAGE
SLLS 1
STA SPAGE+1
LAD BPUNCH
SLLS 1
STA PUNCH+1
<
< INITIALISATION GRAPHIQUE :
<
LA ATAGR
LR A,W < W=@TAGR.
<
< TEST DE LA NATURE DE L'ENTREE :
< (CHARGEMENT OU RESTART SUITE A 'ALT-MODE')
<
LA RESTAR
JAE E16 < C'EST UNE RE-RENTREE : A=0=UNE
< COMMANDE INTERDITE ; ON NE VA
< DONC PAS RAZER NI LA PAGE , NI
< LA TABLE DES SEGMENTS.
IC RESTAR < APRES LE CHARGEMENT ON FAIT :
< RESTAR=0.
<
< ENTREE SUITE AU CHARGEMENT :
<
BSR ACTAGR < CLEAR TABLE DES SEGMENTS.
LAI '12 < ON COMMENCE , PAR UN FAUX CTRL-R ,
< QUI PERMET UNE INITIALISATION
< DE LA PAGE ET DE L'ECRAN.
JMP E16 < ALLONS EXECUTER LE 'RAZ' ...
<
< B O U C L E D E L ' E D I T E U R :
<
E10: EQU $
CPZ DOG < Y-AT'IL UN REPEAT EN COURS ???
JNE E31 < OUI , CAR DOG#0.
< REPEAT EN COURS , ON NE VA DONC
< PAS LIRE UN CARACTERE UTILISATEUR
< MAIS FAIRE COMME SI ON AVAIT
< RECU LE CARACTERE STANDARD
< COURANT.
LAD MESGI
BSR ASVC < ENTREE D'UN CARACTERE UTILISATEUR.
E31: EQU $
E34: EQU $
LBY MESG < ACCES AU CARACTERE ENVOYE PAR
< L'UTILISATEUR.
CPI '20
JL E16 < C'EST UN CARACTERE DE CONTROLE
< DE L'EDITEUR , SA VALEUR EST
< L'INDEX D'ACCES A LA TABLE DE
< COMMANDE DE L'EDITEUR.
E18: EQU $
LAI '20 < CAS DES CARACTERES STANDARDS.
E16: EQU $
XR A,X < SAVE COORDONNEE X DU CURSEUR DANS
< LE REGISTRE A.
LB &AFEDIT < B=@ROUTINE SPECIFIQUE(X).
XR A,X < RESTAURE X=COORDONNEE X DU
< CURSEUR.
PSR B < EMPILEMENT DE L'ADRESSE DE LA ROU-
< TINE SPECIFIQUE EN VUE DU RSR.
RSR < EXECUTION DE LA FONCTION.
<
< R E T O U R D E L A B O U C L E :
<
LOOP: EQU $
CPZ DOG < Y-A-T'IL UN REPEAT 'DOG'
< FOIS EN COURS ???
JLE E401 < NON.
<
< CAS D'UN REPEAT 'DOG' FOIS :
<
DC DOG < DECOMPTE DES REPEAT RESTANT
< A FAIRE.
E401: EQU $
JAE E10 < SI A=0 , BOUCLE IMMEDIATE.
LR A,B < SAVE @TABLE DES ARGUMENTS
< A MSP DANS B.
BSR ASVC < SINON , ENVOI DE L'ECHO OU
< DE LA POSITION 'HOME'.
<
< TEST DE FIN DE REPEAT :
<
< L'UTILISATEUR A-T'IL ENVOYE
< UN CTRL-X-OFF ?????
JL E10 < NON , BOUCLE DE L'EDITEUR.
JE E32 < OUI PENDANT L'ECHO.
<
< CAS D'UN CTRL-X-OFF : ON ABORTE LE REPEAT EN COURS :
< (MEME S'IL N'Y EN A PAS .... AUCUNE IMPORTANCE....)
<
LR B,A < RESTAURE A=@TABLE ARGUMENTS A MSP
BSR ASVC < ENVOI DE L'ECHO DU DERNIER
< CARACTERE DANS LE CAS OU LE CTRL-
< X-OFF ETAIT APPARU HORS-ECHANGE.
E32: EQU $
STZ DOG < RAZ DU REPEAT EN COURS.
JMP E10 < BOUCLE DE L'EDITEUR.
PAGE
<
<
< S A U V E G A R D E D ' U N E P A G E
< A L P H A - N U M E R I Q U E E T
< G R A P H I Q U E S U R D I S Q U E :
<
<
< PHILOSOPHIE PROVISOIRE :
< LORSQU'ON VEUT REALISER UNE OPERATION AVEC
< LE DISQUE DE MANIERE SYMBOLIQUE , PAR
< L'2NTERMEDIAIRE DE L'ARBRE DU SYSTEME ,
< ON MET EN TETE DE LA PAGE ALPHA-NUMERIQUE UN
< <NOM> SUIVIT DE <EON> ('EOT') , ET ENSUITE
< ON TAPE LA COMMANDE :
< CTRL-U : LOAD-VALUE(:SYS<NOM>) ,
< CTRL-T : LOAD-VALUE(<ACNESC><NOM>),
< CTRL-W : STORE-VALUE(<ACNESC><NOM>)
< CTRL-X : DELET-VALUE(<ACNESC><NOM>)
< CTRL-D : <EON>.
<
<
SYSPAG: EQU $ < LOAD-VALUE SOUS :SYS : CTRL-U.
LAI 6 < NVP D'ACCES AU NSP 'LOAD-VALUE'
< SOUS :SYS.
JMP E90
TPAGE: EQU $ < LOAD VALEUR : CTRL-T.
LAI 5 < NVP 'LOAD VALUE'.
JMP E90
WPAGE: EQU $ < STORE VALUE : CTRL-W.
LAI 4 < NVP DE 'STORE VALUE'.
JMP E90
DPAGE: EQU $ < DELETE PAGE : CTRL-X.
LAI 3 < NVP DE 'DELETE VALUE'.
<
< REALISATION DE L'OPERATION DEMANDEE :
<
E90: EQU $
STBY SPAGE < MISE EN PLACE DU NVP DE LA
< FONCTION DEMANDEE DANS 'SPAGE'.
LAD SPAGE
BSR ASVC < REALISATION.
JAE E91 < OK , FONCTION REALISEE.
<
< CAS D'ERREUR :
<
BSR ABELL < ENVOI D'UNE BELL D'ERREUR.
JMP E10 < BOUCLE DE L'EDITEUR.
<
< OK , RENVOI HOME DU CURSEUR :
<
E91: EQU $
LAD CHOME
BSR ASVC < ENVOI EN 'HOME' DU CURSEUR
BSR ABELL < AVERTISSEMENT UTILISATEUR
< DE LA FIN DU TRAVAIL DEMANDE.
LXI 0 < REINITIALISATION DES COORDONNEES
LYI 0 < DU CURSEUR ALPHA-NUMERIQUE.
JMP E10 < BOUCLE DE L'EDITEUR.
PAGE
<
<
< E D I T I O N D U C A T A L O G U E
< D E S N U M E R O S D E C O M P T E :
<
<
< FONCTION :
< CTRL-B EST UNE COMMANDE RESERVEE A :SYS ,
< ELLE DONNE ACCES AU CATALOGUE DES ACN
< DANS LA PAGE COURANTE.
<
<
CACN: EQU $
LAI 'A < FONCTION RESERVEE A :SYS.
JMP E99 < VERS LA MAJ DE SCATAL.
<
<
< E D I T I O N D U C A T A L O G U E
< D E S N O M S D E L ' U T I L I S A T E U R :
<
<
< FONCTION :
< CE MODULE APPELE PAR CTRL-C , PERMET
< LA MISE DANS LA PAGE DU CATALOGUE DES NOMS
< DE L'UTILISATEUR . A NOTER QUE CE CATALOGUE
< PEUT ENSUITE ETRE LUI-MEME SAUVEGARDE
< SOUS UN NOM , PUISQU'IL EST DANS UNE
< PAGE ....
<
<
CATAL: EQU $
LAI 2 < FONCTION DESTINEE A HDLSAV.
E99: EQU $
STA SCATAL < MAJ DE SCATAL AVEC LA FONCTION
< DEMANDEE.
BSR ASP1 < RAZ DE LA PAGE.
< ON A ICI :
< X=0 (INDEX NOM) ,
< APAGE=RELAI VERS LE 1ER NOM.
LAI 4 < CARACTERE <EON>.
STBY &APAGE < INITIALISATION DU CATALOGUE PAR
< UN <EON> (MIS A BLANC A LA FIN).
LYI 0 < NUMERO DU NOM COURANT.
<
< BOUCLE DE RECUPERATION DES NOMS :
<
E93: EQU $
LAI 9 < NVP DE NEXT-SERIE.
BSR ASP2 < RECHERCHE DU SUIVANT EN SERIE.
JANE E94 < LE NXS N'EXISTE PAS.
<
< CAS OU IL Y A UN SUIVANT SERIE :
<
ADRI 1,X < ACCES A CE CARACTERE SUIVANT
< EN SERIE.
LBY &APAGE
CPI 4 < EST-CE <EON> ????
JNE E93 < NON.
<
< CAS DE LA RENCONTRE D'UNE FIN DE NOM <EON> :
<
<
< CAS D'UN <EON> OU D'UN NXS N'EXISTANT PAS :
<
E94: EQU $
PSR X < SAVE INDEX CARACTERE.
<
< BOUCLE DE DUPLICATION DU NOM COURANT :
<
E95: EQU $
LBY &APAGE < RECUPERATION DU NOM COURANT
< PAR CARACTERE.
ADRI NBCAR,X < PASSAGE AU NOM SUIVANT . <<<<<<<
STBY &APAGE < COPIE.
ADRI -NBCAR-1,X < RETOUR SUR LE NOM COURANT<<<<<<<
CPZR X
JGE E95 < AU SUIVANT.
<
< FIN DE DUPLICATION DU NOM COURANT :
<
PLR X < RESTAURE L'INDEX CARACTERE.
LAI '20
STBY &APAGE < ON REMPLACE <EON> PAR UN
< BLANC , QUESTION DE MISE EN
< PAGE (<EON> N'APPARAISSANT PAS).
ADRI 1,Y < Y=NUMERO DU NOM SUIVANT.
LR Y,A
CPI NBLIG-1 < VALIDATION NUMERO DE NOM <<<<<<<
JGE E96 < LA PAGE EST SATUREE , ABANDON !!!!
<
< CAS OU IL Y A ENCORE DE LA PLACE DANS LA PAGE D
<
LA APAGE < RELAI VERS LE NOM PRECEDENT.
ADRI NBCAR/2,A < RELAI VERS LE NOUVEAU NOM<<<<<<<
STA APAGE < MAJ RELAI NOM.
<
< RECUPERATION DES SUIVANTS PARALLELES :
<
E98: EQU $
LAI 8 < NVP DE NEXT-PARALLELE.
BSR ASP2 < TENTATIVE DE RECUPERATION NSP.
JANE E97 < LE NXP N'EXISTE PAS.
<
< CAS OU LE NXP EXISTE :
<
ADRI 1,X
LBY &APAGE < RECUPERATION DU CARACTERE NXP.
ADRI -1,X
STBY &APAGE < CE CARACTERE NXP DEVIENT LE
< DERNIER CARACTERE DU NOM.
ADRI 1,X
LAI '20
STBY &APAGE < LE NXP RECUPERE EST MIS A BLANC.
ADRI -1,X < RETOUR SUR LE DERNIER CARACTERE
< DU NOM.
JMP E93 < ALLONS FAIRE UNE TENTATIVE SERIE.
<
< CAS OU IL N'Y A PAS DE NXP :
<
E97: EQU $
LAI '20
STBY &APAGE < RECUL DANS LE MOT COURANT.
ADRI -1,X
CPZR X < LE CATALOGUE ARBORESCENT A-T'
< IL ETE ENTIEREMENT EXPLORE ????
JGE E98 < NON , TENTATIVE PARALLELE.
<
< FIN D'EXPLORATION DU CATALOGUE , OU
< PAGE PLEINE (SATURATION) :
<
E96: EQU $
< ON A ICI :
< A='BLANC'.
STBY &ADPAGE < LE 1ER CARACTERE DE LA PAGE
< EST REMIS A BLANC (IL CONTENAIT
< UN <EON>).
JMP E91 < VERS L'ENVOI HOME DU CURSEUR.
PAGE
<
<
< R A Z D E L A P A G E A L P H A :
<
<
< RESULTATS :
< APAGE=RELAI INDEX VERS LA PAGE ,
< X=0.
<
<
SP1: EQU $
LA ADPAGE < A=@DE LA PAGE.
SBT 0 < GENERATION DU RELAI INDEXE.
STA APAGE < MISE EN PLACE DU RELAI.
LAI '20
SWBR A,A
ORI '20 < A='BLANC-BLANC'.
LX NMPP < RANG DU DERNIER MOT DE LA PAGE.
E92: EQU $
STA &APAGE < MISE A BLANC DE LA PAGE PAR MOTS.
JDX E92 < SUIVANT ....
STA &APAGE < MISE A BLANC DU 1ER MOT.
RSR
<
<
< M A J D E S C A T A L E T E N V O I
< D E L A D E M A N D E A M S P :
<
<
< ARGUMENT :
< A=NVP DEMANDE ,
< X=INDEX LIGNE COURANT.
<
<
< RESULTAT :
< A=CONDITION DE RETOUR DE MSP.
<
<
SP2: EQU $
STBY SCATAL < MISE EN PLACE DU NVP DANS
< LE BLOC DE DEMANDE SCATAL.
LA APAGE < A=@MOT DU NOM COURANT.
SLLS 1
STA SCATAL+1 < MISE EN PLACE DE L'@OCTET
< DU NOM COURANT.
LR X,A
ADRI 1,A < A=LONGUEUR DU NOM COURANT.
STA SCATAL+2 < MISE EN PLACE DU COMPTE OCTETS
< DE SCATAL.
LAD SCATAL < AVEC LUI C'EST QUAND MEME MIEUX !
BSR ASVC < ENVOI DE LA DEMANDE A MSP.
JAE E100 < OK.
CPI 5 < EST-CE LE CODE-ERREUR 'NXP/NXS'
< INEXISTANT ????
JE E100 < C'EST 'NXS/NXP' INEXISTANT ,
< RETOUR OK.
<
< AUTRE CODE-ERREUR : C'EST SUREMENT FONCTION INTERDITE :
< ABORT LA COMMANDE ET ENVOI D'UNE BELL :
<
ADRI -1,K < ON SAUTE LE RSR.
BSR ABELL < ERREUR.
LAI '20 < 'BLANC' A METTRE EN TETE DE PAGE.
JMP E96 < RETOUR EN ABORT.
E100: EQU $
RSR < RETOUR OK.
PAGE
<
<
< T R A N S L A T I O N D ' U N P O I N T :
<
<
< FONCTION :
< CETTE ROUTINE TRANSLATE LES COORDONNEES DU
< POINT COURANT DE VARY,VARX.
<
<
< ARGUMENTS :
< SEGC+0=YM ,
< SEGC+1=XM . (POINT COURANT).
<
<
< RESULTATS :
< A=Y(M+DM) ,
< B=X(M+DM).
<
<
TRANS: EQU $
LA SEGC+1 < XM.
AD VARX
LR A,B < B=X(M+DM).
LA SEGC+0 < YM.
AD VARY < A=Y(M+DM).
RSR
PAGE
<
<
< H O M O T H E T I E D ' U N P O I N T :
<
<
<
< ARGUMENTS :
< SEGC+0=YM (POINT A TRAITER) ,
< SEGC+1=XM ,
< POINTC+1=Y(CENTRE D'HOMOTHETIE) ,
< POINTC+2=X(CENTRE D'HOMOTHETIE).
<
<
< RESULTAT :
< A=Y(M+DM) ,
< B=X(M+DM).
<
<
HOMOT: EQU $
LA SEGC+1 < XM.
SB POINTC+2 < X(CENTRE).
MP KNUMER
BSR ADIV < DIVISION PAR KDENOM.
AD POINTC+2 < X(M+DM)=XC+K*(XM-XC).
STA VAR < SAVE X(M+DM).
LA SEGC+0 < YM.
SB POINTC+1 < Y(CENTRE).
MP KNUMER
BSR ADIV
AD POINTC+1 < A=Y(M+DM)=YC+K*(YM-YC).
LB VAR < B=X(M+DM).
RSR
PAGE
<
<
< R O T A T I O N D ' U N P O I N T :
<
<
< FONCTION :
< CETTE ROUTINE FAIT TOURNER LE
< POINT (SEGC+0,SEGC+1) AUTOUR DU
< CENTRE DU CERCLE COURANT , SUIVANT
< LE RAYON DEFINI PAR UNE COMMANDE
< 'R'/'L' PRECEDENTE ....
< ON MONTRE EN FAISANT SUBIR UNE ROTATION A UN
< VECTEUR DANS LE PLAN COMPLEXE QUE :
< (XC ET YC DESIGNANT LES COORDONNEES DU CENTRE)
< X(M+DM)=XC*DIF/R+YC*SIN/R+XM*COS/R-YM*SIN/R ,
< Y(M+DM)=YC*DIF/R-XC*SIN/R+YM*COS/R+XM*SIN/R.
< AVEC DE PLUS :
< COS(DTETA)=60/61 ,
< SIN(DTETA)=11/61 ,
< (RAPPORTS DE NBRES ENTIERS ...)
<
<
<
< ARGUMENT :
< SEGC+0=YM ,
< SEGC+1=XM.
<
<
< RESULTAT :
< A=Y(M+DM) ,
< B=X(M+DM).
<
<
ROTAT: EQU $
LA SEGC+0 < YM.
MP SIN < YM*SIN.
BSR ADIV < YM*SIN/R.
NGR A,Y < Y=-YM*SIN/R.
LA SEGC+1 < XM.
MP COS < XM*COS.
BSR ADIV < XM*COS/R.
AD XK < XK+XM*COS/R.
ADR Y,A
AD VARX < TRANSLATION EVENTUELLE DE X.
STA VAR < VAR=X(M+DM).
LA SEGC+1 < XM.
MP SIN < XM*SIN.
BSR ADIV < XM*SIN/R.
LR A,Y < Y=XM*SIN/R.
LA SEGC+0 < YM.
MP COS < YM*COS.
BSR ADIV < YM*COS/R.
ADR Y,A
AD YK < A=Y(M+DM).
AD VARY < TRANSLATION EVENTUELLE DE Y.
LB VAR < B=X(M+DM).
RSR
PAGE
<
<
< T E S T D ' O V E R S C R E E N :
<
<
< FONCTION :
< CETTE ROUTINE INDIQUE SI LE POINT
< ARGUMENT EST OU N'EST PAS AFFICHABLE
< SUR L'ECRAN.
<
<
< ARGUMENT :
< A=YM ,
< B=XM.
<
<
< RESULTAT :
< A=-1 , SI OVERSCREEN ,
< A>=0 SI OK.
<
<
TSE: EQU $
JAL E200 < OVERSCREEN.
CP C1024
JGE E200 < OVERSCREEN.
LR B,A < TEST DE XM.
JAL E200 < OVERSCREEN.
CP C1024
JL E201 < OK.
<
< RETOUR EN ERREUR :
<
E200: EQU $
LAI -1 < RENVOI DE A NEGATIF SI OVERSCREEN.
E201: EQU $
RSR
PAGE
<
<
< H O M O T H E T I E D E L A
< T A B L E D E S S E G M E N T S :
<
<
< CENTRE D'HOMOTHETIE : C'EST LE POINT
< (POINTC+1,POINTC+2) OBTENU
< LORS DE LA COMMANDE 'H'.
<
<
FH: EQU $
LA AHOMOT < A=@ROUTINE D'HOMOTETHIE 1 POINT.
STA ASP
JMP E210 < VERS LE TRONC COMMUN DES
< OPERATIONS GEOMETRIQUES.
PAGE
<
<
< T R A N S L A T I O N D E L A
< T A B L E D E S S E G M E N T S :
<
<
FV: EQU $
LA ATRANS < A=@ROUTINE DE TRANSLATION
< D'UN POINT.
JMP E208 < VERS LE TRONC COMMUN DE LA
< ROTATION ET DE LA TRANSLATION.
PAGE
<
<
< R O T A T I O N D E L A T A B L E D E S S E G M E N T S :
<
<
FQ: EQU $
LA AROTAT < A=@ROUTINE DE ROTATION 1 POINT.
JMP E208 < VERS LA TRANSFORMATION.
PAGE
<
<
< O P E R A T I O N S G E O M E T R I Q U E S
< S U R L A T A B L E D E S S E G M E N T S :
< T R A N S L A T I O N ,
< R O T A T I O N ( & T R A N S L A T I O N ) ,
< H O M O T H E T I E ,
< S Y M E T R I E P O N C T U E L L E ,
<
<
< FONCTION :
< ON PEUT FAIRE SUR LA TABLE DES SEGMENTS DES
< TRANSFORMATIONS GEOMETRIQUES :
< 1- TRANSLATION DE VECTEUR 'O'-->'V' ,
< 2- ROTATION DE CENTRE 'O' AVEC TRANSLATION
< DE VECTEUR 'O'-->'Q' ,
< 3- HOMOTHETIE DE CENTRE 'H' , ET DE
< RAPPORT 'I' , 'U' , OU 'P'.
< CE SONT LES COMMANDES 'Q' , 'V' ET 'H' QUI
< FONT LA TRANSFORMATION ; DE PLUS UNE TRANSFORMATION
< PEUT SE FAIRE EN MODE RECOUVREMENT DE L'OBJET
< PAR L'IMAGE ('N') OU EN MODE SUPERPOSITION
< DE L'OBJET DE DE L'IMAGE ('M').
<
<
<
< TRONC COMMUN ROTATION/TRANSLATION DE
< LA TABLE DES SEGMENTS :
<
E208: EQU $
STA ASP < MISE EN PLACE DE L'@ROUTINE
< DE ROTATION/TRANSLATION.
<
< CALCUL DE LA CONSTANTE DE TRANSLATION :
<
LA POINTC+1 < Y DE LA COMMANDE COURANTE.
SB YC < Y DU CENTRE DE ROTATION.
STA VARY < VARY=Y(COMMANDE COURANTE)-YC.
LA POINTC+2 < X DE LA COMMANDE COURANTE.
SB XC < X DU CENTRE DE ROTATION.
STA VARX < VARX=X(COMMANDE COURANTE)-XC.
<
< TRONC COMMUN ROTATION/TRANSLATION/HOMOTHETIE :
<
E210: EQU $ < ENTRY POUR L'HOMOTHETIE.
<
< MARQUAGE DES SEGMENTS OBJETS :
<
LR W,C < C=@TAGR.
LX ALTAGR < X=LONGUEUR TAGR.
E214: EQU $
LA 0,C < ACCES SEGMENT COURANT.
JAL E215 < IL EST LIBRE , RIEN A FAIRE.
SBT 1 < MEMORISONS QUE C'EST UN SEGMENT
< OBJET PAR SON BIT1.
STA 0,C < MAJ DE TAGR.
E215: EQU $
ADRI 4,C
JDX E214 < AU SUIVANT.
LR W,C < C=@TABLE DES SEGMENTS.
LX ALTAGR < X=LONGUEUR TAGR.
<
< BOUCLE DE TRANSFORMATION GEOMETRIQUE DES POINTS :
<
E202: EQU $
LA 0,C
JAL E203 < LE SEGMENT COURANT EST LIBRE ,
< DONC PAS DE TRANSFORMATION.
<
< TEST SUR LA NATURE IMAGE/OBJET DU SEGMENT COURANT :
<
TBT 1 < EST-CE UN OBJET (BIT1=1).
RBT 1 < REGENERATION DE TAGR.
STA 0,C
JNC E203 < C'EST UN SEGMENT IMAGE , IL N'EST
< DONC PAS CONCERNE PAS LA TRANS-
< FORMATION GEOMETRIQUE.
<
< TRANSFORMATION D'UN SEGMENT OBJET :
<
STA SEGC+0 < YM (POINT COURANT).
LA 1,C
STA SEGC+1 < XM (POINT COURANT).
BSR ASP < TRANSFORMATION DE L'ORIGINE DU
< SEGMENT COURANT.
STA SEGV+0 < Y(M+DM)
STB SEGV+1 < X(M+DM).
BSR ATSE < TEST D'OVERSCREEN DU POINT
< COURANT APRES ROTATION.
JAGE E204 < OK.
<
< CAS DE L'OVERSCREEN :
<
E205: EQU $
CPZ MEMO < TEST DU MODE 'M'/'N'.
JGE E203 < MODE 'M' , L'OVERSCREEN EST
< ALORS IGNORE.
STA 0,C < LORSQU'IL Y A OVERSCREEN SUR
< L'UN DES POINTS D'UN SEGMENT ,
< ON DESOCCUPE CE SEGMENT ; A
< NOTER QU'ICI : A=-1.
JMP E203 < VERS LE SEGMENT SUOVANT.
<
< PASSAGE A L'EXTREMITE DU SEGMENT COURANT :
<
E204: EQU $
LA 2,C
STA SEGC+0 < YM (POINT COURANT).
LA 3,C
STA SEGC+1 < XM (POINT COURANT).
BSR ASP < TRANSFORMATION DE L'EXTREMITE DU
< SEGMENT COURANT.
<
< GENERATION DE SEGC :
<
STA SEGC+2 < Y2(M+DM).
STB SEGC+3 < X2(M+DM).
BSR ATSE < TEST D'OVERSCREEN DE L'EXTRE-
< MITE DU SEGMENT COURANT.
JAL E205 < OVERSCREEN.
LA SEGV+0
STA SEGC+0 < Y1(M+DM).
LA SEGV+1
STA SEGC+1 < X1(M+DM).
<
< RANGEMENT DU SEGMENT IMAGE :
< 1- SI MODE 'M' : ON L'INSERE DANS UN SEGMENT LIBRE DE TAGR ,
< 2- SI MODE 'N' : ON L'INSERE A LA PLACE DE L'OBJET DONT
< IL EST L'IMAGE.
<
PSR X,C
LA MEMO < TEST DU MODE 'M'/'N'.
TBT 0
LR C,B < A PRIORI B=@SEGMENT OBJET.
JC E222 < CAS DU MODE 'N' , L'IMAGE VA
< RECOUVRIR L'OBJET.
<
< CAS DU MODE 'M' :
<
LR W,C < C=@TAGR.
LX ALTAGR < X=LONGUEUR TAGR.
LBI 0 < INITIALISATION DE B=0 : PAS
< DE SEGMENTS LIBRES DANS TAGR
< A PRIORI.
<
< PARCOURS DE TAGR , POUR TESTER SI L'IMAGE 'SEGC'
< N'EST PAS DEJA DANS TAGR :
<
E211: EQU $
LA 0,C
JAGE E220 < CE SEGMENT EST OCCUPE.
LR C,B < LORSQU'ON RENCONTRE UN SEGMENT
< LIBRE , ON LE MEMORISE EN VUE
< D'Y METTRE PEUT-ETRE LE SEGMENT
< IMAGE (ULTERIEUREMENT).
JMP E212 < AU SUIVANT.
E220: EQU $
RBT 1 < RAZ DE L'INDICATEUR OBJET/IMAGE.
CP SEGC+0
JNE E212 < IMAGE#SEGMENT.
LA 1,C
CP SEGC+1
JNE E212 < IMAGE#SEGMENT.
LA 2,C
CP SEGC+2
JNE E212 < IMAGE#SEGMENT.
LA 3,C
CP SEGC+3
JE E216 < L'IMAGE EST DEJA DANS TAGR ,
< IL EST DONC INUTILE DE L'Y
< REMETTRE.
E212: EQU $
ADRI 4,C
JDX E211 < AU SUIVANT.
<
< CAS OU L'IMAGE N'EST PAS ENCORE DANS TAGR :
<
CPZR B < A-T'ON TROUVE UN SEGMENT LIBRE D
< DANS LA TABLE TAGR.
JE E217 < TAGR EST PLEINE , ABORT.
<
< INSERTION DE SEGC DANS TAGR , EN RECOUVREMENT
< DE L'OBJET (CAS 'N') , OU DANS UN
< SEGMENT LIBRE (CAS 'M') :
<
E222: EQU $
LAD SEGC < A=@EMETTEUR (IMAGE).
< B=@RECEPTEUR.
LXI 4 < 4 MOTS A DEPLACER.
MOVE < INSERTION DE L'IMAGE DANS TAGR.
E216: EQU $
PLR X,C
<
< PASSAGE AU SEGMENT SUIVANT :
<
E203: EQU $
ADRI 4,C < PROGRESSION DANS TAGR.
JDX E202
JMP E42 < OK , GO BACK TO THE EDITOR LOOP.
<
< SORTIE EN COURS DE TRANSFORMATION :
<
E217: EQU $
LX ALTAGR < X=LONGUEUR DE TAGR.
LR W,C < C=@TAGR.
E219: EQU $
LA 0,C
JAL E221 < LIBRE , RIEN A FAIRE.
RBT 1 < REMISE A PRIORI EN MODE OBJET DE
< TOUS LES SEGMENTS DE TAGR.
STA 0,C
E221: EQU $
ADRI 4,C
JDX E219 < AU SUIVANT.
PLR X,C
BR AE40 < VERS LA 'BELL'.
PAGE
<
<
< R A P P O R T D ' H O M O T H E T I E :
<
<
< FONCTION :
< ON A ICI 3 ENTRY :
< FP : RAPPORT=-1 (HOMOTHETIE=SYMETRIE PONCTUELLE).
< FI : RAPPORT=COS/R (<1) ,
< FU : RAPPORT=R/COS (>1).
<
<
FI: EQU $ < 'I' POUR INF....
LB COS < NUMERATEUR.
LA R < DENOMINATEUR.
JMP E209
FU: EQU $ < 'U' POUR UP... (SUP..).
LB R < NUMERATEUR.
LA COS < DENOMINATEUR.
E209: EQU $
STB KNUMER < NUMERATEUR DU RAPPORT.
STA KDENOM < DENOMINATEUR DU RAPPORT.
SLRS 1
STA RS2 < EN VUE DE L'UTILISATION DE ADIV.
JMP E42 < RETOUR OK A LA LOOP DE L'EDITEUR.
FP: EQU $
LAI -1
STA KNUMER < MULTIPLICATION PAR -1.
LAI 1 < OPERATION NEUTRE.
STA KDENOM
STA RS2
JMP E42 < VERS L'EDITOR LOOP (GRAPH).
PAGE
<
<
< I N V E R S I O N D E L A M E M O R I S A T I O N
< D E S S E G M E N T S :
<
<
< FONCTION :
< 1- EN MODE TRACE DE SEGMENT PAR 'A' & 'B' ,
< 'M' : PERMET LA MEMORISATION DES SEGMENTS TRACES ,
< 'N' : FAIT DES SEGMENTS TRACES , DES TRAITS
< DE CONSTRUCTION.
< 2- EN MODE TRANSFORMATION GEOMETRIQUE ,
< 'N' : L'IMAGE DE LA TRANSFORMATION RECOUVRIRA
< L'OBJET (QUI VA DONC DISPARAITRE) ,
< 'M' : L'IMAGE SE SUPERPOSE A L'OBJET.
<
<
FM: EQU $ < MEMORISATION.
LA MEMO
RBT 0 < BIT0(MEMO)=0.
JMP E80
FN: EQU $ < NON MEMORISATION.
LA MEMO
SBT 0 < BIT0(MEMO)=1.
E80: EQU $
STA MEMO
JMP E42 < RETOUR A LA BOUCLE DE L'EDITEUR.
PAGE
<
<
< C L E A R D E L A T A B L E
< D E S S E G M E N T S :
<
<
< FONCTION : CETTE FONCTION LIBERE TOUS LES
< SEGMENTS DE LA TABLE GRAPHIQUE , ET CECI
< EN METTANT LE BIT0 DE CHAQUE ENTREE DE 4
< MOTS A 1.
<
<
FZ: EQU $
BSR ACTAGR < CLEAR TABLE DES SEGMENTS.
JMP E42 < RETOUR A LA BOUCLE DE L'EDITEUR
< GRAPHIQUE.
<
< C L E A R T A G R :
<
CTAGR: EQU $
LR W,C < C=@TAGR.
LX ALTAGR < NBRE D'ENTREES DE 4 MOTS A
< LIBERER.
LAI -1 < POUR METTRE LE BIT0 A 1.
E41: EQU $
STA 0,C < LIBERATION DE CHAQUE ENTREE.
ADRI 4,C < SEGMENT SUIVANT.
JDX E41
RSR
PAGE
<
<
< E F F A C E M E N T D E L ' E C R A N :
<
<
FX: EQU $
LAD ERASE
BSR ASVC
JMP E42 < RETOUR A LA BOUCLE DE L'EDITEUR.
PAGE
<
<
< D E S I G N A T I O N D U C E N T R E
< D U C E R C L E C O U R A N T :
<
<
FO: EQU $
LA POINTC+1 < Y DU CENTRE DU CERCLE.
STA YC
LA POINTC+2 < X DU CENTRE DU CERCLE.
STA XC
JMP E42 < EASY ???
PAGE
<
<
< D E S I G N A T I O N D U R A Y O N
< D U C E R C L E C O U R A N T :
<
<
< FONCTION :
< CETTE ROUTINE DESIGNE L'EXTREMITE DU
< RAYON DONT LA 1ERE EXTREMITE A ETE
< DESIGNEE PAR UNE COMMANDE 'O' ; DE PLUS ON
< DEFINIT ICI LE SENS DU TRACE DU CERCLE :
< 'L' : SENS TRIGONOMETRIQUE ,
< 'R' : SENS ANTI-TRIGONOMETRIQUE.
<
<
FL: EQU $ < LEFT : SENS TRIGONOMETRIQUE.
LA SIN
JAG E78 < OK , TETA>0.
JAL E79 < IL FAUT RENDRE TETA POSITIF.
ACTD < E R R E U R S Y S T E M E ...
FR: EQU $ < RIGHT : SENS ANTI-TRIGONOMETRIQUE.
LA SIN
JAL E78 < OK , TETA<0.
E79: EQU $
NGR A,A < ON CHANGE LE SIGNE DU TETA PAR
< L'INTERMEDIAIRE DE SON SINUS.
STA SIN
E78: EQU $
LA R
STA KDENOM < AFIN DE DIVISER PAR 'R' DANS ADIV
SLRS 1
STA RS2 < CALCUL DE R/2.
<
< TRAITEMENT DU CENTRE DU CERCLE :
<
LA YC < YC.
MP SIN < YC*SIN.
BSR ADIV < YC*SIN/R.
LR A,Y < Y=YC*SIN/R.
LA XC < XC.
MP DIF < XC*DIF.
BSR ADIV < XC*DIF/R.
ADR Y,A
STA XK < XK=XC*DIF/R+YC*SIN/R.
LA XC < XC.
MP SIN < XC*SIN.
BSR ADIV < XC*SIN/R.
NGR A,Y < Y=-XC*SIN/R.
LA YC < YC.
MP DIF < YC*DIF.
BSR ADIV < YC*DIF/R.
ADR Y,A
STA YK < YK=YC*DIF/R-XC*SIN/R.
JMP E42 < C'EST TOUT ....
<
<
< T R A C E D U C E R C L E C O U R A N T :
<
<
FC: EQU $
STZ VARX < PAS DE TRANSLATION DES X.
STZ VARY < PAS DE TRANSLATION DES Y.
< NOTATION :
< XM=X DU POINT COURANT DE L'ARC DE CERCLE ,
< YM=Y DU POINT COURANT DE L'ARC DE CERCLE ,
LXI 360/10 < NBRE DE POINTS SUR UN CERCLE
< PARCOURU AVEC UN PAS DE 10
< DEGRE (A PEU PRES...).
LA POINTC+1 < YM INITIAL.
LB POINTC+2 < XM INITIAL.
E73: EQU $
STB SEGC+1
STB SEGC+3 < XM.
STA SEGC+0
STA SEGC+2 < YM.
<
< TEST DE SORTIE DE L'ECRAN :
<
BSR ATSE < TEST D'OVERSCREEN DU POINT (A,B).
JAL E75 < OVERSCREEN , ON SAUTE ...
<
< TRACE DU SEGMENT COURANT :
< (REDUIT AU POINT (YM,XM)).
<
LAD OG
BSR ASVC
JGE E42 < FINI SI CTRL-X-OFF ....
LAD WG
BSR ASVC
JGE E42 < FINI SI CTRL-X-OFF ....
<
< PASSAGE AU POINT COURANT SUIVANT DE L'ARC
< DE CERCLE PAR APPROXIMATION :
<
E75: EQU $
BSR AROTAT < ROTATION POINT.
JDX E73 < TRACE DU POINT SUIVANT DE L'ARC
< DE CERCLE.
JMP E42 < C'EST FINI ....
<
<
< R O U T I N E D E D I V I S I O N E N T I E R E :
<
<
DIV: EQU $
DV KDENOM < DIVISION DE (A,B) PAR (KDENOM).
XR A,B < A=RESTE DE LA DIVISION ENTIERE.
CP RS2 < POSITION DU RESTE PAR RAPPORT
< AU DIVISEUR/2.
XR A,B < RESTAURE A=QUOTIENT ENTIER.
JL E77 < RESTE<R/2.
ADRI 1,A < DANS LE CAS RESTE>=R/2 , ON
< INCREMENT D'UNE UNITE LE
< QUOTIENT , POUR NE PAS COMMETTRE
< UNE ERREUR TOUJOURS DE
< MEME SENS.
E77: EQU $
RSR
PAGE
<
<
< E D I T E U R G R A P H I Q U E :
<
<
< FONCTION : CET EDITEUR EST UN SOUS ENSEMBLE
< DE L'EDIITEUR ALPHA-NUMERIQUE QUI L'APPELLE
< PAR L'INTERMEDIAIRE DU CTRL-G . IL A SA
< CHARGE LA GESTION D'UNE TABLE DES SEGMENTS
< CONSTRUITES A L'AIDE DES COMMANDES ENVOYEES
< PAR L'UTILISATEUR A L'AIDE DU CURSEUR
< GRAPHIQUE.
<
<
GRAPH: EQU $
LR Y,A < A=Y(CURSEUR ALPHA-NUMERIQUE).
MP C74
ADR X,B < B=INDEX DU CUSEUR ALPHA-NUMERIQUE
< DANS LA PAGE COURANTE.
SBT 0+16 < POSITIONNEMENT DU MODE INTER-
< ACTIF A PRIORI.
STB GRAFP < ET SAVE L'INDEX DU CURSEUR
< ALPHA-NUMERIQUE.
<
< EMPILEMENT DE GRAFP :
<
LAI LGRAFP+1
SWBR A,A
STA SGRAFP < REINITIALISATION DE SGRAFP.
BSR AGRAFP < CALCUL DE Y=@SGRAFP.
LR B,A < A=GRAFP A EMPILER.
PUSH
LA ADPAGE
SBT 0
STA APAGE < RELAI INDIRECT INDEX VERS
< LA PAGE ALPHA-NUMERIQUE.
LAI 8
STA WG+2 < LE COMPTE D'OCTETS DE WG RECOIT
< 8 OCTETS QUI REPRESENTE LE NBRE
< D'OCTETS CONSTITUANT UN
< SEGMENT GRAPHIQUE.
<
< BOUCLE DE L'EDITEUR GRAPHIQUE :
<
E42: EQU $
< ON A ICI :
< W=@TAGR.
<
< TEST DU MODE GRAPHIQUE PROGRAMME :
<
LA GRAFP
JAL E241 < C'EST LE GRAPHIQUE INTERACTIF.
<
< MODE GRAPHIQUE PROGRAMME :
<
CP N3574 < VALIDATION DE GRAFP.
JGE EE240 < FIN DE LA PAGE ALPHA-NUMERIQUE ,
< ON REVIENT AU MODE INTERACTIF.
LR A,X < OK : X=GRAFP=INDEX DE PAGE.
E267: EQU $ < ENTRY APPEL PROGRAMME GRAPHIQUE
< PAR NOM.
LBY &APAGE
STBY POINTC < SAVE A=COMMANDE GRAPHIQUE
< COURANTE.
IC GRAFP < PROGRESSION DE L'INDEX DE PAGE.
JMP E242 < EXECUTION DE LA COMMANDE
< GRAPHIQUE PROGRAMME.
<
< MODE GRAPHIQUE INTERACTIF :
<
E241: EQU $
LAD OG
BSR ASVC < MISE DE LA VISU EN MODE GRAPHIQUE
< S'IL N'Y ETAIT PAS DEJA.
LAD CU
BSR ASVC < MISE EN FONCTION DU CURSEUR
< GRAPHIQUE.
LAD LG
BSR ASVC < LECTURE DES COORDONNEES DU
< CURSEUR GRAPHIQUE AVEC ATTENTE
< DU BON-VOULOIR DE L'UTILISATEUR.
<
< ANALYSE DES DESIDERATA DE L'UTILISATEUR :
<
LBY POINTC < ACCES AU CARACTERE FRAPPE
< PAR L'UTILISATEUR POUR
< DEBLOQUER SA VISU.
E242: EQU $ < ENTRY GRAPHIQUE PROGRAMME.
AD CTRL < TRANSFORMATION EVENTUELLE DE
< LA COMMANDE EN UN CTRL-XXX.
STZ CTRL < RAZ A PRIORI DE CTRL APRES CHAQUE
< COMMANDE GRAPHIQUE.
CPI '20 < EST-CE 'SPACE' , SOIT LE
< NOP DU LANGAGE GRAPHIQUE . ????
JE E42 < OUI : RETOUR IMMEDIAT A LA
< BOUCLE DE L'EDITEUR GRAPHIQUE.
JG E263 < CE N'EST PAS UN CTRL-XXX.
<
< CAS DES CTRL-XXX : IL S'AGIT DE L'APPEL
< D'UN PROGRAMME GRAPHIQUE PAR NOM :
<
ADRI '40,A < A='NOM' DU PROGRAMME GRAPHIQUE
LR A,B < B=NOM DU PROGRAMME CHERCHE.
LX N3574 < NBRE DE CARACTERES D'UNE PAGE.
ADRI -1,X < X=INDEX DU DERNIER CARACTERE
< DE LA PAGE ALPHA-NUMERIQUE.
< (QUE L'ON SAUTE POUR LA
< RECHERCHE DE 'FIS').
E264: EQU $
ADRI -1,X
LBY &APAGE < ACCES A UN CARACTERE DE LA PAGE.
CP FIS < EST-CE LE 'FIS' ???
JNE E265 < NON , CE N'EST DONC PAS UNE
< DECLARATION DE NOM DE
< PROGRAMME GRAPHIQUE.
<
< CAS DE LA DECLARATION DU NOM D'UN
< PROGRAMME GRAPHIQUE :
<
ADRI 1,X
LBY &APAGE < ACCES AU CARACTERE SUIVANT DU
< CARACTERE DE DECLARATION.
CPR A,B < EST-CE LE NOM CHERCHE ????
JE E266 < OUI , C'EST OK.
ADRI -1,X < RETOUR SUR LE 'FIS'.
E265: EQU $
CPZR X
JG E264 < AU PRECEDENT .....
JMP E40 < ERREUR : LE NOM DEMANDE
< N'EXISTE PAS.
<
< CAS OU LE PROGRAMME DEMANDE EXISTE :
<
E266: EQU $
<
< SAUVEGARDE DU 'GRAFP' DE RETOUR :
<
BSR AGRAFP
LA GRAFP
PUSH
JNC E310 < OK , PILE NON SATUREE.
DC SGRAFP < DANS LE CAS OU LA PILE EST
< SATUREE , ON ECRASE LE SOMMET.
E310: EQU $
ADRI 1,X < X=INDEX DU 1ER CARACTERE DU
< PROGRAMME GRAPHIQUE DEMANDE.
STX GRAFP < MAJ ET MISE EN MODE PROGRAMME.
JMP E267 < EXECUTION DU PROGRAMME.
<
< TEST DES COMMANDES GRAPHIQUES :
<
E263: EQU $
ADRI -'21,A < DECODAGE DU CARACTERE.
JAL E40 < ERREUR , CARACTERE NON RECONNU.
CPI NCOG
JGE E40 < ERREUR : CARACTERE NON RECONNU.
<
< EXECUTION DE LA COMMANDE :
<
LR A,X < X=FONCTION DEMANDEE.
BR &COG < BRANCHEMENT VERS LE MODULE
< DE TRAITEMENT SPECIFIQUE.
<
<
< R E T O U R A L ' E D I T E U R
< A L P H A - N U M E R I Q U E :
<
<
FF: EQU $
LAD CG < CLOSE-GRAPHIQUE : CE 'CG' EST
< EN FAIT RESERVE AU 'F' DANS LE
< MODE PROGRAMME , POUR PERMETTRE
< UN RETOUR EN ALPHA-NUMERIQUE
< QUI N'A PAS EU LIEU PUISQU'
< ON NE LIT ALORS PAS LE CURSEUR
< GRAPHIQUE ...
BSR ASVC
LAI 4
STA WG+2 < EN VUE DE L'ENVOI DES
< COORDONNEES DU CURSEUR
< ALPHA-NUMERIQUE POUR LES
< POSITIONNEMENTS HAUTS ...
LXI 0
LYI 0 < ENVOI HOME DU CURSEUR.
LAD CHOME < ENVOI HOME DU CURSEUR.
BR ALOOP < RETOUR A LA BOUCLE DE L'EDITEUR
< ALPHA-NUMERIQUE AVEC L'ENVOI
< HOME DU CURSEUR.
<
< E R R E U R G R A P H I Q U E :
<
E40: EQU $
BSR ABELL < A NOTER QU'ON EST ICI EN
< ALPHA-NUMERIQUE APRE LA LECTURE
< GRAPHIQUE.
CPI '13
JL E42
<
< CAS OU UN CTRL-X-OFF A ETE ENVOYE
< PENDANT LA CLOCHE :
<
EE240: EQU $
<
< DEPILEMENT DE GRAFP :
<
BSR AGRAFP < CALCUL DE Y=@SGRAFP.
PULL < DEPILE A=GRAFP.
JNC E311 < OK , PILE NON VIDE.
IC SGRAFP < DANS LE CAS OU LA PILE EST
< VIDE ON RETOURNE SUR SON 1ER
< ELEMENT.
E311: EQU $
STA GRAFP < RETOUR AU MODE INTERACTIF.
JMP E42
PAGE
<
<
< D E S I G N A T I O N D U 1 E R
< P O I N T D U S E G M E N T C O U R A N T :
<
<
FA: EQU $
LA POINTC+1
STA SEGC < COORDONNEE Y DU 1ER POINT DU
< SEGMENT COURANT.
LA POINTC+2
STA SEGC+1 < COORDONNEE X DU 1ER POINT DU
< SEGMENT COURANT.
JMP E42 < RETOUR A LA BOUCLE DE L'EDITEUR
< GRAPHIQUE.
PAGE
<
<
< D E S I G N A T I O N D U 2 E M E P O I N T
< D U S E G M E N T C O U R A N T :
<
<
< FONCTION :
< 2 ENTRIES :
< 1- MODE 'B' : ON JOINT AU POINT 'A' PRECEDENT ,
< ET LE POINT 'B' COURANT DEVIENT
< LE POINT 'A' SUIVANT (CHAINAGE
< AUTOMATIQUE DES SEGMENTS).
< 2- MODE 'K' : ON JOINT LE POINT 'K' AU POINT
< 'A' PRECEDENT ET C'EST TOUT : 'A'
< RESTE 'A' (MODE ETOILE).
<
<
FK: EQU $
LAI 1
JMP E230
FB: EQU $
LAI 0
E230: EQU $
STA VAR < VAR=1 : MODE ETOILE ,
< VAR=0 : MODE CHAINAGE AUTOMATI-
< QUE (B).
BSR AMPC < EN VUE DE L'AFFICAHGE.
< ON A ICI :
< B=X DU 2EME POINT DU SEGMENT COURANT ,
< Y=Y DU 2EME POINT DU SEGMENT COURANT.
E67: EQU $ < ENTREE RESERVEE A FH.
LA MEMO < FAUT-IL MEMORISER OU PAS LE
< SEGMENT ?????
TBT 0
JC E66 < NON , ALLONS UNIQUEMENT
< L'AFFICHER.
LR W,C < C=@TAGR.
LX ALTAGR
<
< RECHERCHE D'UNE ENTREE LIBRE DANS TAGR
< POUR Y METTRE LE SEGMENT COURANT :
<
E46: EQU $
LA 0,C
JAL E47 < OK , ENTREE LIBRE (BIT0=1).
ADRI 4,C < ACCES A L'ENTREE SUIVANTE.
JDX E46
<
< CAS OU TAGR EST PLEINE :
<
JMP E40 < ERREUR : ENVOI D'UNE 'BELL'.
<
< CAS OU ON A TROUVE UNE ENTREE
< LIBRE DANS TAGR :
<
E47: EQU $
LAD SEGC < SOURCE ,
XR B,C < DESTINATION & SAVE B.
LXI 4 < 4 MOTS A DEPLACER.
MOVE
XR B,C < RESTAURE B.
<
< AFFICHAGE DU SEGMENT COURANT SUR L'ECRAN :
<
E66: EQU $ < ENTREE DESTINEE A 'FH'.
LAD OG
BSR ASVC < REMISE DE LA VISU EN GRAPHIQUE.
JGE EE240 < UN CTRL-X-OFF A ETE RECU.
LAD WG
BSR ASVC < AFFICHAGE DU SEGMENT COURANT.
JGE EE240 < UN CTRL-X-OFF A ETE RECU.
<
< CHOIX ENTRE LE MODE CHAINAGE AUTOMATIQUE
< ET LE MODE ETOILE :
<
CPZ VAR
JNE E42 < LE MODE ETOILE EST DEMANDE , ON
< RETOURNE A LA BOUCLE DE
< L'EDITEUR GRAPHIQUE.
<
< LE 2EME POINT DU SEGMENT COURANT
< DEVIENT LE 1ER POINT DU PROCHAIN
< SEGMENT COURANT :
<
E51: EQU $
STY SEGC
STB SEGC+1
STZ SEGC+2 < A PRIORI.
STZ SEGC+3 < A PRIORI.
JMP E42 < RETOUR A LA BOUCLE DE L'EDITEUR
< GRAPHIQUE.
PAGE
<
<
< T R A N S F E R T D E P O I N T C V E R S S E G C :
<
<
< RESULTATS :
< Y=Y DU 2EME POINT DU SEGMENT COURANT ,
< B=X DU 2EME POINT DU SEGMENT COURANT ,
<
<
MPC: EQU $
LY POINTC+1
LB POINTC+2
STY SEGC+2 < EN VUE DE L'AFFICHAGE.
STB SEGC+3
RSR
PAGE
<
<
< E F F A C E M E N T D U S E G M E N T D E S I G N E :
<
<
FE: EQU $
BSR ASEEKS < RECHERCHE DU SEGMENT DESIGNE ,
< DANS TAGR.
CPZR X < A-T'IL ETE TROUVE ????
JE E40 < NON , ERREUR ....
<
< CAS OU ON A TROUVE A PEU PRES LE SEGMENT :
<
LAI -1
STA 0,C < LIBERATION DE SON ENTREE , ON
< L'EFFACE DONC DANS TAGR.
JMP E42 < OK.
PAGE
<
<
< A F F I C H A G E D E L A T A B L E
< D E S S E G M E N T S :
<
<
FW: EQU $ < ENTRY POUR DESSIN COURBE !?!?!
LAD OG
BSR ASVC < MISE EN GRAPHIQUE DE LA VISU ,
< POUR AUTORISER 'CU'.
LAD CU
BSR ASVC < MISE EN FONCTION DU CURSEUR
< GRAPHIQUE , ET ON VA VOIR LE
< SURPRENANT RESULTAT ....
FD: EQU $ < ENTRY NORMALE.......
LR W,C < C=@TAGR.
LX ALTAGR < NBRE D'ENTREES DE TAGR.
<
< BOUCLE D'AFFICHAGE :
<
E50: EQU $
LA 0,C
JAL E48 < CETTE ENTREE EST LIBRE , ELLE
< N'EST DONC PAS A AFFICHER.
<
< AFFICHAGE D'UN SEGMENT :
<
LR C,A < A=@MOT DES COORDONNESS DU
< SEGMENT TROUVE.
SLLS 1 < CONVERSION EN UNE ADRESSE OCTET.
STA WG+1 < MISE A JOUR DE LA DEAMNDE A MSP.
LAD OG
BSR ASVC < MISE EN GRAPHIQUE DE LA VISU.
JGE E49 < UN CTRL-X-OFF A ETE RECU.
LAD WG
BSR ASVC < AFFICHAGE DU SEGMENT TROUVE.
< UN CTRL-X-OFF A-T'IL ETE
< ENVOYE PAR L'UTILISATEUR ????
JGE E49 < OUI , ABANDON DE LHAFFICHAGE.
E48: EQU $
ADRI 4,C < ACCES A L'ENTREE SUIVANTE DE TAGR
JDX E50
<
< RESTAURATION DE WG :
<
E49: EQU $
LAD COORD < COORD OU SEGC ....
SLLS 1
STA WG+1
CPZR X
JNE EE240 < SI X#0 , C'EST QU'UN CTRL-X-OFF
< A ETE EMIS PENDANT L'EDITION.
BR AE42 < VERS LA BOUCLE DE L'EDITEUR.
PAGE
<
<
< E D I T I O N D ' U N E G R I L L E
< F A C I L I T A N T L E D E S S I N :
<
<
FG: EQU $
< NOTA :
< ON EST EN ALPHA-NUMERIQUE ICI.
LAD CHOME
BSR ASVC < ENVOI HOME DU CURSEUR ALPHA.
LXI 37*5 < NBRE DE BLOCS DE 14 CARACTERES
< CONTENUS DANS UN ECRAN.
< ON A : (37*5)*14=35*74.
LB MESG < SAVE LE CARACTERE COURANT DANS B.
LAI '8E < CODE D'EXPANSION DE 14 ('E)
< CARACTERES.
SWBR A,A
ORI '2E < AINSI , ON VA DUPLIQUER 14
< CARACTERES 'POINT' ('2E).
STA MESG
IC MESGO+2 < ON ENVOI 2 OCTETS AUX VISUS (???).
E56: EQU $
LAD MESGO
BSR ASVC < ENVOI D'UN POINT SUR LA VISU.
< L'UTILISATEUR A-T'IL ENVOYE
< UN CTRL-X-OFF ????
JGE E55 < OUI , ON ABORTE LA GRILLE.
JDX E56 < OK , POINT SUIVANT.
E55: EQU $
STB MESG < RESTAURE LE CARACTERE COURANT.
DC MESGO+2 < RESTAURATION DU COMPTE OCTETS
< DE MESGO.
EE42: BR AE42 < VERS LA BOUCLE DE L'EDITEUR.
PAGE
<
<
< T R A N S L A T I O N D ' U N S E G M E N T :
<
<
< FONCTION :
< CETTE ROUTINE TANSLATE LE SEGMENT
< COURANT JUSQU'AU POINT DESIGNE
< PAR LA COMMANDE 'T' , SI EVIDEMMENT CELA
< EST POSSIBLE.
<
<
FT: EQU $
LA POINTC+1 < YI (Y DU POINT DESIGNE PAR 'J').
SB SEGC+0 < YI-Y1.
AD SEGC+2 < TRANSLATION DES Y : Y2+(YI-Y1).
JAL E40 < ERREUR.
CP C1024
JGE E40 < ERREUR , OVERFLOW ...
< (OU OVERSCREEN ?????)
LR A,Y < Y=NOUVEL Y2.
LA POINTC+2 < XI.
SB SEGC+1 < XI-X1.
AD SEGC+3 < TRANSLATION DES X : X2+(XI-X1).
JAL E40 < ERREUR.
CP C1024
JGE E40 < ERREUR : OVERSCREEN ...
LR A,B < B=NOUVEL X2.
<
< TRANSLATION DE SEGC :
<
STY SEGC+2 < Y2.
STB SEGC+3 < X2.
LA POINTC+1
STA SEGC+0 < Y1.
LA POINTC+2
STA SEGC+1 < X1.
JMP E67 < TRAITONS LE NOUVEAU SEGC COMME
< AVEC LA COMMANDE FB.
PAGE
<
<
< C H A N G E M E N T D E S E G M E N T C O U R A N T :
<
<
< FONCTION :
< CETTE ROUTINE MET DANS SEGC , LE SEGMENT DESIGNE
< PAR LA COMMANDE 'S'.
<
<
FS: EQU $
BSR ASEEKS < RECHERCHE DU SEGMENT DESIGNE
< DANS TAGR.
CPZR X < LE SEGMENT DESIGNE EXISTE-T'IL ??
JE E40 < NON , ERREUR ....
<
< CAS OU LE SEGMENT DESIGNE EXISTE :
<
LAD SEGC
LR A,B < B=@ZONE RECEPTRICE ,
LR C,A < A=@ZONE EMETTRICE (BLOC DE 4
< MOTS CONTENANT LE SEGMENT
< DESIGNE DANS TAGR.
LXI 4 < 4 MOTS A DEPLACER.
MOVE < TRANSFERT DE TAGR VERS SEGC.
BR AE42 < VERS LA BOUCLE DE L'EDITEUR.
PAGE
<
<
< M O D E G R A P H I Q U E P R O G R A M M E :
<
<
<
< FIN DE MODE PROGRAMME , OU RETOUR D'UN
< SOUS-PROGRAMME GRAPHIQUE :
<
FY: EQU $
CPZ GRAFP < VALIDATION DE LA COMMANDE.
JL E420 < ERREUR : PAS DE MODE PROGRAMME
< EN COURS.
E240: EQU $ < ENTRY : CTRL-X-OFF PENDANT
< LA BELL , OU LA FIN DE LA PAGE
< ALPHA-NUMERIQUE A ETE ATTEINTE.
<
< DEPILEMENT DE GRAFP :
<
BSR AGRAFP < CALCUL DE Y=@SGRAFP.
PULL < A=GRAFP.
JNC E312 < OK , PILE NON VIDE.
IC SGRAFP < RETOUR SUR LA TETE SI VIDE.
E312: EQU $
STA GRAFP < GRAFP<0.
BR AE42 < VERS LA BOUCLE DE L'EDITEUR.
<
< MISE EN MODE PROGRAMME :
<
FJ: EQU $
LA GRAFP < VALIDATION DE LA COMMANDE.
JAL E313 < OK.
E420: EQU $ < ENTRY PAS DE MODE PROGRAMME.
BR AE40 < ERREUR : MODE PROGRAMME
< DEJA EN COURS.
E313: EQU $
RBT 0 < MISE EN MODE PROGRAMME.
E262: EQU $
STA GRAFP < GRAFP=INDEX DU CURSEUR ALPHA-
< NUMERIQUE DANS LA PAGE : DONNE
< L'INDEX DE LA 1ERE COMMANDE
< GRAPHIQUE.
BR AE42 < VERS LA BOUCLE DE L'EDITEUR.
PAGE
<
<
< M I S E D E L A C O M M A N D E
< S U I V A N T E E N M O D E ' C T R L ' :
<
<
FCTRL: EQU $
LAI -'40
STA CTRL < CTRL=CONSTANTE DE CONVERSION D'UN
< CARACTERE EN SON 'CTRL' ASSOCIE.
BR AE42 < RETOUR A LA BOUCLE DE L'EDITEUR.
PAGE
<
<
< M I S E E N M O D E ' > ' O U ' < ' :
<
<
< FONCTION :
< LES CARACTERES '>' OU '<' PERMETTENT
< EN GRAPHIQUE DE DISTINGUER 2
< JEUX DE PROGRAMMES GRAPHIQUES DE
< MEME NOM MAIS DE CARACTERES DE
< DECLARATION ('>' OU '<') DIFFERENTS.
<
<
FINF: EQU $
FSUP: EQU $
LBY POINTC < RECUPERATION DU CARACTERE DE
< COMMANDE ('>' OU '<').
STA FIS < CHANGEMENT DU MODE 'FIS'.
BR AE42 < VERS LA BOUCLE DE L'EDITEUR.
PAGE
<
<
< D E S I G N A T I O N D ' U N P R O G R A M M E
< G R P H I Q U E :
<
<
< FONCTION :
< LA COMMANDE ':' PERMET EN MODE
< GRAPHIQUE DE DESIGNER UN PROGRAMME
< GRAPHIQUE DANS LA PAGE ALPHA-
< NUMERIQUE , ET D'EN FAIRE LE 'GRAFP'
< COURANT ...
<
<
F2P: EQU $
LAI 22 < UN CARACTERE OCCUPE 22 POINTS.
STA VAR
LAI 0
LB POINTC+1 < B=YG=Y(CURSEUR GRAPHIQUE).
DV VAR < A=ENT(YG/22).
ADRI -NBLIG,A
MP C74 < B=-74*(NBLIG-ENT(YG/22)).
LR B,Y < Y=-74*(NBLIG-ENT(YG/22)).
LAI 14 < UN CARACTERE OCCUPE 14 POINTS
< DE LARGEUR.
STA VAR
LAI 0
LB POINTC+2 < B=XG=X(CURSEUR GRAPHIQUE).
DV VAR < A=ENT(XG/14).
SBR Y,A < A=74*(NBLIG-ENT(YG/22))+
< ENT(XG/14)=INDEX DU PROGRAMME
< GRAPHIQUE DANS LA PAGE ALPHA-
< NUMERIQUE COURANTE.
CPZ GRAFP < TEST DU MODE PROGRAMME OUI/NON ?
JGE E262 < MODE PROGRAMME : ON Y RESTE.
SBT 0 < MODE INTERACTIF : ON Y RESTE.
JMP E262
PAGE
<
<
< M O D I F I C A T I O N S D E S C O O R D O N N E E E S
< D U P O I N T C O U R A N T ( P O I N T C ) :
<
<
< FONCTION :
< CES FONCTIONS PERMETTENT EN MODE
< PROGRAMME DE SIMULER DES DEPLACEMENTS
< DU CURSEUR GRAPHIQUE (POINTC).
<
<
F1: EQU $ < X<--(X)+SCALE.
CPZ SCAL13
JNE F30 < INVERSION '1' ET '3'.
F10: EQU $ < INVERSION '1' ET '3'.
LAD POINTC+2 < A=@X(POINTC).
JMP E250
F2: EQU $ < Y<--(Y)+SCALE.
CPZ SCAL24
JNE F40 < INVERSION '2' ET '4'.
F20: EQU $ < INVERSION '2' ET '4'.
LAD POINTC+1 < A=@Y(POINTC).
E250: EQU $
LB SCALE < B=INCREMENT.
JMP E251
F3: EQU $ < X<--(X)-SCALE.
CPZ SCAL13
JNE F10 < INVERSION '1' ET '3'.
F30: EQU $ < INVERSION '1' ET '3'.
LAD POINTC+2 < A=@X(POINTC).
JMP E252
F4: EQU $ < Y<--(Y)-SCALE.
CPZ SCAL24
JNE F20 < INVERSION '2' ET '4'.
F40: EQU $ < INVERSION '2' ET '4'.
LAD POINTC+1 < A=@Y(POINTC).
E252: EQU $
LB SCALE
NGR B,B < B=DECREMENT.
E251: EQU $
CPZ SCALXY
JE E330 < MODE NORMAL DE X ET DE Y.
IBT 15 < INVERSION DE X ET DE Y ;
< (PAR PERMUTATION DE 'POINTC+1' ,
< ET DE 'POINTC+2') ;
< A T T E N T I O N : 'POINTC' DOIT
< ETRE A UNE ADRESSE IMPAIRE ,
< AFIN QUE 'POINTC+1' SOIT A
< UNE ADRESSE PAIRE.
E330: EQU $
LR A,C < C=@X/Y(POINTC).
E303: EQU $ < ENTRY F5 & F6.
LA 0,C < A=X/Y(POINTC).
ADR B,A < INCREMENTATION/DECREMENTATION.
JAGE E253
AD C1024 < DANS LE CAS OU X/Y(POINTC) EST
< NEGATIF , ON LUI DONNE COMME
< VALEUR , SA VALEUR MODULO 1024.
E253: EQU $
CP C1024
JL E254
SB C1024 < DANS LE CAS OU X/Y EST SUPERIEUR
< A 1024 ON LE RECALCULE MODULO
< 1024.
E254: EQU $
STA 0,C < MAJ DE X/Y(POINTC).
BR AE42 < VERS LA BOUCLE DE L'EDITEUR.
<
<
< D E P L A C E M E N T S P E R S P E C T I V E :
<
<
F5: EQU $ < DEPLACEMENT VERS L'ARRIERE.
CPZ SCAL56
JNE F60 < INVERSION '5' ET '6'.
F50: EQU $ < INVERSION '5' ET '6'.
LA SCALE
SARS 2 < DIVISION DE SCALE PAR 4 POUR
< DONNER L'IMPRESSION D'ELOI-
< GNEMENT EN PERSPECTIVE ....
JMP E300
F6: EQU $ < DEPLACEMENT VERS L'AVANT.
CPZ SCAL56
JNE F50 < INVERSION '5' ET '6'.
F60: EQU $ < INVERSION '5' ET '6'.
LA SCALE
SARS 2 < DIVISION DE SCALE PAR 4.
NGR A,A < INVERSION DE SCALE LORS DES
< DEPLACEMENTS VERS L'AVANT.
E300: EQU $
LR A,B < B=INCREMENT/DECREMENT DE X/Y.
LAD POINTC+1
LR A,C < C=@Y(POINTC).
LA 1,C < A=X(POINTC).
ADR B,A
ADR B,A
ADR B,A
JAGE E301
AD C1024 < DANS LE CAS OU X(POINTC) EST
< NEGATIF ,ON LUI DONNE COMME
< VALEUR , SA VALEUR MODULO 1024.
E301: EQU $
CP C1024
JL E302
SB C1024 < DANS LE CAS OU X EST SUPERIEUR A
< 1024 , ON LE RECALCULE
< MODULO 1024.
E302: EQU $
STA 1,C < MAJ DE X(POINTC) :
< X<--(X)+-3*SCALE/4.
JMP E303 < VERS LE TRAITEMENT DE Y(POINTC).
< Y<--(Y)+-SCALE/4.
<
<
< P O S I T I O N N E M E N T E N B A S
< A G A U C H E D E L ' E C R A N :
<
<
F0: EQU $
STZ POINTC+1 < Y<--0.
STZ POINTC+2 < X<--0.
BR AE42 < VERS LA BOUCLE DE L'EDITEUR.
PAGE
<
<
< I N V E R S I O N S
< ' 1 ' - ' 3 '
< ' 2 ' - ' 4 '
< ' 5 ' - ' 6 ' :
<
<
F13: EQU $
STZ SCAL13 < MODE NORMAL DE '1' ET '3'.
BR AE42 < VERS LA BOUCLE DE L'EDITEUR.
F24: EQU $
STZ SCAL24 < MODE NORMAL DE '2' ET '4'.
BR AE42 < VERS LA BOUCLE DE L'EDITEUR.
F56: EQU $
STZ SCAL56 < MODE NORMAL DE '5' ET '6'.
BR AE42 < VERS LA BOUCLE DE L'EDITEUR.
F31: EQU $
IC SCAL13 < INVERSION DE '1' ET '3'.
BR AE42 < VERS LA BOUCLE DE L'EDITEUR.
F42: EQU $
IC SCAL24 < INVERSION DE '2' ET '4'.
BR AE42 < VERS LA BOUCLE DE L'EDITEUR.
F65: EQU $
IC SCAL56 < INVERSION DE '5' ET '6'.
BR AE42 < VERS LA BOUCLE DE L'EDITEUR.
<
<
< I N V E R S I O N D E X E T D E Y :
<
<
FXY: EQU $
STZ SCALXY < MODE NORMAL DE X ET DE Y.
BR AE42 < VERS LA BOUCLE DE L'EDITEUR.
FYX: EQU $
IC SCALXY < INVERSION DE X ET DE Y.
BR AE42 < VERS LA BOUCLE DE L'EDITEUR.
<
<
< R E T O U R A U X M O D E S N O R M A U X :
<
<
FSTAR: EQU $
STZ SCAL13 < MODE NORMAL DE '1'-'3'.
STZ SCAL24 < MODE NORMAL DE '2'-'4'.
STZ SCAL56 < MODE NORMAL DE '5'-'6'.
JMP FXY < MODE NORMAL DE 'X'-'Y'.
PAGE
<
<
< F A C T E U R D ' E C H E L L E :
<
<
F7: EQU $
LAI 4
JMP E260
F8: EQU $
LAI 8
JMP E260
F9: EQU $
LAI 16
E260: EQU $
STA SCALE < SAVE LE NOUVEAU FACTEUR
< D'ECHELLE.
BR AE42 < VERS LA BOUCLE DE L'EDITEUR.
FPLUS: EQU $
LAI 1 < POUR FAIRE +1 SUR SCALE.
JMP E270
FMOINS: EQU $
LAI -1 < POUR FAIRE -1 SUR SCALE.
E270: EQU $
AD SCALE
JALE E271 < SCALE=<0 , FAISONS SCALE<--128...
CP C1024
JL E260 < OK , (A) EST SCALE.
E271: EQU $
ANDI 'FF < SUPPRESSION DES NBRES NEGATIFS.
EORI '80 < SI A=0 : A<--128 ,
< SI A>128 : A<--1.
JMP E260 < OK , (A) EST SCALE.
FOUVR: EQU $
LAI 6 < POUR FAIRE +6 SUR SCALE.
JMP E270
FFERM: EQU $
LAI -6 < POUR FAIRE -6 SUR SCALE.
JMP E270
PAGE
<
<
< C A L C U L D E @ S G R A F P :
<
<
< RESULTAT :
< Y=@SGRAFP.
< (DETRUIT A).
<
<
PGRAFP: EQU $
LAD SGRAFP
LR A,Y < Y=@SGRAFP.
RSR
PAGE
<
<
< R E C H E R C H E D ' U N S E G M E N T D A N S T A G R
<
<
< RESULTAT :
< X=0 : SEGMENT NON TROUVE ,
< X#0 : SEGMENT TROUVE A L'ADRESSE (C) DANS TAGR.
<
<
SEEKS: EQU $
LX ALTAGR < NBRE D'ENTREES DE TAGR.
LR W,C < C=@TAGR.
E52: EQU $
< NOTATION :
< L'ORIGINE DU SEGMENT CONTENU DANS CETTE
< ENTREE DE TAGR EST (Y1,X1) , SON
< EXTREMITE EST (Y2,X2).
LA 0,C < Y1.
JAL E54 < CETTE ENTREE EST LIBRE , ON
< LA SAUTE.
SB 2,C < Y1-Y2.
STA VAR
LA POINTC+2 < X(POINTC).
SB 1,C < X(POINTC)-X1.
MP VAR < (Y1-Y2)(X(POINTC)-X1).
SLRD 'A < ON ACCEPTE AINSI LES IMPRECISIONS
< DE LA VISEE AVEC LE CURSEUR
< GRAPHIQUE.
LR B,Y < SAVE (Y1-Y2)(X(POINTC)-X1) DANS Y
LA POINTC+1 < Y(POINTC).
SB 0,C < Y(POINTC)-Y1.
STA VAR
LA 1,C < X1.
SB 3,C < X1-X2.
MP VAR < (Y(POINTC)-Y1)(X1-X2).
SLRD 'A
CPR B,Y < LE POINT COURANT APPARTIENT-IL
< A PEU PRES AU SEGMENT CONTENU
< DANS L'ENTREE COURANTE DE TAGR????
JNE E54 < NON , AU SUIVANT.
<
< CAS OU ON A TROUVE LA DROITE A LA QUELLE
< APPARTIENT LE POINT DESIGNE PAR LA
< COMMANDE 'E' , IL FAUT MAINTENANT VERIFIER
< SI C'EST LE BON SEGMENT :
<
LA POINTC+1 < Y(POINTC).
SB 2,C < Y(POINTC)-Y2.
MP VAR < (Y(POINTC)-Y2)(Y(POINTC)-Y1).
JAG E54 < LE PRODUIT ETANT POSITIF , LE
< POINT N'APPARTIENT PAS AU
< SEGMENT (C).
JAL E53 < OK , PRODUIT NEGATIF ,
< CELA SIGNIFIE QUE LE POINT
< DESIGNE PAR 'E' APPARTIENT BIEN
< AU SEGMENT (Y1,Y2).
CPZR B
JNE E54
<
< CAS OU LE PRODUIT EST NUL : LE SEGMENT
< EST HORIZONTAL , OU LE POINT EST A UNE
< EXTREMITE :
<
LA POINTC+2 < X(POINTC).
SB 3,C < X(POINTC)-X2.
STA VAR
LA POINTC+2 < X(POINTC).
SB 1,C < X(POINTC)-X1.
MP VAR < (X(POINTC)-X1)(X(POINTC)-X2).
JAG E54 < PRODUIT POSITIF.
JAL E53 < OK , LE PRODUIT ETANT NEGATIF ,
< LE POINT DESIGNE
< APPARTIENT AU SEGMENT (C).
CPZR B
JE E53 < OK , LE PRODUIT EST NUL.
E54: EQU $
ADRI 4,C < ENTREE SUIVANTE DE TAGR.
JDX E52 < SEGMENT SUIVANT ....
E53: EQU $
RSR
PAGE
<
<
< P A G E A L P H A - N U M E R I Q U E E T
< T A B L E D E S S E G M E N T S :
<
<
PAGE: EQU $ < PAGE ALPHA-NUMERIQUE.
X1: VAL NBCAR*NBLIG/2
X1: VAL 80-NBCAR/2+X1 < A CAUSE DE CARTE , QUI LIT
< 80 CARACTERES , MEME SUR LA
< DERNIERE LIGNE DE LA PAGE !!!?!?
TAGR: EQU PAGE+X1
X50: VAL 4*LTAGR < LONGUEUR MOT DE TAGR.
TOP: EQU TAGR+X50 < SOMMET DE EDIT.
PAGE
<
<
< G E N E R A T I O N :
<
<
GENERE: EQU $
WORD '1E16 < APPEL AU CCI ...
JMP GENERE < ET C'EST DEFINITIF ...
END GENERE
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.